+++ /dev/null
-CONFIG_32BIT=y
-# CONFIG_64BIT is not set
-CONFIG_AG71XX=y
-CONFIG_AG71XX_AR8216_SUPPORT=y
-# CONFIG_AG71XX_DEBUG is not set
-# CONFIG_AG71XX_DEBUG_FS is not set
-# CONFIG_ALCHEMY_GPIO_INDIRECT is not set
-# CONFIG_AR7 is not set
-CONFIG_AR71XX_DEV_AP91_ETH=y
-CONFIG_AR71XX_DEV_AP91_PCI=y
-CONFIG_AR71XX_DEV_AP94_PCI=y
-CONFIG_AR71XX_DEV_AR913X_WMAC=y
-CONFIG_AR71XX_DEV_DSA=y
-CONFIG_AR71XX_DEV_GPIO_BUTTONS=y
-CONFIG_AR71XX_DEV_LEDS_GPIO=y
-CONFIG_AR71XX_DEV_M25P80=y
-CONFIG_AR71XX_DEV_PB42_PCI=y
-CONFIG_AR71XX_DEV_PB9X_PCI=y
-CONFIG_AR71XX_DEV_USB=y
-CONFIG_AR71XX_MACH_AP81=y
-CONFIG_AR71XX_MACH_AP83=y
-CONFIG_AR71XX_MACH_AW_NR580=y
-CONFIG_AR71XX_MACH_DIR_600_A1=y
-CONFIG_AR71XX_MACH_DIR_615_C1=y
-CONFIG_AR71XX_MACH_DIR_825_B1=y
-CONFIG_AR71XX_MACH_MZK_W04NU=y
-CONFIG_AR71XX_MACH_MZK_W300NH=y
-CONFIG_AR71XX_MACH_PB42=y
-CONFIG_AR71XX_MACH_PB44=y
-CONFIG_AR71XX_MACH_PB92=y
-CONFIG_AR71XX_MACH_RB4XX=y
-CONFIG_AR71XX_MACH_RB750=y
-CONFIG_AR71XX_MACH_TEW_632BRP=y
-CONFIG_AR71XX_MACH_TL_WR1043ND=y
-CONFIG_AR71XX_MACH_TL_WR741ND=y
-CONFIG_AR71XX_MACH_TL_WR841N_V1=y
-CONFIG_AR71XX_MACH_TL_WR941ND=y
-CONFIG_AR71XX_MACH_UBNT=y
-CONFIG_AR71XX_MACH_WNDR3700=y
-CONFIG_AR71XX_MACH_WNR2000=y
-CONFIG_AR71XX_MACH_WP543=y
-CONFIG_AR71XX_MACH_WRT160NL=y
-CONFIG_AR71XX_MACH_WRT400N=y
-CONFIG_AR71XX_MACH_WZR_HP_G300NH=y
-CONFIG_AR71XX_NVRAM=y
-CONFIG_AR71XX_WDT=y
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-CONFIG_ARCH_POPULATES_NODE_MAP=y
-CONFIG_ARCH_REQUIRE_GPIOLIB=y
-# CONFIG_ARCH_SUPPORTS_MSI is not set
-CONFIG_ARCH_SUPPORTS_OPROFILE=y
-CONFIG_ARCH_SUSPEND_POSSIBLE=y
-CONFIG_ATHEROS_AR71XX=y
-# CONFIG_BCM47XX is not set
-# CONFIG_BCM63XX is not set
-CONFIG_BITREVERSE=y
-# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
-# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_CEVT_R4K=y
-CONFIG_CEVT_R4K_LIB=y
-CONFIG_CMDLINE="rootfstype=squashfs,yaffs,jffs2 noinitrd console=ttyS0,115200"
-CONFIG_CMDLINE_BOOL=y
-# CONFIG_CMDLINE_OVERRIDE is not set
-CONFIG_CPU_BIG_ENDIAN=y
-# CONFIG_CPU_CAVIUM_OCTEON is not set
-CONFIG_CPU_HAS_PREFETCH=y
-CONFIG_CPU_HAS_SYNC=y
-# CONFIG_CPU_LITTLE_ENDIAN is not set
-# CONFIG_CPU_LOONGSON2E is not set
-# CONFIG_CPU_LOONGSON2F is not set
-CONFIG_CPU_MIPS32=y
-# CONFIG_CPU_MIPS32_R1 is not set
-CONFIG_CPU_MIPS32_R2=y
-# CONFIG_CPU_MIPS64_R1 is not set
-# CONFIG_CPU_MIPS64_R2 is not set
-CONFIG_CPU_MIPSR2=y
-# CONFIG_CPU_NEVADA is not set
-# CONFIG_CPU_R10000 is not set
-# CONFIG_CPU_R3000 is not set
-# CONFIG_CPU_R4300 is not set
-# CONFIG_CPU_R4X00 is not set
-# CONFIG_CPU_R5000 is not set
-# CONFIG_CPU_R5432 is not set
-# CONFIG_CPU_R5500 is not set
-# CONFIG_CPU_R6000 is not set
-# CONFIG_CPU_R8000 is not set
-# CONFIG_CPU_RM7000 is not set
-# CONFIG_CPU_RM9000 is not set
-# CONFIG_CPU_SB1 is not set
-CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
-CONFIG_CPU_SUPPORTS_HIGHMEM=y
-# CONFIG_CPU_TX39XX is not set
-# CONFIG_CPU_TX49XX is not set
-# CONFIG_CPU_VR41XX is not set
-CONFIG_CSRC_R4K=y
-CONFIG_CSRC_R4K_LIB=y
-CONFIG_DECOMPRESS_LZMA=y
-# CONFIG_DEFAULT_SECURITY_SELINUX is not set
-# CONFIG_DEFAULT_SECURITY_SMACK is not set
-# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
-CONFIG_DEVPORT=y
-# CONFIG_DM9000 is not set
-CONFIG_DMA_NEED_PCI_MAP_STATE=y
-CONFIG_DMA_NONCOHERENT=y
-CONFIG_EARLY_PRINTK=y
-# CONFIG_FSNOTIFY is not set
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-CONFIG_GENERIC_CMOS_UPDATE=y
-CONFIG_GENERIC_FIND_LAST_BIT=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_GPIO=y
-CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-CONFIG_GPIOLIB=y
-CONFIG_GPIO_NXP_74HC153=y
-CONFIG_GPIO_PCF857X=y
-CONFIG_GPIO_SYSFS=y
-CONFIG_HARDWARE_WATCHPOINTS=y
-CONFIG_HAS_DMA=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAVE_ARCH_KGDB=y
-CONFIG_HAVE_DYNAMIC_FTRACE=y
-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
-CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
-CONFIG_HAVE_GENERIC_DMA_COHERENT=y
-CONFIG_HAVE_IDE=y
-CONFIG_HAVE_OPROFILE=y
-CONFIG_HW_HAS_PCI=y
-# CONFIG_HW_RANDOM is not set
-CONFIG_I2C=y
-CONFIG_I2C_ALGOBIT=y
-CONFIG_I2C_BOARDINFO=y
-CONFIG_I2C_GPIO=y
-CONFIG_ICPLUS_PHY=y
-CONFIG_IMAGE_CMDLINE_HACK=y
-# CONFIG_INITRAMFS_COMPRESSION_LZO is not set
-CONFIG_INITRAMFS_ROOT_GID=0
-CONFIG_INITRAMFS_ROOT_UID=0
-CONFIG_INITRAMFS_SOURCE="../../root"
-# CONFIG_INLINE_READ_LOCK is not set
-# CONFIG_INLINE_READ_LOCK_BH is not set
-# CONFIG_INLINE_READ_LOCK_IRQ is not set
-# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_READ_TRYLOCK is not set
-CONFIG_INLINE_READ_UNLOCK=y
-# CONFIG_INLINE_READ_UNLOCK_BH is not set
-CONFIG_INLINE_READ_UNLOCK_IRQ=y
-# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_SPIN_LOCK is not set
-# CONFIG_INLINE_SPIN_LOCK_BH is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_SPIN_TRYLOCK is not set
-# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK=y
-# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
-# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_WRITE_LOCK is not set
-# CONFIG_INLINE_WRITE_LOCK_BH is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_WRITE_TRYLOCK is not set
-CONFIG_INLINE_WRITE_UNLOCK=y
-# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
-CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
-# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
-CONFIG_IRQ_CPU=y
-# CONFIG_LEDS_GPIO is not set
-# CONFIG_LEDS_RB750 is not set
-# CONFIG_LEDS_WNDR3700_USB is not set
-CONFIG_LOONGSON_UART_BASE=y
-# CONFIG_M25PXX_USE_FAST_READ is not set
-# CONFIG_MACH_ALCHEMY is not set
-# CONFIG_MACH_DECSTATION is not set
-# CONFIG_MACH_JAZZ is not set
-# CONFIG_MACH_LOONGSON is not set
-# CONFIG_MACH_TX39XX is not set
-# CONFIG_MACH_TX49XX is not set
-# CONFIG_MACH_VR41XX is not set
-CONFIG_MICREL_PHY=y
-# CONFIG_MIKROTIK_RB532 is not set
-CONFIG_MIPS=y
-# CONFIG_MIPS_COBALT is not set
-CONFIG_MIPS_L1_CACHE_SHIFT=5
-CONFIG_MIPS_MACHINE=y
-# CONFIG_MIPS_MALTA is not set
-CONFIG_MIPS_MT_DISABLED=y
-# CONFIG_MIPS_MT_SMP is not set
-# CONFIG_MIPS_MT_SMTC is not set
-# CONFIG_MIPS_SIM is not set
-CONFIG_MTD_AR91XX_FLASH=y
-# CONFIG_MTD_CFI_INTELEXT is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_JEDECPROBE=y
-CONFIG_MTD_M25P80=y
-CONFIG_MTD_MYLOADER_PARTS=y
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_RB4XX=y
-CONFIG_MTD_NAND_RB750=y
-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-2
-CONFIG_MTD_REDBOOT_PARTS=y
-CONFIG_MTD_WRT160NL_PARTS=y
-# CONFIG_MUTEX_SPIN_ON_OWNER is not set
-CONFIG_MYLOADER=y
-CONFIG_NET_DSA=y
-CONFIG_NET_DSA_AR7240=y
-CONFIG_NET_DSA_MV88E6060=y
-CONFIG_NET_DSA_MV88E6063=y
-# CONFIG_NET_DSA_MV88E6123_61_65 is not set
-# CONFIG_NET_DSA_MV88E6131 is not set
-# CONFIG_NET_DSA_MV88E6XXX is not set
-# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
-# CONFIG_NET_DSA_TAG_DSA is not set
-# CONFIG_NET_DSA_TAG_EDSA is not set
-CONFIG_NET_DSA_TAG_QINQ=y
-CONFIG_NET_DSA_TAG_TRAILER=y
-# CONFIG_NO_IOPORT is not set
-# CONFIG_NXP_STB220 is not set
-# CONFIG_NXP_STB225 is not set
-CONFIG_PAGEFLAGS_EXTENDED=y
-CONFIG_PCI=y
-CONFIG_PCI_DISABLE_COMMON_QUIRKS=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PHYLIB=y
-# CONFIG_PMC_MSP is not set
-# CONFIG_PMC_YOSEMITE is not set
-# CONFIG_PNX8550_JBS is not set
-# CONFIG_PNX8550_STB810 is not set
-# CONFIG_POWERTV is not set
-CONFIG_RTL8306_PHY=y
-CONFIG_RTL8366RB_PHY=y
-CONFIG_RTL8366S_PHY=y
-CONFIG_RTL8366_SMI=y
-CONFIG_SCHED_OMIT_FRAME_POINTER=y
-# CONFIG_SCSI_DMA is not set
-# CONFIG_SERIAL_8250_EXTENDED is not set
-CONFIG_SERIAL_8250_NR_UARTS=1
-CONFIG_SERIAL_8250_RUNTIME_UARTS=1
-# CONFIG_SGI_IP22 is not set
-# CONFIG_SGI_IP27 is not set
-# CONFIG_SGI_IP28 is not set
-# CONFIG_SGI_IP32 is not set
-# CONFIG_SIBYTE_BIGSUR is not set
-# CONFIG_SIBYTE_CARMEL is not set
-# CONFIG_SIBYTE_CRHINE is not set
-# CONFIG_SIBYTE_CRHONE is not set
-# CONFIG_SIBYTE_LITTLESUR is not set
-# CONFIG_SIBYTE_RHONE is not set
-# CONFIG_SIBYTE_SENTOSA is not set
-# CONFIG_SIBYTE_SWARM is not set
-# CONFIG_SLAB is not set
-CONFIG_SLUB=y
-CONFIG_SPI=y
-CONFIG_SPI_AP83=y
-CONFIG_SPI_AR71XX=y
-CONFIG_SPI_BITBANG=y
-CONFIG_SPI_GPIO=y
-CONFIG_SPI_MASTER=y
-CONFIG_SPI_PB44=y
-# CONFIG_SPI_SPIDEV is not set
-# CONFIG_SPI_VSC7385 is not set
-CONFIG_SWCONFIG=y
-CONFIG_SYS_HAS_CPU_MIPS32_R1=y
-CONFIG_SYS_HAS_CPU_MIPS32_R2=y
-CONFIG_SYS_HAS_EARLY_PRINTK=y
-CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
-CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
-CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
-# CONFIG_TC35815 is not set
-# CONFIG_TINY_RCU is not set
-CONFIG_TRAD_SIGNALS=y
-# CONFIG_TREE_PREEMPT_RCU is not set
-CONFIG_TREE_RCU=y
-CONFIG_USB_SUPPORT=y
-CONFIG_YAFFS_9BYTE_TAGS=y
-CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED=y
-CONFIG_YAFFS_AUTO_YAFFS2=y
-# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set
-# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set
-CONFIG_YAFFS_FS=y
-CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
-CONFIG_YAFFS_YAFFS1=y
-CONFIG_YAFFS_YAFFS2=y
-CONFIG_ZONE_DMA_FLAG=0
+++ /dev/null
-CONFIG_32BIT=y
-# CONFIG_64BIT is not set
-CONFIG_AG71XX=y
-CONFIG_AG71XX_AR8216_SUPPORT=y
-# CONFIG_AG71XX_DEBUG is not set
-# CONFIG_ALCHEMY_GPIO_INDIRECT is not set
-# CONFIG_AR7 is not set
-CONFIG_AR71XX_DEV_AP91_ETH=y
-CONFIG_AR71XX_DEV_AP91_PCI=y
-CONFIG_AR71XX_DEV_AP94_PCI=y
-CONFIG_AR71XX_DEV_AR913X_WMAC=y
-CONFIG_AR71XX_DEV_DSA=y
-CONFIG_AR71XX_DEV_GPIO_BUTTONS=y
-CONFIG_AR71XX_DEV_LEDS_GPIO=y
-CONFIG_AR71XX_DEV_M25P80=y
-CONFIG_AR71XX_DEV_PB42_PCI=y
-CONFIG_AR71XX_DEV_PB9X_PCI=y
-CONFIG_AR71XX_DEV_USB=y
-CONFIG_AR71XX_MACH_AP81=y
-CONFIG_AR71XX_MACH_AP83=y
-CONFIG_AR71XX_MACH_AW_NR580=y
-CONFIG_AR71XX_MACH_DIR_600_A1=y
-CONFIG_AR71XX_MACH_DIR_615_C1=y
-CONFIG_AR71XX_MACH_DIR_825_B1=y
-CONFIG_AR71XX_MACH_MZK_W04NU=y
-CONFIG_AR71XX_MACH_MZK_W300NH=y
-CONFIG_AR71XX_MACH_PB42=y
-CONFIG_AR71XX_MACH_PB44=y
-CONFIG_AR71XX_MACH_PB92=y
-CONFIG_AR71XX_MACH_RB4XX=y
-CONFIG_AR71XX_MACH_RB750=y
-CONFIG_AR71XX_MACH_TEW_632BRP=y
-CONFIG_AR71XX_MACH_TL_WR1043ND=y
-CONFIG_AR71XX_MACH_TL_WR741ND=y
-CONFIG_AR71XX_MACH_TL_WR841N_V1=y
-CONFIG_AR71XX_MACH_TL_WR941ND=y
-CONFIG_AR71XX_MACH_UBNT=y
-CONFIG_AR71XX_MACH_WNDR3700=y
-CONFIG_AR71XX_MACH_WNR2000=y
-CONFIG_AR71XX_MACH_WP543=y
-CONFIG_AR71XX_MACH_WRT160NL=y
-CONFIG_AR71XX_MACH_WRT400N=y
-CONFIG_AR71XX_MACH_WZR_HP_G300NH=y
-CONFIG_AR71XX_NVRAM=y
-CONFIG_AR71XX_WDT=y
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
-CONFIG_ARCH_POPULATES_NODE_MAP=y
-CONFIG_ARCH_REQUIRE_GPIOLIB=y
-# CONFIG_ARCH_SUPPORTS_MSI is not set
-CONFIG_ARCH_SUPPORTS_OPROFILE=y
-CONFIG_ARCH_SUSPEND_POSSIBLE=y
-CONFIG_ATHEROS_AR71XX=y
-# CONFIG_BCM47XX is not set
-# CONFIG_BCM63XX is not set
-CONFIG_BITREVERSE=y
-CONFIG_BRIDGE=m
-CONFIG_BRIDGE_IGMP_SNOOPING=y
-# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
-# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_CEVT_R4K=y
-CONFIG_CEVT_R4K_LIB=y
-CONFIG_CMDLINE="rootfstype=squashfs,yaffs,jffs2 noinitrd console=ttyS0,115200"
-CONFIG_CMDLINE_BOOL=y
-# CONFIG_CMDLINE_OVERRIDE is not set
-CONFIG_CPU_BIG_ENDIAN=y
-# CONFIG_CPU_CAVIUM_OCTEON is not set
-CONFIG_CPU_HAS_PREFETCH=y
-CONFIG_CPU_HAS_SYNC=y
-# CONFIG_CPU_LITTLE_ENDIAN is not set
-# CONFIG_CPU_LOONGSON2E is not set
-# CONFIG_CPU_LOONGSON2F is not set
-CONFIG_CPU_MIPS32=y
-# CONFIG_CPU_MIPS32_R1 is not set
-CONFIG_CPU_MIPS32_R2=y
-# CONFIG_CPU_MIPS64_R1 is not set
-# CONFIG_CPU_MIPS64_R2 is not set
-CONFIG_CPU_MIPSR2=y
-# CONFIG_CPU_NEVADA is not set
-# CONFIG_CPU_R10000 is not set
-# CONFIG_CPU_R3000 is not set
-# CONFIG_CPU_R4300 is not set
-# CONFIG_CPU_R4X00 is not set
-# CONFIG_CPU_R5000 is not set
-# CONFIG_CPU_R5432 is not set
-# CONFIG_CPU_R5500 is not set
-# CONFIG_CPU_R6000 is not set
-# CONFIG_CPU_R8000 is not set
-# CONFIG_CPU_RM7000 is not set
-# CONFIG_CPU_RM9000 is not set
-# CONFIG_CPU_SB1 is not set
-CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
-CONFIG_CPU_SUPPORTS_HIGHMEM=y
-# CONFIG_CPU_TX39XX is not set
-# CONFIG_CPU_TX49XX is not set
-# CONFIG_CPU_VR41XX is not set
-# CONFIG_CRYSTALHD is not set
-CONFIG_CSRC_R4K=y
-CONFIG_CSRC_R4K_LIB=y
-# CONFIG_DEBUG_FS is not set
-CONFIG_DECOMPRESS_LZMA=y
-# CONFIG_DEFAULT_SECURITY_SELINUX is not set
-# CONFIG_DEFAULT_SECURITY_SMACK is not set
-# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
-CONFIG_DEVPORT=y
-# CONFIG_DM9000 is not set
-CONFIG_DMA_NEED_PCI_MAP_STATE=y
-CONFIG_DMA_NONCOHERENT=y
-# CONFIG_DT3155 is not set
-CONFIG_EARLY_PRINTK=y
-# CONFIG_FSNOTIFY is not set
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-CONFIG_GENERIC_CMOS_UPDATE=y
-CONFIG_GENERIC_FIND_LAST_BIT=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_GPIO=y
-CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-CONFIG_GPIOLIB=y
-# CONFIG_GPIO_IT8761E is not set
-# CONFIG_GPIO_MAX7300 is not set
-CONFIG_GPIO_NXP_74HC153=y
-CONFIG_GPIO_PCF857X=y
-# CONFIG_GPIO_SCH is not set
-CONFIG_GPIO_SYSFS=y
-# CONFIG_HAMRADIO is not set
-CONFIG_HARDWARE_WATCHPOINTS=y
-CONFIG_HAS_DMA=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAVE_ARCH_KGDB=y
-CONFIG_HAVE_DYNAMIC_FTRACE=y
-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
-CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
-CONFIG_HAVE_GENERIC_DMA_COHERENT=y
-CONFIG_HAVE_IDE=y
-CONFIG_HAVE_OPROFILE=y
-# CONFIG_HTC_I2CPLD is not set
-CONFIG_HW_HAS_PCI=y
-# CONFIG_HW_RANDOM is not set
-CONFIG_I2C=y
-CONFIG_I2C_ALGOBIT=y
-CONFIG_I2C_BOARDINFO=y
-CONFIG_I2C_GPIO=y
-# CONFIG_I2C_SMBUS is not set
-# CONFIG_I2C_XILINX is not set
-CONFIG_ICPLUS_PHY=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_IMAGE_CMDLINE_HACK=y
-# CONFIG_INITRAMFS_COMPRESSION_LZO is not set
-CONFIG_INITRAMFS_ROOT_GID=0
-CONFIG_INITRAMFS_ROOT_UID=0
-CONFIG_INITRAMFS_SOURCE="../../root"
-# CONFIG_INLINE_READ_LOCK is not set
-# CONFIG_INLINE_READ_LOCK_BH is not set
-# CONFIG_INLINE_READ_LOCK_IRQ is not set
-# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_READ_TRYLOCK is not set
-CONFIG_INLINE_READ_UNLOCK=y
-# CONFIG_INLINE_READ_UNLOCK_BH is not set
-CONFIG_INLINE_READ_UNLOCK_IRQ=y
-# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_SPIN_LOCK is not set
-# CONFIG_INLINE_SPIN_LOCK_BH is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_SPIN_TRYLOCK is not set
-# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK=y
-# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
-# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_WRITE_LOCK is not set
-# CONFIG_INLINE_WRITE_LOCK_BH is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_WRITE_TRYLOCK is not set
-CONFIG_INLINE_WRITE_UNLOCK=y
-# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
-CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
-# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
-CONFIG_IRQ_CPU=y
-# CONFIG_KSZ884X_PCI is not set
-# CONFIG_LEDS_GPIO is not set
-# CONFIG_LEDS_RB750 is not set
-# CONFIG_LEDS_WNDR3700_USB is not set
-CONFIG_LLC=m
-# CONFIG_LOGFS is not set
-CONFIG_LOONGSON_UART_BASE=y
-# CONFIG_LPC_SCH is not set
-# CONFIG_M25PXX_USE_FAST_READ is not set
-# CONFIG_MACH_ALCHEMY is not set
-# CONFIG_MACH_DECSTATION is not set
-# CONFIG_MACH_JAZZ is not set
-# CONFIG_MACH_LOONGSON is not set
-# CONFIG_MACH_TX39XX is not set
-# CONFIG_MACH_TX49XX is not set
-# CONFIG_MACH_VR41XX is not set
-# CONFIG_MAX63XX_WATCHDOG is not set
-# CONFIG_MFD_88PM860X is not set
-# CONFIG_MFD_MAX8925 is not set
-# CONFIG_MFD_TIMBERDALE is not set
-# CONFIG_MFD_WM8994 is not set
-CONFIG_MICREL_PHY=y
-# CONFIG_MIKROTIK_RB532 is not set
-CONFIG_MIPS=y
-# CONFIG_MIPS_COBALT is not set
-CONFIG_MIPS_L1_CACHE_SHIFT=5
-CONFIG_MIPS_MACHINE=y
-# CONFIG_MIPS_MALTA is not set
-CONFIG_MIPS_MT_DISABLED=y
-# CONFIG_MIPS_MT_SMP is not set
-# CONFIG_MIPS_MT_SMTC is not set
-# CONFIG_MIPS_SIM is not set
-CONFIG_MTD_AR91XX_FLASH=y
-# CONFIG_MTD_CFI_INTELEXT is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_JEDECPROBE=y
-CONFIG_MTD_M25P80=y
-CONFIG_MTD_MYLOADER_PARTS=y
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_RB4XX=y
-CONFIG_MTD_NAND_RB750=y
-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-2
-CONFIG_MTD_REDBOOT_PARTS=y
-CONFIG_MTD_WRT160NL_PARTS=y
-# CONFIG_MUTEX_SPIN_ON_OWNER is not set
-CONFIG_MYLOADER=y
-CONFIG_NET_DSA=y
-CONFIG_NET_DSA_AR7240=y
-CONFIG_NET_DSA_MV88E6060=y
-CONFIG_NET_DSA_MV88E6063=y
-# CONFIG_NET_DSA_MV88E6123_61_65 is not set
-# CONFIG_NET_DSA_MV88E6131 is not set
-# CONFIG_NET_DSA_MV88E6XXX is not set
-# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
-# CONFIG_NET_DSA_TAG_DSA is not set
-# CONFIG_NET_DSA_TAG_EDSA is not set
-CONFIG_NET_DSA_TAG_QINQ=y
-CONFIG_NET_DSA_TAG_TRAILER=y
-CONFIG_NO_HZ=y
-# CONFIG_NO_IOPORT is not set
-# CONFIG_NXP_STB220 is not set
-# CONFIG_NXP_STB225 is not set
-CONFIG_PAGEFLAGS_EXTENDED=y
-CONFIG_PCI_DISABLE_COMMON_QUIRKS=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PHYLIB=y
-# CONFIG_PMC_MSP is not set
-# CONFIG_PMC_YOSEMITE is not set
-# CONFIG_PNX8550_JBS is not set
-# CONFIG_PNX8550_STB810 is not set
-# CONFIG_POWERTV is not set
-CONFIG_RTL8306_PHY=y
-CONFIG_RTL8366RB_PHY=y
-CONFIG_RTL8366S_PHY=y
-CONFIG_RTL8366_SMI=y
-CONFIG_SCHED_OMIT_FRAME_POINTER=y
-# CONFIG_SCSI_DMA is not set
-# CONFIG_SERIAL_8250_EXTENDED is not set
-CONFIG_SERIAL_8250_NR_UARTS=1
-CONFIG_SERIAL_8250_RUNTIME_UARTS=1
-# CONFIG_SERIAL_TIMBERDALE is not set
-# CONFIG_SGI_IP22 is not set
-# CONFIG_SGI_IP27 is not set
-# CONFIG_SGI_IP28 is not set
-# CONFIG_SGI_IP32 is not set
-# CONFIG_SIBYTE_BIGSUR is not set
-# CONFIG_SIBYTE_CARMEL is not set
-# CONFIG_SIBYTE_CRHINE is not set
-# CONFIG_SIBYTE_CRHONE is not set
-# CONFIG_SIBYTE_LITTLESUR is not set
-# CONFIG_SIBYTE_RHONE is not set
-# CONFIG_SIBYTE_SENTOSA is not set
-# CONFIG_SIBYTE_SWARM is not set
-# CONFIG_SLAB is not set
-CONFIG_SLUB=y
-CONFIG_SPI=y
-CONFIG_SPI_AP83=y
-CONFIG_SPI_AR71XX=y
-CONFIG_SPI_BITBANG=y
-CONFIG_SPI_GPIO=y
-CONFIG_SPI_MASTER=y
-CONFIG_SPI_PB44=y
-# CONFIG_SPI_SPIDEV is not set
-# CONFIG_SPI_VSC7385 is not set
-CONFIG_STP=m
-# CONFIG_SWAP is not set
-CONFIG_SWCONFIG=y
-CONFIG_SYS_HAS_CPU_MIPS32_R1=y
-CONFIG_SYS_HAS_CPU_MIPS32_R2=y
-CONFIG_SYS_HAS_EARLY_PRINTK=y
-CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
-CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
-CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
-# CONFIG_TC35815 is not set
-CONFIG_TRAD_SIGNALS=y
-# CONFIG_TREE_PREEMPT_RCU is not set
-CONFIG_USB_SUPPORT=y
-CONFIG_VLAN_8021Q=m
-CONFIG_YAFFS_9BYTE_TAGS=y
-CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED=y
-CONFIG_YAFFS_AUTO_YAFFS2=y
-# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set
-# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set
-CONFIG_YAFFS_FS=y
-CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
-CONFIG_YAFFS_YAFFS1=y
-CONFIG_YAFFS_YAFFS2=y
-CONFIG_ZONE_DMA_FLAG=0
+++ /dev/null
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -166,6 +166,13 @@ ifeq (,$(findstring march=octeon, $(cfla
- cflags-$(CONFIG_CPU_CAVIUM_OCTEON) += -Wa,-march=octeon
- endif
-
-+#
-+# Atheros AR71xx
-+#
-+core-$(CONFIG_ATHEROS_AR71XX) += arch/mips/ar71xx/
-+cflags-$(CONFIG_ATHEROS_AR71XX) += -I$(srctree)/arch/mips/include/asm/mach-ar71xx
-+load-$(CONFIG_ATHEROS_AR71XX) += 0xffffffff80060000
-+
- cflags-$(CONFIG_CPU_R4000_WORKAROUNDS) += $(call cc-option,-mfix-r4000,)
- cflags-$(CONFIG_CPU_R4400_WORKAROUNDS) += $(call cc-option,-mfix-r4400,)
- cflags-$(CONFIG_CPU_DADDI_WORKAROUNDS) += $(call cc-option,-mno-daddi,)
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -48,6 +48,23 @@ config AR7
- Support for the Texas Instruments AR7 System-on-a-Chip
- family: TNETD7100, 7200 and 7300.
-
-+config ATHEROS_AR71XX
-+ bool "Atheros AR71xx based boards"
-+ select CEVT_R4K
-+ select CSRC_R4K
-+ select DMA_NONCOHERENT
-+ select HW_HAS_PCI
-+ select IRQ_CPU
-+ select ARCH_REQUIRE_GPIOLIB
-+ select SYS_HAS_CPU_MIPS32_R1
-+ select SYS_HAS_CPU_MIPS32_R2
-+ select SYS_SUPPORTS_32BIT_KERNEL
-+ select SYS_SUPPORTS_BIG_ENDIAN
-+ select SYS_HAS_EARLY_PRINTK
-+ select MIPS_MACHINE
-+ help
-+ Support for Atheros AR71xx based boards.
-+
- config BCM47XX
- bool "BCM47XX based boards"
- select CEVT_R4K
-@@ -682,6 +699,7 @@ config CAVIUM_OCTEON_REFERENCE_BOARD
- endchoice
-
- source "arch/mips/alchemy/Kconfig"
-+source "arch/mips/ar71xx/Kconfig"
- source "arch/mips/bcm63xx/Kconfig"
- source "arch/mips/jazz/Kconfig"
- source "arch/mips/lasat/Kconfig"
+++ /dev/null
---- a/arch/mips/pci/Makefile
-+++ b/arch/mips/pci/Makefile
-@@ -18,6 +18,7 @@ obj-$(CONFIG_PCI_TX4927) += ops-tx4927.o
- obj-$(CONFIG_BCM47XX) += pci-bcm47xx.o
- obj-$(CONFIG_BCM63XX) += pci-bcm63xx.o fixup-bcm63xx.o \
- ops-bcm63xx.o
-+obj-$(CONFIG_ATHEROS_AR71XX) += pci-ar71xx.o pci-ar724x.o
-
- #
- # These are still pretty much in the old state, watch, go blind.
+++ /dev/null
---- a/drivers/usb/host/Kconfig
-+++ b/drivers/usb/host/Kconfig
-@@ -109,6 +109,13 @@ config XPS_USB_HCD_XILINX
- support both high speed and full speed devices, or high speed
- devices only.
-
-+config USB_EHCI_AR71XX
-+ bool "USB EHCI support for AR71xx"
-+ depends on USB_EHCI_HCD && ATHEROS_AR71XX
-+ default y
-+ help
-+ Support for Atheros AR71xx built-in EHCI controller
-+
- config USB_EHCI_FSL
- bool "Support for Freescale on-chip EHCI USB controller"
- depends on USB_EHCI_HCD && FSL_SOC
-@@ -207,6 +214,13 @@ config USB_OHCI_HCD
- To compile this driver as a module, choose M here: the
- module will be called ohci-hcd.
-
-+config USB_OHCI_AR71XX
-+ bool "USB OHCI support for Atheros AR71xx"
-+ depends on USB_OHCI_HCD && ATHEROS_AR71XX
-+ default y
-+ help
-+ Support for Atheros AR71xx built-in OHCI controller
-+
- config USB_OHCI_HCD_PPC_SOC
- bool "OHCI support for on-chip PPC USB controller"
- depends on USB_OHCI_HCD && (STB03xxx || PPC_MPC52xx)
---- a/drivers/usb/host/ehci-hcd.c
-+++ b/drivers/usb/host/ehci-hcd.c
-@@ -1158,6 +1158,11 @@ MODULE_LICENSE ("GPL");
- #define PLATFORM_DRIVER ehci_atmel_driver
- #endif
-
-+#ifdef CONFIG_USB_EHCI_AR71XX
-+#include "ehci-ar71xx.c"
-+#define PLATFORM_DRIVER ehci_ar71xx_driver
-+#endif
-+
- #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \
- !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER)
- #error "missing bus glue for ehci-hcd"
---- a/drivers/usb/host/ohci-hcd.c
-+++ b/drivers/usb/host/ohci-hcd.c
-@@ -1085,6 +1085,11 @@ MODULE_LICENSE ("GPL");
- #define TMIO_OHCI_DRIVER ohci_hcd_tmio_driver
- #endif
-
-+#ifdef CONFIG_USB_OHCI_AR71XX
-+#include "ohci-ar71xx.c"
-+#define PLATFORM_DRIVER ohci_hcd_ar71xx_driver
-+#endif
-+
- #if !defined(PCI_DRIVER) && \
- !defined(PLATFORM_DRIVER) && \
- !defined(OF_PLATFORM_DRIVER) && \
+++ /dev/null
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -53,6 +53,13 @@ if SPI_MASTER
-
- comment "SPI Master Controller Drivers"
-
-+config SPI_AR71XX
-+ tristate "Atheros AR71xx SPI Controller"
-+ depends on SPI_MASTER && ATHEROS_AR71XX
-+ select SPI_BITBANG
-+ help
-+ This is the SPI contoller driver for Atheros AR71xx.
-+
- config SPI_ATMEL
- tristate "Atmel SPI Controller"
- depends on (ARCH_AT91 || AVR32)
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -11,6 +11,7 @@ endif
- obj-$(CONFIG_SPI_MASTER) += spi.o
-
- # SPI master controller drivers (bus)
-+obj-$(CONFIG_SPI_AR71XX) += ar71xx_spi.o
- obj-$(CONFIG_SPI_ATMEL) += atmel_spi.o
- obj-$(CONFIG_SPI_BFIN) += spi_bfin5xx.o
- obj-$(CONFIG_SPI_BITBANG) += spi_bitbang.o
+++ /dev/null
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -2128,6 +2128,8 @@ config ACENIC_OMIT_TIGON_I
-
- The safe and default value for this is N.
-
-+source drivers/net/ag71xx/Kconfig
-+
- config DL2K
- tristate "DL2000/TC902x-based Gigabit Ethernet support"
- depends on PCI
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -106,6 +106,7 @@ obj-$(CONFIG_STMMAC_ETH) += stmmac/
- # end link order section
- #
-
-+obj-$(CONFIG_AG71XX) += ag71xx/
- obj-$(CONFIG_SUNDANCE) += sundance.o
- obj-$(CONFIG_HAMACHI) += hamachi.o
- obj-$(CONFIG_NET) += Space.o loopback.o
+++ /dev/null
---- a/drivers/watchdog/Kconfig
-+++ b/drivers/watchdog/Kconfig
-@@ -840,6 +840,13 @@ config TXX9_WDT
- help
- Hardware driver for the built-in watchdog timer on TXx9 MIPS SoCs.
-
-+config AR71XX_WDT
-+ tristate "Atheros AR71xx Watchdog Timer"
-+ depends on ATHEROS_AR71XX
-+ help
-+ Hardware driver for the built-in watchdog timer on the Atheros
-+ AR71xx SoCs.
-+
- # PARISC Architecture
-
- # POWERPC Architecture
---- a/drivers/watchdog/Makefile
-+++ b/drivers/watchdog/Makefile
-@@ -112,6 +112,7 @@ obj-$(CONFIG_PNX833X_WDT) += pnx833x_wdt
- obj-$(CONFIG_SIBYTE_WDOG) += sb_wdog.o
- obj-$(CONFIG_AR7_WDT) += ar7_wdt.o
- obj-$(CONFIG_TXX9_WDT) += txx9wdt.o
-+obj-$(CONFIG_AR71XX_WDT) += ar71xx_wdt.o
-
- # PARISC Architecture
-
+++ /dev/null
---- a/drivers/mtd/maps/Kconfig
-+++ b/drivers/mtd/maps/Kconfig
-@@ -257,6 +257,13 @@ config MTD_ALCHEMY
- help
- Flash memory access on AMD Alchemy Pb/Db/RDK Reference Boards
-
-+config MTD_AR91XX_FLASH
-+ tristate "Atheros AR91xx parallel flash support"
-+ depends on ATHEROS_AR71XX
-+ select MTD_COMPLEX_MAPPINGS
-+ help
-+ Parallel flash driver for the Atheros AR91xx based boards.
-+
- config MTD_DILNETPC
- tristate "CFI Flash device mapped on DIL/Net PC"
- depends on X86 && MTD_CONCAT && MTD_PARTITIONS && MTD_CFI_INTELEXT && BROKEN
---- a/drivers/mtd/maps/Makefile
-+++ b/drivers/mtd/maps/Makefile
-@@ -41,6 +41,7 @@ obj-$(CONFIG_MTD_DBOX2) += dbox2-flash.
- obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
- obj-$(CONFIG_MTD_PCI) += pci.o
- obj-$(CONFIG_MTD_ALCHEMY) += alchemy-flash.o
-+obj-$(CONFIG_MTD_AR91XX_FLASH) += ar91xx_flash.o
- obj-$(CONFIG_MTD_AUTCPU12) += autcpu12-nvram.o
- obj-$(CONFIG_MTD_EDB7312) += edb7312.o
- obj-$(CONFIG_MTD_IMPA7) += impa7.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -114,6 +114,11 @@ config RTL8306_PHY
- tristate "Driver for Realtek RTL8306S switches"
- select SWCONFIG
-
-+config MICREL_PHY
-+ tristate "Drivers for Micrel/Kendin PHYs"
-+ ---help---
-+ Currently has a driver for the KSZ8041
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -24,6 +24,7 @@ obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi
- obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o
- obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
-+obj-$(CONFIG_MICREL) += micrel.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
- obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
- obj-$(CONFIG_MDIO_GPIO) += mdio-gpio.o
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -922,6 +922,16 @@ static int __devinit m25p_probe(struct s
- part_probes, &parts, 0);
- }
-
-+#ifdef CONFIG_MTD_MYLOADER_PARTS
-+ if (nr_parts <= 0) {
-+ static const char *part_probes[]
-+ = { "MyLoader", NULL, };
-+
-+ nr_parts = parse_mtd_partitions(&flash->mtd,
-+ part_probes, &parts, 0);
-+ }
-+#endif
-+
- if (nr_parts <= 0 && data && data->parts) {
- parts = data->parts;
- nr_parts = data->nr_parts;
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -932,6 +932,15 @@ static int __devinit m25p_probe(struct s
- }
- #endif
-
-+#ifdef CONFIG_MTD_REDBOOT_PARTS
-+ if (nr_parts <= 0) {
-+ static const char *part_probes[]
-+ = { "RedBoot", NULL, };
-+
-+ nr_parts = parse_mtd_partitions(&flash->mtd,
-+ part_probes, &parts, 0);
-+ }
-+#endif
- if (nr_parts <= 0 && data && data->parts) {
- parts = data->parts;
- nr_parts = data->nr_parts;
+++ /dev/null
---- a/drivers/mtd/chips/jedec_probe.c
-+++ b/drivers/mtd/chips/jedec_probe.c
-@@ -166,6 +166,7 @@
- #define SST39LF160 0x2782
- #define SST39VF1601 0x234b
- #define SST39VF3201 0x235b
-+#define SST39VF6401B 0x236d
- #define SST39LF512 0x00D4
- #define SST39LF010 0x00D5
- #define SST39LF020 0x00D6
-@@ -1556,6 +1557,18 @@ static const struct amd_flash_info jedec
- ERASEINFO(0x10000,64),
- }
- }, {
-+ .mfr_id = MANUFACTURER_SST,
-+ .dev_id = SST39VF6401B,
-+ .name = "SST 39VF6401B",
-+ .devtypes = CFI_DEVICETYPE_X16,
-+ .uaddr = MTD_UADDR_0xAAAA_0x5555,
-+ .dev_size = SIZE_8MiB,
-+ .cmd_set = P_ID_AMD_STD,
-+ .nr_regions = 1,
-+ .regions = {
-+ ERASEINFO(0x10000,128)
-+ }
-+ }, {
- .mfr_id = MANUFACTURER_ST,
- .dev_id = M29F800AB,
- .name = "ST M29F800AB",
+++ /dev/null
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -1130,8 +1130,8 @@ static int __xipram do_write_oneword(str
- break;
- }
-
-- if (chip_ready(map, adr))
-- break;
-+ if (chip_good(map, adr, datum))
-+ goto enable_xip;
-
- /* Latency issues. Drop the lock, wait a while and retry */
- UDELAY(map, chip, adr, 1);
-@@ -1147,6 +1147,8 @@ static int __xipram do_write_oneword(str
-
- ret = -EIO;
- }
-+
-+ enable_xip:
- xip_enable(map, chip, adr);
- op_done:
- chip->state = FL_READY;
-@@ -1493,7 +1495,6 @@ static int cfi_amdstd_write_buffers(stru
- return 0;
- }
-
--
- /*
- * Handle devices with one erase region, that only implement
- * the chip erase command.
-@@ -1557,8 +1558,8 @@ static int __xipram do_erase_chip(struct
- chip->erase_suspended = 0;
- }
-
-- if (chip_ready(map, adr))
-- break;
-+ if (chip_good(map, adr, map_word_ff(map)))
-+ goto op_done;
-
- if (time_after(jiffies, timeo)) {
- printk(KERN_WARNING "MTD %s(): software timeout\n",
-@@ -1578,6 +1579,7 @@ static int __xipram do_erase_chip(struct
- ret = -EIO;
- }
-
-+ op_done:
- chip->state = FL_READY;
- xip_enable(map, chip, adr);
- put_chip(map, chip, adr);
-@@ -1645,9 +1647,9 @@ static int __xipram do_erase_oneblock(st
- chip->erase_suspended = 0;
- }
-
-- if (chip_ready(map, adr)) {
-+ if (chip_good(map, adr, map_word_ff(map))) {
- xip_enable(map, chip, adr);
-- break;
-+ goto op_done;
- }
-
- if (time_after(jiffies, timeo)) {
-@@ -1669,6 +1671,7 @@ static int __xipram do_erase_oneblock(st
- ret = -EIO;
- }
-
-+ op_done:
- chip->state = FL_READY;
- put_chip(map, chip, adr);
- spin_unlock(chip->mutex);
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -941,6 +941,16 @@ static int __devinit m25p_probe(struct s
- part_probes, &parts, 0);
- }
- #endif
-+
-+#ifdef CONFIG_MTD_WRT160NL_PARTS
-+ if (nr_parts <= 0) {
-+ static const char *part_probes[]
-+ = { "wrt160nl", NULL, };
-+
-+ nr_parts = parse_mtd_partitions(&flash->mtd,
-+ part_probes, &parts, 0);
-+ }
-+#endif
- if (nr_parts <= 0 && data && data->parts) {
- parts = data->parts;
- nr_parts = data->nr_parts;
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -181,6 +181,12 @@ config MTD_AR7_PARTS
- ---help---
- TI AR7 partitioning support
-
-+config MTD_WRT160NL_PARTS
-+ tristate "Linksys WRT160NL partitioning support"
-+ depends on MTD_PARTITIONS && AR71XX_MACH_WRT160NL
-+ ---help---
-+ Linksys WRT160NL partitioning support
-+
- config MTD_MYLOADER_PARTS
- tristate "MyLoader partition parsing"
- depends on MTD_PARTITIONS && (ADM5120 || ATHEROS_AR231X || ATHEROS_AR71XX)
---- a/drivers/mtd/Makefile
-+++ b/drivers/mtd/Makefile
-@@ -12,6 +12,7 @@ obj-$(CONFIG_MTD_REDBOOT_PARTS) += redbo
- obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
- obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
- obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o
-+obj-$(CONFIG_MTD_WRT160NL_PARTS) += wrt160nl_part.o
- obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
- obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
-
+++ /dev/null
---- a/drivers/usb/host/ehci-q.c
-+++ b/drivers/usb/host/ehci-q.c
-@@ -1194,6 +1194,9 @@ static void end_unlink_async (struct ehc
- ehci->reclaim = NULL;
- start_unlink_async (ehci, next);
- }
-+
-+ if (ehci->has_synopsys_hc_bug)
-+ writel((u32)ehci->async->qh_dma, &ehci->regs->async_next);
- }
-
- /* makes sure the async qh will become idle */
---- a/drivers/usb/host/ehci.h
-+++ b/drivers/usb/host/ehci.h
-@@ -129,6 +129,7 @@ struct ehci_hcd { /* one per controlle
- unsigned has_amcc_usb23:1;
- unsigned need_io_watchdog:1;
- unsigned broken_periodic:1;
-+ unsigned has_synopsys_hc_bug:1; /* Synopsys HC */
-
- /* required for usb32 quirk */
- #define OHCI_CTRL_HCFS (3 << 6)
+++ /dev/null
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -39,7 +39,7 @@
- #include <linux/mtd/xip.h>
-
- #define AMD_BOOTLOC_BUG
--#define FORCE_WORD_WRITE 0
-+#define FORCE_WORD_WRITE 1
-
- #define MAX_WORD_RETRIES 3
-
-@@ -55,7 +55,9 @@
-
- static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
- static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
-+#if !FORCE_WORD_WRITE
- static int cfi_amdstd_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
-+#endif
- static int cfi_amdstd_erase_chip(struct mtd_info *, struct erase_info *);
- static int cfi_amdstd_erase_varsize(struct mtd_info *, struct erase_info *);
- static void cfi_amdstd_sync (struct mtd_info *);
-@@ -190,6 +192,7 @@ static void fixup_amd_bootblock(struct m
- }
- #endif
-
-+#if !FORCE_WORD_WRITE
- static void fixup_use_write_buffers(struct mtd_info *mtd, void *param)
- {
- struct map_info *map = mtd->priv;
-@@ -199,6 +202,7 @@ static void fixup_use_write_buffers(stru
- mtd->write = cfi_amdstd_write_buffers;
- }
- }
-+#endif /* !FORCE_WORD_WRITE */
-
- /* Atmel chips don't use the same PRI format as AMD chips */
- static void fixup_convert_atmel_pri(struct mtd_info *mtd, void *param)
-@@ -1304,6 +1308,7 @@ static int cfi_amdstd_write_words(struct
- /*
- * FIXME: interleaved mode not tested, and probably not supported!
- */
-+#if !FORCE_WORD_WRITE
- static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
- unsigned long adr, const u_char *buf,
- int len)
-@@ -1415,7 +1420,6 @@ static int __xipram do_write_buffer(stru
- return ret;
- }
-
--
- static int cfi_amdstd_write_buffers(struct mtd_info *mtd, loff_t to, size_t len,
- size_t *retlen, const u_char *buf)
- {
-@@ -1494,6 +1498,7 @@ static int cfi_amdstd_write_buffers(stru
-
- return 0;
- }
-+#endif /* !FORCE_WORD_WRITE */
-
- /*
- * Handle devices with one erase region, that only implement
+++ /dev/null
---- a/net/dsa/tag_trailer.c
-+++ b/net/dsa/tag_trailer.c
-@@ -86,7 +86,7 @@ static int trailer_rcv(struct sk_buff *s
-
- trailer = skb_tail_pointer(skb) - 4;
- if (trailer[0] != 0x80 || (trailer[1] & 0xf8) != 0x00 ||
-- (trailer[3] & 0xef) != 0x00 || trailer[3] != 0x00)
-+ (trailer[2] & 0xef) != 0x00 || (trailer[3] & 0xfe) != 0x00)
- goto out_drop;
-
- source_port = trailer[1] & 7;
+++ /dev/null
---- a/net/dsa/Kconfig
-+++ b/net/dsa/Kconfig
-@@ -36,6 +36,13 @@ config NET_DSA_MV88E6060
- This enables support for the Marvell 88E6060 ethernet switch
- chip.
-
-+config NET_DSA_MV88E6063
-+ bool "Marvell 88E6063 ethernet switch chip support"
-+ select NET_DSA_TAG_TRAILER
-+ ---help---
-+ This enables support for the Marvell 88E6063 ethernet switch
-+ chip
-+
- config NET_DSA_MV88E6XXX_NEED_PPU
- bool
- default n
---- a/net/dsa/Makefile
-+++ b/net/dsa/Makefile
-@@ -6,6 +6,7 @@ obj-$(CONFIG_NET_DSA_TAG_TRAILER) += tag
- # switch drivers
- obj-$(CONFIG_NET_DSA_MV88E6XXX) += mv88e6xxx.o
- obj-$(CONFIG_NET_DSA_MV88E6060) += mv88e6060.o
-+obj-$(CONFIG_NET_DSA_MV88E6063) += mv88e6063.o
- obj-$(CONFIG_NET_DSA_MV88E6123_61_65) += mv88e6123_61_65.o
- obj-$(CONFIG_NET_DSA_MV88E6131) += mv88e6131.o
-
+++ /dev/null
---- a/include/linux/if_ether.h
-+++ b/include/linux/if_ether.h
-@@ -81,6 +81,7 @@
- #define ETH_P_1588 0x88F7 /* IEEE 1588 Timesync */
- #define ETH_P_FCOE 0x8906 /* Fibre Channel over Ethernet */
- #define ETH_P_FIP 0x8914 /* FCoE Initialization Protocol */
-+#define ETH_P_QINQ 0x9100 /* QinQ VLAN Stacking Protocol */
- #define ETH_P_EDSA 0xDADA /* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */
-
- /*
---- a/net/dsa/dsa_priv.h
-+++ b/net/dsa/dsa_priv.h
-@@ -174,6 +174,9 @@ netdev_tx_t dsa_xmit(struct sk_buff *skb
- /* tag_edsa.c */
- netdev_tx_t edsa_xmit(struct sk_buff *skb, struct net_device *dev);
-
-+/* tag_qinq.c */
-+netdev_tx_t qinq_xmit(struct sk_buff *skb, struct net_device *dev);
-+
- /* tag_trailer.c */
- netdev_tx_t trailer_xmit(struct sk_buff *skb, struct net_device *dev);
-
---- a/net/dsa/Kconfig
-+++ b/net/dsa/Kconfig
-@@ -23,6 +23,10 @@ config NET_DSA_TAG_TRAILER
- bool
- default n
-
-+config NET_DSA_TAG_QINQ
-+ bool
-+ default y
-+
-
- # switch drivers
- config NET_DSA_MV88E6XXX
---- a/net/dsa/Makefile
-+++ b/net/dsa/Makefile
-@@ -1,6 +1,7 @@
- # tagging formats
- obj-$(CONFIG_NET_DSA_TAG_DSA) += tag_dsa.o
- obj-$(CONFIG_NET_DSA_TAG_EDSA) += tag_edsa.o
-+obj-$(CONFIG_NET_DSA_TAG_QINQ) += tag_qinq.o
- obj-$(CONFIG_NET_DSA_TAG_TRAILER) += tag_trailer.o
-
- # switch drivers
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -321,6 +321,19 @@ static const struct net_device_ops edsa_
- .ndo_do_ioctl = dsa_slave_ioctl,
- };
- #endif
-+#ifdef CONFIG_NET_DSA_TAG_QINQ
-+static const struct net_device_ops qinq_netdev_ops = {
-+ .ndo_init = dsa_slave_init,
-+ .ndo_open = dsa_slave_open,
-+ .ndo_stop = dsa_slave_close,
-+ .ndo_start_xmit = qinq_xmit,
-+ .ndo_change_rx_flags = dsa_slave_change_rx_flags,
-+ .ndo_set_rx_mode = dsa_slave_set_rx_mode,
-+ .ndo_set_multicast_list = dsa_slave_set_rx_mode,
-+ .ndo_set_mac_address = dsa_slave_set_mac_address,
-+ .ndo_do_ioctl = dsa_slave_ioctl,
-+};
-+#endif
- #ifdef CONFIG_NET_DSA_TAG_TRAILER
- static const struct net_device_ops trailer_netdev_ops = {
- .ndo_init = dsa_slave_init,
-@@ -366,6 +379,11 @@ dsa_slave_create(struct dsa_switch *ds,
- slave_dev->netdev_ops = &edsa_netdev_ops;
- break;
- #endif
-+#ifdef CONFIG_NET_DSA_TAG_QINQ
-+ case htons(ETH_P_QINQ):
-+ slave_dev->netdev_ops = &qinq_netdev_ops;
-+ break;
-+#endif
- #ifdef CONFIG_NET_DSA_TAG_TRAILER
- case htons(ETH_P_TRAILER):
- slave_dev->netdev_ops = &trailer_netdev_ops;
+++ /dev/null
---- a/net/dsa/Kconfig
-+++ b/net/dsa/Kconfig
-@@ -29,6 +29,15 @@ config NET_DSA_TAG_QINQ
-
-
- # switch drivers
-+config NET_DSA_AR7240
-+ bool "Atheros AR7240 built-in ethernet switch support"
-+ depends on ATHEROS_AR71XX
-+ default n
-+ select NET_DSA_TAG_QINQ
-+ ---help---
-+ This enables support for the built-in ethernet switch of the
-+ Atheros AR7240 SoC.
-+
- config NET_DSA_MV88E6XXX
- bool
- default n
---- a/net/dsa/Makefile
-+++ b/net/dsa/Makefile
-@@ -5,6 +5,7 @@ obj-$(CONFIG_NET_DSA_TAG_QINQ) += tag_qi
- obj-$(CONFIG_NET_DSA_TAG_TRAILER) += tag_trailer.o
-
- # switch drivers
-+obj-$(CONFIG_NET_DSA_AR7240) += ar7240.o
- obj-$(CONFIG_NET_DSA_MV88E6XXX) += mv88e6xxx.o
- obj-$(CONFIG_NET_DSA_MV88E6060) += mv88e6060.o
- obj-$(CONFIG_NET_DSA_MV88E6063) += mv88e6063.o
+++ /dev/null
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -60,31 +60,32 @@ static int parse_redboot_partitions(stru
- static char nullstring[] = "unallocated";
- #endif
-
-+ buf = vmalloc(master->erasesize);
-+ if (!buf)
-+ return -ENOMEM;
-+
-+ restart:
- if ( directory < 0 ) {
- offset = master->size + directory * master->erasesize;
-- while (master->block_isbad &&
-+ while (master->block_isbad &&
- master->block_isbad(master, offset)) {
- if (!offset) {
- nogood:
- printk(KERN_NOTICE "Failed to find a non-bad block to check for RedBoot partition table\n");
-+ vfree(buf);
- return -EIO;
- }
- offset -= master->erasesize;
- }
- } else {
- offset = directory * master->erasesize;
-- while (master->block_isbad &&
-+ while (master->block_isbad &&
- master->block_isbad(master, offset)) {
- offset += master->erasesize;
- if (offset == master->size)
- goto nogood;
- }
- }
-- buf = vmalloc(master->erasesize);
--
-- if (!buf)
-- return -ENOMEM;
--
- printk(KERN_NOTICE "Searching for RedBoot partition table in %s at offset 0x%lx\n",
- master->name, offset);
-
-@@ -156,6 +157,11 @@ static int parse_redboot_partitions(stru
- }
- if (i == numslots) {
- /* Didn't find it */
-+ if (offset + master->erasesize < master->size) {
-+ /* not at the end of the flash yet, maybe next block :) */
-+ directory++;
-+ goto restart;
-+ }
- printk(KERN_NOTICE "No RedBoot partition table detected in %s\n",
- master->name);
- ret = 0;
+++ /dev/null
---- a/drivers/mtd/nand/Kconfig
-+++ b/drivers/mtd/nand/Kconfig
-@@ -488,4 +488,8 @@ config MTD_NAND_W90P910
- This enables the driver for the NAND Flash on evaluation board based
- on w90p910.
-
-+config MTD_NAND_RB4XX
-+ tristate "NAND flash driver for RouterBoard 4xx series"
-+ depends on MTD_NAND && AR71XX_MACH_RB4XX
-+
- endif # MTD_NAND
---- a/drivers/mtd/nand/Makefile
-+++ b/drivers/mtd/nand/Makefile
-@@ -30,6 +30,7 @@ obj-$(CONFIG_MTD_NAND_CM_X270) += cmx27
- obj-$(CONFIG_MTD_NAND_PXA3xx) += pxa3xx_nand.o
- obj-$(CONFIG_MTD_NAND_TMIO) += tmio_nand.o
- obj-$(CONFIG_MTD_NAND_PLATFORM) += plat_nand.o
-+obj-$(CONFIG_MTD_NAND_RB4XX) += rb4xx_nand.o
- obj-$(CONFIG_MTD_ALAUDA) += alauda.o
- obj-$(CONFIG_MTD_NAND_PASEMI) += pasemi_nand.o
- obj-$(CONFIG_MTD_NAND_ORION) += orion_nand.o
+++ /dev/null
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -11,6 +11,7 @@ endif
- obj-$(CONFIG_SPI_MASTER) += spi.o
-
- # SPI master controller drivers (bus)
-+obj-$(CONFIG_SPI_AP83) += ap83_spi.o
- obj-$(CONFIG_SPI_AR71XX) += ar71xx_spi.o
- obj-$(CONFIG_SPI_ATMEL) += atmel_spi.o
- obj-$(CONFIG_SPI_BFIN) += spi_bfin5xx.o
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -53,6 +53,14 @@ if SPI_MASTER
-
- comment "SPI Master Controller Drivers"
-
-+config SPI_AP83
-+ tristate "Atheros AP83 specific SPI Controller"
-+ depends on SPI_MASTER && AR71XX_MACH_AP83
-+ select SPI_BITBANG
-+ help
-+ This is a specific SPI controller driver for the Atheros AP83
-+ reference board.
-+
- config SPI_AR71XX
- tristate "Atheros AR71xx SPI Controller"
- depends on SPI_MASTER && ATHEROS_AR71XX
+++ /dev/null
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -365,6 +365,11 @@ config SPI_TLE62X0
- sysfs interface, with each line presented as a kind of GPIO
- exposing both switch control and diagnostic feedback.
-
-+config SPI_VSC7385
-+ tristate "Vitesse VSC7385 ethernet switch driver"
-+ help
-+ SPI driver for the Vitesse VSC7385 ethernet switch.
-+
- #
- # Add new SPI protocol masters in alphabetical order above this line
- #
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -54,6 +54,7 @@ spi_s3c24xx_hw-$(CONFIG_SPI_S3C24XX_FIQ)
-
- # SPI protocol drivers (device/link on bus)
- obj-$(CONFIG_SPI_SPIDEV) += spidev.o
-+obj-$(CONFIG_SPI_VSC7385) += spi_vsc7385.o
- obj-$(CONFIG_SPI_TLE62X0) += tle62x0.o
- # ... add above this line ...
-
+++ /dev/null
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -68,6 +68,14 @@ config SPI_AR71XX
- help
- This is the SPI contoller driver for Atheros AR71xx.
-
-+config SPI_PB44
-+ tristate "Atheros PB44 board specific SPI controller"
-+ depends on SPI_MASTER && AR71XX_MACH_PB44
-+ select SPI_BITBANG
-+ help
-+ This is a specific SPI controller driver for the Atheros PB44
-+ reference board.
-+
- config SPI_ATMEL
- tristate "Atmel SPI Controller"
- depends on (ARCH_AT91 || AVR32)
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -24,6 +24,7 @@ obj-$(CONFIG_SPI_GPIO) += spi_gpio.o
- obj-$(CONFIG_SPI_GPIO_OLD) += spi_gpio_old.o
- obj-$(CONFIG_SPI_IMX) += spi_imx.o
- obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o
-+obj-$(CONFIG_SPI_PB44) += pb44_spi.o
- obj-$(CONFIG_SPI_PXA2XX) += pxa2xx_spi.o
- obj-$(CONFIG_SPI_OMAP_UWIRE) += omap_uwire.o
- obj-$(CONFIG_SPI_OMAP24XX) += omap2_mcspi.o
+++ /dev/null
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -269,6 +269,13 @@ config LEDS_ADP5520
- To compile this driver as a module, choose M here: the module will
- be called leds-adp5520.
-
-+config LEDS_WNDR3700_USB
-+ tristate "NETGEAR WNDR3700 USB LED driver"
-+ depends on LEDS_CLASS && AR71XX_MACH_WNDR3700
-+ help
-+ This option enables support for the USB LED found on the
-+ NETGEAR WNDR3700 board.
-+
- comment "LED Triggers"
-
- config LEDS_TRIGGERS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -29,6 +29,7 @@ obj-$(CONFIG_LEDS_DA903X) += leds-da903
- obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o
- obj-$(CONFIG_LEDS_WM8350) += leds-wm8350.o
- obj-$(CONFIG_LEDS_PWM) += leds-pwm.o
-+obj-${CONFIG_LEDS_WNDR3700_USB} += leds-wndr3700-usb.o
- obj-$(CONFIG_LEDS_REGULATOR) += leds-regulator.o
- obj-$(CONFIG_LEDS_INTEL_SS4200) += leds-ss4200.o
- obj-$(CONFIG_LEDS_LT3593) += leds-lt3593.o
+++ /dev/null
---- a/drivers/gpio/Kconfig
-+++ b/drivers/gpio/Kconfig
-@@ -255,4 +255,12 @@ config GPIO_UCB1400
- To compile this driver as a module, choose M here: the
- module will be called ucb1400_gpio.
-
-+comment "Other GPIO expanders"
-+
-+config GPIO_NXP_74HC153
-+ tristate "NXP 74HC153 Dual 4-input multiplexer"
-+ help
-+ Platform driver for NXP 74HC153 Dual 4-input Multiplexer. This
-+ provides a GPIO interface supporting inputs.
-+
- endif
---- a/drivers/gpio/Makefile
-+++ b/drivers/gpio/Makefile
-@@ -11,6 +11,7 @@ obj-$(CONFIG_GPIO_MAX7301) += max7301.o
- obj-$(CONFIG_GPIO_MAX732X) += max732x.o
- obj-$(CONFIG_GPIO_MC33880) += mc33880.o
- obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o
-+obj-$(CONFIG_GPIO_NXP_74HC153) += nxp_74hc153.o
- obj-$(CONFIG_GPIO_PCA953X) += pca953x.o
- obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
- obj-$(CONFIG_GPIO_PL061) += pl061.o
+++ /dev/null
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -276,6 +276,10 @@ config LEDS_WNDR3700_USB
- This option enables support for the USB LED found on the
- NETGEAR WNDR3700 board.
-
-+config LEDS_RB750
-+ tristate "LED driver for the Mikrotik RouterBOARD 750"
-+ depends on LEDS_CLASS && AR71XX_MACH_RB750
-+
- comment "LED Triggers"
-
- config LEDS_TRIGGERS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -34,6 +34,7 @@ obj-$(CONFIG_LEDS_REGULATOR) += leds-re
- obj-$(CONFIG_LEDS_INTEL_SS4200) += leds-ss4200.o
- obj-$(CONFIG_LEDS_LT3593) += leds-lt3593.o
- obj-$(CONFIG_LEDS_ADP5520) += leds-adp5520.o
-+obj-$(CONFIG_LEDS_RB750) += leds-rb750.o
-
- # LED SPI Drivers
- obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o
+++ /dev/null
---- a/drivers/mtd/nand/Kconfig
-+++ b/drivers/mtd/nand/Kconfig
-@@ -492,4 +492,8 @@ config MTD_NAND_RB4XX
- tristate "NAND flash driver for RouterBoard 4xx series"
- depends on MTD_NAND && AR71XX_MACH_RB4XX
-
-+config MTD_NAND_RB750
-+ tristate "NAND flash driver for the RouterBoard 750"
-+ depends on MTD_NAND && AR71XX_MACH_RB750
-+
- endif # MTD_NAND
---- a/drivers/mtd/nand/Makefile
-+++ b/drivers/mtd/nand/Makefile
-@@ -31,6 +31,7 @@ obj-$(CONFIG_MTD_NAND_PXA3xx) += pxa3xx
- obj-$(CONFIG_MTD_NAND_TMIO) += tmio_nand.o
- obj-$(CONFIG_MTD_NAND_PLATFORM) += plat_nand.o
- obj-$(CONFIG_MTD_NAND_RB4XX) += rb4xx_nand.o
-+obj-$(CONFIG_MTD_NAND_RB750) += rb750_nand.o
- obj-$(CONFIG_MTD_ALAUDA) += alauda.o
- obj-$(CONFIG_MTD_NAND_PASEMI) += pasemi_nand.o
- obj-$(CONFIG_MTD_NAND_ORION) += orion_nand.o
+++ /dev/null
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -190,6 +190,7 @@ endif
- #
- libs-$(CONFIG_ARC) += arch/mips/fw/arc/
- libs-$(CONFIG_CFE) += arch/mips/fw/cfe/
-+libs-$(CONFIG_MYLOADER) += arch/mips/fw/myloader/
- libs-$(CONFIG_SNIPROM) += arch/mips/fw/sni/
- libs-y += arch/mips/fw/lib/
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -877,6 +877,9 @@ config MIPS_NILE4
- config MIPS_DISABLE_OBSOLETE_IDE
- bool
-
-+config MYLOADER
-+ bool
-+
- config SYNC_R4K
- bool
-
+++ /dev/null
---- a/arch/mips/kernel/mips_machine.c
-+++ b/arch/mips/kernel/mips_machine.c
-@@ -7,12 +7,13 @@
- *
- */
- #include <linux/mm.h>
-+#include <linux/string.h>
-
- #include <asm/mips_machine.h>
--#include <asm/bootinfo.h>
-
- static struct list_head mips_machines __initdata =
- LIST_HEAD_INIT(mips_machines);
-+static char *mips_machid __initdata;
-
- char *mips_machine_name = "Unknown";
-
-@@ -55,20 +56,65 @@ void __init mips_machine_set_name(char *
- }
- }
-
--void __init mips_machine_setup(unsigned long machtype)
-+void __init mips_machine_setup(void)
- {
- struct mips_machine *mach;
-
-- mach = mips_machine_find(machtype);
-+ mach = mips_machine_find(mips_machtype);
- if (!mach) {
-- printk(KERN_ALERT "MIPS: no machine registered for "
-- "machtype %lu\n", machtype);
-+ printk(KERN_WARNING "MIPS: no machine registered for "
-+ "machtype %lu\n", mips_machtype);
- return;
- }
-
- mips_machine_set_name(mach->mach_name);
-- printk(KERN_INFO "MIPS: machine is %s\n", mips_machine_name);
-+ printk(KERN_NOTICE "MIPS: machine is %s\n", mips_machine_name);
-
- if (mach->mach_setup)
- mach->mach_setup();
- }
-+
-+int __init mips_machtype_setup(char *id)
-+{
-+ if (mips_machid == NULL)
-+ mips_machid = id;
-+
-+ return 1;
-+}
-+
-+__setup("machtype=", mips_machtype_setup);
-+
-+static int __init mips_machtype_init(void)
-+{
-+ struct list_head *this;
-+ struct mips_machine *mach;
-+
-+ if (mips_machid == NULL)
-+ return 0;
-+
-+ list_for_each(this, &mips_machines) {
-+ mach = list_entry(this, struct mips_machine, list);
-+ if (mach->mach_id == NULL)
-+ continue;
-+
-+ if (strcmp(mach->mach_id, mips_machid) == 0) {
-+ mips_machtype = mach->mach_type;
-+ return 0;
-+ }
-+ }
-+
-+ printk(KERN_WARNING
-+ "MIPS: no machine found for id: '%s', registered machines:\n",
-+ mips_machid);
-+ printk(KERN_WARNING "%32s %s\n", "id", "name");
-+
-+ list_for_each(this, &mips_machines) {
-+ mach = list_entry(this, struct mips_machine, list);
-+ printk(KERN_WARNING "%32s %s\n",
-+ mach->mach_id ? mach->mach_id : "", mach->mach_name);
-+ }
-+
-+ return 0;
-+}
-+
-+core_initcall(mips_machtype_init);
---- a/arch/mips/include/asm/mips_machine.h
-+++ b/arch/mips/include/asm/mips_machine.h
-@@ -13,25 +13,33 @@
- #include <linux/init.h>
- #include <linux/list.h>
-
-+#include <asm/bootinfo.h>
-+
- struct mips_machine {
- unsigned long mach_type;
-- void (*mach_setup)(void);
-+ char *mach_id;
- char *mach_name;
-+ void (*mach_setup)(void);
- struct list_head list;
- };
-
- void mips_machine_register(struct mips_machine *) __init;
--void mips_machine_setup(unsigned long machtype) __init;
-+void mips_machine_setup(void) __init;
-+int mips_machtype_setup(char *id) __init;
- void mips_machine_set_name(char *name) __init;
-
- extern char *mips_machine_name;
-
--#define MIPS_MACHINE(_type, _name, _setup) \
--static char machine_name_##_type[] __initdata = _name; \
-+#define MIPS_MACHINE(_type, _id, _name, _setup) \
-+static const char machine_name_##_type[] __initconst \
-+ __aligned(1) = _name; \
-+static const char machine_id_##_type[] __initconst \
-+ __aligned(1) = _id; \
- static struct mips_machine machine_##_type __initdata = \
- { \
- .mach_type = _type, \
-- .mach_name = machine_name_##_type, \
-+ .mach_id = (char *) machine_id_##_type, \
-+ .mach_name = (char *) machine_name_##_type, \
- .mach_setup = _setup, \
- }; \
- \
-@@ -44,4 +52,3 @@ static int __init register_machine_##_ty
- pure_initcall(register_machine_##_type)
-
- #endif /* __ASM_MIPS_MACHINE_H */
--
+++ /dev/null
---- a/arch/mips/kernel/traps.c
-+++ b/arch/mips/kernel/traps.c
-@@ -50,6 +50,7 @@
- #include <asm/types.h>
- #include <asm/stacktrace.h>
- #include <asm/irq.h>
-+#include <asm/time.h>
-
- extern void check_wait(void);
- extern asmlinkage void r4k_wait(void);
-@@ -1496,6 +1497,8 @@ void __cpuinit per_cpu_trap_init(void)
- if (cpu_has_mips_r2) {
- cp0_compare_irq_shift = CAUSEB_TI - CAUSEB_IP;
- cp0_compare_irq = (read_c0_intctl() >> INTCTLB_IPTI) & 7;
-+ if (get_c0_compare_irq)
-+ cp0_compare_irq = get_c0_compare_irq();
- cp0_perfcount_irq = (read_c0_intctl() >> INTCTLB_IPPCI) & 7;
- if (cp0_perfcount_irq == cp0_compare_irq)
- cp0_perfcount_irq = -1;
---- a/arch/mips/include/asm/time.h
-+++ b/arch/mips/include/asm/time.h
-@@ -52,6 +52,7 @@ extern int (*perf_irq)(void);
- */
- #ifdef CONFIG_CEVT_R4K_LIB
- extern unsigned int __weak get_c0_compare_int(void);
-+extern unsigned int __weak get_c0_compare_irq(void);
- extern int r4k_clockevent_init(void);
- #endif
-
+++ /dev/null
---- a/arch/mips/kernel/cevt-r4k.c
-+++ b/arch/mips/kernel/cevt-r4k.c
-@@ -16,6 +16,22 @@
- #include <asm/cevt-r4k.h>
-
- /*
-+ * Compare interrupt can be routed and latched outside the core,
-+ * so a single execution hazard barrier may not be enough to give
-+ * it time to clear as seen in the Cause register. 4 time the
-+ * pipeline depth seems reasonably conservative, and empirically
-+ * works better in configurations with high CPU/bus clock ratios.
-+ */
-+
-+#define compare_change_hazard() \
-+ do { \
-+ irq_disable_hazard(); \
-+ irq_disable_hazard(); \
-+ irq_disable_hazard(); \
-+ irq_disable_hazard(); \
-+ } while (0)
-+
-+/*
- * The SMTC Kernel for the 34K, 1004K, et. al. replaces several
- * of these routines with SMTC-specific variants.
- */
-@@ -31,6 +47,7 @@ static int mips_next_event(unsigned long
- cnt = read_c0_count();
- cnt += delta;
- write_c0_compare(cnt);
-+ compare_change_hazard();
- res = ((int)(read_c0_count() - cnt) > 0) ? -ETIME : 0;
- return res;
- }
-@@ -100,22 +117,6 @@ static int c0_compare_int_pending(void)
- return (read_c0_cause() >> cp0_compare_irq_shift) & (1ul << CAUSEB_IP);
- }
-
--/*
-- * Compare interrupt can be routed and latched outside the core,
-- * so a single execution hazard barrier may not be enough to give
-- * it time to clear as seen in the Cause register. 4 time the
-- * pipeline depth seems reasonably conservative, and empirically
-- * works better in configurations with high CPU/bus clock ratios.
-- */
--
--#define compare_change_hazard() \
-- do { \
-- irq_disable_hazard(); \
-- irq_disable_hazard(); \
-- irq_disable_hazard(); \
-- irq_disable_hazard(); \
-- } while (0)
--
- int c0_compare_int_usable(void)
- {
- unsigned int delta;
+++ /dev/null
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -166,6 +166,13 @@ ifeq (,$(findstring march=octeon, $(cfla
- cflags-$(CONFIG_CPU_CAVIUM_OCTEON) += -Wa,-march=octeon
- endif
-
-+#
-+# Atheros AR71xx
-+#
-+core-$(CONFIG_ATHEROS_AR71XX) += arch/mips/ar71xx/
-+cflags-$(CONFIG_ATHEROS_AR71XX) += -I$(srctree)/arch/mips/include/asm/mach-ar71xx
-+load-$(CONFIG_ATHEROS_AR71XX) += 0xffffffff80060000
-+
- cflags-$(CONFIG_CPU_R4000_WORKAROUNDS) += $(call cc-option,-mfix-r4000,)
- cflags-$(CONFIG_CPU_R4400_WORKAROUNDS) += $(call cc-option,-mfix-r4400,)
- cflags-$(CONFIG_CPU_DADDI_WORKAROUNDS) += $(call cc-option,-mno-daddi,)
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -48,6 +48,23 @@ config AR7
- Support for the Texas Instruments AR7 System-on-a-Chip
- family: TNETD7100, 7200 and 7300.
-
-+config ATHEROS_AR71XX
-+ bool "Atheros AR71xx based boards"
-+ select CEVT_R4K
-+ select CSRC_R4K
-+ select DMA_NONCOHERENT
-+ select HW_HAS_PCI
-+ select IRQ_CPU
-+ select ARCH_REQUIRE_GPIOLIB
-+ select SYS_HAS_CPU_MIPS32_R1
-+ select SYS_HAS_CPU_MIPS32_R2
-+ select SYS_SUPPORTS_32BIT_KERNEL
-+ select SYS_SUPPORTS_BIG_ENDIAN
-+ select SYS_HAS_EARLY_PRINTK
-+ select MIPS_MACHINE
-+ help
-+ Support for Atheros AR71xx based boards.
-+
- config BCM47XX
- bool "BCM47XX based boards"
- select CEVT_R4K
-@@ -682,6 +699,7 @@ config CAVIUM_OCTEON_REFERENCE_BOARD
- endchoice
-
- source "arch/mips/alchemy/Kconfig"
-+source "arch/mips/ar71xx/Kconfig"
- source "arch/mips/bcm63xx/Kconfig"
- source "arch/mips/jazz/Kconfig"
- source "arch/mips/lasat/Kconfig"
+++ /dev/null
---- a/arch/mips/pci/Makefile
-+++ b/arch/mips/pci/Makefile
-@@ -18,6 +18,7 @@ obj-$(CONFIG_PCI_TX4927) += ops-tx4927.o
- obj-$(CONFIG_BCM47XX) += pci-bcm47xx.o
- obj-$(CONFIG_BCM63XX) += pci-bcm63xx.o fixup-bcm63xx.o \
- ops-bcm63xx.o
-+obj-$(CONFIG_ATHEROS_AR71XX) += pci-ar71xx.o pci-ar724x.o
-
- #
- # These are still pretty much in the old state, watch, go blind.
+++ /dev/null
---- a/drivers/usb/host/Kconfig
-+++ b/drivers/usb/host/Kconfig
-@@ -109,6 +109,13 @@ config XPS_USB_HCD_XILINX
- support both high speed and full speed devices, or high speed
- devices only.
-
-+config USB_EHCI_AR71XX
-+ bool "USB EHCI support for AR71xx"
-+ depends on USB_EHCI_HCD && ATHEROS_AR71XX
-+ default y
-+ help
-+ Support for Atheros AR71xx built-in EHCI controller
-+
- config USB_EHCI_FSL
- bool "Support for Freescale on-chip EHCI USB controller"
- depends on USB_EHCI_HCD && FSL_SOC
-@@ -207,6 +214,13 @@ config USB_OHCI_HCD
- To compile this driver as a module, choose M here: the
- module will be called ohci-hcd.
-
-+config USB_OHCI_AR71XX
-+ bool "USB OHCI support for Atheros AR71xx"
-+ depends on USB_OHCI_HCD && ATHEROS_AR71XX
-+ default y
-+ help
-+ Support for Atheros AR71xx built-in OHCI controller
-+
- config USB_OHCI_HCD_PPC_SOC
- bool "OHCI support for on-chip PPC USB controller"
- depends on USB_OHCI_HCD && (STB03xxx || PPC_MPC52xx)
---- a/drivers/usb/host/ehci-hcd.c
-+++ b/drivers/usb/host/ehci-hcd.c
-@@ -1158,6 +1158,11 @@ MODULE_LICENSE ("GPL");
- #define PLATFORM_DRIVER ehci_atmel_driver
- #endif
-
-+#ifdef CONFIG_USB_EHCI_AR71XX
-+#include "ehci-ar71xx.c"
-+#define PLATFORM_DRIVER ehci_ar71xx_driver
-+#endif
-+
- #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \
- !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER)
- #error "missing bus glue for ehci-hcd"
---- a/drivers/usb/host/ohci-hcd.c
-+++ b/drivers/usb/host/ohci-hcd.c
-@@ -1085,6 +1085,11 @@ MODULE_LICENSE ("GPL");
- #define TMIO_OHCI_DRIVER ohci_hcd_tmio_driver
- #endif
-
-+#ifdef CONFIG_USB_OHCI_AR71XX
-+#include "ohci-ar71xx.c"
-+#define PLATFORM_DRIVER ohci_hcd_ar71xx_driver
-+#endif
-+
- #if !defined(PCI_DRIVER) && \
- !defined(PLATFORM_DRIVER) && \
- !defined(OF_PLATFORM_DRIVER) && \
+++ /dev/null
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -53,6 +53,13 @@ if SPI_MASTER
-
- comment "SPI Master Controller Drivers"
-
-+config SPI_AR71XX
-+ tristate "Atheros AR71xx SPI Controller"
-+ depends on SPI_MASTER && ATHEROS_AR71XX
-+ select SPI_BITBANG
-+ help
-+ This is the SPI contoller driver for Atheros AR71xx.
-+
- config SPI_ATMEL
- tristate "Atmel SPI Controller"
- depends on (ARCH_AT91 || AVR32)
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -11,6 +11,7 @@ endif
- obj-$(CONFIG_SPI_MASTER) += spi.o
-
- # SPI master controller drivers (bus)
-+obj-$(CONFIG_SPI_AR71XX) += ar71xx_spi.o
- obj-$(CONFIG_SPI_ATMEL) += atmel_spi.o
- obj-$(CONFIG_SPI_BFIN) += spi_bfin5xx.o
- obj-$(CONFIG_SPI_BITBANG) += spi_bitbang.o
+++ /dev/null
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -2128,6 +2128,8 @@ config ACENIC_OMIT_TIGON_I
-
- The safe and default value for this is N.
-
-+source drivers/net/ag71xx/Kconfig
-+
- config DL2K
- tristate "DL2000/TC902x-based Gigabit Ethernet support"
- depends on PCI
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -106,6 +106,7 @@ obj-$(CONFIG_STMMAC_ETH) += stmmac/
- # end link order section
- #
-
-+obj-$(CONFIG_AG71XX) += ag71xx/
- obj-$(CONFIG_SUNDANCE) += sundance.o
- obj-$(CONFIG_HAMACHI) += hamachi.o
- obj-$(CONFIG_NET) += Space.o loopback.o
+++ /dev/null
---- a/drivers/watchdog/Kconfig
-+++ b/drivers/watchdog/Kconfig
-@@ -840,6 +840,13 @@ config TXX9_WDT
- help
- Hardware driver for the built-in watchdog timer on TXx9 MIPS SoCs.
-
-+config AR71XX_WDT
-+ tristate "Atheros AR71xx Watchdog Timer"
-+ depends on ATHEROS_AR71XX
-+ help
-+ Hardware driver for the built-in watchdog timer on the Atheros
-+ AR71xx SoCs.
-+
- # PARISC Architecture
-
- # POWERPC Architecture
---- a/drivers/watchdog/Makefile
-+++ b/drivers/watchdog/Makefile
-@@ -112,6 +112,7 @@ obj-$(CONFIG_PNX833X_WDT) += pnx833x_wdt
- obj-$(CONFIG_SIBYTE_WDOG) += sb_wdog.o
- obj-$(CONFIG_AR7_WDT) += ar7_wdt.o
- obj-$(CONFIG_TXX9_WDT) += txx9wdt.o
-+obj-$(CONFIG_AR71XX_WDT) += ar71xx_wdt.o
-
- # PARISC Architecture
-
+++ /dev/null
---- a/drivers/mtd/maps/Kconfig
-+++ b/drivers/mtd/maps/Kconfig
-@@ -257,6 +257,13 @@ config MTD_ALCHEMY
- help
- Flash memory access on AMD Alchemy Pb/Db/RDK Reference Boards
-
-+config MTD_AR91XX_FLASH
-+ tristate "Atheros AR91xx parallel flash support"
-+ depends on ATHEROS_AR71XX
-+ select MTD_COMPLEX_MAPPINGS
-+ help
-+ Parallel flash driver for the Atheros AR91xx based boards.
-+
- config MTD_DILNETPC
- tristate "CFI Flash device mapped on DIL/Net PC"
- depends on X86 && MTD_CONCAT && MTD_PARTITIONS && MTD_CFI_INTELEXT && BROKEN
---- a/drivers/mtd/maps/Makefile
-+++ b/drivers/mtd/maps/Makefile
-@@ -40,6 +40,7 @@
- obj-$(CONFIG_MTD_DBOX2) += dbox2-flash.o
- obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
- obj-$(CONFIG_MTD_PCI) += pci.o
-+obj-$(CONFIG_MTD_AR91XX_FLASH) += ar91xx_flash.o
- obj-$(CONFIG_MTD_AUTCPU12) += autcpu12-nvram.o
- obj-$(CONFIG_MTD_EDB7312) += edb7312.o
- obj-$(CONFIG_MTD_IMPA7) += impa7.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -114,6 +114,11 @@ config RTL8306_PHY
- tristate "Driver for Realtek RTL8306S switches"
- select SWCONFIG
-
-+config MICREL_PHY
-+ tristate "Drivers for Micrel/Kendin PHYs"
-+ ---help---
-+ Currently has a driver for the KSZ8041
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -24,6 +24,7 @@ obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi
- obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o
- obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
-+obj-$(CONFIG_MICREL) += micrel.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
- obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
- obj-$(CONFIG_MDIO_GPIO) += mdio-gpio.o
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -922,6 +922,16 @@ static int __devinit m25p_probe(struct s
- part_probes, &parts, 0);
- }
-
-+#ifdef CONFIG_MTD_MYLOADER_PARTS
-+ if (nr_parts <= 0) {
-+ static const char *part_probes[]
-+ = { "MyLoader", NULL, };
-+
-+ nr_parts = parse_mtd_partitions(&flash->mtd,
-+ part_probes, &parts, 0);
-+ }
-+#endif
-+
- if (nr_parts <= 0 && data && data->parts) {
- parts = data->parts;
- nr_parts = data->nr_parts;
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -932,6 +932,15 @@ static int __devinit m25p_probe(struct s
- }
- #endif
-
-+#ifdef CONFIG_MTD_REDBOOT_PARTS
-+ if (nr_parts <= 0) {
-+ static const char *part_probes[]
-+ = { "RedBoot", NULL, };
-+
-+ nr_parts = parse_mtd_partitions(&flash->mtd,
-+ part_probes, &parts, 0);
-+ }
-+#endif
- if (nr_parts <= 0 && data && data->parts) {
- parts = data->parts;
- nr_parts = data->nr_parts;
+++ /dev/null
---- a/drivers/mtd/chips/jedec_probe.c
-+++ b/drivers/mtd/chips/jedec_probe.c
-@@ -166,6 +166,7 @@
- #define SST39LF160 0x2782
- #define SST39VF1601 0x234b
- #define SST39VF3201 0x235b
-+#define SST39VF6401B 0x236d
- #define SST39LF512 0x00D4
- #define SST39LF010 0x00D5
- #define SST39LF020 0x00D6
-@@ -1556,6 +1557,18 @@ static const struct amd_flash_info jedec
- ERASEINFO(0x10000,64),
- }
- }, {
-+ .mfr_id = MANUFACTURER_SST,
-+ .dev_id = SST39VF6401B,
-+ .name = "SST 39VF6401B",
-+ .devtypes = CFI_DEVICETYPE_X16,
-+ .uaddr = MTD_UADDR_0xAAAA_0x5555,
-+ .dev_size = SIZE_8MiB,
-+ .cmd_set = P_ID_AMD_STD,
-+ .nr_regions = 1,
-+ .regions = {
-+ ERASEINFO(0x10000,128)
-+ }
-+ }, {
- .mfr_id = MANUFACTURER_ST,
- .dev_id = M29F800AB,
- .name = "ST M29F800AB",
+++ /dev/null
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -1130,8 +1130,8 @@ static int __xipram do_write_oneword(str
- break;
- }
-
-- if (chip_ready(map, adr))
-- break;
-+ if (chip_good(map, adr, datum))
-+ goto enable_xip;
-
- /* Latency issues. Drop the lock, wait a while and retry */
- UDELAY(map, chip, adr, 1);
-@@ -1147,6 +1147,8 @@ static int __xipram do_write_oneword(str
-
- ret = -EIO;
- }
-+
-+ enable_xip:
- xip_enable(map, chip, adr);
- op_done:
- chip->state = FL_READY;
-@@ -1493,7 +1495,6 @@ static int cfi_amdstd_write_buffers(stru
- return 0;
- }
-
--
- /*
- * Handle devices with one erase region, that only implement
- * the chip erase command.
-@@ -1557,8 +1558,8 @@ static int __xipram do_erase_chip(struct
- chip->erase_suspended = 0;
- }
-
-- if (chip_ready(map, adr))
-- break;
-+ if (chip_good(map, adr, map_word_ff(map)))
-+ goto op_done;
-
- if (time_after(jiffies, timeo)) {
- printk(KERN_WARNING "MTD %s(): software timeout\n",
-@@ -1578,6 +1579,7 @@ static int __xipram do_erase_chip(struct
- ret = -EIO;
- }
-
-+ op_done:
- chip->state = FL_READY;
- xip_enable(map, chip, adr);
- put_chip(map, chip, adr);
-@@ -1645,9 +1647,9 @@ static int __xipram do_erase_oneblock(st
- chip->erase_suspended = 0;
- }
-
-- if (chip_ready(map, adr)) {
-+ if (chip_good(map, adr, map_word_ff(map))) {
- xip_enable(map, chip, adr);
-- break;
-+ goto op_done;
- }
-
- if (time_after(jiffies, timeo)) {
-@@ -1669,6 +1671,7 @@ static int __xipram do_erase_oneblock(st
- ret = -EIO;
- }
-
-+ op_done:
- chip->state = FL_READY;
- put_chip(map, chip, adr);
- spin_unlock(chip->mutex);
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -941,6 +941,16 @@ static int __devinit m25p_probe(struct s
- part_probes, &parts, 0);
- }
- #endif
-+
-+#ifdef CONFIG_MTD_WRT160NL_PARTS
-+ if (nr_parts <= 0) {
-+ static const char *part_probes[]
-+ = { "wrt160nl", NULL, };
-+
-+ nr_parts = parse_mtd_partitions(&flash->mtd,
-+ part_probes, &parts, 0);
-+ }
-+#endif
- if (nr_parts <= 0 && data && data->parts) {
- parts = data->parts;
- nr_parts = data->nr_parts;
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -181,6 +181,12 @@ config MTD_AR7_PARTS
- ---help---
- TI AR7 partitioning support
-
-+config MTD_WRT160NL_PARTS
-+ tristate "Linksys WRT160NL partitioning support"
-+ depends on MTD_PARTITIONS && AR71XX_MACH_WRT160NL
-+ ---help---
-+ Linksys WRT160NL partitioning support
-+
- config MTD_MYLOADER_PARTS
- tristate "MyLoader partition parsing"
- depends on MTD_PARTITIONS && (ADM5120 || ATHEROS_AR231X || ATHEROS_AR71XX)
---- a/drivers/mtd/Makefile
-+++ b/drivers/mtd/Makefile
-@@ -12,6 +12,7 @@ obj-$(CONFIG_MTD_REDBOOT_PARTS) += redbo
- obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
- obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
- obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o
-+obj-$(CONFIG_MTD_WRT160NL_PARTS) += wrt160nl_part.o
- obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
- obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
-
+++ /dev/null
---- a/drivers/usb/host/ehci-q.c
-+++ b/drivers/usb/host/ehci-q.c
-@@ -1194,6 +1194,9 @@ static void end_unlink_async (struct ehc
- ehci->reclaim = NULL;
- start_unlink_async (ehci, next);
- }
-+
-+ if (ehci->has_synopsys_hc_bug)
-+ writel((u32)ehci->async->qh_dma, &ehci->regs->async_next);
- }
-
- /* makes sure the async qh will become idle */
---- a/drivers/usb/host/ehci.h
-+++ b/drivers/usb/host/ehci.h
-@@ -129,6 +129,7 @@ struct ehci_hcd { /* one per controlle
- unsigned has_amcc_usb23:1;
- unsigned need_io_watchdog:1;
- unsigned broken_periodic:1;
-+ unsigned has_synopsys_hc_bug:1; /* Synopsys HC */
-
- /* required for usb32 quirk */
- #define OHCI_CTRL_HCFS (3 << 6)
+++ /dev/null
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -39,7 +39,7 @@
- #include <linux/mtd/xip.h>
-
- #define AMD_BOOTLOC_BUG
--#define FORCE_WORD_WRITE 0
-+#define FORCE_WORD_WRITE 1
-
- #define MAX_WORD_RETRIES 3
-
-@@ -55,7 +55,9 @@
-
- static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
- static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
-+#if !FORCE_WORD_WRITE
- static int cfi_amdstd_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
-+#endif
- static int cfi_amdstd_erase_chip(struct mtd_info *, struct erase_info *);
- static int cfi_amdstd_erase_varsize(struct mtd_info *, struct erase_info *);
- static void cfi_amdstd_sync (struct mtd_info *);
-@@ -190,6 +192,7 @@ static void fixup_amd_bootblock(struct m
- }
- #endif
-
-+#if !FORCE_WORD_WRITE
- static void fixup_use_write_buffers(struct mtd_info *mtd, void *param)
- {
- struct map_info *map = mtd->priv;
-@@ -199,6 +202,7 @@ static void fixup_use_write_buffers(stru
- mtd->write = cfi_amdstd_write_buffers;
- }
- }
-+#endif /* !FORCE_WORD_WRITE */
-
- /* Atmel chips don't use the same PRI format as AMD chips */
- static void fixup_convert_atmel_pri(struct mtd_info *mtd, void *param)
-@@ -1304,6 +1308,7 @@ static int cfi_amdstd_write_words(struct
- /*
- * FIXME: interleaved mode not tested, and probably not supported!
- */
-+#if !FORCE_WORD_WRITE
- static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
- unsigned long adr, const u_char *buf,
- int len)
-@@ -1415,7 +1420,6 @@ static int __xipram do_write_buffer(stru
- return ret;
- }
-
--
- static int cfi_amdstd_write_buffers(struct mtd_info *mtd, loff_t to, size_t len,
- size_t *retlen, const u_char *buf)
- {
-@@ -1494,6 +1498,7 @@ static int cfi_amdstd_write_buffers(stru
-
- return 0;
- }
-+#endif /* !FORCE_WORD_WRITE */
-
- /*
- * Handle devices with one erase region, that only implement
+++ /dev/null
---- a/net/dsa/tag_trailer.c
-+++ b/net/dsa/tag_trailer.c
-@@ -86,7 +86,7 @@ static int trailer_rcv(struct sk_buff *s
-
- trailer = skb_tail_pointer(skb) - 4;
- if (trailer[0] != 0x80 || (trailer[1] & 0xf8) != 0x00 ||
-- (trailer[3] & 0xef) != 0x00 || trailer[3] != 0x00)
-+ (trailer[2] & 0xef) != 0x00 || (trailer[3] & 0xfe) != 0x00)
- goto out_drop;
-
- source_port = trailer[1] & 7;
+++ /dev/null
---- a/net/dsa/Kconfig
-+++ b/net/dsa/Kconfig
-@@ -36,6 +36,13 @@ config NET_DSA_MV88E6060
- This enables support for the Marvell 88E6060 ethernet switch
- chip.
-
-+config NET_DSA_MV88E6063
-+ bool "Marvell 88E6063 ethernet switch chip support"
-+ select NET_DSA_TAG_TRAILER
-+ ---help---
-+ This enables support for the Marvell 88E6063 ethernet switch
-+ chip
-+
- config NET_DSA_MV88E6XXX_NEED_PPU
- bool
- default n
---- a/net/dsa/Makefile
-+++ b/net/dsa/Makefile
-@@ -6,6 +6,7 @@ obj-$(CONFIG_NET_DSA_TAG_TRAILER) += tag
- # switch drivers
- obj-$(CONFIG_NET_DSA_MV88E6XXX) += mv88e6xxx.o
- obj-$(CONFIG_NET_DSA_MV88E6060) += mv88e6060.o
-+obj-$(CONFIG_NET_DSA_MV88E6063) += mv88e6063.o
- obj-$(CONFIG_NET_DSA_MV88E6123_61_65) += mv88e6123_61_65.o
- obj-$(CONFIG_NET_DSA_MV88E6131) += mv88e6131.o
-
+++ /dev/null
---- a/include/linux/if_ether.h
-+++ b/include/linux/if_ether.h
-@@ -81,6 +81,7 @@
- #define ETH_P_1588 0x88F7 /* IEEE 1588 Timesync */
- #define ETH_P_FCOE 0x8906 /* Fibre Channel over Ethernet */
- #define ETH_P_FIP 0x8914 /* FCoE Initialization Protocol */
-+#define ETH_P_QINQ 0x9100 /* QinQ VLAN Stacking Protocol */
- #define ETH_P_EDSA 0xDADA /* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */
-
- /*
---- a/net/dsa/dsa_priv.h
-+++ b/net/dsa/dsa_priv.h
-@@ -174,6 +174,9 @@ netdev_tx_t dsa_xmit(struct sk_buff *skb
- /* tag_edsa.c */
- netdev_tx_t edsa_xmit(struct sk_buff *skb, struct net_device *dev);
-
-+/* tag_qinq.c */
-+netdev_tx_t qinq_xmit(struct sk_buff *skb, struct net_device *dev);
-+
- /* tag_trailer.c */
- netdev_tx_t trailer_xmit(struct sk_buff *skb, struct net_device *dev);
-
---- a/net/dsa/Kconfig
-+++ b/net/dsa/Kconfig
-@@ -23,6 +23,10 @@ config NET_DSA_TAG_TRAILER
- bool
- default n
-
-+config NET_DSA_TAG_QINQ
-+ bool
-+ default y
-+
-
- # switch drivers
- config NET_DSA_MV88E6XXX
---- a/net/dsa/Makefile
-+++ b/net/dsa/Makefile
-@@ -1,6 +1,7 @@
- # tagging formats
- obj-$(CONFIG_NET_DSA_TAG_DSA) += tag_dsa.o
- obj-$(CONFIG_NET_DSA_TAG_EDSA) += tag_edsa.o
-+obj-$(CONFIG_NET_DSA_TAG_QINQ) += tag_qinq.o
- obj-$(CONFIG_NET_DSA_TAG_TRAILER) += tag_trailer.o
-
- # switch drivers
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -321,6 +321,19 @@ static const struct net_device_ops edsa_
- .ndo_do_ioctl = dsa_slave_ioctl,
- };
- #endif
-+#ifdef CONFIG_NET_DSA_TAG_QINQ
-+static const struct net_device_ops qinq_netdev_ops = {
-+ .ndo_init = dsa_slave_init,
-+ .ndo_open = dsa_slave_open,
-+ .ndo_stop = dsa_slave_close,
-+ .ndo_start_xmit = qinq_xmit,
-+ .ndo_change_rx_flags = dsa_slave_change_rx_flags,
-+ .ndo_set_rx_mode = dsa_slave_set_rx_mode,
-+ .ndo_set_multicast_list = dsa_slave_set_rx_mode,
-+ .ndo_set_mac_address = dsa_slave_set_mac_address,
-+ .ndo_do_ioctl = dsa_slave_ioctl,
-+};
-+#endif
- #ifdef CONFIG_NET_DSA_TAG_TRAILER
- static const struct net_device_ops trailer_netdev_ops = {
- .ndo_init = dsa_slave_init,
-@@ -366,6 +379,11 @@ dsa_slave_create(struct dsa_switch *ds,
- slave_dev->netdev_ops = &edsa_netdev_ops;
- break;
- #endif
-+#ifdef CONFIG_NET_DSA_TAG_QINQ
-+ case htons(ETH_P_QINQ):
-+ slave_dev->netdev_ops = &qinq_netdev_ops;
-+ break;
-+#endif
- #ifdef CONFIG_NET_DSA_TAG_TRAILER
- case htons(ETH_P_TRAILER):
- slave_dev->netdev_ops = &trailer_netdev_ops;
+++ /dev/null
---- a/net/dsa/Kconfig
-+++ b/net/dsa/Kconfig
-@@ -29,6 +29,15 @@ config NET_DSA_TAG_QINQ
-
-
- # switch drivers
-+config NET_DSA_AR7240
-+ bool "Atheros AR7240 built-in ethernet switch support"
-+ depends on ATHEROS_AR71XX
-+ default n
-+ select NET_DSA_TAG_QINQ
-+ ---help---
-+ This enables support for the built-in ethernet switch of the
-+ Atheros AR7240 SoC.
-+
- config NET_DSA_MV88E6XXX
- bool
- default n
---- a/net/dsa/Makefile
-+++ b/net/dsa/Makefile
-@@ -5,6 +5,7 @@ obj-$(CONFIG_NET_DSA_TAG_QINQ) += tag_qi
- obj-$(CONFIG_NET_DSA_TAG_TRAILER) += tag_trailer.o
-
- # switch drivers
-+obj-$(CONFIG_NET_DSA_AR7240) += ar7240.o
- obj-$(CONFIG_NET_DSA_MV88E6XXX) += mv88e6xxx.o
- obj-$(CONFIG_NET_DSA_MV88E6060) += mv88e6060.o
- obj-$(CONFIG_NET_DSA_MV88E6063) += mv88e6063.o
+++ /dev/null
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -60,31 +60,32 @@ static int parse_redboot_partitions(stru
- static char nullstring[] = "unallocated";
- #endif
-
-+ buf = vmalloc(master->erasesize);
-+ if (!buf)
-+ return -ENOMEM;
-+
-+ restart:
- if ( directory < 0 ) {
- offset = master->size + directory * master->erasesize;
-- while (master->block_isbad &&
-+ while (master->block_isbad &&
- master->block_isbad(master, offset)) {
- if (!offset) {
- nogood:
- printk(KERN_NOTICE "Failed to find a non-bad block to check for RedBoot partition table\n");
-+ vfree(buf);
- return -EIO;
- }
- offset -= master->erasesize;
- }
- } else {
- offset = directory * master->erasesize;
-- while (master->block_isbad &&
-+ while (master->block_isbad &&
- master->block_isbad(master, offset)) {
- offset += master->erasesize;
- if (offset == master->size)
- goto nogood;
- }
- }
-- buf = vmalloc(master->erasesize);
--
-- if (!buf)
-- return -ENOMEM;
--
- printk(KERN_NOTICE "Searching for RedBoot partition table in %s at offset 0x%lx\n",
- master->name, offset);
-
-@@ -156,6 +157,11 @@ static int parse_redboot_partitions(stru
- }
- if (i == numslots) {
- /* Didn't find it */
-+ if (offset + master->erasesize < master->size) {
-+ /* not at the end of the flash yet, maybe next block :) */
-+ directory++;
-+ goto restart;
-+ }
- printk(KERN_NOTICE "No RedBoot partition table detected in %s\n",
- master->name);
- ret = 0;
+++ /dev/null
---- a/drivers/mtd/nand/Kconfig
-+++ b/drivers/mtd/nand/Kconfig
-@@ -488,4 +488,8 @@ config MTD_NAND_W90P910
- This enables the driver for the NAND Flash on evaluation board based
- on w90p910.
-
-+config MTD_NAND_RB4XX
-+ tristate "NAND flash driver for RouterBoard 4xx series"
-+ depends on MTD_NAND && AR71XX_MACH_RB4XX
-+
- endif # MTD_NAND
---- a/drivers/mtd/nand/Makefile
-+++ b/drivers/mtd/nand/Makefile
-@@ -30,6 +30,7 @@ obj-$(CONFIG_MTD_NAND_CM_X270) += cmx27
- obj-$(CONFIG_MTD_NAND_PXA3xx) += pxa3xx_nand.o
- obj-$(CONFIG_MTD_NAND_TMIO) += tmio_nand.o
- obj-$(CONFIG_MTD_NAND_PLATFORM) += plat_nand.o
-+obj-$(CONFIG_MTD_NAND_RB4XX) += rb4xx_nand.o
- obj-$(CONFIG_MTD_ALAUDA) += alauda.o
- obj-$(CONFIG_MTD_NAND_PASEMI) += pasemi_nand.o
- obj-$(CONFIG_MTD_NAND_ORION) += orion_nand.o
+++ /dev/null
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -11,6 +11,7 @@ endif
- obj-$(CONFIG_SPI_MASTER) += spi.o
-
- # SPI master controller drivers (bus)
-+obj-$(CONFIG_SPI_AP83) += ap83_spi.o
- obj-$(CONFIG_SPI_AR71XX) += ar71xx_spi.o
- obj-$(CONFIG_SPI_ATMEL) += atmel_spi.o
- obj-$(CONFIG_SPI_BFIN) += spi_bfin5xx.o
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -53,6 +53,14 @@ if SPI_MASTER
-
- comment "SPI Master Controller Drivers"
-
-+config SPI_AP83
-+ tristate "Atheros AP83 specific SPI Controller"
-+ depends on SPI_MASTER && AR71XX_MACH_AP83
-+ select SPI_BITBANG
-+ help
-+ This is a specific SPI controller driver for the Atheros AP83
-+ reference board.
-+
- config SPI_AR71XX
- tristate "Atheros AR71xx SPI Controller"
- depends on SPI_MASTER && ATHEROS_AR71XX
+++ /dev/null
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -365,6 +365,11 @@ config SPI_TLE62X0
- sysfs interface, with each line presented as a kind of GPIO
- exposing both switch control and diagnostic feedback.
-
-+config SPI_VSC7385
-+ tristate "Vitesse VSC7385 ethernet switch driver"
-+ help
-+ SPI driver for the Vitesse VSC7385 ethernet switch.
-+
- #
- # Add new SPI protocol masters in alphabetical order above this line
- #
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -54,6 +54,7 @@ spi_s3c24xx_hw-$(CONFIG_SPI_S3C24XX_FIQ)
-
- # SPI protocol drivers (device/link on bus)
- obj-$(CONFIG_SPI_SPIDEV) += spidev.o
-+obj-$(CONFIG_SPI_VSC7385) += spi_vsc7385.o
- obj-$(CONFIG_SPI_TLE62X0) += tle62x0.o
- # ... add above this line ...
-
+++ /dev/null
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -68,6 +68,14 @@ config SPI_AR71XX
- help
- This is the SPI contoller driver for Atheros AR71xx.
-
-+config SPI_PB44
-+ tristate "Atheros PB44 board specific SPI controller"
-+ depends on SPI_MASTER && AR71XX_MACH_PB44
-+ select SPI_BITBANG
-+ help
-+ This is a specific SPI controller driver for the Atheros PB44
-+ reference board.
-+
- config SPI_ATMEL
- tristate "Atmel SPI Controller"
- depends on (ARCH_AT91 || AVR32)
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -24,6 +24,7 @@ obj-$(CONFIG_SPI_GPIO) += spi_gpio.o
- obj-$(CONFIG_SPI_GPIO_OLD) += spi_gpio_old.o
- obj-$(CONFIG_SPI_IMX) += spi_imx.o
- obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o
-+obj-$(CONFIG_SPI_PB44) += pb44_spi.o
- obj-$(CONFIG_SPI_PXA2XX) += pxa2xx_spi.o
- obj-$(CONFIG_SPI_OMAP_UWIRE) += omap_uwire.o
- obj-$(CONFIG_SPI_OMAP24XX) += omap2_mcspi.o
+++ /dev/null
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -269,6 +269,13 @@ config LEDS_ADP5520
- To compile this driver as a module, choose M here: the module will
- be called leds-adp5520.
-
-+config LEDS_WNDR3700_USB
-+ tristate "NETGEAR WNDR3700 USB LED driver"
-+ depends on LEDS_CLASS && AR71XX_MACH_WNDR3700
-+ help
-+ This option enables support for the USB LED found on the
-+ NETGEAR WNDR3700 board.
-+
- comment "LED Triggers"
-
- config LEDS_TRIGGERS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -29,6 +29,7 @@ obj-$(CONFIG_LEDS_DA903X) += leds-da903
- obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o
- obj-$(CONFIG_LEDS_WM8350) += leds-wm8350.o
- obj-$(CONFIG_LEDS_PWM) += leds-pwm.o
-+obj-${CONFIG_LEDS_WNDR3700_USB} += leds-wndr3700-usb.o
- obj-$(CONFIG_LEDS_REGULATOR) += leds-regulator.o
- obj-$(CONFIG_LEDS_INTEL_SS4200) += leds-ss4200.o
- obj-$(CONFIG_LEDS_LT3593) += leds-lt3593.o
+++ /dev/null
---- a/drivers/gpio/Kconfig
-+++ b/drivers/gpio/Kconfig
-@@ -255,4 +255,12 @@ config GPIO_UCB1400
- To compile this driver as a module, choose M here: the
- module will be called ucb1400_gpio.
-
-+comment "Other GPIO expanders"
-+
-+config GPIO_NXP_74HC153
-+ tristate "NXP 74HC153 Dual 4-input multiplexer"
-+ help
-+ Platform driver for NXP 74HC153 Dual 4-input Multiplexer. This
-+ provides a GPIO interface supporting inputs.
-+
- endif
---- a/drivers/gpio/Makefile
-+++ b/drivers/gpio/Makefile
-@@ -11,6 +11,7 @@ obj-$(CONFIG_GPIO_MAX7301) += max7301.o
- obj-$(CONFIG_GPIO_MAX732X) += max732x.o
- obj-$(CONFIG_GPIO_MC33880) += mc33880.o
- obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o
-+obj-$(CONFIG_GPIO_NXP_74HC153) += nxp_74hc153.o
- obj-$(CONFIG_GPIO_PCA953X) += pca953x.o
- obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
- obj-$(CONFIG_GPIO_PL061) += pl061.o
+++ /dev/null
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -276,6 +276,10 @@ config LEDS_WNDR3700_USB
- This option enables support for the USB LED found on the
- NETGEAR WNDR3700 board.
-
-+config LEDS_RB750
-+ tristate "LED driver for the Mikrotik RouterBOARD 750"
-+ depends on LEDS_CLASS && AR71XX_MACH_RB750
-+
- comment "LED Triggers"
-
- config LEDS_TRIGGERS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -34,6 +34,7 @@ obj-$(CONFIG_LEDS_REGULATOR) += leds-re
- obj-$(CONFIG_LEDS_INTEL_SS4200) += leds-ss4200.o
- obj-$(CONFIG_LEDS_LT3593) += leds-lt3593.o
- obj-$(CONFIG_LEDS_ADP5520) += leds-adp5520.o
-+obj-$(CONFIG_LEDS_RB750) += leds-rb750.o
-
- # LED SPI Drivers
- obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o
+++ /dev/null
---- a/drivers/mtd/nand/Kconfig
-+++ b/drivers/mtd/nand/Kconfig
-@@ -492,4 +492,8 @@ config MTD_NAND_RB4XX
- tristate "NAND flash driver for RouterBoard 4xx series"
- depends on MTD_NAND && AR71XX_MACH_RB4XX
-
-+config MTD_NAND_RB750
-+ tristate "NAND flash driver for the RouterBoard 750"
-+ depends on MTD_NAND && AR71XX_MACH_RB750
-+
- endif # MTD_NAND
---- a/drivers/mtd/nand/Makefile
-+++ b/drivers/mtd/nand/Makefile
-@@ -31,6 +31,7 @@ obj-$(CONFIG_MTD_NAND_PXA3xx) += pxa3xx
- obj-$(CONFIG_MTD_NAND_TMIO) += tmio_nand.o
- obj-$(CONFIG_MTD_NAND_PLATFORM) += plat_nand.o
- obj-$(CONFIG_MTD_NAND_RB4XX) += rb4xx_nand.o
-+obj-$(CONFIG_MTD_NAND_RB750) += rb750_nand.o
- obj-$(CONFIG_MTD_ALAUDA) += alauda.o
- obj-$(CONFIG_MTD_NAND_PASEMI) += pasemi_nand.o
- obj-$(CONFIG_MTD_NAND_ORION) += orion_nand.o
+++ /dev/null
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -188,6 +188,7 @@ endif
- #
- libs-$(CONFIG_ARC) += arch/mips/fw/arc/
- libs-$(CONFIG_CFE) += arch/mips/fw/cfe/
-+libs-$(CONFIG_MYLOADER) += arch/mips/fw/myloader/
- libs-$(CONFIG_SNIPROM) += arch/mips/fw/sni/
- libs-y += arch/mips/fw/lib/
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -877,6 +877,9 @@ config MIPS_NILE4
- config MIPS_DISABLE_OBSOLETE_IDE
- bool
-
-+config MYLOADER
-+ bool
-+
- config SYNC_R4K
- bool
-
+++ /dev/null
---- a/arch/mips/kernel/mips_machine.c
-+++ b/arch/mips/kernel/mips_machine.c
-@@ -7,12 +7,13 @@
- *
- */
- #include <linux/mm.h>
-+#include <linux/string.h>
-
- #include <asm/mips_machine.h>
--#include <asm/bootinfo.h>
-
- static struct list_head mips_machines __initdata =
- LIST_HEAD_INIT(mips_machines);
-+static char *mips_machid __initdata;
-
- char *mips_machine_name = "Unknown";
-
-@@ -55,20 +56,65 @@ void __init mips_machine_set_name(char *
- }
- }
-
--void __init mips_machine_setup(unsigned long machtype)
-+void __init mips_machine_setup(void)
- {
- struct mips_machine *mach;
-
-- mach = mips_machine_find(machtype);
-+ mach = mips_machine_find(mips_machtype);
- if (!mach) {
-- printk(KERN_ALERT "MIPS: no machine registered for "
-- "machtype %lu\n", machtype);
-+ printk(KERN_WARNING "MIPS: no machine registered for "
-+ "machtype %lu\n", mips_machtype);
- return;
- }
-
- mips_machine_set_name(mach->mach_name);
-- printk(KERN_INFO "MIPS: machine is %s\n", mips_machine_name);
-+ printk(KERN_NOTICE "MIPS: machine is %s\n", mips_machine_name);
-
- if (mach->mach_setup)
- mach->mach_setup();
- }
-+
-+int __init mips_machtype_setup(char *id)
-+{
-+ if (mips_machid == NULL)
-+ mips_machid = id;
-+
-+ return 1;
-+}
-+
-+__setup("machtype=", mips_machtype_setup);
-+
-+static int __init mips_machtype_init(void)
-+{
-+ struct list_head *this;
-+ struct mips_machine *mach;
-+
-+ if (mips_machid == NULL)
-+ return 0;
-+
-+ list_for_each(this, &mips_machines) {
-+ mach = list_entry(this, struct mips_machine, list);
-+ if (mach->mach_id == NULL)
-+ continue;
-+
-+ if (strcmp(mach->mach_id, mips_machid) == 0) {
-+ mips_machtype = mach->mach_type;
-+ return 0;
-+ }
-+ }
-+
-+ printk(KERN_WARNING
-+ "MIPS: no machine found for id: '%s', registered machines:\n",
-+ mips_machid);
-+ printk(KERN_WARNING "%32s %s\n", "id", "name");
-+
-+ list_for_each(this, &mips_machines) {
-+ mach = list_entry(this, struct mips_machine, list);
-+ printk(KERN_WARNING "%32s %s\n",
-+ mach->mach_id ? mach->mach_id : "", mach->mach_name);
-+ }
-+
-+ return 0;
-+}
-+
-+core_initcall(mips_machtype_init);
---- a/arch/mips/include/asm/mips_machine.h
-+++ b/arch/mips/include/asm/mips_machine.h
-@@ -13,25 +13,33 @@
- #include <linux/init.h>
- #include <linux/list.h>
-
-+#include <asm/bootinfo.h>
-+
- struct mips_machine {
- unsigned long mach_type;
-- void (*mach_setup)(void);
-+ char *mach_id;
- char *mach_name;
-+ void (*mach_setup)(void);
- struct list_head list;
- };
-
- void mips_machine_register(struct mips_machine *) __init;
--void mips_machine_setup(unsigned long machtype) __init;
-+void mips_machine_setup(void) __init;
-+int mips_machtype_setup(char *id) __init;
- void mips_machine_set_name(char *name) __init;
-
- extern char *mips_machine_name;
-
--#define MIPS_MACHINE(_type, _name, _setup) \
--static char machine_name_##_type[] __initdata = _name; \
-+#define MIPS_MACHINE(_type, _id, _name, _setup) \
-+static const char machine_name_##_type[] __initconst \
-+ __aligned(1) = _name; \
-+static const char machine_id_##_type[] __initconst \
-+ __aligned(1) = _id; \
- static struct mips_machine machine_##_type __initdata = \
- { \
- .mach_type = _type, \
-- .mach_name = machine_name_##_type, \
-+ .mach_id = (char *) machine_id_##_type, \
-+ .mach_name = (char *) machine_name_##_type, \
- .mach_setup = _setup, \
- }; \
- \
-@@ -44,4 +52,3 @@ static int __init register_machine_##_ty
- pure_initcall(register_machine_##_type)
-
- #endif /* __ASM_MIPS_MACHINE_H */
--
+++ /dev/null
---- a/arch/mips/kernel/traps.c
-+++ b/arch/mips/kernel/traps.c
-@@ -51,6 +51,7 @@
- #include <asm/stacktrace.h>
- #include <asm/irq.h>
- #include <asm/uasm.h>
-+#include <asm/time.h>
-
- extern void check_wait(void);
- extern asmlinkage void r4k_wait(void);
-@@ -1501,6 +1502,8 @@
- if (cpu_has_mips_r2) {
- cp0_compare_irq_shift = CAUSEB_TI - CAUSEB_IP;
- cp0_compare_irq = (read_c0_intctl() >> INTCTLB_IPTI) & 7;
-+ if (get_c0_compare_irq)
-+ cp0_compare_irq = get_c0_compare_irq();
- cp0_perfcount_irq = (read_c0_intctl() >> INTCTLB_IPPCI) & 7;
- if (cp0_perfcount_irq == cp0_compare_irq)
- cp0_perfcount_irq = -1;
---- a/arch/mips/include/asm/time.h
-+++ b/arch/mips/include/asm/time.h
-@@ -52,6 +52,7 @@ extern int (*perf_irq)(void);
- */
- #ifdef CONFIG_CEVT_R4K_LIB
- extern unsigned int __weak get_c0_compare_int(void);
-+extern unsigned int __weak get_c0_compare_irq(void);
- extern int r4k_clockevent_init(void);
- #endif
-
+++ /dev/null
---- a/arch/mips/kernel/cevt-r4k.c
-+++ b/arch/mips/kernel/cevt-r4k.c
-@@ -16,6 +16,22 @@
- #include <asm/cevt-r4k.h>
-
- /*
-+ * Compare interrupt can be routed and latched outside the core,
-+ * so a single execution hazard barrier may not be enough to give
-+ * it time to clear as seen in the Cause register. 4 time the
-+ * pipeline depth seems reasonably conservative, and empirically
-+ * works better in configurations with high CPU/bus clock ratios.
-+ */
-+
-+#define compare_change_hazard() \
-+ do { \
-+ irq_disable_hazard(); \
-+ irq_disable_hazard(); \
-+ irq_disable_hazard(); \
-+ irq_disable_hazard(); \
-+ } while (0)
-+
-+/*
- * The SMTC Kernel for the 34K, 1004K, et. al. replaces several
- * of these routines with SMTC-specific variants.
- */
-@@ -31,6 +47,7 @@ static int mips_next_event(unsigned long
- cnt = read_c0_count();
- cnt += delta;
- write_c0_compare(cnt);
-+ compare_change_hazard();
- res = ((int)(read_c0_count() - cnt) > 0) ? -ETIME : 0;
- return res;
- }
-@@ -100,22 +117,6 @@ static int c0_compare_int_pending(void)
- return (read_c0_cause() >> cp0_compare_irq_shift) & (1ul << CAUSEB_IP);
- }
-
--/*
-- * Compare interrupt can be routed and latched outside the core,
-- * so a single execution hazard barrier may not be enough to give
-- * it time to clear as seen in the Cause register. 4 time the
-- * pipeline depth seems reasonably conservative, and empirically
-- * works better in configurations with high CPU/bus clock ratios.
-- */
--
--#define compare_change_hazard() \
-- do { \
-- irq_disable_hazard(); \
-- irq_disable_hazard(); \
-- irq_disable_hazard(); \
-- irq_disable_hazard(); \
-- } while (0)
--
- int c0_compare_int_usable(void)
- {
- unsigned int delta;
+++ /dev/null
-CONFIG_32BIT=y
-# CONFIG_64BIT is not set
-CONFIG_ADM6996_PHY=y
-# CONFIG_ALCHEMY_GPIO_INDIRECT is not set
-CONFIG_AR231X_ETHERNET=y
-# CONFIG_AR7 is not set
-CONFIG_AR8216_PHY=y
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-CONFIG_ARCH_POPULATES_NODE_MAP=y
-# CONFIG_ARCH_SUPPORTS_MSI is not set
-CONFIG_ARCH_SUPPORTS_OPROFILE=y
-CONFIG_ARCH_SUSPEND_POSSIBLE=y
-CONFIG_ATHEROS_AR2315=y
-CONFIG_ATHEROS_AR2315_PCI=y
-CONFIG_ATHEROS_AR231X=y
-CONFIG_ATHEROS_AR5312=y
-CONFIG_ATHEROS_WDT=y
-# CONFIG_BCM47XX is not set
-# CONFIG_BCM63XX is not set
-CONFIG_BITREVERSE=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_BUG is not set
-# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
-# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_CEVT_R4K=y
-CONFIG_CEVT_R4K_LIB=y
-CONFIG_CMDLINE="console=ttyS0,9600 rootfstype=squashfs,jffs2"
-CONFIG_CMDLINE_BOOL=y
-# CONFIG_CMDLINE_OVERRIDE is not set
-CONFIG_CPU_BIG_ENDIAN=y
-# CONFIG_CPU_CAVIUM_OCTEON is not set
-CONFIG_CPU_HAS_PREFETCH=y
-CONFIG_CPU_HAS_SYNC=y
-# CONFIG_CPU_LITTLE_ENDIAN is not set
-# CONFIG_CPU_LOONGSON2E is not set
-# CONFIG_CPU_LOONGSON2F is not set
-CONFIG_CPU_MIPS32=y
-CONFIG_CPU_MIPS32_R1=y
-# CONFIG_CPU_MIPS32_R2 is not set
-# CONFIG_CPU_MIPS64_R1 is not set
-# CONFIG_CPU_MIPS64_R2 is not set
-CONFIG_CPU_MIPSR1=y
-# CONFIG_CPU_NEVADA is not set
-# CONFIG_CPU_R10000 is not set
-# CONFIG_CPU_R3000 is not set
-# CONFIG_CPU_R4300 is not set
-# CONFIG_CPU_R4X00 is not set
-# CONFIG_CPU_R5000 is not set
-# CONFIG_CPU_R5432 is not set
-# CONFIG_CPU_R5500 is not set
-# CONFIG_CPU_R6000 is not set
-# CONFIG_CPU_R8000 is not set
-# CONFIG_CPU_RM7000 is not set
-# CONFIG_CPU_RM9000 is not set
-# CONFIG_CPU_SB1 is not set
-CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
-CONFIG_CPU_SUPPORTS_HIGHMEM=y
-# CONFIG_CPU_TX39XX is not set
-# CONFIG_CPU_TX49XX is not set
-# CONFIG_CPU_VR41XX is not set
-CONFIG_CSRC_R4K=y
-CONFIG_CSRC_R4K_LIB=y
-CONFIG_DECOMPRESS_LZMA=y
-# CONFIG_DEFAULT_SECURITY_SELINUX is not set
-# CONFIG_DEFAULT_SECURITY_SMACK is not set
-# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
-CONFIG_DEVPORT=y
-# CONFIG_DM9000 is not set
-CONFIG_DMA_NEED_PCI_MAP_STATE=y
-CONFIG_DMA_NONCOHERENT=y
-CONFIG_EARLY_PRINTK=y
-# CONFIG_FSNOTIFY is not set
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-CONFIG_GENERIC_CMOS_UPDATE=y
-CONFIG_GENERIC_FIND_LAST_BIT=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_GPIO=y
-CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-CONFIG_GPIO_DEVICE=y
-CONFIG_HARDWARE_WATCHPOINTS=y
-CONFIG_HAS_DMA=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAVE_ARCH_KGDB=y
-CONFIG_HAVE_DYNAMIC_FTRACE=y
-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
-CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
-CONFIG_HAVE_GENERIC_DMA_COHERENT=y
-CONFIG_HAVE_IDE=y
-CONFIG_HAVE_OPROFILE=y
-CONFIG_HW_HAS_PCI=y
-CONFIG_HW_RANDOM=y
-CONFIG_IMAGE_CMDLINE_HACK=y
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_INLINE_READ_LOCK is not set
-# CONFIG_INLINE_READ_LOCK_BH is not set
-# CONFIG_INLINE_READ_LOCK_IRQ is not set
-# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_READ_TRYLOCK is not set
-CONFIG_INLINE_READ_UNLOCK=y
-# CONFIG_INLINE_READ_UNLOCK_BH is not set
-CONFIG_INLINE_READ_UNLOCK_IRQ=y
-# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_SPIN_LOCK is not set
-# CONFIG_INLINE_SPIN_LOCK_BH is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_SPIN_TRYLOCK is not set
-# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK=y
-# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
-# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_WRITE_LOCK is not set
-# CONFIG_INLINE_WRITE_LOCK_BH is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_WRITE_TRYLOCK is not set
-CONFIG_INLINE_WRITE_UNLOCK=y
-# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
-CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
-# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
-CONFIG_IP175C_PHY=y
-CONFIG_IRQ_CPU=y
-# CONFIG_LEDS_GPIO is not set
-CONFIG_LOONGSON_UART_BASE=y
-# CONFIG_MACH_ALCHEMY is not set
-# CONFIG_MACH_DECSTATION is not set
-# CONFIG_MACH_JAZZ is not set
-# CONFIG_MACH_LOONGSON is not set
-# CONFIG_MACH_TX39XX is not set
-# CONFIG_MACH_TX49XX is not set
-# CONFIG_MACH_VR41XX is not set
-# CONFIG_MIKROTIK_RB532 is not set
-CONFIG_MIPS=y
-# CONFIG_MIPS_COBALT is not set
-CONFIG_MIPS_L1_CACHE_SHIFT=5
-# CONFIG_MIPS_MACHINE is not set
-# CONFIG_MIPS_MALTA is not set
-CONFIG_MIPS_MT_DISABLED=y
-# CONFIG_MIPS_MT_SMP is not set
-# CONFIG_MIPS_MT_SMTC is not set
-# CONFIG_MIPS_SIM is not set
-CONFIG_MTD_AR2315=y
-CONFIG_MTD_CFI_ADV_OPTIONS=y
-# CONFIG_MTD_CFI_GEOMETRY is not set
-# CONFIG_MTD_CFI_INTELEXT is not set
-CONFIG_MTD_MYLOADER_PARTS=y
-CONFIG_MTD_PHYSMAP=y
-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-3
-CONFIG_MTD_REDBOOT_PARTS=y
-# CONFIG_MUTEX_SPIN_ON_OWNER is not set
-CONFIG_MVSWITCH_PHY=y
-# CONFIG_NET_PCI is not set
-# CONFIG_NO_IOPORT is not set
-# CONFIG_NXP_STB220 is not set
-# CONFIG_NXP_STB225 is not set
-CONFIG_PAGEFLAGS_EXTENDED=y
-CONFIG_PCI=y
-CONFIG_PCI_DISABLE_COMMON_QUIRKS=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PHYLIB=y
-# CONFIG_PMC_MSP is not set
-# CONFIG_PMC_YOSEMITE is not set
-# CONFIG_PNX8550_JBS is not set
-# CONFIG_PNX8550_STB810 is not set
-# CONFIG_POWERTV is not set
-CONFIG_SCHED_OMIT_FRAME_POINTER=y
-# CONFIG_SCSI_DMA is not set
-# CONFIG_SERIAL_8250_EXTENDED is not set
-CONFIG_SERIAL_8250_NR_UARTS=1
-CONFIG_SERIAL_8250_RUNTIME_UARTS=1
-# CONFIG_SGI_IP22 is not set
-# CONFIG_SGI_IP27 is not set
-# CONFIG_SGI_IP28 is not set
-# CONFIG_SGI_IP32 is not set
-# CONFIG_SIBYTE_BIGSUR is not set
-# CONFIG_SIBYTE_CARMEL is not set
-# CONFIG_SIBYTE_CRHINE is not set
-# CONFIG_SIBYTE_CRHONE is not set
-# CONFIG_SIBYTE_LITTLESUR is not set
-# CONFIG_SIBYTE_RHONE is not set
-# CONFIG_SIBYTE_SENTOSA is not set
-# CONFIG_SIBYTE_SWARM is not set
-# CONFIG_SWAP is not set
-CONFIG_SWCONFIG=y
-CONFIG_SYS_HAS_CPU_MIPS32_R1=y
-CONFIG_SYS_HAS_EARLY_PRINTK=y
-CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
-CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
-CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
-CONFIG_TRAD_SIGNALS=y
-# CONFIG_TREE_PREEMPT_RCU is not set
-CONFIG_USB_SUPPORT=y
-CONFIG_ZONE_DMA_FLAG=0
+++ /dev/null
-Fix the usage of get_c0_compare_int: override cp0_compare_irq if the returned
-value is in the MIPS CPU IRQ range to ensure that c0_compare_int_usable()
-still works.
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-
---- a/arch/mips/kernel/cevt-r4k.c
-+++ b/arch/mips/kernel/cevt-r4k.c
-@@ -168,20 +168,23 @@ int __cpuinit r4k_clockevent_init(void)
- struct clock_event_device *cd;
- unsigned int irq;
-
-- if (!cpu_has_counter || !mips_hpt_frequency)
-- return -ENXIO;
--
-- if (!c0_compare_int_usable())
-- return -ENXIO;
--
- /*
- * With vectored interrupts things are getting platform specific.
- * get_c0_compare_int is a hook to allow a platform to return the
- * interrupt number of it's liking.
- */
- irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
-- if (get_c0_compare_int)
-+ if (get_c0_compare_int) {
- irq = get_c0_compare_int();
-+ if ((irq >= MIPS_CPU_IRQ_BASE) && (irq < MIPS_CPU_IRQ_BASE + 8))
-+ cp0_compare_irq = irq - MIPS_CPU_IRQ_BASE;
-+ }
-+
-+ if (!cpu_has_counter || !mips_hpt_frequency)
-+ return -ENXIO;
-+
-+ if (!c0_compare_int_usable())
-+ return -ENXIO;
-
- cd = &per_cpu(mips_clockevent_device, cpu);
-
+++ /dev/null
---- a/arch/mips/kernel/cevt-r4k.c
-+++ b/arch/mips/kernel/cevt-r4k.c
-@@ -16,6 +16,22 @@
- #include <asm/cevt-r4k.h>
-
- /*
-+ * Compare interrupt can be routed and latched outside the core,
-+ * so a single execution hazard barrier may not be enough to give
-+ * it time to clear as seen in the Cause register. 4 time the
-+ * pipeline depth seems reasonably conservative, and empirically
-+ * works better in configurations with high CPU/bus clock ratios.
-+ */
-+
-+#define compare_change_hazard() \
-+ do { \
-+ irq_disable_hazard(); \
-+ irq_disable_hazard(); \
-+ irq_disable_hazard(); \
-+ irq_disable_hazard(); \
-+ } while (0)
-+
-+/*
- * The SMTC Kernel for the 34K, 1004K, et. al. replaces several
- * of these routines with SMTC-specific variants.
- */
-@@ -31,6 +47,7 @@ static int mips_next_event(unsigned long
- cnt = read_c0_count();
- cnt += delta;
- write_c0_compare(cnt);
-+ compare_change_hazard();
- res = ((int)(read_c0_count() - cnt) > 0) ? -ETIME : 0;
- return res;
- }
-@@ -100,22 +117,6 @@ static int c0_compare_int_pending(void)
- return (read_c0_cause() >> cp0_compare_irq_shift) & (1ul << CAUSEB_IP);
- }
-
--/*
-- * Compare interrupt can be routed and latched outside the core,
-- * so a single execution hazard barrier may not be enough to give
-- * it time to clear as seen in the Cause register. 4 time the
-- * pipeline depth seems reasonably conservative, and empirically
-- * works better in configurations with high CPU/bus clock ratios.
-- */
--
--#define compare_change_hazard() \
-- do { \
-- irq_disable_hazard(); \
-- irq_disable_hazard(); \
-- irq_disable_hazard(); \
-- irq_disable_hazard(); \
-- } while (0)
--
- int c0_compare_int_usable(void)
- {
- unsigned int delta;
+++ /dev/null
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -84,6 +84,19 @@ config BCM63XX
- help
- Support for BCM63XX based boards
-
-+config ATHEROS_AR231X
-+ bool "Atheros 231x/531x SoC support"
-+ select CEVT_R4K
-+ select CSRC_R4K
-+ select DMA_NONCOHERENT
-+ select IRQ_CPU
-+ select SYS_HAS_CPU_MIPS32_R1
-+ select SYS_SUPPORTS_BIG_ENDIAN
-+ select SYS_SUPPORTS_32BIT_KERNEL
-+ select GENERIC_GPIO
-+ help
-+ Support for AR231x and AR531x based boards
-+
- config MIPS_COBALT
- bool "Cobalt Server"
- select CEVT_R4K
-@@ -681,6 +694,7 @@ config CAVIUM_OCTEON_REFERENCE_BOARD
-
- endchoice
-
-+source "arch/mips/ar231x/Kconfig"
- source "arch/mips/alchemy/Kconfig"
- source "arch/mips/bcm63xx/Kconfig"
- source "arch/mips/jazz/Kconfig"
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -310,6 +310,13 @@ cflags-$(CONFIG_SOC_AU1X00) += -I$(srctr
-
-
- #
-+# Atheros AR5312/AR2312 WiSoC
-+#
-+core-$(CONFIG_ATHEROS_AR231X) += arch/mips/ar231x/
-+cflags-$(CONFIG_ATHEROS_AR231X) += -I$(srctree)/arch/mips/include/asm/mach-ar231x
-+load-$(CONFIG_ATHEROS_AR231X) += 0xffffffff80041000
-+
-+#
- # Cobalt Server
- #
- core-$(CONFIG_MIPS_COBALT) += arch/mips/cobalt/
---- /dev/null
-+++ b/arch/mips/ar231x/Kconfig
-@@ -0,0 +1,17 @@
-+config ATHEROS_AR5312
-+ bool "Atheros 5312/2312+ support"
-+ depends on ATHEROS_AR231X
-+ default y
-+
-+config ATHEROS_AR2315
-+ bool "Atheros 2315+ support"
-+ depends on ATHEROS_AR231X
-+ select DMA_NONCOHERENT
-+ select CEVT_R4K
-+ select CSRC_R4K
-+ select IRQ_CPU
-+ select SYS_HAS_CPU_MIPS32_R1
-+ select SYS_SUPPORTS_32BIT_KERNEL
-+ select SYS_SUPPORTS_BIG_ENDIAN
-+ select GENERIC_GPIO
-+ default y
---- /dev/null
-+++ b/arch/mips/ar231x/Makefile
-@@ -0,0 +1,13 @@
-+#
-+# This file is subject to the terms and conditions of the GNU General Public
-+# License. See the file "COPYING" in the main directory of this archive
-+# for more details.
-+#
-+# Copyright (C) 2006 FON Technology, SL.
-+# Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
-+# Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org>
-+#
-+
-+obj-y += board.o prom.o devices.o
-+obj-$(CONFIG_ATHEROS_AR5312) += ar5312.o
-+obj-$(CONFIG_ATHEROS_AR2315) += ar2315.o
---- /dev/null
-+++ b/arch/mips/ar231x/board.c
-@@ -0,0 +1,251 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2003 Atheros Communications, Inc., All Rights Reserved.
-+ * Copyright (C) 2006 FON Technology, SL.
-+ * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org>
-+ */
-+
-+#include <generated/autoconf.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/string.h>
-+#include <linux/platform_device.h>
-+#include <linux/kernel.h>
-+#include <linux/random.h>
-+#include <linux/etherdevice.h>
-+#include <asm/irq_cpu.h>
-+#include <asm/reboot.h>
-+#include <asm/io.h>
-+
-+#include <ar231x_platform.h>
-+#include "devices.h"
-+#include "ar5312.h"
-+#include "ar2315.h"
-+
-+void (*ar231x_irq_dispatch)(void);
-+
-+static inline bool
-+check_radio_magic(u8 *addr)
-+{
-+ addr += 0x7a; /* offset for flash magic */
-+ if ((addr[0] == 0x5a) && (addr[1] == 0xa5)) {
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+static inline bool
-+check_board_data(u8 *flash_limit, u8 *addr, bool broken)
-+{
-+ /* config magic found */
-+ if (*((u32 *)addr) == AR531X_BD_MAGIC)
-+ return 1;
-+
-+ if (!broken)
-+ return 0;
-+
-+ if (check_radio_magic(addr + 0xf8))
-+ ar231x_board.radio = addr + 0xf8;
-+ if ((addr < flash_limit + 0x10000) &&
-+ check_radio_magic(addr + 0x10000))
-+ ar231x_board.radio = addr + 0x10000;
-+
-+ if (ar231x_board.radio) {
-+ /* broken board data detected, use radio data to find the offset,
-+ * user will fix this */
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+static u8 *
-+find_board_config(u8 *flash_limit, bool broken)
-+{
-+ u8 *addr;
-+ int found = 0;
-+
-+ for (addr = flash_limit - 0x1000;
-+ addr >= flash_limit - 0x30000;
-+ addr -= 0x1000) {
-+
-+ if (check_board_data(flash_limit, addr, broken)) {
-+ found = 1;
-+ break;
-+ }
-+ }
-+
-+ if (!found)
-+ addr = NULL;
-+
-+ return addr;
-+}
-+
-+static u8 *
-+find_radio_config(u8 *flash_limit, u8 *board_config)
-+{
-+ int found;
-+ u8 *radio_config;
-+
-+ /*
-+ * Now find the start of Radio Configuration data, using heuristics:
-+ * Search forward from Board Configuration data by 0x1000 bytes
-+ * at a time until we find non-0xffffffff.
-+ */
-+ found = 0;
-+ for (radio_config = board_config + 0x1000;
-+ (radio_config < flash_limit);
-+ radio_config += 0x1000) {
-+ if ((*(u32 *)radio_config != 0xffffffff) &&
-+ check_radio_magic(radio_config)) {
-+ found = 1;
-+ break;
-+ }
-+ }
-+
-+ /* AR2316 relocates radio config to new location */
-+ if (!found) {
-+ for (radio_config = board_config + 0xf8;
-+ (radio_config < flash_limit - 0x1000 + 0xf8);
-+ radio_config += 0x1000) {
-+ if ((*(u32 *)radio_config != 0xffffffff) &&
-+ check_radio_magic(radio_config)) {
-+ found = 1;
-+ break;
-+ }
-+ }
-+ }
-+
-+ if (!found) {
-+ printk("Could not find Radio Configuration data\n");
-+ radio_config = 0;
-+ }
-+
-+ return (u8 *) radio_config;
-+}
-+
-+int __init
-+ar231x_find_config(u8 *flash_limit)
-+{
-+ struct ar231x_boarddata *config;
-+ unsigned int rcfg_size;
-+ int broken_boarddata = 0;
-+ u8 *bcfg, *rcfg;
-+ u8 *board_data;
-+ u8 *radio_data;
-+ u32 offset;
-+
-+ ar231x_board.config = NULL;
-+ ar231x_board.radio = NULL;
-+ /* Copy the board and radio data to RAM, because accessing the mapped
-+ * memory of the flash directly after booting is not safe */
-+
-+ /* Try to find valid board and radio data */
-+ bcfg = find_board_config(flash_limit, false);
-+
-+ /* If that fails, try to at least find valid radio data */
-+ if (!bcfg) {
-+ bcfg = find_board_config(flash_limit, true);
-+ broken_boarddata = 1;
-+ }
-+
-+ if (!bcfg) {
-+ printk(KERN_WARNING "WARNING: No board configuration data found!\n");
-+ return -ENODEV;
-+ }
-+
-+ board_data = kzalloc(BOARD_CONFIG_BUFSZ, GFP_KERNEL);
-+ ar231x_board.config = (struct ar231x_boarddata *) board_data;
-+ memcpy(board_data, bcfg, 0x100);
-+ if (broken_boarddata) {
-+ printk(KERN_WARNING "WARNING: broken board data detected\n");
-+ config = ar231x_board.config;
-+ if (!memcmp(config->enet0_mac, "\x00\x00\x00\x00\x00\x00", 6)) {
-+ printk(KERN_INFO "Fixing up empty mac addresses\n");
-+ config->resetConfigGpio = 0xffff;
-+ config->sysLedGpio = 0xffff;
-+ random_ether_addr(config->wlan0_mac);
-+ config->wlan0_mac[0] &= ~0x06;
-+ random_ether_addr(config->enet0_mac);
-+ random_ether_addr(config->enet1_mac);
-+ }
-+ }
-+
-+
-+ /* Radio config starts 0x100 bytes after board config, regardless
-+ * of what the physical layout on the flash chip looks like */
-+
-+ if (ar231x_board.radio)
-+ rcfg = (u8 *) ar231x_board.radio;
-+ else
-+ rcfg = find_radio_config(flash_limit, bcfg);
-+
-+ if (!rcfg)
-+ return -ENODEV;
-+
-+ radio_data = board_data + 0x100 + ((rcfg - bcfg) & 0xfff);
-+ ar231x_board.radio = radio_data;
-+ offset = radio_data - board_data;
-+ printk(KERN_INFO "Radio config found at offset 0x%x(0x%x)\n", rcfg - bcfg, offset);
-+ rcfg_size = BOARD_CONFIG_BUFSZ - offset;
-+ memcpy(radio_data, rcfg, rcfg_size);
-+
-+ return 0;
-+}
-+
-+static void
-+ar231x_halt(void)
-+{
-+ local_irq_disable();
-+ while (1);
-+}
-+
-+void __init
-+plat_mem_setup(void)
-+{
-+ _machine_halt = ar231x_halt;
-+ pm_power_off = ar231x_halt;
-+
-+ ar5312_plat_setup();
-+ ar2315_plat_setup();
-+
-+ /* Disable data watchpoints */
-+ write_c0_watchlo0(0);
-+}
-+
-+
-+asmlinkage void
-+plat_irq_dispatch(void)
-+{
-+ ar231x_irq_dispatch();
-+}
-+
-+void __init
-+plat_time_init(void)
-+{
-+ ar5312_time_init();
-+ ar2315_time_init();
-+}
-+
-+unsigned int __cpuinit
-+get_c0_compare_int(void)
-+{
-+ return CP0_LEGACY_COMPARE_IRQ;
-+}
-+
-+void __init
-+arch_init_irq(void)
-+{
-+ clear_c0_status(ST0_IM);
-+ mips_cpu_irq_init();
-+
-+ /* Initialize interrupt controllers */
-+ ar5312_irq_init();
-+ ar2315_irq_init();
-+}
-+
-+
---- /dev/null
-+++ b/arch/mips/ar231x/prom.c
-@@ -0,0 +1,37 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright MontaVista Software Inc
-+ * Copyright (C) 2003 Atheros Communications, Inc., All Rights Reserved.
-+ * Copyright (C) 2006 FON Technology, SL.
-+ * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
-+ */
-+
-+/*
-+ * Prom setup file for ar531x
-+ */
-+
-+#include <linux/init.h>
-+#include <generated/autoconf.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/bootmem.h>
-+
-+#include <asm/bootinfo.h>
-+#include <asm/addrspace.h>
-+#include "ar5312.h"
-+#include "ar2315.h"
-+
-+void __init prom_init(void)
-+{
-+ ar5312_prom_init();
-+ ar2315_prom_init();
-+}
-+
-+void __init prom_free_prom_memory(void)
-+{
-+}
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ar231x/ar231x_platform.h
-@@ -0,0 +1,83 @@
-+#ifndef __AR531X_PLATFORM_H
-+#define __AR531X_PLATFORM_H
-+
-+/*
-+ * This is board-specific data that is stored in a "fixed" location in flash.
-+ * It is shared across operating systems, so it should not be changed lightly.
-+ * The main reason we need it is in order to extract the ethernet MAC
-+ * address(es).
-+ */
-+struct ar231x_boarddata {
-+ u32 magic; /* board data is valid */
-+#define AR531X_BD_MAGIC 0x35333131 /* "5311", for all 531x platforms */
-+ u16 cksum; /* checksum (starting with BD_REV 2) */
-+ u16 rev; /* revision of this struct */
-+#define BD_REV 4
-+ char boardName[64]; /* Name of board */
-+ u16 major; /* Board major number */
-+ u16 minor; /* Board minor number */
-+ u32 flags; /* Board configuration */
-+#define BD_ENET0 0x00000001 /* ENET0 is stuffed */
-+#define BD_ENET1 0x00000002 /* ENET1 is stuffed */
-+#define BD_UART1 0x00000004 /* UART1 is stuffed */
-+#define BD_UART0 0x00000008 /* UART0 is stuffed (dma) */
-+#define BD_RSTFACTORY 0x00000010 /* Reset factory defaults stuffed */
-+#define BD_SYSLED 0x00000020 /* System LED stuffed */
-+#define BD_EXTUARTCLK 0x00000040 /* External UART clock */
-+#define BD_CPUFREQ 0x00000080 /* cpu freq is valid in nvram */
-+#define BD_SYSFREQ 0x00000100 /* sys freq is set in nvram */
-+#define BD_WLAN0 0x00000200 /* Enable WLAN0 */
-+#define BD_MEMCAP 0x00000400 /* CAP SDRAM @ memCap for testing */
-+#define BD_DISWATCHDOG 0x00000800 /* disable system watchdog */
-+#define BD_WLAN1 0x00001000 /* Enable WLAN1 (ar5212) */
-+#define BD_ISCASPER 0x00002000 /* FLAG for AR2312 */
-+#define BD_WLAN0_2G_EN 0x00004000 /* FLAG for radio0_2G */
-+#define BD_WLAN0_5G_EN 0x00008000 /* FLAG for radio0_2G */
-+#define BD_WLAN1_2G_EN 0x00020000 /* FLAG for radio0_2G */
-+#define BD_WLAN1_5G_EN 0x00040000 /* FLAG for radio0_2G */
-+ u16 resetConfigGpio; /* Reset factory GPIO pin */
-+ u16 sysLedGpio; /* System LED GPIO pin */
-+
-+ u32 cpuFreq; /* CPU core frequency in Hz */
-+ u32 sysFreq; /* System frequency in Hz */
-+ u32 cntFreq; /* Calculated C0_COUNT frequency */
-+
-+ u8 wlan0_mac[6];
-+ u8 enet0_mac[6];
-+ u8 enet1_mac[6];
-+
-+ u16 pciId; /* Pseudo PCIID for common code */
-+ u16 memCap; /* cap bank1 in MB */
-+
-+ /* version 3 */
-+ u8 wlan1_mac[6]; /* (ar5212) */
-+};
-+
-+#define BOARD_CONFIG_BUFSZ 0x1000
-+
-+/*
-+ * Platform device information for the Wireless MAC
-+ */
-+struct ar231x_board_config {
-+ u16 devid;
-+
-+ /* board config data */
-+ struct ar231x_boarddata *config;
-+
-+ /* radio calibration data */
-+ const char *radio;
-+};
-+
-+/*
-+ * Platform device information for the Ethernet MAC
-+ */
-+struct ar231x_eth {
-+ u32 reset_base;
-+ u32 reset_mac;
-+ u32 reset_phy;
-+ u32 phy_base;
-+ struct ar231x_board_config *config;
-+ char *macaddr;
-+};
-+
-+#endif /* __AR531X_PLATFORM_H */
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ar231x/cpu-feature-overrides.h
-@@ -0,0 +1,84 @@
-+/*
-+ * Atheros SoC specific CPU feature overrides
-+ *
-+ * Copyright (C) 2008 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ * This file was derived from: include/asm-mips/cpu-features.h
-+ * Copyright (C) 2003, 2004 Ralf Baechle
-+ * Copyright (C) 2004 Maciej W. Rozycki
-+ *
-+ * This program is free software; you can 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_MACH_ATHEROS_CPU_FEATURE_OVERRIDES_H
-+#define __ASM_MACH_ATHEROS_CPU_FEATURE_OVERRIDES_H
-+
-+/*
-+ * The ATHEROS SoCs have MIPS 4Kc/4KEc core.
-+ */
-+#define cpu_has_tlb 1
-+#define cpu_has_4kex 1
-+#define cpu_has_3k_cache 0
-+#define cpu_has_4k_cache 1
-+#define cpu_has_tx39_cache 0
-+#define cpu_has_sb1_cache 0
-+#define cpu_has_fpu 0
-+#define cpu_has_32fpr 0
-+#define cpu_has_counter 1
-+/* #define cpu_has_watch ? */
-+/* #define cpu_has_divec ? */
-+/* #define cpu_has_vce ? */
-+/* #define cpu_has_cache_cdex_p ? */
-+/* #define cpu_has_cache_cdex_s ? */
-+/* #define cpu_has_prefetch ? */
-+/* #define cpu_has_mcheck ? */
-+#define cpu_has_ejtag 1
-+
-+#if !defined(CONFIG_ATHEROS_AR5312)
-+# define cpu_has_llsc 1
-+#else
-+/*
-+ * The MIPS 4Kc V0.9 core in the AR5312/AR2312 have problems with the
-+ * ll/sc instructions.
-+ */
-+# define cpu_has_llsc 0
-+#endif
-+
-+#define cpu_has_mips16 0
-+#define cpu_has_mdmx 0
-+#define cpu_has_mips3d 0
-+#define cpu_has_smartmips 0
-+
-+/* #define cpu_has_vtag_icache ? */
-+/* #define cpu_has_dc_aliases ? */
-+/* #define cpu_has_ic_fills_f_dc ? */
-+/* #define cpu_has_pindexed_dcache ? */
-+
-+/* #define cpu_icache_snoops_remote_store ? */
-+
-+#define cpu_has_mips32r1 1
-+
-+#if !defined(CONFIG_ATHEROS_AR5312)
-+# define cpu_has_mips32r2 1
-+#endif
-+
-+#define cpu_has_mips64r1 0
-+#define cpu_has_mips64r2 0
-+
-+#define cpu_has_dsp 0
-+#define cpu_has_mipsmt 0
-+
-+/* #define cpu_has_nofpuex ? */
-+#define cpu_has_64bits 0
-+#define cpu_has_64bit_zero_reg 0
-+#define cpu_has_64bit_gp_regs 0
-+#define cpu_has_64bit_addresses 0
-+
-+/* #define cpu_has_inclusive_pcaches ? */
-+
-+/* #define cpu_dcache_line_size() ? */
-+/* #define cpu_icache_line_size() ? */
-+
-+#endif /* __ASM_MACH_ATHEROS_CPU_FEATURE_OVERRIDES_H */
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ar231x/dma-coherence.h
-@@ -0,0 +1,64 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2006 Ralf Baechle <ralf@linux-mips.org>
-+ * Copyright (C) 2007 Felix Fietkau <nbd@openwrt.org>
-+ *
-+ */
-+#ifndef __ASM_MACH_GENERIC_DMA_COHERENCE_H
-+#define __ASM_MACH_GENERIC_DMA_COHERENCE_H
-+
-+#define PCI_DMA_OFFSET 0x20000000
-+
-+struct device;
-+
-+static dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, size_t size)
-+{
-+ return virt_to_phys(addr) + (dev != NULL ? PCI_DMA_OFFSET : 0);
-+}
-+
-+static dma_addr_t plat_map_dma_mem_page(struct device *dev, struct page *page)
-+{
-+ return page_to_phys(page) + (dev != NULL ? PCI_DMA_OFFSET : 0);
-+}
-+
-+static inline unsigned long plat_dma_addr_to_phys(struct device *dev,
-+ dma_addr_t dma_addr)
-+{
-+ return (dma_addr > PCI_DMA_OFFSET ? dma_addr - PCI_DMA_OFFSET : dma_addr);
-+}
-+
-+static inline void plat_unmap_dma_mem(struct device *dev, dma_addr_t dma_addr,
-+ size_t size, enum dma_data_direction direction)
-+{
-+}
-+
-+static inline int plat_dma_supported(struct device *dev, u64 mask)
-+{
-+ return 1;
-+}
-+
-+static inline void plat_extra_sync_for_device(struct device *dev)
-+{
-+ return;
-+}
-+
-+static inline int plat_dma_mapping_error(struct device *dev,
-+ dma_addr_t dma_addr)
-+{
-+ return 0;
-+}
-+
-+static inline int plat_device_is_coherent(struct device *dev)
-+{
-+#ifdef CONFIG_DMA_COHERENT
-+ return 1;
-+#endif
-+#ifdef CONFIG_DMA_NONCOHERENT
-+ return 0;
-+#endif
-+}
-+
-+#endif /* __ASM_MACH_GENERIC_DMA_COHERENCE_H */
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ar231x/gpio.h
-@@ -0,0 +1,79 @@
-+#ifndef _ATHEROS_GPIO_H_
-+#define _ATHEROS_GPIO_H_
-+
-+#include <ar231x.h>
-+
-+struct ar231x_gpiodev {
-+ u32 valid_mask;
-+ u32 (*get_output)(void);
-+ u32 (*set_output)(u32 mask, u32 val);
-+ u32 (*get)(void);
-+ u32 (*set)(u32 mask, u32 val);
-+};
-+
-+extern const struct ar231x_gpiodev *ar231x_gpiodev;
-+
-+/*
-+ * Wrappers for the generic GPIO layer
-+ */
-+
-+static inline int gpio_direction_input(unsigned gpio) {
-+ u32 mask = 1 << gpio;
-+
-+ if (!(ar231x_gpiodev->valid_mask & mask))
-+ return -ENXIO;
-+
-+ ar231x_gpiodev->set_output(mask, 0);
-+ return 0;
-+}
-+
-+static inline void gpio_set_value(unsigned gpio, int value) {
-+ u32 mask = 1 << gpio;
-+
-+ if (!(ar231x_gpiodev->valid_mask & mask))
-+ return;
-+
-+ ar231x_gpiodev->set(mask, (!!value) * mask);
-+}
-+
-+static inline int gpio_direction_output(unsigned gpio, int value) {
-+ u32 mask = 1 << gpio;
-+
-+ if (!(ar231x_gpiodev->valid_mask & mask))
-+ return -ENXIO;
-+
-+ ar231x_gpiodev->set_output(mask, mask);
-+ ar231x_gpiodev->set(mask, (!!value) * mask);
-+ return 0;
-+}
-+
-+/* Reads the gpio pin. Unchecked function */
-+static inline int gpio_get_value(unsigned gpio) {
-+ u32 mask = 1 << gpio;
-+
-+ if (!(ar231x_gpiodev->valid_mask & mask))
-+ return 0;
-+
-+ return !!(ar231x_gpiodev->get() & mask);
-+}
-+
-+static inline int gpio_request(unsigned gpio, const char *label) {
-+ return 0;
-+}
-+
-+static inline void gpio_free(unsigned gpio) {
-+}
-+
-+/* Returns IRQ to attach for gpio. Unchecked function */
-+static inline int gpio_to_irq(unsigned gpio) {
-+ return AR531X_GPIO_IRQ(gpio);
-+}
-+
-+/* Returns gpio for IRQ attached. Unchecked function */
-+static inline int irq_to_gpio(unsigned irq) {
-+ return (irq - (AR531X_GPIO_IRQ(0)));
-+}
-+
-+#include <asm-generic/gpio.h> /* cansleep wrappers */
-+
-+#endif
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ar231x/reset.h
-@@ -0,0 +1,6 @@
-+#ifndef __AR531X_RESET_H
-+#define __AR531X_RESET_H
-+
-+void ar531x_disable_reset_button(void);
-+
-+#endif /* __AR531X_RESET_H */
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ar231x/war.h
-@@ -0,0 +1,25 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org>
-+ */
-+#ifndef __ASM_MIPS_MACH_ATHEROS_WAR_H
-+#define __ASM_MIPS_MACH_ATHEROS_WAR_H
-+
-+#define R4600_V1_INDEX_ICACHEOP_WAR 0
-+#define R4600_V1_HIT_CACHEOP_WAR 0
-+#define R4600_V2_HIT_CACHEOP_WAR 0
-+#define R5432_CP0_INTERRUPT_WAR 0
-+#define BCM1250_M3_WAR 0
-+#define SIBYTE_1956_WAR 0
-+#define MIPS4K_ICACHE_REFILL_WAR 0
-+#define MIPS_CACHE_SYNC_WAR 0
-+#define TX49XX_ICACHE_INDEX_INV_WAR 0
-+#define RM9000_CDEX_SMP_WAR 0
-+#define ICACHE_REFILLS_WORKAROUND_WAR 0
-+#define R10000_LLSC_WAR 0
-+#define MIPS34K_MISSED_ITLB_WAR 0
-+
-+#endif /* __ASM_MIPS_MACH_ATHEROS_WAR_H */
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ar231x/ar2315_regs.h
-@@ -0,0 +1,580 @@
-+/*
-+ * Register definitions for AR2315+
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2003 Atheros Communications, Inc., All Rights Reserved.
-+ * Copyright (C) 2006 FON Technology, SL.
-+ * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2006-2008 Felix Fietkau <nbd@openwrt.org>
-+ */
-+
-+#ifndef __AR2315_REG_H
-+#define __AR2315_REG_H
-+
-+/*
-+ * IRQs
-+ */
-+#define AR2315_IRQ_MISC_INTRS MIPS_CPU_IRQ_BASE+2 /* C0_CAUSE: 0x0400 */
-+#define AR2315_IRQ_WLAN0_INTRS MIPS_CPU_IRQ_BASE+3 /* C0_CAUSE: 0x0800 */
-+#define AR2315_IRQ_ENET0_INTRS MIPS_CPU_IRQ_BASE+4 /* C0_CAUSE: 0x1000 */
-+#define AR2315_IRQ_LCBUS_PCI MIPS_CPU_IRQ_BASE+5 /* C0_CAUSE: 0x2000 */
-+#define AR2315_IRQ_WLAN0_POLL MIPS_CPU_IRQ_BASE+6 /* C0_CAUSE: 0x4000 */
-+
-+/*
-+ * Address map
-+ */
-+#define AR2315_SPI_READ 0x08000000 /* SPI FLASH */
-+#define AR2315_WLAN0 0xB0000000 /* Wireless MMR */
-+#define AR2315_PCI 0xB0100000 /* PCI MMR */
-+#define AR2315_SDRAMCTL 0xB0300000 /* SDRAM MMR */
-+#define AR2315_LOCAL 0xB0400000 /* LOCAL BUS MMR */
-+#define AR2315_ENET0 0xB0500000 /* ETHERNET MMR */
-+#define AR2315_DSLBASE 0xB1000000 /* RESET CONTROL MMR */
-+#define AR2315_UART0 0xB1100003 /* UART MMR */
-+#define AR2315_SPI 0xB1300000 /* SPI FLASH MMR */
-+#define AR2315_PCIEXT 0x80000000 /* pci external */
-+
-+/*
-+ * Reset Register
-+ */
-+#define AR2315_COLD_RESET (AR2315_DSLBASE + 0x0000)
-+
-+#define AR2315_RESET_COLD_AHB 0x00000001
-+#define AR2315_RESET_COLD_APB 0x00000002
-+#define AR2315_RESET_COLD_CPU 0x00000004
-+#define AR2315_RESET_COLD_CPUWARM 0x00000008
-+#define AR2315_RESET_SYSTEM (RESET_COLD_CPU | RESET_COLD_APB | RESET_COLD_AHB) /* full system */
-+#define AR2317_RESET_SYSTEM 0x00000010
-+
-+
-+#define AR2315_RESET (AR2315_DSLBASE + 0x0004)
-+
-+#define AR2315_RESET_WARM_WLAN0_MAC 0x00000001 /* warm reset WLAN0 MAC */
-+#define AR2315_RESET_WARM_WLAN0_BB 0x00000002 /* warm reset WLAN0 BaseBand */
-+#define AR2315_RESET_MPEGTS_RSVD 0x00000004 /* warm reset MPEG-TS */
-+#define AR2315_RESET_PCIDMA 0x00000008 /* warm reset PCI ahb/dma */
-+#define AR2315_RESET_MEMCTL 0x00000010 /* warm reset memory controller */
-+#define AR2315_RESET_LOCAL 0x00000020 /* warm reset local bus */
-+#define AR2315_RESET_I2C_RSVD 0x00000040 /* warm reset I2C bus */
-+#define AR2315_RESET_SPI 0x00000080 /* warm reset SPI interface */
-+#define AR2315_RESET_UART0 0x00000100 /* warm reset UART0 */
-+#define AR2315_RESET_IR_RSVD 0x00000200 /* warm reset IR interface */
-+#define AR2315_RESET_EPHY0 0x00000400 /* cold reset ENET0 phy */
-+#define AR2315_RESET_ENET0 0x00000800 /* cold reset ENET0 mac */
-+
-+/*
-+ * AHB master arbitration control
-+ */
-+#define AR2315_AHB_ARB_CTL (AR2315_DSLBASE + 0x0008)
-+
-+#define AR2315_ARB_CPU 0x00000001 /* CPU, default */
-+#define AR2315_ARB_WLAN 0x00000002 /* WLAN */
-+#define AR2315_ARB_MPEGTS_RSVD 0x00000004 /* MPEG-TS */
-+#define AR2315_ARB_LOCAL 0x00000008 /* LOCAL */
-+#define AR2315_ARB_PCI 0x00000010 /* PCI */
-+#define AR2315_ARB_ETHERNET 0x00000020 /* Ethernet */
-+#define AR2315_ARB_RETRY 0x00000100 /* retry policy, debug only */
-+
-+/*
-+ * Config Register
-+ */
-+#define AR2315_ENDIAN_CTL (AR2315_DSLBASE + 0x000c)
-+
-+#define AR2315_CONFIG_AHB 0x00000001 /* EC - AHB bridge endianess */
-+#define AR2315_CONFIG_WLAN 0x00000002 /* WLAN byteswap */
-+#define AR2315_CONFIG_MPEGTS_RSVD 0x00000004 /* MPEG-TS byteswap */
-+#define AR2315_CONFIG_PCI 0x00000008 /* PCI byteswap */
-+#define AR2315_CONFIG_MEMCTL 0x00000010 /* Memory controller endianess */
-+#define AR2315_CONFIG_LOCAL 0x00000020 /* Local bus byteswap */
-+#define AR2315_CONFIG_ETHERNET 0x00000040 /* Ethernet byteswap */
-+
-+#define AR2315_CONFIG_MERGE 0x00000200 /* CPU write buffer merge */
-+#define AR2315_CONFIG_CPU 0x00000400 /* CPU big endian */
-+#define AR2315_CONFIG_PCIAHB 0x00000800
-+#define AR2315_CONFIG_PCIAHB_BRIDGE 0x00001000
-+#define AR2315_CONFIG_SPI 0x00008000 /* SPI byteswap */
-+#define AR2315_CONFIG_CPU_DRAM 0x00010000
-+#define AR2315_CONFIG_CPU_PCI 0x00020000
-+#define AR2315_CONFIG_CPU_MMR 0x00040000
-+#define AR2315_CONFIG_BIG 0x00000400
-+
-+
-+/*
-+ * NMI control
-+ */
-+#define AR2315_NMI_CTL (AR2315_DSLBASE + 0x0010)
-+
-+#define AR2315_NMI_EN 1
-+
-+/*
-+ * Revision Register - Initial value is 0x3010 (WMAC 3.0, AR531X 1.0).
-+ */
-+#define AR2315_SREV (AR2315_DSLBASE + 0x0014)
-+
-+#define AR2315_REV_MAJ 0x00f0
-+#define AR2315_REV_MAJ_S 4
-+#define AR2315_REV_MIN 0x000f
-+#define AR2315_REV_MIN_S 0
-+#define AR2315_REV_CHIP (AR2315_REV_MAJ|AR2315_REV_MIN)
-+
-+/*
-+ * Interface Enable
-+ */
-+#define AR2315_IF_CTL (AR2315_DSLBASE + 0x0018)
-+
-+#define AR2315_IF_MASK 0x00000007
-+#define AR2315_IF_DISABLED 0
-+#define AR2315_IF_PCI 1
-+#define AR2315_IF_TS_LOCAL 2
-+#define AR2315_IF_ALL 3 /* only for emulation with separate pins */
-+#define AR2315_IF_LOCAL_HOST 0x00000008
-+#define AR2315_IF_PCI_HOST 0x00000010
-+#define AR2315_IF_PCI_INTR 0x00000020
-+#define AR2315_IF_PCI_CLK_MASK 0x00030000
-+#define AR2315_IF_PCI_CLK_INPUT 0
-+#define AR2315_IF_PCI_CLK_OUTPUT_LOW 1
-+#define AR2315_IF_PCI_CLK_OUTPUT_CLK 2
-+#define AR2315_IF_PCI_CLK_OUTPUT_HIGH 3
-+#define AR2315_IF_PCI_CLK_SHIFT 16
-+
-+/*
-+ * APB Interrupt control
-+ */
-+
-+#define AR2315_ISR (AR2315_DSLBASE + 0x0020)
-+#define AR2315_IMR (AR2315_DSLBASE + 0x0024)
-+#define AR2315_GISR (AR2315_DSLBASE + 0x0028)
-+
-+#define AR2315_ISR_UART0 0x0001 /* high speed UART */
-+#define AR2315_ISR_I2C_RSVD 0x0002 /* I2C bus */
-+#define AR2315_ISR_SPI 0x0004 /* SPI bus */
-+#define AR2315_ISR_AHB 0x0008 /* AHB error */
-+#define AR2315_ISR_APB 0x0010 /* APB error */
-+#define AR2315_ISR_TIMER 0x0020 /* timer */
-+#define AR2315_ISR_GPIO 0x0040 /* GPIO */
-+#define AR2315_ISR_WD 0x0080 /* watchdog */
-+#define AR2315_ISR_IR_RSVD 0x0100 /* IR */
-+
-+#define AR2315_GISR_MISC 0x0001
-+#define AR2315_GISR_WLAN0 0x0002
-+#define AR2315_GISR_MPEGTS_RSVD 0x0004
-+#define AR2315_GISR_LOCALPCI 0x0008
-+#define AR2315_GISR_WMACPOLL 0x0010
-+#define AR2315_GISR_TIMER 0x0020
-+#define AR2315_GISR_ETHERNET 0x0040
-+
-+/*
-+ * Interrupt routing from IO to the processor IP bits
-+ * Define our inter mask and level
-+ */
-+#define AR2315_INTR_MISCIO SR_IBIT3
-+#define AR2315_INTR_WLAN0 SR_IBIT4
-+#define AR2315_INTR_ENET0 SR_IBIT5
-+#define AR2315_INTR_LOCALPCI SR_IBIT6
-+#define AR2315_INTR_WMACPOLL SR_IBIT7
-+#define AR2315_INTR_COMPARE SR_IBIT8
-+
-+/*
-+ * Timers
-+ */
-+#define AR2315_TIMER (AR2315_DSLBASE + 0x0030)
-+#define AR2315_RELOAD (AR2315_DSLBASE + 0x0034)
-+#define AR2315_WD (AR2315_DSLBASE + 0x0038)
-+#define AR2315_WDC (AR2315_DSLBASE + 0x003c)
-+
-+#define AR2315_WDC_IGNORE_EXPIRATION 0x00000000
-+#define AR2315_WDC_NMI 0x00000001 /* NMI on watchdog */
-+#define AR2315_WDC_RESET 0x00000002 /* reset on watchdog */
-+
-+/*
-+ * CPU Performance Counters
-+ */
-+#define AR2315_PERFCNT0 (AR2315_DSLBASE + 0x0048)
-+#define AR2315_PERFCNT1 (AR2315_DSLBASE + 0x004c)
-+
-+#define AR2315_PERF0_DATAHIT 0x0001 /* Count Data Cache Hits */
-+#define AR2315_PERF0_DATAMISS 0x0002 /* Count Data Cache Misses */
-+#define AR2315_PERF0_INSTHIT 0x0004 /* Count Instruction Cache Hits */
-+#define AR2315_PERF0_INSTMISS 0x0008 /* Count Instruction Cache Misses */
-+#define AR2315_PERF0_ACTIVE 0x0010 /* Count Active Processor Cycles */
-+#define AR2315_PERF0_WBHIT 0x0020 /* Count CPU Write Buffer Hits */
-+#define AR2315_PERF0_WBMISS 0x0040 /* Count CPU Write Buffer Misses */
-+
-+#define AR2315_PERF1_EB_ARDY 0x0001 /* Count EB_ARdy signal */
-+#define AR2315_PERF1_EB_AVALID 0x0002 /* Count EB_AValid signal */
-+#define AR2315_PERF1_EB_WDRDY 0x0004 /* Count EB_WDRdy signal */
-+#define AR2315_PERF1_EB_RDVAL 0x0008 /* Count EB_RdVal signal */
-+#define AR2315_PERF1_VRADDR 0x0010 /* Count valid read address cycles */
-+#define AR2315_PERF1_VWADDR 0x0020 /* Count valid write address cycles */
-+#define AR2315_PERF1_VWDATA 0x0040 /* Count valid write data cycles */
-+
-+/*
-+ * AHB Error Reporting.
-+ */
-+#define AR2315_AHB_ERR0 (AR2315_DSLBASE + 0x0050) /* error */
-+#define AR2315_AHB_ERR1 (AR2315_DSLBASE + 0x0054) /* haddr */
-+#define AR2315_AHB_ERR2 (AR2315_DSLBASE + 0x0058) /* hwdata */
-+#define AR2315_AHB_ERR3 (AR2315_DSLBASE + 0x005c) /* hrdata */
-+#define AR2315_AHB_ERR4 (AR2315_DSLBASE + 0x0060) /* status */
-+
-+#define AHB_ERROR_DET 1 /* AHB Error has been detected, */
-+ /* write 1 to clear all bits in ERR0 */
-+#define AHB_ERROR_OVR 2 /* AHB Error overflow has been detected */
-+#define AHB_ERROR_WDT 4 /* AHB Error due to wdt instead of hresp */
-+
-+#define AR2315_PROCERR_HMAST 0x0000000f
-+#define AR2315_PROCERR_HMAST_DFLT 0
-+#define AR2315_PROCERR_HMAST_WMAC 1
-+#define AR2315_PROCERR_HMAST_ENET 2
-+#define AR2315_PROCERR_HMAST_PCIENDPT 3
-+#define AR2315_PROCERR_HMAST_LOCAL 4
-+#define AR2315_PROCERR_HMAST_CPU 5
-+#define AR2315_PROCERR_HMAST_PCITGT 6
-+
-+#define AR2315_PROCERR_HMAST_S 0
-+#define AR2315_PROCERR_HWRITE 0x00000010
-+#define AR2315_PROCERR_HSIZE 0x00000060
-+#define AR2315_PROCERR_HSIZE_S 5
-+#define AR2315_PROCERR_HTRANS 0x00000180
-+#define AR2315_PROCERR_HTRANS_S 7
-+#define AR2315_PROCERR_HBURST 0x00000e00
-+#define AR2315_PROCERR_HBURST_S 9
-+
-+/*
-+ * Clock Control
-+ */
-+#define AR2315_PLLC_CTL (AR2315_DSLBASE + 0x0064)
-+#define AR2315_PLLV_CTL (AR2315_DSLBASE + 0x0068)
-+#define AR2315_CPUCLK (AR2315_DSLBASE + 0x006c)
-+#define AR2315_AMBACLK (AR2315_DSLBASE + 0x0070)
-+#define AR2315_SYNCCLK (AR2315_DSLBASE + 0x0074)
-+#define AR2315_DSL_SLEEP_CTL (AR2315_DSLBASE + 0x0080)
-+#define AR2315_DSL_SLEEP_DUR (AR2315_DSLBASE + 0x0084)
-+
-+/* PLLc Control fields */
-+#define PLLC_REF_DIV_M 0x00000003
-+#define PLLC_REF_DIV_S 0
-+#define PLLC_FDBACK_DIV_M 0x0000007C
-+#define PLLC_FDBACK_DIV_S 2
-+#define PLLC_ADD_FDBACK_DIV_M 0x00000080
-+#define PLLC_ADD_FDBACK_DIV_S 7
-+#define PLLC_CLKC_DIV_M 0x0001c000
-+#define PLLC_CLKC_DIV_S 14
-+#define PLLC_CLKM_DIV_M 0x00700000
-+#define PLLC_CLKM_DIV_S 20
-+
-+/* CPU CLK Control fields */
-+#define CPUCLK_CLK_SEL_M 0x00000003
-+#define CPUCLK_CLK_SEL_S 0
-+#define CPUCLK_CLK_DIV_M 0x0000000c
-+#define CPUCLK_CLK_DIV_S 2
-+
-+/* AMBA CLK Control fields */
-+#define AMBACLK_CLK_SEL_M 0x00000003
-+#define AMBACLK_CLK_SEL_S 0
-+#define AMBACLK_CLK_DIV_M 0x0000000c
-+#define AMBACLK_CLK_DIV_S 2
-+
-+/*
-+ * GPIO
-+ */
-+#define AR2315_GPIO_DI (AR2315_DSLBASE + 0x0088)
-+#define AR2315_GPIO_DO (AR2315_DSLBASE + 0x0090)
-+#define AR2315_GPIO_CR (AR2315_DSLBASE + 0x0098)
-+#define AR2315_GPIO_INT (AR2315_DSLBASE + 0x00a0)
-+
-+#define AR2315_GPIO_CR_M(x) (1 << (x)) /* mask for i/o */
-+#define AR2315_GPIO_CR_O(x) (1 << (x)) /* output */
-+#define AR2315_GPIO_CR_I(x) (0) /* input */
-+
-+#define AR2315_GPIO_INT_S(x) (x) /* interrupt enable */
-+#define AR2315_GPIO_INT_M (0x3F) /* mask for int */
-+#define AR2315_GPIO_INT_LVL(x) ((x) << 6) /* interrupt level */
-+#define AR2315_GPIO_INT_LVL_M ((0x3) << 6) /* mask for int level */
-+
-+#define AR2315_GPIO_INT_MAX_Y 1 /* Maximum value of Y for AR5313_GPIO_INT_* macros */
-+#define AR2315_GPIO_INT_LVL_OFF 0 /* Triggerring off */
-+#define AR2315_GPIO_INT_LVL_LOW 1 /* Low Level Triggered */
-+#define AR2315_GPIO_INT_LVL_HIGH 2 /* High Level Triggered */
-+#define AR2315_GPIO_INT_LVL_EDGE 3 /* Edge Triggered */
-+
-+#define AR2315_RESET_GPIO 5
-+#define AR2315_NUM_GPIO 22
-+
-+/*
-+ * PCI Clock Control
-+ */
-+#define AR2315_PCICLK (AR2315_DSLBASE + 0x00a4)
-+
-+#define AR2315_PCICLK_INPUT_M 0x3
-+#define AR2315_PCICLK_INPUT_S 0
-+
-+#define AR2315_PCICLK_PLLC_CLKM 0
-+#define AR2315_PCICLK_PLLC_CLKM1 1
-+#define AR2315_PCICLK_PLLC_CLKC 2
-+#define AR2315_PCICLK_REF_CLK 3
-+
-+#define AR2315_PCICLK_DIV_M 0xc
-+#define AR2315_PCICLK_DIV_S 2
-+
-+#define AR2315_PCICLK_IN_FREQ 0
-+#define AR2315_PCICLK_IN_FREQ_DIV_6 1
-+#define AR2315_PCICLK_IN_FREQ_DIV_8 2
-+#define AR2315_PCICLK_IN_FREQ_DIV_10 3
-+
-+/*
-+ * Observation Control Register
-+ */
-+#define AR2315_OCR (AR2315_DSLBASE + 0x00b0)
-+#define OCR_GPIO0_IRIN 0x0040
-+#define OCR_GPIO1_IROUT 0x0080
-+#define OCR_GPIO3_RXCLR 0x0200
-+
-+/*
-+ * General Clock Control
-+ */
-+
-+#define AR2315_MISCCLK (AR2315_DSLBASE + 0x00b4)
-+#define MISCCLK_PLLBYPASS_EN 0x00000001
-+#define MISCCLK_PROCREFCLK 0x00000002
-+
-+/*
-+ * SDRAM Controller
-+ * - No read or write buffers are included.
-+ */
-+#define AR2315_MEM_CFG (AR2315_SDRAMCTL + 0x00)
-+#define AR2315_MEM_CTRL (AR2315_SDRAMCTL + 0x0c)
-+#define AR2315_MEM_REF (AR2315_SDRAMCTL + 0x10)
-+
-+#define SDRAM_DATA_WIDTH_M 0x00006000
-+#define SDRAM_DATA_WIDTH_S 13
-+
-+#define SDRAM_COL_WIDTH_M 0x00001E00
-+#define SDRAM_COL_WIDTH_S 9
-+
-+#define SDRAM_ROW_WIDTH_M 0x000001E0
-+#define SDRAM_ROW_WIDTH_S 5
-+
-+#define SDRAM_BANKADDR_BITS_M 0x00000018
-+#define SDRAM_BANKADDR_BITS_S 3
-+
-+/*
-+ * SPI Flash Interface Registers
-+ */
-+
-+#define AR2315_SPI_CTL (AR2315_SPI + 0x00)
-+#define AR2315_SPI_OPCODE (AR2315_SPI + 0x04)
-+#define AR2315_SPI_DATA (AR2315_SPI + 0x08)
-+
-+#define SPI_CTL_START 0x00000100
-+#define SPI_CTL_BUSY 0x00010000
-+#define SPI_CTL_TXCNT_MASK 0x0000000f
-+#define SPI_CTL_RXCNT_MASK 0x000000f0
-+#define SPI_CTL_TX_RX_CNT_MASK 0x000000ff
-+#define SPI_CTL_SIZE_MASK 0x00060000
-+
-+#define SPI_CTL_CLK_SEL_MASK 0x03000000
-+#define SPI_OPCODE_MASK 0x000000ff
-+
-+/*
-+ * PCI Bus Interface Registers
-+ */
-+#define AR2315_PCI_1MS_REG (AR2315_PCI + 0x0008)
-+#define AR2315_PCI_1MS_MASK 0x3FFFF /* # of AHB clk cycles in 1ms */
-+
-+#define AR2315_PCI_MISC_CONFIG (AR2315_PCI + 0x000c)
-+#define AR2315_PCIMISC_TXD_EN 0x00000001 /* Enable TXD for fragments */
-+#define AR2315_PCIMISC_CFG_SEL 0x00000002 /* mem or config cycles */
-+#define AR2315_PCIMISC_GIG_MASK 0x0000000C /* bits 31-30 for pci req */
-+#define AR2315_PCIMISC_RST_MODE 0x00000030
-+#define AR2315_PCIRST_INPUT 0x00000000 /* 4:5=0 rst is input */
-+#define AR2315_PCIRST_LOW 0x00000010 /* 4:5=1 rst to GND */
-+#define AR2315_PCIRST_HIGH 0x00000020 /* 4:5=2 rst to VDD */
-+#define AR2315_PCIGRANT_EN 0x00000000 /* 6:7=0 early grant en */
-+#define AR2315_PCIGRANT_FRAME 0x00000040 /* 6:7=1 grant waits 4 frame */
-+#define AR2315_PCIGRANT_IDLE 0x00000080 /* 6:7=2 grant waits 4 idle */
-+#define AR2315_PCIGRANT_GAP 0x00000000 /* 6:7=2 grant waits 4 idle */
-+#define AR2315_PCICACHE_DIS 0x00001000 /* PCI external access cache disable */
-+
-+#define AR2315_PCI_OUT_TSTAMP (AR2315_PCI + 0x0010)
-+
-+#define AR2315_PCI_UNCACHE_CFG (AR2315_PCI + 0x0014)
-+
-+#define AR2315_PCI_IN_EN (AR2315_PCI + 0x0100)
-+#define AR2315_PCI_IN_EN0 0x01 /* Enable chain 0 */
-+#define AR2315_PCI_IN_EN1 0x02 /* Enable chain 1 */
-+#define AR2315_PCI_IN_EN2 0x04 /* Enable chain 2 */
-+#define AR2315_PCI_IN_EN3 0x08 /* Enable chain 3 */
-+
-+#define AR2315_PCI_IN_DIS (AR2315_PCI + 0x0104)
-+#define AR2315_PCI_IN_DIS0 0x01 /* Disable chain 0 */
-+#define AR2315_PCI_IN_DIS1 0x02 /* Disable chain 1 */
-+#define AR2315_PCI_IN_DIS2 0x04 /* Disable chain 2 */
-+#define AR2315_PCI_IN_DIS3 0x08 /* Disable chain 3 */
-+
-+#define AR2315_PCI_IN_PTR (AR2315_PCI + 0x0200)
-+
-+#define AR2315_PCI_OUT_EN (AR2315_PCI + 0x0400)
-+#define AR2315_PCI_OUT_EN0 0x01 /* Enable chain 0 */
-+
-+#define AR2315_PCI_OUT_DIS (AR2315_PCI + 0x0404)
-+#define AR2315_PCI_OUT_DIS0 0x01 /* Disable chain 0 */
-+
-+#define AR2315_PCI_OUT_PTR (AR2315_PCI + 0x0408)
-+
-+#define AR2315_PCI_INT_STATUS (AR2315_PCI + 0x0500) /* write one to clr */
-+#define AR2315_PCI_TXINT 0x00000001 /* Desc In Completed */
-+#define AR2315_PCI_TXOK 0x00000002 /* Desc In OK */
-+#define AR2315_PCI_TXERR 0x00000004 /* Desc In ERR */
-+#define AR2315_PCI_TXEOL 0x00000008 /* Desc In End-of-List */
-+#define AR2315_PCI_RXINT 0x00000010 /* Desc Out Completed */
-+#define AR2315_PCI_RXOK 0x00000020 /* Desc Out OK */
-+#define AR2315_PCI_RXERR 0x00000040 /* Desc Out ERR */
-+#define AR2315_PCI_RXEOL 0x00000080 /* Desc Out EOL */
-+#define AR2315_PCI_TXOOD 0x00000200 /* Desc In Out-of-Desc */
-+#define AR2315_PCI_MASK 0x0000FFFF /* Desc Mask */
-+#define AR2315_PCI_EXT_INT 0x02000000
-+#define AR2315_PCI_ABORT_INT 0x04000000
-+
-+#define AR2315_PCI_INT_MASK (AR2315_PCI + 0x0504) /* same as INT_STATUS */
-+
-+#define AR2315_PCI_INTEN_REG (AR2315_PCI + 0x0508)
-+#define AR2315_PCI_INT_DISABLE 0x00 /* disable pci interrupts */
-+#define AR2315_PCI_INT_ENABLE 0x01 /* enable pci interrupts */
-+
-+#define AR2315_PCI_HOST_IN_EN (AR2315_PCI + 0x0800)
-+#define AR2315_PCI_HOST_IN_DIS (AR2315_PCI + 0x0804)
-+#define AR2315_PCI_HOST_IN_PTR (AR2315_PCI + 0x0810)
-+#define AR2315_PCI_HOST_OUT_EN (AR2315_PCI + 0x0900)
-+#define AR2315_PCI_HOST_OUT_DIS (AR2315_PCI + 0x0904)
-+#define AR2315_PCI_HOST_OUT_PTR (AR2315_PCI + 0x0908)
-+
-+
-+/*
-+ * Local Bus Interface Registers
-+ */
-+#define AR2315_LB_CONFIG (AR2315_LOCAL + 0x0000)
-+#define AR2315_LBCONF_OE 0x00000001 /* =1 OE is low-true */
-+#define AR2315_LBCONF_CS0 0x00000002 /* =1 first CS is low-true */
-+#define AR2315_LBCONF_CS1 0x00000004 /* =1 2nd CS is low-true */
-+#define AR2315_LBCONF_RDY 0x00000008 /* =1 RDY is low-true */
-+#define AR2315_LBCONF_WE 0x00000010 /* =1 Write En is low-true */
-+#define AR2315_LBCONF_WAIT 0x00000020 /* =1 WAIT is low-true */
-+#define AR2315_LBCONF_ADS 0x00000040 /* =1 Adr Strobe is low-true */
-+#define AR2315_LBCONF_MOT 0x00000080 /* =0 Intel, =1 Motorola */
-+#define AR2315_LBCONF_8CS 0x00000100 /* =1 8 bits CS, 0= 16bits */
-+#define AR2315_LBCONF_8DS 0x00000200 /* =1 8 bits Data S, 0=16bits */
-+#define AR2315_LBCONF_ADS_EN 0x00000400 /* =1 Enable ADS */
-+#define AR2315_LBCONF_ADR_OE 0x00000800 /* =1 Adr cap on OE, WE or DS */
-+#define AR2315_LBCONF_ADDT_MUX 0x00001000 /* =1 Adr and Data share bus */
-+#define AR2315_LBCONF_DATA_OE 0x00002000 /* =1 Data cap on OE, WE, DS */
-+#define AR2315_LBCONF_16DATA 0x00004000 /* =1 Data is 16 bits wide */
-+#define AR2315_LBCONF_SWAPDT 0x00008000 /* =1 Byte swap data */
-+#define AR2315_LBCONF_SYNC 0x00010000 /* =1 Bus synchronous to clk */
-+#define AR2315_LBCONF_INT 0x00020000 /* =1 Intr is low true */
-+#define AR2315_LBCONF_INT_CTR0 0x00000000 /* GND high-Z, Vdd is high-Z */
-+#define AR2315_LBCONF_INT_CTR1 0x00040000 /* GND drive, Vdd is high-Z */
-+#define AR2315_LBCONF_INT_CTR2 0x00080000 /* GND high-Z, Vdd drive */
-+#define AR2315_LBCONF_INT_CTR3 0x000C0000 /* GND drive, Vdd drive */
-+#define AR2315_LBCONF_RDY_WAIT 0x00100000 /* =1 RDY is negative of WAIT */
-+#define AR2315_LBCONF_INT_PULSE 0x00200000 /* =1 Interrupt is a pulse */
-+#define AR2315_LBCONF_ENABLE 0x00400000 /* =1 Falcon respond to LB */
-+
-+#define AR2315_LB_CLKSEL (AR2315_LOCAL + 0x0004)
-+#define AR2315_LBCLK_EXT 0x0001 /* use external clk for lb */
-+
-+#define AR2315_LB_1MS (AR2315_LOCAL + 0x0008)
-+#define AR2315_LB1MS_MASK 0x3FFFF /* # of AHB clk cycles in 1ms */
-+
-+#define AR2315_LB_MISCCFG (AR2315_LOCAL + 0x000C)
-+#define AR2315_LBM_TXD_EN 0x00000001 /* Enable TXD for fragments */
-+#define AR2315_LBM_RX_INTEN 0x00000002 /* Enable LB ints on RX ready */
-+#define AR2315_LBM_MBOXWR_INTEN 0x00000004 /* Enable LB ints on mbox wr */
-+#define AR2315_LBM_MBOXRD_INTEN 0x00000008 /* Enable LB ints on mbox rd */
-+#define AR2315_LMB_DESCSWAP_EN 0x00000010 /* Byte swap desc enable */
-+#define AR2315_LBM_TIMEOUT_MASK 0x00FFFF80
-+#define AR2315_LBM_TIMEOUT_SHFT 7
-+#define AR2315_LBM_PORTMUX 0x07000000
-+
-+
-+#define AR2315_LB_RXTSOFF (AR2315_LOCAL + 0x0010)
-+
-+#define AR2315_LB_TX_CHAIN_EN (AR2315_LOCAL + 0x0100)
-+#define AR2315_LB_TXEN_0 0x01
-+#define AR2315_LB_TXEN_1 0x02
-+#define AR2315_LB_TXEN_2 0x04
-+#define AR2315_LB_TXEN_3 0x08
-+
-+#define AR2315_LB_TX_CHAIN_DIS (AR2315_LOCAL + 0x0104)
-+#define AR2315_LB_TX_DESC_PTR (AR2315_LOCAL + 0x0200)
-+
-+#define AR2315_LB_RX_CHAIN_EN (AR2315_LOCAL + 0x0400)
-+#define AR2315_LB_RXEN 0x01
-+
-+#define AR2315_LB_RX_CHAIN_DIS (AR2315_LOCAL + 0x0404)
-+#define AR2315_LB_RX_DESC_PTR (AR2315_LOCAL + 0x0408)
-+
-+#define AR2315_LB_INT_STATUS (AR2315_LOCAL + 0x0500)
-+#define AR2315_INT_TX_DESC 0x0001
-+#define AR2315_INT_TX_OK 0x0002
-+#define AR2315_INT_TX_ERR 0x0004
-+#define AR2315_INT_TX_EOF 0x0008
-+#define AR2315_INT_RX_DESC 0x0010
-+#define AR2315_INT_RX_OK 0x0020
-+#define AR2315_INT_RX_ERR 0x0040
-+#define AR2315_INT_RX_EOF 0x0080
-+#define AR2315_INT_TX_TRUNC 0x0100
-+#define AR2315_INT_TX_STARVE 0x0200
-+#define AR2315_INT_LB_TIMEOUT 0x0400
-+#define AR2315_INT_LB_ERR 0x0800
-+#define AR2315_INT_MBOX_WR 0x1000
-+#define AR2315_INT_MBOX_RD 0x2000
-+
-+/* Bit definitions for INT MASK are the same as INT_STATUS */
-+#define AR2315_LB_INT_MASK (AR2315_LOCAL + 0x0504)
-+
-+#define AR2315_LB_INT_EN (AR2315_LOCAL + 0x0508)
-+#define AR2315_LB_MBOX (AR2315_LOCAL + 0x0600)
-+
-+/*
-+ * IR Interface Registers
-+ */
-+#define AR2315_IR_PKTDATA (AR2315_IR + 0x0000)
-+
-+#define AR2315_IR_PKTLEN (AR2315_IR + 0x07fc) /* 0 - 63 */
-+
-+#define AR2315_IR_CONTROL (AR2315_IR + 0x0800)
-+#define AR2315_IRCTL_TX 0x00000000 /* use as tranmitter */
-+#define AR2315_IRCTL_RX 0x00000001 /* use as receiver */
-+#define AR2315_IRCTL_SAMPLECLK_MASK 0x00003ffe /* Sample clk divisor mask */
-+#define AR2315_IRCTL_SAMPLECLK_SHFT 1
-+#define AR2315_IRCTL_OUTPUTCLK_MASK 0x03ffc000 /* Output clk divisor mask */
-+#define AR2315_IRCTL_OUTPUTCLK_SHFT 14
-+
-+#define AR2315_IR_STATUS (AR2315_IR + 0x0804)
-+#define AR2315_IRSTS_RX 0x00000001 /* receive in progress */
-+#define AR2315_IRSTS_TX 0x00000002 /* transmit in progress */
-+
-+#define AR2315_IR_CONFIG (AR2315_IR + 0x0808)
-+#define AR2315_IRCFG_INVIN 0x00000001 /* invert input polarity */
-+#define AR2315_IRCFG_INVOUT 0x00000002 /* invert output polarity */
-+#define AR2315_IRCFG_SEQ_START_WIN_SEL 0x00000004 /* 1 => 28, 0 => 7 */
-+#define AR2315_IRCFG_SEQ_START_THRESH 0x000000f0 /* */
-+#define AR2315_IRCFG_SEQ_END_UNIT_SEL 0x00000100 /* */
-+#define AR2315_IRCFG_SEQ_END_UNIT_THRESH 0x00007e00 /* */
-+#define AR2315_IRCFG_SEQ_END_WIN_SEL 0x00008000 /* */
-+#define AR2315_IRCFG_SEQ_END_WIN_THRESH 0x001f0000 /* */
-+#define AR2315_IRCFG_NUM_BACKOFF_WORDS 0x01e00000 /* */
-+
-+#define HOST_PCI_DEV_ID 3
-+#define HOST_PCI_MBAR0 0x10000000
-+#define HOST_PCI_MBAR1 0x20000000
-+#define HOST_PCI_MBAR2 0x30000000
-+
-+#define HOST_PCI_SDRAM_BASEADDR HOST_PCI_MBAR1
-+#define PCI_DEVICE_MEM_SPACE 0x800000
-+
-+#endif /* __AR2315_REG_H */
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ar231x/ar5312_regs.h
-@@ -0,0 +1,236 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2003 Atheros Communications, Inc., All Rights Reserved.
-+ * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
-+ */
-+
-+#ifndef AR5312_H
-+#define AR5312_H
-+
-+#include <asm/addrspace.h>
-+
-+/*
-+ * IRQs
-+ */
-+
-+#define AR5312_IRQ_WLAN0_INTRS MIPS_CPU_IRQ_BASE+2 /* C0_CAUSE: 0x0400 */
-+#define AR5312_IRQ_ENET0_INTRS MIPS_CPU_IRQ_BASE+3 /* C0_CAUSE: 0x0800 */
-+#define AR5312_IRQ_ENET1_INTRS MIPS_CPU_IRQ_BASE+4 /* C0_CAUSE: 0x1000 */
-+#define AR5312_IRQ_WLAN1_INTRS MIPS_CPU_IRQ_BASE+5 /* C0_CAUSE: 0x2000 */
-+#define AR5312_IRQ_MISC_INTRS MIPS_CPU_IRQ_BASE+6 /* C0_CAUSE: 0x4000 */
-+
-+
-+/* Address Map */
-+#define AR531X_WLAN0 0x18000000
-+#define AR531X_WLAN1 0x18500000
-+#define AR531X_ENET0 0x18100000
-+#define AR531X_ENET1 0x18200000
-+#define AR531X_SDRAMCTL 0x18300000
-+#define AR531X_FLASHCTL 0x18400000
-+#define AR531X_APBBASE 0x1c000000
-+#define AR531X_FLASH 0x1e000000
-+#define AR531X_UART0 0xbc000003 /* UART MMR */
-+
-+/*
-+ * AR531X_NUM_ENET_MAC defines the number of ethernet MACs that
-+ * should be considered available. The AR5312 supports 2 enet MACS,
-+ * even though many reference boards only actually use 1 of them
-+ * (i.e. Only MAC 0 is actually connected to an enet PHY or PHY switch.
-+ * The AR2312 supports 1 enet MAC.
-+ */
-+#define AR531X_NUM_ENET_MAC 2
-+
-+/*
-+ * Need these defines to determine true number of ethernet MACs
-+ */
-+#define AR5212_AR5312_REV2 0x0052 /* AR5312 WMAC (AP31) */
-+#define AR5212_AR5312_REV7 0x0057 /* AR5312 WMAC (AP30-040) */
-+#define AR5212_AR2313_REV8 0x0058 /* AR2313 WMAC (AP43-030) */
-+#define AR531X_RADIO_MASK_OFF 0xc8
-+#define AR531X_RADIO0_MASK 0x0003
-+#define AR531X_RADIO1_MASK 0x000c
-+#define AR531X_RADIO1_S 2
-+
-+/*
-+ * AR531X_NUM_WMAC defines the number of Wireless MACs that\
-+ * should be considered available.
-+ */
-+#define AR531X_NUM_WMAC 2
-+
-+/* Reset/Timer Block Address Map */
-+#define AR531X_RESETTMR (AR531X_APBBASE + 0x3000)
-+#define AR531X_TIMER (AR531X_RESETTMR + 0x0000) /* countdown timer */
-+#define AR531X_WD_CTRL (AR531X_RESETTMR + 0x0008) /* watchdog cntrl */
-+#define AR531X_WD_TIMER (AR531X_RESETTMR + 0x000c) /* watchdog timer */
-+#define AR531X_ISR (AR531X_RESETTMR + 0x0010) /* Intr Status Reg */
-+#define AR531X_IMR (AR531X_RESETTMR + 0x0014) /* Intr Mask Reg */
-+#define AR531X_RESET (AR531X_RESETTMR + 0x0020)
-+#define AR5312_CLOCKCTL1 (AR531X_RESETTMR + 0x0064)
-+#define AR5312_SCRATCH (AR531X_RESETTMR + 0x006c)
-+#define AR531X_PROCADDR (AR531X_RESETTMR + 0x0070)
-+#define AR531X_PROC1 (AR531X_RESETTMR + 0x0074)
-+#define AR531X_DMAADDR (AR531X_RESETTMR + 0x0078)
-+#define AR531X_DMA1 (AR531X_RESETTMR + 0x007c)
-+#define AR531X_ENABLE (AR531X_RESETTMR + 0x0080) /* interface enb */
-+#define AR531X_REV (AR531X_RESETTMR + 0x0090) /* revision */
-+
-+/* AR531X_WD_CTRL register bit field definitions */
-+#define AR531X_WD_CTRL_IGNORE_EXPIRATION 0x0000
-+#define AR531X_WD_CTRL_NMI 0x0001
-+#define AR531X_WD_CTRL_RESET 0x0002
-+
-+/* AR531X_ISR register bit field definitions */
-+#define AR531X_ISR_NONE 0x0000
-+#define AR531X_ISR_TIMER 0x0001
-+#define AR531X_ISR_AHBPROC 0x0002
-+#define AR531X_ISR_AHBDMA 0x0004
-+#define AR531X_ISR_GPIO 0x0008
-+#define AR531X_ISR_UART0 0x0010
-+#define AR531X_ISR_UART0DMA 0x0020
-+#define AR531X_ISR_WD 0x0040
-+#define AR531X_ISR_LOCAL 0x0080
-+
-+/* AR531X_RESET register bit field definitions */
-+#define AR531X_RESET_SYSTEM 0x00000001 /* cold reset full system */
-+#define AR531X_RESET_PROC 0x00000002 /* cold reset MIPS core */
-+#define AR531X_RESET_WLAN0 0x00000004 /* cold reset WLAN MAC and BB */
-+#define AR531X_RESET_EPHY0 0x00000008 /* cold reset ENET0 phy */
-+#define AR531X_RESET_EPHY1 0x00000010 /* cold reset ENET1 phy */
-+#define AR531X_RESET_ENET0 0x00000020 /* cold reset ENET0 mac */
-+#define AR531X_RESET_ENET1 0x00000040 /* cold reset ENET1 mac */
-+#define AR531X_RESET_UART0 0x00000100 /* cold reset UART0 (high speed) */
-+#define AR531X_RESET_WLAN1 0x00000200 /* cold reset WLAN MAC/BB */
-+#define AR531X_RESET_APB 0x00000400 /* cold reset APB (ar5312) */
-+#define AR531X_RESET_WARM_PROC 0x00001000 /* warm reset MIPS core */
-+#define AR531X_RESET_WARM_WLAN0_MAC 0x00002000 /* warm reset WLAN0 MAC */
-+#define AR531X_RESET_WARM_WLAN0_BB 0x00004000 /* warm reset WLAN0 BaseBand */
-+#define AR531X_RESET_NMI 0x00010000 /* send an NMI to the processor */
-+#define AR531X_RESET_WARM_WLAN1_MAC 0x00020000 /* warm reset WLAN1 mac */
-+#define AR531X_RESET_WARM_WLAN1_BB 0x00040000 /* warm reset WLAN1 baseband */
-+#define AR531X_RESET_LOCAL_BUS 0x00080000 /* reset local bus */
-+#define AR531X_RESET_WDOG 0x00100000 /* last reset was a watchdog */
-+
-+#define AR531X_RESET_WMAC0_BITS \
-+ AR531X_RESET_WLAN0 |\
-+ AR531X_RESET_WARM_WLAN0_MAC |\
-+ AR531X_RESET_WARM_WLAN0_BB
-+
-+#define AR531X_RESERT_WMAC1_BITS \
-+ AR531X_RESET_WLAN1 |\
-+ AR531X_RESET_WARM_WLAN1_MAC |\
-+ AR531X_RESET_WARM_WLAN1_BB
-+
-+/* AR5312_CLOCKCTL1 register bit field definitions */
-+#define AR5312_CLOCKCTL1_PREDIVIDE_MASK 0x00000030
-+#define AR5312_CLOCKCTL1_PREDIVIDE_SHIFT 4
-+#define AR5312_CLOCKCTL1_MULTIPLIER_MASK 0x00001f00
-+#define AR5312_CLOCKCTL1_MULTIPLIER_SHIFT 8
-+#define AR5312_CLOCKCTL1_DOUBLER_MASK 0x00010000
-+
-+/* Valid for AR5312 and AR2312 */
-+#define AR5312_CLOCKCTL1_PREDIVIDE_MASK 0x00000030
-+#define AR5312_CLOCKCTL1_PREDIVIDE_SHIFT 4
-+#define AR5312_CLOCKCTL1_MULTIPLIER_MASK 0x00001f00
-+#define AR5312_CLOCKCTL1_MULTIPLIER_SHIFT 8
-+#define AR5312_CLOCKCTL1_DOUBLER_MASK 0x00010000
-+
-+/* Valid for AR2313 */
-+#define AR2313_CLOCKCTL1_PREDIVIDE_MASK 0x00003000
-+#define AR2313_CLOCKCTL1_PREDIVIDE_SHIFT 12
-+#define AR2313_CLOCKCTL1_MULTIPLIER_MASK 0x001f0000
-+#define AR2313_CLOCKCTL1_MULTIPLIER_SHIFT 16
-+#define AR2313_CLOCKCTL1_DOUBLER_MASK 0x00000000
-+
-+
-+/* AR531X_ENABLE register bit field definitions */
-+#define AR531X_ENABLE_WLAN0 0x0001
-+#define AR531X_ENABLE_ENET0 0x0002
-+#define AR531X_ENABLE_ENET1 0x0004
-+#define AR531X_ENABLE_UART_AND_WLAN1_PIO 0x0008 /* UART, and WLAN1 PIOs */
-+#define AR531X_ENABLE_WLAN1_DMA 0x0010 /* WLAN1 DMAs */
-+#define AR531X_ENABLE_WLAN1 \
-+ (AR531X_ENABLE_UART_AND_WLAN1_PIO | AR531X_ENABLE_WLAN1_DMA)
-+
-+/* AR531X_REV register bit field definitions */
-+#define AR531X_REV_WMAC_MAJ 0xf000
-+#define AR531X_REV_WMAC_MAJ_S 12
-+#define AR531X_REV_WMAC_MIN 0x0f00
-+#define AR531X_REV_WMAC_MIN_S 8
-+#define AR531X_REV_MAJ 0x00f0
-+#define AR531X_REV_MAJ_S 4
-+#define AR531X_REV_MIN 0x000f
-+#define AR531X_REV_MIN_S 0
-+#define AR531X_REV_CHIP (AR531X_REV_MAJ|AR531X_REV_MIN)
-+
-+/* Major revision numbers, bits 7..4 of Revision ID register */
-+#define AR531X_REV_MAJ_AR5312 0x4
-+#define AR531X_REV_MAJ_AR2313 0x5
-+
-+/* Minor revision numbers, bits 3..0 of Revision ID register */
-+#define AR5312_REV_MIN_DUAL 0x0 /* Dual WLAN version */
-+#define AR5312_REV_MIN_SINGLE 0x1 /* Single WLAN version */
-+
-+/* AR531X_FLASHCTL register bit field definitions */
-+#define FLASHCTL_IDCY 0x0000000f /* Idle cycle turn around time */
-+#define FLASHCTL_IDCY_S 0
-+#define FLASHCTL_WST1 0x000003e0 /* Wait state 1 */
-+#define FLASHCTL_WST1_S 5
-+#define FLASHCTL_RBLE 0x00000400 /* Read byte lane enable */
-+#define FLASHCTL_WST2 0x0000f800 /* Wait state 2 */
-+#define FLASHCTL_WST2_S 11
-+#define FLASHCTL_AC 0x00070000 /* Flash address check (added) */
-+#define FLASHCTL_AC_S 16
-+#define FLASHCTL_AC_128K 0x00000000
-+#define FLASHCTL_AC_256K 0x00010000
-+#define FLASHCTL_AC_512K 0x00020000
-+#define FLASHCTL_AC_1M 0x00030000
-+#define FLASHCTL_AC_2M 0x00040000
-+#define FLASHCTL_AC_4M 0x00050000
-+#define FLASHCTL_AC_8M 0x00060000
-+#define FLASHCTL_AC_RES 0x00070000 /* 16MB is not supported */
-+#define FLASHCTL_E 0x00080000 /* Flash bank enable (added) */
-+#define FLASHCTL_BUSERR 0x01000000 /* Bus transfer error status flag */
-+#define FLASHCTL_WPERR 0x02000000 /* Write protect error status flag */
-+#define FLASHCTL_WP 0x04000000 /* Write protect */
-+#define FLASHCTL_BM 0x08000000 /* Burst mode */
-+#define FLASHCTL_MW 0x30000000 /* Memory width */
-+#define FLASHCTL_MWx8 0x00000000 /* Memory width x8 */
-+#define FLASHCTL_MWx16 0x10000000 /* Memory width x16 */
-+#define FLASHCTL_MWx32 0x20000000 /* Memory width x32 (not supported) */
-+#define FLASHCTL_ATNR 0x00000000 /* Access type == no retry */
-+#define FLASHCTL_ATR 0x80000000 /* Access type == retry every */
-+#define FLASHCTL_ATR4 0xc0000000 /* Access type == retry every 4 */
-+
-+/* ARM Flash Controller -- 3 flash banks with either x8 or x16 devices. */
-+#define AR531X_FLASHCTL0 (AR531X_FLASHCTL + 0x00)
-+#define AR531X_FLASHCTL1 (AR531X_FLASHCTL + 0x04)
-+#define AR531X_FLASHCTL2 (AR531X_FLASHCTL + 0x08)
-+
-+/* ARM SDRAM Controller -- just enough to determine memory size */
-+#define AR531X_MEM_CFG1 (AR531X_SDRAMCTL + 0x04)
-+#define MEM_CFG1_AC0 0x00000700 /* bank 0: SDRAM addr check (added) */
-+#define MEM_CFG1_AC0_S 8
-+#define MEM_CFG1_AC1 0x00007000 /* bank 1: SDRAM addr check (added) */
-+#define MEM_CFG1_AC1_S 12
-+
-+/* GPIO Address Map */
-+#define AR531X_GPIO (AR531X_APBBASE + 0x2000)
-+#define AR531X_GPIO_DO (AR531X_GPIO + 0x00) /* output register */
-+#define AR531X_GPIO_DI (AR531X_GPIO + 0x04) /* intput register */
-+#define AR531X_GPIO_CR (AR531X_GPIO + 0x08) /* control register */
-+
-+/* GPIO Control Register bit field definitions */
-+#define AR531X_GPIO_CR_M(x) (1 << (x)) /* mask for i/o */
-+#define AR531X_GPIO_CR_O(x) (0 << (x)) /* mask for output */
-+#define AR531X_GPIO_CR_I(x) (1 << (x)) /* mask for input */
-+#define AR531X_GPIO_CR_INT(x) (1 << ((x)+8)) /* mask for interrupt */
-+#define AR531X_GPIO_CR_UART(x) (1 << ((x)+16)) /* uart multiplex */
-+#define AR531X_NUM_GPIO 8
-+
-+
-+#endif
-+
---- /dev/null
-+++ b/arch/mips/ar231x/ar5312.c
-@@ -0,0 +1,547 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2003 Atheros Communications, Inc., All Rights Reserved.
-+ * Copyright (C) 2006 FON Technology, SL.
-+ * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org>
-+ */
-+
-+/*
-+ * Platform devices for Atheros SoCs
-+ */
-+
-+#include <generated/autoconf.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/string.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/platform_device.h>
-+#include <linux/kernel.h>
-+#include <linux/reboot.h>
-+#include <linux/leds.h>
-+#include <asm/bootinfo.h>
-+#include <asm/reboot.h>
-+#include <asm/time.h>
-+#include <asm/irq.h>
-+#include <asm/io.h>
-+#include <gpio.h>
-+
-+#include <ar231x_platform.h>
-+#include <ar5312_regs.h>
-+#include <ar231x.h>
-+#include "devices.h"
-+#include "ar5312.h"
-+
-+static void
-+ar5312_misc_irq_dispatch(void)
-+{
-+ unsigned int ar231x_misc_intrs = ar231x_read_reg(AR531X_ISR) & ar231x_read_reg(AR531X_IMR);
-+
-+ if (ar231x_misc_intrs & AR531X_ISR_TIMER) {
-+ do_IRQ(AR531X_MISC_IRQ_TIMER);
-+ (void)ar231x_read_reg(AR531X_TIMER);
-+ } else if (ar231x_misc_intrs & AR531X_ISR_AHBPROC)
-+ do_IRQ(AR531X_MISC_IRQ_AHB_PROC);
-+ else if ((ar231x_misc_intrs & AR531X_ISR_UART0))
-+ do_IRQ(AR531X_MISC_IRQ_UART0);
-+ else if (ar231x_misc_intrs & AR531X_ISR_WD)
-+ do_IRQ(AR531X_MISC_IRQ_WATCHDOG);
-+ else
-+ do_IRQ(AR531X_MISC_IRQ_NONE);
-+}
-+
-+static asmlinkage void
-+ar5312_irq_dispatch(void)
-+{
-+ int pending = read_c0_status() & read_c0_cause();
-+
-+ if (pending & CAUSEF_IP2)
-+ do_IRQ(AR5312_IRQ_WLAN0_INTRS);
-+ else if (pending & CAUSEF_IP3)
-+ do_IRQ(AR5312_IRQ_ENET0_INTRS);
-+ else if (pending & CAUSEF_IP4)
-+ do_IRQ(AR5312_IRQ_ENET1_INTRS);
-+ else if (pending & CAUSEF_IP5)
-+ do_IRQ(AR5312_IRQ_WLAN1_INTRS);
-+ else if (pending & CAUSEF_IP6)
-+ ar5312_misc_irq_dispatch();
-+ else if (pending & CAUSEF_IP7)
-+ do_IRQ(AR531X_IRQ_CPU_CLOCK);
-+}
-+
-+
-+/* Enable the specified AR531X_MISC_IRQ interrupt */
-+static void
-+ar5312_misc_intr_enable(unsigned int irq)
-+{
-+ unsigned int imr;
-+
-+ imr = ar231x_read_reg(AR531X_IMR);
-+ imr |= (1 << (irq - AR531X_MISC_IRQ_BASE - 1));
-+ ar231x_write_reg(AR531X_IMR, imr);
-+}
-+
-+/* Disable the specified AR531X_MISC_IRQ interrupt */
-+static void
-+ar5312_misc_intr_disable(unsigned int irq)
-+{
-+ unsigned int imr;
-+
-+ imr = ar231x_read_reg(AR531X_IMR);
-+ imr &= ~(1 << (irq - AR531X_MISC_IRQ_BASE - 1));
-+ ar231x_write_reg(AR531X_IMR, imr);
-+ ar231x_read_reg(AR531X_IMR); /* flush write buffer */
-+}
-+
-+static void
-+ar5312_misc_intr_end(unsigned int irq)
-+{
-+ if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
-+ ar5312_misc_intr_enable(irq);
-+}
-+
-+static struct irq_chip ar5312_misc_intr_controller = {
-+ .name = "AR5312-MISC",
-+ .disable = ar5312_misc_intr_disable,
-+ .ack = ar5312_misc_intr_disable,
-+ .mask_ack = ar5312_misc_intr_disable,
-+ .mask = ar5312_misc_intr_disable,
-+ .unmask = ar5312_misc_intr_enable,
-+ .end = ar5312_misc_intr_end,
-+};
-+
-+
-+static irqreturn_t ar5312_ahb_proc_handler(int cpl, void *dev_id)
-+{
-+ u32 proc1 = ar231x_read_reg(AR531X_PROC1);
-+ u32 procAddr = ar231x_read_reg(AR531X_PROCADDR); /* clears error state */
-+ u32 dma1 = ar231x_read_reg(AR531X_DMA1);
-+ u32 dmaAddr = ar231x_read_reg(AR531X_DMAADDR); /* clears error state */
-+
-+ printk("AHB interrupt: PROCADDR=0x%8.8x PROC1=0x%8.8x DMAADDR=0x%8.8x DMA1=0x%8.8x\n",
-+ procAddr, proc1, dmaAddr, dma1);
-+
-+ machine_restart("AHB error"); /* Catastrophic failure */
-+ return IRQ_HANDLED;
-+}
-+
-+
-+static struct irqaction ar5312_ahb_proc_interrupt = {
-+ .handler = ar5312_ahb_proc_handler,
-+ .flags = IRQF_DISABLED,
-+ .name = "ar5312_ahb_proc_interrupt",
-+};
-+
-+
-+static struct irqaction cascade = {
-+ .handler = no_action,
-+ .flags = IRQF_DISABLED,
-+ .name = "cascade",
-+};
-+
-+void __init ar5312_irq_init(void)
-+{
-+ int i;
-+
-+ if (!is_5312())
-+ return;
-+
-+ ar231x_irq_dispatch = ar5312_irq_dispatch;
-+ for (i = 0; i < AR531X_MISC_IRQ_COUNT; i++) {
-+ int irq = AR531X_MISC_IRQ_BASE + i;
-+ set_irq_chip_and_handler(irq, &ar5312_misc_intr_controller,
-+ handle_level_irq);
-+ }
-+ setup_irq(AR531X_MISC_IRQ_AHB_PROC, &ar5312_ahb_proc_interrupt);
-+ setup_irq(AR5312_IRQ_MISC_INTRS, &cascade);
-+}
-+
-+const struct ar231x_gpiodev ar5312_gpiodev;
-+
-+static u32
-+ar5312_gpio_get_output(void)
-+{
-+ u32 reg;
-+ reg = ~(ar231x_read_reg(AR531X_GPIO_CR));
-+ reg &= ar5312_gpiodev.valid_mask;
-+ return reg;
-+}
-+
-+static u32
-+ar5312_gpio_set_output(u32 mask, u32 val)
-+{
-+ u32 reg;
-+
-+ reg = ar231x_read_reg(AR531X_GPIO_CR);
-+ reg |= mask;
-+ reg &= ~val;
-+ ar231x_write_reg(AR531X_GPIO_CR, reg);
-+ return reg;
-+}
-+
-+static u32
-+ar5312_gpio_get(void)
-+{
-+ u32 reg;
-+ reg = ar231x_read_reg(AR531X_GPIO_DI);
-+ reg &= ar5312_gpiodev.valid_mask;
-+ return reg;
-+}
-+
-+static u32
-+ar5312_gpio_set(u32 mask, u32 value)
-+{
-+ u32 reg;
-+ reg = ar231x_read_reg(AR531X_GPIO_DO);
-+ reg &= ~mask;
-+ reg |= value;
-+ ar231x_write_reg(AR531X_GPIO_DO, reg);
-+ return reg;
-+}
-+
-+const struct ar231x_gpiodev ar5312_gpiodev = {
-+ .valid_mask = (1 << 8) - 1,
-+ .get_output = ar5312_gpio_get_output,
-+ .set_output = ar5312_gpio_set_output,
-+ .get = ar5312_gpio_get,
-+ .set = ar5312_gpio_set,
-+};
-+
-+static struct physmap_flash_data ar5312_flash_data = {
-+ .width = 2,
-+};
-+
-+static struct resource ar5312_flash_resource = {
-+ .start = AR531X_FLASH,
-+ .end = AR531X_FLASH + 0x800000 - 1,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static struct ar231x_eth ar5312_eth0_data = {
-+ .reset_base = AR531X_RESET,
-+ .reset_mac = AR531X_RESET_ENET0,
-+ .reset_phy = AR531X_RESET_EPHY0,
-+ .phy_base = KSEG1ADDR(AR531X_ENET0),
-+ .config = &ar231x_board,
-+};
-+
-+static struct ar231x_eth ar5312_eth1_data = {
-+ .reset_base = AR531X_RESET,
-+ .reset_mac = AR531X_RESET_ENET1,
-+ .reset_phy = AR531X_RESET_EPHY1,
-+ .phy_base = KSEG1ADDR(AR531X_ENET1),
-+ .config = &ar231x_board,
-+};
-+
-+static struct platform_device ar5312_physmap_flash = {
-+ .name = "physmap-flash",
-+ .id = 0,
-+ .dev.platform_data = &ar5312_flash_data,
-+ .resource = &ar5312_flash_resource,
-+ .num_resources = 1,
-+};
-+
-+#ifdef CONFIG_LEDS_GPIO
-+static struct gpio_led ar5312_leds[] = {
-+ { .name = "wlan", .gpio = 0, .active_low = 1, },
-+};
-+
-+static const struct gpio_led_platform_data ar5312_led_data = {
-+ .num_leds = ARRAY_SIZE(ar5312_leds),
-+ .leds = (void *) ar5312_leds,
-+};
-+
-+static struct platform_device ar5312_gpio_leds = {
-+ .name = "leds-gpio",
-+ .id = -1,
-+ .dev.platform_data = (void *) &ar5312_led_data,
-+};
-+#endif
-+
-+/*
-+ * NB: This mapping size is larger than the actual flash size,
-+ * but this shouldn't be a problem here, because the flash
-+ * will simply be mapped multiple times.
-+ */
-+static char __init *ar5312_flash_limit(void)
-+{
-+ u32 ctl;
-+ /*
-+ * Configure flash bank 0.
-+ * Assume 8M window size. Flash will be aliased if it's smaller
-+ */
-+ ctl = FLASHCTL_E |
-+ FLASHCTL_AC_8M |
-+ FLASHCTL_RBLE |
-+ (0x01 << FLASHCTL_IDCY_S) |
-+ (0x07 << FLASHCTL_WST1_S) |
-+ (0x07 << FLASHCTL_WST2_S) |
-+ (ar231x_read_reg(AR531X_FLASHCTL0) & FLASHCTL_MW);
-+
-+ ar231x_write_reg(AR531X_FLASHCTL0, ctl);
-+
-+ /* Disable other flash banks */
-+ ar231x_write_reg(AR531X_FLASHCTL1,
-+ ar231x_read_reg(AR531X_FLASHCTL1) & ~(FLASHCTL_E | FLASHCTL_AC));
-+
-+ ar231x_write_reg(AR531X_FLASHCTL2,
-+ ar231x_read_reg(AR531X_FLASHCTL2) & ~(FLASHCTL_E | FLASHCTL_AC));
-+
-+ return (char *) KSEG1ADDR(AR531X_FLASH + 0x800000);
-+}
-+
-+int __init ar5312_init_devices(void)
-+{
-+ struct ar231x_boarddata *config;
-+ u32 fctl = 0;
-+ const u8 *radio;
-+ u8 *c;
-+
-+ if (!is_5312())
-+ return 0;
-+
-+ /* Locate board/radio config data */
-+ ar231x_find_config(ar5312_flash_limit());
-+ config = ar231x_board.config;
-+
-+
-+ /*
-+ * Chip IDs and hardware detection for some Atheros
-+ * models are really broken!
-+ *
-+ * Atheros uses a disabled WMAC0 and Silicon ID of AR5312
-+ * as indication for AR2312, which is otherwise
-+ * indistinguishable from the real AR5312.
-+ */
-+ if (ar231x_board.radio) {
-+ radio = ar231x_board.radio + AR531X_RADIO_MASK_OFF;
-+ if ((*((const u32 *) radio) & AR531X_RADIO0_MASK) == 0)
-+ config->flags |= BD_ISCASPER;
-+ } else
-+ radio = NULL;
-+
-+ /* AR2313 has CPU minor rev. 10 */
-+ if ((current_cpu_data.processor_id & 0xff) == 0x0a)
-+ ar231x_devtype = DEV_TYPE_AR2313;
-+
-+ /* AR2312 shares the same Silicon ID as AR5312 */
-+ else if (config->flags & BD_ISCASPER)
-+ ar231x_devtype = DEV_TYPE_AR2312;
-+
-+ /* Everything else is probably AR5312 or compatible */
-+ else
-+ ar231x_devtype = DEV_TYPE_AR5312;
-+
-+ /* fixup flash width */
-+ fctl = ar231x_read_reg(AR531X_FLASHCTL) & FLASHCTL_MW;
-+ switch (fctl) {
-+ case FLASHCTL_MWx16:
-+ ar5312_flash_data.width = 2;
-+ break;
-+ case FLASHCTL_MWx8:
-+ default:
-+ ar5312_flash_data.width = 1;
-+ break;
-+ }
-+
-+ platform_device_register(&ar5312_physmap_flash);
-+
-+#ifdef CONFIG_LEDS_GPIO
-+ ar5312_leds[0].gpio = config->sysLedGpio;
-+ platform_device_register(&ar5312_gpio_leds);
-+#endif
-+
-+ /* Fix up MAC addresses if necessary */
-+ if (!memcmp(config->enet0_mac, "\xff\xff\xff\xff\xff\xff", 6))
-+ memcpy(config->enet0_mac, config->enet1_mac, 6);
-+
-+ /* If ENET0 and ENET1 have the same mac address,
-+ * increment the one from ENET1 */
-+ if (memcmp(config->enet0_mac, config->enet1_mac, 6) == 0) {
-+ c = config->enet1_mac + 5;
-+ while ((c >= config->enet1_mac) && !(++(*c)))
-+ c--;
-+ }
-+
-+ switch(ar231x_devtype) {
-+ case DEV_TYPE_AR5312:
-+ ar5312_eth0_data.macaddr = config->enet0_mac;
-+ ar231x_add_ethernet(0, KSEG1ADDR(AR531X_ENET0),
-+ AR5312_IRQ_ENET0_INTRS, &ar5312_eth0_data);
-+
-+ ar5312_eth1_data.macaddr = config->enet1_mac;
-+ ar231x_add_ethernet(1, KSEG1ADDR(AR531X_ENET1),
-+ AR5312_IRQ_ENET1_INTRS, &ar5312_eth1_data);
-+
-+ if (!ar231x_board.radio)
-+ return 0;
-+
-+ if (*((u32 *) radio) & AR531X_RADIO0_MASK)
-+ ar231x_add_wmac(0, AR531X_WLAN0,
-+ AR5312_IRQ_WLAN0_INTRS);
-+
-+ break;
-+ /*
-+ * AR2312/3 ethernet uses the PHY of ENET0, but the MAC
-+ * of ENET1. Atheros calls it 'twisted' for a reason :)
-+ */
-+ case DEV_TYPE_AR2312:
-+ case DEV_TYPE_AR2313:
-+ ar5312_eth1_data.phy_base = ar5312_eth0_data.phy_base;
-+ ar5312_eth1_data.reset_phy = ar5312_eth0_data.reset_phy;
-+ ar5312_eth1_data.macaddr = config->enet0_mac;
-+ ar231x_add_ethernet(0, KSEG1ADDR(AR531X_ENET1),
-+ AR5312_IRQ_ENET1_INTRS, &ar5312_eth1_data);
-+
-+ if (!ar231x_board.radio)
-+ return 0;
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ if (*((u32 *) radio) & AR531X_RADIO1_MASK)
-+ ar231x_add_wmac(1, AR531X_WLAN1,
-+ AR5312_IRQ_WLAN1_INTRS);
-+
-+ return 0;
-+}
-+
-+
-+static void ar5312_restart(char *command)
-+{
-+ /* reset the system */
-+ local_irq_disable();
-+ while(1) {
-+ ar231x_write_reg(AR531X_RESET, AR531X_RESET_SYSTEM);
-+ }
-+}
-+
-+
-+/*
-+ * This table is indexed by bits 5..4 of the CLOCKCTL1 register
-+ * to determine the predevisor value.
-+ */
-+static int __initdata CLOCKCTL1_PREDIVIDE_TABLE[4] = { 1, 2, 4, 5 };
-+
-+
-+static int __init
-+ar5312_cpu_frequency(void)
-+{
-+ unsigned int result;
-+ unsigned int predivide_mask, predivide_shift;
-+ unsigned int multiplier_mask, multiplier_shift;
-+ unsigned int clockCtl1, preDivideSelect, preDivisor, multiplier;
-+ unsigned int doubler_mask;
-+ u16 devid;
-+
-+ /* Trust the bootrom's idea of cpu frequency. */
-+ if ((result = ar231x_read_reg(AR5312_SCRATCH)))
-+ return result;
-+
-+ devid = ar231x_read_reg(AR531X_REV);
-+ devid &= AR531X_REV_MAJ;
-+ devid >>= AR531X_REV_MAJ_S;
-+ if (devid == AR531X_REV_MAJ_AR2313) {
-+ predivide_mask = AR2313_CLOCKCTL1_PREDIVIDE_MASK;
-+ predivide_shift = AR2313_CLOCKCTL1_PREDIVIDE_SHIFT;
-+ multiplier_mask = AR2313_CLOCKCTL1_MULTIPLIER_MASK;
-+ multiplier_shift = AR2313_CLOCKCTL1_MULTIPLIER_SHIFT;
-+ doubler_mask = AR2313_CLOCKCTL1_DOUBLER_MASK;
-+ } else { /* AR5312 and AR2312 */
-+ predivide_mask = AR5312_CLOCKCTL1_PREDIVIDE_MASK;
-+ predivide_shift = AR5312_CLOCKCTL1_PREDIVIDE_SHIFT;
-+ multiplier_mask = AR5312_CLOCKCTL1_MULTIPLIER_MASK;
-+ multiplier_shift = AR5312_CLOCKCTL1_MULTIPLIER_SHIFT;
-+ doubler_mask = AR5312_CLOCKCTL1_DOUBLER_MASK;
-+ }
-+
-+ /*
-+ * Clocking is derived from a fixed 40MHz input clock.
-+ *
-+ * cpuFreq = InputClock * MULT (where MULT is PLL multiplier)
-+ * sysFreq = cpuFreq / 4 (used for APB clock, serial,
-+ * flash, Timer, Watchdog Timer)
-+ *
-+ * cntFreq = cpuFreq / 2 (use for CPU count/compare)
-+ *
-+ * So, for example, with a PLL multiplier of 5, we have
-+ *
-+ * cpuFreq = 200MHz
-+ * sysFreq = 50MHz
-+ * cntFreq = 100MHz
-+ *
-+ * We compute the CPU frequency, based on PLL settings.
-+ */
-+
-+ clockCtl1 = ar231x_read_reg(AR5312_CLOCKCTL1);
-+ preDivideSelect = (clockCtl1 & predivide_mask) >> predivide_shift;
-+ preDivisor = CLOCKCTL1_PREDIVIDE_TABLE[preDivideSelect];
-+ multiplier = (clockCtl1 & multiplier_mask) >> multiplier_shift;
-+
-+ if (clockCtl1 & doubler_mask) {
-+ multiplier = multiplier << 1;
-+ }
-+ return (40000000 / preDivisor) * multiplier;
-+}
-+
-+static inline int
-+ar5312_sys_frequency(void)
-+{
-+ return ar5312_cpu_frequency() / 4;
-+}
-+
-+void __init
-+ar5312_time_init(void)
-+{
-+ if (!is_5312())
-+ return;
-+
-+ mips_hpt_frequency = ar5312_cpu_frequency() / 2;
-+}
-+
-+
-+void __init
-+ar5312_prom_init(void)
-+{
-+ u32 memsize, memcfg, bank0AC, bank1AC;
-+ u32 devid;
-+
-+ if (!is_5312())
-+ return;
-+
-+ /* Detect memory size */
-+ memcfg = ar231x_read_reg(AR531X_MEM_CFG1);
-+ bank0AC = (memcfg & MEM_CFG1_AC0) >> MEM_CFG1_AC0_S;
-+ bank1AC = (memcfg & MEM_CFG1_AC1) >> MEM_CFG1_AC1_S;
-+ memsize = (bank0AC ? (1 << (bank0AC+1)) : 0)
-+ + (bank1AC ? (1 << (bank1AC+1)) : 0);
-+ memsize <<= 20;
-+ add_memory_region(0, memsize, BOOT_MEM_RAM);
-+
-+ devid = ar231x_read_reg(AR531X_REV);
-+ devid >>= AR531X_REV_WMAC_MIN_S;
-+ devid &= AR531X_REV_CHIP;
-+ ar231x_board.devid = (u16) devid;
-+ ar231x_gpiodev = &ar5312_gpiodev;
-+}
-+
-+void __init
-+ar5312_plat_setup(void)
-+{
-+ if (!is_5312())
-+ return;
-+
-+ /* Clear any lingering AHB errors */
-+ ar231x_read_reg(AR531X_PROCADDR);
-+ ar231x_read_reg(AR531X_DMAADDR);
-+ ar231x_write_reg(AR531X_WD_CTRL, AR531X_WD_CTRL_IGNORE_EXPIRATION);
-+
-+ _machine_restart = ar5312_restart;
-+ ar231x_serial_setup(KSEG1ADDR(AR531X_UART0), ar5312_sys_frequency());
-+}
-+
---- /dev/null
-+++ b/arch/mips/ar231x/ar2315.c
-@@ -0,0 +1,658 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2003 Atheros Communications, Inc., All Rights Reserved.
-+ * Copyright (C) 2006 FON Technology, SL.
-+ * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
-+ */
-+
-+/*
-+ * Platform devices for Atheros SoCs
-+ */
-+
-+#include <generated/autoconf.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/string.h>
-+#include <linux/platform_device.h>
-+#include <linux/kernel.h>
-+#include <linux/reboot.h>
-+#include <linux/delay.h>
-+#include <linux/leds.h>
-+#include <asm/bootinfo.h>
-+#include <asm/reboot.h>
-+#include <asm/time.h>
-+#include <asm/irq.h>
-+#include <asm/io.h>
-+#include <asm/gpio.h>
-+
-+#include <ar231x_platform.h>
-+#include <ar2315_regs.h>
-+#include <ar231x.h>
-+#include "devices.h"
-+#include "ar2315.h"
-+
-+static u32 gpiointmask = 0, gpiointval = 0;
-+
-+static inline void ar2315_gpio_irq(void)
-+{
-+ u32 pend;
-+ int bit = -1;
-+
-+ /* only do one gpio interrupt at a time */
-+ pend = (ar231x_read_reg(AR2315_GPIO_DI) ^ gpiointval) & gpiointmask;
-+
-+ if (pend) {
-+ bit = fls(pend) - 1;
-+ pend &= ~(1 << bit);
-+ gpiointval ^= (1 << bit);
-+ }
-+
-+ if (!pend)
-+ ar231x_write_reg(AR2315_ISR, AR2315_ISR_GPIO);
-+
-+ /* Enable interrupt with edge detection */
-+ if ((ar231x_read_reg(AR2315_GPIO_CR) & AR2315_GPIO_CR_M(bit)) != AR2315_GPIO_CR_I(bit))
-+ return;
-+
-+ if (bit >= 0)
-+ do_IRQ(AR531X_GPIO_IRQ_BASE + bit);
-+}
-+
-+
-+/*
-+ * Called when an interrupt is received, this function
-+ * determines exactly which interrupt it was, and it
-+ * invokes the appropriate handler.
-+ *
-+ * Implicitly, we also define interrupt priority by
-+ * choosing which to dispatch first.
-+ */
-+static asmlinkage void
-+ar2315_irq_dispatch(void)
-+{
-+ int pending = read_c0_status() & read_c0_cause();
-+
-+ if (pending & CAUSEF_IP3)
-+ do_IRQ(AR2315_IRQ_WLAN0_INTRS);
-+ else if (pending & CAUSEF_IP4)
-+ do_IRQ(AR2315_IRQ_ENET0_INTRS);
-+ else if (pending & CAUSEF_IP2) {
-+ unsigned int misc_intr = ar231x_read_reg(AR2315_ISR) & ar231x_read_reg(AR2315_IMR);
-+
-+ if (misc_intr & AR2315_ISR_SPI)
-+ do_IRQ(AR531X_MISC_IRQ_SPI);
-+ else if (misc_intr & AR2315_ISR_TIMER)
-+ do_IRQ(AR531X_MISC_IRQ_TIMER);
-+ else if (misc_intr & AR2315_ISR_AHB)
-+ do_IRQ(AR531X_MISC_IRQ_AHB_PROC);
-+ else if (misc_intr & AR2315_ISR_GPIO)
-+ ar2315_gpio_irq();
-+ else if (misc_intr & AR2315_ISR_UART0)
-+ do_IRQ(AR531X_MISC_IRQ_UART0);
-+ else if (misc_intr & AR2315_ISR_WD)
-+ do_IRQ(AR531X_MISC_IRQ_WATCHDOG);
-+ else
-+ do_IRQ(AR531X_MISC_IRQ_NONE);
-+ } else if (pending & CAUSEF_IP7)
-+ do_IRQ(AR531X_IRQ_CPU_CLOCK);
-+}
-+
-+static void ar2315_set_gpiointmask(int gpio, int level)
-+{
-+ u32 reg;
-+
-+ reg = ar231x_read_reg(AR2315_GPIO_INT);
-+ reg &= ~(AR2315_GPIO_INT_M | AR2315_GPIO_INT_LVL_M);
-+ reg |= gpio | AR2315_GPIO_INT_LVL(level);
-+ ar231x_write_reg(AR2315_GPIO_INT, reg);
-+}
-+
-+static void ar2315_gpio_intr_enable(unsigned int irq)
-+{
-+ unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE;
-+
-+ /* Enable interrupt with edge detection */
-+ if ((ar231x_read_reg(AR2315_GPIO_CR) & AR2315_GPIO_CR_M(gpio)) != AR2315_GPIO_CR_I(gpio))
-+ return;
-+
-+ gpiointmask |= (1 << gpio);
-+ ar2315_set_gpiointmask(gpio, 3);
-+}
-+
-+static unsigned int ar2315_gpio_intr_startup(unsigned int irq)
-+{
-+ unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE;
-+
-+ /* reconfigure GPIO line as input */
-+ ar231x_mask_reg(AR2315_GPIO_CR, AR2315_GPIO_CR_M(gpio), AR2315_GPIO_CR_I(gpio));
-+ ar2315_gpio_intr_enable(irq);
-+ return 0;
-+}
-+
-+static void ar2315_gpio_intr_disable(unsigned int irq)
-+{
-+ unsigned int gpio = irq - AR531X_GPIO_IRQ_BASE;
-+
-+ /* Disable interrupt */
-+ gpiointmask &= ~(1 << gpio);
-+ ar2315_set_gpiointmask(gpio, 0);
-+}
-+
-+static void
-+ar2315_gpio_intr_end(unsigned int irq)
-+{
-+ if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
-+ ar2315_gpio_intr_enable(irq);
-+}
-+
-+static struct irq_chip ar2315_gpio_intr_controller = {
-+ .typename = "AR2315-GPIO",
-+ .startup = ar2315_gpio_intr_startup,
-+ .ack = ar2315_gpio_intr_disable,
-+ .mask_ack = ar2315_gpio_intr_disable,
-+ .mask = ar2315_gpio_intr_disable,
-+ .unmask = ar2315_gpio_intr_enable,
-+ .end = ar2315_gpio_intr_end,
-+};
-+
-+static void
-+ar2315_misc_intr_enable(unsigned int irq)
-+{
-+ unsigned int imr;
-+
-+ imr = ar231x_read_reg(AR2315_IMR);
-+ switch(irq) {
-+ case AR531X_MISC_IRQ_SPI:
-+ imr |= AR2315_ISR_SPI;
-+ break;
-+ case AR531X_MISC_IRQ_TIMER:
-+ imr |= AR2315_ISR_TIMER;
-+ break;
-+ case AR531X_MISC_IRQ_AHB_PROC:
-+ imr |= AR2315_ISR_AHB;
-+ break;
-+ case AR531X_MISC_IRQ_GPIO:
-+ imr |= AR2315_ISR_GPIO;
-+ break;
-+ case AR531X_MISC_IRQ_UART0:
-+ imr |= AR2315_ISR_UART0;
-+ break;
-+ case AR531X_MISC_IRQ_WATCHDOG:
-+ imr |= AR2315_ISR_WD;
-+ break;
-+ default:
-+ break;
-+ }
-+ ar231x_write_reg(AR2315_IMR, imr);
-+}
-+
-+static void
-+ar2315_misc_intr_disable(unsigned int irq)
-+{
-+ unsigned int imr;
-+
-+ imr = ar231x_read_reg(AR2315_IMR);
-+ switch(irq) {
-+ case AR531X_MISC_IRQ_SPI:
-+ imr &= ~AR2315_ISR_SPI;
-+ break;
-+ case AR531X_MISC_IRQ_TIMER:
-+ imr &= ~AR2315_ISR_TIMER;
-+ break;
-+ case AR531X_MISC_IRQ_AHB_PROC:
-+ imr &= ~AR2315_ISR_AHB;
-+ break;
-+ case AR531X_MISC_IRQ_GPIO:
-+ imr &= ~AR2315_ISR_GPIO;
-+ break;
-+ case AR531X_MISC_IRQ_UART0:
-+ imr &= ~AR2315_ISR_UART0;
-+ break;
-+ case AR531X_MISC_IRQ_WATCHDOG:
-+ imr &= ~AR2315_ISR_WD;
-+ break;
-+ default:
-+ break;
-+ }
-+ ar231x_write_reg(AR2315_IMR, imr);
-+}
-+
-+static void
-+ar2315_misc_intr_end(unsigned int irq)
-+{
-+ if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
-+ ar2315_misc_intr_enable(irq);
-+}
-+
-+
-+static struct irq_chip ar2315_misc_intr_controller = {
-+ .typename = "AR2315-MISC",
-+ .ack = ar2315_misc_intr_disable,
-+ .mask_ack = ar2315_misc_intr_disable,
-+ .mask = ar2315_misc_intr_disable,
-+ .unmask = ar2315_misc_intr_enable,
-+ .end = ar2315_misc_intr_end,
-+};
-+
-+static irqreturn_t ar2315_ahb_proc_handler(int cpl, void *dev_id)
-+{
-+ ar231x_write_reg(AR2315_AHB_ERR0, AHB_ERROR_DET);
-+ ar231x_read_reg(AR2315_AHB_ERR1);
-+
-+ printk(KERN_ERR "AHB fatal error\n");
-+ machine_restart("AHB error"); /* Catastrophic failure */
-+
-+ return IRQ_HANDLED;
-+}
-+
-+static struct irqaction ar2315_ahb_proc_interrupt = {
-+ .handler = ar2315_ahb_proc_handler,
-+ .flags = IRQF_DISABLED,
-+ .name = "ar2315_ahb_proc_interrupt",
-+};
-+
-+static struct irqaction cascade = {
-+ .handler = no_action,
-+ .flags = IRQF_DISABLED,
-+ .name = "cascade",
-+};
-+
-+void
-+ar2315_irq_init(void)
-+{
-+ int i;
-+
-+ if (!is_2315())
-+ return;
-+
-+ ar231x_irq_dispatch = ar2315_irq_dispatch;
-+ gpiointval = ar231x_read_reg(AR2315_GPIO_DI);
-+ for (i = 0; i < AR531X_MISC_IRQ_COUNT; i++) {
-+ int irq = AR531X_MISC_IRQ_BASE + i;
-+ set_irq_chip_and_handler(irq, &ar2315_misc_intr_controller,
-+ handle_level_irq);
-+ }
-+ for (i = 0; i < AR531X_GPIO_IRQ_COUNT; i++) {
-+ int irq = AR531X_GPIO_IRQ_BASE + i;
-+ set_irq_chip_and_handler(irq, &ar2315_gpio_intr_controller,
-+ handle_level_irq);
-+ }
-+ setup_irq(AR531X_MISC_IRQ_GPIO, &cascade);
-+ setup_irq(AR531X_MISC_IRQ_AHB_PROC, &ar2315_ahb_proc_interrupt);
-+ setup_irq(AR2315_IRQ_MISC_INTRS, &cascade);
-+}
-+
-+const struct ar231x_gpiodev ar2315_gpiodev;
-+
-+static u32
-+ar2315_gpio_get_output(void)
-+{
-+ u32 reg;
-+ reg = ar231x_read_reg(AR2315_GPIO_CR);
-+ reg &= ar2315_gpiodev.valid_mask;
-+ return reg;
-+}
-+
-+static u32
-+ar2315_gpio_set_output(u32 mask, u32 val)
-+{
-+ u32 reg;
-+
-+ reg = ar231x_read_reg(AR2315_GPIO_CR);
-+ reg &= ~mask;
-+ reg |= val;
-+ ar231x_write_reg(AR2315_GPIO_CR, reg);
-+ return reg;
-+}
-+
-+static u32
-+ar2315_gpio_get(void)
-+{
-+ u32 reg;
-+ reg = ar231x_read_reg(AR2315_GPIO_DI);
-+ reg &= ar2315_gpiodev.valid_mask;
-+ return reg;
-+}
-+
-+static u32
-+ar2315_gpio_set(u32 mask, u32 value)
-+{
-+ u32 reg;
-+ reg = ar231x_read_reg(AR2315_GPIO_DO);
-+ reg &= ~mask;
-+ reg |= value;
-+ ar231x_write_reg(AR2315_GPIO_DO, reg);
-+ return reg;
-+}
-+
-+const struct ar231x_gpiodev ar2315_gpiodev = {
-+ .valid_mask = (1 << 22) - 1,
-+ .get_output = ar2315_gpio_get_output,
-+ .set_output = ar2315_gpio_set_output,
-+ .get = ar2315_gpio_get,
-+ .set = ar2315_gpio_set,
-+};
-+
-+static struct ar231x_eth ar2315_eth_data = {
-+ .reset_base = AR2315_RESET,
-+ .reset_mac = AR2315_RESET_ENET0,
-+ .reset_phy = AR2315_RESET_EPHY0,
-+ .phy_base = AR2315_ENET0,
-+ .config = &ar231x_board,
-+};
-+
-+static struct resource ar2315_spiflash_res[] = {
-+ {
-+ .name = "flash_base",
-+ .flags = IORESOURCE_MEM,
-+ .start = KSEG1ADDR(AR2315_SPI_READ),
-+ .end = KSEG1ADDR(AR2315_SPI_READ) + 0x1000000 - 1,
-+ },
-+ {
-+ .name = "flash_regs",
-+ .flags = IORESOURCE_MEM,
-+ .start = 0x11300000,
-+ .end = 0x11300012,
-+ },
-+};
-+
-+static struct platform_device ar2315_spiflash = {
-+ .id = 0,
-+ .name = "spiflash",
-+ .resource = ar2315_spiflash_res,
-+ .num_resources = ARRAY_SIZE(ar2315_spiflash_res)
-+};
-+
-+static struct platform_device ar2315_wdt = {
-+ .id = 0,
-+ .name = "ar2315_wdt",
-+};
-+
-+#define SPI_FLASH_CTL 0x00
-+#define SPI_FLASH_OPCODE 0x04
-+#define SPI_FLASH_DATA 0x08
-+
-+static inline u32
-+spiflash_read_reg(int reg)
-+{
-+ return ar231x_read_reg(KSEG1ADDR(AR2315_SPI) + reg);
-+}
-+
-+static inline void
-+spiflash_write_reg(int reg, u32 data)
-+{
-+ ar231x_write_reg(KSEG1ADDR(AR2315_SPI) + reg, data);
-+}
-+
-+static u32
-+spiflash_wait_status(void)
-+{
-+ u32 reg;
-+
-+ do {
-+ reg = spiflash_read_reg(SPI_FLASH_CTL);
-+ } while (reg & SPI_CTL_BUSY);
-+
-+ return reg;
-+}
-+
-+static u8
-+spiflash_probe(void)
-+{
-+ u32 reg;
-+
-+ reg = spiflash_wait_status();
-+ reg &= ~SPI_CTL_TX_RX_CNT_MASK;
-+ reg |= (1 << 4) | 4 | SPI_CTL_START;
-+
-+ spiflash_write_reg(SPI_FLASH_OPCODE, 0xab);
-+ spiflash_write_reg(SPI_FLASH_CTL, reg);
-+
-+ reg = spiflash_wait_status();
-+ reg = spiflash_read_reg(SPI_FLASH_DATA);
-+ reg &= 0xff;
-+
-+ return (u8) reg;
-+}
-+
-+
-+#define STM_8MBIT_SIGNATURE 0x13
-+#define STM_16MBIT_SIGNATURE 0x14
-+#define STM_32MBIT_SIGNATURE 0x15
-+#define STM_64MBIT_SIGNATURE 0x16
-+#define STM_128MBIT_SIGNATURE 0x17
-+
-+static u8 __init *
-+ar2315_flash_limit(void)
-+{
-+ u32 flash_size = 0;
-+
-+ /* probe the flash chip size */
-+ switch(spiflash_probe()) {
-+ case STM_8MBIT_SIGNATURE:
-+ flash_size = 0x00100000;
-+ break;
-+ case STM_16MBIT_SIGNATURE:
-+ flash_size = 0x00200000;
-+ break;
-+ case STM_32MBIT_SIGNATURE:
-+ flash_size = 0x00400000;
-+ break;
-+ case STM_64MBIT_SIGNATURE:
-+ flash_size = 0x00800000;
-+ break;
-+ case STM_128MBIT_SIGNATURE:
-+ flash_size = 0x01000000;
-+ break;
-+ }
-+
-+ ar2315_spiflash_res[0].end = ar2315_spiflash_res[0].start +
-+ flash_size - 1;
-+ return (u8 *) ar2315_spiflash_res[0].end + 1;
-+}
-+
-+#ifdef CONFIG_LEDS_GPIO
-+static struct gpio_led ar2315_leds[6];
-+static struct gpio_led_platform_data ar2315_led_data = {
-+ .leds = (void *) ar2315_leds,
-+};
-+
-+static struct platform_device ar2315_gpio_leds = {
-+ .name = "leds-gpio",
-+ .id = -1,
-+ .dev = {
-+ .platform_data = (void *) &ar2315_led_data,
-+ }
-+};
-+
-+static void __init
-+ar2315_init_gpio(void)
-+{
-+ static char led_names[6][6];
-+ int i, led = 0;
-+
-+ ar2315_led_data.num_leds = 0;
-+ for(i = 1; i < 8; i++)
-+ {
-+ if((i == AR2315_RESET_GPIO) ||
-+ (i == ar231x_board.config->resetConfigGpio))
-+ continue;
-+
-+ if(i == ar231x_board.config->sysLedGpio)
-+ strcpy(led_names[led], "wlan");
-+ else
-+ sprintf(led_names[led], "gpio%d", i);
-+
-+ ar2315_leds[led].name = led_names[led];
-+ ar2315_leds[led].gpio = i;
-+ ar2315_leds[led].active_low = 0;
-+ led++;
-+ }
-+ ar2315_led_data.num_leds = led;
-+ platform_device_register(&ar2315_gpio_leds);
-+}
-+#else
-+static inline void ar2315_init_gpio(void)
-+{
-+}
-+#endif
-+
-+int __init
-+ar2315_init_devices(void)
-+{
-+ if (!is_2315())
-+ return 0;
-+
-+ /* Find board configuration */
-+ ar231x_find_config(ar2315_flash_limit());
-+ ar2315_eth_data.macaddr = ar231x_board.config->enet0_mac;
-+
-+ ar2315_init_gpio();
-+ platform_device_register(&ar2315_wdt);
-+ platform_device_register(&ar2315_spiflash);
-+ ar231x_add_ethernet(0, AR2315_ENET0, AR2315_IRQ_ENET0_INTRS,
-+ &ar2315_eth_data);
-+ ar231x_add_wmac(0, AR2315_WLAN0, AR2315_IRQ_WLAN0_INTRS);
-+
-+ return 0;
-+}
-+
-+static void
-+ar2315_restart(char *command)
-+{
-+ void (*mips_reset_vec)(void) = (void *) 0xbfc00000;
-+
-+ local_irq_disable();
-+
-+ /* try reset the system via reset control */
-+ ar231x_write_reg(AR2315_COLD_RESET,AR2317_RESET_SYSTEM);
-+
-+ /* Cold reset does not work on the AR2315/6, use the GPIO reset bits a workaround.
-+ * give it some time to attempt a gpio based hardware reset
-+ * (atheros reference design workaround) */
-+ gpio_direction_output(AR2315_RESET_GPIO, 0);
-+ mdelay(100);
-+
-+ /* Some boards (e.g. Senao EOC-2610) don't implement the reset logic
-+ * workaround. Attempt to jump to the mips reset location -
-+ * the boot loader itself might be able to recover the system */
-+ mips_reset_vec();
-+}
-+
-+
-+/*
-+ * This table is indexed by bits 5..4 of the CLOCKCTL1 register
-+ * to determine the predevisor value.
-+ */
-+static int __initdata CLOCKCTL1_PREDIVIDE_TABLE[4] = { 1, 2, 4, 5 };
-+static int __initdata PLLC_DIVIDE_TABLE[5] = { 2, 3, 4, 6, 3 };
-+
-+static unsigned int __init
-+ar2315_sys_clk(unsigned int clockCtl)
-+{
-+ unsigned int pllcCtrl,cpuDiv;
-+ unsigned int pllcOut,refdiv,fdiv,divby2;
-+ unsigned int clkDiv;
-+
-+ pllcCtrl = ar231x_read_reg(AR2315_PLLC_CTL);
-+ refdiv = (pllcCtrl & PLLC_REF_DIV_M) >> PLLC_REF_DIV_S;
-+ refdiv = CLOCKCTL1_PREDIVIDE_TABLE[refdiv];
-+ fdiv = (pllcCtrl & PLLC_FDBACK_DIV_M) >> PLLC_FDBACK_DIV_S;
-+ divby2 = (pllcCtrl & PLLC_ADD_FDBACK_DIV_M) >> PLLC_ADD_FDBACK_DIV_S;
-+ divby2 += 1;
-+ pllcOut = (40000000/refdiv)*(2*divby2)*fdiv;
-+
-+
-+ /* clkm input selected */
-+ switch(clockCtl & CPUCLK_CLK_SEL_M) {
-+ case 0:
-+ case 1:
-+ clkDiv = PLLC_DIVIDE_TABLE[(pllcCtrl & PLLC_CLKM_DIV_M) >> PLLC_CLKM_DIV_S];
-+ break;
-+ case 2:
-+ clkDiv = PLLC_DIVIDE_TABLE[(pllcCtrl & PLLC_CLKC_DIV_M) >> PLLC_CLKC_DIV_S];
-+ break;
-+ default:
-+ pllcOut = 40000000;
-+ clkDiv = 1;
-+ break;
-+ }
-+ cpuDiv = (clockCtl & CPUCLK_CLK_DIV_M) >> CPUCLK_CLK_DIV_S;
-+ cpuDiv = cpuDiv * 2 ?: 1;
-+ return (pllcOut/(clkDiv * cpuDiv));
-+}
-+
-+static inline unsigned int
-+ar2315_cpu_frequency(void)
-+{
-+ return ar2315_sys_clk(ar231x_read_reg(AR2315_CPUCLK));
-+}
-+
-+static inline unsigned int
-+ar2315_apb_frequency(void)
-+{
-+ return ar2315_sys_clk(ar231x_read_reg(AR2315_AMBACLK));
-+}
-+
-+void __init
-+ar2315_time_init(void)
-+{
-+ if (!is_2315())
-+ return;
-+
-+ mips_hpt_frequency = ar2315_cpu_frequency() / 2;
-+}
-+
-+void __init
-+ar2315_prom_init(void)
-+{
-+ u32 memsize, memcfg, devid;
-+
-+ if (!is_2315())
-+ return;
-+
-+ memcfg = ar231x_read_reg(AR2315_MEM_CFG);
-+ memsize = 1 + ((memcfg & SDRAM_DATA_WIDTH_M) >> SDRAM_DATA_WIDTH_S);
-+ memsize <<= 1 + ((memcfg & SDRAM_COL_WIDTH_M) >> SDRAM_COL_WIDTH_S);
-+ memsize <<= 1 + ((memcfg & SDRAM_ROW_WIDTH_M) >> SDRAM_ROW_WIDTH_S);
-+ memsize <<= 3;
-+ add_memory_region(0, memsize, BOOT_MEM_RAM);
-+
-+ /* Detect the hardware based on the device ID */
-+ devid = ar231x_read_reg(AR2315_SREV) & AR2315_REV_CHIP;
-+ switch(devid) {
-+ case 0x90:
-+ case 0x91:
-+ ar231x_devtype = DEV_TYPE_AR2317;
-+ break;
-+ default:
-+ ar231x_devtype = DEV_TYPE_AR2315;
-+ break;
-+ }
-+ ar231x_gpiodev = &ar2315_gpiodev;
-+ ar231x_board.devid = devid;
-+}
-+
-+void __init
-+ar2315_plat_setup(void)
-+{
-+ u32 config;
-+
-+ if (!is_2315())
-+ return;
-+
-+ /* Clear any lingering AHB errors */
-+ config = read_c0_config();
-+ write_c0_config(config & ~0x3);
-+ ar231x_write_reg(AR2315_AHB_ERR0,AHB_ERROR_DET);
-+ ar231x_read_reg(AR2315_AHB_ERR1);
-+ ar231x_write_reg(AR2315_WDC, AR2315_WDC_IGNORE_EXPIRATION);
-+
-+ _machine_restart = ar2315_restart;
-+ ar231x_serial_setup(KSEG1ADDR(AR2315_UART0), ar2315_apb_frequency());
-+}
---- /dev/null
-+++ b/arch/mips/ar231x/ar2315.h
-@@ -0,0 +1,37 @@
-+#ifndef __AR2315_H
-+#define __AR2315_H
-+
-+#ifdef CONFIG_ATHEROS_AR2315
-+
-+extern void ar2315_irq_init(void);
-+extern int ar2315_init_devices(void);
-+extern void ar2315_prom_init(void);
-+extern void ar2315_plat_setup(void);
-+extern void ar2315_time_init(void);
-+
-+#else
-+
-+static inline void ar2315_irq_init(void)
-+{
-+}
-+
-+static inline int ar2315_init_devices(void)
-+{
-+ return 0;
-+}
-+
-+static inline void ar2315_prom_init(void)
-+{
-+}
-+
-+static inline void ar2315_plat_setup(void)
-+{
-+}
-+
-+static inline void ar2315_time_init(void)
-+{
-+}
-+
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/arch/mips/ar231x/ar5312.h
-@@ -0,0 +1,38 @@
-+#ifndef __AR5312_H
-+#define __AR5312_H
-+
-+#ifdef CONFIG_ATHEROS_AR5312
-+
-+extern void ar5312_irq_init(void);
-+extern int ar5312_init_devices(void);
-+extern void ar5312_prom_init(void);
-+extern void ar5312_plat_setup(void);
-+extern void ar5312_time_init(void);
-+extern void ar5312_time_init(void);
-+
-+#else
-+
-+static inline void ar5312_irq_init(void)
-+{
-+}
-+
-+static inline int ar5312_init_devices(void)
-+{
-+ return 0;
-+}
-+
-+static inline void ar5312_prom_init(void)
-+{
-+}
-+
-+static inline void ar5312_plat_setup(void)
-+{
-+}
-+
-+static inline void ar5312_time_init(void)
-+{
-+}
-+
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ar231x/ar231x.h
-@@ -0,0 +1,54 @@
-+#ifndef __AR531X_H
-+#define __AR531X_H
-+
-+#define AR531X_MISC_IRQ_BASE 0x20
-+#define AR531X_GPIO_IRQ_BASE 0x30
-+
-+/* Software's idea of interrupts handled by "CPU Interrupt Controller" */
-+#define AR531X_IRQ_NONE MIPS_CPU_IRQ_BASE+0
-+#define AR531X_IRQ_CPU_CLOCK MIPS_CPU_IRQ_BASE+7 /* C0_CAUSE: 0x8000 */
-+
-+/* Miscellaneous interrupts, which share IP6 */
-+#define AR531X_MISC_IRQ_NONE AR531X_MISC_IRQ_BASE+0
-+#define AR531X_MISC_IRQ_TIMER AR531X_MISC_IRQ_BASE+1
-+#define AR531X_MISC_IRQ_AHB_PROC AR531X_MISC_IRQ_BASE+2
-+#define AR531X_MISC_IRQ_AHB_DMA AR531X_MISC_IRQ_BASE+3
-+#define AR531X_MISC_IRQ_GPIO AR531X_MISC_IRQ_BASE+4
-+#define AR531X_MISC_IRQ_UART0 AR531X_MISC_IRQ_BASE+5
-+#define AR531X_MISC_IRQ_UART0_DMA AR531X_MISC_IRQ_BASE+6
-+#define AR531X_MISC_IRQ_WATCHDOG AR531X_MISC_IRQ_BASE+7
-+#define AR531X_MISC_IRQ_LOCAL AR531X_MISC_IRQ_BASE+8
-+#define AR531X_MISC_IRQ_SPI AR531X_MISC_IRQ_BASE+9
-+#define AR531X_MISC_IRQ_COUNT 10
-+
-+/* GPIO Interrupts [0..7], share AR531X_MISC_IRQ_GPIO */
-+#define AR531X_GPIO_IRQ_NONE AR531X_GPIO_IRQ_BASE+0
-+#define AR531X_GPIO_IRQ(n) AR531X_GPIO_IRQ_BASE+n
-+#define AR531X_GPIO_IRQ_COUNT 22
-+
-+static inline u32
-+ar231x_read_reg(u32 reg)
-+{
-+ return __raw_readl((u32 *) KSEG1ADDR(reg));
-+}
-+
-+static inline void
-+ar231x_write_reg(u32 reg, u32 val)
-+{
-+ __raw_writel(val, (u32 *) KSEG1ADDR(reg));
-+}
-+
-+static inline u32
-+ar231x_mask_reg(u32 reg, u32 mask, u32 val)
-+{
-+ u32 ret;
-+
-+ ret = ar231x_read_reg(reg);
-+ ret &= ~mask;
-+ ret |= val;
-+ ar231x_write_reg(reg, ret);
-+
-+ return ret;
-+}
-+
-+#endif
---- /dev/null
-+++ b/arch/mips/ar231x/devices.h
-@@ -0,0 +1,37 @@
-+#ifndef __AR231X_DEVICES_H
-+#define __AR231X_DEVICES_H
-+
-+enum {
-+ /* handled by ar5312.c */
-+ DEV_TYPE_AR2312,
-+ DEV_TYPE_AR2313,
-+ DEV_TYPE_AR5312,
-+
-+ /* handled by ar2315.c */
-+ DEV_TYPE_AR2315,
-+ DEV_TYPE_AR2316,
-+ DEV_TYPE_AR2317,
-+
-+ DEV_TYPE_UNKNOWN
-+};
-+
-+extern int ar231x_devtype;
-+extern struct ar231x_board_config ar231x_board;
-+extern asmlinkage void (*ar231x_irq_dispatch)(void);
-+
-+extern int ar231x_find_config(u8 *flash_limit);
-+extern void ar231x_serial_setup(u32 mapbase, unsigned int uartclk);
-+extern int ar231x_add_wmac(int nr, u32 base, int irq);
-+extern int ar231x_add_ethernet(int nr, u32 base, int irq, void *pdata);
-+
-+static inline bool is_2315(void)
-+{
-+ return (current_cpu_data.cputype == CPU_4KEC);
-+}
-+
-+static inline bool is_5312(void)
-+{
-+ return !is_2315();
-+}
-+
-+#endif
---- /dev/null
-+++ b/arch/mips/ar231x/devices.c
-@@ -0,0 +1,175 @@
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/serial.h>
-+#include <linux/serial_core.h>
-+#include <linux/serial_8250.h>
-+#include <linux/platform_device.h>
-+#include <ar231x_platform.h>
-+#include <ar231x.h>
-+#include "devices.h"
-+#include "ar5312.h"
-+#include "ar2315.h"
-+
-+struct ar231x_board_config ar231x_board;
-+int ar231x_devtype = DEV_TYPE_UNKNOWN;
-+const struct ar231x_gpiodev *ar231x_gpiodev;
-+EXPORT_SYMBOL(ar231x_gpiodev);
-+
-+static struct resource ar231x_eth0_res[] = {
-+ {
-+ .name = "eth0_membase",
-+ .flags = IORESOURCE_MEM,
-+ },
-+ {
-+ .name = "eth0_irq",
-+ .flags = IORESOURCE_IRQ,
-+ }
-+};
-+
-+static struct resource ar231x_eth1_res[] = {
-+ {
-+ .name = "eth1_membase",
-+ .flags = IORESOURCE_MEM,
-+ },
-+ {
-+ .name = "eth1_irq",
-+ .flags = IORESOURCE_IRQ,
-+ }
-+};
-+
-+static struct platform_device ar231x_eth[] = {
-+ {
-+ .id = 0,
-+ .name = "ar231x-eth",
-+ .resource = ar231x_eth0_res,
-+ .num_resources = ARRAY_SIZE(ar231x_eth0_res)
-+ },
-+ {
-+ .id = 1,
-+ .name = "ar231x-eth",
-+ .resource = ar231x_eth1_res,
-+ .num_resources = ARRAY_SIZE(ar231x_eth1_res)
-+ }
-+};
-+
-+static struct resource ar231x_wmac0_res[] = {
-+ {
-+ .name = "wmac0_membase",
-+ .flags = IORESOURCE_MEM,
-+ },
-+ {
-+ .name = "wmac0_irq",
-+ .flags = IORESOURCE_IRQ,
-+ }
-+};
-+
-+static struct resource ar231x_wmac1_res[] = {
-+ {
-+ .name = "wmac1_membase",
-+ .flags = IORESOURCE_MEM,
-+ },
-+ {
-+ .name = "wmac1_irq",
-+ .flags = IORESOURCE_IRQ,
-+ }
-+};
-+
-+
-+static struct platform_device ar231x_wmac[] = {
-+ {
-+ .id = 0,
-+ .name = "ar231x-wmac",
-+ .resource = ar231x_wmac0_res,
-+ .num_resources = ARRAY_SIZE(ar231x_wmac0_res),
-+ .dev.platform_data = &ar231x_board,
-+ },
-+ {
-+ .id = 1,
-+ .name = "ar231x-wmac",
-+ .resource = ar231x_wmac1_res,
-+ .num_resources = ARRAY_SIZE(ar231x_wmac1_res),
-+ .dev.platform_data = &ar231x_board,
-+ },
-+};
-+
-+static const char *devtype_strings[] = {
-+ [DEV_TYPE_AR5312] = "Atheros AR5312",
-+ [DEV_TYPE_AR2312] = "Atheros AR2312",
-+ [DEV_TYPE_AR2313] = "Atheros AR2313",
-+ [DEV_TYPE_AR2315] = "Atheros AR2315",
-+ [DEV_TYPE_AR2316] = "Atheros AR2316",
-+ [DEV_TYPE_AR2317] = "Atheros AR2317",
-+ [DEV_TYPE_UNKNOWN] = "Atheros (unknown)",
-+};
-+
-+const char *get_system_type(void)
-+{
-+ if ((ar231x_devtype >= ARRAY_SIZE(devtype_strings)) ||
-+ !devtype_strings[ar231x_devtype])
-+ return devtype_strings[DEV_TYPE_UNKNOWN];
-+ return devtype_strings[ar231x_devtype];
-+}
-+
-+
-+int __init
-+ar231x_add_ethernet(int nr, u32 base, int irq, void *pdata)
-+{
-+ struct resource *res;
-+
-+ ar231x_eth[nr].dev.platform_data = pdata;
-+ res = &ar231x_eth[nr].resource[0];
-+ res->start = base;
-+ res->end = base + 0x2000 - 1;
-+ res++;
-+ res->start = irq;
-+ res->end = irq;
-+ return platform_device_register(&ar231x_eth[nr]);
-+}
-+
-+void __init
-+ar231x_serial_setup(u32 mapbase, unsigned int uartclk)
-+{
-+ struct uart_port s;
-+
-+ memset(&s, 0, sizeof(s));
-+
-+ s.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
-+ s.iotype = UPIO_MEM;
-+ s.irq = AR531X_MISC_IRQ_UART0;
-+ s.regshift = 2;
-+ s.mapbase = mapbase;
-+ s.uartclk = uartclk;
-+ s.membase = (void __iomem *)s.mapbase;
-+
-+ early_serial_setup(&s);
-+}
-+
-+int __init
-+ar231x_add_wmac(int nr, u32 base, int irq)
-+{
-+ struct resource *res;
-+
-+ ar231x_wmac[nr].dev.platform_data = &ar231x_board;
-+ res = &ar231x_wmac[nr].resource[0];
-+ res->start = base;
-+ res->end = base + 0x10000 - 1;
-+ res++;
-+ res->start = irq;
-+ res->end = irq;
-+ return platform_device_register(&ar231x_wmac[nr]);
-+}
-+
-+static int __init ar231x_register_devices(void)
-+{
-+ static struct resource res = {
-+ .start = 0xFFFFFFFF,
-+ };
-+
-+ platform_device_register_simple("GPIODEV", 0, &res, 1);
-+ ar5312_init_devices();
-+ ar2315_init_devices();
-+
-+ return 0;
-+}
-+
-+device_initcall(ar231x_register_devices);
+++ /dev/null
---- /dev/null
-+++ b/arch/mips/ar231x/early_printk.c
-@@ -0,0 +1,44 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2010 Gabor Juhos <juhosg@openwrt.org>
-+ */
-+
-+#include <linux/mm.h>
-+#include <linux/io.h>
-+#include <linux/serial_reg.h>
-+#include <asm/addrspace.h>
-+
-+#include <asm/mach-ar231x/ar2315_regs.h>
-+#include <asm/mach-ar231x/ar5312_regs.h>
-+#include "devices.h"
-+
-+static inline void prom_uart_wr(void __iomem *base, unsigned reg,
-+ unsigned char ch)
-+{
-+ __raw_writeb(ch, base + 4 * reg);
-+}
-+
-+static inline unsigned char prom_uart_rr(void __iomem *base, unsigned reg)
-+{
-+ return __raw_readb(base + 4 * reg);
-+}
-+
-+void prom_putchar(unsigned char ch)
-+{
-+ static void __iomem *base;
-+
-+ if (unlikely(base == NULL)) {
-+ if (is_2315())
-+ base = (void __iomem *)(KSEG1ADDR(AR2315_UART0));
-+ else
-+ base = (void __iomem *)(KSEG1ADDR(AR531X_UART0));
-+ }
-+
-+ while ((prom_uart_rr(base, UART_LSR) & UART_LSR_THRE) == 0);
-+ prom_uart_wr(base, UART_TX, ch);
-+ while ((prom_uart_rr(base, UART_LSR) & UART_LSR_THRE) == 0);
-+}
-+
---- a/arch/mips/ar231x/Makefile
-+++ b/arch/mips/ar231x/Makefile
-@@ -9,5 +9,8 @@
- #
-
- obj-y += board.o prom.o devices.o
-+
-+obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
-+
- obj-$(CONFIG_ATHEROS_AR5312) += ar5312.o
- obj-$(CONFIG_ATHEROS_AR2315) += ar2315.o
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -94,6 +94,7 @@ config ATHEROS_AR231X
- select SYS_SUPPORTS_BIG_ENDIAN
- select SYS_SUPPORTS_32BIT_KERNEL
- select GENERIC_GPIO
-+ select SYS_HAS_EARLY_PRINTK
- help
- Support for AR231x and AR531x based boards
-
+++ /dev/null
---- a/arch/mips/ar231x/Makefile
-+++ b/arch/mips/ar231x/Makefile
-@@ -14,3 +14,4 @@ obj-$(CONFIG_EARLY_PRINTK) += early_prin
-
- obj-$(CONFIG_ATHEROS_AR5312) += ar5312.o
- obj-$(CONFIG_ATHEROS_AR2315) += ar2315.o
-+obj-$(CONFIG_ATHEROS_AR2315_PCI) += pci.o
---- /dev/null
-+++ b/arch/mips/ar231x/pci.c
-@@ -0,0 +1,230 @@
-+/*
-+ * 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/types.h>
-+#include <linux/pci.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/mm.h>
-+#include <linux/spinlock.h>
-+#include <linux/delay.h>
-+#include <linux/irq.h>
-+#include <asm/bootinfo.h>
-+#include <asm/paccess.h>
-+#include <asm/irq_cpu.h>
-+#include <asm/io.h>
-+#include <ar231x_platform.h>
-+#include <ar231x.h>
-+#include <ar2315_regs.h>
-+#include "devices.h"
-+
-+#define AR531X_MEM_BASE 0x80800000UL
-+#define AR531X_MEM_SIZE 0x00ffffffUL
-+#define AR531X_IO_SIZE 0x00007fffUL
-+
-+static unsigned long configspace;
-+
-+static int config_access(int devfn, int where, int size, u32 *ptr, bool write)
-+{
-+ unsigned long flags;
-+ int func = PCI_FUNC(devfn);
-+ int dev = PCI_SLOT(devfn);
-+ u32 value = 0;
-+ int err = 0;
-+ u32 addr;
-+
-+ if (((dev != 0) && (dev != 3)) || (func > 2))
-+ return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+ /* Select Configuration access */
-+ local_irq_save(flags);
-+ ar231x_mask_reg(AR2315_PCI_MISC_CONFIG, 0, AR2315_PCIMISC_CFG_SEL);
-+ mb();
-+
-+ addr = (u32) configspace + (1 << (13 + dev)) + (func << 8) + where;
-+ if (size == 1)
-+ addr ^= 0x3;
-+ else if (size == 2)
-+ addr ^= 0x2;
-+
-+ if (write) {
-+ value = *ptr;
-+ if (size == 1)
-+ err = put_dbe(value, (u8 *) addr);
-+ else if (size == 2)
-+ err = put_dbe(value, (u16 *) addr);
-+ else if (size == 4)
-+ err = put_dbe(value, (u32 *) addr);
-+ } else {
-+ if (size == 1)
-+ err = get_dbe(value, (u8 *) addr);
-+ else if (size == 2)
-+ err = get_dbe(value, (u16 *) addr);
-+ else if (size == 4)
-+ err = get_dbe(value, (u32 *) addr);
-+ if (err)
-+ *ptr = 0xffffffff;
-+ else
-+ *ptr = value;
-+ }
-+
-+ /* Select Memory access */
-+ ar231x_mask_reg(AR2315_PCI_MISC_CONFIG, AR2315_PCIMISC_CFG_SEL, 0);
-+ local_irq_restore(flags);
-+
-+ return (err ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL);
-+}
-+
-+static int ar231x_pci_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 * value)
-+{
-+ return config_access(devfn, where, size, value, 0);
-+}
-+
-+static int ar231x_pci_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value)
-+{
-+ return config_access(devfn, where, size, &value, 1);
-+}
-+
-+struct pci_ops ar231x_pci_ops = {
-+ .read = ar231x_pci_read,
-+ .write = ar231x_pci_write,
-+};
-+
-+static struct resource ar231x_mem_resource = {
-+ .name = "AR531x PCI MEM",
-+ .start = AR531X_MEM_BASE,
-+ .end = AR531X_MEM_BASE + AR531X_MEM_SIZE - AR531X_IO_SIZE - 1 + 0x4000000,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static struct resource ar231x_io_resource = {
-+ .name = "AR531x PCI I/O",
-+ .start = AR531X_MEM_BASE + AR531X_MEM_SIZE - AR531X_IO_SIZE,
-+ .end = AR531X_MEM_BASE + AR531X_MEM_SIZE - 1,
-+ .flags = IORESOURCE_IO,
-+};
-+
-+struct pci_controller ar231x_pci_controller = {
-+ .pci_ops = &ar231x_pci_ops,
-+ .mem_resource = &ar231x_mem_resource,
-+ .io_resource = &ar231x_io_resource,
-+ .mem_offset = 0x00000000UL,
-+ .io_offset = 0x00000000UL,
-+};
-+
-+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
-+{
-+ return AR2315_IRQ_LCBUS_PCI;
-+}
-+
-+int pcibios_plat_dev_init(struct pci_dev *dev)
-+{
-+ pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 5);
-+ pci_write_config_word(dev, 0x40, 0);
-+
-+ /* Clear any pending Abort or external Interrupts
-+ * and enable interrupt processing */
-+ ar231x_mask_reg(AR2315_PCI_INTEN_REG, AR2315_PCI_INT_ENABLE, 0);
-+ ar231x_write_reg(AR2315_PCI_INT_STATUS, (AR2315_PCI_ABORT_INT | AR2315_PCI_EXT_INT));
-+ ar231x_write_reg(AR2315_PCI_INT_MASK, (AR2315_PCI_ABORT_INT | AR2315_PCI_EXT_INT));
-+ ar231x_mask_reg(AR2315_PCI_INTEN_REG, 0, AR2315_PCI_INT_ENABLE);
-+
-+ return 0;
-+}
-+
-+static void
-+ar2315_pci_fixup(struct pci_dev *dev)
-+{
-+ unsigned int devfn = dev->devfn;
-+
-+ if (dev->bus->number != 0)
-+ return;
-+
-+ /* Only fix up the PCI host settings */
-+ if ((PCI_SLOT(devfn) != 3) || (PCI_FUNC(devfn) != 0))
-+ return;
-+
-+ /* Fix up MBARs */
-+ pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, HOST_PCI_MBAR0);
-+ pci_write_config_dword(dev, PCI_BASE_ADDRESS_1, HOST_PCI_MBAR1);
-+ pci_write_config_dword(dev, PCI_BASE_ADDRESS_2, HOST_PCI_MBAR2);
-+ pci_write_config_dword(dev, PCI_COMMAND,
-+ PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_SPECIAL |
-+ PCI_COMMAND_INVALIDATE | PCI_COMMAND_PARITY | PCI_COMMAND_SERR |
-+ PCI_COMMAND_FAST_BACK);
-+}
-+DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, ar2315_pci_fixup);
-+
-+static int __init
-+ar2315_pci_init(void)
-+{
-+ u32 reg;
-+
-+ if (ar231x_devtype != DEV_TYPE_AR2315)
-+ return -ENODEV;
-+
-+ configspace = (unsigned long) ioremap_nocache(0x80000000, 1*1024*1024); /* Remap PCI config space */
-+ ar231x_pci_controller.io_map_base =
-+ (unsigned long) ioremap_nocache(AR531X_MEM_BASE + AR531X_MEM_SIZE, AR531X_IO_SIZE);
-+ set_io_port_base(ar231x_pci_controller.io_map_base); /* PCI I/O space */
-+
-+ reg = ar231x_mask_reg(AR2315_RESET, 0, AR2315_RESET_PCIDMA);
-+ msleep(10);
-+
-+ reg &= ~AR2315_RESET_PCIDMA;
-+ ar231x_write_reg(AR2315_RESET, reg);
-+ msleep(10);
-+
-+ ar231x_mask_reg(AR2315_ENDIAN_CTL, 0,
-+ AR2315_CONFIG_PCIAHB | AR2315_CONFIG_PCIAHB_BRIDGE);
-+
-+ ar231x_write_reg(AR2315_PCICLK, AR2315_PCICLK_PLLC_CLKM |
-+ (AR2315_PCICLK_IN_FREQ_DIV_6 << AR2315_PCICLK_DIV_S));
-+ ar231x_mask_reg(AR2315_AHB_ARB_CTL, 0, AR2315_ARB_PCI);
-+ ar231x_mask_reg(AR2315_IF_CTL, AR2315_IF_PCI_CLK_MASK | AR2315_IF_MASK,
-+ AR2315_IF_PCI | AR2315_IF_PCI_HOST | AR2315_IF_PCI_INTR |
-+ (AR2315_IF_PCI_CLK_OUTPUT_CLK << AR2315_IF_PCI_CLK_SHIFT));
-+
-+ /* Reset the PCI bus by setting bits 5-4 in PCI_MCFG */
-+ ar231x_mask_reg(AR2315_PCI_MISC_CONFIG, AR2315_PCIMISC_RST_MODE,
-+ AR2315_PCIRST_LOW);
-+ msleep(100);
-+
-+ /* Bring the PCI out of reset */
-+ ar231x_mask_reg(AR2315_PCI_MISC_CONFIG, AR2315_PCIMISC_RST_MODE,
-+ AR2315_PCIRST_HIGH | AR2315_PCICACHE_DIS | 0x8);
-+
-+ ar231x_write_reg(AR2315_PCI_UNCACHE_CFG,
-+ 0x1E | /* 1GB uncached */
-+ (1 << 5) | /* Enable uncached */
-+ (0x2 << 30) /* Base: 0x80000000 */
-+ );
-+ ar231x_read_reg(AR2315_PCI_UNCACHE_CFG);
-+
-+ msleep(500);
-+
-+ /* dirty hack - anyone with a datasheet that knows the memory map ? */
-+ ioport_resource.start = 0x10000000;
-+ ioport_resource.end = 0xffffffff;
-+ iomem_resource.start = 0x10000000;
-+ iomem_resource.end = 0xffffffff;
-+
-+ register_pci_controller(&ar231x_pci_controller);
-+
-+ return 0;
-+}
-+
-+arch_initcall(ar2315_pci_init);
---- a/arch/mips/ar231x/Kconfig
-+++ b/arch/mips/ar231x/Kconfig
-@@ -15,3 +15,13 @@ config ATHEROS_AR2315
- select SYS_SUPPORTS_BIG_ENDIAN
- select GENERIC_GPIO
- default y
-+
-+config ATHEROS_AR2315_PCI
-+ bool "PCI support"
-+ depends on ATHEROS_AR2315
-+ select HW_HAS_PCI
-+ select PCI
-+ select USB_ARCH_HAS_HCD
-+ select USB_ARCH_HAS_OHCI
-+ select USB_ARCH_HAS_EHCI
-+ default y
---- a/arch/mips/ar231x/ar2315.c
-+++ b/arch/mips/ar231x/ar2315.c
-@@ -63,6 +63,27 @@ static inline void ar2315_gpio_irq(void)
- do_IRQ(AR531X_GPIO_IRQ_BASE + bit);
- }
-
-+#ifdef CONFIG_ATHEROS_AR2315_PCI
-+static inline void pci_abort_irq(void)
-+{
-+ ar231x_write_reg(AR2315_PCI_INT_STATUS, AR2315_PCI_ABORT_INT);
-+}
-+
-+static inline void pci_ack_irq(void)
-+{
-+ ar231x_write_reg(AR2315_PCI_INT_STATUS, AR2315_PCI_EXT_INT);
-+}
-+
-+void ar2315_pci_irq(int irq)
-+{
-+ if (ar231x_read_reg(AR2315_PCI_INT_STATUS) == AR2315_PCI_ABORT_INT)
-+ pci_abort_irq();
-+ else {
-+ do_IRQ(irq);
-+ pci_ack_irq();
-+ }
-+}
-+#endif /* CONFIG_ATHEROS_AR2315_PCI */
-
- /*
- * Called when an interrupt is received, this function
-@@ -81,6 +102,10 @@ ar2315_irq_dispatch(void)
- do_IRQ(AR2315_IRQ_WLAN0_INTRS);
- else if (pending & CAUSEF_IP4)
- do_IRQ(AR2315_IRQ_ENET0_INTRS);
-+#ifdef CONFIG_ATHEROS_AR2315_PCI
-+ else if (pending & CAUSEF_IP5)
-+ ar2315_pci_irq(AR2315_IRQ_LCBUS_PCI);
-+#endif
- else if (pending & CAUSEF_IP2) {
- unsigned int misc_intr = ar231x_read_reg(AR2315_ISR) & ar231x_read_reg(AR2315_IMR);
-
+++ /dev/null
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -359,6 +359,12 @@ config AX88796_93CX6
- help
- Select this if your platform comes with an external 93CX6 eeprom.
-
-+config AR231X_ETHERNET
-+ tristate "AR231x Ethernet support"
-+ depends on ATHEROS_AR231X
-+ help
-+ Support for the AR231x/531x ethernet controller
-+
- config MACE
- tristate "MACE (Power Mac ethernet) support"
- depends on PPC_PMAC && PPC32
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -216,6 +216,7 @@ obj-$(CONFIG_EQUALIZER) += eql.o
- obj-$(CONFIG_KORINA) += korina.o
- obj-$(CONFIG_MIPS_JAZZ_SONIC) += jazzsonic.o
- obj-$(CONFIG_MIPS_AU1X00_ENET) += au1000_eth.o
-+obj-$(CONFIG_AR231X_ETHERNET) += ar231x.o
- obj-$(CONFIG_MIPS_SIM_NET) += mipsnet.o
- obj-$(CONFIG_SGI_IOC3_ETH) += ioc3-eth.o
- obj-$(CONFIG_DECLANCE) += declance.o
---- /dev/null
-+++ b/drivers/net/ar231x.c
-@@ -0,0 +1,1263 @@
-+/*
-+ * ar231x.c: Linux driver for the Atheros AR231x Ethernet device.
-+ *
-+ * Copyright (C) 2004 by Sameer Dekate <sdekate@arubanetworks.com>
-+ * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org>
-+ *
-+ * Thanks to Atheros for providing hardware and documentation
-+ * enabling me to write this 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.
-+ *
-+ * Additional credits:
-+ * This code is taken from John Taylor's Sibyte driver and then
-+ * modified for the AR2313.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/version.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/ioport.h>
-+#include <linux/pci.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/skbuff.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/mm.h>
-+#include <linux/highmem.h>
-+#include <linux/sockios.h>
-+#include <linux/pkt_sched.h>
-+#include <linux/mii.h>
-+#include <linux/phy.h>
-+#include <linux/ethtool.h>
-+#include <linux/ctype.h>
-+#include <linux/platform_device.h>
-+
-+#include <net/sock.h>
-+#include <net/ip.h>
-+
-+#include <asm/system.h>
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/byteorder.h>
-+#include <asm/uaccess.h>
-+#include <asm/bootinfo.h>
-+
-+#define AR2313_MTU 1692
-+#define AR2313_PRIOS 1
-+#define AR2313_QUEUES (2*AR2313_PRIOS)
-+#define AR2313_DESCR_ENTRIES 64
-+
-+
-+#ifndef min
-+#define min(a,b) (((a)<(b))?(a):(b))
-+#endif
-+
-+#ifndef SMP_CACHE_BYTES
-+#define SMP_CACHE_BYTES L1_CACHE_BYTES
-+#endif
-+
-+#define AR2313_MBOX_SET_BIT 0x8
-+
-+#include "ar231x.h"
-+
-+/*
-+ * New interrupt handler strategy:
-+ *
-+ * An old interrupt handler worked using the traditional method of
-+ * replacing an skbuff with a new one when a packet arrives. However
-+ * the rx rings do not need to contain a static number of buffer
-+ * descriptors, thus it makes sense to move the memory allocation out
-+ * of the main interrupt handler and do it in a bottom half handler
-+ * and only allocate new buffers when the number of buffers in the
-+ * ring is below a certain threshold. In order to avoid starving the
-+ * NIC under heavy load it is however necessary to force allocation
-+ * when hitting a minimum threshold. The strategy for alloction is as
-+ * follows:
-+ *
-+ * RX_LOW_BUF_THRES - allocate buffers in the bottom half
-+ * RX_PANIC_LOW_THRES - we are very low on buffers, allocate
-+ * the buffers in the interrupt handler
-+ * RX_RING_THRES - maximum number of buffers in the rx ring
-+ *
-+ * One advantagous side effect of this allocation approach is that the
-+ * entire rx processing can be done without holding any spin lock
-+ * since the rx rings and registers are totally independent of the tx
-+ * ring and its registers. This of course includes the kmalloc's of
-+ * new skb's. Thus start_xmit can run in parallel with rx processing
-+ * and the memory allocation on SMP systems.
-+ *
-+ * Note that running the skb reallocation in a bottom half opens up
-+ * another can of races which needs to be handled properly. In
-+ * particular it can happen that the interrupt handler tries to run
-+ * the reallocation while the bottom half is either running on another
-+ * CPU or was interrupted on the same CPU. To get around this the
-+ * driver uses bitops to prevent the reallocation routines from being
-+ * reentered.
-+ *
-+ * TX handling can also be done without holding any spin lock, wheee
-+ * this is fun! since tx_csm is only written to by the interrupt
-+ * handler.
-+ */
-+
-+/*
-+ * Threshold values for RX buffer allocation - the low water marks for
-+ * when to start refilling the rings are set to 75% of the ring
-+ * sizes. It seems to make sense to refill the rings entirely from the
-+ * intrrupt handler once it gets below the panic threshold, that way
-+ * we don't risk that the refilling is moved to another CPU when the
-+ * one running the interrupt handler just got the slab code hot in its
-+ * cache.
-+ */
-+#define RX_RING_SIZE AR2313_DESCR_ENTRIES
-+#define RX_PANIC_THRES (RX_RING_SIZE/4)
-+#define RX_LOW_THRES ((3*RX_RING_SIZE)/4)
-+#define CRC_LEN 4
-+#define RX_OFFSET 2
-+
-+#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
-+#define VLAN_HDR 4
-+#else
-+#define VLAN_HDR 0
-+#endif
-+
-+#define AR2313_BUFSIZE (AR2313_MTU + VLAN_HDR + ETH_HLEN + CRC_LEN + RX_OFFSET)
-+
-+#ifdef MODULE
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Sameer Dekate <sdekate@arubanetworks.com>, Imre Kaloz <kaloz@openwrt.org>, Felix Fietkau <nbd@openwrt.org>");
-+MODULE_DESCRIPTION("AR231x Ethernet driver");
-+#endif
-+
-+#define virt_to_phys(x) ((u32)(x) & 0x1fffffff)
-+
-+// prototypes
-+static void ar231x_halt(struct net_device *dev);
-+static void rx_tasklet_func(unsigned long data);
-+static void rx_tasklet_cleanup(struct net_device *dev);
-+static void ar231x_multicast_list(struct net_device *dev);
-+
-+static int ar231x_mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum);
-+static int ar231x_mdiobus_write(struct mii_bus *bus, int phy_addr, int regnum, u16 value);
-+static int ar231x_mdiobus_reset(struct mii_bus *bus);
-+static int ar231x_mdiobus_probe (struct net_device *dev);
-+static void ar231x_adjust_link(struct net_device *dev);
-+
-+#ifndef ERR
-+#define ERR(fmt, args...) printk("%s: " fmt, __func__, ##args)
-+#endif
-+
-+static const struct net_device_ops ar231x_ops = {
-+ .ndo_open = ar231x_open,
-+ .ndo_stop = ar231x_close,
-+ .ndo_start_xmit = ar231x_start_xmit,
-+ .ndo_set_multicast_list = ar231x_multicast_list,
-+ .ndo_do_ioctl = ar231x_ioctl,
-+};
-+
-+int __init ar231x_probe(struct platform_device *pdev)
-+{
-+ struct net_device *dev;
-+ struct ar231x_private *sp;
-+ struct resource *res;
-+ unsigned long ar_eth_base;
-+ char buf[64];
-+
-+ dev = alloc_etherdev(sizeof(struct ar231x_private));
-+
-+ if (dev == NULL) {
-+ printk(KERN_ERR
-+ "ar231x: Unable to allocate net_device structure!\n");
-+ return -ENOMEM;
-+ }
-+
-+ platform_set_drvdata(pdev, dev);
-+
-+ sp = netdev_priv(dev);
-+ sp->dev = dev;
-+ sp->cfg = pdev->dev.platform_data;
-+
-+ sprintf(buf, "eth%d_membase", pdev->id);
-+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, buf);
-+ if (!res)
-+ return -ENODEV;
-+
-+ sp->link = 0;
-+ ar_eth_base = res->start;
-+
-+ sprintf(buf, "eth%d_irq", pdev->id);
-+ dev->irq = platform_get_irq_byname(pdev, buf);
-+
-+ spin_lock_init(&sp->lock);
-+
-+ dev->features |= NETIF_F_HIGHDMA;
-+ dev->netdev_ops = &ar231x_ops;
-+
-+ tasklet_init(&sp->rx_tasklet, rx_tasklet_func, (unsigned long) dev);
-+ tasklet_disable(&sp->rx_tasklet);
-+
-+ sp->eth_regs =
-+ ioremap_nocache(virt_to_phys(ar_eth_base), sizeof(*sp->eth_regs));
-+ if (!sp->eth_regs) {
-+ printk("Can't remap eth registers\n");
-+ return (-ENXIO);
-+ }
-+
-+ /*
-+ * When there's only one MAC, PHY regs are typically on ENET0,
-+ * even though the MAC might be on ENET1.
-+ * Needto remap PHY regs separately in this case
-+ */
-+ if (virt_to_phys(ar_eth_base) == virt_to_phys(sp->phy_regs))
-+ sp->phy_regs = sp->eth_regs;
-+ else {
-+ sp->phy_regs =
-+ ioremap_nocache(virt_to_phys(sp->cfg->phy_base),
-+ sizeof(*sp->phy_regs));
-+ if (!sp->phy_regs) {
-+ printk("Can't remap phy registers\n");
-+ return (-ENXIO);
-+ }
-+ }
-+
-+ sp->dma_regs =
-+ ioremap_nocache(virt_to_phys(ar_eth_base + 0x1000),
-+ sizeof(*sp->dma_regs));
-+ dev->base_addr = (unsigned int) sp->dma_regs;
-+ if (!sp->dma_regs) {
-+ printk("Can't remap DMA registers\n");
-+ return (-ENXIO);
-+ }
-+
-+ sp->int_regs = ioremap_nocache(virt_to_phys(sp->cfg->reset_base), 4);
-+ if (!sp->int_regs) {
-+ printk("Can't remap INTERRUPT registers\n");
-+ return (-ENXIO);
-+ }
-+
-+ strncpy(sp->name, "Atheros AR231x", sizeof(sp->name) - 1);
-+ sp->name[sizeof(sp->name) - 1] = '\0';
-+ memcpy(dev->dev_addr, sp->cfg->macaddr, 6);
-+
-+ if (ar231x_init(dev)) {
-+ /*
-+ * ar231x_init() calls ar231x_init_cleanup() on error.
-+ */
-+ kfree(dev);
-+ return -ENODEV;
-+ }
-+
-+ if (register_netdev(dev)) {
-+ printk("%s: register_netdev failed\n", __func__);
-+ return -1;
-+ }
-+
-+ printk("%s: %s: %02x:%02x:%02x:%02x:%02x:%02x, irq %d\n",
-+ dev->name, sp->name,
-+ dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-+ dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5], dev->irq);
-+
-+ sp->mii_bus = mdiobus_alloc();
-+ if (sp->mii_bus == NULL)
-+ return -1;
-+
-+ sp->mii_bus->priv = dev;
-+ sp->mii_bus->read = ar231x_mdiobus_read;
-+ sp->mii_bus->write = ar231x_mdiobus_write;
-+ sp->mii_bus->reset = ar231x_mdiobus_reset;
-+ sp->mii_bus->name = "ar231x_eth_mii";
-+ snprintf(sp->mii_bus->id, MII_BUS_ID_SIZE, "%d", pdev->id);
-+ sp->mii_bus->irq = kmalloc(sizeof(int), GFP_KERNEL);
-+ *sp->mii_bus->irq = PHY_POLL;
-+
-+ mdiobus_register(sp->mii_bus);
-+
-+ if (ar231x_mdiobus_probe(dev) != 0) {
-+ printk(KERN_ERR "%s: mdiobus_probe failed\n", dev->name);
-+ rx_tasklet_cleanup(dev);
-+ ar231x_init_cleanup(dev);
-+ unregister_netdev(dev);
-+ kfree(dev);
-+ return -ENODEV;
-+ }
-+
-+ /* start link poll timer */
-+ ar231x_setup_timer(dev);
-+
-+ return 0;
-+}
-+
-+
-+static void ar231x_multicast_list(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ unsigned int filter;
-+
-+ filter = sp->eth_regs->mac_control;
-+
-+ if (dev->flags & IFF_PROMISC)
-+ filter |= MAC_CONTROL_PR;
-+ else
-+ filter &= ~MAC_CONTROL_PR;
-+ if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 0))
-+ filter |= MAC_CONTROL_PM;
-+ else
-+ filter &= ~MAC_CONTROL_PM;
-+
-+ sp->eth_regs->mac_control = filter;
-+}
-+
-+static void rx_tasklet_cleanup(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+
-+ /*
-+ * Tasklet may be scheduled. Need to get it removed from the list
-+ * since we're about to free the struct.
-+ */
-+
-+ sp->unloading = 1;
-+ tasklet_enable(&sp->rx_tasklet);
-+ tasklet_kill(&sp->rx_tasklet);
-+}
-+
-+static int __devexit ar231x_remove(struct platform_device *pdev)
-+{
-+ struct net_device *dev = platform_get_drvdata(pdev);
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ rx_tasklet_cleanup(dev);
-+ ar231x_init_cleanup(dev);
-+ unregister_netdev(dev);
-+ mdiobus_unregister(sp->mii_bus);
-+ mdiobus_free(sp->mii_bus);
-+ kfree(dev);
-+ return 0;
-+}
-+
-+
-+/*
-+ * Restart the AR2313 ethernet controller.
-+ */
-+static int ar231x_restart(struct net_device *dev)
-+{
-+ /* disable interrupts */
-+ disable_irq(dev->irq);
-+
-+ /* stop mac */
-+ ar231x_halt(dev);
-+
-+ /* initialize */
-+ ar231x_init(dev);
-+
-+ /* enable interrupts */
-+ enable_irq(dev->irq);
-+
-+ return 0;
-+}
-+
-+static struct platform_driver ar231x_driver = {
-+ .driver.name = "ar231x-eth",
-+ .probe = ar231x_probe,
-+ .remove = __devexit_p(ar231x_remove),
-+};
-+
-+int __init ar231x_module_init(void)
-+{
-+ return platform_driver_register(&ar231x_driver);
-+}
-+
-+void __exit ar231x_module_cleanup(void)
-+{
-+ platform_driver_unregister(&ar231x_driver);
-+}
-+
-+module_init(ar231x_module_init);
-+module_exit(ar231x_module_cleanup);
-+
-+
-+static void ar231x_free_descriptors(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ if (sp->rx_ring != NULL) {
-+ kfree((void *) KSEG0ADDR(sp->rx_ring));
-+ sp->rx_ring = NULL;
-+ sp->tx_ring = NULL;
-+ }
-+}
-+
-+
-+static int ar231x_allocate_descriptors(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ int size;
-+ int j;
-+ ar231x_descr_t *space;
-+
-+ if (sp->rx_ring != NULL) {
-+ printk("%s: already done.\n", __FUNCTION__);
-+ return 0;
-+ }
-+
-+ size =
-+ (sizeof(ar231x_descr_t) * (AR2313_DESCR_ENTRIES * AR2313_QUEUES));
-+ space = kmalloc(size, GFP_KERNEL);
-+ if (space == NULL)
-+ return 1;
-+
-+ /* invalidate caches */
-+ dma_cache_inv((unsigned int) space, size);
-+
-+ /* now convert pointer to KSEG1 */
-+ space = (ar231x_descr_t *) KSEG1ADDR(space);
-+
-+ memset((void *) space, 0, size);
-+
-+ sp->rx_ring = space;
-+ space += AR2313_DESCR_ENTRIES;
-+
-+ sp->tx_ring = space;
-+ space += AR2313_DESCR_ENTRIES;
-+
-+ /* Initialize the transmit Descriptors */
-+ for (j = 0; j < AR2313_DESCR_ENTRIES; j++) {
-+ ar231x_descr_t *td = &sp->tx_ring[j];
-+ td->status = 0;
-+ td->devcs = DMA_TX1_CHAINED;
-+ td->addr = 0;
-+ td->descr =
-+ virt_to_phys(&sp->
-+ tx_ring[(j + 1) & (AR2313_DESCR_ENTRIES - 1)]);
-+ }
-+
-+ return 0;
-+}
-+
-+
-+/*
-+ * Generic cleanup handling data allocated during init. Used when the
-+ * module is unloaded or if an error occurs during initialization
-+ */
-+static void ar231x_init_cleanup(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ struct sk_buff *skb;
-+ int j;
-+
-+ ar231x_free_descriptors(dev);
-+
-+ if (sp->eth_regs)
-+ iounmap((void *) sp->eth_regs);
-+ if (sp->dma_regs)
-+ iounmap((void *) sp->dma_regs);
-+
-+ if (sp->rx_skb) {
-+ for (j = 0; j < AR2313_DESCR_ENTRIES; j++) {
-+ skb = sp->rx_skb[j];
-+ if (skb) {
-+ sp->rx_skb[j] = NULL;
-+ dev_kfree_skb(skb);
-+ }
-+ }
-+ kfree(sp->rx_skb);
-+ sp->rx_skb = NULL;
-+ }
-+
-+ if (sp->tx_skb) {
-+ for (j = 0; j < AR2313_DESCR_ENTRIES; j++) {
-+ skb = sp->tx_skb[j];
-+ if (skb) {
-+ sp->tx_skb[j] = NULL;
-+ dev_kfree_skb(skb);
-+ }
-+ }
-+ kfree(sp->tx_skb);
-+ sp->tx_skb = NULL;
-+ }
-+}
-+
-+static int ar231x_setup_timer(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+
-+ init_timer(&sp->link_timer);
-+
-+ sp->link_timer.function = ar231x_link_timer_fn;
-+ sp->link_timer.data = (int) dev;
-+ sp->link_timer.expires = jiffies + HZ;
-+
-+ add_timer(&sp->link_timer);
-+ return 0;
-+
-+}
-+
-+static void ar231x_link_timer_fn(unsigned long data)
-+{
-+ struct net_device *dev = (struct net_device *) data;
-+ struct ar231x_private *sp = netdev_priv(dev);
-+
-+ // see if the link status changed
-+ // This was needed to make sure we set the PHY to the
-+ // autonegotiated value of half or full duplex.
-+ ar231x_check_link(dev);
-+
-+ // Loop faster when we don't have link.
-+ // This was needed to speed up the AP bootstrap time.
-+ if (sp->link == 0) {
-+ mod_timer(&sp->link_timer, jiffies + HZ / 2);
-+ } else {
-+ mod_timer(&sp->link_timer, jiffies + LINK_TIMER);
-+ }
-+}
-+
-+static void ar231x_check_link(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ u16 phyData;
-+
-+ phyData = ar231x_mdiobus_read(sp->mii_bus, sp->phy, MII_BMSR);
-+ if (sp->phyData != phyData) {
-+ if (phyData & BMSR_LSTATUS) {
-+ /* link is present, ready link partner ability to deterine
-+ duplexity */
-+ int duplex = 0;
-+ u16 reg;
-+
-+ sp->link = 1;
-+ reg = ar231x_mdiobus_read(sp->mii_bus, sp->phy, MII_BMCR);
-+ if (reg & BMCR_ANENABLE) {
-+ /* auto neg enabled */
-+ reg = ar231x_mdiobus_read(sp->mii_bus, sp->phy, MII_LPA);
-+ duplex = (reg & (LPA_100FULL | LPA_10FULL)) ? 1 : 0;
-+ } else {
-+ /* no auto neg, just read duplex config */
-+ duplex = (reg & BMCR_FULLDPLX) ? 1 : 0;
-+ }
-+
-+ printk(KERN_INFO "%s: Configuring MAC for %s duplex\n",
-+ dev->name, (duplex) ? "full" : "half");
-+
-+ if (duplex) {
-+ /* full duplex */
-+ sp->eth_regs->mac_control =
-+ ((sp->eth_regs->
-+ mac_control | MAC_CONTROL_F) & ~MAC_CONTROL_DRO);
-+ } else {
-+ /* half duplex */
-+ sp->eth_regs->mac_control =
-+ ((sp->eth_regs->
-+ mac_control | MAC_CONTROL_DRO) & ~MAC_CONTROL_F);
-+ }
-+ } else {
-+ /* no link */
-+ sp->link = 0;
-+ }
-+ sp->phyData = phyData;
-+ }
-+}
-+
-+static int ar231x_reset_reg(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ unsigned int ethsal, ethsah;
-+ unsigned int flags;
-+
-+ *sp->int_regs |= sp->cfg->reset_mac;
-+ mdelay(10);
-+ *sp->int_regs &= ~sp->cfg->reset_mac;
-+ mdelay(10);
-+ *sp->int_regs |= sp->cfg->reset_phy;
-+ mdelay(10);
-+ *sp->int_regs &= ~sp->cfg->reset_phy;
-+ mdelay(10);
-+
-+ sp->dma_regs->bus_mode = (DMA_BUS_MODE_SWR);
-+ mdelay(10);
-+ sp->dma_regs->bus_mode =
-+ ((32 << DMA_BUS_MODE_PBL_SHIFT) | DMA_BUS_MODE_BLE);
-+
-+ /* enable interrupts */
-+ sp->dma_regs->intr_ena = (DMA_STATUS_AIS |
-+ DMA_STATUS_NIS |
-+ DMA_STATUS_RI |
-+ DMA_STATUS_TI | DMA_STATUS_FBE);
-+ sp->dma_regs->xmt_base = virt_to_phys(sp->tx_ring);
-+ sp->dma_regs->rcv_base = virt_to_phys(sp->rx_ring);
-+ sp->dma_regs->control =
-+ (DMA_CONTROL_SR | DMA_CONTROL_ST | DMA_CONTROL_SF);
-+
-+ sp->eth_regs->flow_control = (FLOW_CONTROL_FCE);
-+ sp->eth_regs->vlan_tag = (0x8100);
-+
-+ /* Enable Ethernet Interface */
-+ flags = (MAC_CONTROL_TE | /* transmit enable */
-+ MAC_CONTROL_PM | /* pass mcast */
-+ MAC_CONTROL_F | /* full duplex */
-+ MAC_CONTROL_HBD); /* heart beat disabled */
-+
-+ if (dev->flags & IFF_PROMISC) { /* set promiscuous mode */
-+ flags |= MAC_CONTROL_PR;
-+ }
-+ sp->eth_regs->mac_control = flags;
-+
-+ /* Set all Ethernet station address registers to their initial values */
-+ ethsah = ((((u_int) (dev->dev_addr[5]) << 8) & (u_int) 0x0000FF00) |
-+ (((u_int) (dev->dev_addr[4]) << 0) & (u_int) 0x000000FF));
-+
-+ ethsal = ((((u_int) (dev->dev_addr[3]) << 24) & (u_int) 0xFF000000) |
-+ (((u_int) (dev->dev_addr[2]) << 16) & (u_int) 0x00FF0000) |
-+ (((u_int) (dev->dev_addr[1]) << 8) & (u_int) 0x0000FF00) |
-+ (((u_int) (dev->dev_addr[0]) << 0) & (u_int) 0x000000FF));
-+
-+ sp->eth_regs->mac_addr[0] = ethsah;
-+ sp->eth_regs->mac_addr[1] = ethsal;
-+
-+ mdelay(10);
-+
-+ return (0);
-+}
-+
-+
-+static int ar231x_init(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ int ecode = 0;
-+
-+ /*
-+ * Allocate descriptors
-+ */
-+ if (ar231x_allocate_descriptors(dev)) {
-+ printk("%s: %s: ar231x_allocate_descriptors failed\n",
-+ dev->name, __FUNCTION__);
-+ ecode = -EAGAIN;
-+ goto init_error;
-+ }
-+
-+ /*
-+ * Get the memory for the skb rings.
-+ */
-+ if (sp->rx_skb == NULL) {
-+ sp->rx_skb =
-+ kmalloc(sizeof(struct sk_buff *) * AR2313_DESCR_ENTRIES,
-+ GFP_KERNEL);
-+ if (!(sp->rx_skb)) {
-+ printk("%s: %s: rx_skb kmalloc failed\n",
-+ dev->name, __FUNCTION__);
-+ ecode = -EAGAIN;
-+ goto init_error;
-+ }
-+ }
-+ memset(sp->rx_skb, 0, sizeof(struct sk_buff *) * AR2313_DESCR_ENTRIES);
-+
-+ if (sp->tx_skb == NULL) {
-+ sp->tx_skb =
-+ kmalloc(sizeof(struct sk_buff *) * AR2313_DESCR_ENTRIES,
-+ GFP_KERNEL);
-+ if (!(sp->tx_skb)) {
-+ printk("%s: %s: tx_skb kmalloc failed\n",
-+ dev->name, __FUNCTION__);
-+ ecode = -EAGAIN;
-+ goto init_error;
-+ }
-+ }
-+ memset(sp->tx_skb, 0, sizeof(struct sk_buff *) * AR2313_DESCR_ENTRIES);
-+
-+ /*
-+ * Set tx_csm before we start receiving interrupts, otherwise
-+ * the interrupt handler might think it is supposed to process
-+ * tx ints before we are up and running, which may cause a null
-+ * pointer access in the int handler.
-+ */
-+ sp->rx_skbprd = 0;
-+ sp->cur_rx = 0;
-+ sp->tx_prd = 0;
-+ sp->tx_csm = 0;
-+
-+ /*
-+ * Zero the stats before starting the interface
-+ */
-+ memset(&dev->stats, 0, sizeof(dev->stats));
-+
-+ /*
-+ * We load the ring here as there seem to be no way to tell the
-+ * firmware to wipe the ring without re-initializing it.
-+ */
-+ ar231x_load_rx_ring(dev, RX_RING_SIZE);
-+
-+ /*
-+ * Init hardware
-+ */
-+ ar231x_reset_reg(dev);
-+
-+ /*
-+ * Get the IRQ
-+ */
-+ ecode =
-+ request_irq(dev->irq, &ar231x_interrupt,
-+ IRQF_DISABLED | IRQF_SAMPLE_RANDOM,
-+ dev->name, dev);
-+ if (ecode) {
-+ printk(KERN_WARNING "%s: %s: Requested IRQ %d is busy\n",
-+ dev->name, __FUNCTION__, dev->irq);
-+ goto init_error;
-+ }
-+
-+
-+ tasklet_enable(&sp->rx_tasklet);
-+
-+ return 0;
-+
-+ init_error:
-+ ar231x_init_cleanup(dev);
-+ return ecode;
-+}
-+
-+/*
-+ * Load the rx ring.
-+ *
-+ * Loading rings is safe without holding the spin lock since this is
-+ * done only before the device is enabled, thus no interrupts are
-+ * generated and by the interrupt handler/tasklet handler.
-+ */
-+static void ar231x_load_rx_ring(struct net_device *dev, int nr_bufs)
-+{
-+
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ short i, idx;
-+
-+ idx = sp->rx_skbprd;
-+
-+ for (i = 0; i < nr_bufs; i++) {
-+ struct sk_buff *skb;
-+ ar231x_descr_t *rd;
-+
-+ if (sp->rx_skb[idx])
-+ break;
-+
-+ skb = netdev_alloc_skb(dev, AR2313_BUFSIZE);
-+ if (!skb) {
-+ printk("\n\n\n\n %s: No memory in system\n\n\n\n",
-+ __FUNCTION__);
-+ break;
-+ }
-+
-+ /*
-+ * Make sure IP header starts on a fresh cache line.
-+ */
-+ skb->dev = dev;
-+ skb_reserve(skb, RX_OFFSET);
-+ sp->rx_skb[idx] = skb;
-+
-+ rd = (ar231x_descr_t *) & sp->rx_ring[idx];
-+
-+ /* initialize dma descriptor */
-+ rd->devcs = ((AR2313_BUFSIZE << DMA_RX1_BSIZE_SHIFT) |
-+ DMA_RX1_CHAINED);
-+ rd->addr = virt_to_phys(skb->data);
-+ rd->descr =
-+ virt_to_phys(&sp->
-+ rx_ring[(idx + 1) & (AR2313_DESCR_ENTRIES - 1)]);
-+ rd->status = DMA_RX_OWN;
-+
-+ idx = DSC_NEXT(idx);
-+ }
-+
-+ if (i)
-+ sp->rx_skbprd = idx;
-+
-+ return;
-+}
-+
-+#define AR2313_MAX_PKTS_PER_CALL 64
-+
-+static int ar231x_rx_int(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ struct sk_buff *skb, *skb_new;
-+ ar231x_descr_t *rxdesc;
-+ unsigned int status;
-+ u32 idx;
-+ int pkts = 0;
-+ int rval;
-+
-+ idx = sp->cur_rx;
-+
-+ /* process at most the entire ring and then wait for another interrupt
-+ */
-+ while (1) {
-+
-+ rxdesc = &sp->rx_ring[idx];
-+ status = rxdesc->status;
-+ if (status & DMA_RX_OWN) {
-+ /* SiByte owns descriptor or descr not yet filled in */
-+ rval = 0;
-+ break;
-+ }
-+
-+ if (++pkts > AR2313_MAX_PKTS_PER_CALL) {
-+ rval = 1;
-+ break;
-+ }
-+
-+ if ((status & DMA_RX_ERROR) && !(status & DMA_RX_LONG)) {
-+ dev->stats.rx_errors++;
-+ dev->stats.rx_dropped++;
-+
-+ /* add statistics counters */
-+ if (status & DMA_RX_ERR_CRC)
-+ dev->stats.rx_crc_errors++;
-+ if (status & DMA_RX_ERR_COL)
-+ dev->stats.rx_over_errors++;
-+ if (status & DMA_RX_ERR_LENGTH)
-+ dev->stats.rx_length_errors++;
-+ if (status & DMA_RX_ERR_RUNT)
-+ dev->stats.rx_over_errors++;
-+ if (status & DMA_RX_ERR_DESC)
-+ dev->stats.rx_over_errors++;
-+
-+ } else {
-+ /* alloc new buffer. */
-+ skb_new = netdev_alloc_skb(dev, AR2313_BUFSIZE + RX_OFFSET);
-+ if (skb_new != NULL) {
-+
-+ skb = sp->rx_skb[idx];
-+ /* set skb */
-+ skb_put(skb,
-+ ((status >> DMA_RX_LEN_SHIFT) & 0x3fff) - CRC_LEN);
-+
-+ dev->stats.rx_bytes += skb->len;
-+ skb->protocol = eth_type_trans(skb, dev);
-+ /* pass the packet to upper layers */
-+ netif_rx(skb);
-+
-+ skb_new->dev = dev;
-+ /* 16 bit align */
-+ skb_reserve(skb_new, RX_OFFSET);
-+ /* reset descriptor's curr_addr */
-+ rxdesc->addr = virt_to_phys(skb_new->data);
-+
-+ dev->stats.rx_packets++;
-+ sp->rx_skb[idx] = skb_new;
-+ } else {
-+ dev->stats.rx_dropped++;
-+ }
-+ }
-+
-+ rxdesc->devcs = ((AR2313_BUFSIZE << DMA_RX1_BSIZE_SHIFT) |
-+ DMA_RX1_CHAINED);
-+ rxdesc->status = DMA_RX_OWN;
-+
-+ idx = DSC_NEXT(idx);
-+ }
-+
-+ sp->cur_rx = idx;
-+
-+ return rval;
-+}
-+
-+
-+static void ar231x_tx_int(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ u32 idx;
-+ struct sk_buff *skb;
-+ ar231x_descr_t *txdesc;
-+ unsigned int status = 0;
-+
-+ idx = sp->tx_csm;
-+
-+ while (idx != sp->tx_prd) {
-+ txdesc = &sp->tx_ring[idx];
-+
-+ if ((status = txdesc->status) & DMA_TX_OWN) {
-+ /* ar231x dma still owns descr */
-+ break;
-+ }
-+ /* done with this descriptor */
-+ dma_unmap_single(NULL, txdesc->addr,
-+ txdesc->devcs & DMA_TX1_BSIZE_MASK,
-+ DMA_TO_DEVICE);
-+ txdesc->status = 0;
-+
-+ if (status & DMA_TX_ERROR) {
-+ dev->stats.tx_errors++;
-+ dev->stats.tx_dropped++;
-+ if (status & DMA_TX_ERR_UNDER)
-+ dev->stats.tx_fifo_errors++;
-+ if (status & DMA_TX_ERR_HB)
-+ dev->stats.tx_heartbeat_errors++;
-+ if (status & (DMA_TX_ERR_LOSS | DMA_TX_ERR_LINK))
-+ dev->stats.tx_carrier_errors++;
-+ if (status & (DMA_TX_ERR_LATE |
-+ DMA_TX_ERR_COL |
-+ DMA_TX_ERR_JABBER | DMA_TX_ERR_DEFER))
-+ dev->stats.tx_aborted_errors++;
-+ } else {
-+ /* transmit OK */
-+ dev->stats.tx_packets++;
-+ }
-+
-+ skb = sp->tx_skb[idx];
-+ sp->tx_skb[idx] = NULL;
-+ idx = DSC_NEXT(idx);
-+ dev->stats.tx_bytes += skb->len;
-+ dev_kfree_skb_irq(skb);
-+ }
-+
-+ sp->tx_csm = idx;
-+
-+ return;
-+}
-+
-+
-+static void rx_tasklet_func(unsigned long data)
-+{
-+ struct net_device *dev = (struct net_device *) data;
-+ struct ar231x_private *sp = netdev_priv(dev);
-+
-+ if (sp->unloading) {
-+ return;
-+ }
-+
-+ if (ar231x_rx_int(dev)) {
-+ tasklet_hi_schedule(&sp->rx_tasklet);
-+ } else {
-+ unsigned long flags;
-+ spin_lock_irqsave(&sp->lock, flags);
-+ sp->dma_regs->intr_ena |= DMA_STATUS_RI;
-+ spin_unlock_irqrestore(&sp->lock, flags);
-+ }
-+}
-+
-+static void rx_schedule(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+
-+ sp->dma_regs->intr_ena &= ~DMA_STATUS_RI;
-+
-+ tasklet_hi_schedule(&sp->rx_tasklet);
-+}
-+
-+static irqreturn_t ar231x_interrupt(int irq, void *dev_id)
-+{
-+ struct net_device *dev = (struct net_device *) dev_id;
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ unsigned int status, enabled;
-+
-+ /* clear interrupt */
-+ /*
-+ * Don't clear RI bit if currently disabled.
-+ */
-+ status = sp->dma_regs->status;
-+ enabled = sp->dma_regs->intr_ena;
-+ sp->dma_regs->status = status & enabled;
-+
-+ if (status & DMA_STATUS_NIS) {
-+ /* normal status */
-+ /*
-+ * Don't schedule rx processing if interrupt
-+ * is already disabled.
-+ */
-+ if (status & enabled & DMA_STATUS_RI) {
-+ /* receive interrupt */
-+ rx_schedule(dev);
-+ }
-+ if (status & DMA_STATUS_TI) {
-+ /* transmit interrupt */
-+ ar231x_tx_int(dev);
-+ }
-+ }
-+
-+ /* abnormal status */
-+ if (status & (DMA_STATUS_FBE | DMA_STATUS_TPS)) {
-+ ar231x_restart(dev);
-+ }
-+ return IRQ_HANDLED;
-+}
-+
-+
-+static int ar231x_open(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ unsigned int ethsal, ethsah;
-+
-+ /* reset the hardware, in case the MAC address changed */
-+ ethsah = ((((u_int) (dev->dev_addr[5]) << 8) & (u_int) 0x0000FF00) |
-+ (((u_int) (dev->dev_addr[4]) << 0) & (u_int) 0x000000FF));
-+
-+ ethsal = ((((u_int) (dev->dev_addr[3]) << 24) & (u_int) 0xFF000000) |
-+ (((u_int) (dev->dev_addr[2]) << 16) & (u_int) 0x00FF0000) |
-+ (((u_int) (dev->dev_addr[1]) << 8) & (u_int) 0x0000FF00) |
-+ (((u_int) (dev->dev_addr[0]) << 0) & (u_int) 0x000000FF));
-+
-+ sp->eth_regs->mac_addr[0] = ethsah;
-+ sp->eth_regs->mac_addr[1] = ethsal;
-+
-+ mdelay(10);
-+
-+ dev->mtu = 1500;
-+ netif_start_queue(dev);
-+
-+ sp->eth_regs->mac_control |= MAC_CONTROL_RE;
-+
-+ return 0;
-+}
-+
-+static void ar231x_halt(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ int j;
-+
-+ tasklet_disable(&sp->rx_tasklet);
-+
-+ /* kill the MAC */
-+ sp->eth_regs->mac_control &= ~(MAC_CONTROL_RE | /* disable Receives */
-+ MAC_CONTROL_TE); /* disable Transmits */
-+ /* stop dma */
-+ sp->dma_regs->control = 0;
-+ sp->dma_regs->bus_mode = DMA_BUS_MODE_SWR;
-+
-+ /* place phy and MAC in reset */
-+ *sp->int_regs |= (sp->cfg->reset_mac | sp->cfg->reset_phy);
-+
-+ /* free buffers on tx ring */
-+ for (j = 0; j < AR2313_DESCR_ENTRIES; j++) {
-+ struct sk_buff *skb;
-+ ar231x_descr_t *txdesc;
-+
-+ txdesc = &sp->tx_ring[j];
-+ txdesc->descr = 0;
-+
-+ skb = sp->tx_skb[j];
-+ if (skb) {
-+ dev_kfree_skb(skb);
-+ sp->tx_skb[j] = NULL;
-+ }
-+ }
-+}
-+
-+/*
-+ * close should do nothing. Here's why. It's called when
-+ * 'ifconfig bond0 down' is run. If it calls free_irq then
-+ * the irq is gone forever ! When bond0 is made 'up' again,
-+ * the ar231x_open () does not call request_irq (). Worse,
-+ * the call to ar231x_halt() generates a WDOG reset due to
-+ * the write to 'sp->int_regs' and the box reboots.
-+ * Commenting this out is good since it allows the
-+ * system to resume when bond0 is made up again.
-+ */
-+static int ar231x_close(struct net_device *dev)
-+{
-+#if 0
-+ /*
-+ * Disable interrupts
-+ */
-+ disable_irq(dev->irq);
-+
-+ /*
-+ * Without (or before) releasing irq and stopping hardware, this
-+ * is an absolute non-sense, by the way. It will be reset instantly
-+ * by the first irq.
-+ */
-+ netif_stop_queue(dev);
-+
-+ /* stop the MAC and DMA engines */
-+ ar231x_halt(dev);
-+
-+ /* release the interrupt */
-+ free_irq(dev->irq, dev);
-+
-+#endif
-+ return 0;
-+}
-+
-+static int ar231x_start_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ ar231x_descr_t *td;
-+ u32 idx;
-+
-+ idx = sp->tx_prd;
-+ td = &sp->tx_ring[idx];
-+
-+ if (td->status & DMA_TX_OWN) {
-+ /* free skbuf and lie to the caller that we sent it out */
-+ dev->stats.tx_dropped++;
-+ dev_kfree_skb(skb);
-+
-+ /* restart transmitter in case locked */
-+ sp->dma_regs->xmt_poll = 0;
-+ return 0;
-+ }
-+
-+ /* Setup the transmit descriptor. */
-+ td->devcs = ((skb->len << DMA_TX1_BSIZE_SHIFT) |
-+ (DMA_TX1_LS | DMA_TX1_IC | DMA_TX1_CHAINED));
-+ td->addr = dma_map_single(NULL, skb->data, skb->len, DMA_TO_DEVICE);
-+ td->status = DMA_TX_OWN;
-+
-+ /* kick transmitter last */
-+ sp->dma_regs->xmt_poll = 0;
-+
-+ sp->tx_skb[idx] = skb;
-+ idx = DSC_NEXT(idx);
-+ sp->tx_prd = idx;
-+
-+ return 0;
-+}
-+
-+static int ar231x_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
-+{
-+ struct mii_ioctl_data *data = (struct mii_ioctl_data *) &ifr->ifr_data;
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ int ret;
-+
-+ switch (cmd) {
-+
-+ case SIOCETHTOOL:
-+ spin_lock_irq(&sp->lock);
-+ ret = phy_ethtool_ioctl(sp->phy_dev, (void *) ifr->ifr_data);
-+ spin_unlock_irq(&sp->lock);
-+ return ret;
-+
-+ case SIOCSIFHWADDR:
-+ if (copy_from_user
-+ (dev->dev_addr, ifr->ifr_data, sizeof(dev->dev_addr)))
-+ return -EFAULT;
-+ return 0;
-+
-+ case SIOCGIFHWADDR:
-+ if (copy_to_user
-+ (ifr->ifr_data, dev->dev_addr, sizeof(dev->dev_addr)))
-+ return -EFAULT;
-+ return 0;
-+
-+ case SIOCGMIIPHY:
-+ case SIOCGMIIREG:
-+ case SIOCSMIIREG:
-+ return phy_mii_ioctl(sp->phy_dev, data, cmd);
-+
-+ default:
-+ break;
-+ }
-+
-+ return -EOPNOTSUPP;
-+}
-+
-+static void ar231x_adjust_link(struct net_device *dev)
-+{
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ unsigned int mc;
-+
-+ if (!sp->phy_dev->link)
-+ return;
-+
-+ if (sp->phy_dev->duplex != sp->oldduplex) {
-+ mc = readl(&sp->eth_regs->mac_control);
-+ mc &= ~(MAC_CONTROL_F | MAC_CONTROL_DRO);
-+ if (sp->phy_dev->duplex)
-+ mc |= MAC_CONTROL_F;
-+ else
-+ mc |= MAC_CONTROL_DRO;
-+ writel(mc, &sp->eth_regs->mac_control);
-+ sp->oldduplex = sp->phy_dev->duplex;
-+ }
-+}
-+
-+#define MII_ADDR(phy, reg) \
-+ ((reg << MII_ADDR_REG_SHIFT) | (phy << MII_ADDR_PHY_SHIFT))
-+
-+static int
-+ar231x_mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum)
-+{
-+ struct net_device *const dev = bus->priv;
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ volatile ETHERNET_STRUCT *ethernet = sp->phy_regs;
-+
-+ ethernet->mii_addr = MII_ADDR(phy_addr, regnum);
-+ while (ethernet->mii_addr & MII_ADDR_BUSY);
-+ return (ethernet->mii_data >> MII_DATA_SHIFT);
-+}
-+
-+static int
-+ar231x_mdiobus_write(struct mii_bus *bus, int phy_addr, int regnum,
-+ u16 value)
-+{
-+ struct net_device *const dev = bus->priv;
-+ struct ar231x_private *sp = netdev_priv(dev);
-+ volatile ETHERNET_STRUCT *ethernet = sp->phy_regs;
-+
-+ while (ethernet->mii_addr & MII_ADDR_BUSY);
-+ ethernet->mii_data = value << MII_DATA_SHIFT;
-+ ethernet->mii_addr = MII_ADDR(phy_addr, regnum) | MII_ADDR_WRITE;
-+
-+ return 0;
-+}
-+
-+static int ar231x_mdiobus_reset(struct mii_bus *bus)
-+{
-+ struct net_device *const dev = bus->priv;
-+
-+ ar231x_reset_reg(dev);
-+
-+ return 0;
-+}
-+
-+static int ar231x_mdiobus_probe (struct net_device *dev)
-+{
-+ struct ar231x_private *const sp = netdev_priv(dev);
-+ struct phy_device *phydev = NULL;
-+ int phy_addr;
-+
-+ /* find the first (lowest address) PHY on the current MAC's MII bus */
-+ for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++)
-+ if (sp->mii_bus->phy_map[phy_addr]) {
-+ phydev = sp->mii_bus->phy_map[phy_addr];
-+ sp->phy = phy_addr;
-+ break; /* break out with first one found */
-+ }
-+
-+ if (!phydev) {
-+ printk (KERN_ERR "ar231x: %s: no PHY found\n", dev->name);
-+ return -1;
-+ }
-+
-+ /* now we are supposed to have a proper phydev, to attach to... */
-+ BUG_ON(!phydev);
-+ BUG_ON(phydev->attached_dev);
-+
-+ phydev = phy_connect(dev, dev_name(&phydev->dev), &ar231x_adjust_link, 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 */
-+ phydev->supported &= (SUPPORTED_10baseT_Half
-+ | SUPPORTED_10baseT_Full
-+ | SUPPORTED_100baseT_Half
-+ | SUPPORTED_100baseT_Full
-+ | SUPPORTED_Autoneg
-+ /* | SUPPORTED_Pause | SUPPORTED_Asym_Pause */
-+ | SUPPORTED_MII
-+ | SUPPORTED_TP);
-+
-+ phydev->advertising = phydev->supported;
-+
-+ sp->oldduplex = -1;
-+ sp->phy_dev = phydev;
-+
-+ printk(KERN_INFO "%s: attached PHY driver [%s] "
-+ "(mii_bus:phy_addr=%s)\n",
-+ dev->name, phydev->drv->name, dev_name(&phydev->dev));
-+
-+ return 0;
-+}
-+
---- /dev/null
-+++ b/drivers/net/ar231x.h
-@@ -0,0 +1,302 @@
-+/*
-+ * ar231x.h: Linux driver for the Atheros AR231x Ethernet device.
-+ *
-+ * Copyright (C) 2004 by Sameer Dekate <sdekate@arubanetworks.com>
-+ * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org>
-+ *
-+ * Thanks to Atheros for providing hardware and documentation
-+ * enabling me to write this 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.
-+ */
-+
-+#ifndef _AR2313_H_
-+#define _AR2313_H_
-+
-+#include <generated/autoconf.h>
-+#include <linux/bitops.h>
-+#include <asm/bootinfo.h>
-+#include <ar231x_platform.h>
-+
-+/*
-+ * probe link timer - 5 secs
-+ */
-+#define LINK_TIMER (5*HZ)
-+
-+#define IS_DMA_TX_INT(X) (((X) & (DMA_STATUS_TI)) != 0)
-+#define IS_DMA_RX_INT(X) (((X) & (DMA_STATUS_RI)) != 0)
-+#define IS_DRIVER_OWNED(X) (((X) & (DMA_TX_OWN)) == 0)
-+
-+#define AR2313_TX_TIMEOUT (HZ/4)
-+
-+/*
-+ * Rings
-+ */
-+#define DSC_RING_ENTRIES_SIZE (AR2313_DESCR_ENTRIES * sizeof(struct desc))
-+#define DSC_NEXT(idx) ((idx + 1) & (AR2313_DESCR_ENTRIES - 1))
-+
-+#define AR2313_MBGET 2
-+#define AR2313_MBSET 3
-+#define AR2313_PCI_RECONFIG 4
-+#define AR2313_PCI_DUMP 5
-+#define AR2313_TEST_PANIC 6
-+#define AR2313_TEST_NULLPTR 7
-+#define AR2313_READ_DATA 8
-+#define AR2313_WRITE_DATA 9
-+#define AR2313_GET_VERSION 10
-+#define AR2313_TEST_HANG 11
-+#define AR2313_SYNC 12
-+
-+#define DMA_RX_ERR_CRC BIT(1)
-+#define DMA_RX_ERR_DRIB BIT(2)
-+#define DMA_RX_ERR_MII BIT(3)
-+#define DMA_RX_EV2 BIT(5)
-+#define DMA_RX_ERR_COL BIT(6)
-+#define DMA_RX_LONG BIT(7)
-+#define DMA_RX_LS BIT(8) /* last descriptor */
-+#define DMA_RX_FS BIT(9) /* first descriptor */
-+#define DMA_RX_MF BIT(10) /* multicast frame */
-+#define DMA_RX_ERR_RUNT BIT(11) /* runt frame */
-+#define DMA_RX_ERR_LENGTH BIT(12) /* length error */
-+#define DMA_RX_ERR_DESC BIT(14) /* descriptor error */
-+#define DMA_RX_ERROR BIT(15) /* error summary */
-+#define DMA_RX_LEN_MASK 0x3fff0000
-+#define DMA_RX_LEN_SHIFT 16
-+#define DMA_RX_FILT BIT(30)
-+#define DMA_RX_OWN BIT(31) /* desc owned by DMA controller */
-+
-+#define DMA_RX1_BSIZE_MASK 0x000007ff
-+#define DMA_RX1_BSIZE_SHIFT 0
-+#define DMA_RX1_CHAINED BIT(24)
-+#define DMA_RX1_RER BIT(25)
-+
-+#define DMA_TX_ERR_UNDER BIT(1) /* underflow error */
-+#define DMA_TX_ERR_DEFER BIT(2) /* excessive deferral */
-+#define DMA_TX_COL_MASK 0x78
-+#define DMA_TX_COL_SHIFT 3
-+#define DMA_TX_ERR_HB BIT(7) /* hearbeat failure */
-+#define DMA_TX_ERR_COL BIT(8) /* excessive collisions */
-+#define DMA_TX_ERR_LATE BIT(9) /* late collision */
-+#define DMA_TX_ERR_LINK BIT(10) /* no carrier */
-+#define DMA_TX_ERR_LOSS BIT(11) /* loss of carrier */
-+#define DMA_TX_ERR_JABBER BIT(14) /* transmit jabber timeout */
-+#define DMA_TX_ERROR BIT(15) /* frame aborted */
-+#define DMA_TX_OWN BIT(31) /* descr owned by DMA controller */
-+
-+#define DMA_TX1_BSIZE_MASK 0x000007ff
-+#define DMA_TX1_BSIZE_SHIFT 0
-+#define DMA_TX1_CHAINED BIT(24) /* chained descriptors */
-+#define DMA_TX1_TER BIT(25) /* transmit end of ring */
-+#define DMA_TX1_FS BIT(29) /* first segment */
-+#define DMA_TX1_LS BIT(30) /* last segment */
-+#define DMA_TX1_IC BIT(31) /* interrupt on completion */
-+
-+#define RCVPKT_LENGTH(X) (X >> 16) /* Received pkt Length */
-+
-+#define MAC_CONTROL_RE BIT(2) /* receive enable */
-+#define MAC_CONTROL_TE BIT(3) /* transmit enable */
-+#define MAC_CONTROL_DC BIT(5) /* Deferral check */
-+#define MAC_CONTROL_ASTP BIT(8) /* Auto pad strip */
-+#define MAC_CONTROL_DRTY BIT(10) /* Disable retry */
-+#define MAC_CONTROL_DBF BIT(11) /* Disable bcast frames */
-+#define MAC_CONTROL_LCC BIT(12) /* late collision ctrl */
-+#define MAC_CONTROL_HP BIT(13) /* Hash Perfect filtering */
-+#define MAC_CONTROL_HASH BIT(14) /* Unicast hash filtering */
-+#define MAC_CONTROL_HO BIT(15) /* Hash only filtering */
-+#define MAC_CONTROL_PB BIT(16) /* Pass Bad frames */
-+#define MAC_CONTROL_IF BIT(17) /* Inverse filtering */
-+#define MAC_CONTROL_PR BIT(18) /* promiscuous mode (valid frames only) */
-+#define MAC_CONTROL_PM BIT(19) /* pass multicast */
-+#define MAC_CONTROL_F BIT(20) /* full-duplex */
-+#define MAC_CONTROL_DRO BIT(23) /* Disable Receive Own */
-+#define MAC_CONTROL_HBD BIT(28) /* heart-beat disabled (MUST BE SET) */
-+#define MAC_CONTROL_BLE BIT(30) /* big endian mode */
-+#define MAC_CONTROL_RA BIT(31) /* receive all (valid and invalid frames) */
-+
-+#define MII_ADDR_BUSY BIT(0)
-+#define MII_ADDR_WRITE BIT(1)
-+#define MII_ADDR_REG_SHIFT 6
-+#define MII_ADDR_PHY_SHIFT 11
-+#define MII_DATA_SHIFT 0
-+
-+#define FLOW_CONTROL_FCE BIT(1)
-+
-+#define DMA_BUS_MODE_SWR BIT(0) /* software reset */
-+#define DMA_BUS_MODE_BLE BIT(7) /* big endian mode */
-+#define DMA_BUS_MODE_PBL_SHIFT 8 /* programmable burst length 32 */
-+#define DMA_BUS_MODE_DBO BIT(20) /* big-endian descriptors */
-+
-+#define DMA_STATUS_TI BIT(0) /* transmit interrupt */
-+#define DMA_STATUS_TPS BIT(1) /* transmit process stopped */
-+#define DMA_STATUS_TU BIT(2) /* transmit buffer unavailable */
-+#define DMA_STATUS_TJT BIT(3) /* transmit buffer timeout */
-+#define DMA_STATUS_UNF BIT(5) /* transmit underflow */
-+#define DMA_STATUS_RI BIT(6) /* receive interrupt */
-+#define DMA_STATUS_RU BIT(7) /* receive buffer unavailable */
-+#define DMA_STATUS_RPS BIT(8) /* receive process stopped */
-+#define DMA_STATUS_ETI BIT(10) /* early transmit interrupt */
-+#define DMA_STATUS_FBE BIT(13) /* fatal bus interrupt */
-+#define DMA_STATUS_ERI BIT(14) /* early receive interrupt */
-+#define DMA_STATUS_AIS BIT(15) /* abnormal interrupt summary */
-+#define DMA_STATUS_NIS BIT(16) /* normal interrupt summary */
-+#define DMA_STATUS_RS_SHIFT 17 /* receive process state */
-+#define DMA_STATUS_TS_SHIFT 20 /* transmit process state */
-+#define DMA_STATUS_EB_SHIFT 23 /* error bits */
-+
-+#define DMA_CONTROL_SR BIT(1) /* start receive */
-+#define DMA_CONTROL_ST BIT(13) /* start transmit */
-+#define DMA_CONTROL_SF BIT(21) /* store and forward */
-+
-+
-+typedef struct {
-+ volatile unsigned int status; // OWN, Device control and status.
-+ volatile unsigned int devcs; // pkt Control bits + Length
-+ volatile unsigned int addr; // Current Address.
-+ volatile unsigned int descr; // Next descriptor in chain.
-+} ar231x_descr_t;
-+
-+
-+
-+//
-+// New Combo structure for Both Eth0 AND eth1
-+//
-+typedef struct {
-+ volatile unsigned int mac_control; /* 0x00 */
-+ volatile unsigned int mac_addr[2]; /* 0x04 - 0x08 */
-+ volatile unsigned int mcast_table[2]; /* 0x0c - 0x10 */
-+ volatile unsigned int mii_addr; /* 0x14 */
-+ volatile unsigned int mii_data; /* 0x18 */
-+ volatile unsigned int flow_control; /* 0x1c */
-+ volatile unsigned int vlan_tag; /* 0x20 */
-+ volatile unsigned int pad[7]; /* 0x24 - 0x3c */
-+ volatile unsigned int ucast_table[8]; /* 0x40-0x5c */
-+
-+} ETHERNET_STRUCT;
-+
-+/********************************************************************
-+ * Interrupt controller
-+ ********************************************************************/
-+
-+typedef struct {
-+ volatile unsigned int wdog_control; /* 0x08 */
-+ volatile unsigned int wdog_timer; /* 0x0c */
-+ volatile unsigned int misc_status; /* 0x10 */
-+ volatile unsigned int misc_mask; /* 0x14 */
-+ volatile unsigned int global_status; /* 0x18 */
-+ volatile unsigned int reserved; /* 0x1c */
-+ volatile unsigned int reset_control; /* 0x20 */
-+} INTERRUPT;
-+
-+/********************************************************************
-+ * DMA controller
-+ ********************************************************************/
-+typedef struct {
-+ volatile unsigned int bus_mode; /* 0x00 (CSR0) */
-+ volatile unsigned int xmt_poll; /* 0x04 (CSR1) */
-+ volatile unsigned int rcv_poll; /* 0x08 (CSR2) */
-+ volatile unsigned int rcv_base; /* 0x0c (CSR3) */
-+ volatile unsigned int xmt_base; /* 0x10 (CSR4) */
-+ volatile unsigned int status; /* 0x14 (CSR5) */
-+ volatile unsigned int control; /* 0x18 (CSR6) */
-+ volatile unsigned int intr_ena; /* 0x1c (CSR7) */
-+ volatile unsigned int rcv_missed; /* 0x20 (CSR8) */
-+ volatile unsigned int reserved[11]; /* 0x24-0x4c (CSR9-19) */
-+ volatile unsigned int cur_tx_buf_addr; /* 0x50 (CSR20) */
-+ volatile unsigned int cur_rx_buf_addr; /* 0x50 (CSR21) */
-+} DMA;
-+
-+/*
-+ * Struct private for the Sibyte.
-+ *
-+ * Elements are grouped so variables used by the tx handling goes
-+ * together, and will go into the same cache lines etc. in order to
-+ * avoid cache line contention between the rx and tx handling on SMP.
-+ *
-+ * Frequently accessed variables are put at the beginning of the
-+ * struct to help the compiler generate better/shorter code.
-+ */
-+struct ar231x_private {
-+ struct net_device *dev;
-+ int version;
-+ u32 mb[2];
-+
-+ volatile ETHERNET_STRUCT *phy_regs;
-+ volatile ETHERNET_STRUCT *eth_regs;
-+ volatile DMA *dma_regs;
-+ volatile u32 *int_regs;
-+ struct ar231x_eth *cfg;
-+
-+ spinlock_t lock; /* Serialise access to device */
-+
-+ /*
-+ * RX and TX descriptors, must be adjacent
-+ */
-+ ar231x_descr_t *rx_ring;
-+ ar231x_descr_t *tx_ring;
-+
-+
-+ struct sk_buff **rx_skb;
-+ struct sk_buff **tx_skb;
-+
-+ /*
-+ * RX elements
-+ */
-+ u32 rx_skbprd;
-+ u32 cur_rx;
-+
-+ /*
-+ * TX elements
-+ */
-+ u32 tx_prd;
-+ u32 tx_csm;
-+
-+ /*
-+ * Misc elements
-+ */
-+ char name[48];
-+ struct {
-+ u32 address;
-+ u32 length;
-+ char *mapping;
-+ } desc;
-+
-+
-+ struct timer_list link_timer;
-+ unsigned short phy; /* merlot phy = 1, samsung phy = 0x1f */
-+ unsigned short mac;
-+ unsigned short link; /* 0 - link down, 1 - link up */
-+ u16 phyData;
-+
-+ struct tasklet_struct rx_tasklet;
-+ int unloading;
-+
-+ struct phy_device *phy_dev;
-+ struct mii_bus *mii_bus;
-+ int oldduplex;
-+};
-+
-+
-+/*
-+ * Prototypes
-+ */
-+static int ar231x_init(struct net_device *dev);
-+#ifdef TX_TIMEOUT
-+static void ar231x_tx_timeout(struct net_device *dev);
-+#endif
-+static int ar231x_restart(struct net_device *dev);
-+static void ar231x_load_rx_ring(struct net_device *dev, int bufs);
-+static irqreturn_t ar231x_interrupt(int irq, void *dev_id);
-+static int ar231x_open(struct net_device *dev);
-+static int ar231x_start_xmit(struct sk_buff *skb, struct net_device *dev);
-+static int ar231x_close(struct net_device *dev);
-+static int ar231x_ioctl(struct net_device *dev, struct ifreq *ifr,
-+ int cmd);
-+static void ar231x_init_cleanup(struct net_device *dev);
-+static int ar231x_setup_timer(struct net_device *dev);
-+static void ar231x_link_timer_fn(unsigned long data);
-+static void ar231x_check_link(struct net_device *dev);
-+#endif /* _AR2313_H_ */
+++ /dev/null
---- a/drivers/mtd/devices/Kconfig
-+++ b/drivers/mtd/devices/Kconfig
-@@ -112,6 +112,10 @@ config MTD_SST25L
- Set up your spi devices with the right board-specific platform data,
- if you want to specify device partitioning.
-
-+config MTD_AR2315
-+ tristate "Atheros AR2315+ SPI Flash support"
-+ depends on ATHEROS_AR2315
-+
- config MTD_SLRAM
- tristate "Uncached system RAM"
- help
---- a/drivers/mtd/devices/Makefile
-+++ b/drivers/mtd/devices/Makefile
-@@ -17,3 +17,4 @@ obj-$(CONFIG_MTD_BLOCK2MTD) += block2mtd
- obj-$(CONFIG_MTD_DATAFLASH) += mtd_dataflash.o
- obj-$(CONFIG_MTD_M25P80) += m25p80.o
- obj-$(CONFIG_MTD_SST25L) += sst25l.o
-+obj-$(CONFIG_MTD_AR2315) += ar2315.o
---- /dev/null
-+++ b/drivers/mtd/devices/ar2315.c
-@@ -0,0 +1,517 @@
-+
-+/*
-+ * MTD driver for the SPI Flash Memory support on Atheros AR2315
-+ *
-+ * Copyright (c) 2005-2006 Atheros Communications Inc.
-+ * Copyright (C) 2006-2007 FON Technology, SL.
-+ * Copyright (C) 2006-2007 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org>
-+ *
-+ * This code is free software; you can 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/types.h>
-+#include <linux/version.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
-+#include <linux/platform_device.h>
-+#include <linux/sched.h>
-+#include <linux/root_dev.h>
-+#include <linux/delay.h>
-+#include <asm/delay.h>
-+#include <asm/io.h>
-+
-+#include <ar2315_spiflash.h>
-+#include <ar231x_platform.h>
-+#include <ar231x.h>
-+
-+
-+#define SPIFLASH "spiflash: "
-+#define busy_wait(_priv, _condition, _wait) do { \
-+ while (_condition) { \
-+ spin_unlock_bh(&_priv->lock); \
-+ if (_wait > 1) \
-+ msleep(_wait); \
-+ else if ((_wait == 1) && need_resched()) \
-+ schedule(); \
-+ else \
-+ udelay(1); \
-+ spin_lock_bh(&_priv->lock); \
-+ } \
-+} while (0)
-+
-+enum {
-+ FLASH_NONE,
-+ FLASH_1MB,
-+ FLASH_2MB,
-+ FLASH_4MB,
-+ FLASH_8MB,
-+ FLASH_16MB,
-+};
-+
-+/* Flash configuration table */
-+struct flashconfig {
-+ u32 byte_cnt;
-+ u32 sector_cnt;
-+ u32 sector_size;
-+};
-+
-+const struct flashconfig flashconfig_tbl[] = {
-+ [FLASH_NONE] = { 0, 0, 0},
-+ [FLASH_1MB] = { STM_1MB_BYTE_COUNT, STM_1MB_SECTOR_COUNT, STM_1MB_SECTOR_SIZE},
-+ [FLASH_2MB] = { STM_2MB_BYTE_COUNT, STM_2MB_SECTOR_COUNT, STM_2MB_SECTOR_SIZE},
-+ [FLASH_4MB] = { STM_4MB_BYTE_COUNT, STM_4MB_SECTOR_COUNT, STM_4MB_SECTOR_SIZE},
-+ [FLASH_8MB] = { STM_8MB_BYTE_COUNT, STM_8MB_SECTOR_COUNT, STM_8MB_SECTOR_SIZE},
-+ [FLASH_16MB] = { STM_16MB_BYTE_COUNT, STM_16MB_SECTOR_COUNT, STM_16MB_SECTOR_SIZE}
-+};
-+
-+/* Mapping of generic opcodes to STM serial flash opcodes */
-+enum {
-+ SPI_WRITE_ENABLE,
-+ SPI_WRITE_DISABLE,
-+ SPI_RD_STATUS,
-+ SPI_WR_STATUS,
-+ SPI_RD_DATA,
-+ SPI_FAST_RD_DATA,
-+ SPI_PAGE_PROGRAM,
-+ SPI_SECTOR_ERASE,
-+ SPI_BULK_ERASE,
-+ SPI_DEEP_PWRDOWN,
-+ SPI_RD_SIG,
-+};
-+
-+struct opcodes {
-+ __u16 code;
-+ __s8 tx_cnt;
-+ __s8 rx_cnt;
-+};
-+const struct opcodes stm_opcodes[] = {
-+ [SPI_WRITE_ENABLE] = {STM_OP_WR_ENABLE, 1, 0},
-+ [SPI_WRITE_DISABLE] = {STM_OP_WR_DISABLE, 1, 0},
-+ [SPI_RD_STATUS] = {STM_OP_RD_STATUS, 1, 1},
-+ [SPI_WR_STATUS] = {STM_OP_WR_STATUS, 1, 0},
-+ [SPI_RD_DATA] = {STM_OP_RD_DATA, 4, 4},
-+ [SPI_FAST_RD_DATA] = {STM_OP_FAST_RD_DATA, 5, 0},
-+ [SPI_PAGE_PROGRAM] = {STM_OP_PAGE_PGRM, 8, 0},
-+ [SPI_SECTOR_ERASE] = {STM_OP_SECTOR_ERASE, 4, 0},
-+ [SPI_BULK_ERASE] = {STM_OP_BULK_ERASE, 1, 0},
-+ [SPI_DEEP_PWRDOWN] = {STM_OP_DEEP_PWRDOWN, 1, 0},
-+ [SPI_RD_SIG] = {STM_OP_RD_SIG, 4, 1},
-+};
-+
-+/* Driver private data structure */
-+struct spiflash_priv {
-+ struct mtd_info mtd;
-+ void *readaddr; /* memory mapped data for read */
-+ void *mmraddr; /* memory mapped register space */
-+ wait_queue_head_t wq;
-+ spinlock_t lock;
-+ int state;
-+};
-+
-+#define to_spiflash(_mtd) container_of(_mtd, struct spiflash_priv, mtd)
-+
-+enum {
-+ FL_READY,
-+ FL_READING,
-+ FL_ERASING,
-+ FL_WRITING
-+};
-+
-+/***************************************************************************************************/
-+
-+static u32
-+spiflash_read_reg(struct spiflash_priv *priv, int reg)
-+{
-+ return ar231x_read_reg((u32) priv->mmraddr + reg);
-+}
-+
-+static void
-+spiflash_write_reg(struct spiflash_priv *priv, int reg, u32 data)
-+{
-+ ar231x_write_reg((u32) priv->mmraddr + reg, data);
-+}
-+
-+static u32
-+spiflash_wait_busy(struct spiflash_priv *priv)
-+{
-+ u32 reg;
-+
-+ busy_wait(priv, (reg = spiflash_read_reg(priv, SPI_FLASH_CTL)) &
-+ SPI_CTL_BUSY, 0);
-+ return reg;
-+}
-+
-+static u32
-+spiflash_sendcmd (struct spiflash_priv *priv, int opcode, u32 addr)
-+{
-+ const struct opcodes *op;
-+ u32 reg, mask;
-+
-+ op = &stm_opcodes[opcode];
-+ reg = spiflash_wait_busy(priv);
-+ spiflash_write_reg(priv, SPI_FLASH_OPCODE,
-+ ((u32) op->code) | (addr << 8));
-+
-+ reg &= ~SPI_CTL_TX_RX_CNT_MASK;
-+ reg |= SPI_CTL_START | op->tx_cnt | (op->rx_cnt << 4);
-+
-+ spiflash_write_reg(priv, SPI_FLASH_CTL, reg);
-+ spiflash_wait_busy(priv);
-+
-+ if (!op->rx_cnt)
-+ return 0;
-+
-+ reg = spiflash_read_reg(priv, SPI_FLASH_DATA);
-+
-+ switch (op->rx_cnt) {
-+ case 1:
-+ mask = 0x000000ff;
-+ break;
-+ case 2:
-+ mask = 0x0000ffff;
-+ break;
-+ case 3:
-+ mask = 0x00ffffff;
-+ break;
-+ default:
-+ mask = 0xffffffff;
-+ break;
-+ }
-+ reg &= mask;
-+
-+ return reg;
-+}
-+
-+
-+/*
-+ * Probe SPI flash device
-+ * Function returns 0 for failure.
-+ * and flashconfig_tbl array index for success.
-+ */
-+static int
-+spiflash_probe_chip (struct spiflash_priv *priv)
-+{
-+ u32 sig;
-+ int flash_size;
-+
-+ /* Read the signature on the flash device */
-+ spin_lock_bh(&priv->lock);
-+ sig = spiflash_sendcmd(priv, SPI_RD_SIG, 0);
-+ spin_unlock_bh(&priv->lock);
-+
-+ switch (sig) {
-+ case STM_8MBIT_SIGNATURE:
-+ flash_size = FLASH_1MB;
-+ break;
-+ case STM_16MBIT_SIGNATURE:
-+ flash_size = FLASH_2MB;
-+ break;
-+ case STM_32MBIT_SIGNATURE:
-+ flash_size = FLASH_4MB;
-+ break;
-+ case STM_64MBIT_SIGNATURE:
-+ flash_size = FLASH_8MB;
-+ break;
-+ case STM_128MBIT_SIGNATURE:
-+ flash_size = FLASH_16MB;
-+ break;
-+ default:
-+ printk (KERN_WARNING SPIFLASH "Read of flash device signature failed!\n");
-+ return 0;
-+ }
-+
-+ return flash_size;
-+}
-+
-+
-+/* wait until the flash chip is ready and grab a lock */
-+static int spiflash_wait_ready(struct spiflash_priv *priv, int state)
-+{
-+ DECLARE_WAITQUEUE(wait, current);
-+
-+retry:
-+ spin_lock_bh(&priv->lock);
-+ if (priv->state != FL_READY) {
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ add_wait_queue(&priv->wq, &wait);
-+ spin_unlock_bh(&priv->lock);
-+ schedule();
-+ remove_wait_queue(&priv->wq, &wait);
-+
-+ if(signal_pending(current))
-+ return 0;
-+
-+ goto retry;
-+ }
-+ priv->state = state;
-+
-+ return 1;
-+}
-+
-+static inline void spiflash_done(struct spiflash_priv *priv)
-+{
-+ priv->state = FL_READY;
-+ spin_unlock_bh(&priv->lock);
-+ wake_up(&priv->wq);
-+}
-+
-+static void
-+spiflash_wait_complete(struct spiflash_priv *priv, unsigned int timeout)
-+{
-+ busy_wait(priv, spiflash_sendcmd(priv, SPI_RD_STATUS, 0) &
-+ SPI_STATUS_WIP, timeout);
-+ spiflash_done(priv);
-+}
-+
-+
-+
-+static int
-+spiflash_erase (struct mtd_info *mtd, struct erase_info *instr)
-+{
-+ struct spiflash_priv *priv = to_spiflash(mtd);
-+ const struct opcodes *op;
-+ u32 temp, reg;
-+
-+ if (instr->addr + instr->len > mtd->size)
-+ return -EINVAL;
-+
-+ if (!spiflash_wait_ready(priv, FL_ERASING))
-+ return -EINTR;
-+
-+ spiflash_sendcmd(priv, SPI_WRITE_ENABLE, 0);
-+ reg = spiflash_wait_busy(priv);
-+
-+ op = &stm_opcodes[SPI_SECTOR_ERASE];
-+ temp = ((u32)instr->addr << 8) | (u32)(op->code);
-+ spiflash_write_reg(priv, SPI_FLASH_OPCODE, temp);
-+
-+ reg &= ~SPI_CTL_TX_RX_CNT_MASK;
-+ reg |= op->tx_cnt | SPI_CTL_START;
-+ spiflash_write_reg(priv, SPI_FLASH_CTL, reg);
-+
-+ spiflash_wait_complete(priv, 20);
-+
-+ instr->state = MTD_ERASE_DONE;
-+ mtd_erase_callback(instr);
-+
-+ return 0;
-+}
-+
-+static int
-+spiflash_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
-+{
-+ struct spiflash_priv *priv = to_spiflash(mtd);
-+ u8 *read_addr;
-+
-+ if (!len)
-+ return 0;
-+
-+ if (from + len > mtd->size)
-+ return -EINVAL;
-+
-+ *retlen = len;
-+
-+ if (!spiflash_wait_ready(priv, FL_READING))
-+ return -EINTR;
-+
-+ read_addr = (u8 *)(priv->readaddr + from);
-+ memcpy_fromio(buf, read_addr, len);
-+ spiflash_done(priv);
-+
-+ return 0;
-+}
-+
-+static int
-+spiflash_write (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u8 *buf)
-+{
-+ struct spiflash_priv *priv = to_spiflash(mtd);
-+ u32 opcode, bytes_left;
-+
-+ *retlen = 0;
-+
-+ if (!len)
-+ return 0;
-+
-+ if (to + len > mtd->size)
-+ return -EINVAL;
-+
-+ bytes_left = len;
-+
-+ do {
-+ u32 read_len, reg, page_offset, spi_data = 0;
-+
-+ read_len = min(bytes_left, sizeof(u32));
-+
-+ /* 32-bit writes cannot span across a page boundary
-+ * (256 bytes). This types of writes require two page
-+ * program operations to handle it correctly. The STM part
-+ * will write the overflow data to the beginning of the
-+ * current page as opposed to the subsequent page.
-+ */
-+ page_offset = (to & (STM_PAGE_SIZE - 1)) + read_len;
-+
-+ if (page_offset > STM_PAGE_SIZE)
-+ read_len -= (page_offset - STM_PAGE_SIZE);
-+
-+ if (!spiflash_wait_ready(priv, FL_WRITING))
-+ return -EINTR;
-+
-+ spiflash_sendcmd(priv, SPI_WRITE_ENABLE, 0);
-+ spi_data = 0;
-+ switch (read_len) {
-+ case 4:
-+ spi_data |= buf[3] << 24;
-+ /* fall through */
-+ case 3:
-+ spi_data |= buf[2] << 16;
-+ /* fall through */
-+ case 2:
-+ spi_data |= buf[1] << 8;
-+ /* fall through */
-+ case 1:
-+ spi_data |= buf[0] & 0xff;
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ spiflash_write_reg(priv, SPI_FLASH_DATA, spi_data);
-+ opcode = stm_opcodes[SPI_PAGE_PROGRAM].code |
-+ (to & 0x00ffffff) << 8;
-+ spiflash_write_reg(priv, SPI_FLASH_OPCODE, opcode);
-+
-+ reg = spiflash_read_reg(priv, SPI_FLASH_CTL);
-+ reg &= ~SPI_CTL_TX_RX_CNT_MASK;
-+ reg |= (read_len + 4) | SPI_CTL_START;
-+ spiflash_write_reg(priv, SPI_FLASH_CTL, reg);
-+
-+ spiflash_wait_complete(priv, 1);
-+
-+ bytes_left -= read_len;
-+ to += read_len;
-+ buf += read_len;
-+
-+ *retlen += read_len;
-+ } while (bytes_left != 0);
-+
-+ return 0;
-+}
-+
-+
-+#ifdef CONFIG_MTD_PARTITIONS
-+static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", "MyLoader", NULL };
-+#endif
-+
-+
-+static int
-+spiflash_probe(struct platform_device *pdev)
-+{
-+ struct spiflash_priv *priv;
-+ struct mtd_partition *parts;
-+ struct mtd_info *mtd;
-+ int index, num_parts;
-+ int result = 0;
-+
-+ priv = kzalloc(sizeof(struct spiflash_priv), GFP_KERNEL);
-+ spin_lock_init(&priv->lock);
-+ init_waitqueue_head(&priv->wq);
-+ priv->state = FL_READY;
-+ mtd = &priv->mtd;
-+
-+ priv->mmraddr = ioremap_nocache(SPI_FLASH_MMR, SPI_FLASH_MMR_SIZE);
-+ if (!priv->mmraddr) {
-+ printk(KERN_WARNING SPIFLASH "Failed to map flash device\n");
-+ goto error;
-+ }
-+
-+ index = spiflash_probe_chip(priv);
-+ if (!index) {
-+ printk (KERN_WARNING SPIFLASH "Found no serial flash device\n");
-+ goto error;
-+ }
-+
-+ priv->readaddr = ioremap_nocache(SPI_FLASH_READ, flashconfig_tbl[index].byte_cnt);
-+ if (!priv->readaddr) {
-+ printk (KERN_WARNING SPIFLASH "Failed to map flash device\n");
-+ goto error;
-+ }
-+
-+ platform_set_drvdata(pdev, priv);
-+ mtd->name = "spiflash";
-+ mtd->type = MTD_NORFLASH;
-+ mtd->flags = (MTD_CAP_NORFLASH|MTD_WRITEABLE);
-+ mtd->size = flashconfig_tbl[index].byte_cnt;
-+ mtd->erasesize = flashconfig_tbl[index].sector_size;
-+ mtd->writesize = 1;
-+ mtd->numeraseregions = 0;
-+ mtd->eraseregions = NULL;
-+ mtd->erase = spiflash_erase;
-+ mtd->read = spiflash_read;
-+ mtd->write = spiflash_write;
-+ mtd->owner = THIS_MODULE;
-+
-+#ifdef CONFIG_MTD_PARTITIONS
-+ /* parse redboot partitions */
-+ num_parts = parse_mtd_partitions(mtd, part_probe_types, &parts, 0);
-+ if (!num_parts)
-+ goto error;
-+
-+ result = add_mtd_partitions(mtd, parts, num_parts);
-+#endif
-+
-+ return result;
-+
-+error:
-+ if (priv->mmraddr)
-+ iounmap(priv->mmraddr);
-+ kfree(priv);
-+ return -ENXIO;
-+}
-+
-+static int
-+spiflash_remove (struct platform_device *pdev)
-+{
-+ struct spiflash_priv *priv = platform_get_drvdata(pdev);
-+ struct mtd_info *mtd = &priv->mtd;
-+
-+ del_mtd_partitions(mtd);
-+ iounmap(priv->mmraddr);
-+ iounmap(priv->readaddr);
-+ kfree(priv);
-+
-+ return 0;
-+}
-+
-+struct platform_driver spiflash_driver = {
-+ .driver.name = "spiflash",
-+ .probe = spiflash_probe,
-+ .remove = spiflash_remove,
-+};
-+
-+int __init
-+spiflash_init (void)
-+{
-+ return platform_driver_register(&spiflash_driver);
-+}
-+
-+void __exit
-+spiflash_exit (void)
-+{
-+ return platform_driver_unregister(&spiflash_driver);
-+}
-+
-+module_init (spiflash_init);
-+module_exit (spiflash_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("OpenWrt.org, Atheros Communications Inc");
-+MODULE_DESCRIPTION("MTD driver for SPI Flash on Atheros SOC");
-+
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ar231x/ar2315_spiflash.h
-@@ -0,0 +1,116 @@
-+/*
-+ * SPI Flash Memory support header file.
-+ *
-+ * Copyright (c) 2005, Atheros Communications Inc.
-+ * Copyright (C) 2006 FON Technology, SL.
-+ * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org>
-+ *
-+ * This code is free software; you can 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 __AR2315_SPIFLASH_H
-+#define __AR2315_SPIFLASH_H
-+
-+#define STM_PAGE_SIZE 256
-+
-+#define SFI_WRITE_BUFFER_SIZE 4
-+#define SFI_FLASH_ADDR_MASK 0x00ffffff
-+
-+#define STM_8MBIT_SIGNATURE 0x13
-+#define STM_M25P80_BYTE_COUNT 1048576
-+#define STM_M25P80_SECTOR_COUNT 16
-+#define STM_M25P80_SECTOR_SIZE 0x10000
-+
-+#define STM_16MBIT_SIGNATURE 0x14
-+#define STM_M25P16_BYTE_COUNT 2097152
-+#define STM_M25P16_SECTOR_COUNT 32
-+#define STM_M25P16_SECTOR_SIZE 0x10000
-+
-+#define STM_32MBIT_SIGNATURE 0x15
-+#define STM_M25P32_BYTE_COUNT 4194304
-+#define STM_M25P32_SECTOR_COUNT 64
-+#define STM_M25P32_SECTOR_SIZE 0x10000
-+
-+#define STM_64MBIT_SIGNATURE 0x16
-+#define STM_M25P64_BYTE_COUNT 8388608
-+#define STM_M25P64_SECTOR_COUNT 128
-+#define STM_M25P64_SECTOR_SIZE 0x10000
-+
-+#define STM_128MBIT_SIGNATURE 0x17
-+#define STM_M25P128_BYTE_COUNT 16777216
-+#define STM_M25P128_SECTOR_COUNT 256
-+#define STM_M25P128_SECTOR_SIZE 0x10000
-+
-+#define STM_1MB_BYTE_COUNT STM_M25P80_BYTE_COUNT
-+#define STM_1MB_SECTOR_COUNT STM_M25P80_SECTOR_COUNT
-+#define STM_1MB_SECTOR_SIZE STM_M25P80_SECTOR_SIZE
-+#define STM_2MB_BYTE_COUNT STM_M25P16_BYTE_COUNT
-+#define STM_2MB_SECTOR_COUNT STM_M25P16_SECTOR_COUNT
-+#define STM_2MB_SECTOR_SIZE STM_M25P16_SECTOR_SIZE
-+#define STM_4MB_BYTE_COUNT STM_M25P32_BYTE_COUNT
-+#define STM_4MB_SECTOR_COUNT STM_M25P32_SECTOR_COUNT
-+#define STM_4MB_SECTOR_SIZE STM_M25P32_SECTOR_SIZE
-+#define STM_8MB_BYTE_COUNT STM_M25P64_BYTE_COUNT
-+#define STM_8MB_SECTOR_COUNT STM_M25P64_SECTOR_COUNT
-+#define STM_8MB_SECTOR_SIZE STM_M25P64_SECTOR_SIZE
-+#define STM_16MB_BYTE_COUNT STM_M25P128_BYTE_COUNT
-+#define STM_16MB_SECTOR_COUNT STM_M25P128_SECTOR_COUNT
-+#define STM_16MB_SECTOR_SIZE STM_M25P128_SECTOR_SIZE
-+
-+/*
-+ * ST Microelectronics Opcodes for Serial Flash
-+ */
-+
-+#define STM_OP_WR_ENABLE 0x06 /* Write Enable */
-+#define STM_OP_WR_DISABLE 0x04 /* Write Disable */
-+#define STM_OP_RD_STATUS 0x05 /* Read Status */
-+#define STM_OP_WR_STATUS 0x01 /* Write Status */
-+#define STM_OP_RD_DATA 0x03 /* Read Data */
-+#define STM_OP_FAST_RD_DATA 0x0b /* Fast Read Data */
-+#define STM_OP_PAGE_PGRM 0x02 /* Page Program */
-+#define STM_OP_SECTOR_ERASE 0xd8 /* Sector Erase */
-+#define STM_OP_BULK_ERASE 0xc7 /* Bulk Erase */
-+#define STM_OP_DEEP_PWRDOWN 0xb9 /* Deep Power-Down Mode */
-+#define STM_OP_RD_SIG 0xab /* Read Electronic Signature */
-+
-+#define STM_STATUS_WIP 0x01 /* Write-In-Progress */
-+#define STM_STATUS_WEL 0x02 /* Write Enable Latch */
-+#define STM_STATUS_BP0 0x04 /* Block Protect 0 */
-+#define STM_STATUS_BP1 0x08 /* Block Protect 1 */
-+#define STM_STATUS_BP2 0x10 /* Block Protect 2 */
-+#define STM_STATUS_SRWD 0x80 /* Status Register Write Disable */
-+
-+/*
-+ * SPI Flash Interface Registers
-+ */
-+#define AR531XPLUS_SPI_READ 0x08000000
-+#define AR531XPLUS_SPI_MMR 0x11300000
-+#define AR531XPLUS_SPI_MMR_SIZE 12
-+
-+#define AR531XPLUS_SPI_CTL 0x00
-+#define AR531XPLUS_SPI_OPCODE 0x04
-+#define AR531XPLUS_SPI_DATA 0x08
-+
-+#define SPI_FLASH_READ AR531XPLUS_SPI_READ
-+#define SPI_FLASH_MMR AR531XPLUS_SPI_MMR
-+#define SPI_FLASH_MMR_SIZE AR531XPLUS_SPI_MMR_SIZE
-+#define SPI_FLASH_CTL AR531XPLUS_SPI_CTL
-+#define SPI_FLASH_OPCODE AR531XPLUS_SPI_OPCODE
-+#define SPI_FLASH_DATA AR531XPLUS_SPI_DATA
-+
-+#define SPI_CTL_START 0x00000100
-+#define SPI_CTL_BUSY 0x00010000
-+#define SPI_CTL_TXCNT_MASK 0x0000000f
-+#define SPI_CTL_RXCNT_MASK 0x000000f0
-+#define SPI_CTL_TX_RX_CNT_MASK 0x000000ff
-+#define SPI_CTL_SIZE_MASK 0x00060000
-+
-+#define SPI_CTL_CLK_SEL_MASK 0x03000000
-+#define SPI_OPCODE_MASK 0x000000ff
-+
-+#define SPI_STATUS_WIP STM_STATUS_WIP
-+
-+#endif
+++ /dev/null
---- /dev/null
-+++ b/drivers/watchdog/ar2315-wtd.c
-@@ -0,0 +1,200 @@
-+/*
-+ * 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 John Crispin <blogic@openwrt.org>
-+ * Based on EP93xx and ifxmips wdt driver
-+ */
-+
-+#include <linux/interrupt.h>
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/types.h>
-+#include <linux/miscdevice.h>
-+#include <linux/watchdog.h>
-+#include <linux/fs.h>
-+#include <linux/ioport.h>
-+#include <linux/notifier.h>
-+#include <linux/reboot.h>
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+
-+#include <asm/io.h>
-+#include <asm/uaccess.h>
-+#include <asm/system.h>
-+#include <asm/addrspace.h>
-+#include <ar231x_platform.h>
-+#include <ar2315_regs.h>
-+#include <ar231x.h>
-+
-+#define CLOCK_RATE 40000000
-+#define HEARTBEAT(x) (x < 1 || x > 90)?(20):(x)
-+
-+static int wdt_timeout = 20;
-+static int started = 0;
-+static int in_use = 0;
-+
-+static void
-+ar2315_wdt_enable(void)
-+{
-+ ar231x_write_reg(AR2315_WD, wdt_timeout * CLOCK_RATE);
-+ ar231x_write_reg(AR2315_ISR, 0x80);
-+}
-+
-+static ssize_t
-+ar2315_wdt_write(struct file *file, const char __user *data, size_t len, loff_t *ppos)
-+{
-+ if(len)
-+ ar2315_wdt_enable();
-+ return len;
-+}
-+
-+static int
-+ar2315_wdt_open(struct inode *inode, struct file *file)
-+{
-+ if(in_use)
-+ return -EBUSY;
-+ ar2315_wdt_enable();
-+ in_use = started = 1;
-+ return nonseekable_open(inode, file);
-+}
-+
-+static int
-+ar2315_wdt_release(struct inode *inode, struct file *file)
-+{
-+ in_use = 0;
-+ return 0;
-+}
-+
-+static irqreturn_t
-+ar2315_wdt_interrupt(int irq, void *dev_id)
-+{
-+ if(started)
-+ {
-+ printk(KERN_CRIT "watchdog expired, rebooting system\n");
-+ emergency_restart();
-+ } else {
-+ ar231x_write_reg(AR2315_WDC, 0);
-+ ar231x_write_reg(AR2315_WD, 0);
-+ ar231x_write_reg(AR2315_ISR, 0x80);
-+ }
-+ return IRQ_HANDLED;
-+}
-+
-+static struct watchdog_info ident = {
-+ .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING,
-+ .identity = "ar2315 Watchdog",
-+};
-+
-+static int
-+ar2315_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-+{
-+ int new_wdt_timeout;
-+ int ret = -ENOIOCTLCMD;
-+
-+ switch(cmd)
-+ {
-+ case WDIOC_GETSUPPORT:
-+ ret = copy_to_user((struct watchdog_info __user *)arg, &ident, sizeof(ident)) ? -EFAULT : 0;
-+ break;
-+
-+ case WDIOC_KEEPALIVE:
-+ ar2315_wdt_enable();
-+ ret = 0;
-+ break;
-+
-+ case WDIOC_SETTIMEOUT:
-+ if((ret = get_user(new_wdt_timeout, (int __user *)arg)))
-+ break;
-+ wdt_timeout = HEARTBEAT(new_wdt_timeout);
-+ ar2315_wdt_enable();
-+ break;
-+
-+ case WDIOC_GETTIMEOUT:
-+ ret = put_user(wdt_timeout, (int __user *)arg);
-+ break;
-+ }
-+ return ret;
-+}
-+
-+static struct file_operations ar2315_wdt_fops = {
-+ .owner = THIS_MODULE,
-+ .llseek = no_llseek,
-+ .write = ar2315_wdt_write,
-+ .ioctl = ar2315_wdt_ioctl,
-+ .open = ar2315_wdt_open,
-+ .release = ar2315_wdt_release,
-+};
-+
-+static struct miscdevice ar2315_wdt_miscdev = {
-+ .minor = WATCHDOG_MINOR,
-+ .name = "watchdog",
-+ .fops = &ar2315_wdt_fops,
-+};
-+
-+static int
-+ar2315_wdt_probe(struct platform_device *dev)
-+{
-+ int ret = 0;
-+
-+ ar2315_wdt_enable();
-+ ret = request_irq(AR531X_MISC_IRQ_WATCHDOG, ar2315_wdt_interrupt, IRQF_DISABLED, "ar2315_wdt", NULL);
-+ if(ret)
-+ {
-+ printk(KERN_ERR "ar2315wdt: failed to register inetrrupt\n");
-+ goto out;
-+ }
-+
-+ ret = misc_register(&ar2315_wdt_miscdev);
-+ if(ret)
-+ printk(KERN_ERR "ar2315wdt: failed to register miscdev\n");
-+
-+out:
-+ return ret;
-+}
-+
-+static int
-+ar2315_wdt_remove(struct platform_device *dev)
-+{
-+ misc_deregister(&ar2315_wdt_miscdev);
-+ free_irq(AR531X_MISC_IRQ_WATCHDOG, NULL);
-+ return 0;
-+}
-+
-+static struct platform_driver ar2315_wdt_driver = {
-+ .probe = ar2315_wdt_probe,
-+ .remove = ar2315_wdt_remove,
-+ .driver = {
-+ .name = "ar2315_wdt",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+static int __init
-+init_ar2315_wdt(void)
-+{
-+ int ret = platform_driver_register(&ar2315_wdt_driver);
-+ if(ret)
-+ printk(KERN_INFO "ar2315_wdt: error registering platfom driver!");
-+ return ret;
-+}
-+
-+static void __exit
-+exit_ar2315_wdt(void)
-+{
-+ platform_driver_unregister(&ar2315_wdt_driver);
-+}
-+
-+module_init(init_ar2315_wdt);
-+module_exit(exit_ar2315_wdt);
---- a/drivers/watchdog/Kconfig
-+++ b/drivers/watchdog/Kconfig
-@@ -840,6 +840,12 @@ config TXX9_WDT
- help
- Hardware driver for the built-in watchdog timer on TXx9 MIPS SoCs.
-
-+config ATHEROS_WDT
-+ tristate "Atheros wisoc Watchdog Timer"
-+ depends on ATHEROS_AR231X
-+ help
-+ Hardware driver for the Atheros wisoc Watchdog Timer.
-+
- # PARISC Architecture
-
- # POWERPC Architecture
---- a/drivers/watchdog/Makefile
-+++ b/drivers/watchdog/Makefile
-@@ -112,6 +112,7 @@ obj-$(CONFIG_PNX833X_WDT) += pnx833x_wdt
- obj-$(CONFIG_SIBYTE_WDOG) += sb_wdog.o
- obj-$(CONFIG_AR7_WDT) += ar7_wdt.o
- obj-$(CONFIG_TXX9_WDT) += txx9wdt.o
-+obj-$(CONFIG_ATHEROS_WDT) += ar2315-wtd.o
-
- # PARISC Architecture
-
+++ /dev/null
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -60,31 +60,32 @@ static int parse_redboot_partitions(stru
- static char nullstring[] = "unallocated";
- #endif
-
-+ buf = vmalloc(master->erasesize);
-+ if (!buf)
-+ return -ENOMEM;
-+
-+ restart:
- if ( directory < 0 ) {
- offset = master->size + directory * master->erasesize;
-- while (master->block_isbad &&
-+ while (master->block_isbad &&
- master->block_isbad(master, offset)) {
- if (!offset) {
- nogood:
- printk(KERN_NOTICE "Failed to find a non-bad block to check for RedBoot partition table\n");
-+ vfree(buf);
- return -EIO;
- }
- offset -= master->erasesize;
- }
- } else {
- offset = directory * master->erasesize;
-- while (master->block_isbad &&
-+ while (master->block_isbad &&
- master->block_isbad(master, offset)) {
- offset += master->erasesize;
- if (offset == master->size)
- goto nogood;
- }
- }
-- buf = vmalloc(master->erasesize);
--
-- if (!buf)
-- return -ENOMEM;
--
- printk(KERN_NOTICE "Searching for RedBoot partition table in %s at offset 0x%lx\n",
- master->name, offset);
-
-@@ -156,6 +157,11 @@ static int parse_redboot_partitions(stru
- }
- if (i == numslots) {
- /* Didn't find it */
-+ if (offset + master->erasesize < master->size) {
-+ /* not at the end of the flash yet, maybe next block :) */
-+ directory++;
-+ goto restart;
-+ }
- printk(KERN_NOTICE "No RedBoot partition table detected in %s\n",
- master->name);
- ret = 0;
+++ /dev/null
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -39,6 +39,22 @@ static inline int redboot_checksum(struc
- return 1;
- }
-
-+static uint32_t mtd_get_offset_erasesize(struct mtd_info *mtd, uint64_t offset)
-+{
-+ struct mtd_erase_region_info *regions = mtd->eraseregions;
-+ int i;
-+
-+ for (i = 0; i < mtd->numeraseregions; i++) {
-+ if (regions[i].offset +
-+ regions[i].numblocks * regions[i].erasesize <= offset)
-+ continue;
-+
-+ return regions[i].erasesize;
-+ }
-+
-+ return mtd->erasesize;
-+}
-+
- static int parse_redboot_partitions(struct mtd_info *master,
- struct mtd_partition **pparts,
- unsigned long fis_origin)
-@@ -55,6 +71,7 @@ static int parse_redboot_partitions(stru
- int namelen = 0;
- int nulllen = 0;
- int numslots;
-+ int first_slot;
- unsigned long offset;
- #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
- static char nullstring[] = "unallocated";
-@@ -168,7 +185,10 @@ static int parse_redboot_partitions(stru
- goto out;
- }
-
-- for (i = 0; i < numslots; i++) {
-+ first_slot = (buf[i].flash_base & (master->erasesize - 1)) /
-+ sizeof(struct fis_image_desc);
-+
-+ for (i = first_slot; i < first_slot + numslots; i++) {
- struct fis_list *new_fl, **prev;
-
- if (buf[i].name[0] == 0xff) {
-@@ -244,12 +264,13 @@ static int parse_redboot_partitions(stru
- }
- #endif
- for ( ; i<nrparts; i++) {
-- if(max_offset < buf[i].flash_base + buf[i].size)
-- max_offset = buf[i].flash_base + buf[i].size;
- parts[i].size = fl->img->size;
- parts[i].offset = fl->img->flash_base;
- parts[i].name = names;
-
-+ if (max_offset < parts[i].offset + parts[i].size)
-+ max_offset = parts[i].offset + parts[i].size;
-+
- strcpy(names, fl->img->name);
- #ifdef CONFIG_MTD_REDBOOT_PARTS_READONLY
- if (!memcmp(names, "RedBoot", 8) ||
-@@ -279,7 +300,9 @@ static int parse_redboot_partitions(stru
- fl = fl->next;
- kfree(tmp_fl);
- }
-- if(master->size - max_offset >= master->erasesize)
-+
-+ if (master->size - max_offset >=
-+ mtd_get_offset_erasesize(master, max_offset))
- {
- parts[nrparts].size = master->size - max_offset;
- parts[nrparts].offset = max_offset;
+++ /dev/null
---- a/drivers/net/ar231x.c
-+++ b/drivers/net/ar231x.c
-@@ -735,6 +735,7 @@ static void ar231x_load_rx_ring(struct n
- for (i = 0; i < nr_bufs; i++) {
- struct sk_buff *skb;
- ar231x_descr_t *rd;
-+ int offset = RX_OFFSET;
-
- if (sp->rx_skb[idx])
- break;
-@@ -750,7 +751,9 @@ static void ar231x_load_rx_ring(struct n
- * Make sure IP header starts on a fresh cache line.
- */
- skb->dev = dev;
-- skb_reserve(skb, RX_OFFSET);
-+ if (sp->phy_dev)
-+ offset += sp->phy_dev->pkt_align;
-+ skb_reserve(skb, offset);
- sp->rx_skb[idx] = skb;
-
- rd = (ar231x_descr_t *) & sp->rx_ring[idx];
-@@ -824,20 +827,23 @@ static int ar231x_rx_int(struct net_devi
- /* alloc new buffer. */
- skb_new = netdev_alloc_skb(dev, AR2313_BUFSIZE + RX_OFFSET);
- if (skb_new != NULL) {
-+ int offset;
-
- skb = sp->rx_skb[idx];
- /* set skb */
- skb_put(skb,
- ((status >> DMA_RX_LEN_SHIFT) & 0x3fff) - CRC_LEN);
--
- dev->stats.rx_bytes += skb->len;
-- skb->protocol = eth_type_trans(skb, dev);
-- /* pass the packet to upper layers */
-- netif_rx(skb);
-
-+ /* pass the packet to upper layers */
-+ sp->rx(skb);
- skb_new->dev = dev;
-+
- /* 16 bit align */
-- skb_reserve(skb_new, RX_OFFSET);
-+ offset = RX_OFFSET;
-+ if (sp->phy_dev)
-+ offset += sp->phy_dev->pkt_align;
-+ skb_reserve(skb_new, offset);
- /* reset descriptor's curr_addr */
- rxdesc->addr = virt_to_phys(skb_new->data);
-
-@@ -1239,6 +1245,8 @@ static int ar231x_mdiobus_probe (struct
- return PTR_ERR(phydev);
- }
-
-+ sp->rx = phydev->netif_rx;
-+
- /* mask with MAC supported features */
- phydev->supported &= (SUPPORTED_10baseT_Half
- | SUPPORTED_10baseT_Full
---- a/drivers/net/ar231x.h
-+++ b/drivers/net/ar231x.h
-@@ -221,6 +221,8 @@ typedef struct {
- */
- struct ar231x_private {
- struct net_device *dev;
-+ int (*rx)(struct sk_buff *skb);
-+
- int version;
- u32 mb[2];
-
+++ /dev/null
---- a/arch/mips/ar231x/Makefile
-+++ b/arch/mips/ar231x/Makefile
-@@ -8,7 +8,7 @@
- # Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org>
- #
-
--obj-y += board.o prom.o devices.o
-+obj-y += board.o prom.o devices.o reset.o
-
- obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
-
---- /dev/null
-+++ b/arch/mips/ar231x/reset.c
-@@ -0,0 +1,160 @@
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/timer.h>
-+#include <linux/interrupt.h>
-+#include <linux/kobject.h>
-+#include <linux/workqueue.h>
-+#include <linux/skbuff.h>
-+#include <linux/netlink.h>
-+#include <net/sock.h>
-+#include <asm/uaccess.h>
-+#include <ar231x_platform.h>
-+#include <ar231x.h>
-+#include <gpio.h>
-+#include "devices.h"
-+
-+#define AR531X_RESET_GPIO_IRQ (AR531X_GPIO_IRQ(ar231x_board.config->resetConfigGpio))
-+
-+struct event_t {
-+ struct work_struct wq;
-+ int set;
-+ unsigned long jiffies;
-+};
-+
-+static struct timer_list rst_button_timer;
-+static unsigned long seen;
-+
-+extern struct sock *uevent_sock;
-+extern u64 uevent_next_seqnum(void);
-+
-+static int no_release_workaround = 1;
-+module_param(no_release_workaround, int, 0);
-+
-+static inline void
-+add_msg(struct sk_buff *skb, char *msg)
-+{
-+ char *scratch;
-+ scratch = skb_put(skb, strlen(msg) + 1);
-+ sprintf(scratch, msg);
-+}
-+
-+static void
-+hotplug_button(struct work_struct *wq)
-+{
-+ struct sk_buff *skb;
-+ struct event_t *event;
-+ size_t len;
-+ char *scratch, *s;
-+ char buf[128];
-+
-+ event = container_of(wq, struct event_t, wq);
-+ if (!uevent_sock)
-+ goto done;
-+
-+ /* allocate message with the maximum possible size */
-+ s = event->set ? "pressed" : "released";
-+ len = strlen(s) + 2;
-+ skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
-+ if (!skb)
-+ goto done;
-+
-+ /* add header */
-+ scratch = skb_put(skb, len);
-+ sprintf(scratch, "%s@",s);
-+
-+ /* copy keys to our continuous event payload buffer */
-+ add_msg(skb, "HOME=/");
-+ add_msg(skb, "PATH=/sbin:/bin:/usr/sbin:/usr/bin");
-+ add_msg(skb, "SUBSYSTEM=button");
-+ add_msg(skb, "BUTTON=reset");
-+ add_msg(skb, (event->set ? "ACTION=pressed" : "ACTION=released"));
-+ sprintf(buf, "SEEN=%ld", (event->jiffies - seen)/HZ);
-+ add_msg(skb, buf);
-+ snprintf(buf, 128, "SEQNUM=%llu", uevent_next_seqnum());
-+ add_msg(skb, buf);
-+
-+ NETLINK_CB(skb).dst_group = 1;
-+ netlink_broadcast(uevent_sock, skb, 0, 1, GFP_KERNEL);
-+
-+done:
-+ kfree(event);
-+}
-+
-+static void
-+reset_button_poll(unsigned long unused)
-+{
-+ struct event_t *event;
-+ int gpio = ~0;
-+
-+ if(!no_release_workaround)
-+ return;
-+
-+ gpio = ar231x_gpiodev->get();
-+ gpio &= (1 << (AR531X_RESET_GPIO_IRQ - AR531X_GPIO_IRQ_BASE));
-+ if(gpio) {
-+ rst_button_timer.expires = jiffies + (HZ / 4);
-+ add_timer(&rst_button_timer);
-+ return;
-+ }
-+
-+ event = (struct event_t *) kzalloc(sizeof(struct event_t), GFP_ATOMIC);
-+ if (!event)
-+ return;
-+
-+ event->set = 0;
-+ event->jiffies = jiffies;
-+ INIT_WORK(&event->wq, hotplug_button);
-+ schedule_work(&event->wq);
-+}
-+
-+static irqreturn_t
-+button_handler(int irq, void *dev_id)
-+{
-+ static int pressed = 0;
-+ struct event_t *event;
-+ u32 gpio = ~0;
-+
-+ event = (struct event_t *) kzalloc(sizeof(struct event_t), GFP_ATOMIC);
-+ if (!event)
-+ return IRQ_NONE;
-+
-+ pressed = !pressed;
-+
-+ gpio = ar231x_gpiodev->get() & (1 << (irq - AR531X_GPIO_IRQ_BASE));
-+
-+ event->set = gpio;
-+ if(!event->set)
-+ no_release_workaround = 0;
-+
-+ event->jiffies = jiffies;
-+
-+ INIT_WORK(&event->wq, hotplug_button);
-+ schedule_work(&event->wq);
-+
-+ seen = jiffies;
-+ if(event->set && no_release_workaround)
-+ mod_timer(&rst_button_timer, jiffies + (HZ / 4));
-+
-+ return IRQ_HANDLED;
-+}
-+
-+
-+static int __init
-+ar231x_init_reset(void)
-+{
-+ seen = jiffies;
-+
-+ if (ar231x_board.config->resetConfigGpio == 0xffff)
-+ return -ENODEV;
-+
-+ init_timer(&rst_button_timer);
-+ rst_button_timer.function = reset_button_poll;
-+ rst_button_timer.expires = jiffies + HZ / 50;
-+ add_timer(&rst_button_timer);
-+
-+ request_irq(AR531X_RESET_GPIO_IRQ, &button_handler, IRQF_SAMPLE_RANDOM, "ar231x_reset", NULL);
-+
-+ return 0;
-+}
-+
-+module_init(ar231x_init_reset);
+++ /dev/null
---- a/drivers/net/ar231x.c
-+++ b/drivers/net/ar231x.c
-@@ -148,6 +148,7 @@ static int ar231x_mdiobus_write(struct m
- static int ar231x_mdiobus_reset(struct mii_bus *bus);
- static int ar231x_mdiobus_probe (struct net_device *dev);
- static void ar231x_adjust_link(struct net_device *dev);
-+static bool no_phy = false;
-
- #ifndef ERR
- #define ERR(fmt, args...) printk("%s: " fmt, __func__, ##args)
-@@ -278,6 +279,21 @@ int __init ar231x_probe(struct platform_
-
- mdiobus_register(sp->mii_bus);
-
-+ /* Workaround for Micrel switch, which is only available on
-+ * one PHY and cannot be configured through MDIO */
-+ if (!no_phy) {
-+ u32 phy_id = 0;
-+ get_phy_id(sp->mii_bus, 1, &phy_id);
-+ if (phy_id == 0x00221450)
-+ no_phy = true;
-+ }
-+ if (no_phy) {
-+ sp->link = 1;
-+ netif_carrier_on(dev);
-+ return 0;
-+ }
-+ no_phy = true;
-+
- if (ar231x_mdiobus_probe(dev) != 0) {
- printk(KERN_ERR "%s: mdiobus_probe failed\n", dev->name);
- rx_tasklet_cleanup(dev);
-@@ -334,8 +350,10 @@ static int __exit ar231x_remove(struct p
- rx_tasklet_cleanup(dev);
- ar231x_init_cleanup(dev);
- unregister_netdev(dev);
-- mdiobus_unregister(sp->mii_bus);
-- mdiobus_free(sp->mii_bus);
-+ if (sp->mii_bus) {
-+ mdiobus_unregister(sp->mii_bus);
-+ mdiobus_free(sp->mii_bus);
-+ }
- kfree(dev);
- return 0;
- }
-@@ -836,7 +854,12 @@ static int ar231x_rx_int(struct net_devi
- dev->stats.rx_bytes += skb->len;
-
- /* pass the packet to upper layers */
-- sp->rx(skb);
-+ if (sp->rx) {
-+ sp->rx(skb);
-+ } else {
-+ skb->protocol = eth_type_trans(skb, skb->dev);
-+ netif_rx(skb);
-+ }
- skb_new->dev = dev;
-
- /* 16 bit align */
-@@ -1123,6 +1146,9 @@ static int ar231x_ioctl(struct net_devic
- struct ar231x_private *sp = netdev_priv(dev);
- int ret;
-
-+ if (!sp->phy_dev)
-+ return -ENODEV;
-+
- switch (cmd) {
-
- case SIOCETHTOOL:
+++ /dev/null
-CONFIG_32BIT=y
-# CONFIG_64BIT is not set
-# CONFIG_ALCHEMY_GPIO_INDIRECT is not set
-# CONFIG_AR7 is not set
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-CONFIG_ARCH_POPULATES_NODE_MAP=y
-# CONFIG_ARCH_SUPPORTS_MSI is not set
-CONFIG_ARCH_SUPPORTS_OPROFILE=y
-CONFIG_ARCH_SUSPEND_POSSIBLE=y
-# CONFIG_ARPD is not set
-CONFIG_B44=y
-CONFIG_B44_PCI=y
-CONFIG_B44_PCICORE_AUTOSELECT=y
-CONFIG_B44_PCI_AUTOSELECT=y
-CONFIG_BCM47XX=y
-CONFIG_BCM47XX_WDT=y
-# CONFIG_BCM63XX is not set
-CONFIG_BITREVERSE=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
-# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
-CONFIG_CEVT_R4K=y
-CONFIG_CEVT_R4K_LIB=y
-CONFIG_CFE=y
-CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs,jffs2 noinitrd console=ttyS0,115200"
-CONFIG_CMDLINE_BOOL=y
-# CONFIG_CMDLINE_OVERRIDE is not set
-# CONFIG_CPU_BIG_ENDIAN is not set
-# CONFIG_CPU_CAVIUM_OCTEON is not set
-CONFIG_CPU_HAS_PREFETCH=y
-CONFIG_CPU_HAS_SYNC=y
-CONFIG_CPU_LITTLE_ENDIAN=y
-# CONFIG_CPU_LOONGSON2E is not set
-# CONFIG_CPU_LOONGSON2F is not set
-CONFIG_CPU_MIPS32=y
-CONFIG_CPU_MIPS32_R1=y
-# CONFIG_CPU_MIPS32_R2 is not set
-# CONFIG_CPU_MIPS64_R1 is not set
-# CONFIG_CPU_MIPS64_R2 is not set
-CONFIG_CPU_MIPSR1=y
-# CONFIG_CPU_NEVADA is not set
-# CONFIG_CPU_R10000 is not set
-# CONFIG_CPU_R3000 is not set
-# CONFIG_CPU_R4300 is not set
-# CONFIG_CPU_R4X00 is not set
-# CONFIG_CPU_R5000 is not set
-# CONFIG_CPU_R5432 is not set
-# CONFIG_CPU_R5500 is not set
-# CONFIG_CPU_R6000 is not set
-# CONFIG_CPU_R8000 is not set
-# CONFIG_CPU_RM7000 is not set
-# CONFIG_CPU_RM9000 is not set
-# CONFIG_CPU_SB1 is not set
-CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
-CONFIG_CPU_SUPPORTS_HIGHMEM=y
-# CONFIG_CPU_TX39XX is not set
-# CONFIG_CPU_TX49XX is not set
-# CONFIG_CPU_VR41XX is not set
-CONFIG_CSRC_R4K=y
-CONFIG_CSRC_R4K_LIB=y
-CONFIG_DECOMPRESS_LZMA=y
-# CONFIG_DEFAULT_SECURITY_SELINUX is not set
-# CONFIG_DEFAULT_SECURITY_SMACK is not set
-# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
-CONFIG_DEVPORT=y
-# CONFIG_DM9000 is not set
-CONFIG_DMA_NEED_PCI_MAP_STATE=y
-CONFIG_DMA_NONCOHERENT=y
-# CONFIG_FSNOTIFY is not set
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-CONFIG_GENERIC_CMOS_UPDATE=y
-CONFIG_GENERIC_FIND_LAST_BIT=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_GPIO=y
-CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-# CONFIG_HAMRADIO is not set
-CONFIG_HARDWARE_WATCHPOINTS=y
-CONFIG_HAS_DMA=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAVE_ARCH_KGDB=y
-CONFIG_HAVE_DYNAMIC_FTRACE=y
-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
-CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
-CONFIG_HAVE_GENERIC_DMA_COHERENT=y
-CONFIG_HAVE_IDE=y
-CONFIG_HAVE_OPROFILE=y
-CONFIG_HW_HAS_PCI=y
-CONFIG_HW_RANDOM=y
-CONFIG_HZ=250
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_INLINE_READ_LOCK is not set
-# CONFIG_INLINE_READ_LOCK_BH is not set
-# CONFIG_INLINE_READ_LOCK_IRQ is not set
-# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_READ_TRYLOCK is not set
-CONFIG_INLINE_READ_UNLOCK=y
-# CONFIG_INLINE_READ_UNLOCK_BH is not set
-CONFIG_INLINE_READ_UNLOCK_IRQ=y
-# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_SPIN_LOCK is not set
-# CONFIG_INLINE_SPIN_LOCK_BH is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_SPIN_TRYLOCK is not set
-# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK=y
-# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
-# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_WRITE_LOCK is not set
-# CONFIG_INLINE_WRITE_LOCK_BH is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_WRITE_TRYLOCK is not set
-CONFIG_INLINE_WRITE_UNLOCK=y
-# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
-CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
-# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
-# CONFIG_IP_ROUTE_VERBOSE is not set
-CONFIG_IRQ_CPU=y
-CONFIG_KALLSYMS=y
-CONFIG_LEDS_GPIO=y
-CONFIG_LOONGSON_UART_BASE=y
-# CONFIG_MACH_ALCHEMY is not set
-# CONFIG_MACH_DECSTATION is not set
-# CONFIG_MACH_JAZZ is not set
-# CONFIG_MACH_LOONGSON is not set
-# CONFIG_MACH_TX39XX is not set
-# CONFIG_MACH_TX49XX is not set
-# CONFIG_MACH_VR41XX is not set
-# CONFIG_MIKROTIK_RB532 is not set
-CONFIG_MIPS=y
-# CONFIG_MIPS_COBALT is not set
-CONFIG_MIPS_L1_CACHE_SHIFT=5
-# CONFIG_MIPS_MACHINE is not set
-# CONFIG_MIPS_MALTA is not set
-CONFIG_MIPS_MT_DISABLED=y
-# CONFIG_MIPS_MT_SMP is not set
-# CONFIG_MIPS_MT_SMTC is not set
-# CONFIG_MIPS_SIM is not set
-CONFIG_MTD_BCM47XX=y
-# CONFIG_MUTEX_SPIN_ON_OWNER is not set
-# CONFIG_NO_IOPORT is not set
-# CONFIG_NXP_STB220 is not set
-# CONFIG_NXP_STB225 is not set
-CONFIG_PAGEFLAGS_EXTENDED=y
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PHYLIB=y
-# CONFIG_PMC_MSP is not set
-# CONFIG_PMC_YOSEMITE is not set
-# CONFIG_PNX8550_JBS is not set
-# CONFIG_PNX8550_STB810 is not set
-# CONFIG_POWERTV is not set
-# CONFIG_PROC_KCORE is not set
-CONFIG_SCHED_OMIT_FRAME_POINTER=y
-# CONFIG_SCSI_DMA is not set
-# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-CONFIG_SERIAL_8250_EXTENDED=y
-# CONFIG_SERIAL_8250_MANY_PORTS is not set
-# CONFIG_SERIAL_8250_RSA is not set
-CONFIG_SERIAL_8250_SHARE_IRQ=y
-# CONFIG_SGI_IP22 is not set
-# CONFIG_SGI_IP27 is not set
-# CONFIG_SGI_IP28 is not set
-# CONFIG_SGI_IP32 is not set
-# CONFIG_SIBYTE_BIGSUR is not set
-# CONFIG_SIBYTE_CARMEL is not set
-# CONFIG_SIBYTE_CRHINE is not set
-# CONFIG_SIBYTE_CRHONE is not set
-# CONFIG_SIBYTE_LITTLESUR is not set
-# CONFIG_SIBYTE_RHONE is not set
-# CONFIG_SIBYTE_SENTOSA is not set
-# CONFIG_SIBYTE_SWARM is not set
-CONFIG_SSB=y
-CONFIG_SSB_B43_PCI_BRIDGE=y
-CONFIG_SSB_DEBUG=y
-CONFIG_SSB_DRIVER_EXTIF=y
-CONFIG_SSB_DRIVER_GIGE=y
-CONFIG_SSB_DRIVER_MIPS=y
-CONFIG_SSB_DRIVER_PCICORE=y
-CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
-CONFIG_SSB_EMBEDDED=y
-CONFIG_SSB_PCICORE_HOSTMODE=y
-CONFIG_SSB_PCIHOST=y
-CONFIG_SSB_PCIHOST_POSSIBLE=y
-CONFIG_SSB_SERIAL=y
-CONFIG_SSB_SPROM=y
-CONFIG_SYS_HAS_CPU_MIPS32_R1=y
-CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
-CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
-CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
-# CONFIG_TC35815 is not set
-# CONFIG_TINY_RCU is not set
-CONFIG_TRAD_SIGNALS=y
-# CONFIG_TREE_PREEMPT_RCU is not set
-CONFIG_TREE_RCU=y
-CONFIG_USB_SUPPORT=y
-CONFIG_WATCHDOG_NOWAYOUT=y
-CONFIG_ZONE_DMA_FLAG=0
+++ /dev/null
---- a/drivers/mtd/maps/Kconfig
-+++ b/drivers/mtd/maps/Kconfig
-@@ -325,6 +325,12 @@ config MTD_CFI_FLAGADM
- Mapping for the Flaga digital module. If you don't have one, ignore
- this setting.
-
-+config MTD_BCM47XX
-+ tristate "BCM47xx flash device"
-+ depends on MIPS && MTD_CFI && BCM47XX
-+ help
-+ Support for the flash chips on the BCM947xx board.
-+
- config MTD_REDWOOD
- tristate "CFI Flash devices mapped on IBM Redwood"
- depends on MTD_CFI && ( REDWOOD_4 || REDWOOD_5 || REDWOOD_6 )
---- a/drivers/mtd/maps/Makefile
-+++ b/drivers/mtd/maps/Makefile
-@@ -29,6 +29,7 @@ obj-$(CONFIG_MTD_PMC_MSP_EVM) += pmcms
- obj-$(CONFIG_MTD_PCMCIA) += pcmciamtd.o
- obj-$(CONFIG_MTD_RPXLITE) += rpxlite.o
- obj-$(CONFIG_MTD_TQM8XXL) += tqm8xxl.o
-+obj-$(CONFIG_MTD_BCM47XX) += bcm47xx-flash.o
- obj-$(CONFIG_MTD_SA1100) += sa1100-flash.o
- obj-$(CONFIG_MTD_SBC_GXX) += sbc_gxx.o
- obj-$(CONFIG_MTD_SC520CDP) += sc520cdp.o
+++ /dev/null
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -205,7 +205,6 @@ config MIPS_MALTA
- select I8259
- select MIPS_BOARDS_GEN
- select MIPS_BONITO64
-- select MIPS_CPU_SCACHE
- select PCI_GT64XXX_PCI0
- select MIPS_MSC
- select SWAP_IO_SPACE
-@@ -1561,13 +1560,6 @@ config IP22_CPU_SCACHE
- bool
- select BOARD_SCACHE
-
--#
--# Support for a MIPS32 / MIPS64 style S-caches
--#
--config MIPS_CPU_SCACHE
-- bool
-- select BOARD_SCACHE
--
- config R5000_CPU_SCACHE
- bool
- select BOARD_SCACHE
---- a/arch/mips/kernel/cpu-probe.c
-+++ b/arch/mips/kernel/cpu-probe.c
-@@ -759,6 +759,8 @@ static inline void cpu_probe_mips(struct
- case PRID_IMP_25KF:
- c->cputype = CPU_25KF;
- __cpu_name[cpu] = "MIPS 25Kc";
-+ /* Probe for L2 cache */
-+ c->scache.flags &= ~MIPS_CACHE_NOT_PRESENT;
- break;
- case PRID_IMP_34K:
- c->cputype = CPU_34K;
---- a/arch/mips/mm/Makefile
-+++ b/arch/mips/mm/Makefile
-@@ -33,6 +33,5 @@ obj-$(CONFIG_CPU_CAVIUM_OCTEON) += c-oct
- obj-$(CONFIG_IP22_CPU_SCACHE) += sc-ip22.o
- obj-$(CONFIG_R5000_CPU_SCACHE) += sc-r5k.o
- obj-$(CONFIG_RM7000_CPU_SCACHE) += sc-rm7k.o
--obj-$(CONFIG_MIPS_CPU_SCACHE) += sc-mips.o
-
- EXTRA_CFLAGS += -Werror
---- a/arch/mips/mm/c-r4k.c
-+++ b/arch/mips/mm/c-r4k.c
-@@ -1148,7 +1148,6 @@ static void __init loongson2_sc_init(voi
-
- extern int r5k_sc_init(void);
- extern int rm7k_sc_init(void);
--extern int mips_sc_init(void);
-
- static void __cpuinit setup_scache(void)
- {
-@@ -1202,29 +1201,17 @@ static void __cpuinit setup_scache(void)
- #endif
-
- default:
-- if (c->isa_level == MIPS_CPU_ISA_M32R1 ||
-- c->isa_level == MIPS_CPU_ISA_M32R2 ||
-- c->isa_level == MIPS_CPU_ISA_M64R1 ||
-- c->isa_level == MIPS_CPU_ISA_M64R2) {
--#ifdef CONFIG_MIPS_CPU_SCACHE
-- if (mips_sc_init ()) {
-- scache_size = c->scache.ways * c->scache.sets * c->scache.linesz;
-- printk("MIPS secondary cache %ldkB, %s, linesize %d bytes.\n",
-- scache_size >> 10,
-- way_string[c->scache.ways], c->scache.linesz);
-- }
--#else
-- if (!(c->scache.flags & MIPS_CACHE_NOT_PRESENT))
-- panic("Dunno how to handle MIPS32 / MIPS64 second level cache");
--#endif
-- return;
-- }
- sc_present = 0;
- }
-
- if (!sc_present)
- return;
-
-+ if ((c->isa_level == MIPS_CPU_ISA_M32R1 ||
-+ c->isa_level == MIPS_CPU_ISA_M64R1) &&
-+ !(c->scache.flags & MIPS_CACHE_NOT_PRESENT))
-+ panic("Dunno how to handle MIPS32 / MIPS64 second level cache");
-+
- /* compute a couple of other cache variables */
- c->scache.waysize = scache_size / c->scache.ways;
-
+++ /dev/null
---- a/arch/mips/include/asm/r4kcache.h
-+++ b/arch/mips/include/asm/r4kcache.h
-@@ -17,6 +17,20 @@
- #include <asm/cpu-features.h>
- #include <asm/mipsmtregs.h>
-
-+#ifdef CONFIG_BCM47XX
-+#include <asm/paccess.h>
-+#include <linux/ssb/ssb.h>
-+#define BCM4710_DUMMY_RREG() ((void) *((u8 *) KSEG1ADDR(SSB_ENUM_BASE + SSB_IMSTATE)))
-+
-+#define BCM4710_FILL_TLB(addr) (*(volatile unsigned long *)(addr))
-+#define BCM4710_PROTECTED_FILL_TLB(addr) ({ unsigned long x; get_dbe(x, (volatile unsigned long *)(addr)); })
-+#else
-+#define BCM4710_DUMMY_RREG()
-+
-+#define BCM4710_FILL_TLB(addr)
-+#define BCM4710_PROTECTED_FILL_TLB(addr)
-+#endif
-+
- /*
- * This macro return a properly sign-extended address suitable as base address
- * for indexed cache operations. Two issues here:
-@@ -150,6 +164,7 @@ static inline void flush_icache_line_ind
- static inline void flush_dcache_line_indexed(unsigned long addr)
- {
- __dflush_prologue
-+ BCM4710_DUMMY_RREG();
- cache_op(Index_Writeback_Inv_D, addr);
- __dflush_epilogue
- }
-@@ -169,6 +184,7 @@ static inline void flush_icache_line(uns
- static inline void flush_dcache_line(unsigned long addr)
- {
- __dflush_prologue
-+ BCM4710_DUMMY_RREG();
- cache_op(Hit_Writeback_Inv_D, addr);
- __dflush_epilogue
- }
-@@ -176,6 +192,7 @@ static inline void flush_dcache_line(uns
- static inline void invalidate_dcache_line(unsigned long addr)
- {
- __dflush_prologue
-+ BCM4710_DUMMY_RREG();
- cache_op(Hit_Invalidate_D, addr);
- __dflush_epilogue
- }
-@@ -208,6 +225,7 @@ static inline void flush_scache_line(uns
- */
- static inline void protected_flush_icache_line(unsigned long addr)
- {
-+ BCM4710_DUMMY_RREG();
- protected_cache_op(Hit_Invalidate_I, addr);
- }
-
-@@ -219,6 +237,7 @@ static inline void protected_flush_icach
- */
- static inline void protected_writeback_dcache_line(unsigned long addr)
- {
-+ BCM4710_DUMMY_RREG();
- protected_cache_op(Hit_Writeback_Inv_D, addr);
- }
-
-@@ -339,8 +358,52 @@ static inline void invalidate_tcache_pag
- : "r" (base), \
- "i" (op));
-
-+static inline void blast_dcache(void)
-+{
-+ unsigned long start = KSEG0;
-+ unsigned long dcache_size = current_cpu_data.dcache.waysize * current_cpu_data.dcache.ways;
-+ unsigned long end = (start + dcache_size);
-+
-+ do {
-+ BCM4710_DUMMY_RREG();
-+ cache_op(Index_Writeback_Inv_D, start);
-+ start += current_cpu_data.dcache.linesz;
-+ } while(start < end);
-+}
-+
-+static inline void blast_dcache_page(unsigned long page)
-+{
-+ unsigned long start = page;
-+ unsigned long end = start + PAGE_SIZE;
-+
-+ BCM4710_FILL_TLB(start);
-+ do {
-+ BCM4710_DUMMY_RREG();
-+ cache_op(Hit_Writeback_Inv_D, start);
-+ start += current_cpu_data.dcache.linesz;
-+ } while(start < end);
-+}
-+
-+static inline void blast_dcache_page_indexed(unsigned long page)
-+{
-+ unsigned long start = page;
-+ unsigned long end = start + PAGE_SIZE;
-+ unsigned long ws_inc = 1UL << current_cpu_data.dcache.waybit;
-+ unsigned long ws_end = current_cpu_data.dcache.ways <<
-+ current_cpu_data.dcache.waybit;
-+ unsigned long ws, addr;
-+ for (ws = 0; ws < ws_end; ws += ws_inc) {
-+ start = page + ws;
-+ for (addr = start; addr < end; addr += current_cpu_data.dcache.linesz) {
-+ BCM4710_DUMMY_RREG();
-+ cache_op(Index_Writeback_Inv_D, addr);
-+ }
-+ }
-+}
-+
-+
- /* build blast_xxx, blast_xxx_page, blast_xxx_page_indexed */
--#define __BUILD_BLAST_CACHE(pfx, desc, indexop, hitop, lsize) \
-+#define __BUILD_BLAST_CACHE(pfx, desc, indexop, hitop, lsize, war) \
- static inline void blast_##pfx##cache##lsize(void) \
- { \
- unsigned long start = INDEX_BASE; \
-@@ -352,6 +415,7 @@ static inline void blast_##pfx##cache##l
- \
- __##pfx##flush_prologue \
- \
-+ war \
- for (ws = 0; ws < ws_end; ws += ws_inc) \
- for (addr = start; addr < end; addr += lsize * 32) \
- cache##lsize##_unroll32(addr|ws, indexop); \
-@@ -366,6 +430,7 @@ static inline void blast_##pfx##cache##l
- \
- __##pfx##flush_prologue \
- \
-+ war \
- do { \
- cache##lsize##_unroll32(start, hitop); \
- start += lsize * 32; \
-@@ -384,6 +449,8 @@ static inline void blast_##pfx##cache##l
- current_cpu_data.desc.waybit; \
- unsigned long ws, addr; \
- \
-+ war \
-+ \
- __##pfx##flush_prologue \
- \
- for (ws = 0; ws < ws_end; ws += ws_inc) \
-@@ -393,36 +460,38 @@ static inline void blast_##pfx##cache##l
- __##pfx##flush_epilogue \
- }
-
--__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16)
--__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 16)
--__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 16)
--__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 32)
--__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 32)
--__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 32)
--__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 64)
--__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64)
--__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 64)
--__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 128)
--
--__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 16)
--__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 32)
--__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 16)
--__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 32)
--__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 64)
--__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 128)
-+__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16, )
-+__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 16, BCM4710_FILL_TLB(start);)
-+__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 16, )
-+__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 32, )
-+__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 32, BCM4710_FILL_TLB(start);)
-+__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 32, )
-+__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 64, )
-+__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64, BCM4710_FILL_TLB(start);)
-+__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 64, )
-+__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 128, )
-+
-+__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 16, )
-+__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 32, )
-+__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 16, )
-+__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 32, )
-+__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 64, )
-+__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 128, )
-
- /* build blast_xxx_range, protected_blast_xxx_range */
--#define __BUILD_BLAST_CACHE_RANGE(pfx, desc, hitop, prot) \
-+#define __BUILD_BLAST_CACHE_RANGE(pfx, desc, hitop, prot, war, war2) \
- static inline void prot##blast_##pfx##cache##_range(unsigned long start, \
- unsigned long end) \
- { \
- unsigned long lsize = cpu_##desc##_line_size(); \
- unsigned long addr = start & ~(lsize - 1); \
- unsigned long aend = (end - 1) & ~(lsize - 1); \
-+ war \
- \
- __##pfx##flush_prologue \
- \
- while (1) { \
-+ war2 \
- prot##cache_op(hitop, addr); \
- if (addr == aend) \
- break; \
-@@ -432,13 +501,13 @@ static inline void prot##blast_##pfx##ca
- __##pfx##flush_epilogue \
- }
-
--__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_)
--__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, protected_)
--__BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, protected_)
--__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, )
--__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, )
-+__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_, BCM4710_PROTECTED_FILL_TLB(addr); BCM4710_PROTECTED_FILL_TLB(aend);, BCM4710_DUMMY_RREG();)
-+__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, protected_,, )
-+__BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, protected_,, )
-+__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D,, BCM4710_FILL_TLB(addr); BCM4710_FILL_TLB(aend);, BCM4710_DUMMY_RREG();)
-+__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD,,, )
- /* blast_inv_dcache_range */
--__BUILD_BLAST_CACHE_RANGE(inv_d, dcache, Hit_Invalidate_D, )
--__BUILD_BLAST_CACHE_RANGE(inv_s, scache, Hit_Invalidate_SD, )
-+__BUILD_BLAST_CACHE_RANGE(inv_d, dcache, Hit_Invalidate_D,,,BCM4710_DUMMY_RREG();)
-+__BUILD_BLAST_CACHE_RANGE(inv_s, scache, Hit_Invalidate_SD,,, )
-
- #endif /* _ASM_R4KCACHE_H */
---- a/arch/mips/include/asm/stackframe.h
-+++ b/arch/mips/include/asm/stackframe.h
-@@ -430,6 +430,10 @@
- .macro RESTORE_SP_AND_RET
- LONG_L sp, PT_R29(sp)
- .set mips3
-+#ifdef CONFIG_BCM47XX
-+ nop
-+ nop
-+#endif
- eret
- .set mips0
- .endm
---- a/arch/mips/kernel/genex.S
-+++ b/arch/mips/kernel/genex.S
-@@ -52,6 +52,10 @@ NESTED(except_vec1_generic, 0, sp)
- NESTED(except_vec3_generic, 0, sp)
- .set push
- .set noat
-+#ifdef CONFIG_BCM47XX
-+ nop
-+ nop
-+#endif
- #if R5432_CP0_INTERRUPT_WAR
- mfc0 k0, CP0_INDEX
- #endif
---- a/arch/mips/mm/c-r4k.c
-+++ b/arch/mips/mm/c-r4k.c
-@@ -35,6 +35,9 @@
- #include <asm/cacheflush.h> /* for run_uncached() */
-
-
-+/* For enabling BCM4710 cache workarounds */
-+int bcm4710 = 0;
-+
- /*
- * Special Variant of smp_call_function for use by cache functions:
- *
-@@ -111,6 +114,9 @@ static void __cpuinit r4k_blast_dcache_p
- {
- unsigned long dc_lsize = cpu_dcache_line_size();
-
-+ if (bcm4710)
-+ r4k_blast_dcache_page = blast_dcache_page;
-+ else
- if (dc_lsize == 0)
- r4k_blast_dcache_page = (void *)cache_noop;
- else if (dc_lsize == 16)
-@@ -127,6 +133,9 @@ static void __cpuinit r4k_blast_dcache_p
- {
- unsigned long dc_lsize = cpu_dcache_line_size();
-
-+ if (bcm4710)
-+ r4k_blast_dcache_page_indexed = blast_dcache_page_indexed;
-+ else
- if (dc_lsize == 0)
- r4k_blast_dcache_page_indexed = (void *)cache_noop;
- else if (dc_lsize == 16)
-@@ -143,6 +152,9 @@ static void __cpuinit r4k_blast_dcache_s
- {
- unsigned long dc_lsize = cpu_dcache_line_size();
-
-+ if (bcm4710)
-+ r4k_blast_dcache = blast_dcache;
-+ else
- if (dc_lsize == 0)
- r4k_blast_dcache = (void *)cache_noop;
- else if (dc_lsize == 16)
-@@ -680,6 +692,8 @@ static void local_r4k_flush_cache_sigtra
- unsigned long addr = (unsigned long) arg;
-
- R4600_HIT_CACHEOP_WAR_IMPL;
-+ BCM4710_PROTECTED_FILL_TLB(addr);
-+ BCM4710_PROTECTED_FILL_TLB(addr + 4);
- if (dc_lsize)
- protected_writeback_dcache_line(addr & ~(dc_lsize - 1));
- if (!cpu_icache_snoops_remote_store && scache_size)
-@@ -1298,6 +1312,17 @@ static void __cpuinit coherency_setup(vo
- * silly idea of putting something else there ...
- */
- switch (current_cpu_type()) {
-+ case CPU_BCM3302:
-+ {
-+ u32 cm;
-+ cm = read_c0_diag();
-+ /* Enable icache */
-+ cm |= (1 << 31);
-+ /* Enable dcache */
-+ cm |= (1 << 30);
-+ write_c0_diag(cm);
-+ }
-+ break;
- case CPU_R4000PC:
- case CPU_R4000SC:
- case CPU_R4000MC:
-@@ -1354,6 +1379,15 @@ void __cpuinit r4k_cache_init(void)
- break;
- }
-
-+ /* Check if special workarounds are required */
-+#ifdef CONFIG_BCM47XX
-+ if (current_cpu_data.cputype == CPU_BCM4710 && (current_cpu_data.processor_id & 0xff) == 0) {
-+ printk("Enabling BCM4710A0 cache workarounds.\n");
-+ bcm4710 = 1;
-+ } else
-+#endif
-+ bcm4710 = 0;
-+
- probe_pcache();
- setup_scache();
-
-@@ -1412,5 +1446,13 @@ void __cpuinit r4k_cache_init(void)
- #if !defined(CONFIG_MIPS_CMP)
- local_r4k___flush_cache_all(NULL);
- #endif
-+#ifdef CONFIG_BCM47XX
-+ {
-+ static void (*_coherency_setup)(void);
-+ _coherency_setup = (void (*)(void)) KSEG1ADDR(coherency_setup);
-+ _coherency_setup();
-+ }
-+#else
- coherency_setup();
-+#endif
- }
---- a/arch/mips/mm/tlbex.c
-+++ b/arch/mips/mm/tlbex.c
-@@ -749,6 +749,9 @@ static void __cpuinit build_r4000_tlb_re
- /* No need for uasm_i_nop */
- }
-
-+#ifdef CONFIG_BCM47XX
-+ uasm_i_nop(&p);
-+#endif
- #ifdef CONFIG_64BIT
- build_get_pmde64(&p, &l, &r, K0, K1); /* get pmd in K1 */
- #else
-@@ -1203,6 +1206,9 @@ build_r4000_tlbchange_handler_head(u32 *
- struct uasm_reloc **r, unsigned int pte,
- unsigned int ptr)
- {
-+#ifdef CONFIG_BCM47XX
-+ uasm_i_nop(p);
-+#endif
- #ifdef CONFIG_64BIT
- build_get_pmde64(p, l, r, pte, ptr); /* get pmd in ptr */
- #else
+++ /dev/null
---- a/arch/mips/include/asm/cpu-features.h
-+++ b/arch/mips/include/asm/cpu-features.h
-@@ -107,6 +107,9 @@
- #ifndef cpu_has_pindexed_dcache
- #define cpu_has_pindexed_dcache (cpu_data[0].dcache.flags & MIPS_CACHE_PINDEX)
- #endif
-+#ifndef cpu_use_kmap_coherent
-+#define cpu_use_kmap_coherent 1
-+#endif
-
- /*
- * I-Cache snoops remote store. This only matters on SMP. Some multiprocessors
---- /dev/null
-+++ b/arch/mips/include/asm/mach-bcm47xx/cpu-feature-overrides.h
-@@ -0,0 +1,13 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org)
-+ */
-+#ifndef __ASM_MACH_BCM47XX_CPU_FEATURE_OVERRIDES_H
-+#define __ASM_MACH_BCM47XX_CPU_FEATURE_OVERRIDES_H
-+
-+#define cpu_use_kmap_coherent 0
-+
-+#endif /* __ASM_MACH_BCM47XX_CPU_FEATURE_OVERRIDES_H */
---- a/arch/mips/mm/c-r4k.c
-+++ b/arch/mips/mm/c-r4k.c
-@@ -507,7 +507,7 @@ static inline void local_r4k_flush_cache
- */
- map_coherent = (cpu_has_dc_aliases &&
- page_mapped(page) && !Page_dcache_dirty(page));
-- if (map_coherent)
-+ if (map_coherent && cpu_use_kmap_coherent)
- vaddr = kmap_coherent(page, addr);
- else
- vaddr = kmap_atomic(page, KM_USER0);
-@@ -530,7 +530,7 @@ static inline void local_r4k_flush_cache
- }
-
- if (vaddr) {
-- if (map_coherent)
-+ if (map_coherent && cpu_use_kmap_coherent)
- kunmap_coherent();
- else
- kunmap_atomic(vaddr, KM_USER0);
---- a/arch/mips/mm/init.c
-+++ b/arch/mips/mm/init.c
-@@ -209,7 +209,7 @@ void copy_user_highpage(struct page *to,
- void *vfrom, *vto;
-
- vto = kmap_atomic(to, KM_USER1);
-- if (cpu_has_dc_aliases &&
-+ if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
- page_mapped(from) && !Page_dcache_dirty(from)) {
- vfrom = kmap_coherent(from, vaddr);
- copy_page(vto, vfrom);
-@@ -231,7 +231,7 @@ void copy_to_user_page(struct vm_area_st
- struct page *page, unsigned long vaddr, void *dst, const void *src,
- unsigned long len)
- {
-- if (cpu_has_dc_aliases &&
-+ if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
- page_mapped(page) && !Page_dcache_dirty(page)) {
- void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
- memcpy(vto, src, len);
-@@ -249,7 +249,7 @@ void copy_from_user_page(struct vm_area_
- struct page *page, unsigned long vaddr, void *dst, const void *src,
- unsigned long len)
- {
-- if (cpu_has_dc_aliases &&
-+ if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
- page_mapped(page) && !Page_dcache_dirty(page)) {
- void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
- memcpy(dst, vfrom, len);
+++ /dev/null
---- a/arch/mips/bcm47xx/prom.c
-+++ b/arch/mips/bcm47xx/prom.c
-@@ -126,6 +126,7 @@ static __init void prom_init_cmdline(voi
- static __init void prom_init_mem(void)
- {
- unsigned long mem;
-+ unsigned long max;
-
- /* Figure out memory size by finding aliases.
- *
-@@ -134,21 +135,26 @@ static __init void prom_init_mem(void)
- * want to reuse the memory used by CFE (around 4MB). That means cfe_*
- * functions stop to work at some point during the boot, we should only
- * call them at the beginning of the boot.
-+ *
-+ * BCM47XX uses 128MB for addressing the ram, if the system contains
-+ * less that that amount of ram it remaps the ram more often into the
-+ * available space.
-+ * Accessing memory after 128MB will cause an exception.
-+ * max contains the biggest possible address supported by the platform.
-+ * If the method wants to try something above we assume 128MB ram.
- */
-+ max = ((unsigned long)(prom_init) | ((128 << 20) - 1));
- for (mem = (1 << 20); mem < (128 << 20); mem += (1 << 20)) {
-+ if (((unsigned long)(prom_init) + mem) > max) {
-+ mem = (128 << 20);
-+ printk("assume 128MB RAM\n");
-+ break;
-+ }
- if (*(unsigned long *)((unsigned long)(prom_init) + mem) ==
- *(unsigned long *)(prom_init))
- break;
- }
-
-- /* Ignoring the last page when ddr size is 128M. Cached
-- * accesses to last page is causing the processor to prefetch
-- * using address above 128M stepping out of the ddr address
-- * space.
-- */
-- if (mem == 0x8000000)
-- mem -= 0x1000;
--
- add_memory_region(0, mem, BOOT_MEM_RAM);
- }
-
+++ /dev/null
-From 83e34f03ee9b86b49bde4707a1fe03a1837e29be Mon Sep 17 00:00:00 2001
-From: Jochen Friedrich <jochen@scram.de>
-Date: Wed, 3 Feb 2010 21:28:11 +0100
-Subject: [PATCH 1/1] ssb: fix interrupt assignment
-
-Explicitely enable shared interrupt 2 for any core that didn't get a dedicated IRQ
-anymore (fallthrough case) and for EXTIF cores to make gpio interrupts work.
-Also remove a bogus comment.
-
-Signed-off-by: Jochen Friedrich <jochen@scram.de>
-Signed-off-by: John W. Linville <linville@tuxdriver.com>
----
- drivers/ssb/driver_mipscore.c | 5 ++++-
- 1 files changed, 4 insertions(+), 1 deletions(-)
-
---- a/drivers/ssb/driver_mipscore.c
-+++ b/drivers/ssb/driver_mipscore.c
-@@ -270,7 +270,6 @@ void ssb_mipscore_init(struct ssb_mipsco
- set_irq(dev, irq++);
- }
- break;
-- /* fallthrough */
- case SSB_DEV_PCI:
- case SSB_DEV_ETHERNET:
- case SSB_DEV_ETHERNET_GBIT:
-@@ -281,6 +280,10 @@ void ssb_mipscore_init(struct ssb_mipsco
- set_irq(dev, irq++);
- break;
- }
-+ /* fallthrough */
-+ case SSB_DEV_EXTIF:
-+ set_irq(dev, 0);
-+ break;
- }
- }
- ssb_dprintk(KERN_INFO PFX "after irq reconfiguration\n");
+++ /dev/null
---- a/drivers/net/b44.c
-+++ b/drivers/net/b44.c
-@@ -339,7 +339,7 @@ static int b44_phy_reset(struct b44 *bp)
- }
- }
-
-- return 0;
-+ return err;
- }
-
- static void __b44_set_flow_ctrl(struct b44 *bp, u32 pause_flags)
-@@ -2223,6 +2223,10 @@ static int __devinit b44_init_one(struct
- */
- b44_chip_reset(bp, B44_CHIP_RESET_FULL);
-
-+ /* do a phy reset to test if there is an active phy */
-+ if (b44_phy_reset(bp) < 0)
-+ bp->phy_addr = B44_PHY_ADDR_NO_PHY;
-+
- printk(KERN_INFO "%s: Broadcom 44xx/47xx 10/100BaseT Ethernet %pM\n",
- dev->name, dev->dev_addr);
-
+++ /dev/null
---- a/drivers/ssb/driver_chipcommon.c
-+++ b/drivers/ssb/driver_chipcommon.c
-@@ -258,6 +258,8 @@ void ssb_chipco_resume(struct ssb_chipco
- void ssb_chipco_get_clockcpu(struct ssb_chipcommon *cc,
- u32 *plltype, u32 *n, u32 *m)
- {
-+ if ((chipco_read32(cc, SSB_CHIPCO_CHIPID) & SSB_CHIPCO_IDMASK) == 0x5354)
-+ return;
- *n = chipco_read32(cc, SSB_CHIPCO_CLOCK_N);
- *plltype = (cc->capabilities & SSB_CHIPCO_CAP_PLLT);
- switch (*plltype) {
-@@ -281,6 +283,8 @@ void ssb_chipco_get_clockcpu(struct ssb_
- void ssb_chipco_get_clockcontrol(struct ssb_chipcommon *cc,
- u32 *plltype, u32 *n, u32 *m)
- {
-+ if ((chipco_read32(cc, SSB_CHIPCO_CHIPID) & SSB_CHIPCO_IDMASK) == 0x5354)
-+ return;
- *n = chipco_read32(cc, SSB_CHIPCO_CLOCK_N);
- *plltype = (cc->capabilities & SSB_CHIPCO_CAP_PLLT);
- switch (*plltype) {
---- a/drivers/ssb/driver_mipscore.c
-+++ b/drivers/ssb/driver_mipscore.c
-@@ -217,6 +217,8 @@ u32 ssb_cpu_clock(struct ssb_mipscore *m
-
- if ((pll_type == SSB_PLLTYPE_5) || (bus->chip_id == 0x5365)) {
- rate = 200000000;
-+ } else if (bus->chip_id == 0x5354) {
-+ rate = 240000000;
- } else {
- rate = ssb_calc_clock_rate(pll_type, n, m);
- }
---- a/drivers/ssb/main.c
-+++ b/drivers/ssb/main.c
-@@ -1069,6 +1069,8 @@ u32 ssb_clockspeed(struct ssb_bus *bus)
-
- if (bus->chip_id == 0x5365) {
- rate = 100000000;
-+ } else if (bus->chip_id == 0x5354) {
-+ rate = 120000000;
- } else {
- rate = ssb_calc_clock_rate(plltype, clkctl_n, clkctl_m);
- if (plltype == SSB_PLLTYPE_3) /* 25Mhz, 2 dividers */
+++ /dev/null
----
- drivers/usb/host/ohci-ssb.c | 39 ++++++++++++++++++++++++++++++++++++---
- 1 file changed, 36 insertions(+), 3 deletions(-)
-
---- a/drivers/usb/host/ohci-ssb.c
-+++ b/drivers/usb/host/ohci-ssb.c
-@@ -106,10 +106,42 @@ static int ssb_ohci_attach(struct ssb_de
- int err = -ENOMEM;
- u32 tmp, flags = 0;
-
-- if (dev->id.coreid == SSB_DEV_USB11_HOSTDEV)
-+ if (dev->id.coreid == SSB_DEV_USB11_HOSTDEV) {
-+ /* Put the device into host-mode. */
- flags |= SSB_OHCI_TMSLOW_HOSTMODE;
--
-- ssb_device_enable(dev, flags);
-+ ssb_device_enable(dev, flags);
-+ } else if (dev->id.coreid == SSB_DEV_USB20_HOST) {
-+ /*
-+ * USB 2.0 special considerations:
-+ *
-+ * 1. Since the core supports both OHCI and EHCI functions, it must
-+ * only be reset once.
-+ *
-+ * 2. In addition to the standard SSB reset sequence, the Host Control
-+ * Register must be programmed to bring the USB core and various
-+ * phy components out of reset.
-+ */
-+ ssb_device_enable(dev, 0);
-+ ssb_write32(dev, 0x200, 0x7ff);
-+ udelay(1);
-+ if (dev->id.revision == 1) { // bug in rev 1
-+
-+ /* Change Flush control reg */
-+ tmp = ssb_read32(dev, 0x400);
-+ tmp &= ~8;
-+ ssb_write32(dev, 0x400, tmp);
-+ tmp = ssb_read32(dev, 0x400);
-+ printk("USB20H fcr: 0x%0x\n", tmp);
-+
-+ /* Change Shim control reg */
-+ tmp = ssb_read32(dev, 0x304);
-+ tmp &= ~0x100;
-+ ssb_write32(dev, 0x304, tmp);
-+ tmp = ssb_read32(dev, 0x304);
-+ printk("USB20H shim: 0x%0x\n", tmp);
-+ }
-+ } else
-+ ssb_device_enable(dev, 0);
-
- hcd = usb_create_hcd(&ssb_ohci_hc_driver, dev->dev,
- dev_name(dev->dev));
-@@ -200,6 +232,7 @@ static int ssb_ohci_resume(struct ssb_de
- static const struct ssb_device_id ssb_ohci_table[] = {
- SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB11_HOSTDEV, SSB_ANY_REV),
- SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB11_HOST, SSB_ANY_REV),
-+ SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB20_HOST, SSB_ANY_REV),
- SSB_DEVTABLE_END
- };
- MODULE_DEVICE_TABLE(ssb, ssb_ohci_table);
+++ /dev/null
----
- drivers/usb/host/ohci-ssb.c | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/drivers/usb/host/ohci-ssb.c
-+++ b/drivers/usb/host/ohci-ssb.c
-@@ -106,6 +106,9 @@ static int ssb_ohci_attach(struct ssb_de
- int err = -ENOMEM;
- u32 tmp, flags = 0;
-
-+ if (ssb_dma_set_mask(dev, DMA_BIT_MASK(32)))
-+ return -EOPNOTSUPP;
-+
- if (dev->id.coreid == SSB_DEV_USB11_HOSTDEV) {
- /* Put the device into host-mode. */
- flags |= SSB_OHCI_TMSLOW_HOSTMODE;
+++ /dev/null
----
- drivers/usb/host/Kconfig | 13 ++
- drivers/usb/host/ehci-hcd.c | 12 ++
- drivers/usb/host/ehci-ssb.c | 201 ++++++++++++++++++++++++++++++++++++++++++++
- drivers/usb/host/ohci-ssb.c | 23 +++++
- 4 files changed, 247 insertions(+), 2 deletions(-)
-
---- a/drivers/usb/host/Kconfig
-+++ b/drivers/usb/host/Kconfig
-@@ -150,6 +150,19 @@ config USB_OXU210HP_HCD
- To compile this driver as a module, choose M here: the
- module will be called oxu210hp-hcd.
-
-+config USB_EHCI_HCD_SSB
-+ bool "EHCI support for Broadcom SSB EHCI core"
-+ depends on USB_EHCI_HCD && SSB && EXPERIMENTAL
-+ default n
-+ ---help---
-+ Support for the Sonics Silicon Backplane (SSB) attached
-+ Broadcom USB EHCI core.
-+
-+ This device is present in some embedded devices with
-+ Broadcom based SSB bus.
-+
-+ If unsure, say N.
-+
- config USB_ISP116X_HCD
- tristate "ISP116X HCD support"
- depends on USB
---- a/drivers/usb/host/ehci-hcd.c
-+++ b/drivers/usb/host/ehci-hcd.c
-@@ -1158,8 +1158,16 @@ MODULE_LICENSE ("GPL");
- #define PLATFORM_DRIVER ehci_atmel_driver
- #endif
-
--#if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \
-- !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER)
-+#ifdef CONFIG_USB_EHCI_HCD_SSB
-+#include "ehci-ssb.c"
-+#define SSB_EHCI_DRIVER ssb_ehci_driver
-+#endif
-+
-+#if !defined(PCI_DRIVER) && \
-+ !defined(PLATFORM_DRIVER) && \
-+ !defined(PS3_SYSTEM_BUS_DRIVER) && \
-+ !defined(OF_PLATFORM_DRIVER) && \
-+ !defined(SSB_EHCI_DRIVER)
- #error "missing bus glue for ehci-hcd"
- #endif
-
---- /dev/null
-+++ b/drivers/usb/host/ehci-ssb.c
-@@ -0,0 +1,201 @@
-+/*
-+ * Sonics Silicon Backplane
-+ * Broadcom USB-core EHCI driver (SSB bus glue)
-+ *
-+ * Copyright 2007 Steven Brown <sbrown@cortland.com>
-+ *
-+ * Derived from the OHCI-SSB driver
-+ * Copyright 2007 Michael Buesch <mb@bu3sch.de>
-+ *
-+ * Derived from the EHCI-PCI driver
-+ * Copyright (c) 2000-2004 by David Brownell
-+ *
-+ * Derived from the OHCI-PCI driver
-+ * Copyright 1999 Roman Weissgaerber
-+ * Copyright 2000-2002 David Brownell
-+ * Copyright 1999 Linus Torvalds
-+ * Copyright 1999 Gregory P. Smith
-+ *
-+ * Derived from the USBcore related parts of Broadcom-SB
-+ * Copyright 2005 Broadcom Corporation
-+ *
-+ * Licensed under the GNU/GPL. See COPYING for details.
-+ */
-+#include <linux/ssb/ssb.h>
-+
-+#define SSB_OHCI_TMSLOW_HOSTMODE (1 << 29)
-+
-+struct ssb_ehci_device {
-+ struct ehci_hcd ehci; /* _must_ be at the beginning. */
-+
-+ u32 enable_flags;
-+};
-+
-+static inline
-+struct ssb_ehci_device *hcd_to_ssb_ehci(struct usb_hcd *hcd)
-+{
-+ return (struct ssb_ehci_device *)(hcd->hcd_priv);
-+}
-+
-+
-+static int ssb_ehci_reset(struct usb_hcd *hcd)
-+{
-+ struct ehci_hcd *ehci = hcd_to_ehci(hcd);
-+ int err;
-+
-+ ehci->caps = hcd->regs;
-+ ehci->regs = hcd->regs +
-+ HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase));
-+
-+ dbg_hcs_params(ehci, "reset");
-+ dbg_hcc_params(ehci, "reset");
-+
-+ ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params);
-+
-+ err = ehci_halt(ehci);
-+
-+ if (err)
-+ return err;
-+
-+ err = ehci_init(hcd);
-+
-+ if (err)
-+ return err;
-+
-+ ehci_port_power(ehci, 0);
-+
-+ return err;
-+}
-+
-+static int ssb_ehci_start(struct usb_hcd *hcd)
-+{
-+ struct ehci_hcd *ehci = hcd_to_ehci(hcd);
-+ int err;
-+
-+ err = ehci_run(hcd);
-+ if (err < 0) {
-+ ehci_err(ehci, "can't start\n");
-+ ehci_stop(hcd);
-+ }
-+
-+ return err;
-+}
-+
-+#ifdef CONFIG_PM
-+static int ssb_ehci_hcd_suspend(struct usb_hcd *hcd, pm_message_t message)
-+{
-+ struct ssb_ehci_device *ehcidev = hcd_to_ssb_ehci(hcd);
-+ struct ehci_hcd *ehci = &ehcidev->ehci;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ehci->lock, flags);
-+
-+ ehci_writel(ehci, EHCI_INTR_MIE, &ehci->regs->intrdisable);
-+ ehci_readl(ehci, &ehci->regs->intrdisable); /* commit write */
-+
-+ /* make sure snapshot being resumed re-enumerates everything */
-+ if (message.event == PM_EVENT_PRETHAW)
-+ ehci_usb_reset(ehci);
-+
-+ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
-+
-+ spin_unlock_irqrestore(&ehci->lock, flags);
-+ return 0;
-+}
-+
-+static int ssb_ehci_hcd_resume(struct usb_hcd *hcd)
-+{
-+ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
-+ usb_hcd_resume_root_hub(hcd);
-+ return 0;
-+}
-+#endif /* CONFIG_PM */
-+
-+static const struct hc_driver ssb_ehci_hc_driver = {
-+ .description = "ssb-usb-ehci",
-+ .product_desc = "SSB EHCI Controller",
-+ .hcd_priv_size = sizeof(struct ssb_ehci_device),
-+
-+ .irq = ehci_irq,
-+ .flags = HCD_MEMORY | HCD_USB2,
-+
-+ .reset = ssb_ehci_reset,
-+ .start = ssb_ehci_start,
-+ .stop = ehci_stop,
-+ .shutdown = ehci_shutdown,
-+
-+#ifdef CONFIG_PM
-+ .suspend = ssb_ehci_hcd_suspend,
-+ .resume = ssb_ehci_hcd_resume,
-+#endif
-+
-+ .urb_enqueue = ehci_urb_enqueue,
-+ .urb_dequeue = ehci_urb_dequeue,
-+ .endpoint_disable = ehci_endpoint_disable,
-+
-+ .get_frame_number = ehci_get_frame,
-+
-+ .hub_status_data = ehci_hub_status_data,
-+ .hub_control = ehci_hub_control,
-+#ifdef CONFIG_PM
-+ .bus_suspend = ehci_bus_suspend,
-+ .bus_resume = ehci_bus_resume,
-+#endif
-+
-+};
-+
-+static void ssb_ehci_detach(struct ssb_device *dev, struct usb_hcd *hcd)
-+{
-+
-+ usb_remove_hcd(hcd);
-+ iounmap(hcd->regs);
-+ usb_put_hcd(hcd);
-+}
-+EXPORT_SYMBOL_GPL(ssb_ehci_detach);
-+
-+static int ssb_ehci_attach(struct ssb_device *dev, struct usb_hcd **ehci_hcd)
-+{
-+ struct ssb_ehci_device *ehcidev;
-+ struct usb_hcd *hcd;
-+ int err = -ENOMEM;
-+ u32 tmp, flags = 0;
-+
-+ hcd = usb_create_hcd(&ssb_ehci_hc_driver, dev->dev,
-+ dev_name(dev->dev));
-+ if (!hcd)
-+ goto err_dev_disable;
-+
-+ ehcidev = hcd_to_ssb_ehci(hcd);
-+ ehcidev->enable_flags = flags;
-+ tmp = ssb_read32(dev, SSB_ADMATCH0);
-+ hcd->rsrc_start = ssb_admatch_base(tmp) + 0x800; /* ehci core offset */
-+ hcd->rsrc_len = 0x100; /* ehci reg block size */
-+ /*
-+ * start & size modified per sbutils.c
-+ */
-+ hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len);
-+ if (!hcd->regs)
-+ goto err_put_hcd;
-+ err = usb_add_hcd(hcd, dev->irq, IRQF_SHARED | IRQF_DISABLED);
-+ if (err)
-+ goto err_iounmap;
-+
-+ *ehci_hcd = hcd;
-+
-+ return err;
-+
-+err_iounmap:
-+ iounmap(hcd->regs);
-+err_put_hcd:
-+ usb_put_hcd(hcd);
-+err_dev_disable:
-+ ssb_device_disable(dev, flags);
-+ return err;
-+}
-+EXPORT_SYMBOL_GPL(ssb_ehci_attach);
-+
-+static const struct ssb_device_id ssb_ehci_table[] = {
-+ SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB20_HOST, SSB_ANY_REV),
-+ SSB_DEVTABLE_END
-+};
-+MODULE_DEVICE_TABLE(ssb, ssb_ehci_table);
---- a/drivers/usb/host/ohci-ssb.c
-+++ b/drivers/usb/host/ohci-ssb.c
-@@ -17,6 +17,8 @@
- */
- #include <linux/ssb/ssb.h>
-
-+extern int ssb_ehci_attach(struct ssb_device *dev, struct usb_hcd **hcd);
-+extern void ssb_ehci_detach(struct ssb_device *dev, struct usb_hcd *hcd);
-
- #define SSB_OHCI_TMSLOW_HOSTMODE (1 << 29)
-
-@@ -24,6 +26,7 @@ struct ssb_ohci_device {
- struct ohci_hcd ohci; /* _must_ be at the beginning. */
-
- u32 enable_flags;
-+ struct usb_hcd *ehci_hcd;
- };
-
- static inline
-@@ -92,13 +95,25 @@ static const struct hc_driver ssb_ohci_h
- static void ssb_ohci_detach(struct ssb_device *dev)
- {
- struct usb_hcd *hcd = ssb_get_drvdata(dev);
-+#ifdef CONFIG_USB_EHCI_HCD_SSB
-+ struct ssb_ohci_device *ohcidev = hcd_to_ssb_ohci(hcd);
-+#endif
-
- usb_remove_hcd(hcd);
- iounmap(hcd->regs);
- usb_put_hcd(hcd);
-+
-+#ifdef CONFIG_USB_EHCI_HCD_SSB
-+ /*
-+ * Also detach ehci function
-+ */
-+ if (dev->id.coreid == SSB_DEV_USB20_HOST)
-+ ssb_ehci_detach(dev, ohcidev->ehci_hcd);
-+#endif
- ssb_device_disable(dev, 0);
- }
-
-+
- static int ssb_ohci_attach(struct ssb_device *dev)
- {
- struct ssb_ohci_device *ohcidev;
-@@ -165,6 +180,14 @@ static int ssb_ohci_attach(struct ssb_de
-
- ssb_set_drvdata(dev, hcd);
-
-+#ifdef CONFIG_USB_EHCI_HCD_SSB
-+ /*
-+ * attach ehci function in this core
-+ */
-+ if (dev->id.coreid == SSB_DEV_USB20_HOST)
-+ err = ssb_ehci_attach(dev, &(ohcidev->ehci_hcd));
-+#endif
-+
- return err;
-
- err_iounmap:
+++ /dev/null
-This patch significantly improves the reliability of high speed
-usb writes on the bcm5354. It implements a work around for version 2
-of the usb20 core that was cribbed from the GPL sources for the
-Asus wl500gpv2 and verified against the wl520gu sources.
-
-Reference:
-GPL/WL-520gu-NewUI/src/linux/linux/arch/mips/brcm-boards/bcm947xx/pcibios.c
-GPL/WL-500gPV2-NewUI/src/linux/linux/arch/mips/brcm-boards/bcm947xx/pcibios.c
-
-Signed-off-by: Steve Brown <sbrown@cortland.com>
-
----
- drivers/usb/host/ohci-ssb.c | 37 +++++++++++++++++++++++--------------
- 1 file changed, 23 insertions(+), 14 deletions(-)
-
---- a/drivers/usb/host/ohci-ssb.c
-+++ b/drivers/usb/host/ohci-ssb.c
-@@ -141,22 +141,31 @@ static int ssb_ohci_attach(struct ssb_de
- */
- ssb_device_enable(dev, 0);
- ssb_write32(dev, 0x200, 0x7ff);
-+
-+ /* Change Flush control reg */
-+ tmp = ssb_read32(dev, 0x400);
-+ tmp &= ~8;
-+ ssb_write32(dev, 0x400, tmp);
-+ tmp = ssb_read32(dev, 0x400);
-+
-+ /* Change Shim control reg */
-+ tmp = ssb_read32(dev, 0x304);
-+ tmp &= ~0x100;
-+ ssb_write32(dev, 0x304, tmp);
-+ tmp = ssb_read32(dev, 0x304);
-+
- udelay(1);
-- if (dev->id.revision == 1) { // bug in rev 1
-
-- /* Change Flush control reg */
-- tmp = ssb_read32(dev, 0x400);
-- tmp &= ~8;
-- ssb_write32(dev, 0x400, tmp);
-- tmp = ssb_read32(dev, 0x400);
-- printk("USB20H fcr: 0x%0x\n", tmp);
--
-- /* Change Shim control reg */
-- tmp = ssb_read32(dev, 0x304);
-- tmp &= ~0x100;
-- ssb_write32(dev, 0x304, tmp);
-- tmp = ssb_read32(dev, 0x304);
-- printk("USB20H shim: 0x%0x\n", tmp);
-+ /* Work around for 5354 failures */
-+ if ((dev->id.revision == 2) && (dev->bus->chip_id == 0x5354)) {
-+ /* Change syn01 reg */
-+ tmp = 0x00fe00fe;
-+ ssb_write32(dev, 0x894, tmp);
-+
-+ /* Change syn03 reg */
-+ tmp = ssb_read32(dev, 0x89c);
-+ tmp |= 0x1;
-+ ssb_write32(dev, 0x89c, tmp);
- }
- } else
- ssb_device_enable(dev, 0);
+++ /dev/null
-This prevents the options from being delete with make kernel_oldconfig.
----
- drivers/ssb/Kconfig | 2 ++
- 1 file changed, 2 insertions(+)
-
---- a/drivers/ssb/Kconfig
-+++ b/drivers/ssb/Kconfig
-@@ -140,6 +140,8 @@ config SSB_DRIVER_MIPS
- config SSB_EMBEDDED
- bool
- depends on SSB_DRIVER_MIPS
-+ select USB_EHCI_HCD_SSB if USB_EHCI_HCD
-+ select USB_OHCI_HCD_SSB if USB_OHCI_HCD
- default y
-
- config SSB_DRIVER_EXTIF
+++ /dev/null
---- a/arch/mips/include/asm/cacheflush.h
-+++ b/arch/mips/include/asm/cacheflush.h
-@@ -32,7 +32,7 @@
- extern void (*flush_cache_all)(void);
- extern void (*__flush_cache_all)(void);
- extern void (*flush_cache_mm)(struct mm_struct *mm);
--#define flush_cache_dup_mm(mm) do { (void) (mm); } while (0)
-+#define flush_cache_dup_mm(mm) flush_cache_mm(mm)
- extern void (*flush_cache_range)(struct vm_area_struct *vma,
- unsigned long start, unsigned long end);
- extern void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, unsigned long pfn);
+++ /dev/null
---- a/arch/mips/mm/c-r4k.c
-+++ b/arch/mips/mm/c-r4k.c
-@@ -373,7 +373,7 @@ static inline void local_r4k___flush_cac
- }
- }
-
--static void r4k___flush_cache_all(void)
-+void r4k___flush_cache_all(void)
- {
- r4k_on_each_cpu(local_r4k___flush_cache_all, NULL, 1);
- }
-@@ -537,7 +537,7 @@ static inline void local_r4k_flush_cache
- }
- }
-
--static void r4k_flush_cache_page(struct vm_area_struct *vma,
-+void r4k_flush_cache_page(struct vm_area_struct *vma,
- unsigned long addr, unsigned long pfn)
- {
- struct flush_cache_page_args args;
-@@ -1456,3 +1456,10 @@ void __cpuinit r4k_cache_init(void)
- coherency_setup();
- #endif
- }
-+
-+// fuse package DCACHE BUG patch exports
-+void (*fuse_flush_cache_all)(void) = r4k___flush_cache_all;
-+void (*fuse_flush_cache_page)(struct vm_area_struct *vma, unsigned long page,
-+ unsigned long pfn) = r4k_flush_cache_page;
-+EXPORT_SYMBOL(fuse_flush_cache_page);
-+EXPORT_SYMBOL(fuse_flush_cache_all);
+++ /dev/null
---- a/fs/fuse/dev.c
-+++ b/fs/fuse/dev.c
-@@ -533,6 +533,11 @@ static void fuse_copy_finish(struct fuse
- }
- }
-
-+#ifdef DCACHE_BUG
-+extern void (*fuse_flush_cache_all)(void);
-+extern void (*fuse_flush_cache_page)(struct vm_area_struct *vma, unsigned long page, unsigned long pfn);
-+#endif
-+
- /*
- * Get another pagefull of userspace buffer, and map it to kernel
- * address space, and lock request
-@@ -541,6 +546,9 @@ static int fuse_copy_fill(struct fuse_co
- {
- unsigned long offset;
- int err;
-+#ifdef DCACHE_BUG
-+ struct vm_area_struct *vma;
-+#endif
-
- unlock_request(cs->fc, cs->req);
- fuse_copy_finish(cs);
-@@ -552,14 +560,22 @@ static int fuse_copy_fill(struct fuse_co
- cs->nr_segs--;
- }
- down_read(¤t->mm->mmap_sem);
-+#ifndef DCACHE_BUG
- err = get_user_pages(current, current->mm, cs->addr, 1, cs->write, 0,
- &cs->pg, NULL);
-+#else
-+ err = get_user_pages(current, current->mm, cs->addr, 1, cs->write, 0,
-+ &cs->pg, &vma);
-+#endif
- up_read(¤t->mm->mmap_sem);
- if (err < 0)
- return err;
- BUG_ON(err != 1);
- offset = cs->addr % PAGE_SIZE;
- cs->mapaddr = kmap_atomic(cs->pg, KM_USER0);
-+#ifdef DCACHE_BUG
-+ fuse_flush_cache_page(vma, cs->addr, page_to_pfn(cs->pg));
-+#endif
- cs->buf = cs->mapaddr + offset;
- cs->len = min(PAGE_SIZE - offset, cs->seglen);
- cs->seglen -= cs->len;
-@@ -573,6 +589,11 @@ static int fuse_copy_do(struct fuse_copy
- {
- unsigned ncpy = min(*size, cs->len);
- if (val) {
-+#ifdef DCACHE_BUG
-+ // patch from mailing list, it is very important, otherwise,
-+ // can't mount, or ls mount point will hang
-+ fuse_flush_cache_all();
-+#endif
- if (cs->write)
- memcpy(cs->buf, *val, ncpy);
- else
---- a/fs/fuse/fuse_i.h
-+++ b/fs/fuse/fuse_i.h
-@@ -8,6 +8,7 @@
-
- #ifndef _FS_FUSE_I_H
- #define _FS_FUSE_I_H
-+#define DCACHE_BUG
-
- #include <linux/fuse.h>
- #include <linux/fs.h>
---- a/fs/fuse/inode.c
-+++ b/fs/fuse/inode.c
-@@ -1201,6 +1201,10 @@ static int __init fuse_init(void)
- printk(KERN_INFO "fuse init (API version %i.%i)\n",
- FUSE_KERNEL_VERSION, FUSE_KERNEL_MINOR_VERSION);
-
-+#ifdef DCACHE_BUG
-+printk("fuse init: DCACHE_BUG enabled\n");
-+#endif
-+
- INIT_LIST_HEAD(&fuse_conn_list);
- res = fuse_fs_init();
- if (res)
+++ /dev/null
---- a/arch/mips/include/asm/page.h
-+++ b/arch/mips/include/asm/page.h
-@@ -43,6 +43,7 @@
- #ifndef __ASSEMBLY__
-
- #include <linux/pfn.h>
-+#include <asm/cpu-features.h>
- #include <asm/io.h>
-
- extern void build_clear_page(void);
-@@ -78,13 +79,16 @@ static inline void clear_user_page(void
- flush_data_cache_page((unsigned long)addr);
- }
-
--extern void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
-- struct page *to);
--struct vm_area_struct;
--extern void copy_user_highpage(struct page *to, struct page *from,
-- unsigned long vaddr, struct vm_area_struct *vma);
-+static inline void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
-+ struct page *to)
-+{
-+ extern void (*flush_data_cache_page)(unsigned long addr);
-
--#define __HAVE_ARCH_COPY_USER_HIGHPAGE
-+ copy_page(vto, vfrom);
-+ if (!cpu_has_ic_fills_f_dc ||
-+ pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK))
-+ flush_data_cache_page((unsigned long)vto);
-+}
-
- /*
- * These are used to make use of C type-checking..
---- a/arch/mips/mm/init.c
-+++ b/arch/mips/mm/init.c
-@@ -203,30 +203,6 @@ void kunmap_coherent(void)
- preempt_check_resched();
- }
-
--void copy_user_highpage(struct page *to, struct page *from,
-- unsigned long vaddr, struct vm_area_struct *vma)
--{
-- void *vfrom, *vto;
--
-- vto = kmap_atomic(to, KM_USER1);
-- if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
-- page_mapped(from) && !Page_dcache_dirty(from)) {
-- vfrom = kmap_coherent(from, vaddr);
-- copy_page(vto, vfrom);
-- kunmap_coherent();
-- } else {
-- vfrom = kmap_atomic(from, KM_USER0);
-- copy_page(vto, vfrom);
-- kunmap_atomic(vfrom, KM_USER0);
-- }
-- if ((!cpu_has_ic_fills_f_dc) ||
-- pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK))
-- flush_data_cache_page((unsigned long)vto);
-- kunmap_atomic(vto, KM_USER1);
-- /* Make sure this page is cleared on other CPU's too before using it */
-- smp_wmb();
--}
--
- void copy_to_user_page(struct vm_area_struct *vma,
- struct page *page, unsigned long vaddr, void *dst, const void *src,
- unsigned long len)
+++ /dev/null
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -62,6 +62,7 @@ config BCM47XX
- select SSB_DRIVER_MIPS
- select SSB_DRIVER_EXTIF
- select SSB_EMBEDDED
-+ select SSB_B43_PCI_BRIDGE if PCI
- select SSB_PCICORE_HOSTMODE if PCI
- select GENERIC_GPIO
- select SYS_HAS_EARLY_PRINTK
---- a/arch/mips/bcm47xx/Makefile
-+++ b/arch/mips/bcm47xx/Makefile
-@@ -3,4 +3,4 @@
- # under Linux.
- #
-
--obj-y := gpio.o irq.o prom.o serial.o setup.o time.o wgt634u.o
-+obj-y := cfe_env.o gpio.o irq.o nvram.o prom.o serial.o setup.o time.o wgt634u.o
---- a/arch/mips/bcm47xx/irq.c
-+++ b/arch/mips/bcm47xx/irq.c
-@@ -1,5 +1,6 @@
- /*
- * Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org>
-+ * Copyright (C) 2008 Michael Buesch <mb@bu3sch.de>
- *
- * 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
-@@ -23,10 +24,19 @@
- */
-
- #include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
- #include <linux/interrupt.h>
- #include <linux/irq.h>
-+#include <linux/pci.h>
-+#include <linux/ssb/ssb.h>
-+
- #include <asm/irq_cpu.h>
-
-+
-+extern struct ssb_bus ssb_bcm47xx;
-+
-+
- void plat_irq_dispatch(void)
- {
- u32 cause;
---- a/arch/mips/bcm47xx/nvram.c
-+++ b/arch/mips/bcm47xx/nvram.c
-@@ -24,10 +24,10 @@
- #include <asm/io.h>
- #include <asm/uaccess.h>
-
--#include <nvram.h>
-+#include "include/nvram.h"
-
- #define MB * 1048576
--extern struct ssb_bus ssb;
-+extern struct ssb_bus ssb_bcm47xx;
-
- static char nvram_buf[NVRAM_SPACE];
- static int cfe_env;
-@@ -36,7 +36,7 @@ extern char *cfe_env_get(char *nv_buf, c
- /* Probe for NVRAM header */
- static void __init early_nvram_init(void)
- {
-- struct ssb_mipscore *mcore = &ssb.mipscore;
-+ struct ssb_mipscore *mcore = &ssb_bcm47xx.mipscore;
- struct nvram_header *header;
- int i;
- u32 base, lim, off;
---- a/arch/mips/bcm47xx/setup.c
-+++ b/arch/mips/bcm47xx/setup.c
-@@ -2,7 +2,7 @@
- * Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org>
- * Copyright (C) 2005 Waldemar Brodkorb <wbx@openwrt.org>
- * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
-- * Copyright (C) 2006 Michael Buesch <mb@bu3sch.de>
-+ * Copyright (C) 2006-2008 Michael Buesch <mb@bu3sch.de>
- *
- * 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
-@@ -25,18 +25,28 @@
- * 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-+#include <linux/init.h>
- #include <linux/types.h>
- #include <linux/ssb/ssb.h>
- #include <linux/ssb/ssb_embedded.h>
-+#include <linux/tty.h>
-+#include <linux/serial.h>
-+#include <linux/serial_core.h>
-+#include <linux/serial_reg.h>
-+#include <linux/serial_8250.h>
- #include <asm/bootinfo.h>
- #include <asm/reboot.h>
- #include <asm/time.h>
--#include <bcm47xx.h>
- #include <asm/fw/cfe/cfe_api.h>
-+#include <linux/pm.h>
-+
-+#include "include/nvram.h"
-
- struct ssb_bus ssb_bcm47xx;
- EXPORT_SYMBOL(ssb_bcm47xx);
-
-+extern void bcm47xx_pci_init(void);
-+
- static void bcm47xx_machine_restart(char *command)
- {
- printk(KERN_ALERT "Please stand by while rebooting the system...\n");
-@@ -56,7 +66,7 @@ static void bcm47xx_machine_halt(void)
- cpu_relax();
- }
-
--static void str2eaddr(char *str, char *dest)
-+static void e_aton(char *str, char *dest)
- {
- int i = 0;
-
-@@ -73,52 +83,142 @@ static void str2eaddr(char *str, char *d
- }
- }
-
--static int bcm47xx_get_invariants(struct ssb_bus *bus,
-- struct ssb_init_invariants *iv)
-+static void bcm47xx_fill_sprom(struct ssb_sprom *sprom)
- {
-- char buf[100];
-+ char *s;
-
-- /* Fill boardinfo structure */
-- memset(&(iv->boardinfo), 0 , sizeof(struct ssb_boardinfo));
-+ memset(sprom, 0xFF, sizeof(struct ssb_sprom));
-
-- if (cfe_getenv("boardvendor", buf, sizeof(buf)) >= 0)
-- iv->boardinfo.type = (u16)simple_strtoul(buf, NULL, 0);
-- if (cfe_getenv("boardtype", buf, sizeof(buf)) >= 0)
-- iv->boardinfo.type = (u16)simple_strtoul(buf, NULL, 0);
-- if (cfe_getenv("boardrev", buf, sizeof(buf)) >= 0)
-- iv->boardinfo.rev = (u16)simple_strtoul(buf, NULL, 0);
--
-- /* Fill sprom structure */
-- memset(&(iv->sprom), 0, sizeof(struct ssb_sprom));
-- iv->sprom.revision = 3;
--
-- if (cfe_getenv("et0macaddr", buf, sizeof(buf)) >= 0)
-- str2eaddr(buf, iv->sprom.et0mac);
-- if (cfe_getenv("et1macaddr", buf, sizeof(buf)) >= 0)
-- str2eaddr(buf, iv->sprom.et1mac);
-- if (cfe_getenv("et0phyaddr", buf, sizeof(buf)) >= 0)
-- iv->sprom.et0phyaddr = simple_strtoul(buf, NULL, 10);
-- if (cfe_getenv("et1phyaddr", buf, sizeof(buf)) >= 0)
-- iv->sprom.et1phyaddr = simple_strtoul(buf, NULL, 10);
-- if (cfe_getenv("et0mdcport", buf, sizeof(buf)) >= 0)
-- iv->sprom.et0mdcport = simple_strtoul(buf, NULL, 10);
-- if (cfe_getenv("et1mdcport", buf, sizeof(buf)) >= 0)
-- iv->sprom.et1mdcport = simple_strtoul(buf, NULL, 10);
-+ sprom->revision = 1;
-+ if ((s = nvram_get("il0macaddr")))
-+ e_aton(s, sprom->il0mac);
-+ if ((s = nvram_get("et0macaddr")))
-+ e_aton(s, sprom->et0mac);
-+ if ((s = nvram_get("et1macaddr")))
-+ e_aton(s, sprom->et1mac);
-+ if ((s = nvram_get("et0phyaddr")))
-+ sprom->et0phyaddr = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("et1phyaddr")))
-+ sprom->et1phyaddr = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("et0mdcport")))
-+ sprom->et0mdcport = !!simple_strtoul(s, NULL, 10);
-+ if ((s = nvram_get("et1mdcport")))
-+ sprom->et1mdcport = !!simple_strtoul(s, NULL, 10);
-+ if ((s = nvram_get("pa0b0")))
-+ sprom->pa0b0 = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("pa0b1")))
-+ sprom->pa0b1 = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("pa0b2")))
-+ sprom->pa0b2 = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("pa1b0")))
-+ sprom->pa1b0 = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("pa1b1")))
-+ sprom->pa1b1 = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("pa1b2")))
-+ sprom->pa1b2 = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("wl0gpio0")))
-+ sprom->gpio0 = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("wl0gpio1")))
-+ sprom->gpio1 = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("wl0gpio2")))
-+ sprom->gpio2 = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("wl0gpio3")))
-+ sprom->gpio3 = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("pa0maxpwr")))
-+ sprom->maxpwr_bg = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("pa1maxpwr")))
-+ sprom->maxpwr_a = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("pa0itssit")))
-+ sprom->itssi_bg = simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("pa1itssit")))
-+ sprom->itssi_a = simple_strtoul(s, NULL, 0);
-+ sprom->boardflags_lo = 0;
-+ if ((s = nvram_get("boardflags")))
-+ sprom->boardflags_lo = simple_strtoul(s, NULL, 0);
-+ sprom->boardflags_hi = 0;
-+ if ((s = nvram_get("boardflags2")))
-+ sprom->boardflags_hi = simple_strtoul(s, NULL, 0);
-+}
-+
-+static int bcm47xx_get_invariants(struct ssb_bus *bus, struct ssb_init_invariants *iv)
-+{
-+ char *s;
-+
-+ iv->boardinfo.vendor = SSB_BOARDVENDOR_BCM;
-+ if ((s = nvram_get("boardtype")))
-+ iv->boardinfo.type = (u16)simple_strtoul(s, NULL, 0);
-+ if ((s = nvram_get("boardrev")))
-+ iv->boardinfo.rev = (u16)simple_strtoul(s, NULL, 0);
-+
-+ bcm47xx_fill_sprom(&iv->sprom);
-+
-+ if ((s = nvram_get("cardbus")))
-+ iv->has_cardbus_slot = !!simple_strtoul(s, NULL, 10);
-
- return 0;
- }
-
- void __init plat_mem_setup(void)
- {
-- int err;
-+ int i, err;
-+ char *s;
-+ struct ssb_mipscore *mcore;
-+
-+ err = ssb_bus_ssbbus_register(&ssb_bcm47xx, SSB_ENUM_BASE, bcm47xx_get_invariants);
-+ if (err) {
-+ const char *msg = "Failed to initialize SSB bus (err %d)\n";
-+ printk(msg, err); /* Make sure the message gets out of the box. */
-+ panic(msg, err);
-+ }
-+ mcore = &ssb_bcm47xx.mipscore;
-
-- err = ssb_bus_ssbbus_register(&ssb_bcm47xx, SSB_ENUM_BASE,
-- bcm47xx_get_invariants);
-- if (err)
-- panic("Failed to initialize SSB bus (err %d)\n", err);
-+ s = nvram_get("kernel_args");
-+ if (s && !strncmp(s, "console=ttyS1", 13)) {
-+ struct ssb_serial_port port;
-+
-+ printk("Swapping serial ports!\n");
-+ /* swap serial ports */
-+ memcpy(&port, &mcore->serial_ports[0], sizeof(port));
-+ memcpy(&mcore->serial_ports[0], &mcore->serial_ports[1], sizeof(port));
-+ memcpy(&mcore->serial_ports[1], &port, sizeof(port));
-+ }
-+
-+ for (i = 0; i < mcore->nr_serial_ports; i++) {
-+ struct ssb_serial_port *port = &(mcore->serial_ports[i]);
-+ struct uart_port s;
-+
-+ memset(&s, 0, sizeof(s));
-+ s.line = i;
-+ s.mapbase = (unsigned int) port->regs;
-+ s.membase = port->regs;
-+ s.irq = port->irq + 2;
-+ s.uartclk = port->baud_base;
-+ s.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
-+ s.iotype = SERIAL_IO_MEM;
-+ s.regshift = port->reg_shift;
-+
-+ early_serial_setup(&s);
-+ }
-+ printk("Serial init done.\n");
-
- _machine_restart = bcm47xx_machine_restart;
- _machine_halt = bcm47xx_machine_halt;
- pm_power_off = bcm47xx_machine_halt;
- }
-
-+static int __init bcm47xx_register_gpiodev(void)
-+{
-+ static struct resource res = {
-+ .start = 0xFFFFFFFF,
-+ };
-+ struct platform_device *pdev;
-+
-+ pdev = platform_device_register_simple("GPIODEV", 0, &res, 1);
-+ if (!pdev) {
-+ printk(KERN_ERR "bcm47xx: GPIODEV init failed\n");
-+ return -ENODEV;
-+ }
-+
-+ return 0;
-+}
-+device_initcall(bcm47xx_register_gpiodev);
---- a/arch/mips/bcm47xx/time.c
-+++ b/arch/mips/bcm47xx/time.c
-@@ -22,11 +22,17 @@
- * 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
--
- #include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/serial_reg.h>
-+#include <linux/interrupt.h>
- #include <linux/ssb/ssb.h>
-+#include <asm/addrspace.h>
-+#include <asm/io.h>
- #include <asm/time.h>
--#include <bcm47xx.h>
-+
-+extern struct ssb_bus ssb_bcm47xx;
-
- void __init plat_time_init(void)
- {
+++ /dev/null
---- a/arch/mips/pci/pci.c
-+++ b/arch/mips/pci/pci.c
-@@ -185,12 +185,10 @@ static int pcibios_enable_resources(stru
- if ((idx == PCI_ROM_RESOURCE) &&
- (!(r->flags & IORESOURCE_ROM_ENABLE)))
- continue;
-- if (!r->start && r->end) {
-- printk(KERN_ERR "PCI: Device %s not available "
-- "because of resource collisions\n",
-+ if (!r->start && r->end)
-+ printk(KERN_WARNING "PCI: Device %s resource"
-+ "collisions detected. Ignoring...\n",
- pci_name(dev));
-- return -EINVAL;
-- }
- if (r->flags & IORESOURCE_IO)
- cmd |= PCI_COMMAND_IO;
- if (r->flags & IORESOURCE_MEM)
+++ /dev/null
---- a/drivers/net/tg3.c
-+++ b/drivers/net/tg3.c
-@@ -41,6 +41,7 @@
- #include <linux/prefetch.h>
- #include <linux/dma-mapping.h>
- #include <linux/firmware.h>
-+#include <linux/ssb/ssb_driver_gige.h>
-
- #include <net/checksum.h>
- #include <net/ip.h>
-@@ -466,8 +467,9 @@ static void _tw32_flush(struct tg3 *tp,
- static inline void tw32_mailbox_flush(struct tg3 *tp, u32 off, u32 val)
- {
- tp->write32_mbox(tp, off, val);
-- if (!(tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) &&
-- !(tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND))
-+ if ((tp->tg3_flags3 & TG3_FLG3_FLUSH_POSTED_WRITES) ||
-+ (!(tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) &&
-+ !(tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND)))
- tp->read32_mbox(tp, off);
- }
-
-@@ -477,7 +479,7 @@ static void tg3_write32_tx_mbox(struct t
- writel(val, mbox);
- if (tp->tg3_flags & TG3_FLAG_TXD_MBOX_HWBUG)
- writel(val, mbox);
-- if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)
-+ if ((tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) || (tp->tg3_flags3 & TG3_FLG3_FLUSH_POSTED_WRITES))
- readl(mbox);
- }
-
-@@ -777,7 +779,7 @@ static void tg3_switch_clocks(struct tg3
-
- #define PHY_BUSY_LOOPS 5000
-
--static int tg3_readphy(struct tg3 *tp, int reg, u32 *val)
-+static int __tg3_readphy(struct tg3 *tp, unsigned int phy_addr, int reg, u32 *val)
- {
- u32 frame_val;
- unsigned int loops;
-@@ -791,7 +793,7 @@ static int tg3_readphy(struct tg3 *tp, i
-
- *val = 0x0;
-
-- frame_val = ((tp->phy_addr << MI_COM_PHY_ADDR_SHIFT) &
-+ frame_val = ((phy_addr << MI_COM_PHY_ADDR_SHIFT) &
- MI_COM_PHY_ADDR_MASK);
- frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
- MI_COM_REG_ADDR_MASK);
-@@ -826,7 +828,12 @@ static int tg3_readphy(struct tg3 *tp, i
- return ret;
- }
-
--static int tg3_writephy(struct tg3 *tp, int reg, u32 val)
-+static int tg3_readphy(struct tg3 *tp, int reg, u32 *val)
-+{
-+ return __tg3_readphy(tp, tp->phy_addr, reg, val);
-+}
-+
-+static int __tg3_writephy(struct tg3 *tp, unsigned int phy_addr, int reg, u32 val)
- {
- u32 frame_val;
- unsigned int loops;
-@@ -842,7 +849,7 @@ static int tg3_writephy(struct tg3 *tp,
- udelay(80);
- }
-
-- frame_val = ((tp->phy_addr << MI_COM_PHY_ADDR_SHIFT) &
-+ frame_val = ((phy_addr << MI_COM_PHY_ADDR_SHIFT) &
- MI_COM_PHY_ADDR_MASK);
- frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
- MI_COM_REG_ADDR_MASK);
-@@ -875,6 +882,11 @@ static int tg3_writephy(struct tg3 *tp,
- return ret;
- }
-
-+static int tg3_writephy(struct tg3 *tp, int reg, u32 val)
-+{
-+ return __tg3_writephy(tp, tp->phy_addr, reg, val);
-+}
-+
- static int tg3_bmcr_reset(struct tg3 *tp)
- {
- u32 phy_control;
-@@ -2381,6 +2393,9 @@ static int tg3_nvram_read(struct tg3 *tp
- {
- int ret;
-
-+ if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE)
-+ return -ENODEV;
-+
- if (!(tp->tg3_flags & TG3_FLAG_NVRAM))
- return tg3_nvram_read_using_eeprom(tp, offset, val);
-
-@@ -2712,8 +2727,10 @@ static int tg3_set_power_state(struct tg
- tg3_frob_aux_power(tp);
-
- /* Workaround for unstable PLL clock */
-- if ((GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_AX) ||
-- (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_BX)) {
-+ if ((tp->phy_id & PHY_ID_MASK) != PHY_ID_BCM5750_2 &&
-+ /* !!! FIXME !!! */
-+ ((GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_AX) ||
-+ (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_BX))) {
- u32 val = tr32(0x7d00);
-
- val &= ~((1 << 16) | (1 << 4) | (1 << 2) | (1 << 1) | 1);
-@@ -3205,6 +3222,14 @@ relink:
-
- tg3_phy_copper_begin(tp);
-
-+ if (tp->tg3_flags3 & TG3_FLG3_ROBOSWITCH) {
-+ current_link_up = 1;
-+ current_speed = SPEED_1000; //FIXME
-+ current_duplex = DUPLEX_FULL;
-+ tp->link_config.active_speed = current_speed;
-+ tp->link_config.active_duplex = current_duplex;
-+ }
-+
- tg3_readphy(tp, MII_BMSR, &tmp);
- if (!tg3_readphy(tp, MII_BMSR, &tmp) &&
- (tmp & BMSR_LSTATUS))
-@@ -6633,6 +6658,11 @@ static int tg3_poll_fw(struct tg3 *tp)
- int i;
- u32 val;
-
-+ if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) {
-+ /* We don't use firmware. */
-+ return 0;
-+ }
-+
- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
- /* Wait up to 20ms for init done. */
- for (i = 0; i < 200; i++) {
-@@ -6910,6 +6940,14 @@ static int tg3_chip_reset(struct tg3 *tp
- tw32(0x5000, 0x400);
- }
-
-+ if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) {
-+ /* BCM4785: In order to avoid repercussions from using potentially
-+ * defective internal ROM, stop the Rx RISC CPU, which is not
-+ * required. */
-+ tg3_stop_fw(tp);
-+ tg3_halt_cpu(tp, RX_CPU_BASE);
-+ }
-+
- tw32(GRC_MODE, tp->grc_mode);
-
- if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A0) {
-@@ -7089,9 +7127,12 @@ static int tg3_halt_cpu(struct tg3 *tp,
- return -ENODEV;
- }
-
-- /* Clear firmware's nvram arbitration. */
-- if (tp->tg3_flags & TG3_FLAG_NVRAM)
-- tw32(NVRAM_SWARB, SWARB_REQ_CLR0);
-+ if (!(tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE)) {
-+ /* Clear firmware's nvram arbitration. */
-+ if (tp->tg3_flags & TG3_FLAG_NVRAM)
-+ tw32(NVRAM_SWARB, SWARB_REQ_CLR0);
-+ }
-+
- return 0;
- }
-
-@@ -7154,6 +7195,11 @@ static int tg3_load_5701_a0_firmware_fix
- const __be32 *fw_data;
- int err, i;
-
-+ if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) {
-+ /* We don't use firmware. */
-+ return 0;
-+ }
-+
- fw_data = (void *)tp->fw->data;
-
- /* Firmware blob starts with version numbers, followed by
-@@ -7213,6 +7259,11 @@ static int tg3_load_tso_firmware(struct
- unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size;
- int err, i;
-
-+ if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) {
-+ /* We don't use firmware. */
-+ return 0;
-+ }
-+
- if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
- return 0;
-
-@@ -8317,6 +8368,11 @@ static void tg3_timer(unsigned long __op
-
- spin_lock(&tp->lock);
-
-+ if (tp->tg3_flags3 & TG3_FLG3_FLUSH_POSTED_WRITES) {
-+ /* BCM4785: Flush posted writes from GbE to host memory. */
-+ tr32(HOSTCC_MODE);
-+ }
-+
- if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) {
- /* All of this garbage is because when using non-tagged
- * IRQ status the mailbox/status_block protocol the chip
-@@ -10214,6 +10270,11 @@ static int tg3_test_nvram(struct tg3 *tp
- if (tp->tg3_flags3 & TG3_FLG3_NO_NVRAM)
- return 0;
-
-+ if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) {
-+ /* We don't have NVRAM. */
-+ return 0;
-+ }
-+
- if (tg3_nvram_read(tp, 0, &magic) != 0)
- return -EIO;
-
-@@ -11014,7 +11075,7 @@ static int tg3_ioctl(struct net_device *
- return -EAGAIN;
-
- spin_lock_bh(&tp->lock);
-- err = tg3_readphy(tp, data->reg_num & 0x1f, &mii_regval);
-+ err = __tg3_readphy(tp, data->phy_id & 0x1f, data->reg_num & 0x1f, &mii_regval);
- spin_unlock_bh(&tp->lock);
-
- data->val_out = mii_regval;
-@@ -11030,7 +11091,7 @@ static int tg3_ioctl(struct net_device *
- return -EAGAIN;
-
- spin_lock_bh(&tp->lock);
-- err = tg3_writephy(tp, data->reg_num & 0x1f, data->val_in);
-+ err = __tg3_writephy(tp, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in);
- spin_unlock_bh(&tp->lock);
-
- return err;
-@@ -11675,6 +11736,12 @@ static void __devinit tg3_get_5717_nvram
- /* Chips other than 5700/5701 use the NVRAM for fetching info. */
- static void __devinit tg3_nvram_init(struct tg3 *tp)
- {
-+ if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) {
-+ /* No NVRAM and EEPROM on the SSB Broadcom GigE core. */
-+ tp->tg3_flags &= ~(TG3_FLAG_NVRAM | TG3_FLAG_NVRAM_BUFFERED);
-+ return;
-+ }
-+
- tw32_f(GRC_EEPROM_ADDR,
- (EEPROM_ADDR_FSM_RESET |
- (EEPROM_DEFAULT_CLOCK_PERIOD <<
-@@ -11936,6 +12003,9 @@ static int tg3_nvram_write_block(struct
- {
- int ret;
-
-+ if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE)
-+ return -ENODEV;
-+
- if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) {
- tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl &
- ~GRC_LCLCTRL_GPIO_OUTPUT1);
-@@ -13246,6 +13316,11 @@ static int __devinit tg3_get_invariants(
- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)))
- tp->tg3_flags |= TG3_FLAG_SRAM_USE_CONFIG;
-
-+ if (tp->tg3_flags3 & TG3_FLG3_FLUSH_POSTED_WRITES) {
-+ tp->write32_tx_mbox = tg3_write_flush_reg32;
-+ tp->write32_rx_mbox = tg3_write_flush_reg32;
-+ }
-+
- /* Get eeprom hw config before calling tg3_set_power_state().
- * In particular, the TG3_FLG2_IS_NIC flag must be
- * determined before calling tg3_set_power_state() so that
-@@ -13637,6 +13712,10 @@ static int __devinit tg3_get_device_addr
- }
-
- if (!is_valid_ether_addr(&dev->dev_addr[0])) {
-+ if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE)
-+ ssb_gige_get_macaddr(tp->pdev, &dev->dev_addr[0]);
-+ }
-+ if (!is_valid_ether_addr(&dev->dev_addr[0])) {
- #ifdef CONFIG_SPARC
- if (!tg3_get_default_macaddr_sparc(tp))
- return 0;
-@@ -14139,6 +14218,7 @@ static char * __devinit tg3_phy_string(s
- case PHY_ID_BCM5704: return "5704";
- case PHY_ID_BCM5705: return "5705";
- case PHY_ID_BCM5750: return "5750";
-+ case PHY_ID_BCM5750_2: return "5750-2";
- case PHY_ID_BCM5752: return "5752";
- case PHY_ID_BCM5714: return "5714";
- case PHY_ID_BCM5780: return "5780";
-@@ -14351,6 +14431,13 @@ static int __devinit tg3_init_one(struct
- tp->msg_enable = tg3_debug;
- else
- tp->msg_enable = TG3_DEF_MSG_ENABLE;
-+ if (pdev_is_ssb_gige_core(pdev)) {
-+ tp->tg3_flags3 |= TG3_FLG3_IS_SSB_CORE;
-+ if (ssb_gige_must_flush_posted_writes(pdev))
-+ tp->tg3_flags3 |= TG3_FLG3_FLUSH_POSTED_WRITES;
-+ if (ssb_gige_have_roboswitch(pdev))
-+ tp->tg3_flags3 |= TG3_FLG3_ROBOSWITCH;
-+ }
-
- /* The word/byte swap controls here control register access byte
- * swapping. DMA data byte swapping is controlled in the GRC_MODE
---- a/drivers/net/tg3.h
-+++ b/drivers/net/tg3.h
-@@ -1959,6 +1959,9 @@
- #define NIC_SRAM_RGMII_STD_IBND_DISABLE 0x00000004
- #define NIC_SRAM_RGMII_EXT_IBND_RX_EN 0x00000008
- #define NIC_SRAM_RGMII_EXT_IBND_TX_EN 0x00000010
-+#define TG3_FLG3_IS_SSB_CORE 0x00000800
-+#define TG3_FLG3_FLUSH_POSTED_WRITES 0x00001000
-+#define TG3_FLG3_ROBOSWITCH 0x00002000
-
- #define NIC_SRAM_RX_MINI_BUFFER_DESC 0x00001000
-
-@@ -2874,6 +2877,7 @@ struct tg3 {
- #define PHY_ID_BCM5714 0x60008340
- #define PHY_ID_BCM5780 0x60008350
- #define PHY_ID_BCM5755 0xbc050cc0
-+#define PHY_ID_BCM5750_2 0xbc050cd0
- #define PHY_ID_BCM5787 0xbc050ce0
- #define PHY_ID_BCM5756 0xbc050ed0
- #define PHY_ID_BCM5784 0xbc050fa0
-@@ -2921,7 +2925,8 @@ struct tg3 {
- (X) == PHY_ID_BCM5780 || (X) == PHY_ID_BCM5787 || \
- (X) == PHY_ID_BCM5755 || (X) == PHY_ID_BCM5756 || \
- (X) == PHY_ID_BCM5906 || (X) == PHY_ID_BCM5761 || \
-- (X) == PHY_ID_BCM5717 || (X) == PHY_ID_BCM8002)
-+ (X) == PHY_ID_BCM5717 || (X) == PHY_ID_BCM8002 || \
-+ (X) == PHY_ID_BCM5750_2)
-
- struct tg3_hw_stats *hw_stats;
- dma_addr_t stats_mapping;
+++ /dev/null
---- a/arch/mips/bcm47xx/prom.c
-+++ b/arch/mips/bcm47xx/prom.c
-@@ -32,6 +32,7 @@
- #include <asm/fw/cfe/cfe_error.h>
-
- static int cfe_cons_handle;
-+static void (* __prom_putchar)(char c);
-
- const char *get_system_type(void)
- {
-@@ -40,65 +41,40 @@ const char *get_system_type(void)
-
- void prom_putchar(char c)
- {
-+ if (__prom_putchar)
-+ __prom_putchar(c);
-+}
-+
-+void prom_putchar_cfe(char c)
-+{
- while (cfe_write(cfe_cons_handle, &c, 1) == 0)
- ;
- }
-
--static __init void prom_init_cfe(void)
-+static __init int prom_init_cfe(void)
- {
- uint32_t cfe_ept;
- uint32_t cfe_handle;
- uint32_t cfe_eptseal;
-- int argc = fw_arg0;
-- char **envp = (char **) fw_arg2;
-- int *prom_vec = (int *) fw_arg3;
--
-- /*
-- * Check if a loader was used; if NOT, the 4 arguments are
-- * what CFE gives us (handle, 0, EPT and EPTSEAL)
-- */
-- if (argc < 0) {
-- cfe_handle = (uint32_t)argc;
-- cfe_ept = (uint32_t)envp;
-- cfe_eptseal = (uint32_t)prom_vec;
-- } else {
-- if ((int)prom_vec < 0) {
-- /*
-- * Old loader; all it gives us is the handle,
-- * so use the "known" entrypoint and assume
-- * the seal.
-- */
-- cfe_handle = (uint32_t)prom_vec;
-- cfe_ept = 0xBFC00500;
-- cfe_eptseal = CFE_EPTSEAL;
-- } else {
-- /*
-- * Newer loaders bundle the handle/ept/eptseal
-- * Note: prom_vec is in the loader's useg
-- * which is still alive in the TLB.
-- */
-- cfe_handle = prom_vec[0];
-- cfe_ept = prom_vec[2];
-- cfe_eptseal = prom_vec[3];
-- }
-- }
-
-- if (cfe_eptseal != CFE_EPTSEAL) {
-- /* too early for panic to do any good */
-- printk(KERN_ERR "CFE's entrypoint seal doesn't match.");
-- while (1) ;
-- }
-+ cfe_eptseal = (uint32_t) fw_arg3;
-+ cfe_handle = (uint32_t) fw_arg0;
-+ cfe_ept = (uint32_t) fw_arg2;
-+
-+ if (cfe_eptseal != CFE_EPTSEAL)
-+ return -1;
-
- cfe_init(cfe_handle, cfe_ept);
-+ return 0;
- }
-
--static __init void prom_init_console(void)
-+static __init void prom_init_console_cfe(void)
- {
- /* Initialize CFE console */
- cfe_cons_handle = cfe_getstdhandle(CFE_STDHANDLE_CONSOLE);
- }
-
--static __init void prom_init_cmdline(void)
-+static __init void prom_init_cmdline_cfe(void)
- {
- static char buf[COMMAND_LINE_SIZE] __initdata;
-
-@@ -160,9 +136,12 @@ static __init void prom_init_mem(void)
-
- void __init prom_init(void)
- {
-- prom_init_cfe();
-- prom_init_console();
-- prom_init_cmdline();
-+ if (prom_init_cfe() == 0) {
-+ //prom_init_console_cfe();
-+ //prom_init_cmdline_cfe();
-+ __prom_putchar = prom_putchar_cfe;
-+ }
-+
- prom_init_mem();
- }
-
+++ /dev/null
---- a/arch/mips/bcm47xx/Makefile
-+++ b/arch/mips/bcm47xx/Makefile
-@@ -3,4 +3,4 @@
- # under Linux.
- #
-
--obj-y := cfe_env.o gpio.o irq.o nvram.o prom.o serial.o setup.o time.o wgt634u.o
-+obj-y := cfe_env.o gpio.o irq.o nvram.o prom.o serial.o setup.o time.o
---- a/arch/mips/bcm47xx/wgt634u.c
-+++ /dev/null
-@@ -1,167 +0,0 @@
--/*
-- * This file is subject to the terms and conditions of the GNU General Public
-- * License. See the file "COPYING" in the main directory of this archive
-- * for more details.
-- *
-- * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
-- */
--
--#include <linux/platform_device.h>
--#include <linux/module.h>
--#include <linux/leds.h>
--#include <linux/mtd/physmap.h>
--#include <linux/ssb/ssb.h>
--#include <linux/interrupt.h>
--#include <linux/reboot.h>
--#include <linux/gpio.h>
--#include <asm/mach-bcm47xx/bcm47xx.h>
--
--/* GPIO definitions for the WGT634U */
--#define WGT634U_GPIO_LED 3
--#define WGT634U_GPIO_RESET 2
--#define WGT634U_GPIO_TP1 7
--#define WGT634U_GPIO_TP2 6
--#define WGT634U_GPIO_TP3 5
--#define WGT634U_GPIO_TP4 4
--#define WGT634U_GPIO_TP5 1
--
--static struct gpio_led wgt634u_leds[] = {
-- {
-- .name = "power",
-- .gpio = WGT634U_GPIO_LED,
-- .active_low = 1,
-- .default_trigger = "heartbeat",
-- },
--};
--
--static struct gpio_led_platform_data wgt634u_led_data = {
-- .num_leds = ARRAY_SIZE(wgt634u_leds),
-- .leds = wgt634u_leds,
--};
--
--static struct platform_device wgt634u_gpio_leds = {
-- .name = "leds-gpio",
-- .id = -1,
-- .dev = {
-- .platform_data = &wgt634u_led_data,
-- }
--};
--
--
--/* 8MiB flash. The struct mtd_partition matches original Netgear WGT634U
-- firmware. */
--static struct mtd_partition wgt634u_partitions[] = {
-- {
-- .name = "cfe",
-- .offset = 0,
-- .size = 0x60000, /* 384k */
-- .mask_flags = MTD_WRITEABLE /* force read-only */
-- },
-- {
-- .name = "config",
-- .offset = 0x60000,
-- .size = 0x20000 /* 128k */
-- },
-- {
-- .name = "linux",
-- .offset = 0x80000,
-- .size = 0x140000 /* 1280k */
-- },
-- {
-- .name = "jffs",
-- .offset = 0x1c0000,
-- .size = 0x620000 /* 6272k */
-- },
-- {
-- .name = "nvram",
-- .offset = 0x7e0000,
-- .size = 0x20000 /* 128k */
-- },
--};
--
--static struct physmap_flash_data wgt634u_flash_data = {
-- .parts = wgt634u_partitions,
-- .nr_parts = ARRAY_SIZE(wgt634u_partitions)
--};
--
--static struct resource wgt634u_flash_resource = {
-- .flags = IORESOURCE_MEM,
--};
--
--static struct platform_device wgt634u_flash = {
-- .name = "physmap-flash",
-- .id = 0,
-- .dev = { .platform_data = &wgt634u_flash_data, },
-- .resource = &wgt634u_flash_resource,
-- .num_resources = 1,
--};
--
--/* Platform devices */
--static struct platform_device *wgt634u_devices[] __initdata = {
-- &wgt634u_flash,
-- &wgt634u_gpio_leds,
--};
--
--static irqreturn_t gpio_interrupt(int irq, void *ignored)
--{
-- int state;
--
-- /* Interrupts are shared, check if the current one is
-- a GPIO interrupt. */
-- if (!ssb_chipco_irq_status(&ssb_bcm47xx.chipco,
-- SSB_CHIPCO_IRQ_GPIO))
-- return IRQ_NONE;
--
-- state = gpio_get_value(WGT634U_GPIO_RESET);
--
-- /* Interrupt are level triggered, revert the interrupt polarity
-- to clear the interrupt. */
-- gpio_polarity(WGT634U_GPIO_RESET, state);
--
-- if (!state) {
-- printk(KERN_INFO "Reset button pressed");
-- ctrl_alt_del();
-- }
--
-- return IRQ_HANDLED;
--}
--
--static int __init wgt634u_init(void)
--{
-- /* There is no easy way to detect that we are running on a WGT634U
-- * machine. Use the MAC address as an heuristic. Netgear Inc. has
-- * been allocated ranges 00:09:5b:xx:xx:xx and 00:0f:b5:xx:xx:xx.
-- */
--
-- u8 *et0mac = ssb_bcm47xx.sprom.et0mac;
--
-- if (et0mac[0] == 0x00 &&
-- ((et0mac[1] == 0x09 && et0mac[2] == 0x5b) ||
-- (et0mac[1] == 0x0f && et0mac[2] == 0xb5))) {
-- struct ssb_mipscore *mcore = &ssb_bcm47xx.mipscore;
--
-- printk(KERN_INFO "WGT634U machine detected.\n");
--
-- if (!request_irq(gpio_to_irq(WGT634U_GPIO_RESET),
-- gpio_interrupt, IRQF_SHARED,
-- "WGT634U GPIO", &ssb_bcm47xx.chipco)) {
-- gpio_direction_input(WGT634U_GPIO_RESET);
-- gpio_intmask(WGT634U_GPIO_RESET, 1);
-- ssb_chipco_irq_mask(&ssb_bcm47xx.chipco,
-- SSB_CHIPCO_IRQ_GPIO,
-- SSB_CHIPCO_IRQ_GPIO);
-- }
--
-- wgt634u_flash_data.width = mcore->flash_buswidth;
-- wgt634u_flash_resource.start = mcore->flash_window;
-- wgt634u_flash_resource.end = mcore->flash_window
-- + mcore->flash_window_size
-- - 1;
-- return platform_add_devices(wgt634u_devices,
-- ARRAY_SIZE(wgt634u_devices));
-- } else
-- return -ENODEV;
--}
--
--module_init(wgt634u_init);
--
+++ /dev/null
---- a/drivers/net/b44.c
-+++ b/drivers/net/b44.c
-@@ -815,7 +815,7 @@ static int b44_rx(struct b44 *bp, int bu
- struct sk_buff *copy_skb;
-
- b44_recycle_rx(bp, cons, bp->rx_prod);
-- copy_skb = dev_alloc_skb(len + 2);
-+ copy_skb = netdev_alloc_skb(bp->dev, len + 2);
- if (copy_skb == NULL)
- goto drop_it_no_recycle;
-
+++ /dev/null
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -65,7 +65,6 @@ config BCM47XX
- select SSB_B43_PCI_BRIDGE if PCI
- select SSB_PCICORE_HOSTMODE if PCI
- select GENERIC_GPIO
-- select SYS_HAS_EARLY_PRINTK
- select CFE
- help
- Support for BCM47XX based boards
+++ /dev/null
---- a/arch/mips/include/asm/r4kcache.h
-+++ b/arch/mips/include/asm/r4kcache.h
-@@ -20,10 +20,25 @@
- #ifdef CONFIG_BCM47XX
- #include <asm/paccess.h>
- #include <linux/ssb/ssb.h>
--#define BCM4710_DUMMY_RREG() ((void) *((u8 *) KSEG1ADDR(SSB_ENUM_BASE + SSB_IMSTATE)))
-+#define BCM4710_DUMMY_RREG() bcm4710_dummy_rreg()
-+
-+static inline unsigned long bcm4710_dummy_rreg(void) {
-+ return (*(volatile unsigned long *)(KSEG1ADDR(SSB_ENUM_BASE + SSB_IMSTATE)));
-+}
-+
-+#define BCM4710_FILL_TLB(addr) bcm4710_fill_tlb((void*)(addr))
-+
-+static inline unsigned long bcm4710_fill_tlb(void *addr) {
-+ return (*(unsigned long *)addr);
-+}
-+
-+#define BCM4710_PROTECTED_FILL_TLB(addr) bcm4710_protected_fill_tlb((void*)(addr))
-+
-+static inline void bcm4710_protected_fill_tlb(void *addr) {
-+ unsigned long x;
-+ get_dbe(x, (unsigned long *)addr);;
-+}
-
--#define BCM4710_FILL_TLB(addr) (*(volatile unsigned long *)(addr))
--#define BCM4710_PROTECTED_FILL_TLB(addr) ({ unsigned long x; get_dbe(x, (volatile unsigned long *)(addr)); })
- #else
- #define BCM4710_DUMMY_RREG()
-
---- a/arch/mips/mm/tlbex.c
-+++ b/arch/mips/mm/tlbex.c
-@@ -611,6 +611,9 @@ build_get_pgde32(u32 **p, unsigned int t
- #endif
- uasm_i_addu(p, ptr, tmp, ptr);
- #else
-+#ifdef CONFIG_BCM47XX
-+ uasm_i_nop(p);
-+#endif
- UASM_i_LA_mostly(p, ptr, pgdc);
- #endif
- uasm_i_mfc0(p, tmp, C0_BADVADDR); /* get faulting address */
-@@ -749,12 +752,12 @@ static void __cpuinit build_r4000_tlb_re
- /* No need for uasm_i_nop */
- }
-
--#ifdef CONFIG_BCM47XX
-- uasm_i_nop(&p);
--#endif
- #ifdef CONFIG_64BIT
- build_get_pmde64(&p, &l, &r, K0, K1); /* get pmd in K1 */
- #else
-+# ifdef CONFIG_BCM47XX
-+ uasm_i_nop(&p);
-+# endif
- build_get_pgde32(&p, K0, K1); /* get pgd in K1 */
- #endif
-
-@@ -766,6 +769,9 @@ static void __cpuinit build_r4000_tlb_re
- build_update_entries(&p, K0, K1);
- build_tlb_write_entry(&p, &l, &r, tlb_random);
- uasm_l_leave(&l, p);
-+#ifdef CONFIG_BCM47XX
-+ uasm_i_nop(&p);
-+#endif
- uasm_i_eret(&p); /* return from trap */
-
- #ifdef CONFIG_HUGETLB_PAGE
-@@ -1206,12 +1212,12 @@ build_r4000_tlbchange_handler_head(u32 *
- struct uasm_reloc **r, unsigned int pte,
- unsigned int ptr)
- {
--#ifdef CONFIG_BCM47XX
-- uasm_i_nop(p);
--#endif
- #ifdef CONFIG_64BIT
- build_get_pmde64(p, l, r, pte, ptr); /* get pmd in ptr */
- #else
-+# ifdef CONFIG_BCM47XX
-+ uasm_i_nop(p);
-+# endif
- build_get_pgde32(p, pte, ptr); /* get pgd in ptr */
- #endif
-
-@@ -1248,6 +1254,9 @@ build_r4000_tlbchange_handler_tail(u32 *
- build_update_entries(p, tmp, ptr);
- build_tlb_write_entry(p, l, r, tlb_indexed);
- uasm_l_leave(l, *p);
-+#ifdef CONFIG_BCM47XX
-+ uasm_i_nop(p);
-+#endif
- uasm_i_eret(p); /* return from trap */
-
- #ifdef CONFIG_64BIT
---- a/arch/mips/kernel/genex.S
-+++ b/arch/mips/kernel/genex.S
-@@ -22,6 +22,19 @@
- #include <asm/page.h>
- #include <asm/thread_info.h>
-
-+#ifdef CONFIG_BCM47XX
-+# ifdef eret
-+# undef eret
-+# endif
-+# define eret \
-+ .set push; \
-+ .set noreorder; \
-+ nop; \
-+ nop; \
-+ eret; \
-+ .set pop;
-+#endif
-+
- #define PANIC_PIC(msg) \
- .set push; \
- .set reorder; \
-@@ -54,7 +67,6 @@ NESTED(except_vec3_generic, 0, sp)
- .set noat
- #ifdef CONFIG_BCM47XX
- nop
-- nop
- #endif
- #if R5432_CP0_INTERRUPT_WAR
- mfc0 k0, CP0_INDEX
-@@ -79,6 +91,9 @@ NESTED(except_vec3_r4000, 0, sp)
- .set push
- .set mips3
- .set noat
-+#ifdef CONFIG_BCM47XX
-+ nop
-+#endif
- mfc0 k1, CP0_CAUSE
- li k0, 31<<2
- andi k1, k1, 0x7c
+++ /dev/null
-Index: linux-2.6.33/drivers/ssb/driver_pcicore.c
-===================================================================
---- linux-2.6.33.orig/drivers/ssb/driver_pcicore.c 2010-03-15 14:52:55.000000000 +0100
-+++ linux-2.6.33/drivers/ssb/driver_pcicore.c 2010-03-15 15:57:38.000000000 +0100
-@@ -246,20 +246,12 @@
- .pci_ops = &ssb_pcicore_pciops,
- .io_resource = &ssb_pcicore_io_resource,
- .mem_resource = &ssb_pcicore_mem_resource,
-- .mem_offset = 0x24000000,
- };
-
--static u32 ssb_pcicore_pcibus_iobase = 0x100;
--static u32 ssb_pcicore_pcibus_membase = SSB_PCI_DMA;
--
- /* This function is called when doing a pci_enable_device().
- * We must first check if the device is a device on the PCI-core bridge. */
- int ssb_pcicore_plat_dev_init(struct pci_dev *d)
- {
-- struct resource *res;
-- int pos, size;
-- u32 *base;
--
- if (d->bus->ops != &ssb_pcicore_pciops) {
- /* This is not a device on the PCI-core bridge. */
- return -ENODEV;
-@@ -268,27 +260,6 @@
- ssb_printk(KERN_INFO "PCI: Fixing up device %s\n",
- pci_name(d));
-
-- /* Fix up resource bases */
-- for (pos = 0; pos < 6; pos++) {
-- res = &d->resource[pos];
-- if (res->flags & IORESOURCE_IO)
-- base = &ssb_pcicore_pcibus_iobase;
-- else
-- base = &ssb_pcicore_pcibus_membase;
-- res->flags |= IORESOURCE_PCI_FIXED;
-- if (res->end) {
-- size = res->end - res->start + 1;
-- if (*base & (size - 1))
-- *base = (*base + size) & ~(size - 1);
-- res->start = *base;
-- res->end = res->start + size - 1;
-- *base += size;
-- pci_write_config_dword(d, PCI_BASE_ADDRESS_0 + (pos << 2), res->start);
-- }
-- /* Fix up PCI bridge BAR0 only */
-- if (d->bus->number == 0 && PCI_SLOT(d->devfn) == 0)
-- break;
-- }
- /* Fix up interrupt lines */
- d->irq = ssb_mips_irq(extpci_core->dev) + 2;
- pci_write_config_byte(d, PCI_INTERRUPT_LINE, d->irq);
+++ /dev/null
-Index: linux-2.6.32.9/drivers/pcmcia/yenta_socket.c
-===================================================================
---- linux-2.6.32.9.orig/drivers/pcmcia/yenta_socket.c 2010-03-12 09:43:45.000000000 +0100
-+++ linux-2.6.32.9/drivers/pcmcia/yenta_socket.c 2010-03-12 10:05:33.000000000 +0100
-@@ -866,6 +866,8 @@
- * Probe for usable interrupts using the force
- * register to generate bogus card status events.
- */
-+#ifndef CONFIG_BCM47XX
-+ /* WRT54G3G does not like this */
- cb_writel(socket, CB_SOCKET_EVENT, -1);
- cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK);
- exca_writeb(socket, I365_CSCINT, 0);
-@@ -880,6 +882,7 @@
- }
- cb_writel(socket, CB_SOCKET_MASK, 0);
- exca_writeb(socket, I365_CSCINT, 0);
-+#endif
-
- mask = probe_irq_mask(val) & 0xffff;
-
-@@ -960,6 +963,10 @@
- else
- socket->socket.irq_mask = 0;
-
-+ /* irq mask probing is broken for the WRT54G3G */
-+ if (socket->socket.irq_mask == 0)
-+ socket->socket.irq_mask = 0x6f8;
-+
- dev_printk(KERN_INFO, &socket->dev->dev,
- "ISA IRQ mask 0x%04x, PCI irq %d\n",
- socket->socket.irq_mask, socket->cb_irq);
-@@ -1198,6 +1205,15 @@
- dev_printk(KERN_INFO, &dev->dev,
- "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE));
-
-+ /* Generate an interrupt on card insert/remove */
-+ config_writew(socket, CB_SOCKET_MASK, CB_CSTSMASK | CB_CDMASK);
-+
-+ /* Set up Multifunction Routing Status Register */
-+ config_writew(socket, 0x8C, 0x1000 /* MFUNC3 to GPIO3 */ | 0x2 /* MFUNC0 to INTA */);
-+
-+ /* Switch interrupts to parallelized */
-+ config_writeb(socket, 0x92, 0x64);
-+
- yenta_fixup_parent_bridge(dev->subordinate);
-
- /* Register it with the pcmcia layer.. */
+++ /dev/null
-CONFIG_32BIT=y
-# CONFIG_64BIT is not set
-# CONFIG_ALCHEMY_GPIO_INDIRECT is not set
-# CONFIG_AR7 is not set
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-CONFIG_ARCH_POPULATES_NODE_MAP=y
-CONFIG_ARCH_REQUIRE_GPIOLIB=y
-# CONFIG_ARCH_SUPPORTS_MSI is not set
-CONFIG_ARCH_SUPPORTS_OPROFILE=y
-CONFIG_ARCH_SUSPEND_POSSIBLE=y
-# CONFIG_ATH_COMMON is not set
-CONFIG_AUDIT=y
-CONFIG_AUDIT_GENERIC=y
-# CONFIG_BATMAN_ADV is not set
-# CONFIG_BCM47XX is not set
-CONFIG_BCM63XX=y
-CONFIG_BCM63XX_CPU_6338=y
-CONFIG_BCM63XX_CPU_6345=y
-CONFIG_BCM63XX_CPU_6348=y
-CONFIG_BCM63XX_CPU_6358=y
-CONFIG_BCM63XX_ENET=y
-CONFIG_BCM63XX_PHY=y
-CONFIG_BCM63XX_WDT=y
-CONFIG_BITREVERSE=y
-CONFIG_BOARD_BCM963XX=y
-# CONFIG_BOARD_LIVEBOX is not set
-CONFIG_BSD_PROCESS_ACCT_V3=y
-# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
-# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_CEVT_R4K=y
-CONFIG_CEVT_R4K_LIB=y
-CONFIG_CFG80211=m
-# CONFIG_CFG80211_DEBUGFS is not set
-CONFIG_CFG80211_DEFAULT_PS=y
-# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
-# CONFIG_CFG80211_REG_DEBUG is not set
-CONFIG_CFG80211_WEXT=y
-CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs,jffs2 noinitrd console=ttyS0,115200"
-CONFIG_CMDLINE_BOOL=y
-# CONFIG_CMDLINE_OVERRIDE is not set
-CONFIG_CPU_BIG_ENDIAN=y
-# CONFIG_CPU_CAVIUM_OCTEON is not set
-CONFIG_CPU_HAS_PREFETCH=y
-CONFIG_CPU_HAS_SYNC=y
-# CONFIG_CPU_LITTLE_ENDIAN is not set
-# CONFIG_CPU_LOONGSON2E is not set
-# CONFIG_CPU_LOONGSON2F is not set
-CONFIG_CPU_MIPS32=y
-CONFIG_CPU_MIPS32_R1=y
-# CONFIG_CPU_MIPS32_R2 is not set
-# CONFIG_CPU_MIPS64_R1 is not set
-# CONFIG_CPU_MIPS64_R2 is not set
-CONFIG_CPU_MIPSR1=y
-# CONFIG_CPU_NEVADA is not set
-# CONFIG_CPU_R10000 is not set
-# CONFIG_CPU_R3000 is not set
-# CONFIG_CPU_R4300 is not set
-# CONFIG_CPU_R4X00 is not set
-# CONFIG_CPU_R5000 is not set
-# CONFIG_CPU_R5432 is not set
-# CONFIG_CPU_R5500 is not set
-# CONFIG_CPU_R6000 is not set
-# CONFIG_CPU_R8000 is not set
-# CONFIG_CPU_RM7000 is not set
-# CONFIG_CPU_RM9000 is not set
-# CONFIG_CPU_SB1 is not set
-CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
-CONFIG_CPU_SUPPORTS_HIGHMEM=y
-# CONFIG_CPU_TX39XX is not set
-# CONFIG_CPU_TX49XX is not set
-# CONFIG_CPU_VR41XX is not set
-CONFIG_CRAMFS=y
-CONFIG_CSRC_R4K=y
-CONFIG_CSRC_R4K_LIB=y
-CONFIG_DECOMPRESS_LZMA=y
-CONFIG_DEFAULT_SECURITY=""
-CONFIG_DEFAULT_SECURITY_DAC=y
-# CONFIG_DEFAULT_SECURITY_SELINUX is not set
-# CONFIG_DEFAULT_SECURITY_SMACK is not set
-# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
-CONFIG_DEVPORT=y
-# CONFIG_DM9000 is not set
-CONFIG_DMA_NEED_PCI_MAP_STATE=y
-CONFIG_DMA_NONCOHERENT=y
-CONFIG_EARLY_PRINTK=y
-CONFIG_ELF_CORE=y
-CONFIG_FIRMWARE_IN_KERNEL=y
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-CONFIG_GENERIC_CMOS_UPDATE=y
-CONFIG_GENERIC_FIND_LAST_BIT=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_GPIO=y
-CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-CONFIG_GPIOLIB=y
-# CONFIG_GPIO_CS5535 is not set
-CONFIG_GPIO_DEVICE=y
-CONFIG_GPIO_SYSFS=y
-# CONFIG_HAMRADIO is not set
-CONFIG_HARDWARE_WATCHPOINTS=y
-CONFIG_HAS_DMA=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAVE_ARCH_KGDB=y
-CONFIG_HAVE_DYNAMIC_FTRACE=y
-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
-CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
-CONFIG_HAVE_GENERIC_DMA_COHERENT=y
-CONFIG_HAVE_IDE=y
-CONFIG_HAVE_OPROFILE=y
-CONFIG_HW_HAS_PCI=y
-CONFIG_HW_RANDOM=y
-CONFIG_HZ=250
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-CONFIG_IMAGE_CMDLINE_HACK=y
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_INLINE_READ_LOCK is not set
-# CONFIG_INLINE_READ_LOCK_BH is not set
-# CONFIG_INLINE_READ_LOCK_IRQ is not set
-# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_READ_TRYLOCK is not set
-CONFIG_INLINE_READ_UNLOCK=y
-# CONFIG_INLINE_READ_UNLOCK_BH is not set
-CONFIG_INLINE_READ_UNLOCK_IRQ=y
-# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_SPIN_LOCK is not set
-# CONFIG_INLINE_SPIN_LOCK_BH is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_SPIN_TRYLOCK is not set
-# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK=y
-# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
-# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_WRITE_LOCK is not set
-# CONFIG_INLINE_WRITE_LOCK_BH is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_WRITE_TRYLOCK is not set
-CONFIG_INLINE_WRITE_UNLOCK=y
-# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
-CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
-# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
-CONFIG_IP_PIMSM_V1=y
-CONFIG_IP_PIMSM_V2=y
-CONFIG_IRQ_CPU=y
-CONFIG_KEXEC=y
-CONFIG_LEDS_GPIO=y
-# CONFIG_LEDS_LT3593 is not set
-# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
-CONFIG_LOONGSON_UART_BASE=y
-# CONFIG_MACH_ALCHEMY is not set
-# CONFIG_MACH_DECSTATION is not set
-# CONFIG_MACH_JAZZ is not set
-# CONFIG_MACH_LOONGSON is not set
-# CONFIG_MACH_TX39XX is not set
-# CONFIG_MACH_TX49XX is not set
-# CONFIG_MACH_VR41XX is not set
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_MIKROTIK_RB532 is not set
-CONFIG_MIPS=y
-# CONFIG_MIPS_COBALT is not set
-CONFIG_MIPS_L1_CACHE_SHIFT=5
-# CONFIG_MIPS_MACHINE is not set
-# CONFIG_MIPS_MALTA is not set
-CONFIG_MIPS_MT_DISABLED=y
-# CONFIG_MIPS_MT_SMP is not set
-# CONFIG_MIPS_MT_SMTC is not set
-# CONFIG_MIPS_SIM is not set
-CONFIG_MODULE_FORCE_LOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=y
-CONFIG_MTD_BCM963XX=y
-CONFIG_MTD_CFI_ADV_OPTIONS=y
-CONFIG_MTD_CFI_BE_BYTE_SWAP=y
-# CONFIG_MTD_CFI_GEOMETRY is not set
-# CONFIG_MTD_CFI_NOSWAP is not set
-CONFIG_MTD_CFI_STAA=y
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-CONFIG_MTD_CONCAT=y
-CONFIG_MTD_JEDECPROBE=y
-CONFIG_MTD_REDBOOT_PARTS=y
-CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
-# CONFIG_MUTEX_SPIN_ON_OWNER is not set
-# CONFIG_NL80211_TESTMODE is not set
-# CONFIG_NO_IOPORT is not set
-# CONFIG_NXP_STB220 is not set
-# CONFIG_NXP_STB225 is not set
-CONFIG_PAGEFLAGS_EXTENDED=y
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PHYLIB=y
-# CONFIG_PMC_MSP is not set
-# CONFIG_PMC_YOSEMITE is not set
-# CONFIG_PNX8550_JBS is not set
-# CONFIG_PNX8550_STB810 is not set
-CONFIG_POSIX_MQUEUE=y
-CONFIG_POSIX_MQUEUE_SYSCTL=y
-# CONFIG_POWERTV is not set
-# CONFIG_R8187SE is not set
-# CONFIG_RAMZSWAP is not set
-CONFIG_RELAY=y
-CONFIG_SCHED_OMIT_FRAME_POINTER=y
-# CONFIG_SCSI_DMA is not set
-# CONFIG_SERIAL_8250 is not set
-CONFIG_SERIAL_BCM63XX=y
-CONFIG_SERIAL_BCM63XX_CONSOLE=y
-# CONFIG_SGI_IP22 is not set
-# CONFIG_SGI_IP27 is not set
-# CONFIG_SGI_IP28 is not set
-# CONFIG_SGI_IP32 is not set
-# CONFIG_SIBYTE_BIGSUR is not set
-# CONFIG_SIBYTE_CARMEL is not set
-# CONFIG_SIBYTE_CRHINE is not set
-# CONFIG_SIBYTE_CRHONE is not set
-# CONFIG_SIBYTE_LITTLESUR is not set
-# CONFIG_SIBYTE_RHONE is not set
-# CONFIG_SIBYTE_SENTOSA is not set
-# CONFIG_SIBYTE_SWARM is not set
-CONFIG_SQUASHFS_EMBEDDED=y
-CONFIG_SSB=y
-CONFIG_SSB_B43_PCI_BRIDGE=y
-# CONFIG_SSB_DRIVER_MIPS is not set
-CONFIG_SSB_DRIVER_PCICORE=y
-CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
-CONFIG_SSB_PCIHOST=y
-CONFIG_SSB_PCIHOST_POSSIBLE=y
-CONFIG_SSB_SPROM=y
-CONFIG_SWAP_IO_SPACE=y
-CONFIG_SYS_HAS_CPU_MIPS32_R1=y
-CONFIG_SYS_HAS_EARLY_PRINTK=y
-CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
-CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
-CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
-# CONFIG_TC35815 is not set
-# CONFIG_TINY_RCU is not set
-CONFIG_TRAD_SIGNALS=y
-# CONFIG_TREE_PREEMPT_RCU is not set
-CONFIG_TREE_RCU=y
-CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
-CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-CONFIG_USB_SUPPORT=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_WATCHDOG_NOWAYOUT=y
-CONFIG_WEXT_CORE=y
-CONFIG_WEXT_PROC=y
-CONFIG_ZONE_DMA_FLAG=0
+++ /dev/null
-The bcm63xx SOC has an integrated OHCI controller, this patch adds
-platform device registration and change board code to register ohci
-device when necessary.
-
-Signed-off-by: Maxime Bizon <mbizon@freebox.fr>
----
- arch/mips/bcm63xx/Kconfig | 6 ++
- arch/mips/bcm63xx/Makefile | 3 +-
- arch/mips/bcm63xx/boards/board_bcm963xx.c | 4 ++
- arch/mips/bcm63xx/dev-usb-ohci.c | 49 ++++++++++++++++++++
- .../asm/mach-bcm63xx/bcm63xx_dev_usb_ohci.h | 6 ++
- 5 files changed, 67 insertions(+), 1 deletions(-)
- create mode 100644 arch/mips/bcm63xx/dev-usb-ohci.c
- create mode 100644 arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_usb_ohci.h
-
---- a/arch/mips/bcm63xx/Kconfig
-+++ b/arch/mips/bcm63xx/Kconfig
-@@ -16,10 +16,16 @@ config BCM63XX_CPU_6345
- config BCM63XX_CPU_6348
- bool "support 6348 CPU"
- select HW_HAS_PCI
-+ select USB_ARCH_HAS_OHCI
-+ select USB_OHCI_BIG_ENDIAN_DESC
-+ select USB_OHCI_BIG_ENDIAN_MMIO
-
- config BCM63XX_CPU_6358
- bool "support 6358 CPU"
- select HW_HAS_PCI
-+ select USB_ARCH_HAS_OHCI
-+ select USB_OHCI_BIG_ENDIAN_DESC
-+ select USB_OHCI_BIG_ENDIAN_MMIO
- endmenu
-
- source "arch/mips/bcm63xx/boards/Kconfig"
---- a/arch/mips/bcm63xx/Makefile
-+++ b/arch/mips/bcm63xx/Makefile
-@@ -1,5 +1,6 @@
- obj-y += clk.o cpu.o cs.o gpio.o irq.o prom.o setup.o timer.o \
-- dev-dsp.o dev-enet.o dev-pcmcia.o dev-uart.o dev-wdt.o
-+ dev-dsp.o dev-enet.o dev-pcmcia.o dev-uart.o dev-wdt.o \
-+ dev-usb-ohci.o
- obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
-
- obj-y += boards/
---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
-+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -24,6 +24,7 @@
- #include <bcm63xx_dev_enet.h>
- #include <bcm63xx_dev_dsp.h>
- #include <bcm63xx_dev_pcmcia.h>
-+#include <bcm63xx_dev_usb_ohci.h>
- #include <board_bcm963xx.h>
-
- #define PFX "board_bcm963xx: "
-@@ -803,6 +804,9 @@ int __init board_register_devices(void)
- !board_get_mac_address(board.enet1.mac_addr))
- bcm63xx_enet_register(1, &board.enet1);
-
-+ if (board.has_ohci0)
-+ bcm63xx_ohci_register();
-+
- if (board.has_dsp)
- bcm63xx_dsp_register(&board.dsp);
-
---- /dev/null
-+++ b/arch/mips/bcm63xx/dev-usb-ohci.c
-@@ -0,0 +1,49 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2010 Maxime Bizon <mbizon@freebox.fr>
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/platform_device.h>
-+#include <bcm63xx_cpu.h>
-+#include <bcm63xx_dev_usb_ohci.h>
-+
-+static struct resource ohci_resources[] = {
-+ {
-+ /* start & end filled at runtime */
-+ .flags = IORESOURCE_MEM,
-+ },
-+ {
-+ /* start filled at runtime */
-+ .flags = IORESOURCE_IRQ,
-+ },
-+};
-+
-+static u64 ohci_dmamask = ~(u32)0;
-+
-+static struct platform_device bcm63xx_ohci_device = {
-+ .name = "bcm63xx_ohci",
-+ .id = 0,
-+ .num_resources = ARRAY_SIZE(ohci_resources),
-+ .resource = ohci_resources,
-+ .dev = {
-+ .dma_mask = &ohci_dmamask,
-+ .coherent_dma_mask = 0xffffffff,
-+ },
-+};
-+
-+int __init bcm63xx_ohci_register(void)
-+{
-+ if (!BCMCPU_IS_6348() && !BCMCPU_IS_6358())
-+ return 0;
-+
-+ ohci_resources[0].start = bcm63xx_regset_address(RSET_OHCI0);
-+ ohci_resources[0].end = ohci_resources[0].start;
-+ ohci_resources[0].end += RSET_OHCI_SIZE - 1;
-+ ohci_resources[1].start = bcm63xx_get_irq_number(IRQ_OHCI0);
-+ return platform_device_register(&bcm63xx_ohci_device);
-+}
---- /dev/null
-+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_usb_ohci.h
-@@ -0,0 +1,6 @@
-+#ifndef BCM63XX_DEV_USB_OHCI_H_
-+#define BCM63XX_DEV_USB_OHCI_H_
-+
-+int bcm63xx_ohci_register(void);
-+
-+#endif /* BCM63XX_DEV_USB_OHCI_H_ */
+++ /dev/null
-The bcm63xx SOC has an integrated EHCI controller, this patch adds
-platform device registration and change board code to register
-EHCI device when necessary.
-
-Signed-off-by: Maxime Bizon <mbizon@freebox.fr>
----
- arch/mips/bcm63xx/Kconfig | 2 +
- arch/mips/bcm63xx/Makefile | 2 +-
- arch/mips/bcm63xx/boards/board_bcm963xx.c | 4 ++
- arch/mips/bcm63xx/dev-usb-ehci.c | 49 ++++++++++++++++++++
- .../asm/mach-bcm63xx/bcm63xx_dev_usb_ehci.h | 6 ++
- 5 files changed, 62 insertions(+), 1 deletions(-)
- create mode 100644 arch/mips/bcm63xx/dev-usb-ehci.c
- create mode 100644 arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_usb_ehci.h
-
---- a/arch/mips/bcm63xx/Kconfig
-+++ b/arch/mips/bcm63xx/Kconfig
-@@ -26,6 +26,8 @@ config BCM63XX_CPU_6358
- select USB_ARCH_HAS_OHCI
- select USB_OHCI_BIG_ENDIAN_DESC
- select USB_OHCI_BIG_ENDIAN_MMIO
-+ select USB_ARCH_HAS_EHCI
-+ select USB_EHCI_BIG_ENDIAN_MMIO
- endmenu
-
- source "arch/mips/bcm63xx/boards/Kconfig"
---- a/arch/mips/bcm63xx/Makefile
-+++ b/arch/mips/bcm63xx/Makefile
-@@ -1,6 +1,6 @@
- obj-y += clk.o cpu.o cs.o gpio.o irq.o prom.o setup.o timer.o \
- dev-dsp.o dev-enet.o dev-pcmcia.o dev-uart.o dev-wdt.o \
-- dev-usb-ohci.o
-+ dev-usb-ohci.o dev-usb-ehci.o
- obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
-
- obj-y += boards/
---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
-+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -25,6 +25,7 @@
- #include <bcm63xx_dev_dsp.h>
- #include <bcm63xx_dev_pcmcia.h>
- #include <bcm63xx_dev_usb_ohci.h>
-+#include <bcm63xx_dev_usb_ehci.h>
- #include <board_bcm963xx.h>
-
- #define PFX "board_bcm963xx: "
-@@ -804,6 +805,9 @@ int __init board_register_devices(void)
- !board_get_mac_address(board.enet1.mac_addr))
- bcm63xx_enet_register(1, &board.enet1);
-
-+ if (board.has_ehci0)
-+ bcm63xx_ehci_register();
-+
- if (board.has_ohci0)
- bcm63xx_ohci_register();
-
---- /dev/null
-+++ b/arch/mips/bcm63xx/dev-usb-ehci.c
-@@ -0,0 +1,49 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2010 Maxime Bizon <mbizon@freebox.fr>
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/platform_device.h>
-+#include <bcm63xx_cpu.h>
-+#include <bcm63xx_dev_usb_ehci.h>
-+
-+static struct resource ehci_resources[] = {
-+ {
-+ /* start & end filled at runtime */
-+ .flags = IORESOURCE_MEM,
-+ },
-+ {
-+ /* start filled at runtime */
-+ .flags = IORESOURCE_IRQ,
-+ },
-+};
-+
-+static u64 ehci_dmamask = ~(u32)0;
-+
-+static struct platform_device bcm63xx_ehci_device = {
-+ .name = "bcm63xx_ehci",
-+ .id = 0,
-+ .num_resources = ARRAY_SIZE(ehci_resources),
-+ .resource = ehci_resources,
-+ .dev = {
-+ .dma_mask = &ehci_dmamask,
-+ .coherent_dma_mask = 0xffffffff,
-+ },
-+};
-+
-+int __init bcm63xx_ehci_register(void)
-+{
-+ if (!BCMCPU_IS_6358())
-+ return 0;
-+
-+ ehci_resources[0].start = bcm63xx_regset_address(RSET_EHCI0);
-+ ehci_resources[0].end = ehci_resources[0].start;
-+ ehci_resources[0].end += RSET_EHCI_SIZE - 1;
-+ ehci_resources[1].start = bcm63xx_get_irq_number(IRQ_EHCI0);
-+ return platform_device_register(&bcm63xx_ehci_device);
-+}
---- /dev/null
-+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_usb_ehci.h
-@@ -0,0 +1,6 @@
-+#ifndef BCM63XX_DEV_USB_EHCI_H_
-+#define BCM63XX_DEV_USB_EHCI_H_
-+
-+int bcm63xx_ehci_register(void);
-+
-+#endif /* BCM63XX_DEV_USB_EHCI_H_ */
+++ /dev/null
-bcm63xx_gpio_init is already called from prom_init to allow board to
-use them early, so we can remove the unneeded arch_initcall.
-
-Signed-off-by: Maxime Bizon <mbizon@freebox.fr>
----
- arch/mips/bcm63xx/gpio.c | 2 --
- 1 files changed, 0 insertions(+), 2 deletions(-)
-
---- a/arch/mips/bcm63xx/gpio.c
-+++ b/arch/mips/bcm63xx/gpio.c
-@@ -130,5 +130,3 @@ int __init bcm63xx_gpio_init(void)
-
- return gpiochip_add(&bcm63xx_gpio_chip);
- }
--
--arch_initcall(bcm63xx_gpio_init);
+++ /dev/null
-Signed-off-by: Maxime Bizon <mbizon@freebox.fr>
----
- drivers/usb/host/ohci-bcm63xx.c | 166 +++++++++++++++++++++++++++++++++++++++
- drivers/usb/host/ohci-hcd.c | 5 +
- drivers/usb/host/ohci.h | 2 +-
- 3 files changed, 172 insertions(+), 1 deletions(-)
- create mode 100644 drivers/usb/host/ohci-bcm63xx.c
-
---- /dev/null
-+++ b/drivers/usb/host/ohci-bcm63xx.c
-@@ -0,0 +1,166 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2010 Maxime Bizon <mbizon@freebox.fr>
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/clk.h>
-+#include <linux/platform_device.h>
-+#include <bcm63xx_cpu.h>
-+#include <bcm63xx_regs.h>
-+#include <bcm63xx_io.h>
-+
-+static struct clk *usb_host_clock;
-+
-+static int __devinit ohci_bcm63xx_start(struct usb_hcd *hcd)
-+{
-+ struct ohci_hcd *ohci = hcd_to_ohci(hcd);
-+ int ret;
-+
-+ /*
-+ * port 2 can be shared with USB slave, but all boards seem to
-+ * have only one host port populated, so we can hardcode it
-+ */
-+ ohci->num_ports = 1;
-+
-+ ret = ohci_init(ohci);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = ohci_run(ohci);
-+ if (ret < 0) {
-+ err("can't start %s", hcd->self.bus_name);
-+ ohci_stop(hcd);
-+ return ret;
-+ }
-+ return 0;
-+}
-+
-+static const struct hc_driver ohci_bcm63xx_hc_driver = {
-+ .description = hcd_name,
-+ .product_desc = "BCM63XX integrated OHCI controller",
-+ .hcd_priv_size = sizeof(struct ohci_hcd),
-+
-+ .irq = ohci_irq,
-+ .flags = HCD_USB11 | HCD_MEMORY,
-+ .start = ohci_bcm63xx_start,
-+ .stop = ohci_stop,
-+ .shutdown = ohci_shutdown,
-+ .urb_enqueue = ohci_urb_enqueue,
-+ .urb_dequeue = ohci_urb_dequeue,
-+ .endpoint_disable = ohci_endpoint_disable,
-+ .get_frame_number = ohci_get_frame,
-+ .hub_status_data = ohci_hub_status_data,
-+ .hub_control = ohci_hub_control,
-+ .start_port_reset = ohci_start_port_reset,
-+};
-+
-+static int __devinit ohci_hcd_bcm63xx_drv_probe(struct platform_device *pdev)
-+{
-+ struct resource *res_mem;
-+ struct usb_hcd *hcd;
-+ struct ohci_hcd *ohci;
-+ u32 reg;
-+ int ret, irq;
-+
-+ res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ irq = platform_get_irq(pdev, 0);
-+ if (!res_mem || irq < 0)
-+ return -ENODEV;
-+
-+ if (BCMCPU_IS_6348()) {
-+ struct clk *clk;
-+ /* enable USB host clock */
-+ clk = clk_get(&pdev->dev, "usbh");
-+ if (IS_ERR(clk))
-+ return -ENODEV;
-+
-+ clk_enable(clk);
-+ usb_host_clock = clk;
-+ bcm_rset_writel(RSET_OHCI_PRIV, 0, OHCI_PRIV_REG);
-+
-+ } else if (BCMCPU_IS_6358()) {
-+ reg = bcm_rset_readl(RSET_USBH_PRIV, USBH_PRIV_SWAP_REG);
-+ reg &= ~USBH_PRIV_SWAP_OHCI_ENDN_MASK;
-+ reg |= USBH_PRIV_SWAP_OHCI_DATA_MASK;
-+ bcm_rset_writel(RSET_USBH_PRIV, reg, USBH_PRIV_SWAP_REG);
-+ /*
-+ * The magic value comes for the original vendor BSP
-+ * and is needed for USB to work. Datasheet does not
-+ * help, so the magic value is used as-is.
-+ */
-+ bcm_rset_writel(RSET_USBH_PRIV, 0x1c0020, USBH_PRIV_TEST_REG);
-+ } else
-+ return 0;
-+
-+ hcd = usb_create_hcd(&ohci_bcm63xx_hc_driver, &pdev->dev, "bcm63xx");
-+ if (!hcd)
-+ return -ENOMEM;
-+ hcd->rsrc_start = res_mem->start;
-+ hcd->rsrc_len = res_mem->end - res_mem->start + 1;
-+
-+ if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
-+ pr_debug("request_mem_region failed\n");
-+ ret = -EBUSY;
-+ goto out;
-+ }
-+
-+ hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
-+ if (!hcd->regs) {
-+ pr_debug("ioremap failed\n");
-+ ret = -EIO;
-+ goto out1;
-+ }
-+
-+ ohci = hcd_to_ohci(hcd);
-+ ohci->flags |= OHCI_QUIRK_BE_MMIO | OHCI_QUIRK_BE_DESC |
-+ OHCI_QUIRK_FRAME_NO;
-+ ohci_hcd_init(ohci);
-+
-+ ret = usb_add_hcd(hcd, irq, IRQF_DISABLED);
-+ if (ret)
-+ goto out2;
-+
-+ platform_set_drvdata(pdev, hcd);
-+ return 0;
-+
-+out2:
-+ iounmap(hcd->regs);
-+out1:
-+ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
-+out:
-+ usb_put_hcd(hcd);
-+ return ret;
-+}
-+
-+static int __devexit ohci_hcd_bcm63xx_drv_remove(struct platform_device *pdev)
-+{
-+ struct usb_hcd *hcd;
-+
-+ hcd = platform_get_drvdata(pdev);
-+ usb_remove_hcd(hcd);
-+ iounmap(hcd->regs);
-+ usb_put_hcd(hcd);
-+ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
-+ if (usb_host_clock) {
-+ clk_disable(usb_host_clock);
-+ clk_put(usb_host_clock);
-+ }
-+ platform_set_drvdata(pdev, NULL);
-+ return 0;
-+}
-+
-+static struct platform_driver ohci_hcd_bcm63xx_driver = {
-+ .probe = ohci_hcd_bcm63xx_drv_probe,
-+ .remove = __devexit_p(ohci_hcd_bcm63xx_drv_remove),
-+ .shutdown = usb_hcd_platform_shutdown,
-+ .driver = {
-+ .name = "bcm63xx_ohci",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+MODULE_ALIAS("platform:bcm63xx_ohci");
---- a/drivers/usb/host/ohci-hcd.c
-+++ b/drivers/usb/host/ohci-hcd.c
-@@ -1051,6 +1051,11 @@ MODULE_LICENSE ("GPL");
- #define PLATFORM_DRIVER usb_hcd_pnx4008_driver
- #endif
-
-+#ifdef CONFIG_BCM63XX
-+#include "ohci-bcm63xx.c"
-+#define PLATFORM_DRIVER ohci_hcd_bcm63xx_driver
-+#endif
-+
- #if defined(CONFIG_CPU_SUBTYPE_SH7720) || \
- defined(CONFIG_CPU_SUBTYPE_SH7721) || \
- defined(CONFIG_CPU_SUBTYPE_SH7763) || \
---- a/drivers/usb/host/ohci.h
-+++ b/drivers/usb/host/ohci.h
-@@ -655,7 +655,7 @@ static inline u32 hc32_to_cpup (const st
- * some big-endian SOC implementations. Same thing happens with PSW access.
- */
-
--#ifdef CONFIG_PPC_MPC52xx
-+#if defined(CONFIG_PPC_MPC52xx) || defined(CONFIG_BCM63XX)
- #define big_endian_frame_no_quirk(ohci) (ohci->flags & OHCI_QUIRK_FRAME_NO)
- #else
- #define big_endian_frame_no_quirk(ohci) 0
+++ /dev/null
-Signed-off-by: Maxime Bizon <mbizon@freebox.fr>
----
- drivers/usb/host/ehci-bcm63xx.c | 154 +++++++++++++++++++++++++++++++++++++++
- drivers/usb/host/ehci-hcd.c | 5 +
- 2 files changed, 159 insertions(+), 0 deletions(-)
- create mode 100644 drivers/usb/host/ehci-bcm63xx.c
-
---- /dev/null
-+++ b/drivers/usb/host/ehci-bcm63xx.c
-@@ -0,0 +1,154 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+#include <bcm63xx_cpu.h>
-+#include <bcm63xx_regs.h>
-+#include <bcm63xx_io.h>
-+
-+static int ehci_bcm63xx_setup(struct usb_hcd *hcd)
-+{
-+ struct ehci_hcd *ehci = hcd_to_ehci(hcd);
-+ int retval;
-+
-+ retval = ehci_halt(ehci);
-+ if (retval)
-+ return retval;
-+
-+ retval = ehci_init(hcd);
-+ if (retval)
-+ return retval;
-+
-+ ehci_reset(ehci);
-+ ehci_port_power(ehci, 0);
-+
-+ return retval;
-+}
-+
-+
-+static const struct hc_driver ehci_bcm63xx_hc_driver = {
-+ .description = hcd_name,
-+ .product_desc = "BCM63XX integrated EHCI controller",
-+ .hcd_priv_size = sizeof(struct ehci_hcd),
-+
-+ .irq = ehci_irq,
-+ .flags = HCD_MEMORY | HCD_USB2,
-+
-+ .reset = ehci_bcm63xx_setup,
-+ .start = ehci_run,
-+ .stop = ehci_stop,
-+ .shutdown = ehci_shutdown,
-+
-+ .urb_enqueue = ehci_urb_enqueue,
-+ .urb_dequeue = ehci_urb_dequeue,
-+ .endpoint_disable = ehci_endpoint_disable,
-+
-+ .get_frame_number = ehci_get_frame,
-+
-+ .hub_status_data = ehci_hub_status_data,
-+ .hub_control = ehci_hub_control,
-+ .bus_suspend = ehci_bus_suspend,
-+ .bus_resume = ehci_bus_resume,
-+ .relinquish_port = ehci_relinquish_port,
-+ .port_handed_over = ehci_port_handed_over,
-+};
-+
-+static int __devinit ehci_hcd_bcm63xx_drv_probe(struct platform_device *pdev)
-+{
-+ struct resource *res_mem;
-+ struct usb_hcd *hcd;
-+ struct ehci_hcd *ehci;
-+ u32 reg;
-+ int ret, irq;
-+
-+ res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ irq = platform_get_irq(pdev, 0);;
-+ if (!res_mem || irq < 0)
-+ return -ENODEV;
-+
-+ reg = bcm_rset_readl(RSET_USBH_PRIV, USBH_PRIV_SWAP_REG);
-+ reg &= ~USBH_PRIV_SWAP_EHCI_DATA_MASK;
-+ reg |= USBH_PRIV_SWAP_EHCI_ENDN_MASK;
-+ bcm_rset_writel(RSET_USBH_PRIV, reg, USBH_PRIV_SWAP_REG);
-+
-+ /*
-+ * The magic value comes for the original vendor BSP and is
-+ * needed for USB to work. Datasheet does not help, so the
-+ * magic value is used as-is.
-+ */
-+ bcm_rset_writel(RSET_USBH_PRIV, 0x1c0020, USBH_PRIV_TEST_REG);
-+
-+ hcd = usb_create_hcd(&ehci_bcm63xx_hc_driver, &pdev->dev, "bcm63xx");
-+ if (!hcd)
-+ return -ENOMEM;
-+ hcd->rsrc_start = res_mem->start;
-+ hcd->rsrc_len = res_mem->end - res_mem->start + 1;
-+
-+ if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
-+ pr_debug("request_mem_region failed\n");
-+ ret = -EBUSY;
-+ goto out;
-+ }
-+
-+ hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
-+ if (!hcd->regs) {
-+ pr_debug("ioremap failed\n");
-+ ret = -EIO;
-+ goto out1;
-+ }
-+
-+ ehci = hcd_to_ehci(hcd);
-+ ehci->big_endian_mmio = 1;
-+ ehci->big_endian_desc = 0;
-+ ehci->caps = hcd->regs;
-+ ehci->regs = hcd->regs +
-+ HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase));
-+ ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params);
-+ ehci->sbrn = 0x20;
-+
-+ ret = usb_add_hcd(hcd, irq, IRQF_DISABLED);
-+ if (ret)
-+ goto out2;
-+
-+ platform_set_drvdata(pdev, hcd);
-+ return 0;
-+
-+out2:
-+ iounmap(hcd->regs);
-+out1:
-+ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
-+out:
-+ usb_put_hcd(hcd);
-+ return ret;
-+}
-+
-+static int __devexit ehci_hcd_bcm63xx_drv_remove(struct platform_device *pdev)
-+{
-+ struct usb_hcd *hcd;
-+
-+ hcd = platform_get_drvdata(pdev);
-+ usb_remove_hcd(hcd);
-+ iounmap(hcd->regs);
-+ usb_put_hcd(hcd);
-+ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
-+ platform_set_drvdata(pdev, NULL);
-+ return 0;
-+}
-+
-+static struct platform_driver ehci_hcd_bcm63xx_driver = {
-+ .probe = ehci_hcd_bcm63xx_drv_probe,
-+ .remove = __devexit_p(ehci_hcd_bcm63xx_drv_remove),
-+ .shutdown = usb_hcd_platform_shutdown,
-+ .driver = {
-+ .name = "bcm63xx_ehci",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+MODULE_ALIAS("platform:bcm63xx_ehci");
---- a/drivers/usb/host/ehci-hcd.c
-+++ b/drivers/usb/host/ehci-hcd.c
-@@ -1158,6 +1158,11 @@ MODULE_LICENSE ("GPL");
- #define PLATFORM_DRIVER ehci_atmel_driver
- #endif
-
-+#ifdef CONFIG_BCM63XX
-+#include "ehci-bcm63xx.c"
-+#define PLATFORM_DRIVER ehci_hcd_bcm63xx_driver
-+#endif
-+
- #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \
- !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER)
- #error "missing bus glue for ehci-hcd"
+++ /dev/null
-MIPS currently lacks the readl_be and writel_be accessors
-which are required by BCM63xx for OHCI and EHCI support.
-Let's define them globally for MIPS. This also fixes the
-compilation of the bcm63xx defconfig against USB.
-
-Signed-off-by: Florian Fainelli <ffainelli@freebox.fr>
----
---- a/arch/mips/include/asm/io.h
-+++ b/arch/mips/include/asm/io.h
-@@ -447,6 +447,9 @@ __BUILDIO(q, u64)
- #define readl_relaxed readl
- #define readq_relaxed readq
-
-+#define readl_be(addr) be32_to_cpu(__raw_readl((__force unsigned *)(addr)))
-+#define writel_be(val, addr) __raw_writel(cpu_to_be32((val)), (__force unsigned *)(addr))
-+
- /*
- * Some code tests for these symbols
- */
+++ /dev/null
---- a/drivers/watchdog/Makefile
-+++ b/drivers/watchdog/Makefile
-@@ -112,6 +112,7 @@ obj-$(CONFIG_PNX833X_WDT) += pnx833x_wdt
- obj-$(CONFIG_SIBYTE_WDOG) += sb_wdog.o
- obj-$(CONFIG_AR7_WDT) += ar7_wdt.o
- obj-$(CONFIG_TXX9_WDT) += txx9wdt.o
-+obj-$(CONFIG_BCM63XX_WDT) += bcm63xx_wdt.o
-
- # PARISC Architecture
-
---- a/drivers/watchdog/Kconfig
-+++ b/drivers/watchdog/Kconfig
-@@ -840,6 +840,16 @@ config TXX9_WDT
- help
- Hardware driver for the built-in watchdog timer on TXx9 MIPS SoCs.
-
-+config BCM63XX_WDT
-+ tristate "Broadcom BCM63xx hardware watchdog"
-+ depends on BCM63XX
-+ help
-+ Watchdog driver for the built in watchdog hardware in Broadcom
-+ BCM63xx SoC.
-+
-+ To compile thi driver as a loadable module, choose M here.
-+ The module will be called bcm63xx_wdt.
-+
- # PARISC Architecture
-
- # POWERPC Architecture
---- /dev/null
-+++ b/drivers/watchdog/bcm63xx_wdt.c
-@@ -0,0 +1,334 @@
-+/*
-+ * Broadcom BCM63xx SoC watchdog driver
-+ *
-+ * Copyright (C) 2007, Miguel Gaio <miguel.gaio@efixo.com>
-+ * Copyright (C) 2008, Florian Fainelli <florian@openwrt.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.
-+ */
-+
-+#include <linux/bitops.h>
-+#include <linux/errno.h>
-+#include <linux/fs.h>
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/miscdevice.h>
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/reboot.h>
-+#include <linux/types.h>
-+#include <linux/uaccess.h>
-+#include <linux/watchdog.h>
-+#include <linux/timer.h>
-+#include <linux/jiffies.h>
-+#include <linux/resource.h>
-+#include <linux/platform_device.h>
-+
-+#include <bcm63xx_cpu.h>
-+#include <bcm63xx_io.h>
-+#include <bcm63xx_regs.h>
-+
-+#define PFX KBUILD_MODNAME
-+
-+#define WDT_HZ 50000000 /* Fclk */
-+#define WDT_DEFAULT_TIME 30 /* seconds */
-+#define WDT_MAX_TIME 256 /* seconds */
-+
-+static struct {
-+ void __iomem *regs;
-+ struct timer_list timer;
-+ int default_ticks;
-+ unsigned long inuse;
-+ atomic_t ticks;
-+} bcm63xx_wdt_device;
-+
-+static int expect_close;
-+static int timeout;
-+
-+static int wdt_time = WDT_DEFAULT_TIME;
-+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) ")");
-+
-+/* HW functions */
-+static void bcm63xx_wdt_hw_start(void)
-+{
-+ bcm_writel(0xfffffffe, bcm63xx_wdt_device.regs + WDT_DEFVAL_REG);
-+ bcm_writel(WDT_START_1, bcm63xx_wdt_device.regs + WDT_CTL_REG);
-+ bcm_writel(WDT_START_2, bcm63xx_wdt_device.regs + WDT_CTL_REG);
-+}
-+
-+static void bcm63xx_wdt_hw_stop(void)
-+{
-+ bcm_writel(WDT_STOP_1, bcm63xx_wdt_device.regs + WDT_CTL_REG);
-+ bcm_writel(WDT_STOP_2, bcm63xx_wdt_device.regs + WDT_CTL_REG);
-+}
-+
-+static void bcm63xx_timer_tick(unsigned long unused)
-+{
-+ if (!atomic_dec_and_test(&bcm63xx_wdt_device.ticks)) {
-+ bcm63xx_wdt_hw_start();
-+ mod_timer(&bcm63xx_wdt_device.timer, jiffies + HZ);
-+ } else
-+ printk(KERN_CRIT PFX ": watchdog will restart system\n");
-+}
-+
-+static void bcm63xx_wdt_pet(void)
-+{
-+ atomic_set(&bcm63xx_wdt_device.ticks, wdt_time);
-+}
-+
-+static void bcm63xx_wdt_start(void)
-+{
-+ bcm63xx_wdt_pet();
-+ bcm63xx_timer_tick(0);
-+}
-+
-+static void bcm63xx_wdt_pause(void)
-+{
-+ del_timer_sync(&bcm63xx_wdt_device.timer);
-+ bcm63xx_wdt_hw_stop();
-+}
-+
-+static int bcm63xx_wdt_settimeout(int new_time)
-+{
-+ if ((new_time <= 0) || (new_time > WDT_MAX_TIME))
-+ return -EINVAL;
-+
-+ wdt_time = new_time;
-+
-+ return 0;
-+}
-+
-+static int bcm63xx_wdt_open(struct inode *inode, struct file *file)
-+{
-+ if (test_and_set_bit(0, &bcm63xx_wdt_device.inuse))
-+ return -EBUSY;
-+
-+ bcm63xx_wdt_start();
-+ return nonseekable_open(inode, file);
-+}
-+
-+static int bcm63xx_wdt_release(struct inode *inode, struct file *file)
-+{
-+ if (expect_close == 42)
-+ bcm63xx_wdt_pause();
-+ else {
-+ printk(KERN_CRIT PFX
-+ ": Unexpected close, not stopping watchdog!\n");
-+ bcm63xx_wdt_start();
-+ }
-+ clear_bit(0, &bcm63xx_wdt_device.inuse);
-+ expect_close = 0;
-+ return 0;
-+}
-+
-+static ssize_t bcm63xx_wdt_write(struct file *file, const char *data,
-+ size_t len, loff_t *ppos)
-+{
-+ if (len) {
-+ if (!nowayout) {
-+ size_t i;
-+
-+ /* In case it was set long ago */
-+ expect_close = 0;
-+
-+ for (i = 0; i != len; i++) {
-+ char c;
-+ if (get_user(c, data + i))
-+ return -EFAULT;
-+ if (c == 'V')
-+ expect_close = 42;
-+ }
-+ }
-+ bcm63xx_wdt_pet();
-+ }
-+ return len;
-+}
-+
-+static struct watchdog_info bcm63xx_wdt_info = {
-+ .identity = PFX,
-+ .options = WDIOF_SETTIMEOUT |
-+ WDIOF_KEEPALIVEPING |
-+ WDIOF_MAGICCLOSE,
-+};
-+
-+
-+static long bcm63xx_wdt_ioctl(struct file *file, unsigned int cmd,
-+ unsigned long arg)
-+{
-+ void __user *argp = (void __user *)arg;
-+ int __user *p = argp;
-+ int new_value, retval = -EINVAL;
-+
-+ switch (cmd) {
-+ case WDIOC_GETSUPPORT:
-+ return copy_to_user(argp, &bcm63xx_wdt_info,
-+ sizeof(bcm63xx_wdt_info)) ? -EFAULT : 0;
-+
-+ case WDIOC_GETSTATUS:
-+ case WDIOC_GETBOOTSTATUS:
-+ return put_user(0, p);
-+
-+ case WDIOC_SETOPTIONS:
-+ if (get_user(new_value, p))
-+ return -EFAULT;
-+
-+ if (new_value & WDIOS_DISABLECARD) {
-+ bcm63xx_wdt_pause();
-+ retval = 0;
-+ }
-+ if (new_value & WDIOS_ENABLECARD) {
-+ bcm63xx_wdt_start();
-+ retval = 0;
-+ }
-+
-+ return retval;
-+
-+ case WDIOC_KEEPALIVE:
-+ bcm63xx_wdt_pet();
-+ return 0;
-+
-+ case WDIOC_SETTIMEOUT:
-+ if (get_user(new_value, p))
-+ return -EFAULT;
-+
-+ if (bcm63xx_wdt_settimeout(new_value))
-+ return -EINVAL;
-+
-+ bcm63xx_wdt_pet();
-+
-+ case WDIOC_GETTIMEOUT:
-+ return put_user(wdt_time, p);
-+
-+ default:
-+ return -ENOTTY;
-+
-+ }
-+}
-+
-+static int bcm63xx_wdt_notify_sys(struct notifier_block *this,
-+ unsigned long code, void *unused)
-+{
-+ if (code == SYS_DOWN || code == SYS_HALT)
-+ bcm63xx_wdt_pause();
-+ return NOTIFY_DONE;
-+}
-+
-+static const struct file_operations bcm63xx_wdt_fops = {
-+ .owner = THIS_MODULE,
-+ .llseek = no_llseek,
-+ .write = bcm63xx_wdt_write,
-+ .unlocked_ioctl = bcm63xx_wdt_ioctl,
-+ .open = bcm63xx_wdt_open,
-+ .release = bcm63xx_wdt_release,
-+};
-+
-+static struct miscdevice bcm63xx_wdt_miscdev = {
-+ .minor = WATCHDOG_MINOR,
-+ .name = "watchdog",
-+ .fops = &bcm63xx_wdt_fops,
-+};
-+
-+static struct notifier_block bcm63xx_wdt_notifier = {
-+ .notifier_call = bcm63xx_wdt_notify_sys,
-+};
-+
-+
-+static int bcm63xx_wdt_probe(struct platform_device *pdev)
-+{
-+ int ret;
-+ struct resource *r;
-+
-+ setup_timer(&bcm63xx_wdt_device.timer, bcm63xx_timer_tick, 0L);
-+
-+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ if (!r) {
-+ printk(KERN_ERR PFX
-+ "failed to retrieve resources\n");
-+ return -ENODEV;
-+ }
-+
-+ bcm63xx_wdt_device.regs = ioremap_nocache(r->start, r->end - r->start);
-+ if (!bcm63xx_wdt_device.regs) {
-+ printk(KERN_ERR PFX
-+ "failed to remap I/O resources\n");
-+ return -ENXIO;
-+ }
-+
-+ if (bcm63xx_wdt_settimeout(wdt_time)) {
-+ bcm63xx_wdt_settimeout(WDT_DEFAULT_TIME);
-+ printk(KERN_INFO PFX
-+ ": wdt_time value must be 1 <= wdt_time <= 256, using %d\n",
-+ wdt_time);
-+ }
-+
-+ ret = register_reboot_notifier(&bcm63xx_wdt_notifier);
-+ if (ret) {
-+ printk(KERN_ERR PFX
-+ "failed to register reboot_notifier\n");
-+ return ret;
-+ }
-+
-+ ret = misc_register(&bcm63xx_wdt_miscdev);
-+ if (ret < 0) {
-+ printk(KERN_ERR PFX
-+ "failed to register watchdog device\n");
-+ goto unmap;
-+ }
-+
-+ printk(KERN_INFO PFX " started, timer margin: %d sec\n", WDT_DEFAULT_TIME);
-+
-+ return 0;
-+
-+unmap:
-+ unregister_reboot_notifier(&bcm63xx_wdt_notifier);
-+ iounmap(bcm63xx_wdt_device.regs);
-+ return ret;
-+}
-+
-+static int bcm63xx_wdt_remove(struct platform_device *pdev)
-+{
-+ if (!nowayout)
-+ bcm63xx_wdt_pause();
-+
-+ misc_deregister(&bcm63xx_wdt_miscdev);
-+
-+ iounmap(bcm63xx_wdt_device.regs);
-+
-+ unregister_reboot_notifier(&bcm63xx_wdt_notifier);
-+
-+ return 0;
-+}
-+
-+static struct platform_driver bcm63xx_wdt = {
-+ .probe = bcm63xx_wdt_probe,
-+ .remove = bcm63xx_wdt_remove,
-+ .driver = {
-+ .name = "bcm63xx-wdt",
-+ }
-+};
-+
-+static int __init bcm63xx_wdt_init(void)
-+{
-+ return platform_driver_register(&bcm63xx_wdt);
-+}
-+
-+static void __exit bcm63xx_wdt_exit(void)
-+{
-+ platform_driver_unregister(&bcm63xx_wdt);
-+}
-+
-+module_init(bcm63xx_wdt_init);
-+module_exit(bcm63xx_wdt_exit);
-+
-+MODULE_AUTHOR("Miguel Gaio <miguel.gaio@efixo.com>");
-+MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>");
-+MODULE_DESCRIPTION("Driver for the Broadcom BCM63xx SoC watchdog");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
-+MODULE_ALIAS("platform:bcm63xx-wdt");
+++ /dev/null
-From e734ace5baa04e0e8af1d4483475fbd6bd2b32a1 Mon Sep 17 00:00:00 2001
-From: Axel Gembe <ago@bastart.eu.org>
-Date: Mon, 12 May 2008 18:54:09 +0200
-Subject: [PATCH] bcm963xx: flashmap support
-
-
-Signed-off-by: Axel Gembe <ago@bastart.eu.org>
----
- drivers/mtd/maps/Kconfig | 7 +++++++
- drivers/mtd/maps/Makefile | 1 +
- drivers/mtd/redboot.c | 13 ++++++++++---
- 3 files changed, 18 insertions(+), 3 deletions(-)
-
---- a/drivers/mtd/maps/Kconfig
-+++ b/drivers/mtd/maps/Kconfig
-@@ -257,6 +257,13 @@ config MTD_ALCHEMY
- help
- Flash memory access on AMD Alchemy Pb/Db/RDK Reference Boards
-
-+config MTD_BCM963XX
-+ tristate "BCM963xx Flash device"
-+ depends on MIPS && BCM63XX
-+ help
-+ Flash memory access on BCM963xx boards. Currently only works with
-+ RedBoot and CFE.
-+
- config MTD_DILNETPC
- tristate "CFI Flash device mapped on DIL/Net PC"
- depends on X86 && MTD_CONCAT && MTD_PARTITIONS && MTD_CFI_INTELEXT && BROKEN
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -39,7 +39,7 @@ static inline int redboot_checksum(struc
- return 1;
- }
-
--static int parse_redboot_partitions(struct mtd_info *master,
-+int parse_redboot_partitions(struct mtd_info *master,
- struct mtd_partition **pparts,
- unsigned long fis_origin)
- {
-@@ -162,6 +162,14 @@ static int parse_redboot_partitions(stru
- goto out;
- }
-
-+ if (!fis_origin) {
-+ for (i = 0; i < numslots; i++) {
-+ if (!strncmp(buf[i].name, "RedBoot", 8)) {
-+ fis_origin = (buf[i].flash_base & (master->size << 1) - 1);
-+ }
-+ }
-+ }
-+
- for (i = 0; i < numslots; i++) {
- struct fis_list *new_fl, **prev;
-
-@@ -184,9 +192,8 @@ static int parse_redboot_partitions(stru
- new_fl->img = &buf[i];
- if (fis_origin) {
- buf[i].flash_base -= fis_origin;
-- } else {
-- buf[i].flash_base &= master->size-1;
- }
-+ buf[i].flash_base &= (master->size << 1) - 1;
-
- /* I'm sure the JFFS2 code has done me permanent damage.
- * I now think the following is _normal_
---- a/drivers/mtd/maps/Makefile
-+++ b/drivers/mtd/maps/Makefile
-@@ -61,3 +61,4 @@ obj-$(CONFIG_MTD_BFIN_ASYNC) += bfin-asy
- obj-$(CONFIG_MTD_RBTX4939) += rbtx4939-flash.o
- obj-$(CONFIG_MTD_VMU) += vmu-flash.o
- obj-$(CONFIG_MTD_GPIO_ADDR) += gpio-addr-flash.o
-+obj-$(CONFIG_MTD_BCM963XX) += bcm963xx-flash.o
---- /dev/null
-+++ b/drivers/mtd/maps/bcm963xx-flash.c
-@@ -0,0 +1,399 @@
-+/*
-+ * Copyright (C) 2006-2008 Florian Fainelli <florian@openwrt.org>
-+ * Mike Albon <malbon@openwrt.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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/mtd/map.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
-+#include <linux/vmalloc.h>
-+#include <linux/platform_device.h>
-+
-+#include <bcm_tag.h>
-+#include <asm/io.h>
-+
-+#define BUSWIDTH 2 /* Buswidth */
-+#define EXTENDED_SIZE 0xBFC00000 /* Extended flash address */
-+
-+#define PFX KBUILD_MODNAME ": "
-+
-+extern int parse_redboot_partitions(struct mtd_info *master, struct mtd_partition **pparts, unsigned long fis_origin);
-+static struct mtd_partition *parsed_parts;
-+
-+static struct mtd_info *bcm963xx_mtd_info;
-+
-+static struct map_info bcm963xx_map = {
-+ .name = "bcm963xx",
-+ .bankwidth = BUSWIDTH,
-+};
-+
-+static struct tagiddesc_t tagidtab[NUM_TAGID] = TAGID_DEFINITIONS;
-+
-+static uint32_t tagcrc32tab[256] = {
-+ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
-+ 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
-+ 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
-+ 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
-+ 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
-+ 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
-+ 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
-+ 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
-+ 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
-+ 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
-+ 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
-+ 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
-+ 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
-+ 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
-+ 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
-+ 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
-+ 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
-+ 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
-+ 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
-+ 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
-+ 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
-+ 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
-+ 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
-+ 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
-+ 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
-+ 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
-+ 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
-+ 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
-+ 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
-+ 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
-+ 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
-+ 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
-+};
-+
-+static uint32_t tagcrc32(uint32_t crc, uint8_t *data, size_t len)
-+{
-+ while (len--)
-+ crc = (crc >> 8) ^ tagcrc32tab[(crc ^ *data++) & 0xFF];
-+
-+ return crc;
-+}
-+
-+static int parse_cfe_partitions( struct mtd_info *master, struct mtd_partition **pparts)
-+{
-+ int nrparts = 3, curpart = 0; /* CFE,NVRAM and global LINUX are always present. */
-+ union bcm_tag *buf;
-+ struct mtd_partition *parts;
-+ int ret;
-+ size_t retlen;
-+ unsigned int rootfsaddr, kerneladdr, spareaddr;
-+ unsigned int rootfslen, kernellen, sparelen, totallen;
-+ unsigned char *tagid;
-+ int namelen = 0;
-+ int i;
-+ uint32_t tagidcrc;
-+ uint32_t calctagidcrc;
-+ bool tagid_match = false;
-+ char *boardid;
-+ char *tagversion;
-+ char *matchtagid;
-+
-+ /* Allocate memory for buffer */
-+ buf = vmalloc(sizeof(union bcm_tag));
-+ if (!buf)
-+ return -ENOMEM;
-+
-+ /* Get the tag */
-+ ret = master->read(master,master->erasesize,sizeof(union bcm_tag), &retlen, (void *)buf);
-+ if (retlen != sizeof(union bcm_tag)){
-+ vfree(buf);
-+ return -EIO;
-+ }
-+
-+ /* tagId isn't in the same location, so we check each tagid against the
-+ * tagid CRC. If the CRC is valid we have found the right tag and so
-+ * use that tag
-+ */
-+
-+ for (i = 0; i < NUM_TAGID; i++) {
-+ switch(i) {
-+ case 0:
-+ matchtagid = "bccfe";
-+ tagid = &(buf->bccfe.tagId[0]);
-+ sscanf(buf->bccfe.rootAddress,"%u", &rootfsaddr);
-+ sscanf(buf->bccfe.rootLength, "%u", &rootfslen);
-+ sscanf(buf->bccfe.kernelAddress, "%u", &kerneladdr);
-+ sscanf(buf->bccfe.kernelLength, "%u", &kernellen);
-+ sscanf(buf->bccfe.totalLength, "%u", &totallen);
-+ tagidcrc = *(uint32_t *)&(buf->bccfe.tagIdCRC[0]);
-+ tagversion = &(buf->bccfe.tagVersion[0]);
-+ boardid = &(buf->bccfe.boardid[0]);
-+ break;
-+ case 1:
-+ matchtagid = "bc300";
-+ tagid = &(buf->bc300.tagId[0]);
-+ sscanf(buf->bc300.rootAddress,"%u", &rootfsaddr);
-+ sscanf(buf->bc300.rootLength, "%u", &rootfslen);
-+ sscanf(buf->bc300.kernelAddress, "%u", &kerneladdr);
-+ sscanf(buf->bc300.kernelLength, "%u", &kernellen);
-+ sscanf(buf->bc300.totalLength, "%u", &totallen);
-+ tagidcrc = *(uint32_t *)&(buf->bc300.tagIdCRC[0]);
-+ tagversion = &(buf->bc300.tagVersion[0]);
-+ boardid = &(buf->bc300.boardid[0]);
-+ break;
-+ case 2:
-+ matchtagid = "ag306";
-+ tagid = &(buf->ag306.tagId[0]);
-+ sscanf(buf->ag306.rootAddress,"%u", &rootfsaddr);
-+ sscanf(buf->ag306.rootLength, "%u", &rootfslen);
-+ sscanf(buf->ag306.kernelAddress, "%u", &kerneladdr);
-+ sscanf(buf->ag306.kernelLength, "%u", &kernellen);
-+ sscanf(buf->ag306.totalLength, "%u", &totallen);
-+ tagidcrc = *(uint32_t *)&(buf->ag306.tagIdCRC[0]);
-+ tagversion = &(buf->ag306.tagVersion[0]);
-+ boardid = &(buf->ag306.boardid[0]);
-+ break;
-+ case 3:
-+ matchtagid = "bc221";
-+ tagid = &(buf->bc221.tagId[0]);
-+ sscanf(buf->bc221.rootAddress,"%u", &rootfsaddr);
-+ sscanf(buf->bc221.rootLength, "%u", &rootfslen);
-+ sscanf(buf->bc221.kernelAddress, "%u", &kerneladdr);
-+ sscanf(buf->bc221.kernelLength, "%u", &kernellen);
-+ sscanf(buf->bc221.totalLength, "%u", &totallen);
-+ tagidcrc = *(uint32_t *)&(buf->bc221.tagIdCRC[0]);
-+ tagversion = &(buf->bc221.tagVersion[0]);
-+ boardid = &(buf->bc221.boardid[0]);
-+ break;
-+ case 4:
-+ matchtagid = "bc310";
-+ tagid = &(buf->bc310.tagId[0]);
-+ sscanf(buf->bc310.rootAddress,"%u", &rootfsaddr);
-+ sscanf(buf->bc310.rootLength, "%u", &rootfslen);
-+ sscanf(buf->bc310.kernelAddress, "%u", &kerneladdr);
-+ sscanf(buf->bc310.kernelLength, "%u", &kernellen);
-+ sscanf(buf->bc310.totalLength, "%u", &totallen);
-+ tagidcrc = *(uint32_t *)&(buf->bc310.tagIdCRC[0]);
-+ tagversion = &(buf->bc310.tagVersion[0]);
-+ boardid = &(buf->bc310.boardid[0]);
-+ break;
-+ }
-+ if (strncmp(tagid, matchtagid, TAGID_LEN) != 0) {
-+ continue;
-+ }
-+
-+ calctagidcrc = htonl(tagcrc32(IMAGETAG_CRC_START, tagid, TAGID_LEN));
-+ if (tagidcrc == calctagidcrc) {
-+ tagid_match = true;
-+ break;
-+ }
-+ }
-+
-+ if (!tagid_match) {
-+ tagid = "bcram";
-+ sscanf(buf->bccfe.rootAddress,"%u", &rootfsaddr);
-+ sscanf(buf->bccfe.rootLength, "%u", &rootfslen);
-+ sscanf(buf->bccfe.kernelAddress, "%u", &kerneladdr);
-+ sscanf(buf->bccfe.kernelLength, "%u", &kernellen);
-+ sscanf(buf->bccfe.totalLength, "%u", &totallen);
-+ tagidcrc = *(uint32_t *)&(buf->bccfe.tagIdCRC[0]);
-+ tagversion = &(buf->bccfe.tagVersion[0]);
-+ boardid = &(buf->bccfe.boardid[0]);
-+ }
-+
-+ printk(KERN_INFO PFX "CFE boot tag found with version %s, board type %s, and tagid %s.\n",tagversion,boardid,tagid);
-+
-+ rootfsaddr = rootfsaddr - EXTENDED_SIZE;
-+ kerneladdr = kerneladdr - EXTENDED_SIZE;
-+ spareaddr = roundup(totallen,master->erasesize) + master->erasesize;
-+ sparelen = master->size - spareaddr - master->erasesize;
-+
-+ /* Determine number of partitions */
-+ namelen = 8;
-+ if (rootfslen > 0){
-+ nrparts++;
-+ namelen =+ 6;
-+ };
-+ if (kernellen > 0) {
-+ nrparts++;
-+ namelen =+ 6;
-+ };
-+
-+ /* Ask kernel for more memory */
-+ parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL);
-+ if (!parts) {
-+ vfree(buf);
-+ return -ENOMEM;
-+ };
-+
-+ /* Start building partition list */
-+ parts[curpart].name = "CFE";
-+ parts[curpart].offset = 0;
-+ parts[curpart].size = master->erasesize;
-+ curpart++;
-+
-+ if (kernellen > 0) {
-+ parts[curpart].name = "kernel";
-+ parts[curpart].offset = kerneladdr;
-+ parts[curpart].size = kernellen;
-+ curpart++;
-+ };
-+
-+ if (rootfslen > 0) {
-+ parts[curpart].name = "rootfs";
-+ parts[curpart].offset = rootfsaddr;
-+ parts[curpart].size = rootfslen;
-+ if (sparelen > 0)
-+ parts[curpart].size += sparelen;
-+ curpart++;
-+ };
-+
-+ parts[curpart].name = "nvram";
-+ parts[curpart].offset = master->size - master->erasesize;
-+ parts[curpart].size = master->erasesize;
-+
-+ /* Global partition "linux" to make easy firmware upgrade */
-+ curpart++;
-+ parts[curpart].name = "linux";
-+ parts[curpart].offset = parts[0].size;
-+ parts[curpart].size = master->size - parts[0].size - parts[3].size;
-+
-+ for (i = 0; i < nrparts; i++)
-+ printk(KERN_INFO PFX "Partition %d is %s offset %lx and length %lx\n", i, parts[i].name, parts[i].offset, parts[i].size);
-+
-+ printk(KERN_INFO PFX "Spare partition is %x offset and length %x\n", spareaddr, sparelen);
-+ *pparts = parts;
-+ vfree(buf);
-+
-+ return nrparts;
-+};
-+
-+static int bcm963xx_detect_cfe(struct mtd_info *master)
-+{
-+ int idoffset = 0x4e0;
-+ static char idstring[8] = "CFE1CFE1";
-+ char buf[9];
-+ int ret;
-+ size_t retlen;
-+
-+ ret = master->read(master, idoffset, 8, &retlen, (void *)buf);
-+ buf[retlen] = 0;
-+ printk(KERN_INFO PFX "Read Signature value of %s\n", buf);
-+
-+ return strncmp(idstring, buf, 8);
-+}
-+
-+static int bcm963xx_probe(struct platform_device *pdev)
-+{
-+ int err = 0;
-+ int parsed_nr_parts = 0;
-+ char *part_type;
-+ struct resource *r;
-+
-+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ bcm963xx_map.phys = r->start;
-+ bcm963xx_map.size = (r->end - r->start) + 1;
-+ bcm963xx_map.virt = ioremap(r->start, r->end - r->start + 1);
-+
-+ if (!bcm963xx_map.virt) {
-+ printk(KERN_ERR PFX "Failed to ioremap\n");
-+ return -EIO;
-+ }
-+ printk(KERN_INFO PFX "0x%08lx at 0x%08x\n", bcm963xx_map.size, bcm963xx_map.phys);
-+
-+ simple_map_init(&bcm963xx_map);
-+
-+ bcm963xx_mtd_info = do_map_probe("cfi_probe", &bcm963xx_map);
-+ if (!bcm963xx_mtd_info) {
-+ printk(KERN_ERR PFX "Failed to probe using CFI\n");
-+ err = -EIO;
-+ goto err_probe;
-+ }
-+
-+ bcm963xx_mtd_info->owner = THIS_MODULE;
-+
-+ /* This is mutually exclusive */
-+ if (bcm963xx_detect_cfe(bcm963xx_mtd_info) == 0) {
-+ printk(KERN_INFO PFX "CFE bootloader detected\n");
-+ if (parsed_nr_parts == 0) {
-+ int ret = parse_cfe_partitions(bcm963xx_mtd_info, &parsed_parts);
-+ if (ret > 0) {
-+ part_type = "CFE";
-+ parsed_nr_parts = ret;
-+ }
-+ }
-+ } else {
-+ printk(KERN_INFO PFX "assuming RedBoot bootloader\n");
-+ if (bcm963xx_mtd_info->size > 0x00400000) {
-+ printk(KERN_INFO PFX "Support for extended flash memory size : 0x%lx ; ONLY 64MBIT SUPPORT\n", bcm963xx_mtd_info->size);
-+ bcm963xx_map.virt = (u32)(EXTENDED_SIZE);
-+ }
-+
-+#ifdef CONFIG_MTD_REDBOOT_PARTS
-+ if (parsed_nr_parts == 0) {
-+ int ret = parse_redboot_partitions(bcm963xx_mtd_info, &parsed_parts, 0);
-+ if (ret > 0) {
-+ part_type = "RedBoot";
-+ parsed_nr_parts = ret;
-+ }
-+ }
-+#endif
-+ }
-+
-+ return add_mtd_partitions(bcm963xx_mtd_info, parsed_parts, parsed_nr_parts);
-+
-+err_probe:
-+ iounmap(bcm963xx_map.virt);
-+ return err;
-+}
-+
-+static int bcm963xx_remove(struct platform_device *pdev)
-+{
-+ if (bcm963xx_mtd_info) {
-+ del_mtd_partitions(bcm963xx_mtd_info);
-+ map_destroy(bcm963xx_mtd_info);
-+ }
-+
-+ if (bcm963xx_map.virt) {
-+ iounmap(bcm963xx_map.virt);
-+ bcm963xx_map.virt = 0;
-+ }
-+
-+ return 0;
-+}
-+
-+static struct platform_driver bcm63xx_mtd_dev = {
-+ .probe = bcm963xx_probe,
-+ .remove = bcm963xx_remove,
-+ .driver = {
-+ .name = "bcm963xx-flash",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+static int __init bcm963xx_mtd_init(void)
-+{
-+ return platform_driver_register(&bcm63xx_mtd_dev);
-+}
-+
-+static void __exit bcm963xx_mtd_exit(void)
-+{
-+ platform_driver_unregister(&bcm63xx_mtd_dev);
-+}
-+
-+module_init(bcm963xx_mtd_init);
-+module_exit(bcm963xx_mtd_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_DESCRIPTION("Broadcom BCM63xx MTD partition parser/mapping for CFE and RedBoot");
-+MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>");
-+MODULE_AUTHOR("Mike Albon <malbon@openwrt.org>");
---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
-+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -721,20 +721,6 @@ static int board_get_mac_address(u8 *mac
- return 0;
- }
-
--static struct mtd_partition mtd_partitions[] = {
-- {
-- .name = "cfe",
-- .offset = 0x0,
-- .size = 0x40000,
-- }
--};
--
--static struct physmap_flash_data flash_data = {
-- .width = 2,
-- .nr_parts = ARRAY_SIZE(mtd_partitions),
-- .parts = mtd_partitions,
--};
--
- static struct resource mtd_resources[] = {
- {
- .start = 0, /* filled at runtime */
-@@ -744,12 +730,9 @@ static struct resource mtd_resources[] =
- };
-
- static struct platform_device mtd_dev = {
-- .name = "physmap-flash",
-+ .name = "bcm963xx-flash",
- .resource = mtd_resources,
- .num_resources = ARRAY_SIZE(mtd_resources),
-- .dev = {
-- .platform_data = &flash_data,
-- },
- };
-
- /*
+++ /dev/null
---- a/drivers/net/bcm63xx_enet.c
-+++ b/drivers/net/bcm63xx_enet.c
-@@ -1523,7 +1523,7 @@ static int compute_hw_mtu(struct bcm_ene
- actual_mtu = mtu;
-
- /* add ethernet header + vlan tag size */
-- actual_mtu += VLAN_ETH_HLEN;
-+ actual_mtu += VLAN_ETH_HLEN + VLAN_HLEN;
-
- if (actual_mtu < 64 || actual_mtu > BCMENET_MAX_MTU)
- return -EINVAL;
+++ /dev/null
---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
-+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -15,6 +15,8 @@
- #include <linux/mtd/partitions.h>
- #include <linux/mtd/physmap.h>
- #include <linux/ssb/ssb.h>
-+#include <linux/gpio_buttons.h>
-+#include <linux/input.h>
- #include <asm/addrspace.h>
- #include <bcm63xx_board.h>
- #include <bcm63xx_cpu.h>
-@@ -288,6 +290,16 @@ static struct board_info __initdata boar
- .active_low = 1,
- },
- },
-+ .reset_buttons = {
-+ {
-+ .desc = "reset",
-+ .gpio = 32,
-+ .active_low = 1,
-+ .type = EV_KEY,
-+ .code = BTN_0,
-+ .threshold = 3,
-+ },
-+ },
- };
-
- static struct board_info __initdata board_96348gw = {
-@@ -345,6 +357,16 @@ static struct board_info __initdata boar
- .active_low = 1,
- },
- },
-+ .reset_buttons = {
-+ {
-+ .desc = "reset",
-+ .gpio = 36,
-+ .active_low = 1,
-+ .type = EV_KEY,
-+ .code = BTN_0,
-+ .threshold = 3,
-+ },
-+ },
- };
-
- static struct board_info __initdata board_FAST2404 = {
-@@ -770,6 +792,16 @@ static struct platform_device bcm63xx_gp
- .dev.platform_data = &bcm63xx_led_data,
- };
-
-+static struct gpio_buttons_platform_data bcm63xx_gpio_buttons_data = {
-+ .poll_interval = 20,
-+};
-+
-+static struct platform_device bcm63xx_gpio_buttons_device = {
-+ .name = "gpio-buttons",
-+ .id = 0,
-+ .dev.platform_data = &bcm63xx_gpio_buttons_data,
-+};
-+
- /*
- * third stage init callback, register all board devices.
- */
-@@ -825,6 +857,13 @@ int __init board_register_devices(void)
-
- platform_device_register(&bcm63xx_gpio_leds);
-
-+ if (board.reset_buttons) {
-+ bcm63xx_gpio_buttons_data.nbuttons = ARRAY_SIZE(board.reset_buttons);
-+ bcm63xx_gpio_buttons_data.buttons = board.reset_buttons;
-+
-+ platform_device_register(&bcm63xx_gpio_buttons_device);
-+ }
-+
- return 0;
- }
-
---- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h
-+++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h
-@@ -55,6 +55,9 @@ struct board_info {
-
- /* GPIO LEDs */
- struct gpio_led leds[5];
-+
-+ /* Reset button */
-+ struct gpio_button reset_buttons[1];
- };
-
- #endif /* ! BOARD_BCM963XX_H_ */
+++ /dev/null
---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
-+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -784,6 +784,10 @@ static struct ssb_sprom bcm63xx_sprom =
- };
- #endif
-
-+static struct resource gpiodev_resource = {
-+ .start = 0xFFFFFFFF,
-+};
-+
- static struct gpio_led_platform_data bcm63xx_led_data;
-
- static struct platform_device bcm63xx_gpio_leds = {
-@@ -852,6 +856,8 @@ int __init board_register_devices(void)
-
- platform_device_register(&mtd_dev);
-
-+ platform_device_register_simple("GPIODEV", 0, &gpiodev_resource, 1);
-+
- bcm63xx_led_data.num_leds = ARRAY_SIZE(board.leds);
- bcm63xx_led_data.leds = board.leds;
-
+++ /dev/null
---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
-+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -392,6 +392,25 @@ static struct board_info __initdata boar
- .has_ehci0 = 1,
- };
-
-+static struct board_info __initdata board_rta1025w_16 = {
-+ .name = "RTA1025W_16",
-+ .expected_cpu_id = 0x6348,
-+
-+ .has_enet0 = 1,
-+ .has_enet1 = 1,
-+ .has_pci = 1,
-+
-+ .enet0 = {
-+ .has_phy = 1,
-+ .use_internal_phy = 1,
-+ },
-+ .enet1 = {
-+ .force_speed_100 = 1,
-+ .force_duplex_full = 1,
-+ },
-+};
-+
-+
- static struct board_info __initdata board_DV201AMR = {
- .name = "DV201AMR",
- .expected_cpu_id = 0x6348,
-@@ -576,6 +595,7 @@ static const struct board_info __initdat
- &board_FAST2404,
- &board_DV201AMR,
- &board_96348gw_a,
-+ &board_rta1025w_16,
- #endif
-
- #ifdef CONFIG_BCM63XX_CPU_6358
+++ /dev/null
---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
-+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -574,6 +574,27 @@ static struct board_info __initdata boar
- .has_ohci0 = 1,
- .has_ehci0 = 1,
- };
-+
-+static struct board_info __initdata board_DWVS0 = {
-+ .name = "DWV-S0",
-+ .expected_cpu_id = 0x6358,
-+
-+ .has_enet0 = 1,
-+ .has_enet1 = 1,
-+ .has_pci = 1,
-+
-+ .enet0 = {
-+ .has_phy = 1,
-+ .use_internal_phy = 1,
-+ },
-+
-+ .enet1 = {
-+ .force_speed_100 = 1,
-+ .force_duplex_full = 1,
-+ },
-+
-+ .has_ohci0 = 1,
-+};
- #endif
-
- /*
-@@ -602,6 +623,7 @@ static const struct board_info __initdat
- &board_96358vw,
- &board_96358vw2,
- &board_AGPFS0,
-+ &board_DWVS0,
- #endif
- };
-
+++ /dev/null
---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
-+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -336,24 +336,39 @@ static struct board_info __initdata boar
- .active_low = 1,
- },
- {
-- .name = "ppp",
-- .gpio = 3,
-+ .name = "power",
-+ .gpio = 0,
- .active_low = 1,
-+ .default_trigger = "default-on",
- },
- {
-- .name = "ppp-fail",
-+ .name = "stop",
-+ .gpio = 1,
-+ .active_low = 1,
-+ },
-+ {
-+ .name = "line1",
- .gpio = 4,
- .active_low = 1,
- },
- {
-- .name = "power",
-- .gpio = 0,
-+ .name = "line2",
-+ .gpio = 5,
- .active_low = 1,
-- .default_trigger = "default-on",
- },
- {
-- .name = "stop",
-- .gpio = 1,
-+ .name = "line3",
-+ .gpio = 6,
-+ .active_low = 1,
-+ },
-+ {
-+ .name = "tel",
-+ .gpio = 7,
-+ .active_low = 1,
-+ },
-+ {
-+ .name = "eth",
-+ .gpio = 35,
- .active_low = 1,
- },
- },
-@@ -854,6 +869,7 @@ static struct platform_device bcm63xx_gp
- int __init board_register_devices(void)
- {
- u32 val;
-+ int led_count = 0;
-
- if (board.has_pccard)
- bcm63xx_pcmcia_register();
-@@ -900,7 +916,11 @@ int __init board_register_devices(void)
-
- platform_device_register_simple("GPIODEV", 0, &gpiodev_resource, 1);
-
-- bcm63xx_led_data.num_leds = ARRAY_SIZE(board.leds);
-+ /* count number of LEDs defined by this device */
-+ while (led_count < ARRAY_SIZE(board.leds) && board.leds[led_count].name)
-+ led_count++;
-+
-+ bcm63xx_led_data.num_leds = led_count;
- bcm63xx_led_data.leds = board.leds;
-
- platform_device_register(&bcm63xx_gpio_leds);
---- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h
-+++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h
-@@ -54,7 +54,7 @@ struct board_info {
- struct bcm63xx_dsp_platform_data dsp;
-
- /* GPIO LEDs */
-- struct gpio_led leds[5];
-+ struct gpio_led leds[8];
-
- /* Reset button */
- struct gpio_button reset_buttons[1];
+++ /dev/null
---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
-+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -588,6 +588,63 @@ static struct board_info __initdata boar
-
- .has_ohci0 = 1,
- .has_ehci0 = 1,
-+
-+ .leds = {
-+ /*Each led on alice gate is bi-color */
-+ {
-+ .name = "power:red",
-+ .gpio = 5,
-+ .active_low = 1,
-+ },
-+ {
-+ .name = "power:green",
-+ .gpio = 4,
-+ .active_low = 1,
-+ .default_trigger = "default-on",
-+ },
-+ {
-+ .name = "wifi:red",
-+ .gpio = 23,
-+ .active_low = 1,
-+ },
-+ {
-+ .name = "wifi:green",
-+ .gpio = 22,
-+ .active_low = 1,
-+ },
-+ {
-+ .name = "usr1:red",
-+ .gpio = 27,
-+ .active_low = 1,
-+ },
-+ {
-+ .name = "usr1:green",
-+ .gpio = 26,
-+ .active_low = 1,
-+ },
-+ {
-+ .name = "usr2:red",
-+ .gpio = 30,
-+ .active_low = 1,
-+ },
-+ {
-+ .name = "usr2:green",
-+ .gpio = 29,
-+ .active_low = 1,
-+ },
-+ },
-+
-+ .reset_buttons = {
-+ {
-+ .desc = "sw2",
-+ .gpio = 37,
-+ .active_low = 1,
-+ .type = EV_KEY,
-+ .code = BTN_0,
-+ .threshold = 3,
-+ },
-+ },
-+ /* sw1 is connected to gpio34*/
- };
-
- static struct board_info __initdata board_DWVS0 = {
+++ /dev/null
---- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h
-+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h
-@@ -10,6 +10,10 @@ static inline unsigned long bcm63xx_gpio
- switch (bcm63xx_get_cpu_id()) {
- case BCM6358_CPU_ID:
- return 40;
-+ case BCM6338_CPU_ID:
-+ return 8;
-+ case BCM6345_CPU_ID:
-+ return 16;
- case BCM6348_CPU_ID:
- default:
- return 37;
+++ /dev/null
---- a/arch/mips/bcm63xx/boards/Kconfig
-+++ b/arch/mips/bcm63xx/boards/Kconfig
-@@ -8,4 +8,10 @@ config BOARD_BCM963XX
- select SSB
- help
-
-+config BOARD_LIVEBOX
-+ bool "Inventel Livebox(es) boards"
-+ select SSB
-+ help
-+ Inventel Livebox boards using the RedBoot bootloader.
-+
- endchoice
---- a/arch/mips/bcm63xx/boards/Makefile
-+++ b/arch/mips/bcm63xx/boards/Makefile
-@@ -1,3 +1,4 @@
- obj-$(CONFIG_BOARD_BCM963XX) += board_bcm963xx.o
-+obj-$(CONFIG_BOARD_LIVEBOX) += board_livebox.o
-
- EXTRA_CFLAGS += -Werror
---- /dev/null
-+++ b/arch/mips/bcm63xx/boards/board_livebox.c
-@@ -0,0 +1,223 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2008 Florian Fainelli <florian@openwrt.org>
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/platform_device.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/input.h>
-+#include <linux/gpio_buttons.h>
-+#include <asm/addrspace.h>
-+#include <bcm63xx_board.h>
-+#include <bcm63xx_cpu.h>
-+#include <bcm63xx_regs.h>
-+#include <bcm63xx_io.h>
-+#include <bcm63xx_dev_pci.h>
-+#include <bcm63xx_dev_enet.h>
-+#include <bcm63xx_dev_pcmcia.h>
-+#include <bcm63xx_dev_usb_ohci.h>
-+#include <bcm63xx_dev_usb_ehci.h>
-+#include <board_bcm963xx.h>
-+
-+#define PFX "board_livebox: "
-+
-+static unsigned int mac_addr_used = 0;
-+static struct board_info board;
-+
-+/*
-+ * known 6348 boards
-+ */
-+#ifdef CONFIG_BCM63XX_CPU_6348
-+static struct board_info __initdata board_livebox = {
-+ .name = "Livebox",
-+ .expected_cpu_id = 0x6348,
-+
-+ .has_enet0 = 1,
-+ .has_enet1 = 1,
-+ .has_pci = 1,
-+
-+ .enet0 = {
-+ .has_phy = 1,
-+ .use_internal_phy = 1,
-+ },
-+
-+ .enet1 = {
-+ .force_speed_100 = 1,
-+ .force_duplex_full = 1,
-+ },
-+
-+ .has_ohci0 = 1,
-+ .has_pccard = 1,
-+ .has_ehci0 = 1,
-+};
-+#endif
-+
-+/*
-+ * all boards
-+ */
-+static const struct board_info __initdata *bcm963xx_boards[] = {
-+#ifdef CONFIG_BCM63XX_CPU_6348
-+ &board_livebox
-+#endif
-+};
-+
-+/*
-+ * early init callback
-+ */
-+void __init board_prom_init(void)
-+{
-+ u32 val;
-+
-+ /* read base address of boot chip select (0) */
-+ val = bcm_mpi_readl(MPI_CSBASE_REG(0));
-+ val &= MPI_CSBASE_BASE_MASK;
-+
-+ /* assume board is a Livebox */
-+ memcpy(&board, bcm963xx_boards[0], sizeof(board));
-+
-+ /* setup pin multiplexing depending on board enabled device,
-+ * this has to be done this early since PCI init is done
-+ * inside arch_initcall */
-+ val = 0;
-+
-+ if (board.has_pci) {
-+ bcm63xx_pci_enabled = 1;
-+ if (BCMCPU_IS_6348())
-+ val |= GPIO_MODE_6348_G2_PCI;
-+ }
-+
-+ if (board.has_pccard) {
-+ if (BCMCPU_IS_6348())
-+ val |= GPIO_MODE_6348_G1_MII_PCCARD;
-+ }
-+
-+ if (board.has_enet0 && !board.enet0.use_internal_phy) {
-+ if (BCMCPU_IS_6348())
-+ val |= GPIO_MODE_6348_G3_EXT_MII |
-+ GPIO_MODE_6348_G0_EXT_MII;
-+ }
-+
-+ if (board.has_enet1 && !board.enet1.use_internal_phy) {
-+ if (BCMCPU_IS_6348())
-+ val |= GPIO_MODE_6348_G3_EXT_MII |
-+ GPIO_MODE_6348_G0_EXT_MII;
-+ }
-+
-+ bcm_gpio_writel(val, GPIO_MODE_REG);
-+}
-+
-+/*
-+ * second stage init callback, good time to panic if we couldn't
-+ * identify on which board we're running since early printk is working
-+ */
-+void __init board_setup(void)
-+{
-+ if (!board.name[0])
-+ panic("unable to detect bcm963xx board");
-+ printk(KERN_INFO PFX "board name: %s\n", board.name);
-+
-+ /* make sure we're running on expected cpu */
-+ if (bcm63xx_get_cpu_id() != board.expected_cpu_id)
-+ panic("unexpected CPU for bcm963xx board");
-+}
-+
-+/*
-+ * return board name for /proc/cpuinfo
-+ */
-+const char *board_get_name(void)
-+{
-+ return board.name;
-+}
-+
-+/*
-+ * register & return a new board mac address
-+ */
-+
-+static int board_get_mac_address(u8 *mac)
-+{
-+ u8 default_mac[ETH_ALEN] = {0x00, 0x07, 0x3A, 0x00, 0x00, 0x00};
-+ u8 *p;
-+ int count;
-+
-+ memcpy(mac, default_mac, ETH_ALEN);
-+
-+ p = mac + ETH_ALEN - 1;
-+ count = mac_addr_used;
-+
-+ while (count--) {
-+ do {
-+ (*p)++;
-+ if (*p != 0)
-+ break;
-+ p--;
-+ } while (p != mac);
-+ }
-+
-+ if (p == mac) {
-+ printk(KERN_ERR PFX "unable to fetch mac address\n");
-+ return -ENODEV;
-+ }
-+ mac_addr_used++;
-+
-+ return 0;
-+}
-+
-+static struct resource mtd_resources[] = {
-+ {
-+ .start = 0, /* filled at runtime */
-+ .end = 0, /* filled at runtime */
-+ .flags = IORESOURCE_MEM,
-+ }
-+};
-+
-+static struct platform_device mtd_dev = {
-+ .name = "bcm963xx-flash",
-+ .resource = mtd_resources,
-+ .num_resources = ARRAY_SIZE(mtd_resources),
-+};
-+
-+
-+/*
-+ * third stage init callback, register all board devices.
-+ */
-+int __init board_register_devices(void)
-+{
-+ u32 val;
-+
-+ if (board.has_pccard)
-+ bcm63xx_pcmcia_register();
-+
-+ if (board.has_enet0 &&
-+ !board_get_mac_address(board.enet0.mac_addr))
-+ bcm63xx_enet_register(0, &board.enet0);
-+
-+ if (board.has_enet1 &&
-+ !board_get_mac_address(board.enet1.mac_addr))
-+ bcm63xx_enet_register(1, &board.enet1);
-+
-+ if (board.has_ohci0)
-+ bcm63xx_ohci_register();
-+
-+ if (board.has_ehci0)
-+ bcm63xx_ehci_register();
-+
-+
-+ /* read base address of boot chip select (0) */
-+ val = bcm_mpi_readl(MPI_CSBASE_REG(0));
-+ val &= MPI_CSBASE_BASE_MASK;
-+ mtd_resources[0].start = val;
-+ mtd_resources[0].end = 0x1FFFFFFF;
-+
-+ platform_device_register(&mtd_dev);
-+
-+ return 0;
-+}
-+
+++ /dev/null
---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
-+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -28,6 +28,7 @@
- #include <bcm63xx_dev_pcmcia.h>
- #include <bcm63xx_dev_usb_ohci.h>
- #include <bcm63xx_dev_usb_ehci.h>
-+#include <bcm63xx_dev_usb_udc.h>
- #include <board_bcm963xx.h>
-
- #define PFX "board_bcm963xx: "
-@@ -405,6 +406,8 @@ static struct board_info __initdata boar
- .has_ohci0 = 1,
- .has_pccard = 1,
- .has_ehci0 = 1,
-+
-+ .has_udc0 = 1,
- };
-
- static struct board_info __initdata board_rta1025w_16 = {
-@@ -948,6 +951,9 @@ int __init board_register_devices(void)
- if (board.has_dsp)
- bcm63xx_dsp_register(&board.dsp);
-
-+ if (board.has_udc0)
-+ bcm63xx_udc_register();
-+
- /* Generate MAC address for WLAN and
- * register our SPROM */
- #ifdef CONFIG_SSB_PCIHOST
---- /dev/null
-+++ b/arch/mips/bcm63xx/dev-usb-udc.c
-@@ -0,0 +1,58 @@
-+/*
-+ * Copyright (C) 2009 Henk Vergonet <Henk.Vergonet@gmail.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-+ */
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/platform_device.h>
-+#include <bcm63xx_cpu.h>
-+
-+static struct resource udc_resources[] = {
-+ {
-+ .start = -1, /* filled at runtime */
-+ .end = -1, /* filled at runtime */
-+ .flags = IORESOURCE_MEM,
-+ },
-+ {
-+ .start = -1, /* filled at runtime */
-+ .flags = IORESOURCE_IRQ,
-+ },
-+};
-+
-+static u64 udc_dmamask = ~(u32)0;
-+
-+static struct platform_device bcm63xx_udc_device = {
-+ .name = "bcm63xx-udc",
-+ .id = 0,
-+ .num_resources = ARRAY_SIZE(udc_resources),
-+ .resource = udc_resources,
-+ .dev = {
-+ .dma_mask = &udc_dmamask,
-+ .coherent_dma_mask = 0xffffffff,
-+ },
-+};
-+
-+int __init bcm63xx_udc_register(void)
-+{
-+ if (!BCMCPU_IS_6338() && !BCMCPU_IS_6345() && !BCMCPU_IS_6348())
-+ return 0;
-+
-+ udc_resources[0].start = bcm63xx_regset_address(RSET_UDC0);
-+ udc_resources[0].end = udc_resources[0].start;
-+ udc_resources[0].end += RSET_UDC_SIZE - 1;
-+ udc_resources[1].start = bcm63xx_get_irq_number(IRQ_UDC0);
-+ return platform_device_register(&bcm63xx_udc_device);
-+}
---- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h
-+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h
-@@ -125,7 +125,7 @@ enum bcm63xx_regs_set {
- #define BCM_6338_UART0_BASE (0xfffe0300)
- #define BCM_6338_GPIO_BASE (0xfffe0400)
- #define BCM_6338_SPI_BASE (0xfffe0c00)
--#define BCM_6338_UDC0_BASE (0xdeadbeef)
-+#define BCM_6338_UDC0_BASE (0xfffe3000)
- #define BCM_6338_USBDMA_BASE (0xfffe2400)
- #define BCM_6338_OHCI0_BASE (0xdeadbeef)
- #define BCM_6338_OHCI_PRIV_BASE (0xfffe3000)
-@@ -155,7 +155,7 @@ enum bcm63xx_regs_set {
- #define BCM_6345_UART0_BASE (0xfffe0300)
- #define BCM_6345_GPIO_BASE (0xfffe0400)
- #define BCM_6345_SPI_BASE (0xdeadbeef)
--#define BCM_6345_UDC0_BASE (0xdeadbeef)
-+#define BCM_6345_UDC0_BASE (0xfffe2100)
- #define BCM_6345_USBDMA_BASE (0xfffe2800)
- #define BCM_6345_ENET0_BASE (0xfffe1800)
- #define BCM_6345_ENETDMA_BASE (0xfffe2800)
-@@ -210,7 +210,7 @@ enum bcm63xx_regs_set {
- #define BCM_6358_UART0_BASE (0xfffe0100)
- #define BCM_6358_GPIO_BASE (0xfffe0080)
- #define BCM_6358_SPI_BASE (0xdeadbeef)
--#define BCM_6358_UDC0_BASE (0xfffe0800)
-+#define BCM_6358_UDC0_BASE (0xfffe0400)
- #define BCM_6358_OHCI0_BASE (0xfffe1400)
- #define BCM_6358_OHCI_PRIV_BASE (0xdeadbeef)
- #define BCM_6358_USBH_PRIV_BASE (0xfffe1500)
-@@ -430,6 +430,7 @@ enum bcm63xx_irq {
- IRQ_TIMER = 0,
- IRQ_UART0,
- IRQ_DSL,
-+ IRQ_UDC0,
- IRQ_ENET0,
- IRQ_ENET1,
- IRQ_ENET_PHY,
-@@ -472,7 +473,7 @@ enum bcm63xx_irq {
- #define BCM_6345_UART0_IRQ (IRQ_INTERNAL_BASE + 2)
- #define BCM_6345_DSL_IRQ (IRQ_INTERNAL_BASE + 3)
- #define BCM_6345_ATM_IRQ (IRQ_INTERNAL_BASE + 4)
--#define BCM_6345_USB_IRQ (IRQ_INTERNAL_BASE + 5)
-+#define BCM_6345_UDC0_IRQ (IRQ_INTERNAL_BASE + 5)
- #define BCM_6345_ENET0_IRQ (IRQ_INTERNAL_BASE + 8)
- #define BCM_6345_ENET_PHY_IRQ (IRQ_INTERNAL_BASE + 12)
- #define BCM_6345_ENET0_RXDMA_IRQ (IRQ_INTERNAL_BASE + 13 + 1)
-@@ -494,10 +495,17 @@ enum bcm63xx_irq {
- #define BCM_6348_TIMER_IRQ (IRQ_INTERNAL_BASE + 0)
- #define BCM_6348_UART0_IRQ (IRQ_INTERNAL_BASE + 2)
- #define BCM_6348_DSL_IRQ (IRQ_INTERNAL_BASE + 4)
-+#define BCM_6348_UDC0_IRQ (IRQ_INTERNAL_BASE + 6)
- #define BCM_6348_ENET1_IRQ (IRQ_INTERNAL_BASE + 7)
- #define BCM_6348_ENET0_IRQ (IRQ_INTERNAL_BASE + 8)
- #define BCM_6348_ENET_PHY_IRQ (IRQ_INTERNAL_BASE + 9)
- #define BCM_6348_OHCI0_IRQ (IRQ_INTERNAL_BASE + 12)
-+#define BCM_6348_USB_CNTL_RX_DMA_IRQ (IRQ_INTERNAL_BASE + 14)
-+#define BCM_6348_USB_CNTL_TX_DMA_IRQ (IRQ_INTERNAL_BASE + 15)
-+#define BCM_6348_USB_BULK_RX_DMA_IRQ (IRQ_INTERNAL_BASE + 16)
-+#define BCM_6348_USB_BULK_TX_DMA_IRQ (IRQ_INTERNAL_BASE + 17)
-+#define BCM_6348_USB_ISO_RX_DMA_IRQ (IRQ_INTERNAL_BASE + 18)
-+#define BCM_6348_USB_ISO_TX_DMA_IRQ (IRQ_INTERNAL_BASE + 19)
- #define BCM_6348_ENET0_RXDMA_IRQ (IRQ_INTERNAL_BASE + 20)
- #define BCM_6348_ENET0_TXDMA_IRQ (IRQ_INTERNAL_BASE + 21)
- #define BCM_6348_ENET1_RXDMA_IRQ (IRQ_INTERNAL_BASE + 22)
---- /dev/null
-+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_usb_udc.h
-@@ -0,0 +1,6 @@
-+#ifndef BCM63XX_DEV_USB_UDC_H_
-+#define BCM63XX_DEV_USB_UDC_H_
-+
-+int bcm63xx_udc_register(void);
-+
-+#endif /* BCM63XX_DEV_USB_UDC_H_ */
---- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h
-+++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h
-@@ -45,6 +45,7 @@ struct board_info {
- unsigned int has_ohci0:1;
- unsigned int has_ehci0:1;
- unsigned int has_dsp:1;
-+ unsigned int has_udc0:1;
-
- /* ethernet config */
- struct bcm63xx_enet_platform_data enet0;
---- a/arch/mips/bcm63xx/Makefile
-+++ b/arch/mips/bcm63xx/Makefile
-@@ -1,6 +1,6 @@
- obj-y += clk.o cpu.o cs.o gpio.o irq.o prom.o setup.o timer.o \
- dev-dsp.o dev-enet.o dev-pcmcia.o dev-uart.o dev-wdt.o \
-- dev-usb-ohci.o dev-usb-ehci.o
-+ dev-usb-ohci.o dev-usb-ehci.o dev-usb-udc.o
- obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
-
- obj-y += boards/
---- a/arch/mips/bcm63xx/clk.c
-+++ b/arch/mips/bcm63xx/clk.c
-@@ -141,6 +141,30 @@ static struct clk clk_usbh = {
- };
-
- /*
-+ * USB slave clock
-+ */
-+static void usbs_set(struct clk *clk, int enable)
-+{
-+ u32 mask;
-+
-+ switch(bcm63xx_get_cpu_id()) {
-+ case BCM6338_CPU_ID:
-+ mask = CKCTL_6338_USBS_EN;
-+ break;
-+ case BCM6348_CPU_ID:
-+ mask = CKCTL_6348_USBS_EN;
-+ break;
-+ default:
-+ return;
-+ }
-+ bcm_hwclock_set(mask, enable);
-+}
-+
-+static struct clk clk_usbs = {
-+ .set = usbs_set,
-+};
-+
-+/*
- * SPI clock
- */
- static void spi_set(struct clk *clk, int enable)
-@@ -208,6 +232,8 @@ struct clk *clk_get(struct device *dev,
- return &clk_ephy;
- if (!strcmp(id, "usbh"))
- return &clk_usbh;
-+ if (!strcmp(id, "usbs"))
-+ return &clk_usbs;
- if (!strcmp(id, "spi"))
- return &clk_spi;
- if (!strcmp(id, "periph"))
---- a/arch/mips/bcm63xx/Kconfig
-+++ b/arch/mips/bcm63xx/Kconfig
-@@ -7,6 +7,7 @@ config BCM63XX_CPU_6338
- select USB_ARCH_HAS_OHCI
- select USB_OHCI_BIG_ENDIAN_DESC
- select USB_OHCI_BIG_ENDIAN_MMIO
-+ select USB_ARCH_HAS_UDC
-
- config BCM63XX_CPU_6345
- bool "support 6345 CPU"
-@@ -19,6 +20,7 @@ config BCM63XX_CPU_6348
- select USB_ARCH_HAS_OHCI
- select USB_OHCI_BIG_ENDIAN_DESC
- select USB_OHCI_BIG_ENDIAN_MMIO
-+ select USB_ARCH_HAS_UDC
-
- config BCM63XX_CPU_6358
- bool "support 6358 CPU"
+++ /dev/null
-Fix typo: CONFIG_BCMCPU_IS_63xx does not exists,
-CONFIG_BCM63XX_CPU_63xx is the valid config option.
-
-Signed-off-by: Maxime Bizon <mbizon@freebox.fr>
----
- .../asm/mach-bcm63xx/cpu-feature-overrides.h | 2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
---- a/arch/mips/include/asm/mach-bcm63xx/cpu-feature-overrides.h
-+++ b/arch/mips/include/asm/mach-bcm63xx/cpu-feature-overrides.h
-@@ -24,7 +24,7 @@
- #define cpu_has_smartmips 0
- #define cpu_has_vtag_icache 0
-
--#if !defined(BCMCPU_RUNTIME_DETECT) && (defined(CONFIG_BCMCPU_IS_6348) || defined(CONFIG_CPU_IS_6338) || defined(CONFIG_CPU_IS_BCM6345))
-+#if !defined(BCMCPU_RUNTIME_DETECT) && (defined(CONFIG_BCM63XX_CPU_6348) || defined(CONFIG_BCM63XX_CPU_6345) || defined(CONFIG_BCM63XX_CPU_6338))
- #define cpu_has_dc_aliases 0
- #endif
-
+++ /dev/null
-To avoid glitch during gpio initialisation, fetch gpio output
-registers values left by bootloader.
-
-Signed-off-by: Maxime Bizon <mbizon@freebox.fr>
----
- arch/mips/bcm63xx/gpio.c | 2 ++
- 1 files changed, 2 insertions(+), 0 deletions(-)
-
---- a/arch/mips/bcm63xx/gpio.c
-+++ b/arch/mips/bcm63xx/gpio.c
-@@ -125,6 +125,8 @@ static struct gpio_chip bcm63xx_gpio_chi
-
- int __init bcm63xx_gpio_init(void)
- {
-+ gpio_out_low = bcm_gpio_readl(GPIO_DATA_LO_REG);
-+ gpio_out_high = bcm_gpio_readl(GPIO_DATA_HI_REG);
- bcm63xx_gpio_chip.ngpio = bcm63xx_gpio_count();
- pr_info("registering %d GPIOs\n", bcm63xx_gpio_chip.ngpio);
-
+++ /dev/null
---- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
-+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -467,6 +467,49 @@
-
- .has_ohci0 = 1,
- };
-+
-+static struct board_info __initdata board_96348_D4PW = {
-+ .name = "D-4P-W",
-+ .expected_cpu_id = 0x6348,
-+
-+ .has_enet0 = 1,
-+ .has_enet1 = 1,
-+ .has_pci = 1,
-+
-+ .enet0 = {
-+ .has_phy = 1,
-+ .use_internal_phy = 1,
-+ },
-+ .enet1 = {
-+ .force_speed_100 = 1,
-+ .force_duplex_full = 1,
-+ },
-+
-+ .has_ohci0 = 1,
-+ .has_ehci0 = 1,
-+
-+ .leds = {
-+ {
-+ .name = "ppp",
-+ .gpio = 4,
-+ .active_low = 1,
-+ },
-+ {
-+ .name = "ppp-fail",
-+ .gpio = 5,
-+ .active_low = 1,
-+ },
-+ {
-+ .name = "power",
-+ .gpio = 0,
-+ .active_low = 1,
-+ .default_trigger = "default-on",
-+
-+ },
-+ },
-+
-+};
-+
- #endif
-
- /*
-@@ -692,6 +735,7 @@
- &board_DV201AMR,
- &board_96348gw_a,
- &board_rta1025w_16,
-+ &board_96348_D4PW,
- #endif
-
- #ifdef CONFIG_BCM63XX_CPU_6358
+++ /dev/null
-# CONFIG_6PACK is not set
-# CONFIG_8139CP is not set
-# CONFIG_9P_FS is not set
-# CONFIG_ACENIC is not set
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_ADFS_FS is not set
-# CONFIG_ADM6996_PHY is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_AF_RXRPC is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_AIRO_CS is not set
-# CONFIG_AIRO is not set
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_AMIGA_PARTITION is not set
-CONFIG_ANON_INODES=y
-# CONFIG_APPLICOM is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91 is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CLPS7500 is not set
-# CONFIG_ARCH_CO285 is not set
-# CONFIG_ARCH_DAVINCI is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_EP93XX is not set
-CONFIG_ARCH_FLATMEM_ENABLE=y
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_GEMINI is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP13XX is not set
-# CONFIG_ARCH_IOP32X is not set
-# CONFIG_ARCH_IOP33X is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_IXP23XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_KIRKWOOD is not set
-# CONFIG_ARCH_KS8695 is not set
-# CONFIG_ARCH_L7200 is not set
-# CONFIG_ARCH_LH7A40X is not set
-# CONFIG_ARCH_LOKI is not set
-# CONFIG_ARCH_MMP is not set
-# CONFIG_ARCH_MSM7X00A is not set
-# CONFIG_ARCH_MV78XX0 is not set
-# CONFIG_ARCH_MXC is not set
-# CONFIG_ARCH_NETX is not set
-# CONFIG_ARCH_NS9XXX is not set
-# CONFIG_ARCH_OMAP is not set
-# CONFIG_ARCH_ORION is not set
-# CONFIG_ARCH_PNX4008 is not set
-# CONFIG_ARCH_PXA is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_RPC is not set
-# CONFIG_ARCH_S3C2410 is not set
-# CONFIG_ARCH_S3C64XX is not set
-# CONFIG_ARCH_SA1100 is not set
-# CONFIG_ARCH_SHARK is not set
-# CONFIG_ARCH_VERSATILE is not set
-# CONFIG_ARCNET is not set
-CONFIG_ARPD=y
-CONFIG_ASK_IP_FIB_HASH=y
-# CONFIG_ATA_GENERIC is not set
-# CONFIG_ATA is not set
-# CONFIG_ATALK is not set
-# CONFIG_ATA_NONSTANDARD is not set
-# CONFIG_ATA_OVER_ETH is not set
-# CONFIG_ATARI_PARTITION is not set
-CONFIG_ATA_SFF=y
-# CONFIG_ATL1 is not set
-# CONFIG_ATM_AMBASSADOR is not set
-CONFIG_ATM_BR2684_IPFILTER=y
-# CONFIG_ATM_BR2684 is not set
-# CONFIG_ATM_CLIP is not set
-CONFIG_ATM_CLIP_NO_ICMP=y
-# CONFIG_ATM_DRIVERS is not set
-# CONFIG_ATM_DUMMY is not set
-# CONFIG_ATMEL is not set
-# CONFIG_ATM_ENI is not set
-# CONFIG_ATM_FIRESTREAM is not set
-# CONFIG_ATM_FORE200E_MAYBE is not set
-# CONFIG_ATM_HE is not set
-# CONFIG_ATM_HORIZON is not set
-# CONFIG_ATM_IA is not set
-# CONFIG_ATM_IDT77252 is not set
-# CONFIG_ATM is not set
-# CONFIG_ATM_LANAI is not set
-# CONFIG_ATM_LANE is not set
-# CONFIG_ATM_MPOA is not set
-# CONFIG_ATM_NICSTAR is not set
-# CONFIG_ATM_TCP is not set
-# CONFIG_ATM_ZATM is not set
-# CONFIG_AUDIT is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AX25_DAMA_SLAVE is not set
-# CONFIG_AX25 is not set
-# CONFIG_AX88796 is not set
-# CONFIG_B44 is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-CONFIG_BASE_FULL=y
-CONFIG_BASE_SMALL=0
-# CONFIG_BASLER_EXCITE is not set
-# CONFIG_BAYCOM_EPP is not set
-# CONFIG_BAYCOM_PAR is not set
-# CONFIG_BAYCOM_SER_FDX is not set
-# CONFIG_BAYCOM_SER_HDX is not set
-CONFIG_BCM43XX_DEBUG=y
-CONFIG_BCM43XX_DMA_AND_PIO_MODE=y
-# CONFIG_BCM43XX_DMA_MODE is not set
-CONFIG_BCM43XX_DMA=y
-# CONFIG_BCM43XX is not set
-# CONFIG_BCM43XX_PIO_MODE is not set
-CONFIG_BCM43XX_PIO=y
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-# CONFIG_BLINK is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_ATIIXP is not set
-# CONFIG_BLK_DEV_BSG is not set
-# CONFIG_BLK_DEV_CMD640 is not set
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_CS5535 is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_DELKIN is not set
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_GENERIC is not set
-# CONFIG_BLK_DEV_HD_IDE is not set
-# CONFIG_BLK_DEV_HD is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_IDECD is not set
-# CONFIG_BLK_DEV_IDECS is not set
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDEPCI is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-# CONFIG_BLK_DEV_IDE_SATA is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_BLK_DEV_IDETAPE is not set
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_BLK_DEV_IO_TRACE is not set
-# CONFIG_BLK_DEV_IT8213 is not set
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_JMICRON is not set
-# CONFIG_BLK_DEV_LOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_OFFBOARD is not set
-# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PIIX is not set
-# CONFIG_BLK_DEV_PLATFORM is not set
-# CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_RZ1000 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-# CONFIG_BLK_DEV_SD is not set
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SIS5513 is not set
-# CONFIG_BLK_DEV_SL82C105 is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_SR is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_TC86C001 is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_UB is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-CONFIG_BLK_DEV=y
-CONFIG_BLOCK=y
-# CONFIG_BNX2 is not set
-# CONFIG_BONDING is not set
-# CONFIG_BPQETHER is not set
-# CONFIG_BRIDGE_EBT_802_3 is not set
-# CONFIG_BRIDGE_EBT_AMONG is not set
-# CONFIG_BRIDGE_EBT_ARP is not set
-# CONFIG_BRIDGE_EBT_ARPREPLY is not set
-# CONFIG_BRIDGE_EBT_BROUTE is not set
-# CONFIG_BRIDGE_EBT_DNAT is not set
-# CONFIG_BRIDGE_EBT_IP is not set
-# CONFIG_BRIDGE_EBT_LIMIT is not set
-# CONFIG_BRIDGE_EBT_LOG is not set
-# CONFIG_BRIDGE_EBT_MARK is not set
-# CONFIG_BRIDGE_EBT_MARK_T is not set
-# CONFIG_BRIDGE_EBT_NFLOG is not set
-# CONFIG_BRIDGE_EBT_PKTTYPE is not set
-# CONFIG_BRIDGE_EBT_REDIRECT is not set
-# CONFIG_BRIDGE_EBT_SNAT is not set
-# CONFIG_BRIDGE_EBT_STP is not set
-# CONFIG_BRIDGE_EBT_T_FILTER is not set
-# CONFIG_BRIDGE_EBT_T_NAT is not set
-# CONFIG_BRIDGE_EBT_ULOG is not set
-# CONFIG_BRIDGE_EBT_VLAN is not set
-# CONFIG_BRIDGE_NETFILTER is not set
-# CONFIG_BRIDGE_NF_EBTABLES is not set
-CONFIG_BRIDGE=y
-# CONFIG_BROADCOM_PHY is not set
-CONFIG_BROKEN_ON_SMP=y
-CONFIG_BSD_DISKLABEL=y
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BT_BNEP is not set
-CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
-# CONFIG_BT_CMTP is not set
-# CONFIG_BT_HCIBCM203X is not set
-# CONFIG_BT_HCIBFUSB is not set
-# CONFIG_BT_HCIBLUECARD is not set
-# CONFIG_BT_HCIBPA10X is not set
-# CONFIG_BT_HCIBT3C is not set
-# CONFIG_BT_HCIBTSDIO is not set
-# CONFIG_BT_HCIBTUART is not set
-# CONFIG_BT_HCIDTL1 is not set
-CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIUART_H4=y
-# CONFIG_BT_HCIUART is not set
-# CONFIG_BT_HCIUART_LL is not set
-# CONFIG_BT_HCIUSB is not set
-CONFIG_BT_HCIUSB_SCO=y
-# CONFIG_BT_HCIVHCI is not set
-# CONFIG_BT_HIDP is not set
-# CONFIG_BT is not set
-# CONFIG_BT_L2CAP is not set
-# CONFIG_BT_RFCOMM is not set
-CONFIG_BT_RFCOMM_TTY=y
-# CONFIG_BT_SCO is not set
-CONFIG_BUG=y
-# CONFIG_CAN is not set
-# CONFIG_CAPI_AVM is not set
-# CONFIG_CAPI_EICON is not set
-# CONFIG_CAPI_TRACE is not set
-CONFIG_CARDBUS=y
-# CONFIG_CARDMAN_4000 is not set
-# CONFIG_CARDMAN_4040 is not set
-# CONFIG_CASSINI is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_CFG80211 is not set
-# CONFIG_CGROUPS is not set
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_CHELSIO_T3 is not set
-# CONFIG_CHR_DEV_OSST is not set
-# CONFIG_CHR_DEV_SCH is not set
-# CONFIG_CHR_DEV_SG is not set
-# CONFIG_CHR_DEV_ST is not set
-# CONFIG_CICADA_PHY is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
-# CONFIG_CIFS is not set
-CONFIG_CIFS_POSIX=y
-# CONFIG_CIFS_STATS2 is not set
-CONFIG_CIFS_STATS=y
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# CONFIG_CIFS_XATTR is not set
-CONFIG_CLS_U32_MARK=y
-CONFIG_CLS_U32_PERF=y
-CONFIG_CMDLINE=""
-# CONFIG_CODA_FS is not set
-# CONFIG_COMPAT_BRK is not set
-# CONFIG_CONFIGFS_FS is not set
-# CONFIG_CONNECTOR is not set
-# CONFIG_CPU_FREQ is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_CRC7 is not set
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC_ITU_T is not set
-CONFIG_CROSSCOMPILE=y
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_ALGAPI is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_AUTHENC is not set
-# CONFIG_CRYPTO_BLKCIPHER is not set
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_CAMELLIA is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_CBC is not set
-# CONFIG_CRYPTO_CCM is not set
-# CONFIG_CRYPTO_CRC32C is not set
-# CONFIG_CRYPTO_CRYPTD is not set
-# CONFIG_CRYPTO_CTR is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_DES is not set
-# CONFIG_CRYPTO_ECB is not set
-# CONFIG_CRYPTO_FCRYPT is not set
-# CONFIG_CRYPTO_GCM is not set
-# CONFIG_CRYPTO_GF128MUL is not set
-# CONFIG_CRYPTO_HASH is not set
-# CONFIG_CRYPTO_HMAC is not set
-# CONFIG_CRYPTO_HW is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_LRW is not set
-# CONFIG_CRYPTO_LZO is not set
-# CONFIG_CRYPTO_MANAGER is not set
-# CONFIG_CRYPTO_MD4 is not set
-# CONFIG_CRYPTO_MD5 is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_PCBC is not set
-# CONFIG_CRYPTO_SALSA20 is not set
-# CONFIG_CRYPTO_SEED is not set
-# CONFIG_CRYPTO_SEQIV is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_SHA1 is not set
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_TEST is not set
-# CONFIG_CRYPTO_TGR192 is not set
-# CONFIG_CRYPTO_TWOFISH_COMMON is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_XCBC is not set
-# CONFIG_CRYPTO_XTS is not set
-CONFIG_CRYPTO=y
-# CONFIG_DAB is not set
-# CONFIG_DAVICOM_PHY is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_KERNEL is not set
-# CONFIG_DECNET is not set
-# CONFIG_DEFAULT_AS is not set
-# CONFIG_DEFAULT_BIC is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_CUBIC is not set
-CONFIG_DEFAULT_DEADLINE=y
-# CONFIG_DEFAULT_HTCP is not set
-CONFIG_DEFAULT_IOSCHED="deadline"
-# CONFIG_DEFAULT_NOOP is not set
-# CONFIG_DEFAULT_RENO is not set
-CONFIG_DEFAULT_TCP_CONG="westwood"
-# CONFIG_DEFAULT_VEGAS is not set
-CONFIG_DEFAULT_WESTWOOD=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-# CONFIG_DEVFS_DEBUG is not set
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DGRS is not set
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_DISPLAY_SUPPORT is not set
-# CONFIG_DL2K is not set
-# CONFIG_DLM is not set
-# CONFIG_DMA_ENGINE is not set
-# CONFIG_DNOTIFY is not set
-# CONFIG_DRM is not set
-# CONFIG_DS1682 is not set
-# CONFIG_DTLK is not set
-# CONFIG_DUMMY is not set
-# CONFIG_DVB_CORE is not set
-# CONFIG_DVB is not set
-# CONFIG_E1000E is not set
-# CONFIG_E1000 is not set
-# CONFIG_E100 is not set
-# CONFIG_ECONET is not set
-# CONFIG_EEPRO100 is not set
-# CONFIG_EEPROM_93CX6 is not set
-# CONFIG_EFI_PARTITION is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_ELF_CORE is not set
-CONFIG_EMBEDDED=y
-# CONFIG_ENABLE_MUST_CHECK is not set
-CONFIG_ENABLE_WARN_DEPRECATED=y
-# CONFIG_ENC28J60 is not set
-# CONFIG_ENCLOSURE_SERVICES is not set
-# CONFIG_EPIC100 is not set
-CONFIG_EPOLL=y
-# CONFIG_EQUALIZER is not set
-CONFIG_EVENTFD=y
-CONFIG_EXPERIMENTAL=y
-# CONFIG_EXPORTFS is not set
-# CONFIG_EXT2_FS is not set
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_EXT3_FS_XATTR is not set
-# CONFIG_EXT4DEV_FS is not set
-# CONFIG_FAIR_GROUP_SCHED is not set
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_FAT_FS is not set
-# CONFIG_FB_IBM_GXT4500 is not set
-# CONFIG_FB is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FDDI is not set
-# CONFIG_FEALNX is not set
-CONFIG_FIB_RULES=y
-# CONFIG_FIREWIRE is not set
-# CONFIG_FIXED_PHY is not set
-CONFIG_FLATMEM_MANUAL=y
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_FORCEDETH is not set
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_FTL is not set
-# CONFIG_FUSE_FS is not set
-# CONFIG_FUSION_FC is not set
-# CONFIG_FUSION is not set
-# CONFIG_FUSION_SAS is not set
-# CONFIG_FUSION_SPI is not set
-CONFIG_FUTEX=y
-CONFIG_FW_LOADER=y
-CONFIG_GACT_PROB=y
-# CONFIG_GAMEPORT is not set
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_TIME=y
-# CONFIG_GFS2_FS is not set
-# CONFIG_GPIO_DEVICE is not set
-# CONFIG_GROUP_SCHED is not set
-# CONFIG_HAMACHI is not set
-CONFIG_HAMRADIO=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_HEADERS_CHECK is not set
-# CONFIG_HERMES is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_HID_DEBUG is not set
-# CONFIG_HID_FF is not set
-# CONFIG_HID is not set
-# CONFIG_HIDRAW is not set
-# CONFIG_HID_SUPPORT is not set
-CONFIG_HIGH_RES_TIMERS=y
-# CONFIG_HIPPI is not set
-# CONFIG_HOSTAP_CS is not set
-# CONFIG_HOSTAP is not set
-# CONFIG_HOSTAP_PCI is not set
-# CONFIG_HOSTAP_PLX is not set
-# CONFIG_HOTPLUG_CPU is not set
-# CONFIG_HOTPLUG_PCI is not set
-CONFIG_HOTPLUG=y
-# CONFIG_HP100 is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_HUGETLB_PAGE is not set
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-CONFIG_HZ=100
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ_100=y
-# CONFIG_HZ_1024 is not set
-# CONFIG_HZ_128 is not set
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_256 is not set
-# CONFIG_HZ_300 is not set
-# CONFIG_HZ_48 is not set
-# CONFIG_I2C_ALGOPCA is not set
-# CONFIG_I2C_ALGOPCF is not set
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_CHARDEV is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_ELEKTOR is not set
-# CONFIG_I2C_GPIO is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-# CONFIG_I2C_IBM_IIC is not set
-# CONFIG_I2C is not set
-# CONFIG_I2C_MPC is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_OCORES is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PCA_ISA is not set
-# CONFIG_I2C_PCA is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_I2C_SIMTEC is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_TAOS_EVM is not set
-# CONFIG_I2C_TINY_USB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2O is not set
-# CONFIG_I82092 is not set
-# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-# CONFIG_IBM_NEW_EMAC_RGMII is not set
-# CONFIG_IBM_NEW_EMAC_TAH is not set
-# CONFIG_IBM_NEW_EMAC_ZMII is not set
-# CONFIG_ICPLUS_PHY is not set
-# CONFIG_IDEDISK_MULTI_MODE is not set
-# CONFIG_IDEDMA_IVB is not set
-# CONFIG_IDEDMA_ONLYDISK is not set
-CONFIG_IDE_MAX_HWIFS=4
-# CONFIG_IDEPCI_SHARE_IRQ is not set
-CONFIG_IDE_PROC_FS=y
-# CONFIG_IDE_TASK_IOCTL is not set
-# CONFIG_IEEE1394_DV1394 is not set
-# CONFIG_IEEE1394_ETH1394 is not set
-# CONFIG_IEEE1394 is not set
-# CONFIG_IEEE1394_OHCI1394 is not set
-# CONFIG_IEEE1394_PCILYNX is not set
-# CONFIG_IEEE1394_RAWIO is not set
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-# CONFIG_IEEE1394_VIDEO1394 is not set
-# CONFIG_IEEE80211_CRYPT_CCMP is not set
-# CONFIG_IEEE80211_CRYPT_TKIP is not set
-# CONFIG_IEEE80211_CRYPT_WEP is not set
-# CONFIG_IEEE80211_DEBUG is not set
-# CONFIG_IEEE80211 is not set
-# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
-# CONFIG_IEEE80211_SOFTMAC is not set
-# CONFIG_IFB is not set
-# CONFIG_IGB is not set
-# CONFIG_IKCONFIG is not set
-# CONFIG_IKCONFIG_PROC is not set
-# CONFIG_IMQ_BEHAVIOR_AA is not set
-# CONFIG_IMQ_BEHAVIOR_AB is not set
-CONFIG_IMQ_BEHAVIOR_BA=y
-# CONFIG_IMQ_BEHAVIOR_BB is not set
-# CONFIG_IMQ is not set
-CONFIG_IMQ_NUM_DEVS=2
-# CONFIG_INET6_AH is not set
-# CONFIG_INET6_ESP is not set
-# CONFIG_INET6_IPCOMP is not set
-# CONFIG_INET6_TUNNEL is not set
-# CONFIG_INET6_XFRM_MODE_BEET is not set
-# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET6_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_LRO is not set
-# CONFIG_INET_TCP_DIAG is not set
-# CONFIG_INET_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-CONFIG_INET=y
-# CONFIG_INFINIBAND is not set
-# CONFIG_INFTL is not set
-CONFIG_INIT_ENV_ARG_LIMIT=32
-# CONFIG_INOTIFY is not set
-# CONFIG_INOTIFY_USER is not set
-# CONFIG_INPUT_ATI_REMOTE2 is not set
-# CONFIG_INPUT_ATI_REMOTE is not set
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_FF_MEMLESS is not set
-# CONFIG_INPUT is not set
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-CONFIG_INPUT_MISC=y
-# CONFIG_INPUT_MOUSEDEV is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_PCSPKR is not set
-# CONFIG_INPUT_POLLDEV is not set
-# CONFIG_INPUT_POWERMATE is not set
-# CONFIG_INPUT_TABLET is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_UINPUT is not set
-# CONFIG_INPUT_WISTRON_BTNS is not set
-# CONFIG_INSTRUMENTATION is not set
-# CONFIG_IOSCHED_AS is not set
-# CONFIG_IOSCHED_CFQ is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IP1000 is not set
-# CONFIG_IP6_NF_FILTER is not set
-# CONFIG_IP6_NF_IPTABLES is not set
-# CONFIG_IP6_NF_MANGLE is not set
-# CONFIG_IP6_NF_MATCH_AH is not set
-# CONFIG_IP6_NF_MATCH_EUI64 is not set
-# CONFIG_IP6_NF_MATCH_FRAG is not set
-# CONFIG_IP6_NF_MATCH_HL is not set
-# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
-# CONFIG_IP6_NF_MATCH_LIMIT is not set
-# CONFIG_IP6_NF_MATCH_MH is not set
-# CONFIG_IP6_NF_MATCH_OPTS is not set
-# CONFIG_IP6_NF_MATCH_OWNER is not set
-# CONFIG_IP6_NF_MATCH_RT is not set
-# CONFIG_IP6_NF_QUEUE is not set
-# CONFIG_IP6_NF_RAW is not set
-# CONFIG_IP6_NF_TARGET_HL is not set
-# CONFIG_IP6_NF_TARGET_IMQ is not set
-# CONFIG_IP6_NF_TARGET_LOG is not set
-# CONFIG_IP6_NF_TARGET_REJECT is not set
-# CONFIG_IP6_NF_TARGET_ROUTE is not set
-CONFIG_IP_ADVANCED_ROUTER=y
-# CONFIG_IPC_NS is not set
-# CONFIG_IP_DCCP is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_FIB_TRIE is not set
-# CONFIG_IPMI_HANDLER is not set
-CONFIG_IP_MROUTE=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_MULTIPLE_TABLES=y
-# CONFIG_IP_NF_AMANDA is not set
-# CONFIG_IP_NF_ARPFILTER is not set
-# CONFIG_IP_NF_ARP_MANGLE is not set
-# CONFIG_IP_NF_ARPTABLES is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CONNTRACK_MARK=y
-CONFIG_IP_NF_CONNTRACK=y
-CONFIG_IP_NF_CT_ACCT=y
-# CONFIG_IP_NF_CT_PROTO_SCTP is not set
-# CONFIG_IP_NF_FILTER is not set
-# CONFIG_IP_NF_FTP is not set
-# CONFIG_IP_NF_H323 is not set
-# CONFIG_IP_NF_IPTABLES is not set
-# CONFIG_IP_NF_IRC is not set
-# CONFIG_IP_NF_MANGLE is not set
-# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
-# CONFIG_IP_NF_MATCH_AH is not set
-# CONFIG_IP_NF_MATCH_ECN is not set
-# CONFIG_IP_NF_MATCH_HASHLIMIT is not set
-# CONFIG_IP_NF_MATCH_IPP2P is not set
-# CONFIG_IP_NF_MATCH_OWNER is not set
-# CONFIG_IP_NF_MATCH_RECENT is not set
-# CONFIG_IP_NF_MATCH_SET is not set
-# CONFIG_IP_NF_MATCH_TIME is not set
-# CONFIG_IP_NF_MATCH_TOS is not set
-# CONFIG_IP_NF_MATCH_TTL is not set
-# CONFIG_IP_NF_NAT_AMANDA is not set
-# CONFIG_IP_NF_NAT_FTP is not set
-# CONFIG_IP_NF_NAT_H323 is not set
-# CONFIG_IP_NF_NAT_IRC is not set
-CONFIG_IP_NF_NAT_NEEDED=y
-# CONFIG_IP_NF_NAT_PPTP is not set
-# CONFIG_IP_NF_NAT_SIP is not set
-# CONFIG_IP_NF_NAT_SNMP_BASIC is not set
-# CONFIG_IP_NF_NAT_TFTP is not set
-CONFIG_IP_NF_NAT=y
-# CONFIG_IP_NF_NETBIOS_NS is not set
-# CONFIG_IP_NF_PPTP is not set
-# CONFIG_IP_NF_QUEUE is not set
-# CONFIG_IP_NF_RAW is not set
-CONFIG_IP_NF_SET_HASHSIZE=1024
-# CONFIG_IP_NF_SET_IPHASH is not set
-# CONFIG_IP_NF_SET_IPMAP is not set
-# CONFIG_IP_NF_SET_IPPORTHASH is not set
-# CONFIG_IP_NF_SET_IPTREE is not set
-# CONFIG_IP_NF_SET_IPTREEMAP is not set
-# CONFIG_IP_NF_SET is not set
-# CONFIG_IP_NF_SET_MACIPMAP is not set
-CONFIG_IP_NF_SET_MAX=256
-# CONFIG_IP_NF_SET_NETHASH is not set
-# CONFIG_IP_NF_SET_PORTMAP is not set
-# CONFIG_IP_NF_SIP is not set
-# CONFIG_IP_NF_TARGET_CLUSTERIP is not set
-# CONFIG_IP_NF_TARGET_ECN is not set
-# CONFIG_IP_NF_TARGET_IMQ is not set
-# CONFIG_IP_NF_TARGET_LOG is not set
-# CONFIG_IP_NF_TARGET_MASQUERADE is not set
-# CONFIG_IP_NF_TARGET_NETMAP is not set
-# CONFIG_IP_NF_TARGET_REDIRECT is not set
-# CONFIG_IP_NF_TARGET_REJECT is not set
-# CONFIG_IP_NF_TARGET_ROUTE is not set
-# CONFIG_IP_NF_TARGET_SAME is not set
-# CONFIG_IP_NF_TARGET_SET is not set
-# CONFIG_IP_NF_TARGET_TOS is not set
-# CONFIG_IP_NF_TARGET_TTL is not set
-# CONFIG_IP_NF_TARGET_ULOG is not set
-# CONFIG_IP_NF_TFTP is not set
-# CONFIG_IP_PIMSM_V1 is not set
-# CONFIG_IP_PIMSM_V2 is not set
-# CONFIG_IP_PNP is not set
-CONFIG_IP_ROUTE_FWMARK=y
-CONFIG_IP_ROUTE_MULTIPATH_CACHED=y
-# CONFIG_IP_ROUTE_MULTIPATH_DRR is not set
-# CONFIG_IP_ROUTE_MULTIPATH_RANDOM is not set
-# CONFIG_IP_ROUTE_MULTIPATH_RR is not set
-# CONFIG_IP_ROUTE_MULTIPATH_WRANDOM is not set
-CONFIG_IP_ROUTE_MULTIPATH=y
-CONFIG_IP_ROUTE_VERBOSE=y
-# CONFIG_IP_SCTP is not set
-CONFIG_IPSEC_NAT_TRAVERSAL=y
-# CONFIG_IPV6 is not set
-# CONFIG_IPV6_MIP6 is not set
-# CONFIG_IPV6_MROUTE is not set
-# CONFIG_IPV6_MULTIPLE_TABLES is not set
-# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTE_INFO is not set
-CONFIG_IPV6_ROUTER_PREF=y
-# CONFIG_IPV6_SIT is not set
-# CONFIG_IPV6_TUNNEL is not set
-# CONFIG_IP_VS is not set
-# CONFIG_IPW2100_DEBUG is not set
-# CONFIG_IPW2100 is not set
-CONFIG_IPW2100_MONITOR=y
-# CONFIG_IPW2200_DEBUG is not set
-# CONFIG_IPW2200 is not set
-CONFIG_IPW2200_MONITOR=y
-# CONFIG_IPW2200_PROMISCUOUS is not set
-# CONFIG_IPW2200_QOS is not set
-# CONFIG_IPW2200_RADIOTAP is not set
-# CONFIG_IPX is not set
-# CONFIG_IRDA is not set
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_ISDN is not set
-# CONFIG_ISO9660_FS is not set
-# CONFIG_IXGB is not set
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_JBD is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_FS_DEBUG=0
-# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-# CONFIG_JFFS2_FS_XATTR is not set
-CONFIG_JFFS2_FS=y
-# CONFIG_JFFS2_LZO is not set
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_ZLIB=y
-# CONFIG_JFFS_FS is not set
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_JFS_POSIX_ACL is not set
-# CONFIG_JFS_SECURITY is not set
-# CONFIG_JFS_STATISTICS is not set
-CONFIG_JOLIET=y
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-# CONFIG_KALLSYMS is not set
-# CONFIG_KARMA_PARTITION is not set
-# CONFIG_KEXEC is not set
-# CONFIG_KEYS is not set
-CONFIG_KMOD=y
-# CONFIG_LAPB is not set
-# CONFIG_LASAT is not set
-CONFIG_LBD=y
-# CONFIG_LDM_PARTITION is not set
-CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
-CONFIG_LEDS_TRIGGER_HEARTBEAT=y
-# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
-# CONFIG_LEDS_TRIGGER_MORSE is not set
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_LIBCRC32C is not set
-# CONFIG_LIBERTAS is not set
-# CONFIG_LIBERTAS_USB is not set
-# CONFIG_LLC2 is not set
-CONFIG_LLC=y
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_LOCKDEP_SUPPORT=y
-# CONFIG_LOCKD is not set
-CONFIG_LOCKD_V4=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_LSF is not set
-# CONFIG_LXT_PHY is not set
-# CONFIG_MAC80211_DEBUG is not set
-# CONFIG_MAC80211 is not set
-# CONFIG_MAC80211_LEDS is not set
-# CONFIG_MAC_EMUMOUSEBTN is not set
-# CONFIG_MAC_PARTITION is not set
-# CONFIG_MACVLAN is not set
-# CONFIG_MAGIC_SYSRQ is not set
-# CONFIG_MARKEINS is not set
-# CONFIG_MARKERS is not set
-# CONFIG_MARVELL_PHY is not set
-# CONFIG_MDIO_BITBANG is not set
-# CONFIG_MD is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_MFD_ASIC3 is not set
-# CONFIG_MFD_SM501 is not set
-CONFIG_MII=y
-CONFIG_MINI_FO=y
-# CONFIG_MINIX_FS is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_MIPS_FPU_EMU is not set
-CONFIG_MISC_DEVICES=y
-# CONFIG_MKISS is not set
-# CONFIG_MMC_ARMMMCI is not set
-# CONFIG_MMC_AT91 is not set
-CONFIG_MMC_BLOCK_BOUNCE=y
-# CONFIG_MMC_BLOCK is not set
-# CONFIG_MMC_DEBUG is not set
-# CONFIG_MMC is not set
-# CONFIG_MMC_UNSAFE_RESUME is not set
-CONFIG_MMU=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MOUSE_APPLETOUCH is not set
-# CONFIG_MOUSE_INPORT is not set
-# CONFIG_MOUSE_LOGIBM is not set
-# CONFIG_MOUSE_PC110PAD is not set
-# CONFIG_MSDOS_FS is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_AFS_PARTS is not set
-# CONFIG_MTD_ARM_INTEGRATOR is not set
-CONFIG_MTD_BLKDEVS=y
-# CONFIG_MTD_BLOCK2MTD is not set
-CONFIG_MTD_BLOCK=y
-# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-CONFIG_MTD_CFI_AMDSTD=y
-# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
-CONFIG_MTD_CFI_INTELEXT=y
-# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-CONFIG_MTD_CFI_NOSWAP=y
-# CONFIG_MTD_CFI_STAA is not set
-CONFIG_MTD_CFI_UTIL=y
-CONFIG_MTD_CFI=y
-CONFIG_MTD_CHAR=y
-# CONFIG_MTD_CMDLINE_PARTS is not set
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_CONCAT is not set
-# CONFIG_MTD_DATAFLASH is not set
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-CONFIG_MTD_GEN_PROBE=y
-# CONFIG_MTD_INTEL_VR_NOR is not set
-# CONFIG_MTD_JEDECPROBE is not set
-# CONFIG_MTD_LPDDR is not set
-# CONFIG_MTD_M25P80 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_NAND_CAFE is not set
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-# CONFIG_MTD_NAND_ECC_SMC is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND is not set
-# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-# CONFIG_MTD_NAND_NANDSIM is not set
-# CONFIG_MTD_NAND_PLATFORM is not set
-# CONFIG_MTD_NAND_VERIFY_WRITE is not set
-# CONFIG_MTD_ONENAND is not set
-# CONFIG_MTD_OOPS is not set
-# CONFIG_MTD_OTP is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_PCI is not set
-# CONFIG_MTD_PHRAM is not set
-# CONFIG_MTD_PHYSMAP is not set
-# CONFIG_MTD_PLATRAM is not set
-# CONFIG_MTD_PMC551 is not set
-# CONFIG_MTD_RAM is not set
-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_REDBOOT_PARTS_READONLY=y
-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-# CONFIG_MTD_ROM is not set
-CONFIG_MTD_ROOTFS_ROOT_DEV=y
-CONFIG_MTD_ROOTFS_SPLIT=y
-# CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_UBI is not set
-CONFIG_MTD=y
-# CONFIG_MVSWITCH_PHY is not set
-# CONFIG_MWAVE is not set
-# CONFIG_MYRI10GE is not set
-# CONFIG_NAMESPACES is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_NET_9P is not set
-# CONFIG_NET_ACT_GACT is not set
-# CONFIG_NET_ACT_IPT is not set
-# CONFIG_NET_ACT_MIRRED is not set
-# CONFIG_NET_ACT_NAT is not set
-# CONFIG_NET_ACT_PEDIT is not set
-CONFIG_NET_ACT_POLICE=y
-# CONFIG_NET_ACT_SIMP is not set
-CONFIG_NET_CLS_ACT=y
-# CONFIG_NET_CLS_BASIC is not set
-# CONFIG_NET_CLS_FLOW is not set
-# CONFIG_NET_CLS_FW is not set
-CONFIG_NET_CLS_IND=y
-CONFIG_NET_CLS_POLICE=y
-# CONFIG_NET_CLS_ROUTE4 is not set
-CONFIG_NET_CLS_ROUTE=y
-# CONFIG_NET_CLS_RSVP6 is not set
-# CONFIG_NET_CLS_RSVP is not set
-# CONFIG_NET_CLS_TCINDEX is not set
-# CONFIG_NET_CLS_U32 is not set
-CONFIG_NET_CLS=y
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETDEBUG is not set
-# CONFIG_NETDEV_10000 is not set
-CONFIG_NETDEV_1000=y
-# CONFIG_NETDEVICES_MULTIQUEUE is not set
-CONFIG_NETDEVICES=y
-# CONFIG_NET_EMATCH_CMP is not set
-# CONFIG_NET_EMATCH_META is not set
-# CONFIG_NET_EMATCH_NBYTE is not set
-CONFIG_NET_EMATCH_STACK=32
-# CONFIG_NET_EMATCH_TEXT is not set
-# CONFIG_NET_EMATCH_U32 is not set
-CONFIG_NET_EMATCH=y
-CONFIG_NET_ESTIMATOR=y
-CONFIG_NET_ETHERNET=y
-# CONFIG_NET_FC is not set
-CONFIG_NETFILTER_ADVANCED=y
-# CONFIG_NETFILTER_DEBUG is not set
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_NETLINK_LOG is not set
-# CONFIG_NETFILTER_NETLINK_QUEUE is not set
-# CONFIG_NETFILTER_XTABLES is not set
-# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set
-# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
-# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
-# CONFIG_NETFILTER_XT_MATCH_ESP is not set
-# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_HELPER is not set
-# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
-# CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG is not set
-# CONFIG_NETFILTER_XT_MATCH_LAYER7 is not set
-# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
-# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_MAC is not set
-# CONFIG_NETFILTER_XT_MATCH_MARK is not set
-# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
-# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
-# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
-# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
-# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
-# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
-# CONFIG_NETFILTER_XT_MATCH_REALM is not set
-# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
-# CONFIG_NETFILTER_XT_MATCH_STATE is not set
-# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
-# CONFIG_NETFILTER_XT_MATCH_STRING is not set
-# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
-# CONFIG_NETFILTER_XT_MATCH_TIME is not set
-# CONFIG_NETFILTER_XT_MATCH_U32 is not set
-# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
-# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
-# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
-# CONFIG_NETFILTER_XT_TARGET_MARK is not set
-# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
-# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
-# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
-# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
-# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
-CONFIG_NETFILTER=y
-CONFIG_NET_IPGRE_BROADCAST=y
-# CONFIG_NET_IPGRE is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_ISA is not set
-# CONFIG_NET_KEY is not set
-# CONFIG_NET_KEY_MIGRATE is not set
-CONFIG_NET_PCI=y
-# CONFIG_NET_PCMCIA is not set
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_NETPOLL is not set
-CONFIG_NET_RADIO=y
-# CONFIG_NETROM is not set
-# CONFIG_NET_SB1000 is not set
-# CONFIG_NET_SCH_ATM is not set
-# CONFIG_NET_SCH_CBQ is not set
-# CONFIG_NET_SCH_CLK_CPU is not set
-# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
-CONFIG_NET_SCH_CLK_JIFFIES=y
-# CONFIG_NET_SCH_DSMARK is not set
-CONFIG_NET_SCHED=y
-# CONFIG_NET_SCH_ESFQ is not set
-CONFIG_NET_SCH_ESFQ_NFCT=y
-CONFIG_NET_SCH_FIFO=y
-# CONFIG_NET_SCH_GRED is not set
-# CONFIG_NET_SCH_HFSC is not set
-# CONFIG_NET_SCH_HTB is not set
-# CONFIG_NET_SCH_INGRESS is not set
-# CONFIG_NET_SCH_NETEM is not set
-# CONFIG_NET_SCH_PRIO is not set
-# CONFIG_NET_SCH_RED is not set
-# CONFIG_NET_SCH_RR is not set
-# CONFIG_NET_SCH_SFQ is not set
-# CONFIG_NET_SCH_TBF is not set
-# CONFIG_NET_SCH_TEQL is not set
-# CONFIG_NET_TULIP is not set
-CONFIG_NET_WIRELESS_RTNETLINK=y
-CONFIG_NET_WIRELESS=y
-CONFIG_NETWORK_FILESYSTEMS=y
-# CONFIG_NETWORK_SECMARK is not set
-# CONFIG_NETXEN_NIC is not set
-CONFIG_NET=y
-# CONFIG_NEW_GPIO is not set
-CONFIG_NEW_LEDS=y
-# CONFIG_NF_CONNTRACK_AMANDA is not set
-CONFIG_NF_CONNTRACK_ENABLED=y
-# CONFIG_NF_CONNTRACK_EVENTS is not set
-# CONFIG_NF_CONNTRACK_FTP is not set
-# CONFIG_NF_CONNTRACK_H323 is not set
-# CONFIG_NF_CONNTRACK_IPV4 is not set
-# CONFIG_NF_CONNTRACK_IPV6 is not set
-# CONFIG_NF_CONNTRACK_IRC is not set
-# CONFIG_NF_CONNTRACK is not set
-CONFIG_NF_CONNTRACK_MARK=y
-# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
-# CONFIG_NF_CONNTRACK_PPTP is not set
-CONFIG_NF_CONNTRACK_PROC_COMPAT=y
-# CONFIG_NF_CONNTRACK_RTSP is not set
-# CONFIG_NF_CONNTRACK_SANE is not set
-# CONFIG_NF_CONNTRACK_SIP is not set
-CONFIG_NF_CONNTRACK_SUPPORT=y
-# CONFIG_NF_CONNTRACK_TFTP is not set
-CONFIG_NF_CT_ACCT=y
-# CONFIG_NF_CT_NETLINK is not set
-# CONFIG_NF_CT_PROTO_GRE is not set
-# CONFIG_NF_CT_PROTO_SCTP is not set
-# CONFIG_NF_CT_PROTO_UDPLITE is not set
-# CONFIG_NF_NAT_AMANDA is not set
-# CONFIG_NF_NAT_FTP is not set
-# CONFIG_NF_NAT_H323 is not set
-# CONFIG_NF_NAT_IRC is not set
-# CONFIG_NF_NAT is not set
-CONFIG_NF_NAT_NEEDED=y
-# CONFIG_NF_NAT_PPTP is not set
-# CONFIG_NF_NAT_PROTO_GRE is not set
-# CONFIG_NF_NAT_RTSP is not set
-# CONFIG_NF_NAT_SIP is not set
-# CONFIG_NF_NAT_SNMP_BASIC is not set
-# CONFIG_NF_NAT_TFTP is not set
-# CONFIG_NFS_ACL_SUPPORT is not set
-CONFIG_NFS_COMMON=y
-# CONFIG_NFS_DIRECTIO is not set
-# CONFIG_NFSD is not set
-CONFIG_NFSD_TCP=y
-# CONFIG_NFSD_V2_ACL is not set
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V4 is not set
-# CONFIG_NFS_FS is not set
-# CONFIG_NFS_V3_ACL is not set
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFTL is not set
-# CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-# CONFIG_NO_HZ is not set
-# CONFIG_NORTEL_HERMES is not set
-# CONFIG_NOZOMI is not set
-# CONFIG_NS83820 is not set
-# CONFIG_NTFS_DEBUG is not set
-# CONFIG_NTFS_FS is not set
-# CONFIG_NTFS_RW is not set
-# CONFIG_NVRAM is not set
-# CONFIG_OCF_BENCH is not set
-# CONFIG_OCF_EP80579 is not set
-# CONFIG_OCF_HIFNHIPP is not set
-# CONFIG_OCF_HIFN is not set
-# CONFIG_OCF_IXP4XX is not set
-# CONFIG_OCF_OCF is not set
-# CONFIG_OCF_OCFNULL is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_OCF_SAFE is not set
-# CONFIG_OCF_TALITOS is not set
-# CONFIG_OSF_PARTITION is not set
-CONFIG_PACKET_MMAP=y
-CONFIG_PACKET=y
-# CONFIG_PAGE_SIZE_16KB is not set
-CONFIG_PAGE_SIZE_4KB=y
-# CONFIG_PAGE_SIZE_64KB is not set
-# CONFIG_PAGE_SIZE_8KB is not set
-# CONFIG_PARPORT is not set
-# CONFIG_PARPORT_PC is not set
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_PATA_ALI is not set
-# CONFIG_PATA_AMD is not set
-# CONFIG_PATA_ARTOP is not set
-# CONFIG_PATA_ATIIXP is not set
-# CONFIG_PATA_CMD640_PCI is not set
-# CONFIG_PATA_CMD64X is not set
-# CONFIG_PATA_CS5520 is not set
-# CONFIG_PATA_CS5530 is not set
-# CONFIG_PATA_CS5535 is not set
-# CONFIG_PATA_CYPRESS is not set
-# CONFIG_PATA_EFAR is not set
-# CONFIG_PATA_HPT366 is not set
-# CONFIG_PATA_HPT37X is not set
-# CONFIG_PATA_HPT3X2N is not set
-# CONFIG_PATA_HPT3X3 is not set
-# CONFIG_PATA_ISAPNP is not set
-# CONFIG_PATA_IT8213 is not set
-# CONFIG_PATA_IT821X is not set
-# CONFIG_PATA_JMICRON is not set
-# CONFIG_PATA_LEGACY is not set
-# CONFIG_PATA_MARVELL is not set
-# CONFIG_PATA_MPIIX is not set
-# CONFIG_PATA_NETCELL is not set
-# CONFIG_PATA_NINJA32 is not set
-# CONFIG_PATA_NS87410 is not set
-# CONFIG_PATA_NS87415 is not set
-# CONFIG_PATA_OLDPIIX is not set
-# CONFIG_PATA_OPTIDMA is not set
-# CONFIG_PATA_OPTI is not set
-# CONFIG_PATA_PCMCIA is not set
-# CONFIG_PATA_PDC2027X is not set
-# CONFIG_PATA_PDC_OLD is not set
-# CONFIG_PATA_PLATFORM is not set
-# CONFIG_PATA_QDI is not set
-# CONFIG_PATA_RADISYS is not set
-# CONFIG_PATA_RZ1000 is not set
-# CONFIG_PATA_SC1200 is not set
-# CONFIG_PATA_SERVERWORKS is not set
-# CONFIG_PATA_SIL680 is not set
-# CONFIG_PATA_SIS is not set
-# CONFIG_PATA_TRIFLEX is not set
-# CONFIG_PATA_VIA is not set
-# CONFIG_PATA_WINBOND is not set
-# CONFIG_PATA_WINBOND_VLB is not set
-# CONFIG_PC300TOO is not set
-# CONFIG_PCCARD is not set
-# CONFIG_PCF8575 is not set
-# CONFIG_PCI is not set
-# CONFIG_PCI_ATMEL is not set
-# CONFIG_PCI_HERMES is not set
-# CONFIG_PCI_LEGACY is not set
-# CONFIG_PCI_MSI is not set
-CONFIG_PCI_SYSCALL=y
-# CONFIG_PCMCIA_AHA152X is not set
-# CONFIG_PCMCIA_ATMEL is not set
-# CONFIG_PCMCIA_DEBUG is not set
-# CONFIG_PCMCIA_FDOMAIN is not set
-# CONFIG_PCMCIA_HERMES is not set
-# CONFIG_PCMCIA_IOCTL is not set
-# CONFIG_PCMCIA is not set
-# CONFIG_PCMCIA_LOAD_CIS is not set
-# CONFIG_PCMCIA_NETWAVE is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
-# CONFIG_PCMCIA_QLOGIC is not set
-# CONFIG_PCMCIA_RAYCS is not set
-# CONFIG_PCMCIA_SPECTRUM is not set
-# CONFIG_PCMCIA_SYM53C500 is not set
-# CONFIG_PCMCIA_WAVELAN is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_PCNET32 is not set
-# CONFIG_PCSPKR_PLATFORM is not set
-# CONFIG_PD6729 is not set
-# CONFIG_PDC_ADMA is not set
-# CONFIG_PHANTOM is not set
-# CONFIG_PHONE is not set
-# CONFIG_PHYLIB is not set
-# CONFIG_PID_NS is not set
-CONFIG_PLIST=y
-# CONFIG_PLX_HERMES is not set
-# CONFIG_PM is not set
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_POWER_SUPPLY is not set
-# CONFIG_PPP_ASYNC is not set
-# CONFIG_PPP_BSDCOMP is not set
-# CONFIG_PPP_DEFLATE is not set
-CONFIG_PPP_FILTER=y
-# CONFIG_PPP is not set
-# CONFIG_PPP_MPPE is not set
-CONFIG_PPP_MULTILINK=y
-# CONFIG_PPPOATM is not set
-# CONFIG_PPPOE is not set
-# CONFIG_PPPOL2TP is not set
-# CONFIG_PPP_SYNC_TTY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_PRINTK=y
-# CONFIG_PRISM54 is not set
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-# CONFIG_PROC_PAGE_MONITOR is not set
-CONFIG_PROC_SYSCTL=y
-# CONFIG_PROFILING is not set
-# CONFIG_QEMU is not set
-# CONFIG_QLA3XXX is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_QSEMI_PHY is not set
-# CONFIG_QUOTA is not set
-# CONFIG_R3964 is not set
-# CONFIG_R8169 is not set
-# CONFIG_RADIO_ADAPTERS is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_GEMTEK_PCI is not set
-# CONFIG_RADIO_MAESTRO is not set
-# CONFIG_RADIO_MAXIRADIO is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_ZOLTRIX is not set
-# CONFIG_RAID_ATTRS is not set
-CONFIG_RAMFS=y
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_REALTEK_PHY is not set
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_REISERFS_FS_XATTR is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-# CONFIG_RELAY is not set
-# CONFIG_RESOURCES_64BIT is not set
-# CONFIG_RFD_FTL is not set
-# CONFIG_RFKILL is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_ROSE is not set
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_RTC_CLASS is not set
-# CONFIG_RTC_DEBUG is not set
-CONFIG_RTC_DRV_CMOS=y
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1374 is not set
-# CONFIG_RTC_DRV_DS1511 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_M41T80 is not set
-# CONFIG_RTC_DRV_M48T59 is not set
-# CONFIG_RTC_DRV_M48T86 is not set
-# CONFIG_RTC_DRV_MAX6900 is not set
-# CONFIG_RTC_DRV_MAX6902 is not set
-# CONFIG_RTC_DRV_PCF50606 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_R9701 is not set
-# CONFIG_RTC_DRV_RS5C348 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-# CONFIG_RTC_DRV_S35390A is not set
-# CONFIG_RTC_DRV_STK17TA8 is not set
-# CONFIG_RTC_DRV_TEST is not set
-# CONFIG_RTC_DRV_V3020 is not set
-# CONFIG_RTC_DRV_X1205 is not set
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-CONFIG_RTC_HCTOSYS=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-CONFIG_RTC_INTF_DEV=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_LIB=y
-# CONFIG_RTL8187 is not set
-CONFIG_RT_MUTEXES=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-# CONFIG_S2IO is not set
-# CONFIG_SAMPLES is not set
-# CONFIG_SATA_AHCI is not set
-# CONFIG_SATA_INIC162X is not set
-# CONFIG_SATA_MV is not set
-# CONFIG_SATA_NV is not set
-# CONFIG_SATA_PROMISE is not set
-# CONFIG_SATA_QSTOR is not set
-# CONFIG_SATA_SIL24 is not set
-# CONFIG_SATA_SIL is not set
-# CONFIG_SATA_SIS is not set
-# CONFIG_SATA_SVW is not set
-# CONFIG_SATA_SX4 is not set
-# CONFIG_SATA_ULI is not set
-# CONFIG_SATA_VIA is not set
-# CONFIG_SATA_VITESSE is not set
-# CONFIG_SC92031 is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_7000FASST is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC94XX is not set
-# CONFIG_SCSI_ARCMSR is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DEBUG is not set
-CONFIG_SCSI_DMA=y
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DPT_I2O is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_ESP_CORE is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI is not set
-# CONFIG_SCSI_LOGGING is not set
-CONFIG_SCSI_LOWLEVEL=y
-# CONFIG_SCSI_LPFC is not set
-CONFIG_SCSI_MULTI_LUN=y
-# CONFIG_SCSI_MVSAS is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_NETLINK is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_PAS16 is not set
-CONFIG_SCSI_PROC_FS=y
-# CONFIG_SCSI_PSI240I is not set
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_QLA_ISCSI is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-# CONFIG_SCSI_SEAGATE is not set
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_SRP_ATTRS is not set
-# CONFIG_SCSI_SRP is not set
-# CONFIG_SCSI_STEX is not set
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-CONFIG_SCSI_WAIT_SCAN=m
-# CONFIG_SECCOMP is not set
-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-# CONFIG_SECURITY is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-# CONFIG_SENSORS_ABITUGURU3 is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_AD7418 is not set
-# CONFIG_SENSORS_ADM1021 is not set
-# CONFIG_SENSORS_ADM1025 is not set
-# CONFIG_SENSORS_ADM1026 is not set
-# CONFIG_SENSORS_ADM1029 is not set
-# CONFIG_SENSORS_ADM1031 is not set
-# CONFIG_SENSORS_ADM9240 is not set
-# CONFIG_SENSORS_ADS7828 is not set
-# CONFIG_SENSORS_ADT7470 is not set
-# CONFIG_SENSORS_ADT7473 is not set
-# CONFIG_SENSORS_APPLESMC is not set
-# CONFIG_SENSORS_ASB100 is not set
-# CONFIG_SENSORS_ATXP1 is not set
-# CONFIG_SENSORS_CORETEMP is not set
-# CONFIG_SENSORS_DME1737 is not set
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_DS1621 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_F71882FG is not set
-# CONFIG_SENSORS_F75375S is not set
-# CONFIG_SENSORS_FSCHER is not set
-# CONFIG_SENSORS_FSCHMD is not set
-# CONFIG_SENSORS_FSCPOS is not set
-# CONFIG_SENSORS_GL518SM is not set
-# CONFIG_SENSORS_GL520SM is not set
-# CONFIG_SENSORS_HDAPS is not set
-# CONFIG_SENSORS_I5K_AMB is not set
-# CONFIG_SENSORS_IT87 is not set
-# CONFIG_SENSORS_K8TEMP is not set
-# CONFIG_SENSORS_LM63 is not set
-# CONFIG_SENSORS_LM70 is not set
-# CONFIG_SENSORS_LM75 is not set
-# CONFIG_SENSORS_LM77 is not set
-# CONFIG_SENSORS_LM78 is not set
-# CONFIG_SENSORS_LM80 is not set
-# CONFIG_SENSORS_LM83 is not set
-# CONFIG_SENSORS_LM85 is not set
-# CONFIG_SENSORS_LM87 is not set
-# CONFIG_SENSORS_LM90 is not set
-# CONFIG_SENSORS_LM92 is not set
-# CONFIG_SENSORS_LM93 is not set
-# CONFIG_SENSORS_M41T00 is not set
-# CONFIG_SENSORS_MAX1619 is not set
-# CONFIG_SENSORS_MAX6650 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_SENSORS_PC87427 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_SIS5595 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_SMSC47M192 is not set
-# CONFIG_SENSORS_SMSC47M1 is not set
-# CONFIG_SENSORS_THMC50 is not set
-# CONFIG_SENSORS_TSL2550 is not set
-# CONFIG_SENSORS_VIA686A is not set
-# CONFIG_SENSORS_VT1211 is not set
-# CONFIG_SENSORS_VT8231 is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83781D is not set
-# CONFIG_SENSORS_W83791D is not set
-# CONFIG_SENSORS_W83792D is not set
-# CONFIG_SENSORS_W83793 is not set
-# CONFIG_SENSORS_W83L785TS is not set
-# CONFIG_SENSORS_W83L786NG is not set
-CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_SERIAL_8250_CS is not set
-CONFIG_SERIAL_8250_NR_UARTS=2
-# CONFIG_SERIAL_8250_PCI is not set
-CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-# CONFIG_SERIAL_JSM is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_SERIAL_UARTLITE is not set
-# CONFIG_SERIO is not set
-# CONFIG_SGI_IOC4 is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_SHAPER is not set
-CONFIG_SHMEM=y
-CONFIG_SIGNALFD=y
-# CONFIG_SIS190 is not set
-# CONFIG_SIS900 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2 is not set
-CONFIG_SLAB=y
-# CONFIG_SLHC is not set
-# CONFIG_SLIP is not set
-# CONFIG_SLOB is not set
-# CONFIG_SLUB is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_SMB_NLS_DEFAULT is not set
-# CONFIG_SMP is not set
-# CONFIG_SMSC_PHY is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ADLIB is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALS4000 is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_CS5530 is not set
-# CONFIG_SND_CS5535AUDIO is not set
-# CONFIG_SND_DARLA20 is not set
-# CONFIG_SND_DARLA24 is not set
-# CONFIG_SND_DEBUG is not set
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_DYNAMIC_MINORS is not set
-# CONFIG_SND_ECHO3G is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_GINA20 is not set
-# CONFIG_SND_GINA24 is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_HIFIER is not set
-# CONFIG_SND_HWDEP is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-# CONFIG_SND_INDIGODJ is not set
-# CONFIG_SND_INDIGOIO is not set
-# CONFIG_SND_INDIGO is not set
-# CONFIG_SND_INTEL8X0 is not set
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_LAYLA20 is not set
-# CONFIG_SND_LAYLA24 is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIA is not set
-# CONFIG_SND_MIRO is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_MIXER_OSS is not set
-# CONFIG_SND_MONA is not set
-# CONFIG_SND_MPU401 is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-CONFIG_SND_OSSEMUL=y
-# CONFIG_SND_OXYGEN is not set
-# CONFIG_SND_PCM is not set
-# CONFIG_SND_PCM_OSS is not set
-CONFIG_SND_PCM_OSS_PLUGINS=y
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_PDAUDIOCF is not set
-# CONFIG_SND_RAWMIDI is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RTCTIMER is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SEQUENCER is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SOC is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_SND_SUPPORT_OLD_API is not set
-# CONFIG_SND_TIMER is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_CAIAQ is not set
-# CONFIG_SND_USB_USX2Y is not set
-# CONFIG_SND_VERBOSE_PRINTK is not set
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VIRTUOSO is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_WAVEFRONT is not set
-# CONFIG_SND_YMFPCI is not set
-# CONFIG_SNI_RM is not set
-# CONFIG_SOFT_WATCHDOG is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_SOUND is not set
-# CONFIG_SOUND_PRIME is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_STATIC is not set
-# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-# CONFIG_SPI_AT25 is not set
-# CONFIG_SPI_DEBUG is not set
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-# CONFIG_SPI_TLE62X0 is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC is not set
-CONFIG_SQUASHFS=y
-# CONFIG_SSB_DEBUG is not set
-# CONFIG_SSB_DRIVER_MIPS is not set
-# CONFIG_SSB is not set
-# CONFIG_SSB_PCMCIAHOST is not set
-CONFIG_SSB_POSSIBLE=y
-# CONFIG_SSB_SILENT is not set
-# CONFIG_SSFDC is not set
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_STANDALONE=y
-# CONFIG_STRIP is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_SUNRPC_BIND34 is not set
-# CONFIG_SUNRPC_GSS is not set
-# CONFIG_SUNRPC is not set
-CONFIG_SUSPEND_UP_POSSIBLE=y
-CONFIG_SWAP=y
-# CONFIG_SYNCLINK_CS is not set
-CONFIG_SYN_COOKIES=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_SYSCTL=y
-# CONFIG_SYSFS_DEPRECATED is not set
-# CONFIG_SYSFS_DEPRECATED_V2 is not set
-CONFIG_SYSFS=y
-# CONFIG_SYS_HYPERVISOR is not set
-# CONFIG_SYSV68_PARTITION is not set
-# CONFIG_SYSV_FS is not set
-CONFIG_SYSVIPC_SYSCTL=y
-CONFIG_SYSVIPC=y
-# CONFIG_TASKSTATS is not set
-# CONFIG_TCG_TPM is not set
-CONFIG_TCP_CONG_ADVANCED=y
-# CONFIG_TCP_CONG_BIC is not set
-# CONFIG_TCP_CONG_CUBIC is not set
-# CONFIG_TCP_CONG_HSTCP is not set
-# CONFIG_TCP_CONG_HTCP is not set
-# CONFIG_TCP_CONG_HYBLA is not set
-# CONFIG_TCP_CONG_ILLINOIS is not set
-# CONFIG_TCP_CONG_LP is not set
-# CONFIG_TCP_CONG_SCALABLE is not set
-# CONFIG_TCP_CONG_VEGAS is not set
-# CONFIG_TCP_CONG_VENO is not set
-CONFIG_TCP_CONG_WESTWOOD=y
-# CONFIG_TCP_CONG_YEAH is not set
-# CONFIG_TCP_MD5SIG is not set
-# CONFIG_TEXTSEARCH_BM is not set
-# CONFIG_TEXTSEARCH_FSM is not set
-# CONFIG_TEXTSEARCH_KMP is not set
-CONFIG_TEXTSEARCH=y
-# CONFIG_THERMAL is not set
-CONFIG_TICK_ONESHOT=y
-# CONFIG_TIFM_CORE is not set
-# CONFIG_TIGON3 is not set
-CONFIG_TIMERFD=y
-# CONFIG_TINY_SHMEM is not set
-# CONFIG_TIPC is not set
-# CONFIG_TLAN is not set
-# CONFIG_TMD_HERMES is not set
-# CONFIG_TMPFS_POSIX_ACL is not set
-CONFIG_TMPFS=y
-# CONFIG_TPS65010 is not set
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_TR is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_TUNER_TEA5761 is not set
-# CONFIG_TUN is not set
-# CONFIG_UDF_FS is not set
-CONFIG_UDF_NLS=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-# CONFIG_UFS_FS is not set
-# CONFIG_UIO is not set
-# CONFIG_ULTRIX_PARTITION is not set
-CONFIG_UNIX98_PTYS=y
-# CONFIG_UNIXWARE_DISKLABEL is not set
-CONFIG_UNIX=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_ADUTUX is not set
-# CONFIG_USB_AIPTEK is not set
-CONFIG_USB_ALI_M5632=y
-CONFIG_USB_AN2720=y
-# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_APPLETOUCH is not set
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARMLINUX=y
-# CONFIG_USB_ATI_REMOTE2 is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_ATM is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_BANDWIDTH is not set
-CONFIG_USB_BELKIN=y
-# CONFIG_USB_BERRY_CHARGE is not set
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_CXACRU is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_DABUSB is not set
-# CONFIG_USB_DEBUG is not set
-# CONFIG_USB_DEVICE_CLASS is not set
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_DSBR is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-# CONFIG_USB_EHCI_SPLIT_ISO is not set
-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EPSON2888 is not set
-# CONFIG_USB_ET61X251 is not set
-CONFIG_USB_EZUSB=y
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_GADGET is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HID is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_IOWARRIOR is not set
-# CONFIG_USB is not set
-# CONFIG_USB_ISP116X_HCD is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_KC2190 is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LIBUSUAL is not set
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-# CONFIG_USB_MON is not set
-# CONFIG_USB_MOUSE is not set
-# CONFIG_USB_NET_AX8817X is not set
-# CONFIG_USB_NET_CDCETHER is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_DM9601 is not set
-# CONFIG_USB_NET_GL620A is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_NET1080 is not set
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_RNDIS_WLAN is not set
-# CONFIG_USB_NET_ZAURUS is not set
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-# CONFIG_USB_OHCI_HCD is not set
-# CONFIG_USB_OHCI_HCD_SSB is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-# CONFIG_USB_OTG is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_PHIDGET is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_PRINTER is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_R8A66597_HCD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SERIAL_AIRCABLE is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-# CONFIG_USB_SERIAL_BELKIN is not set
-# CONFIG_USB_SERIAL_CH341 is not set
-# CONFIG_USB_SERIAL_CP2101 is not set
-# CONFIG_USB_SERIAL_CYBERJACK is not set
-# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
-# CONFIG_USB_SERIAL_DEBUG is not set
-# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
-# CONFIG_USB_SERIAL_EMPEG is not set
-# CONFIG_USB_SERIAL_FTDI_SIO is not set
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-# CONFIG_USB_SERIAL_GARMIN is not set
-CONFIG_USB_SERIAL_GENERIC=y
-# CONFIG_USB_SERIAL_HP4X is not set
-# CONFIG_USB_SERIAL_IPAQ is not set
-# CONFIG_USB_SERIAL_IPW is not set
-# CONFIG_USB_SERIAL_IR is not set
-# CONFIG_USB_SERIAL is not set
-# CONFIG_USB_SERIAL_IUU is not set
-# CONFIG_USB_SERIAL_KEYSPAN is not set
-CONFIG_USB_SERIAL_KEYSPAN_MPR=y
-# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
-CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
-# CONFIG_USB_SERIAL_KLSI is not set
-# CONFIG_USB_SERIAL_KOBIL_SCT is not set
-# CONFIG_USB_SERIAL_MCT_U232 is not set
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 is not set
-# CONFIG_USB_SERIAL_NAVMAN is not set
-# CONFIG_USB_SERIAL_OMNINET is not set
-# CONFIG_USB_SERIAL_OPTION is not set
-# CONFIG_USB_SERIAL_OTI6858 is not set
-# CONFIG_USB_SERIAL_PL2303 is not set
-# CONFIG_USB_SERIAL_SAFE is not set
-CONFIG_USB_SERIAL_SAFE_PADDED=y
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-# CONFIG_USB_SERIAL_TI is not set
-# CONFIG_USB_SERIAL_VISOR is not set
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-# CONFIG_USB_SERIAL_XIRCOM is not set
-# CONFIG_USB_SISUSBVGA is not set
-# CONFIG_USB_SL811_HCD is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_SPEEDTOUCH is not set
-# CONFIG_USB_STKWEBCAM is not set
-CONFIG_USB_STORAGE_ALAUDA=y
-CONFIG_USB_STORAGE_DATAFAB=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-CONFIG_USB_STORAGE_DPCM=y
-CONFIG_USB_STORAGE_FREECOM=y
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE is not set
-CONFIG_USB_STORAGE_JUMPSHOT=y
-CONFIG_USB_STORAGE_KARMA=y
-# CONFIG_USB_STORAGE_ONETOUCH is not set
-CONFIG_USB_STORAGE_SDDR09=y
-CONFIG_USB_STORAGE_SDDR55=y
-CONFIG_USB_STORAGE_USBAT=y
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_SUPPORT is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_TEST is not set
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_UEAGLEATM is not set
-# CONFIG_USB_USBNET is not set
-# CONFIG_USB_USBNET_MII is not set
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_XUSBATM is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_ZD1201 is not set
-# CONFIG_USB_ZR364XX is not set
-# CONFIG_UTS_NS is not set
-# CONFIG_VETH is not set
-# CONFIG_VFAT_FS is not set
-# CONFIG_VIA_VELOCITY is not set
-# CONFIG_VIDEO_ADV7170 is not set
-# CONFIG_VIDEO_ADV7175 is not set
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# CONFIG_VIDEO_BT819 is not set
-# CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_BT856 is not set
-# CONFIG_VIDEO_BT866 is not set
-# CONFIG_VIDEO_CAFE_CCIC is not set
-# CONFIG_VIDEO_CAPTURE_DRIVERS is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CS5345 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_CX2341X is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_CX88 is not set
-# CONFIG_VIDEO_DEV is not set
-# CONFIG_VIDEO_DPC is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_HELPER_CHIPS_AUTO is not set
-# CONFIG_VIDEO_HEXIUM_GEMINI is not set
-# CONFIG_VIDEO_HEXIUM_ORION is not set
-# CONFIG_VIDEO_IVTV is not set
-# CONFIG_VIDEO_KS0127 is not set
-# CONFIG_VIDEO_M52790 is not set
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_MXB is not set
-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-# CONFIG_VIDEO_OV7670 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_VIDEO_PMS is not set
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_VIDEO_SAA7110 is not set
-# CONFIG_VIDEO_SAA7111 is not set
-# CONFIG_VIDEO_SAA7114 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_SAA7134 is not set
-# CONFIG_VIDEO_SAA7185 is not set
-# CONFIG_VIDEO_SAA7191 is not set
-# CONFIG_VIDEO_STRADIS is not set
-# CONFIG_VIDEO_TCM825X is not set
-# CONFIG_VIDEO_TDA7432 is not set
-# CONFIG_VIDEO_TDA9840 is not set
-# CONFIG_VIDEO_TDA9875 is not set
-# CONFIG_VIDEO_TEA6415C is not set
-# CONFIG_VIDEO_TEA6420 is not set
-# CONFIG_VIDEO_TLV320AIC23B is not set
-# CONFIG_VIDEO_TVAUDIO is not set
-# CONFIG_VIDEO_TVP5150 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-# CONFIG_VIDEO_USBVISION is not set
-CONFIG_VIDEO_V4L1_COMPAT=y
-# CONFIG_VIDEO_V4L1 is not set
-CONFIG_VIDEO_V4L2=y
-# CONFIG_VIDEO_VIVI is not set
-# CONFIG_VIDEO_VP27SMPX is not set
-# CONFIG_VIDEO_VPX3220 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_ZORAN is not set
-CONFIG_VIRT_TO_BUS=y
-# CONFIG_VITESSE_PHY is not set
-CONFIG_VLAN_8021Q=y
-# CONFIG_VM_EVENT_COUNTERS is not set
-# CONFIG_VT is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_W1 is not set
-# CONFIG_W1_MASTER_DS1WM is not set
-# CONFIG_W1_MASTER_DS2482 is not set
-# CONFIG_W1_MASTER_DS2490 is not set
-# CONFIG_W1_MASTER_GPIO is not set
-# CONFIG_W1_MASTER_MATROX is not set
-# CONFIG_W1_SLAVE_DS2433 is not set
-# CONFIG_W1_SLAVE_DS2760 is not set
-# CONFIG_W1_SLAVE_SMEM is not set
-# CONFIG_W1_SLAVE_THERM is not set
-# CONFIG_W83627HF_WDT is not set
-# CONFIG_W83697HF_WDT is not set
-# CONFIG_W83877F_WDT is not set
-# CONFIG_W83977F_WDT is not set
-# CONFIG_WAN is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-CONFIG_WATCHDOG=y
-# CONFIG_WDTPCI is not set
-CONFIG_WIRELESS_EXT=y
-CONFIG_WLAN_80211=y
-# CONFIG_WLAN_PRE80211 is not set
-# CONFIG_WR_PPMC is not set
-# CONFIG_X25 is not set
-# CONFIG_XFRM_MIGRATE is not set
-# CONFIG_XFRM_STATISTICS is not set
-# CONFIG_XFRM_SUB_POLICY is not set
-# CONFIG_XFRM_USER is not set
-CONFIG_XFRM=y
-# CONFIG_XFS_FS is not set
-# CONFIG_XFS_POSIX_ACL is not set
-# CONFIG_XFS_QUOTA is not set
-# CONFIG_XFS_RT is not set
-# CONFIG_XFS_SECURITY is not set
-# CONFIG_YAFFS_FS is not set
-# CONFIG_YAM is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_YENTA is not set
-# CONFIG_YENTA_O2 is not set
-# CONFIG_YENTA_RICOH is not set
-# CONFIG_YENTA_TI is not set
-# CONFIG_YENTA_TOSHIBA is not set
-# CONFIG_ZD1211RW_DEBUG is not set
-# CONFIG_ZD1211RW is not set
-# CONFIG_ZISOFS_FS is not set
-CONFIG_ZISOFS=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZONE_DMA_FLAG=1
-CONFIG_ZONE_DMA=y
+++ /dev/null
-# CONFIG_6PACK is not set
-# CONFIG_8139CP is not set
-# CONFIG_8139TOO is not set
-# CONFIG_9P_FS is not set
-# CONFIG_AB3100_CORE is not set
-# CONFIG_ACCESSIBILITY is not set
-# CONFIG_ACENIC is not set
-# CONFIG_ACER_WMI is not set
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_ADFS_FS is not set
-# CONFIG_ADM6996_PHY is not set
-# CONFIG_ADM8211 is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_AF_RXRPC is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_AGP is not set
-CONFIG_AIO=y
-# CONFIG_AIRO_CS is not set
-# CONFIG_AIRO is not set
-# CONFIG_ALIM7101_WDT is not set
-# CONFIG_ALTERA_PCIE_CHDMA is not set
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ANDROID is not set
-CONFIG_ANON_INODES=y
-# CONFIG_APPLICOM is not set
-# CONFIG_AR8216_PHY is not set
-# CONFIG_AR9170_USB is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91 is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_DAVINCI is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_EP93XX is not set
-CONFIG_ARCH_FLATMEM_ENABLE=y
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_GEMINI is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP13XX is not set
-# CONFIG_ARCH_IOP32X is not set
-# CONFIG_ARCH_IOP33X is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_IXP23XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_KIRKWOOD is not set
-# CONFIG_ARCH_KS8695 is not set
-# CONFIG_ARCH_L7200 is not set
-# CONFIG_ARCH_LH7A40X is not set
-# CONFIG_ARCH_LOKI is not set
-# CONFIG_ARCH_MMP is not set
-# CONFIG_ARCH_MSM is not set
-# CONFIG_ARCH_MV78XX0 is not set
-# CONFIG_ARCH_MXC is not set
-# CONFIG_ARCH_NETX is not set
-# CONFIG_ARCH_NS9XXX is not set
-# CONFIG_ARCH_OMAP is not set
-# CONFIG_ARCH_ORION5X is not set
-# CONFIG_ARCH_PNX4008 is not set
-# CONFIG_ARCH_PXA is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_RPC is not set
-# CONFIG_ARCH_S3C2410 is not set
-# CONFIG_ARCH_S3C64XX is not set
-# CONFIG_ARCH_SA1100 is not set
-# CONFIG_ARCH_SHARK is not set
-# CONFIG_ARCH_STMP3XXX is not set
-# CONFIG_ARCH_U300 is not set
-# CONFIG_ARCH_VERSATILE is not set
-# CONFIG_ARCH_W90X900 is not set
-# CONFIG_ARCNET is not set
-# CONFIG_ARM_UNWIND is not set
-CONFIG_ARPD=y
-# CONFIG_ARTHUR is not set
-CONFIG_ASK_IP_FIB_HASH=y
-# CONFIG_ASUS_OLED is not set
-# CONFIG_ASYNC_TX_DMA is not set
-# CONFIG_AT24 is not set
-# CONFIG_AT76C50X_USB is not set
-# CONFIG_ATA_ACPI is not set
-# CONFIG_ATA_GENERIC is not set
-# CONFIG_ATA is not set
-# CONFIG_ATALK is not set
-# CONFIG_ATA_NONSTANDARD is not set
-# CONFIG_ATA_OVER_ETH is not set
-# CONFIG_ATA_PIIX is not set
-# CONFIG_ATARI_PARTITION is not set
-CONFIG_ATA_SFF=y
-# CONFIG_ATH5K is not set
-# CONFIG_ATH9K is not set
-# CONFIG_ATL1C is not set
-# CONFIG_ATL1E is not set
-# CONFIG_ATL1 is not set
-# CONFIG_ATL2 is not set
-# CONFIG_ATM_AMBASSADOR is not set
-CONFIG_ATM_BR2684_IPFILTER=y
-# CONFIG_ATM_BR2684 is not set
-# CONFIG_ATM_CLIP is not set
-CONFIG_ATM_CLIP_NO_ICMP=y
-# CONFIG_ATM_DRIVERS is not set
-# CONFIG_ATM_DUMMY is not set
-# CONFIG_ATMEL is not set
-# CONFIG_ATM_ENI is not set
-# CONFIG_ATM_FIRESTREAM is not set
-# CONFIG_ATM_FORE200E is not set
-# CONFIG_ATM_FORE200E_MAYBE is not set
-# CONFIG_ATM_HE is not set
-# CONFIG_ATM_HORIZON is not set
-# CONFIG_ATM_IA is not set
-# CONFIG_ATM_IDT77252 is not set
-# CONFIG_ATM is not set
-# CONFIG_ATM_LANAI is not set
-# CONFIG_ATM_LANE is not set
-# CONFIG_ATM_MPOA is not set
-# CONFIG_ATM_NICSTAR is not set
-# CONFIG_ATM_SOLOS is not set
-# CONFIG_ATM_TCP is not set
-# CONFIG_ATM_ZATM is not set
-# CONFIG_AUDIT is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUXDISPLAY is not set
-# CONFIG_AX25_DAMA_SLAVE is not set
-# CONFIG_AX25 is not set
-# CONFIG_AX88796 is not set
-# CONFIG_B3DFG is not set
-# CONFIG_B43 is not set
-# CONFIG_B43LEGACY is not set
-# CONFIG_B44 is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-CONFIG_BASE_FULL=y
-CONFIG_BASE_SMALL=0
-# CONFIG_BASLER_EXCITE is not set
-# CONFIG_BATTERY_BQ27000_HDQ is not set
-# CONFIG_BATTERY_BQ27x00 is not set
-# CONFIG_BATTERY_DS2760 is not set
-# CONFIG_BATTERY_DS2782 is not set
-# CONFIG_BATTERY_MAX17040 is not set
-# CONFIG_BAYCOM_EPP is not set
-# CONFIG_BAYCOM_PAR is not set
-# CONFIG_BAYCOM_SER_FDX is not set
-# CONFIG_BAYCOM_SER_HDX is not set
-CONFIG_BCM43XX_DEBUG=y
-CONFIG_BCM43XX_DMA_AND_PIO_MODE=y
-# CONFIG_BCM43XX_DMA_MODE is not set
-CONFIG_BCM43XX_DMA=y
-# CONFIG_BCM43XX is not set
-# CONFIG_BCM43XX_PIO_MODE is not set
-CONFIG_BCM43XX_PIO=y
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_BINARY_PRINTF is not set
-# CONFIG_BINFMT_AOUT is not set
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-# CONFIG_BLINK is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_BLK_DEV_4DRIVES is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI14XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_ATIIXP is not set
-# CONFIG_BLK_DEV_BSG is not set
-# CONFIG_BLK_DEV_CMD640 is not set
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_CS5535 is not set
-# CONFIG_BLK_DEV_CS5536 is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_DELKIN is not set
-# CONFIG_BLK_DEV_DTC2278 is not set
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_GENERIC is not set
-# CONFIG_BLK_DEV_HD_IDE is not set
-# CONFIG_BLK_DEV_HD is not set
-# CONFIG_BLK_DEV_HD_ONLY is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_HT6560B is not set
-# CONFIG_BLK_DEV_IDEACPI is not set
-# CONFIG_BLK_DEV_IDECD is not set
-# CONFIG_BLK_DEV_IDECS is not set
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDEPCI is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-# CONFIG_BLK_DEV_IDE_SATA is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_BLK_DEV_IDETAPE is not set
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_BLK_DEV_INTEGRITY is not set
-# CONFIG_BLK_DEV_IO_TRACE is not set
-# CONFIG_BLK_DEV_IT8172 is not set
-# CONFIG_BLK_DEV_IT8213 is not set
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_JMICRON is not set
-# CONFIG_BLK_DEV_LOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_OFFBOARD is not set
-# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PIIX is not set
-# CONFIG_BLK_DEV_PLATFORM is not set
-# CONFIG_BLK_DEV_QD65XX is not set
-# CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_RZ1000 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-# CONFIG_BLK_DEV_SD is not set
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SIS5513 is not set
-# CONFIG_BLK_DEV_SL82C105 is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_SR is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_TC86C001 is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_UB is not set
-# CONFIG_BLK_DEV_UMC8672 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_BLK_DEV_XIP is not set
-CONFIG_BLK_DEV=y
-CONFIG_BLOCK=y
-# CONFIG_BNX2 is not set
-# CONFIG_BONDING is not set
-# CONFIG_BOOT_TRACER is not set
-# CONFIG_BPQETHER is not set
-# CONFIG_BRIDGE_EBT_802_3 is not set
-# CONFIG_BRIDGE_EBT_AMONG is not set
-# CONFIG_BRIDGE_EBT_ARP is not set
-# CONFIG_BRIDGE_EBT_ARPREPLY is not set
-# CONFIG_BRIDGE_EBT_BROUTE is not set
-# CONFIG_BRIDGE_EBT_DNAT is not set
-# CONFIG_BRIDGE_EBT_IP6 is not set
-# CONFIG_BRIDGE_EBT_IP is not set
-# CONFIG_BRIDGE_EBT_LIMIT is not set
-# CONFIG_BRIDGE_EBT_LOG is not set
-# CONFIG_BRIDGE_EBT_MARK is not set
-# CONFIG_BRIDGE_EBT_MARK_T is not set
-# CONFIG_BRIDGE_EBT_NFLOG is not set
-# CONFIG_BRIDGE_EBT_PKTTYPE is not set
-# CONFIG_BRIDGE_EBT_REDIRECT is not set
-# CONFIG_BRIDGE_EBT_SNAT is not set
-# CONFIG_BRIDGE_EBT_STP is not set
-# CONFIG_BRIDGE_EBT_T_FILTER is not set
-# CONFIG_BRIDGE_EBT_T_NAT is not set
-# CONFIG_BRIDGE_EBT_ULOG is not set
-# CONFIG_BRIDGE_EBT_VLAN is not set
-# CONFIG_BRIDGE_NETFILTER is not set
-# CONFIG_BRIDGE_NF_EBTABLES is not set
-CONFIG_BRIDGE=y
-# CONFIG_BROADCOM_PHY is not set
-CONFIG_BROKEN_ON_SMP=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BT_BNEP is not set
-CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
-# CONFIG_BT_CMTP is not set
-# CONFIG_BT_HCIBCM203X is not set
-# CONFIG_BT_HCIBFUSB is not set
-# CONFIG_BT_HCIBLUECARD is not set
-# CONFIG_BT_HCIBPA10X is not set
-# CONFIG_BT_HCIBT3C is not set
-# CONFIG_BT_HCIBTSDIO is not set
-# CONFIG_BT_HCIBTUART is not set
-# CONFIG_BT_HCIBTUSB is not set
-# CONFIG_BT_HCIDTL1 is not set
-CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIUART_H4=y
-# CONFIG_BT_HCIUART is not set
-# CONFIG_BT_HCIUART_LL is not set
-# CONFIG_BT_HCIUSB is not set
-CONFIG_BT_HCIUSB_SCO=y
-# CONFIG_BT_HCIVHCI is not set
-# CONFIG_BT_HIDP is not set
-# CONFIG_BT is not set
-# CONFIG_BT_L2CAP is not set
-# CONFIG_BT_RFCOMM is not set
-CONFIG_BT_RFCOMM_TTY=y
-# CONFIG_BTRFS_FS is not set
-# CONFIG_BT_SCO is not set
-CONFIG_BUG=y
-# CONFIG_C2PORT is not set
-# CONFIG_CAN is not set
-# CONFIG_CAPI_AVM is not set
-# CONFIG_CAPI_EICON is not set
-# CONFIG_CAPI_TRACE is not set
-CONFIG_CARDBUS=y
-# CONFIG_CARDMAN_4000 is not set
-# CONFIG_CARDMAN_4040 is not set
-# CONFIG_CASSINI is not set
-# CONFIG_CB710_CORE is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_CFG80211 is not set
-# CONFIG_CGROUPS is not set
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_CHELSIO_T3 is not set
-# CONFIG_CHR_DEV_OSST is not set
-# CONFIG_CHR_DEV_SCH is not set
-# CONFIG_CHR_DEV_SG is not set
-# CONFIG_CHR_DEV_ST is not set
-# CONFIG_CICADA_PHY is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
-# CONFIG_CIFS is not set
-CONFIG_CIFS_POSIX=y
-# CONFIG_CIFS_STATS2 is not set
-CONFIG_CIFS_STATS=y
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# CONFIG_CIFS_XATTR is not set
-CONFIG_CLASSIC_RCU=y
-CONFIG_CLS_U32_MARK=y
-CONFIG_CLS_U32_PERF=y
-CONFIG_CMDLINE=""
-# CONFIG_CNIC is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_COMEDI is not set
-# CONFIG_COMPAT_BRK is not set
-CONFIG_COMPAT_NET_DEV_OPS=y
-# CONFIG_CONFIGFS_FS is not set
-# CONFIG_CONNECTOR is not set
-CONFIG_CONSTRUCTORS=y
-# CONFIG_CONTEXT_SWITCH_TRACER is not set
-# CONFIG_COPS is not set
-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-# CONFIG_CPU_DCACHE_DISABLE is not set
-# CONFIG_CPU_FREQ is not set
-# CONFIG_CPU_IDLE is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_CRASH_DUMP is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_CRC7 is not set
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC_ITU_T is not set
-# CONFIG_CRC_T10DIF is not set
-CONFIG_CROSSCOMPILE=y
-# CONFIG_CRYPTO_AEAD is not set
-# CONFIG_CRYPTO_AES_586 is not set
-# CONFIG_CRYPTO_AES is not set
-CONFIG_CRYPTO_ALGAPI2=y
-CONFIG_CRYPTO_ALGAPI=y
-# CONFIG_CRYPTO_ANSI_CPRNG is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_AUTHENC is not set
-# CONFIG_CRYPTO_BLKCIPHER is not set
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_CAMELLIA is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_CBC is not set
-# CONFIG_CRYPTO_CCM is not set
-# CONFIG_CRYPTO_CRC32C_INTEL is not set
-# CONFIG_CRYPTO_CRC32C is not set
-# CONFIG_CRYPTO_CRYPTD is not set
-# CONFIG_CRYPTO_CTR is not set
-# CONFIG_CRYPTO_CTS is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_DES is not set
-# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-# CONFIG_CRYPTO_ECB is not set
-# CONFIG_CRYPTO_FCRYPT is not set
-# CONFIG_CRYPTO_FIPS is not set
-# CONFIG_CRYPTO_GCM is not set
-# CONFIG_CRYPTO_GF128MUL is not set
-# CONFIG_CRYPTO_HASH is not set
-# CONFIG_CRYPTO_HMAC is not set
-# CONFIG_CRYPTO_HW is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_LRW is not set
-# CONFIG_CRYPTO_LZO is not set
-# CONFIG_CRYPTO_MANAGER2 is not set
-# CONFIG_CRYPTO_MANAGER is not set
-# CONFIG_CRYPTO_MD4 is not set
-# CONFIG_CRYPTO_MD5 is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_PCBC is not set
-CONFIG_CRYPTO_PCOMP=y
-# CONFIG_CRYPTO_PRNG is not set
-# CONFIG_CRYPTO_RMD128 is not set
-# CONFIG_CRYPTO_RMD160 is not set
-# CONFIG_CRYPTO_RMD256 is not set
-# CONFIG_CRYPTO_RMD320 is not set
-# CONFIG_CRYPTO_RNG is not set
-# CONFIG_CRYPTO_SALSA20_586 is not set
-# CONFIG_CRYPTO_SALSA20 is not set
-# CONFIG_CRYPTO_SEED is not set
-# CONFIG_CRYPTO_SEQIV is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_SHA1 is not set
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_TEST is not set
-# CONFIG_CRYPTO_TGR192 is not set
-# CONFIG_CRYPTO_TWOFISH_586 is not set
-# CONFIG_CRYPTO_TWOFISH_COMMON is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-CONFIG_CRYPTO_UNLZMA=y
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_XCBC is not set
-# CONFIG_CRYPTO_XTS is not set
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_ZLIB=y
-# CONFIG_CUSE is not set
-# CONFIG_DAB is not set
-# CONFIG_DAVICOM_PHY is not set
-# CONFIG_DCB is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-CONFIG_DEBUG_FS=y
-# CONFIG_DEBUG_KERNEL is not set
-# CONFIG_DEBUG_MEMORY_INIT is not set
-# CONFIG_DECNET is not set
-CONFIG_DECOMPRESS_LZMA_NEEDED=y
-# CONFIG_DEFAULT_AS is not set
-# CONFIG_DEFAULT_BIC is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_CUBIC is not set
-CONFIG_DEFAULT_DEADLINE=y
-# CONFIG_DEFAULT_HTCP is not set
-CONFIG_DEFAULT_IOSCHED="deadline"
-CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
-# CONFIG_DEFAULT_NOOP is not set
-# CONFIG_DEFAULT_RENO is not set
-CONFIG_DEFAULT_TCP_CONG="westwood"
-# CONFIG_DEFAULT_VEGAS is not set
-CONFIG_DEFAULT_WESTWOOD=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-# CONFIG_DEVKMEM is not set
-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
-# CONFIG_DGRS is not set
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_DISPLAY_SUPPORT is not set
-# CONFIG_DL2K is not set
-# CONFIG_DLM is not set
-# CONFIG_DMADEVICES is not set
-# CONFIG_DMA_ENGINE is not set
-# CONFIG_DMASCC is not set
-# CONFIG_DMATEST is not set
-# CONFIG_DNET is not set
-# CONFIG_DNOTIFY is not set
-# CONFIG_DRAGONRISE_FF is not set
-# CONFIG_DRM is not set
-# CONFIG_DS1682 is not set
-# CONFIG_DST is not set
-# CONFIG_DTLK is not set
-# CONFIG_DUMMY is not set
-# CONFIG_DVB_CORE is not set
-# CONFIG_DVB is not set
-# CONFIG_DYNAMIC_DEBUG is not set
-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
-# CONFIG_E1000E is not set
-# CONFIG_E1000 is not set
-# CONFIG_E100 is not set
-# CONFIG_ECHO is not set
-# CONFIG_ECONET is not set
-# CONFIG_EDAC is not set
-# CONFIG_EEPRO100 is not set
-# CONFIG_EEPROM_93CX6 is not set
-# CONFIG_EEPROM_AT24 is not set
-# CONFIG_EEPROM_AT25 is not set
-# CONFIG_EEPROM_LEGACY is not set
-# CONFIG_EEPROM_MAX6875 is not set
-# CONFIG_EFI_PARTITION is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_ELF_CORE is not set
-CONFIG_EMBEDDED=y
-# CONFIG_ENABLE_MUST_CHECK is not set
-CONFIG_ENABLE_WARN_DEPRECATED=y
-# CONFIG_ENC28J60 is not set
-# CONFIG_ENCLOSURE_SERVICES is not set
-# CONFIG_EPIC100 is not set
-CONFIG_EPOLL=y
-# CONFIG_EQUALIZER is not set
-# CONFIG_ET131X is not set
-# CONFIG_ETHOC is not set
-CONFIG_EVENTFD=y
-# CONFIG_EVENT_TRACER is not set
-CONFIG_EXPERIMENTAL=y
-# CONFIG_EXPORTFS is not set
-# CONFIG_EXT2_FS is not set
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_EXT3_FS_XATTR is not set
-# CONFIG_EXT4DEV_FS is not set
-# CONFIG_EXT4_FS is not set
-CONFIG_EXTRA_FIRMWARE=""
-CONFIG_EXTRA_TARGETS=""
-# CONFIG_EZX_PCAP is not set
-# CONFIG_FAIR_GROUP_SCHED is not set
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_FAT_FS is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_ARC is not set
-# CONFIG_FB_ARK is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_BACKLIGHT is not set
-# CONFIG_FB_BOOT_VESA_SUPPORT is not set
-# CONFIG_FB_BROADSHEET is not set
-# CONFIG_FB_CARMINE is not set
-# CONFIG_FB_CFB_COPYAREA is not set
-# CONFIG_FB_CFB_FILLRECT is not set
-# CONFIG_FB_CFB_IMAGEBLIT is not set
-# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_DDC is not set
-# CONFIG_FB_EARLYSUSPEND is not set
-# CONFIG_FB_FOREIGN_ENDIAN is not set
-# CONFIG_FB_GEODE is not set
-# CONFIG_FB_GOLDFISH is not set
-# CONFIG_FB_HGA is not set
-# CONFIG_FB_IBM_GXT4500 is not set
-# CONFIG_FB_IMSTT is not set
-# CONFIG_FB is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_LE80578 is not set
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_MB862XX is not set
-# CONFIG_FB_METRONOME is not set
-# CONFIG_FB_MODE_HELPERS is not set
-# CONFIG_FB_N411 is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_OF is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_PM3 is not set
-# CONFIG_FB_PS3 is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_S3 is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS 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_TRIDENT is not set
-# CONFIG_FB_VGA16 is not set
-# CONFIG_FB_VIA is not set
-# CONFIG_FB_VIRTUAL is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_VT8623 is not set
-# CONFIG_FCOE_FNIC is not set
-# CONFIG_FCOE is not set
-# CONFIG_FDDI is not set
-# CONFIG_FEALNX is not set
-CONFIG_FIB_RULES=y
-CONFIG_FILE_LOCKING=y
-# CONFIG_FIREWIRE is not set
-# CONFIG_FIRMWARE_IN_KERNEL is not set
-# CONFIG_FIXED_PHY is not set
-CONFIG_FLATMEM_MANUAL=y
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_FORCEDETH is not set
-CONFIG_FRAME_WARN=1024
-# CONFIG_FRAMEBUFFER_CONSOLE is not set
-# CONFIG_FREEZER is not set
-# CONFIG_FSCACHE is not set
-CONFIG_FSNOTIFY=y
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_FTL is not set
-# CONFIG_FTRACE is not set
-# CONFIG_FTRACE_STARTUP_TEST is not set
-# CONFIG_FUNCTION_TRACER is not set
-# CONFIG_FUSE_FS is not set
-# CONFIG_FUSION_FC is not set
-# CONFIG_FUSION is not set
-# CONFIG_FUSION_SAS is not set
-# CONFIG_FUSION_SPI is not set
-CONFIG_FUTEX=y
-CONFIG_FW_LOADER=y
-CONFIG_GACT_PROB=y
-# CONFIG_GAMEPORT is not set
-# CONFIG_GCOV_KERNEL is not set
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_TIME=y
-# CONFIG_GIGASET_DEBUG is not set
-# CONFIG_GFS2_FS is not set
-# CONFIG_GPIO_BT8XX is not set
-# CONFIG_GPIO_DEVICE is not set
-# CONFIG_GPIOLIB is not set
-# CONFIG_GPIO_MAX7301 is not set
-# CONFIG_GPIO_MAX732X is not set
-# CONFIG_GPIO_MCP23S08 is not set
-# CONFIG_GPIO_PCA953X is not set
-# CONFIG_GPIO_PCF857X is not set
-# CONFIG_GPIO_SYSFS is not set
-# CONFIG_GPIO_XILINX is not set
-# CONFIG_GREENASIA_FF is not set
-# CONFIG_GROUP_SCHED is not set
-# CONFIG_HAMACHI is not set
-CONFIG_HAMRADIO=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_HAVE_AOUT is not set
-CONFIG_HAVE_MLOCKED_PAGE_BIT=y
-CONFIG_HAVE_MLOCK=y
-# CONFIG_HCALL_STATS is not set
-# CONFIG_HDLC_CISCO is not set
-# CONFIG_HDLC_FR is not set
-# CONFIG_HDLC is not set
-# CONFIG_HDLC_PPP is not set
-# CONFIG_HDLC_RAW_ETH is not set
-# CONFIG_HDLC_RAW is not set
-# CONFIG_HEADERS_CHECK is not set
-# CONFIG_HECI is not set
-# CONFIG_HERMES is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_HID_A4TECH is not set
-# CONFIG_HID_APPLE is not set
-# CONFIG_HID_BELKIN is not set
-# CONFIG_HID_BRIGHT is not set
-# CONFIG_HID_CHERRY is not set
-# CONFIG_HID_CHICONY is not set
-# CONFIG_HID_COMPAT is not set
-# CONFIG_HID_CYPRESS is not set
-# CONFIG_HID_DEBUG is not set
-# CONFIG_HID_DELL is not set
-# CONFIG_HID_DRAGONRISE is not set
-# CONFIG_HID_EZKEY is not set
-# CONFIG_HID_FF is not set
-# CONFIG_HID_GREENASIA is not set
-# CONFIG_HID_GYRATION is not set
-# CONFIG_HID is not set
-# CONFIG_HID_KENSINGTON is not set
-# CONFIG_HID_KYE is not set
-# CONFIG_HID_LOGITECH is not set
-# CONFIG_HID_MICROSOFT is not set
-# CONFIG_HID_MONTEREY is not set
-# CONFIG_HID_NTRIG is not set
-# CONFIG_HID_PANTHERLORD is not set
-# CONFIG_HID_PETALYNX is not set
-# CONFIG_HID_PID is not set
-# CONFIG_HIDRAW is not set
-# CONFIG_HID_SAMSUNG is not set
-# CONFIG_HID_SMARTJOYPLUS is not set
-# CONFIG_HID_SONY is not set
-# CONFIG_HID_SUNPLUS is not set
-# CONFIG_HID_SUPPORT is not set
-# CONFIG_HID_THRUSTMASTER is not set
-# CONFIG_HID_TOPSEED is not set
-# CONFIG_HID_WACOM is not set
-# CONFIG_HID_ZEROPLUS is not set
-# CONFIG_HIGHMEM is not set
-CONFIG_HIGH_RES_TIMERS=y
-# CONFIG_HIPPI is not set
-# CONFIG_HOSTAP_CS is not set
-# CONFIG_HOSTAP is not set
-# CONFIG_HOSTAP_PCI is not set
-# CONFIG_HOSTAP_PLX is not set
-# CONFIG_HOTPLUG_CPU is not set
-# CONFIG_HOTPLUG_PCI is not set
-CONFIG_HOTPLUG=y
-# CONFIG_HP100 is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_HP_ILO is not set
-# CONFIG_HTC_EGPIO is not set
-# CONFIG_HTC_PASIC3 is not set
-# CONFIG_HUGETLB_PAGE is not set
-# CONFIG_HVC_UDBG is not set
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-# CONFIG_HW_RANDOM_AMD is not set
-# CONFIG_HW_RANDOM_GEODE is not set
-# CONFIG_HW_RANDOM_INTEL is not set
-# CONFIG_HW_RANDOM_TIMERIOMEM is not set
-# CONFIG_HW_RANDOM_VIA is not set
-# CONFIG_HYSDN is not set
-CONFIG_HZ=100
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ_100=y
-# CONFIG_HZ_1024 is not set
-# CONFIG_HZ_128 is not set
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_256 is not set
-# CONFIG_HZ_300 is not set
-# CONFIG_HZ_48 is not set
-# CONFIG_I2C_ALGOBIT is not set
-# CONFIG_I2C_ALGOPCA is not set
-# CONFIG_I2C_ALGOPCF is not set
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_CHARDEV is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_ELEKTOR is not set
-# CONFIG_I2C_GPIO is not set
-# CONFIG_I2C_HELPER_AUTO is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-# CONFIG_I2C_IBM_IIC is not set
-# CONFIG_I2C_ISCH is not set
-# CONFIG_I2C is not set
-# CONFIG_I2C_MPC is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_OCORES is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PCA_ISA is not set
-# CONFIG_I2C_PCA_PLATFORM is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_I2C_SIMTEC is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_TAOS_EVM is not set
-# CONFIG_I2C_TINY_USB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2O is not set
-# CONFIG_I82092 is not set
-# CONFIG_I82365 is not set
-# CONFIG_IBM_ASM is not set
-# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
-# CONFIG_IBM_NEW_EMAC_RGMII is not set
-# CONFIG_IBM_NEW_EMAC_TAH is not set
-# CONFIG_IBM_NEW_EMAC_ZMII is not set
-# CONFIG_ICPLUS_PHY is not set
-# CONFIG_ICS932S401 is not set
-# CONFIG_IDEDISK_MULTI_MODE is not set
-# CONFIG_IDEDMA_IVB is not set
-# CONFIG_IDEDMA_ONLYDISK is not set
-# CONFIG_IDE_GD is not set
-# CONFIG_IDE is not set
-CONFIG_IDE_MAX_HWIFS=4
-# CONFIG_IDEPCI_SHARE_IRQ is not set
-# CONFIG_IDE_PHISON is not set
-CONFIG_IDE_PROC_FS=y
-# CONFIG_IDE_TASK_IOCTL is not set
-# CONFIG_IEEE1394_DV1394 is not set
-# CONFIG_IEEE1394_ETH1394 is not set
-# CONFIG_IEEE1394 is not set
-# CONFIG_IEEE1394_OHCI1394 is not set
-# CONFIG_IEEE1394_PCILYNX is not set
-# CONFIG_IEEE1394_RAWIO is not set
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-# CONFIG_IEEE1394_VIDEO1394 is not set
-# CONFIG_IEEE80211_CRYPT_CCMP is not set
-# CONFIG_IEEE80211_CRYPT_TKIP is not set
-# CONFIG_IEEE80211_CRYPT_WEP is not set
-# CONFIG_IEEE80211_DEBUG is not set
-# CONFIG_IEEE80211 is not set
-# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
-# CONFIG_IEEE80211_SOFTMAC is not set
-# CONFIG_IEEE802154 is not set
-# CONFIG_IFB is not set
-# CONFIG_IGB is not set
-# CONFIG_IGBVF is not set
-# CONFIG_IKCONFIG is not set
-# CONFIG_IKCONFIG_PROC is not set
-# CONFIG_IMAGE_CMDLINE_HACK is not set
-# CONFIG_IMQ_BEHAVIOR_AA is not set
-# CONFIG_IMQ_BEHAVIOR_AB is not set
-# CONFIG_IMQ_BEHAVIOR_BA is not set
-# CONFIG_IMQ_BEHAVIOR_BB is not set
-# CONFIG_IMQ is not set
-CONFIG_IMQ_NUM_DEVS=2
-# CONFIG_INET6_AH is not set
-# CONFIG_INET6_ESP is not set
-# CONFIG_INET6_IPCOMP is not set
-# CONFIG_INET6_TUNNEL is not set
-# CONFIG_INET6_XFRM_MODE_BEET is not set
-# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET6_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_LRO is not set
-# CONFIG_INET_TCP_DIAG is not set
-# CONFIG_INET_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-CONFIG_INET=y
-# CONFIG_INFINIBAND is not set
-# CONFIG_INFTL is not set
-CONFIG_INIT_ENV_ARG_LIMIT=32
-# CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set
-# CONFIG_INITRAMFS_COMPRESSION_GZIP is not set
-# CONFIG_INITRAMFS_COMPRESSION_LZMA is not set
-CONFIG_INITRAMFS_COMPRESSION_NONE=y
-# CONFIG_INOTIFY is not set
-# CONFIG_INOTIFY_USER is not set
-# CONFIG_INPUT_APANEL is not set
-# CONFIG_INPUT_ATI_REMOTE2 is not set
-# CONFIG_INPUT_ATI_REMOTE is not set
-# CONFIG_INPUT_ATLAS_BTNS is not set
-# CONFIG_INPUT_CM109 is not set
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_FF_MEMLESS is not set
-# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
-# CONFIG_INPUT is not set
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-# CONFIG_INPUT_MIMIO is not set
-CONFIG_INPUT_MISC=y
-# CONFIG_INPUT_MOUSEDEV is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_PCSPKR is not set
-# CONFIG_INPUT_POLLDEV is not set
-# CONFIG_INPUT_POWERMATE is not set
-# CONFIG_INPUT_TABLET is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_UINPUT is not set
-# CONFIG_INPUT_WISTRON_BTNS is not set
-# CONFIG_INSTRUMENTATION is not set
-# CONFIG_IOSCHED_AS is not set
-# CONFIG_IOSCHED_CFQ is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IP1000 is not set
-# CONFIG_IP175C_PHY is not set
-# CONFIG_IP6_NF_FILTER is not set
-# CONFIG_IP6_NF_IPTABLES is not set
-# CONFIG_IP6_NF_MANGLE is not set
-# CONFIG_IP6_NF_MATCH_AH is not set
-# CONFIG_IP6_NF_MATCH_EUI64 is not set
-# CONFIG_IP6_NF_MATCH_FRAG is not set
-# CONFIG_IP6_NF_MATCH_HL is not set
-# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
-# CONFIG_IP6_NF_MATCH_LIMIT is not set
-# CONFIG_IP6_NF_MATCH_MH is not set
-# CONFIG_IP6_NF_MATCH_OPTS is not set
-# CONFIG_IP6_NF_MATCH_OWNER is not set
-# CONFIG_IP6_NF_MATCH_RT is not set
-# CONFIG_IP6_NF_QUEUE is not set
-# CONFIG_IP6_NF_RAW is not set
-# CONFIG_IP6_NF_TARGET_HL is not set
-# CONFIG_IP6_NF_TARGET_IMQ is not set
-# CONFIG_IP6_NF_TARGET_LOG is not set
-# CONFIG_IP6_NF_TARGET_REJECT is not set
-# CONFIG_IP6_NF_TARGET_ROUTE is not set
-CONFIG_IP_ADVANCED_ROUTER=y
-# CONFIG_IPC_NS is not set
-# CONFIG_IP_DCCP is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_FIB_TRIE is not set
-# CONFIG_IPMI_HANDLER is not set
-CONFIG_IP_MROUTE=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_MULTIPLE_TABLES=y
-# CONFIG_IP_NF_AMANDA is not set
-# CONFIG_IP_NF_ARPFILTER is not set
-# CONFIG_IP_NF_ARP_MANGLE is not set
-# CONFIG_IP_NF_ARPTABLES is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CONNTRACK_MARK=y
-CONFIG_IP_NF_CONNTRACK=y
-CONFIG_IP_NF_CT_ACCT=y
-# CONFIG_IP_NF_CT_PROTO_SCTP is not set
-# CONFIG_IP_NF_FILTER is not set
-# CONFIG_IP_NF_FTP is not set
-# CONFIG_IP_NF_H323 is not set
-# CONFIG_IP_NF_IPTABLES is not set
-# CONFIG_IP_NF_IRC is not set
-# CONFIG_IP_NF_MANGLE is not set
-# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
-# CONFIG_IP_NF_MATCH_AH is not set
-# CONFIG_IP_NF_MATCH_ECN is not set
-# CONFIG_IP_NF_MATCH_HASHLIMIT is not set
-# CONFIG_IP_NF_MATCH_IPP2P is not set
-# CONFIG_IP_NF_MATCH_OWNER is not set
-# CONFIG_IP_NF_MATCH_RECENT is not set
-# CONFIG_IP_NF_MATCH_SET is not set
-# CONFIG_IP_NF_MATCH_TIME is not set
-# CONFIG_IP_NF_MATCH_TOS is not set
-# CONFIG_IP_NF_MATCH_TTL is not set
-# CONFIG_IP_NF_NAT_AMANDA is not set
-# CONFIG_IP_NF_NAT_FTP is not set
-# CONFIG_IP_NF_NAT_H323 is not set
-# CONFIG_IP_NF_NAT_IRC is not set
-CONFIG_IP_NF_NAT_NEEDED=y
-# CONFIG_IP_NF_NAT_PPTP is not set
-# CONFIG_IP_NF_NAT_SIP is not set
-# CONFIG_IP_NF_NAT_SNMP_BASIC is not set
-# CONFIG_IP_NF_NAT_TFTP is not set
-CONFIG_IP_NF_NAT=y
-# CONFIG_IP_NF_NETBIOS_NS is not set
-# CONFIG_IP_NF_PPTP is not set
-# CONFIG_IP_NF_QUEUE is not set
-# CONFIG_IP_NF_RAW is not set
-# CONFIG_IP_NF_SECURITY is not set
-CONFIG_IP_NF_SET_HASHSIZE=1024
-# CONFIG_IP_NF_SET_IPHASH is not set
-# CONFIG_IP_NF_SET_IPMAP is not set
-# CONFIG_IP_NF_SET_IPPORTHASH is not set
-# CONFIG_IP_NF_SET_IPTREE is not set
-# CONFIG_IP_NF_SET_IPTREEMAP is not set
-# CONFIG_IP_NF_SET is not set
-# CONFIG_IP_NF_SET_MACIPMAP is not set
-CONFIG_IP_NF_SET_MAX=256
-# CONFIG_IP_NF_SET_NETHASH is not set
-# CONFIG_IP_NF_SET_PORTMAP is not set
-# CONFIG_IP_NF_SIP is not set
-# CONFIG_IP_NF_TARGET_CLUSTERIP is not set
-# CONFIG_IP_NF_TARGET_ECN is not set
-# CONFIG_IP_NF_TARGET_IMQ is not set
-# CONFIG_IP_NF_TARGET_LOG is not set
-# CONFIG_IP_NF_TARGET_MASQUERADE is not set
-# CONFIG_IP_NF_TARGET_NETMAP is not set
-# CONFIG_IP_NF_TARGET_REDIRECT is not set
-# CONFIG_IP_NF_TARGET_REJECT is not set
-# CONFIG_IP_NF_TARGET_ROUTE is not set
-# CONFIG_IP_NF_TARGET_SAME is not set
-# CONFIG_IP_NF_TARGET_SET is not set
-# CONFIG_IP_NF_TARGET_TOS is not set
-# CONFIG_IP_NF_TARGET_TTL is not set
-# CONFIG_IP_NF_TARGET_ULOG is not set
-# CONFIG_IP_NF_TFTP is not set
-# CONFIG_IP_PIMSM_V1 is not set
-# CONFIG_IP_PIMSM_V2 is not set
-# CONFIG_IP_PNP is not set
-CONFIG_IP_ROUTE_FWMARK=y
-CONFIG_IP_ROUTE_MULTIPATH_CACHED=y
-# CONFIG_IP_ROUTE_MULTIPATH_DRR is not set
-# CONFIG_IP_ROUTE_MULTIPATH_RANDOM is not set
-# CONFIG_IP_ROUTE_MULTIPATH_RR is not set
-# CONFIG_IP_ROUTE_MULTIPATH_WRANDOM is not set
-CONFIG_IP_ROUTE_MULTIPATH=y
-CONFIG_IP_ROUTE_VERBOSE=y
-# CONFIG_IP_SCTP is not set
-CONFIG_IPSEC_NAT_TRAVERSAL=y
-# CONFIG_IPV6 is not set
-# CONFIG_IPV6_MIP6 is not set
-# CONFIG_IPV6_MROUTE is not set
-# CONFIG_IPV6_MULTIPLE_TABLES is not set
-CONFIG_IPV6_NDISC_NODETYPE=y
-# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTE_INFO is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-# CONFIG_IPV6_SIT is not set
-# CONFIG_IPV6_TUNNEL is not set
-# CONFIG_IP_VS is not set
-# CONFIG_IPW2100_DEBUG is not set
-# CONFIG_IPW2100 is not set
-CONFIG_IPW2100_MONITOR=y
-# CONFIG_IPW2200_DEBUG is not set
-# CONFIG_IPW2200 is not set
-CONFIG_IPW2200_MONITOR=y
-# CONFIG_IPW2200_PROMISCUOUS is not set
-# CONFIG_IPW2200_QOS is not set
-# CONFIG_IPW2200_RADIOTAP is not set
-# CONFIG_IPWIRELESS is not set
-# CONFIG_IPX is not set
-# CONFIG_IRDA is not set
-# CONFIG_IRQSOFF_TRACER is not set
-# CONFIG_ISCSI_TCP is not set
-CONFIG_ISDN=y
-# CONFIG_ISDN_AUDIO is not set
-# CONFIG_ISDN_CAPI_CAPIDRV is not set
-# CONFIG_ISDN_DIVERSION is not set
-# CONFIG_ISDN_DRV_ACT2000 is not set
-# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set
-# CONFIG_ISDN_DRV_EICON is not set
-# CONFIG_ISDN_DRV_HISAX is not set
-# CONFIG_ISDN_DRV_ICN is not set
-# CONFIG_ISDN_DRV_LOOP is not set
-# CONFIG_ISDN_DRV_PCBIT is not set
-# CONFIG_ISDN_DRV_SC is not set
-# CONFIG_ISDN_DRV_TPAM is not set
-# CONFIG_ISDN_WITH_ABC is not set
-# CONFIG_ISL29003 is not set
-# CONFIG_ISO9660_FS is not set
-# CONFIG_IWL3945 is not set
-# CONFIG_IWLAGN is not set
-# CONFIG_IWLCORE is not set
-# CONFIG_IWLWIFI is not set
-# CONFIG_IWLWIFI_LEDS is not set
-# CONFIG_IXGB is not set
-# CONFIG_JBD2_DEBUG is not set
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_JBD is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_FS_DEBUG=0
-# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-# CONFIG_JFFS2_FS_XATTR is not set
-CONFIG_JFFS2_FS=y
-# CONFIG_JFFS2_LZO is not set
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_ZLIB=y
-# CONFIG_JFFS_FS is not set
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_JFS_POSIX_ACL is not set
-# CONFIG_JFS_SECURITY is not set
-# CONFIG_JFS_STATISTICS is not set
-# CONFIG_JME is not set
-CONFIG_JOLIET=y
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-# CONFIG_KALLSYMS is not set
-# CONFIG_KARMA_PARTITION is not set
-# CONFIG_KERNEL_BZIP2 is not set
-# CONFIG_KERNEL_GZIP is not set
-CONFIG_KERNEL_LZMA=y
-# CONFIG_KERNEL_LZO is not set
-# CONFIG_KEXEC is not set
-# CONFIG_KEYBOARD_LM8323 is not set
-# CONFIG_KEYS is not set
-# CONFIG_KMEMTRACE is not set
-CONFIG_KMOD=y
-# CONFIG_KPROBES is not set
-# CONFIG_KS8842 is not set
-# CONFIG_KS8851 is not set
-# CONFIG_LANMEDIA is not set
-# CONFIG_LAPB is not set
-# CONFIG_LASAT is not set
-# CONFIG_LATENCYTOP is not set
-CONFIG_LBDAF=y
-# CONFIG_LCD_LTV350QV is not set
-# CONFIG_LCD_TDO24M is not set
-# CONFIG_LCD_VGG2432A4 is not set
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_LEDS_ALIX is not set
-# CONFIG_LEDS_BD2802 is not set
-CONFIG_LEDS_CLASS=y
-# CONFIG_LEDS_DAC124S085 is not set
-CONFIG_LEDS_GPIO_PLATFORM=y
-# CONFIG_LEDS_LP3944 is not set
-# CONFIG_LEDS_LP5521 is not set
-# CONFIG_LEDS_PCA9532 is not set
-# CONFIG_LEDS_PCA955X is not set
-# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
-CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
-# CONFIG_LEDS_TRIGGER_GPIO is not set
-CONFIG_LEDS_TRIGGER_HEARTBEAT=y
-# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
-# CONFIG_LEDS_TRIGGER_MORSE is not set
-CONFIG_LEDS_TRIGGER_NETDEV=y
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_LIB80211_CRYPT_CCMP is not set
-# CONFIG_LIB80211_CRYPT_TKIP is not set
-# CONFIG_LIB80211_CRYPT_WEP is not set
-# CONFIG_LIB80211_DEBUG is not set
-# CONFIG_LIB80211 is not set
-# CONFIG_LIBCRC32C is not set
-# CONFIG_LIBERTAS is not set
-# CONFIG_LIBERTAS_THINFIRM is not set
-# CONFIG_LIBERTAS_USB is not set
-# CONFIG_LIBFC is not set
-# CONFIG_LIBFCOE is not set
-# CONFIG_LIBIPW_DEBUG is not set
-# CONFIG_LINE6_USB is not set
-# CONFIG_LLC2 is not set
-CONFIG_LLC=y
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_LOCKDEP_SUPPORT=y
-# CONFIG_LOCKD is not set
-CONFIG_LOCKD_V4=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_LOGIRUMBLEPAD2_FF is not set
-# CONFIG_LOGITECH_FF is not set
-# CONFIG_LOGO is not set
-# CONFIG_LSF is not set
-# CONFIG_LSI_ET1011C_PHY is not set
-# CONFIG_LTPC is not set
-# CONFIG_LXT_PHY is not set
-CONFIG_MAC80211_DEFAULT_PS_VALUE=1
-CONFIG_MAC80211_DEFAULT_PS=y
-# CONFIG_MAC80211 is not set
-# CONFIG_MAC_EMUMOUSEBTN is not set
-# CONFIG_MACINTOSH_DRIVERS is not set
-# CONFIG_MAC_PARTITION is not set
-# CONFIG_MACVLAN is not set
-# CONFIG_MAGIC_SYSRQ is not set
-# CONFIG_MARKEINS is not set
-# CONFIG_MARKERS is not set
-# CONFIG_MARVELL_PHY is not set
-# CONFIG_MDIO_BITBANG is not set
-# CONFIG_MD is not set
-# CONFIG_ME4000 is not set
-# CONFIG_MEDIA_ATTACH is not set
-# CONFIG_MEDIA_SUPPORT is not set
-# CONFIG_MEDIA_TUNER_CUSTOMISE is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_MEILHAUS is not set
-# CONFIG_MEMSTICK is not set
-# CONFIG_MFD_ASIC3 is not set
-# CONFIG_MFD_CORE is not set
-# CONFIG_MFD_PCF50633 is not set
-# CONFIG_MFD_SM501 is not set
-# CONFIG_MFD_TC6387XB is not set
-# CONFIG_MFD_TC6393XB is not set
-# CONFIG_MFD_TMIO is not set
-# CONFIG_MFD_WM8350_I2C is not set
-# CONFIG_MFD_WM8400 is not set
-# CONFIG_MG_DISK is not set
-# CONFIG_MIGRATION is not set
-CONFIG_MII=y
-CONFIG_MINI_FO=y
-# CONFIG_MINIX_FS is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_MIPS_FPU_EMU is not set
-CONFIG_MISC_DEVICES=y
-CONFIG_MISC_FILESYSTEMS=y
-# CONFIG_MISDN_HFCPCI is not set
-# CONFIG_MISDN_HFCUSB is not set
-# CONFIG_MISDN is not set
-# CONFIG_MKISS is not set
-# CONFIG_MMC_ARMMMCI is not set
-CONFIG_MMC_BLOCK_BOUNCE=y
-# CONFIG_MMC_BLOCK is not set
-# CONFIG_MMC_CB710 is not set
-# CONFIG_MMC_DEBUG is not set
-# CONFIG_MMC is not set
-# CONFIG_MMC_S3C is not set
-# CONFIG_MMC_SDHCI is not set
-# CONFIG_MMC_SDRICOH_CS is not set
-# CONFIG_MMC_SPI is not set
-# CONFIG_MMC_TEST is not set
-# CONFIG_MMC_UNSAFE_RESUME is not set
-# CONFIG_MMC_VIA_SDMMC is not set
-CONFIG_MMU=y
-# CONFIG_MODULE_FORCE_LOAD is not set
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MOUSE_APPLETOUCH is not set
-# CONFIG_MOUSE_INPORT is not set
-# CONFIG_MOUSE_LOGIBM is not set
-# CONFIG_MOUSE_PC110PAD is not set
-# CONFIG_MOUSE_SYNAPTICS_I2C is not set
-# CONFIG_MSDOS_FS is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_AFS_PARTS is not set
-# CONFIG_MTD_ALAUDA is not set
-# CONFIG_MTD_AR7_PARTS is not set
-# CONFIG_MTD_ARM_INTEGRATOR is not set
-CONFIG_MTD_BLKDEVS=y
-# CONFIG_MTD_BLOCK2MTD is not set
-CONFIG_MTD_BLOCK=y
-# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-CONFIG_MTD_CFI_AMDSTD=y
-# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
-CONFIG_MTD_CFI_INTELEXT=y
-# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-CONFIG_MTD_CFI_NOSWAP=y
-# CONFIG_MTD_CFI_STAA is not set
-CONFIG_MTD_CFI_UTIL=y
-CONFIG_MTD_CFI=y
-CONFIG_MTD_CHAR=y
-# CONFIG_MTD_CMDLINE_PARTS is not set
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_CONCAT is not set
-# CONFIG_MTD_DATAFLASH is not set
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-CONFIG_MTD_GEN_PROBE=y
-# CONFIG_MTD_INTEL_VR_NOR is not set
-# CONFIG_MTD_JEDECPROBE is not set
-# CONFIG_MTD_LPDDR is not set
-# CONFIG_MTD_M25P80 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_MYLOADER_PARTS is not set
-# CONFIG_MTD_NAND_CAFE is not set
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_GPIO is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND is not set
-# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-# CONFIG_MTD_NAND_NANDSIM is not set
-# CONFIG_MTD_NAND_PLATFORM is not set
-# CONFIG_MTD_NAND_VERIFY_WRITE is not set
-# CONFIG_MTD_ONENAND is not set
-# CONFIG_MTD_OOPS is not set
-# CONFIG_MTD_OTP is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_PCI is not set
-# CONFIG_MTD_PHRAM is not set
-# CONFIG_MTD_PHYSMAP_COMPAT is not set
-# CONFIG_MTD_PHYSMAP is not set
-# CONFIG_MTD_PLATRAM is not set
-# CONFIG_MTD_PMC551 is not set
-# CONFIG_MTD_RAM is not set
-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
-# CONFIG_MTD_REDBOOT_PARTS is not set
-# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-# CONFIG_MTD_ROM is not set
-CONFIG_MTD_ROOTFS_ROOT_DEV=y
-CONFIG_MTD_ROOTFS_SPLIT=y
-# CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_TESTS is not set
-# CONFIG_MTD_UBI is not set
-CONFIG_MTD=y
-# CONFIG_MVSWITCH_PHY is not set
-# CONFIG_MWAVE is not set
-# CONFIG_MWL8K is not set
-# CONFIG_MYRI10GE is not set
-# CONFIG_NAMESPACES is not set
-# CONFIG_NATIONAL_PHY is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_NEC_MARKEINS is not set
-# CONFIG_NET_9P is not set
-# CONFIG_NET_ACT_GACT is not set
-# CONFIG_NET_ACT_IPT is not set
-# CONFIG_NET_ACT_MIRRED is not set
-# CONFIG_NET_ACT_NAT is not set
-# CONFIG_NET_ACT_PEDIT is not set
-# CONFIG_NET_ACT_POLICE is not set
-# CONFIG_NET_ACT_SIMP is not set
-CONFIG_NET_ACT_SKBEDIT=y
-CONFIG_NET_CLS_ACT=y
-CONFIG_NET_CLS_BASIC=y
-# CONFIG_NET_CLS_FLOW is not set
-# CONFIG_NET_CLS_FW is not set
-CONFIG_NET_CLS_IND=y
-# CONFIG_NET_CLS_ROUTE4 is not set
-# CONFIG_NET_CLS_RSVP6 is not set
-# CONFIG_NET_CLS_RSVP is not set
-# CONFIG_NET_CLS_TCINDEX is not set
-# CONFIG_NET_CLS_U32 is not set
-CONFIG_NET_CLS=y
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETDEBUG is not set
-# CONFIG_NETDEV_10000 is not set
-CONFIG_NETDEV_1000=y
-CONFIG_NETDEVICES_MULTIQUEUE=y
-CONFIG_NETDEVICES=y
-# CONFIG_NET_DROP_MONITOR is not set
-# CONFIG_NET_DSA is not set
-# CONFIG_NET_EMATCH_CMP is not set
-# CONFIG_NET_EMATCH is not set
-# CONFIG_NET_EMATCH_META is not set
-# CONFIG_NET_EMATCH_NBYTE is not set
-CONFIG_NET_EMATCH_STACK=32
-# CONFIG_NET_EMATCH_TEXT is not set
-# CONFIG_NET_EMATCH_U32 is not set
-CONFIG_NET_ESTIMATOR=y
-CONFIG_NET_ETHERNET=y
-# CONFIG_NET_FC is not set
-CONFIG_NETFILTER_ADVANCED=y
-# CONFIG_NETFILTER_DEBUG is not set
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_NETLINK_LOG is not set
-# CONFIG_NETFILTER_NETLINK_QUEUE is not set
-# CONFIG_NETFILTER_TPROXY is not set
-# CONFIG_NETFILTER_XTABLES is not set
-# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set
-# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set
-# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
-# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
-# CONFIG_NETFILTER_XT_MATCH_ESP is not set
-# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_HELPER is not set
-# CONFIG_NETFILTER_XT_MATCH_HL is not set
-# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
-# CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG is not set
-# CONFIG_NETFILTER_XT_MATCH_LAYER7 is not set
-# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
-# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_MAC is not set
-# CONFIG_NETFILTER_XT_MATCH_MARK is not set
-# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
-# CONFIG_NETFILTER_XT_MATCH_OSF is not set
-# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
-# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
-# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
-# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
-# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
-# CONFIG_NETFILTER_XT_MATCH_REALM is not set
-# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
-# CONFIG_NETFILTER_XT_MATCH_RECENT_PROC_COMPAT is not set
-# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
-# CONFIG_NETFILTER_XT_MATCH_STATE is not set
-# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
-# CONFIG_NETFILTER_XT_MATCH_STRING is not set
-# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
-# CONFIG_NETFILTER_XT_MATCH_TIME is not set
-# CONFIG_NETFILTER_XT_MATCH_U32 is not set
-# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
-# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
-# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
-# CONFIG_NETFILTER_XT_TARGET_HL is not set
-# CONFIG_NETFILTER_XT_TARGET_IMQ is not set
-# CONFIG_NETFILTER_XT_TARGET_LED is not set
-# CONFIG_NETFILTER_XT_TARGET_MARK is not set
-# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
-# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
-# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
-# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
-# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
-CONFIG_NETFILTER=y
-CONFIG_NET_IPGRE_BROADCAST=y
-# CONFIG_NET_IPGRE is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_ISA is not set
-# CONFIG_NET_KEY is not set
-# CONFIG_NET_KEY_MIGRATE is not set
-CONFIG_NET_PCI=y
-# CONFIG_NET_PCMCIA is not set
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_NETPOLL is not set
-CONFIG_NET_RADIO=y
-# CONFIG_NETROM is not set
-# CONFIG_NET_SB1000 is not set
-# CONFIG_NET_SCH_ATM is not set
-# CONFIG_NET_SCH_CBQ is not set
-# CONFIG_NET_SCH_CLK_CPU is not set
-# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
-CONFIG_NET_SCH_CLK_JIFFIES=y
-# CONFIG_NET_SCH_DRR is not set
-# CONFIG_NET_SCH_DSMARK is not set
-CONFIG_NET_SCHED=y
-# CONFIG_NET_SCH_ESFQ is not set
-CONFIG_NET_SCH_ESFQ_NFCT=y
-CONFIG_NET_SCH_FIFO=y
-# CONFIG_NET_SCH_GRED is not set
-# CONFIG_NET_SCH_HFSC is not set
-# CONFIG_NET_SCH_HTB is not set
-# CONFIG_NET_SCH_INGRESS is not set
-# CONFIG_NET_SCH_MULTIQ is not set
-# CONFIG_NET_SCH_NETEM is not set
-# CONFIG_NET_SCH_PRIO is not set
-# CONFIG_NET_SCH_RED is not set
-# CONFIG_NET_SCH_RR is not set
-# CONFIG_NET_SCH_SFQ is not set
-# CONFIG_NET_SCH_TBF is not set
-# CONFIG_NET_SCH_TEQL is not set
-# CONFIG_NET_TULIP is not set
-# CONFIG_NET_VENDOR_3COM is not set
-CONFIG_NET_WIRELESS_RTNETLINK=y
-CONFIG_NET_WIRELESS=y
-CONFIG_NETWORK_FILESYSTEMS=y
-# CONFIG_NETWORK_SECMARK is not set
-# CONFIG_NETXEN_NIC is not set
-CONFIG_NET=y
-# CONFIG_NEW_GPIO is not set
-CONFIG_NEW_LEDS=y
-# CONFIG_NF_CONNTRACK_AMANDA is not set
-CONFIG_NF_CONNTRACK_ENABLED=y
-# CONFIG_NF_CONNTRACK_EVENTS is not set
-# CONFIG_NF_CONNTRACK_FTP is not set
-# CONFIG_NF_CONNTRACK_H323 is not set
-# CONFIG_NF_CONNTRACK_IPV4 is not set
-# CONFIG_NF_CONNTRACK_IPV6 is not set
-# CONFIG_NF_CONNTRACK_IRC is not set
-# CONFIG_NF_CONNTRACK is not set
-CONFIG_NF_CONNTRACK_MARK=y
-# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
-# CONFIG_NF_CONNTRACK_PPTP is not set
-CONFIG_NF_CONNTRACK_PROC_COMPAT=y
-# CONFIG_NF_CONNTRACK_RTSP is not set
-# CONFIG_NF_CONNTRACK_SANE is not set
-# CONFIG_NF_CONNTRACK_SIP is not set
-CONFIG_NF_CONNTRACK_SUPPORT=y
-# CONFIG_NF_CONNTRACK_TFTP is not set
-# CONFIG_NF_CT_ACCT is not set
-# CONFIG_NF_CT_NETLINK is not set
-# CONFIG_NF_CT_PROTO_DCCP is not set
-# CONFIG_NF_CT_PROTO_GRE is not set
-# CONFIG_NF_CT_PROTO_SCTP is not set
-# CONFIG_NF_CT_PROTO_UDPLITE is not set
-# CONFIG_NF_DEFRAG_IPV4 is not set
-# CONFIG_NF_NAT_AMANDA is not set
-# CONFIG_NF_NAT_FTP is not set
-# CONFIG_NF_NAT_H323 is not set
-# CONFIG_NF_NAT_IRC is not set
-# CONFIG_NF_NAT is not set
-CONFIG_NF_NAT_NEEDED=y
-# CONFIG_NF_NAT_PPTP is not set
-# CONFIG_NF_NAT_PROTO_GRE is not set
-# CONFIG_NF_NAT_RTSP is not set
-# CONFIG_NF_NAT_SIP is not set
-# CONFIG_NF_NAT_SNMP_BASIC is not set
-# CONFIG_NF_NAT_TFTP is not set
-# CONFIG_NFS_ACL_SUPPORT is not set
-CONFIG_NFS_COMMON=y
-# CONFIG_NFS_DIRECTIO is not set
-# CONFIG_NFSD is not set
-CONFIG_NFSD_TCP=y
-# CONFIG_NFSD_V2_ACL is not set
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V4 is not set
-# CONFIG_NFS_FS is not set
-# CONFIG_NFS_V3_ACL is not set
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V4_1 is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFTL is not set
-# CONFIG_NILFS2_FS is not set
-CONFIG_NL80211=y
-CONFIG_NLATTR=y
-# CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-# CONFIG_NO_HZ is not set
-# CONFIG_NOP_USB_XCEIV is not set
-# CONFIG_NORTEL_HERMES is not set
-# CONFIG_NOZOMI is not set
-# CONFIG_NS83820 is not set
-# CONFIG_NTFS_DEBUG is not set
-# CONFIG_NTFS_FS is not set
-# CONFIG_NTFS_RW is not set
-# CONFIG_NVRAM is not set
-# CONFIG_OCF_BENCH is not set
-# CONFIG_OCF_EP80579 is not set
-# CONFIG_OCF_HIFNHIPP is not set
-# CONFIG_OCF_HIFN is not set
-# CONFIG_OCF_IXP4XX is not set
-# CONFIG_OCF_OCF is not set
-# CONFIG_OCF_OCFNULL is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_OCF_SAFE is not set
-# CONFIG_OCF_TALITOS is not set
-# CONFIG_OMFS_FS is not set
-# CONFIG_OPROFILE is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_P54_COMMON is not set
-CONFIG_PACKET_MMAP=y
-CONFIG_PACKET=y
-# CONFIG_PAGE_SIZE_16KB is not set
-# CONFIG_PAGE_SIZE_32KB is not set
-CONFIG_PAGE_SIZE_4KB=y
-# CONFIG_PAGE_SIZE_64KB is not set
-# CONFIG_PAGE_SIZE_8KB is not set
-# CONFIG_PANTHERLORD_FF is not set
-# CONFIG_PARPORT is not set
-# CONFIG_PARPORT_PC is not set
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_PATA_ALI is not set
-# CONFIG_PATA_AMD is not set
-# CONFIG_PATA_ARTOP is not set
-# CONFIG_PATA_ATIIXP is not set
-# CONFIG_PATA_CMD640_PCI is not set
-# CONFIG_PATA_CMD64X is not set
-# CONFIG_PATA_CS5520 is not set
-# CONFIG_PATA_CS5530 is not set
-# CONFIG_PATA_CS5535 is not set
-# CONFIG_PATA_CS5536 is not set
-# CONFIG_PATA_CYPRESS is not set
-# CONFIG_PATA_EFAR is not set
-# CONFIG_PATA_HPT366 is not set
-# CONFIG_PATA_HPT37X is not set
-# CONFIG_PATA_HPT3X2N is not set
-# CONFIG_PATA_HPT3X3 is not set
-# CONFIG_PATA_ISAPNP is not set
-# CONFIG_PATA_IT8213 is not set
-# CONFIG_PATA_IT821X is not set
-# CONFIG_PATA_JMICRON is not set
-# CONFIG_PATA_LEGACY is not set
-# CONFIG_PATA_MARVELL is not set
-# CONFIG_PATA_MPIIX is not set
-# CONFIG_PATA_NETCELL is not set
-# CONFIG_PATA_NINJA32 is not set
-# CONFIG_PATA_NS87410 is not set
-# CONFIG_PATA_NS87415 is not set
-# CONFIG_PATA_OLDPIIX is not set
-# CONFIG_PATA_OPTIDMA is not set
-# CONFIG_PATA_OPTI is not set
-# CONFIG_PATA_PCMCIA is not set
-# CONFIG_PATA_PDC2027X is not set
-# CONFIG_PATA_PDC_OLD is not set
-# CONFIG_PATA_PLATFORM is not set
-# CONFIG_PATA_QDI is not set
-# CONFIG_PATA_RADISYS is not set
-# CONFIG_PATA_RZ1000 is not set
-# CONFIG_PATA_SC1200 is not set
-# CONFIG_PATA_SCH is not set
-# CONFIG_PATA_SERVERWORKS is not set
-# CONFIG_PATA_SIL680 is not set
-# CONFIG_PATA_SIS is not set
-# CONFIG_PATA_TRIFLEX is not set
-# CONFIG_PATA_VIA is not set
-# CONFIG_PATA_WINBOND is not set
-# CONFIG_PATA_WINBOND_VLB is not set
-# CONFIG_PC300TOO is not set
-# CONFIG_PCCARD is not set
-# CONFIG_PCF8575 is not set
-# CONFIG_PCI is not set
-# CONFIG_PCI200SYN is not set
-# CONFIG_PCI_ATMEL is not set
-# CONFIG_PCI_DISABLE_COMMON_QUIRKS is not set
-# CONFIG_PCIEASPM is not set
-# CONFIG_PCI_HERMES is not set
-# CONFIG_PCI_IOV is not set
-# CONFIG_PCI_LEGACY is not set
-# CONFIG_PCI_MSI is not set
-# CONFIG_PCIPCWATCHDOG is not set
-CONFIG_PCI_QUIRKS=y
-# CONFIG_PCI_STUB is not set
-CONFIG_PCI_SYSCALL=y
-# CONFIG_PCMCIA_AHA152X is not set
-# CONFIG_PCMCIA_ATMEL is not set
-# CONFIG_PCMCIA_DEBUG is not set
-# CONFIG_PCMCIA_FDOMAIN is not set
-# CONFIG_PCMCIA_HERMES is not set
-# CONFIG_PCMCIA_IOCTL is not set
-# CONFIG_PCMCIA is not set
-# CONFIG_PCMCIA_LOAD_CIS is not set
-# CONFIG_PCMCIA_NETWAVE is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
-# CONFIG_PCMCIA_QLOGIC is not set
-# CONFIG_PCMCIA_RAYCS is not set
-# CONFIG_PCMCIA_SPECTRUM is not set
-# CONFIG_PCMCIA_SYM53C500 is not set
-# CONFIG_PCMCIA_WAVELAN is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_PCNET32 is not set
-# CONFIG_PCSPKR_PLATFORM is not set
-# CONFIG_PD6729 is not set
-# CONFIG_PDC_ADMA is not set
-# CONFIG_PHANTOM is not set
-# CONFIG_PHONE is not set
-# CONFIG_PHONET is not set
-# CONFIG_PHYLIB is not set
-# CONFIG_PHYS_ADDR_T_64BIT is not set
-# CONFIG_PID_NS is not set
-# CONFIG_PLAN9AUTH is not set
-CONFIG_PLIST=y
-# CONFIG_PLX_HERMES is not set
-# CONFIG_PMIC_DA903X is not set
-# CONFIG_PM is not set
-# CONFIG_POHMELFS is not set
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_POWER_SUPPLY is not set
-# CONFIG_PPC_16K_PAGES is not set
-# CONFIG_PPC_256K_PAGES is not set
-CONFIG_PPC_4K_PAGES=y
-CONFIG_PPC4xx_GPIO=y
-# CONFIG_PPC_64K_PAGES is not set
-# CONFIG_PPC_EMULATED_STATS is not set
-# CONFIG_PPP_ASYNC is not set
-# CONFIG_PPP_BSDCOMP is not set
-# CONFIG_PPP_DEFLATE is not set
-CONFIG_PPP_FILTER=y
-# CONFIG_PPP is not set
-# CONFIG_PPP_MPPE is not set
-CONFIG_PPP_MULTILINK=y
-# CONFIG_PPPOATM is not set
-# CONFIG_PPPOE is not set
-# CONFIG_PPPOL2TP is not set
-# CONFIG_PPP_SYNC_TTY is not set
-# CONFIG_PPS is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_RCU is not set
-# CONFIG_PREEMPT_RCU_TRACE is not set
-# CONFIG_PREEMPT_VOLUNTARY is not set
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_PRINTK=y
-# CONFIG_PRISM2_USB is not set
-# CONFIG_PRISM54 is not set
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-# CONFIG_PROC_PAGE_MONITOR is not set
-CONFIG_PROC_SYSCTL=y
-# CONFIG_PROFILING is not set
-# CONFIG_QEMU is not set
-# CONFIG_QLA3XXX is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_QSEMI_PHY is not set
-# CONFIG_QUOTA is not set
-# CONFIG_R3964 is not set
-# CONFIG_R6040 is not set
-# CONFIG_R8169 is not set
-# CONFIG_RADIO_ADAPTERS is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_GEMTEK_PCI is not set
-# CONFIG_RADIO_MAESTRO is not set
-# CONFIG_RADIO_MAXIRADIO is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_ZOLTRIX is not set
-# CONFIG_RAID_ATTRS is not set
-CONFIG_RAMFS=y
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-# CONFIG_RD_BZIP2 is not set
-# CONFIG_RDC_17F3101X is not set
-# CONFIG_RD_GZIP is not set
-CONFIG_RD_LZMA=y
-# CONFIG_RD_LZO is not set
-# CONFIG_REALTEK_PHY is not set
-# CONFIG_REDWOOD is not set
-# CONFIG_REGULATOR_BQ24022 is not set
-# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
-# CONFIG_REGULATOR is not set
-# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_REISERFS_FS_XATTR is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-# CONFIG_RELAY is not set
-# CONFIG_RESOURCES_64BIT is not set
-# CONFIG_RFD_FTL is not set
-# CONFIG_RFKILL_INPUT is not set
-# CONFIG_RFKILL is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_ROSE is not set
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_RT2860 is not set
-# CONFIG_RT2870 is not set
-# CONFIG_RT2X00 is not set
-# CONFIG_RT3070 is not set
-# CONFIG_RTC_CLASS is not set
-# CONFIG_RTC_DEBUG is not set
-# CONFIG_RTC_DRV_BQ4802 is not set
-CONFIG_RTC_DRV_CMOS=y
-# CONFIG_RTC_DRV_DS1286 is not set
-# CONFIG_RTC_DRV_DS1305 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1374 is not set
-# CONFIG_RTC_DRV_DS1390 is not set
-# CONFIG_RTC_DRV_DS1511 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_DS3234 is not set
-# CONFIG_RTC_DRV_FM3130 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_M41T80 is not set
-# CONFIG_RTC_DRV_M41T94 is not set
-# CONFIG_RTC_DRV_M48T35 is not set
-# CONFIG_RTC_DRV_M48T59 is not set
-# CONFIG_RTC_DRV_M48T86 is not set
-# CONFIG_RTC_DRV_MAX6900 is not set
-# CONFIG_RTC_DRV_MAX6902 is not set
-# CONFIG_RTC_DRV_PCF50606 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_R9701 is not set
-# CONFIG_RTC_DRV_RS5C348 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-# CONFIG_RTC_DRV_RTC7301 is not set
-# CONFIG_RTC_DRV_RX8025 is not set
-# CONFIG_RTC_DRV_RX8581 is not set
-# CONFIG_RTC_DRV_S35390A is not set
-# CONFIG_RTC_DRV_STK17TA8 is not set
-# CONFIG_RTC_DRV_TEST is not set
-# CONFIG_RTC_DRV_V3020 is not set
-# CONFIG_RTC_DRV_X1205 is not set
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-CONFIG_RTC_HCTOSYS=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-CONFIG_RTC_INTF_DEV=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_LIB=y
-# CONFIG_RTL8180 is not set
-# CONFIG_RTL8187 is not set
-# CONFIG_RTL8187SE is not set
-# CONFIG_RTL8192SU is not set
-# CONFIG_RTL8306_PHY is not set
-# CONFIG_RTL8366_SMI is not set
-# CONFIG_RTL8366S_PHY_DEBUG_FS is not set
-# CONFIG_RTL8366S_PHY is not set
-# CONFIG_RTL8366RB_PHY is not set
-CONFIG_RT_MUTEXES=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-# CONFIG_S2IO is not set
-# CONFIG_SAMPLES is not set
-# CONFIG_SATA_AHCI is not set
-# CONFIG_SATA_INIC162X is not set
-# CONFIG_SATA_MV is not set
-# CONFIG_SATA_NV is not set
-# CONFIG_SATA_PMP is not set
-# CONFIG_SATA_PROMISE is not set
-# CONFIG_SATA_QSTOR is not set
-# CONFIG_SATA_SIL24 is not set
-# CONFIG_SATA_SIL is not set
-# CONFIG_SATA_SIS is not set
-# CONFIG_SATA_SVW is not set
-# CONFIG_SATA_SX4 is not set
-# CONFIG_SATA_ULI is not set
-# CONFIG_SATA_VIA is not set
-# CONFIG_SATA_VITESSE is not set
-# CONFIG_SC92031 is not set
-# CONFIG_SCC is not set
-# CONFIG_SCHED_BFS is not set
-CONFIG_SCHED_CFS=y
-# CONFIG_SCHED_TRACER is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_7000FASST is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC94XX is not set
-# CONFIG_SCSI_ARCMSR is not set
-# CONFIG_SCSI_BNX2_ISCSI is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DEBUG is not set
-# CONFIG_SCSI_DH is not set
-CONFIG_SCSI_DMA=y
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DPT_I2O is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_ESP_CORE is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
-CONFIG_SCSI_LOWLEVEL=y
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_MPT2SAS is not set
-CONFIG_SCSI_MULTI_LUN=y
-# CONFIG_SCSI_MVSAS is not set
-# CONFIG_SCSI_MVSAS_DEBUG is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_NETLINK is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_OSD_INITIATOR is not set
-# CONFIG_SCSI_PAS16 is not set
-CONFIG_SCSI_PROC_FS=y
-# CONFIG_SCSI_PSI240I is not set
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_QLA_ISCSI is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-# CONFIG_SCSI_SEAGATE is not set
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_SRP_ATTRS is not set
-# CONFIG_SCSI_SRP is not set
-# CONFIG_SCSI_STEX is not set
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-CONFIG_SCSI_WAIT_SCAN=m
-# CONFIG_SECCOMP is not set
-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-# CONFIG_SECURITYFS is not set
-# CONFIG_SECURITY is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-# CONFIG_SENSORS_ABITUGURU3 is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_AD7414 is not set
-# CONFIG_SENSORS_AD7418 is not set
-# CONFIG_SENSORS_ADCXX is not set
-# CONFIG_SENSORS_ADM1021 is not set
-# CONFIG_SENSORS_ADM1025 is not set
-# CONFIG_SENSORS_ADM1026 is not set
-# CONFIG_SENSORS_ADM1029 is not set
-# CONFIG_SENSORS_ADM1031 is not set
-# CONFIG_SENSORS_ADM9240 is not set
-# CONFIG_SENSORS_ADS7828 is not set
-# CONFIG_SENSORS_ADT7462 is not set
-# CONFIG_SENSORS_ADT7470 is not set
-# CONFIG_SENSORS_ADT7473 is not set
-# CONFIG_SENSORS_ADT7475 is not set
-# CONFIG_SENSORS_APPLESMC is not set
-# CONFIG_SENSORS_ASB100 is not set
-# CONFIG_SENSORS_ATK0110 is not set
-# CONFIG_SENSORS_ATXP1 is not set
-# CONFIG_SENSORS_CORETEMP is not set
-# CONFIG_SENSORS_DME1737 is not set
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_DS1621 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_F71882FG is not set
-# CONFIG_SENSORS_F75375S is not set
-# CONFIG_SENSORS_FSCHER is not set
-# CONFIG_SENSORS_FSCHMD is not set
-# CONFIG_SENSORS_FSCPOS is not set
-# CONFIG_SENSORS_G760A is not set
-# CONFIG_SENSORS_GL518SM is not set
-# CONFIG_SENSORS_GL520SM is not set
-# CONFIG_SENSORS_HDAPS is not set
-# CONFIG_SENSORS_I5K_AMB is not set
-# CONFIG_SENSORS_IT87 is not set
-# CONFIG_SENSORS_K8TEMP is not set
-# CONFIG_SENSORS_LIS3LV02D is not set
-# CONFIG_SENSORS_LIS3_SPI is not set
-# CONFIG_SENSORS_LM63 is not set
-# CONFIG_SENSORS_LM70 is not set
-# CONFIG_SENSORS_LM75 is not set
-# CONFIG_SENSORS_LM77 is not set
-# CONFIG_SENSORS_LM78 is not set
-# CONFIG_SENSORS_LM80 is not set
-# CONFIG_SENSORS_LM83 is not set
-# CONFIG_SENSORS_LM85 is not set
-# CONFIG_SENSORS_LM87 is not set
-# CONFIG_SENSORS_LM90 is not set
-# CONFIG_SENSORS_LM92 is not set
-# CONFIG_SENSORS_LM93 is not set
-# CONFIG_SENSORS_LM95241 is not set
-# CONFIG_SENSORS_LTC4215 is not set
-# CONFIG_SENSORS_LTC4245 is not set
-# CONFIG_SENSORS_M41T00 is not set
-# CONFIG_SENSORS_MAX1111 is not set
-# CONFIG_SENSORS_MAX1619 is not set
-# CONFIG_SENSORS_MAX6650 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_SENSORS_PC87360 is not set
-# CONFIG_SENSORS_PC87427 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_SHT15 is not set
-# CONFIG_SENSORS_SIS5595 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_SMSC47M192 is not set
-# CONFIG_SENSORS_SMSC47M1 is not set
-# CONFIG_SENSORS_THMC50 is not set
-# CONFIG_SENSORS_TMP401 is not set
-# CONFIG_SENSORS_TSL2550 is not set
-# CONFIG_SENSORS_VIA686A is not set
-# CONFIG_SENSORS_VT1211 is not set
-# CONFIG_SENSORS_VT8231 is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83781D is not set
-# CONFIG_SENSORS_W83791D is not set
-# CONFIG_SENSORS_W83792D is not set
-# CONFIG_SENSORS_W83793 is not set
-# CONFIG_SENSORS_W83L785TS is not set
-# CONFIG_SENSORS_W83L786NG is not set
-CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_SERIAL_8250_CS is not set
-CONFIG_SERIAL_8250_NR_UARTS=2
-# CONFIG_SERIAL_8250_PCI is not set
-CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-# CONFIG_SERIAL_JSM is not set
-# CONFIG_SERIAL_MAX3100 is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set
-# CONFIG_SERIAL_UARTLITE is not set
-# CONFIG_SERIO is not set
-# CONFIG_SGI_IOC4 is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_SHAPER is not set
-CONFIG_SHMEM=y
-CONFIG_SIGNALFD=y
-# CONFIG_SIMPLE_GPIO is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SIS900 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2_DEBUG is not set
-# CONFIG_SKY2 is not set
-CONFIG_SLABINFO=y
-CONFIG_SLAB=y
-# CONFIG_SLHC is not set
-# CONFIG_SLICOSS is not set
-# CONFIG_SLIP is not set
-# CONFIG_SLOB is not set
-# CONFIG_SLOW_WORK is not set
-# CONFIG_SLUB_DEBUG is not set
-# CONFIG_SLUB is not set
-# CONFIG_SMARTJOYPLUS_FF is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_SMB_NLS_DEFAULT is not set
-# CONFIG_SMC911X is not set
-# CONFIG_SMC91X is not set
-# CONFIG_SMP is not set
-# CONFIG_SMSC911X is not set
-# CONFIG_SMSC9420 is not set
-# CONFIG_SMSC_PHY is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ADLIB is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALS4000 is not set
-# CONFIG_SND_ARM is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AW2 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_CS5530 is not set
-# CONFIG_SND_CS5535AUDIO is not set
-# CONFIG_SND_CTXFI is not set
-# CONFIG_SND_DARLA20 is not set
-# CONFIG_SND_DARLA24 is not set
-# CONFIG_SND_DEBUG is not set
-CONFIG_SND_DRIVERS=y
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_DYNAMIC_MINORS is not set
-# CONFIG_SND_ECHO3G is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_GINA20 is not set
-# CONFIG_SND_GINA24 is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_HIFIER is not set
-# CONFIG_SND_HRTIMER is not set
-# CONFIG_SND_HWDEP is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-# CONFIG_SND_INDIGODJ is not set
-# CONFIG_SND_INDIGODJX is not set
-# CONFIG_SND_INDIGOIO is not set
-# CONFIG_SND_INDIGOIOX is not set
-# CONFIG_SND_INDIGO is not set
-# CONFIG_SND_INTEL8X0 is not set
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_ISA is not set
-# CONFIG_SND is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_LAYLA20 is not set
-# CONFIG_SND_LAYLA24 is not set
-# CONFIG_SND_LX6464ES is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIA is not set
-# CONFIG_SND_MIPS is not set
-# CONFIG_SND_MIRO is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_MIXER_OSS is not set
-# CONFIG_SND_MONA is not set
-# CONFIG_SND_MPU401 is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-CONFIG_SND_OSSEMUL=y
-# CONFIG_SND_OXYGEN is not set
-CONFIG_SND_PCI=y
-# CONFIG_SND_PCMCIA is not set
-# CONFIG_SND_PCM is not set
-# CONFIG_SND_PCM_OSS is not set
-CONFIG_SND_PCM_OSS_PLUGINS=y
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_PDAUDIOCF is not set
-# CONFIG_SND_RAWMIDI is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RTCTIMER is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SEQUENCER is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_SIS7019 is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SOC is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_SPI is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_SND_SUPPORT_OLD_API is not set
-# CONFIG_SND_TIMER is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_CAIAQ is not set
-# CONFIG_SND_USB_US122L is not set
-# CONFIG_SND_USB_USX2Y is not set
-CONFIG_SND_USB=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VIRTUOSO is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_WAVEFRONT is not set
-# CONFIG_SND_YMFPCI is not set
-# CONFIG_SNI_RM is not set
-# CONFIG_SOC_CAMERA is not set
-# CONFIG_SOFT_WATCHDOG is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_SONY_LAPTOP is not set
-# CONFIG_SONYPI is not set
-# CONFIG_SOUND is not set
-# CONFIG_SOUND_PRIME is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_STATIC is not set
-# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-# CONFIG_SPI_AT25 is not set
-# CONFIG_SPI_DEBUG is not set
-# CONFIG_SPI_GPIO_OLD is not set
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-# CONFIG_SPI_ORION is not set
-# CONFIG_SPI_TLE62X0 is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-CONFIG_SQUASHFS_LZMA=y
-CONFIG_SQUASHFS_SUPPORT_ZLIB=y
-# CONFIG_SQUASHFS_VMALLOC is not set
-CONFIG_SQUASHFS=y
-# CONFIG_SSB_BLOCKIO is not set
-# CONFIG_SSB_DEBUG is not set
-# CONFIG_SSB is not set
-# CONFIG_SSB_PCMCIAHOST is not set
-CONFIG_SSB_POSSIBLE=y
-# CONFIG_SSB_SILENT is not set
-# CONFIG_SSFDC is not set
-# CONFIG_STACK_TRACER is not set
-CONFIG_STACKTRACE_SUPPORT=y
-# CONFIG_STAGING_EXCLUDE_BUILD is not set
-CONFIG_STAGING=y
-CONFIG_STANDALONE=y
-CONFIG_STDBINUTILS=y
-# CONFIG_STE10XP is not set
-CONFIG_STP=y
-CONFIG_STRIP_ASM_SYMS=y
-# CONFIG_STRIP is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_SUNRPC_BIND34 is not set
-# CONFIG_SUNRPC_GSS is not set
-# CONFIG_SUNRPC is not set
-# CONFIG_SUNRPC_REGISTER_V4 is not set
-CONFIG_SUSPEND_UP_POSSIBLE=y
-CONFIG_SWAP=y
-# CONFIG_SWCONFIG is not set
-# CONFIG_SYNCLINK_CS is not set
-CONFIG_SYN_COOKIES=y
-CONFIG_SYSCTL_SYSCALL_CHECK=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_SYSCTL=y
-# CONFIG_SYSFS_DEPRECATED is not set
-# CONFIG_SYSFS_DEPRECATED_V2 is not set
-CONFIG_SYSFS=y
-# CONFIG_SYS_HYPERVISOR is not set
-# CONFIG_SYSV68_PARTITION is not set
-# CONFIG_SYSV_FS is not set
-CONFIG_SYSVIPC_SYSCTL=y
-CONFIG_SYSVIPC=y
-# CONFIG_TASKSTATS is not set
-# CONFIG_TCG_TPM is not set
-# CONFIG_TCIC is not set
-CONFIG_TCP_CONG_ADVANCED=y
-# CONFIG_TCP_CONG_BIC is not set
-# CONFIG_TCP_CONG_CUBIC is not set
-# CONFIG_TCP_CONG_HSTCP is not set
-# CONFIG_TCP_CONG_HTCP is not set
-# CONFIG_TCP_CONG_HYBLA is not set
-# CONFIG_TCP_CONG_ILLINOIS is not set
-# CONFIG_TCP_CONG_LP is not set
-# CONFIG_TCP_CONG_SCALABLE is not set
-# CONFIG_TCP_CONG_VEGAS is not set
-# CONFIG_TCP_CONG_VENO is not set
-CONFIG_TCP_CONG_WESTWOOD=y
-# CONFIG_TCP_CONG_YEAH is not set
-# CONFIG_TCP_MD5SIG is not set
-# CONFIG_TEXTSEARCH_BM is not set
-# CONFIG_TEXTSEARCH_FSM is not set
-# CONFIG_TEXTSEARCH_KMP is not set
-CONFIG_TEXTSEARCH=y
-# CONFIG_THERMAL_HWMON is not set
-# CONFIG_THERMAL is not set
-# CONFIG_THRUSTMASTER_FF is not set
-CONFIG_TICK_ONESHOT=y
-# CONFIG_TIFM_CORE is not set
-# CONFIG_TIGON3 is not set
-CONFIG_TIMERFD=y
-# CONFIG_TINY_SHMEM is not set
-# CONFIG_TIPC is not set
-# CONFIG_TLAN is not set
-# CONFIG_TMD_HERMES is not set
-# CONFIG_TMPFS_POSIX_ACL is not set
-CONFIG_TMPFS=y
-# CONFIG_TOUCHSCREEN_AD7877 is not set
-# CONFIG_TOUCHSCREEN_AD7879_I2C is not set
-# CONFIG_TOUCHSCREEN_AD7879 is not set
-# CONFIG_TOUCHSCREEN_AD7879_SPI is not set
-# CONFIG_TOUCHSCREEN_ADS7846 is not set
-# CONFIG_TOUCHSCREEN_EETI is not set
-# CONFIG_TOUCHSCREEN_ELO is not set
-# CONFIG_TOUCHSCREEN_FILTER is not set
-# 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_PENMOUNT is not set
-# CONFIG_TOUCHSCREEN_S3C2410 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_W90X900 is not set
-# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
-# CONFIG_TPS65010 is not set
-# CONFIG_TRACE_BRANCH_PROFILING is not set
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-CONFIG_TRACING_SUPPORT=y
-# CONFIG_TRANZPORT is not set
-# CONFIG_TREE_RCU is not set
-# CONFIG_TREE_RCU_TRACE is not set
-# CONFIG_TR is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_TUNER_TEA5761 is not set
-# CONFIG_TUN is not set
-# CONFIG_TWL4030_CORE is not set
-# CONFIG_UACCESS_WITH_MEMCPY is not set
-# CONFIG_UCB1400_CORE is not set
-# CONFIG_UDF_FS is not set
-CONFIG_UDF_NLS=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-# CONFIG_UFS_FS is not set
-# CONFIG_UIO is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_UNEVICTABLE_LRU is not set
-# CONFIG_UNION_MOUNT is not set
-CONFIG_UNIX98_PTYS=y
-# CONFIG_UNIXWARE_DISKLABEL is not set
-CONFIG_UNIX=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_ADUTUX is not set
-# CONFIG_USB_AIPTEK is not set
-CONFIG_USB_ALI_M5632=y
-CONFIG_USB_AN2720=y
-# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_APPLETOUCH is not set
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARMLINUX=y
-# CONFIG_USB_ATI_REMOTE2 is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_ATMEL is not set
-# CONFIG_USB_ATM is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_BANDWIDTH is not set
-CONFIG_USB_BELKIN=y
-# CONFIG_USB_BERRY_CHARGE is not set
-# CONFIG_USB_C67X00_HCD is not set
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_CPC is not set
-# CONFIG_USB_CXACRU is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_DABUSB is not set
-# CONFIG_USB_DEBUG is not set
-# CONFIG_USB_DEVICE_CLASS is not set
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_DSBR is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_EHCI_HCD_PPC_OF is not set
-CONFIG_USB_EHCI_ROOT_HUB_TT=y
-# CONFIG_USB_EHCI_SPLIT_ISO is not set
-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EPSON2888 is not set
-# CONFIG_USB_ET61X251 is not set
-CONFIG_USB_EZUSB=y
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_GADGET is not set
-# CONFIG_USB_GPIO_VBUS is not set
-# CONFIG_USB_GSPCA_CONEX is not set
-# CONFIG_USB_GSPCA_ETOMS is not set
-# CONFIG_USB_GSPCA_FINEPIX is not set
-# CONFIG_USB_GSPCA is not set
-# CONFIG_USB_GSPCA_MARS is not set
-# CONFIG_USB_GSPCA_MR97310A is not set
-# CONFIG_USB_GSPCA_OV519 is not set
-# CONFIG_USB_GSPCA_OV534 is not set
-# CONFIG_USB_GSPCA_PAC207 is not set
-# CONFIG_USB_GSPCA_PAC7311 is not set
-CONFIG_USB_GSPCA_SN9C20X_EVDEV=y
-# CONFIG_USB_GSPCA_SN9C20X is not set
-# CONFIG_USB_GSPCA_SONIXB is not set
-# CONFIG_USB_GSPCA_SONIXJ is not set
-# CONFIG_USB_GSPCA_SPCA500 is not set
-# CONFIG_USB_GSPCA_SPCA501 is not set
-# CONFIG_USB_GSPCA_SPCA505 is not set
-# CONFIG_USB_GSPCA_SPCA506 is not set
-# CONFIG_USB_GSPCA_SPCA508 is not set
-# CONFIG_USB_GSPCA_SPCA561 is not set
-# CONFIG_USB_GSPCA_SQ905C is not set
-# CONFIG_USB_GSPCA_SQ905 is not set
-# CONFIG_USB_GSPCA_STK014 is not set
-# CONFIG_USB_GSPCA_SUNPLUS is not set
-# CONFIG_USB_GSPCA_T613 is not set
-# CONFIG_USB_GSPCA_TV8532 is not set
-# CONFIG_USB_GSPCA_VC032X is not set
-# CONFIG_USB_GSPCA_ZC3XX is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HID is not set
-# CONFIG_USB_HSO is not set
-# CONFIG_USB_HWA_HCD is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_IOWARRIOR is not set
-# CONFIG_USB_IP_COMMON is not set
-# CONFIG_USB_ISIGHTFW is not set
-# CONFIG_USB is not set
-# CONFIG_USB_ISP116X_HCD is not set
-# CONFIG_USB_ISP1760_HCD is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_KC2190 is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LIBUSUAL is not set
-# CONFIG_USB_M5602 is not set
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-# CONFIG_USB_MON is not set
-# CONFIG_USB_MOUSE is not set
-# CONFIG_USB_MUSB_HDRC is not set
-# CONFIG_USB_NET_AX8817X is not set
-# CONFIG_USB_NET_CDC_EEM is not set
-# CONFIG_USB_NET_CDCETHER is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_DM9601 is not set
-# CONFIG_USB_NET_GL620A is not set
-# CONFIG_USB_NET_INT51X1 is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_NET1080 is not set
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_RNDIS_WLAN is not set
-# CONFIG_USB_NET_SMSC95XX is not set
-# CONFIG_USB_NET_ZAURUS is not set
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-# CONFIG_USB_OHCI_HCD is not set
-# CONFIG_USB_OHCI_HCD_PCI is not set
-# CONFIG_USB_OHCI_HCD_PPC_OF is not set
-# CONFIG_USB_OHCI_HCD_PPC_SOC is not set
-# CONFIG_USB_OHCI_HCD_SSB is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-# CONFIG_USB_OTG_BLACKLIST_HUB is not set
-# CONFIG_USB_OTG is not set
-# CONFIG_USB_OTG_WHITELIST is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_OXU210HP_HCD is not set
-# CONFIG_USBPCWATCHDOG is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_PHIDGET is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_PRINTER is not set
-# CONFIG_USB_PWC_INPUT_EVDEV is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_R8A66597_HCD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_S2255 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SERIAL_AIRCABLE is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-# CONFIG_USB_SERIAL_BELKIN is not set
-# CONFIG_USB_SERIAL_CH341 is not set
-# CONFIG_USB_SERIAL_CP2101 is not set
-# CONFIG_USB_SERIAL_CP210X is not set
-# CONFIG_USB_SERIAL_CYBERJACK is not set
-# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
-# CONFIG_USB_SERIAL_DEBUG is not set
-# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
-# CONFIG_USB_SERIAL_EMPEG is not set
-# CONFIG_USB_SERIAL_FTDI_SIO is not set
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-# CONFIG_USB_SERIAL_GARMIN is not set
-CONFIG_USB_SERIAL_GENERIC=y
-# CONFIG_USB_SERIAL_HP4X is not set
-# CONFIG_USB_SERIAL_IPAQ is not set
-# CONFIG_USB_SERIAL_IPW is not set
-# CONFIG_USB_SERIAL_IR is not set
-# CONFIG_USB_SERIAL is not set
-# CONFIG_USB_SERIAL_IUU is not set
-# CONFIG_USB_SERIAL_KEYSPAN is not set
-CONFIG_USB_SERIAL_KEYSPAN_MPR=y
-# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
-CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
-# CONFIG_USB_SERIAL_KLSI is not set
-# CONFIG_USB_SERIAL_KOBIL_SCT is not set
-# CONFIG_USB_SERIAL_MCT_U232 is not set
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 is not set
-# CONFIG_USB_SERIAL_MOTOROLA is not set
-# CONFIG_USB_SERIAL_NAVMAN is not set
-# CONFIG_USB_SERIAL_OMNINET is not set
-# CONFIG_USB_SERIAL_OPTICON is not set
-# CONFIG_USB_SERIAL_OPTION is not set
-# CONFIG_USB_SERIAL_OTI6858 is not set
-# CONFIG_USB_SERIAL_PL2303 is not set
-# CONFIG_USB_SERIAL_QUALCOMM is not set
-# CONFIG_USB_SERIAL_QUATECH2 is not set
-# CONFIG_USB_SERIAL_SAFE is not set
-CONFIG_USB_SERIAL_SAFE_PADDED=y
-# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-# CONFIG_USB_SERIAL_SPCP8X5 is not set
-# CONFIG_USB_SERIAL_SYMBOL is not set
-# CONFIG_USB_SERIAL_TI is not set
-# CONFIG_USB_SERIAL_VISOR is not set
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-# CONFIG_USB_SERIAL_XIRCOM is not set
-# CONFIG_USB_SEVSEG is not set
-# CONFIG_USB_SISUSBVGA is not set
-# CONFIG_USB_SL811_HCD is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_SPEEDTOUCH is not set
-# CONFIG_USB_STKWEBCAM is not set
-CONFIG_USB_STORAGE_ALAUDA=y
-# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
-CONFIG_USB_STORAGE_DATAFAB=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-CONFIG_USB_STORAGE_DPCM=y
-CONFIG_USB_STORAGE_FREECOM=y
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE is not set
-CONFIG_USB_STORAGE_JUMPSHOT=y
-CONFIG_USB_STORAGE_KARMA=y
-# CONFIG_USB_STORAGE_ONETOUCH is not set
-CONFIG_USB_STORAGE_SDDR09=y
-CONFIG_USB_STORAGE_SDDR55=y
-# CONFIG_USB_STORAGE_SIERRA is not set
-CONFIG_USB_STORAGE_USBAT=y
-# CONFIG_USB_STV06XX is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_SUPPORT is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_TEST is not set
-# CONFIG_USB_TMC is not set
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_UEAGLEATM is not set
-# CONFIG_USB_USBNET is not set
-# CONFIG_USB_USBNET_MII is not set
-# CONFIG_USB_VICAM is not set
-CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
-# CONFIG_USB_VIDEO_CLASS is not set
-# CONFIG_USB_VST is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_WDM is not set
-# CONFIG_USB_WHCI_HCD is not set
-# CONFIG_USB_WUSB_CBAF is not set
-# CONFIG_USB_WUSB is not set
-# CONFIG_USB_XHCI_HCD is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_XUSBATM is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_ZD1201 is not set
-# CONFIG_USB_ZR364XX is not set
-# CONFIG_USE_GENERIC_SMP_HELPERS is not set
-# CONFIG_UTS_NS is not set
-# CONFIG_UWB is not set
-# CONFIG_VETH is not set
-# CONFIG_VFAT_FS is not set
-# CONFIG_VGASTATE is not set
-# CONFIG_VIA_RHINE is not set
-# CONFIG_VIA_VELOCITY is not set
-# CONFIG_VIDEO_ADV7170 is not set
-# CONFIG_VIDEO_ADV7175 is not set
-# CONFIG_VIDEO_ADV7343 is not set
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# CONFIG_VIDEO_ALLOW_V4L1 is not set
-# CONFIG_VIDEO_BT819 is not set
-# CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_BT856 is not set
-# CONFIG_VIDEO_BT866 is not set
-# CONFIG_VIDEO_CAFE_CCIC is not set
-# CONFIG_VIDEO_CAPTURE_DRIVERS is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CS5345 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_CX231XX is not set
-# CONFIG_VIDEO_CX2341X is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_CX88 is not set
-# CONFIG_VIDEO_DEV is not set
-# CONFIG_VIDEO_DPC is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
-# CONFIG_VIDEO_GO7007 is not set
-# CONFIG_VIDEO_HDPVR is not set
-# CONFIG_VIDEO_HELPER_CHIPS_AUTO is not set
-# CONFIG_VIDEO_HEXIUM_GEMINI is not set
-# CONFIG_VIDEO_HEXIUM_ORION is not set
-# CONFIG_VIDEO_IVTV is not set
-# CONFIG_VIDEO_KS0127 is not set
-# CONFIG_VIDEO_M52790 is not set
-# CONFIG_VIDEO_MEDIA is not set
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_MT9V011 is not set
-# CONFIG_VIDEO_MXB is not set
-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-# CONFIG_VIDEO_OV7670 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_VIDEO_PMS is not set
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_VIDEO_SAA6588 is not set
-# CONFIG_VIDEO_SAA7110 is not set
-# CONFIG_VIDEO_SAA7111 is not set
-# CONFIG_VIDEO_SAA7114 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_SAA7134 is not set
-# CONFIG_VIDEO_SAA717X is not set
-# CONFIG_VIDEO_SAA7185 is not set
-# CONFIG_VIDEO_SAA7191 is not set
-# CONFIG_VIDEO_SH_MOBILE_CEU is not set
-# CONFIG_VIDEO_STRADIS is not set
-# CONFIG_VIDEO_TCM825X is not set
-# CONFIG_VIDEO_TDA7432 is not set
-# CONFIG_VIDEO_TDA9840 is not set
-# CONFIG_VIDEO_TDA9875 is not set
-# CONFIG_VIDEO_TEA6415C is not set
-# CONFIG_VIDEO_TEA6420 is not set
-# CONFIG_VIDEO_THS7303 is not set
-# CONFIG_VIDEO_TLV320AIC23B is not set
-# CONFIG_VIDEO_TVAUDIO is not set
-# CONFIG_VIDEO_TVP514X is not set
-# CONFIG_VIDEO_TVP5150 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-# CONFIG_VIDEO_USBVISION is not set
-CONFIG_VIDEO_V4L1_COMPAT=y
-# CONFIG_VIDEO_V4L1 is not set
-# CONFIG_VIDEO_V4L2_COMMON is not set
-# CONFIG_VIDEO_V4L2 is not set
-# CONFIG_VIDEO_VIVI is not set
-# CONFIG_VIDEO_VP27SMPX is not set
-# CONFIG_VIDEO_VPX3220 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIRQ_DEBUG is not set
-CONFIG_VIRT_TO_BUS=y
-# CONFIG_VIRTUALIZATION is not set
-# CONFIG_VITESSE_PHY is not set
-# CONFIG_VLAN_8021Q_GVRP is not set
-CONFIG_VLAN_8021Q=y
-# CONFIG_VM_EVENT_COUNTERS is not set
-# CONFIG_VMSPLIT_1G is not set
-# CONFIG_VMSPLIT_2G is not set
-# CONFIG_VMSPLIT_2G_OPT is not set
-# CONFIG_VMSPLIT_3G_OPT is not set
-CONFIG_VMSPLIT_3G=y
-# CONFIG_VT6655 is not set
-# CONFIG_VT is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_W1_CON is not set
-# CONFIG_W1 is not set
-# CONFIG_W1_MASTER_DS1WM is not set
-# CONFIG_W1_MASTER_DS2482 is not set
-# CONFIG_W1_MASTER_DS2490 is not set
-# CONFIG_W1_MASTER_GPIO is not set
-# CONFIG_W1_MASTER_MATROX is not set
-# CONFIG_W1_SLAVE_BQ27000 is not set
-# CONFIG_W1_SLAVE_DS2431 is not set
-# CONFIG_W1_SLAVE_DS2433 is not set
-# CONFIG_W1_SLAVE_DS2760 is not set
-# CONFIG_W1_SLAVE_SMEM is not set
-# CONFIG_W1_SLAVE_THERM is not set
-# CONFIG_W83627HF_WDT is not set
-# CONFIG_W83697HF_WDT is not set
-# CONFIG_W83877F_WDT is not set
-# CONFIG_W83977F_WDT is not set
-# CONFIG_WAN is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_WANXL is not set
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-CONFIG_WATCHDOG=y
-# CONFIG_WDTPCI is not set
-# CONFIG_WIMAX is not set
-CONFIG_WIRELESS_EXT_SYSFS=y
-CONFIG_WIRELESS_EXT=y
-CONFIG_WIRELESS_OLD_REGULATORY=y
-CONFIG_WIRELESS=y
-CONFIG_WLAN_80211=y
-# CONFIG_WLAN_PRE80211 is not set
-# CONFIG_WORKQUEUE_TRACER is not set
-# CONFIG_WR_PPMC is not set
-# CONFIG_X25 is not set
-# CONFIG_XFRM_IPCOMP is not set
-# CONFIG_XFRM_MIGRATE is not set
-# CONFIG_XFRM_STATISTICS is not set
-# CONFIG_XFRM_SUB_POLICY is not set
-# CONFIG_XFRM_USER is not set
-CONFIG_XFRM=y
-# CONFIG_XFS_DEBUG is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_XFS_POSIX_ACL is not set
-# CONFIG_XFS_QUOTA is not set
-# CONFIG_XFS_RT is not set
-# CONFIG_XFS_SECURITY is not set
-# CONFIG_XIP_KERNEL is not set
-# CONFIG_YAFFS_FS is not set
-# CONFIG_YAM is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_YENTA is not set
-# CONFIG_YENTA_O2 is not set
-# CONFIG_YENTA_RICOH is not set
-# CONFIG_YENTA_TI is not set
-# CONFIG_YENTA_TOSHIBA is not set
-# CONFIG_ZD1211RW_DEBUG is not set
-# CONFIG_ZD1211RW is not set
-# CONFIG_ZEROPLUS_FF is not set
-# CONFIG_ZISOFS_FS is not set
-CONFIG_ZISOFS=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZONE_DMA_FLAG=1
-CONFIG_ZONE_DMA=y
+++ /dev/null
-# CONFIG_6PACK is not set
-# CONFIG_8139CP is not set
-# CONFIG_8139TOO is not set
-# CONFIG_9P_FS is not set
-# CONFIG_AB3100_CORE is not set
-# CONFIG_AB4500_CORE is not set
-# CONFIG_ACCESSIBILITY is not set
-# CONFIG_ACENIC is not set
-# CONFIG_ACPI_POWER_METER is not set
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_AD525X_DPOT is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_ADFS_FS is not set
-# CONFIG_ADM6996_PHY is not set
-# CONFIG_ADM8211 is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_AF_RXRPC is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_AGP is not set
-CONFIG_AIO=y
-# CONFIG_AIRO_CS is not set
-# CONFIG_AIRO is not set
-# CONFIG_ALIM7101_WDT is not set
-# CONFIG_ALTERA_PCIE_CHDMA is not set
-# CONFIG_R8187SE is not set
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ANDROID is not set
-CONFIG_ANON_INODES=y
-# CONFIG_APPLICOM is not set
-# CONFIG_AR8216_PHY is not set
-# CONFIG_AR9170_USB is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91 is not set
-# CONFIG_ARCH_BCMRING is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_DAVINCI is not set
-# CONFIG_ARCH_DOVE is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_EP93XX is not set
-CONFIG_ARCH_FLATMEM_ENABLE=y
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_GEMINI is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP13XX is not set
-# CONFIG_ARCH_IOP32X is not set
-# CONFIG_ARCH_IOP33X is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_IXP23XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_KIRKWOOD is not set
-# CONFIG_ARCH_KS8695 is not set
-# CONFIG_ARCH_L7200 is not set
-# CONFIG_ARCH_LH7A40X is not set
-# CONFIG_ARCH_LOKI is not set
-# CONFIG_ARCH_MMP is not set
-# CONFIG_ARCH_MSM is not set
-# CONFIG_ARCH_MV78XX0 is not set
-# CONFIG_ARCH_MXC is not set
-# CONFIG_ARCH_NETX is not set
-# CONFIG_ARCH_NOMADIK is not set
-# CONFIG_ARCH_NS9XXX is not set
-# CONFIG_ARCH_OMAP is not set
-# CONFIG_ARCH_ORION5X is not set
-# CONFIG_ARCH_PNX4008 is not set
-# CONFIG_ARCH_PXA is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_RPC is not set
-# CONFIG_ARCH_S3C2410 is not set
-# CONFIG_ARCH_S3C64XX is not set
-# CONFIG_ARCH_S5PC1XX is not set
-# CONFIG_ARCH_SA1100 is not set
-# CONFIG_ARCH_SHARK is not set
-# CONFIG_ARCH_STMP3XXX is not set
-# CONFIG_ARCH_U300 is not set
-# CONFIG_ARCH_U8500 is not set
-# CONFIG_ARCH_VERSATILE is not set
-# CONFIG_ARCH_W90X900 is not set
-# CONFIG_ARCNET is not set
-# CONFIG_ARM_UNWIND is not set
-CONFIG_ARPD=y
-# CONFIG_ARTHUR is not set
-CONFIG_ASK_IP_FIB_HASH=y
-# CONFIG_ASUS_OLED is not set
-# CONFIG_ASYNC_TX_DMA is not set
-# CONFIG_AT24 is not set
-# CONFIG_AT76C50X_USB is not set
-# CONFIG_ATA_ACPI is not set
-# CONFIG_ATA_GENERIC is not set
-# CONFIG_ATA is not set
-# CONFIG_ATALK is not set
-# CONFIG_ATA_NONSTANDARD is not set
-# CONFIG_ATA_OVER_ETH is not set
-# CONFIG_ATA_PIIX is not set
-# CONFIG_ATARI_PARTITION is not set
-CONFIG_ATA_SFF=y
-# CONFIG_ATA_VERBOSE_ERROR is not set
-# CONFIG_ATH5K is not set
-# CONFIG_ATH9K is not set
-# CONFIG_ATL1C is not set
-# CONFIG_ATL1E is not set
-# CONFIG_ATL1 is not set
-# CONFIG_ATL2 is not set
-# CONFIG_ATM_AMBASSADOR is not set
-CONFIG_ATM_BR2684_IPFILTER=y
-# CONFIG_ATM_BR2684 is not set
-# CONFIG_ATM_CLIP is not set
-CONFIG_ATM_CLIP_NO_ICMP=y
-# CONFIG_ATM_DRIVERS is not set
-# CONFIG_ATM_DUMMY is not set
-# CONFIG_ATMEL is not set
-# CONFIG_ATM_ENI is not set
-# CONFIG_ATM_FIRESTREAM is not set
-# CONFIG_ATM_FORE200E is not set
-# CONFIG_ATM_FORE200E_MAYBE is not set
-# CONFIG_ATM_HE is not set
-# CONFIG_ATM_HORIZON is not set
-# CONFIG_ATM_IA is not set
-# CONFIG_ATM_IDT77252 is not set
-# CONFIG_ATM is not set
-# CONFIG_ATM_LANAI is not set
-# CONFIG_ATM_LANE is not set
-# CONFIG_ATM_MPOA is not set
-# CONFIG_ATM_NICSTAR is not set
-# CONFIG_ATM_SOLOS is not set
-# CONFIG_ATM_TCP is not set
-# CONFIG_ATM_ZATM is not set
-# CONFIG_AUDIT is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUXDISPLAY is not set
-# CONFIG_AX25_DAMA_SLAVE is not set
-# CONFIG_AX25 is not set
-# CONFIG_AX88796 is not set
-# CONFIG_B3DFG is not set
-# CONFIG_B43 is not set
-# CONFIG_B43LEGACY is not set
-# CONFIG_B44 is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-# CONFIG_BACKTRACE_SELF_TEST is not set
-CONFIG_BASE_FULL=y
-CONFIG_BASE_SMALL=0
-# CONFIG_BASLER_EXCITE is not set
-# CONFIG_BATTERY_BQ27000_HDQ is not set
-# CONFIG_BATTERY_BQ27x00 is not set
-# CONFIG_BATTERY_DS2760 is not set
-# CONFIG_BATTERY_DS2782 is not set
-# CONFIG_BATTERY_MAX17040 is not set
-# CONFIG_BAYCOM_EPP is not set
-# CONFIG_BAYCOM_PAR is not set
-# CONFIG_BAYCOM_SER_FDX is not set
-# CONFIG_BAYCOM_SER_HDX is not set
-CONFIG_BCM43XX_DEBUG=y
-CONFIG_BCM43XX_DMA_AND_PIO_MODE=y
-# CONFIG_BCM43XX_DMA_MODE is not set
-CONFIG_BCM43XX_DMA=y
-# CONFIG_BCM43XX is not set
-# CONFIG_BCM43XX_PIO_MODE is not set
-CONFIG_BCM43XX_PIO=y
-# CONFIG_BE2ISCSI is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_BINARY_PRINTF is not set
-# CONFIG_BINFMT_AOUT is not set
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-# CONFIG_BLINK is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_BLK_DEV_4DRIVES is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI14XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_ATIIXP is not set
-# CONFIG_BLK_DEV_BSG is not set
-# CONFIG_BLK_DEV_CMD640 is not set
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_CS5535 is not set
-# CONFIG_BLK_DEV_CS5536 is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_DELKIN is not set
-# CONFIG_BLK_DEV_DTC2278 is not set
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_GENERIC is not set
-# CONFIG_BLK_DEV_HD_IDE is not set
-# CONFIG_BLK_DEV_HD is not set
-# CONFIG_BLK_DEV_HD_ONLY is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_HT6560B is not set
-# CONFIG_BLK_DEV_IDEACPI is not set
-# CONFIG_BLK_DEV_IDECD is not set
-# CONFIG_BLK_DEV_IDECS is not set
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDEPCI is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-# CONFIG_BLK_DEV_IDE_SATA is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_BLK_DEV_IDETAPE is not set
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_BLK_DEV_INTEGRITY is not set
-# CONFIG_BLK_DEV_IO_TRACE is not set
-# CONFIG_BLK_DEV_IT8172 is not set
-# CONFIG_BLK_DEV_IT8213 is not set
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_JMICRON is not set
-# CONFIG_BLK_DEV_LOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_OFFBOARD is not set
-# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PIIX is not set
-# CONFIG_BLK_DEV_PLATFORM is not set
-# CONFIG_BLK_DEV_QD65XX is not set
-# CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_RZ1000 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-# CONFIG_BLK_DEV_SD is not set
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SIS5513 is not set
-# CONFIG_BLK_DEV_SL82C105 is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_SR is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_TC86C001 is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_UB is not set
-# CONFIG_BLK_DEV_UMC8672 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_BLK_DEV_XIP is not set
-CONFIG_BLK_DEV=y
-CONFIG_BLOCK=y
-# CONFIG_BNX2 is not set
-# CONFIG_BONDING is not set
-# CONFIG_BOOT_PRINTK_DELAY is not set
-# CONFIG_BOOT_TRACER is not set
-# CONFIG_BPQETHER is not set
-# CONFIG_BRIDGE_EBT_802_3 is not set
-# CONFIG_BRIDGE_EBT_AMONG is not set
-# CONFIG_BRIDGE_EBT_ARP is not set
-# CONFIG_BRIDGE_EBT_ARPREPLY is not set
-# CONFIG_BRIDGE_EBT_BROUTE is not set
-# CONFIG_BRIDGE_EBT_DNAT is not set
-# CONFIG_BRIDGE_EBT_IP6 is not set
-# CONFIG_BRIDGE_EBT_IP is not set
-# CONFIG_BRIDGE_EBT_LIMIT is not set
-# CONFIG_BRIDGE_EBT_LOG is not set
-# CONFIG_BRIDGE_EBT_MARK is not set
-# CONFIG_BRIDGE_EBT_MARK_T is not set
-# CONFIG_BRIDGE_EBT_NFLOG is not set
-# CONFIG_BRIDGE_EBT_PKTTYPE is not set
-# CONFIG_BRIDGE_EBT_REDIRECT is not set
-# CONFIG_BRIDGE_EBT_SNAT is not set
-# CONFIG_BRIDGE_EBT_STP is not set
-# CONFIG_BRIDGE_EBT_T_FILTER is not set
-# CONFIG_BRIDGE_EBT_T_NAT is not set
-# CONFIG_BRIDGE_EBT_ULOG is not set
-# CONFIG_BRIDGE_EBT_VLAN is not set
-# CONFIG_BRIDGE_NETFILTER is not set
-# CONFIG_BRIDGE_NF_EBTABLES is not set
-CONFIG_BRIDGE=y
-# CONFIG_BROADCOM_PHY is not set
-CONFIG_BROKEN_ON_SMP=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BT_ATH3K is not set
-# CONFIG_BT_BNEP is not set
-CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
-# CONFIG_BT_CMTP is not set
-# CONFIG_BT_HCIBCM203X is not set
-# CONFIG_BT_HCIBFUSB is not set
-# CONFIG_BT_HCIBLUECARD is not set
-# CONFIG_BT_HCIBPA10X is not set
-# CONFIG_BT_HCIBT3C is not set
-# CONFIG_BT_HCIBTSDIO is not set
-# CONFIG_BT_HCIBTUART is not set
-# CONFIG_BT_HCIBTUSB is not set
-# CONFIG_BT_HCIDTL1 is not set
-CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIUART_H4=y
-# CONFIG_BT_HCIUART is not set
-# CONFIG_BT_HCIUART_LL is not set
-# CONFIG_BT_HCIUSB is not set
-CONFIG_BT_HCIUSB_SCO=y
-# CONFIG_BT_HCIVHCI is not set
-# CONFIG_BT_HIDP is not set
-# CONFIG_BT is not set
-# CONFIG_BT_L2CAP is not set
-# CONFIG_BT_MRVL is not set
-# CONFIG_BT_RFCOMM is not set
-CONFIG_BT_RFCOMM_TTY=y
-# CONFIG_BTRFS_FS is not set
-# CONFIG_BT_SCO is not set
-CONFIG_BUG=y
-# CONFIG_C2PORT is not set
-# CONFIG_CAN is not set
-# CONFIG_CAPI_AVM is not set
-# CONFIG_CAPI_EICON is not set
-# CONFIG_CAPI_TRACE is not set
-CONFIG_CARDBUS=y
-# CONFIG_CARDMAN_4000 is not set
-# CONFIG_CARDMAN_4040 is not set
-# CONFIG_CASSINI is not set
-# CONFIG_CB710_CORE is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_CFG80211 is not set
-# CONFIG_CGROUPS is not set
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_CHELSIO_T3 is not set
-# CONFIG_CHR_DEV_OSST is not set
-# CONFIG_CHR_DEV_SCH is not set
-# CONFIG_CHR_DEV_SG is not set
-# CONFIG_CHR_DEV_ST is not set
-# CONFIG_CICADA_PHY is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
-# CONFIG_CIFS is not set
-CONFIG_CIFS_POSIX=y
-# CONFIG_CIFS_STATS2 is not set
-CONFIG_CIFS_STATS=y
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# CONFIG_CIFS_XATTR is not set
-# CONFIG_CLASSIC_RCU=y
-CONFIG_CLS_U32_MARK=y
-CONFIG_CLS_U32_PERF=y
-CONFIG_CMDLINE=""
-# CONFIG_CNIC is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_COMEDI is not set
-# CONFIG_COMPAT_BRK is not set
-CONFIG_COMPAT_NET_DEV_OPS=y
-# CONFIG_CONFIGFS_FS is not set
-# CONFIG_CONNECTOR is not set
-CONFIG_CONSTRUCTORS=y
-# CONFIG_CONTEXT_SWITCH_TRACER is not set
-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-# CONFIG_CPU_DCACHE_DISABLE is not set
-# CONFIG_CPU_FREQ is not set
-# CONFIG_CPU_IDLE is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_CRASH_DUMP is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_CRC7 is not set
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC_ITU_T is not set
-# CONFIG_CRC_T10DIF is not set
-CONFIG_CROSSCOMPILE=y
-# CONFIG_CRYPTO_AEAD is not set
-# CONFIG_CRYPTO_AES_586 is not set
-# CONFIG_CRYPTO_AES is not set
-CONFIG_CRYPTO_ALGAPI2=y
-CONFIG_CRYPTO_ALGAPI=y
-# CONFIG_CRYPTO_ANSI_CPRNG is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_AUTHENC is not set
-# CONFIG_CRYPTO_BLKCIPHER is not set
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_CAMELLIA is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_CBC is not set
-# CONFIG_CRYPTO_CCM is not set
-# CONFIG_CRYPTO_CRC32C_INTEL is not set
-# CONFIG_CRYPTO_CRC32C is not set
-# CONFIG_CRYPTO_CRYPTD is not set
-# CONFIG_CRYPTO_CTR is not set
-# CONFIG_CRYPTO_CTS is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_DES is not set
-# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-# CONFIG_CRYPTO_ECB is not set
-# CONFIG_CRYPTO_FCRYPT is not set
-# CONFIG_CRYPTO_FIPS is not set
-# CONFIG_CRYPTO_GCM is not set
-# CONFIG_CRYPTO_GF128MUL is not set
-# CONFIG_CRYPTO_GHASH is not set
-# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set
-# CONFIG_CRYPTO_HASH is not set
-# CONFIG_CRYPTO_HMAC is not set
-# CONFIG_CRYPTO_HW is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_LRW is not set
-# CONFIG_CRYPTO_LZO is not set
-# CONFIG_CRYPTO_MANAGER2 is not set
-# CONFIG_CRYPTO_MANAGER is not set
-CONFIG_CRYPTO_MANAGER_NO_TESTS=y
-# CONFIG_CRYPTO_MD4 is not set
-# CONFIG_CRYPTO_MD5 is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_PCBC is not set
-CONFIG_CRYPTO_PCOMP=y
-# CONFIG_CRYPTO_PRNG is not set
-# CONFIG_CRYPTO_RMD128 is not set
-# CONFIG_CRYPTO_RMD160 is not set
-# CONFIG_CRYPTO_RMD256 is not set
-# CONFIG_CRYPTO_RMD320 is not set
-# CONFIG_CRYPTO_RNG is not set
-# CONFIG_CRYPTO_SALSA20_586 is not set
-# CONFIG_CRYPTO_SALSA20 is not set
-# CONFIG_CRYPTO_SEED is not set
-# CONFIG_CRYPTO_SEQIV is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_SHA1 is not set
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_TEST is not set
-# CONFIG_CRYPTO_TGR192 is not set
-# CONFIG_CRYPTO_TWOFISH_586 is not set
-# CONFIG_CRYPTO_TWOFISH_COMMON is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-CONFIG_CRYPTO_UNLZMA=y
-# CONFIG_CRYPTO_VMAC is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_XCBC is not set
-# CONFIG_CRYPTO_XTS is not set
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_ZLIB=y
-# CONFIG_CUSE is not set
-# CONFIG_DAB is not set
-# CONFIG_DAVICOM_PHY is not set
-# CONFIG_DCB is not set
-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_CREDENTIALS is not set
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_DEBUG_DEVRES is not set
-# CONFIG_DEBUG_ERRORS is not set
-# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
-CONFIG_DEBUG_FS=y
-# CONFIG_DEBUG_GPIO is not set
-# CONFIG_DEBUG_KERNEL is not set
-# CONFIG_DEBUG_KMEMLEAK is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_LIST is not set
-# CONFIG_DEBUG_LL is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_LOCK_ALLOC is not set
-# CONFIG_DEBUG_NOTIFIERS is not set
-# CONFIG_DEBUG_MEMORY_INIT is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_OBJECTS is not set
-# CONFIG_DEBUG_SG is not set
-# CONFIG_DEBUG_SHIRQ is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
-# CONFIG_DEBUG_PREEMPT is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_WRITECOUNT is not set
-# CONFIG_DECNET is not set
-CONFIG_DECOMPRESS_LZMA_NEEDED=y
-# CONFIG_DEFAULT_AS is not set
-# CONFIG_DEFAULT_BIC is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_CUBIC is not set
-CONFIG_DEFAULT_DEADLINE=y
-# CONFIG_DEFAULT_HTCP is not set
-CONFIG_DEFAULT_IOSCHED="deadline"
-CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
-# CONFIG_DEFAULT_NOOP is not set
-# CONFIG_DEFAULT_RENO is not set
-CONFIG_DEFAULT_TCP_CONG="westwood"
-# CONFIG_DEFAULT_VEGAS is not set
-CONFIG_DEFAULT_WESTWOOD=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-# CONFIG_DETECT_HUNG_TASK is not set
-# CONFIG_DETECT_SOFTLOCKUP is not set
-# CONFIG_DEVKMEM is not set
-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
-# CONFIG_DEVTMPFS_MOUNT is not set
-# CONFIG_DEVTMPFS is not set
-# CONFIG_DGRS is not set
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_DISPLAY_SUPPORT is not set
-# CONFIG_DL2K is not set
-# CONFIG_DLM is not set
-# CONFIG_DMA_API_DEBUG is not set
-# CONFIG_DMADEVICES is not set
-# CONFIG_DMA_ENGINE is not set
-# CONFIG_DMASCC is not set
-# CONFIG_DMATEST is not set
-# CONFIG_DM_LOG_USERSPACE is not set
-# CONFIG_DNET is not set
-# CONFIG_DNOTIFY is not set
-# CONFIG_DRAGONRISE_FF is not set
-# CONFIG_DRM is not set
-# CONFIG_DS1682 is not set
-# CONFIG_DST is not set
-# CONFIG_DTLK is not set
-# CONFIG_DUMMY is not set
-# CONFIG_DVB_CORE is not set
-# CONFIG_DVB is not set
-# CONFIG_DYNAMIC_DEBUG is not set
-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
-# CONFIG_E1000E is not set
-# CONFIG_E1000 is not set
-# CONFIG_E100 is not set
-# CONFIG_ECHO is not set
-# CONFIG_ECONET is not set
-# CONFIG_EDAC is not set
-# CONFIG_EEPRO100 is not set
-# CONFIG_EEPROM_93CX6 is not set
-# CONFIG_EEPROM_AT24 is not set
-# CONFIG_EEPROM_AT25 is not set
-# CONFIG_EEPROM_LEGACY is not set
-# CONFIG_EEPROM_MAX6875 is not set
-# CONFIG_EFI_PARTITION is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_ELF_CORE is not set
-CONFIG_EMBEDDED=y
-# CONFIG_ENABLE_MUST_CHECK is not set
-CONFIG_ENABLE_WARN_DEPRECATED=y
-# CONFIG_ENC28J60 is not set
-# CONFIG_ENCLOSURE_SERVICES is not set
-# CONFIG_EPIC100 is not set
-CONFIG_EPOLL=y
-# CONFIG_EQUALIZER is not set
-# CONFIG_ET131X is not set
-# CONFIG_ETHOC is not set
-CONFIG_EVENTFD=y
-# CONFIG_EVENT_TRACER is not set
-CONFIG_EXPERIMENTAL=y
-# CONFIG_EXPORTFS is not set
-# CONFIG_EXT2_FS is not set
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_EXT3_FS_XATTR is not set
-# CONFIG_EXT4_DEBUG is not set
-# CONFIG_EXT4DEV_FS is not set
-# CONFIG_EXT4_FS is not set
-# CONFIG_EXT4_USE_FOR_EXT23 is not set
-CONFIG_EXTRA_FIRMWARE=""
-CONFIG_EXTRA_TARGETS=""
-# CONFIG_EZX_PCAP is not set
-# CONFIG_FAIR_GROUP_SCHED is not set
-# CONFIG_FAULT_INJECTION is not set
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_FAT_FS is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_ARC is not set
-# CONFIG_FB_ARK is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_BACKLIGHT is not set
-# CONFIG_FB_BOOT_VESA_SUPPORT is not set
-# CONFIG_FB_BROADSHEET is not set
-# CONFIG_FB_CARMINE is not set
-# CONFIG_FB_CFB_COPYAREA is not set
-# CONFIG_FB_CFB_FILLRECT is not set
-# CONFIG_FB_CFB_IMAGEBLIT is not set
-# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_DDC is not set
-# CONFIG_FB_EARLYSUSPEND is not set
-# CONFIG_FB_FOREIGN_ENDIAN is not set
-# CONFIG_FB_GEODE is not set
-# CONFIG_FB_GOLDFISH is not set
-# CONFIG_FB_HGA is not set
-# CONFIG_FB_IBM_GXT4500 is not set
-# CONFIG_FB_IMSTT is not set
-# CONFIG_FB is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_LE80578 is not set
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_MB862XX is not set
-# CONFIG_FB_METRONOME is not set
-# CONFIG_FB_MODE_HELPERS is not set
-# CONFIG_FB_N411 is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_OF is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_PM3 is not set
-# CONFIG_FB_PS3 is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_S3 is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS 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_TRIDENT is not set
-# CONFIG_FB_UDL is not set
-# CONFIG_FB_VGA16 is not set
-# CONFIG_FB_VIA is not set
-# CONFIG_FB_VIRTUAL is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_VT8623 is not set
-# CONFIG_FCOE_FNIC is not set
-# CONFIG_FCOE is not set
-# CONFIG_FDDI is not set
-# CONFIG_FEALNX is not set
-CONFIG_FIB_RULES=y
-CONFIG_FILE_LOCKING=y
-# CONFIG_FIREWIRE is not set
-# CONFIG_FIRMWARE_IN_KERNEL is not set
-# CONFIG_FIXED_PHY is not set
-CONFIG_FLATMEM_MANUAL=y
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_FORCEDETH is not set
-CONFIG_FRAME_WARN=1024
-# CONFIG_FRAMEBUFFER_CONSOLE is not set
-# CONFIG_FREEZER is not set
-# CONFIG_FSCACHE is not set
-CONFIG_FSNOTIFY=y
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_FTL is not set
-# CONFIG_FTRACE is not set
-# CONFIG_FTRACE_STARTUP_TEST is not set
-# CONFIG_FUNCTION_TRACER is not set
-# CONFIG_FUSE_FS is not set
-# CONFIG_FUSION_FC is not set
-# CONFIG_FUSION is not set
-# CONFIG_FUSION_SAS is not set
-# CONFIG_FUSION_SPI is not set
-CONFIG_FUTEX=y
-CONFIG_FW_LOADER=y
-CONFIG_GACT_PROB=y
-# CONFIG_GAMEPORT is not set
-# CONFIG_GCOV_KERNEL is not set
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_TIME=y
-# CONFIG_GIGASET_CAPI is not set
-# CONFIG_GIGASET_DEBUG is not set
-# CONFIG_GFS2_FS is not set
-# CONFIG_GPIO_ADP5588 is not set
-# CONFIG_GPIO_BT8XX is not set
-# CONFIG_GPIO_CS5535 is not set
-# CONFIG_GPIO_DEVICE is not set
-# CONFIG_GPIO_LANGWELL is not set
-# CONFIG_GPIOLIB is not set
-# CONFIG_GPIO_MAX7301 is not set
-# CONFIG_GPIO_MAX732X is not set
-# CONFIG_GPIO_MC33880 is not set
-# CONFIG_GPIO_MCP23S08 is not set
-# CONFIG_GPIO_PCA953X is not set
-# CONFIG_GPIO_PCF857X is not set
-# CONFIG_GPIO_SYSFS is not set
-# CONFIG_GPIO_XILINX is not set
-# CONFIG_GREENASIA_FF is not set
-# CONFIG_GROUP_SCHED is not set
-# CONFIG_HAMACHI is not set
-CONFIG_HAMRADIO=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_HAVE_AOUT is not set
-CONFIG_HAVE_MLOCKED_PAGE_BIT=y
-CONFIG_HAVE_MLOCK=y
-# CONFIG_HCALL_STATS is not set
-# CONFIG_HDLC_CISCO is not set
-# CONFIG_HDLC_FR is not set
-# CONFIG_HDLC is not set
-# CONFIG_HDLC_PPP is not set
-# CONFIG_HDLC_RAW_ETH is not set
-# CONFIG_HDLC_RAW is not set
-# CONFIG_HEADERS_CHECK is not set
-# CONFIG_HECI is not set
-# CONFIG_HERMES is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_HID_A4TECH is not set
-# CONFIG_HID_APPLE is not set
-# CONFIG_HID_BELKIN is not set
-# CONFIG_HID_BRIGHT is not set
-# CONFIG_HID_CHERRY is not set
-# CONFIG_HID_CHICONY is not set
-# CONFIG_HID_COMPAT is not set
-# CONFIG_HID_CYPRESS is not set
-# CONFIG_HID_DEBUG is not set
-# CONFIG_HID_DELL is not set
-# CONFIG_HID_DRAGONRISE is not set
-# CONFIG_HID_EZKEY is not set
-# CONFIG_HID_FF is not set
-# CONFIG_HID_GREENASIA is not set
-# CONFIG_HID_GYRATION is not set
-# CONFIG_HID is not set
-# CONFIG_HID_KENSINGTON is not set
-# CONFIG_HID_KYE is not set
-# CONFIG_HID_LOGITECH is not set
-# CONFIG_HID_MICROSOFT is not set
-# CONFIG_HID_MONTEREY is not set
-# CONFIG_HID_NTRIG is not set
-# CONFIG_HID_PANTHERLORD is not set
-# CONFIG_HID_PETALYNX is not set
-# CONFIG_HID_PID is not set
-# CONFIG_HIDRAW is not set
-# CONFIG_HID_SAMSUNG is not set
-# CONFIG_HID_SMARTJOYPLUS is not set
-# CONFIG_HID_SONY is not set
-# CONFIG_HID_SUNPLUS is not set
-# CONFIG_HID_SUPPORT is not set
-# CONFIG_HID_THRUSTMASTER is not set
-# CONFIG_HID_TOPSEED is not set
-# CONFIG_HID_TWINHAN is not set
-# CONFIG_HID_WACOM is not set
-# CONFIG_HID_ZEROPLUS is not set
-# CONFIG_HIGHMEM is not set
-CONFIG_HIGH_RES_TIMERS=y
-# CONFIG_HIPPI is not set
-# CONFIG_HOSTAP_CS is not set
-# CONFIG_HOSTAP is not set
-# CONFIG_HOSTAP_PCI is not set
-# CONFIG_HOSTAP_PLX is not set
-# CONFIG_HOTPLUG_CPU is not set
-# CONFIG_HOTPLUG_PCI is not set
-CONFIG_HOTPLUG=y
-# CONFIG_HP100 is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_HP_ILO is not set
-# CONFIG_HTC_EGPIO is not set
-# CONFIG_HTC_PASIC3 is not set
-# CONFIG_HUGETLB_PAGE is not set
-# CONFIG_HVC_UDBG is not set
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-# CONFIG_HW_RANDOM_AMD is not set
-# CONFIG_HW_RANDOM_GEODE is not set
-# CONFIG_HW_RANDOM_INTEL is not set
-# CONFIG_HW_RANDOM_TIMERIOMEM is not set
-# CONFIG_HW_RANDOM_VIA is not set
-# CONFIG_HYPERV is not set
-# CONFIG_HYSDN is not set
-CONFIG_HZ=100
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ_100=y
-# CONFIG_HZ_1024 is not set
-# CONFIG_HZ_128 is not set
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_256 is not set
-# CONFIG_HZ_300 is not set
-# CONFIG_HZ_48 is not set
-# CONFIG_I2C_ALGOBIT is not set
-# CONFIG_I2C_ALGOPCA is not set
-# CONFIG_I2C_ALGOPCF is not set
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_CHARDEV is not set
-# CONFIG_I2C_COMPAT is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_ELEKTOR is not set
-# CONFIG_I2C_GPIO is not set
-# CONFIG_I2C_HELPER_AUTO is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-# CONFIG_I2C_IBM_IIC is not set
-# CONFIG_I2C_ISCH is not set
-# CONFIG_I2C is not set
-# CONFIG_I2C_MPC is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_OCORES is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PCA_ISA is not set
-# CONFIG_I2C_PCA_PLATFORM is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_I2C_SIMTEC is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_TAOS_EVM is not set
-# CONFIG_I2C_TINY_USB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2O is not set
-# CONFIG_I82092 is not set
-# CONFIG_I82365 is not set
-# CONFIG_IBM_ASM is not set
-# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
-# CONFIG_IBM_NEW_EMAC_RGMII is not set
-# CONFIG_IBM_NEW_EMAC_TAH is not set
-# CONFIG_IBM_NEW_EMAC_ZMII is not set
-# CONFIG_ICPLUS_PHY is not set
-# CONFIG_ICS932S401 is not set
-# CONFIG_IDEDISK_MULTI_MODE is not set
-# CONFIG_IDEDMA_IVB is not set
-# CONFIG_IDEDMA_ONLYDISK is not set
-# CONFIG_IDE_GD is not set
-# CONFIG_IDE is not set
-CONFIG_IDE_MAX_HWIFS=4
-# CONFIG_IDEPCI_SHARE_IRQ is not set
-# CONFIG_IDE_PHISON is not set
-CONFIG_IDE_PROC_FS=y
-# CONFIG_IDE_TASK_IOCTL is not set
-# CONFIG_IEEE1394_DV1394 is not set
-# CONFIG_IEEE1394_ETH1394 is not set
-# CONFIG_IEEE1394 is not set
-# CONFIG_IEEE1394_OHCI1394 is not set
-# CONFIG_IEEE1394_PCILYNX is not set
-# CONFIG_IEEE1394_RAWIO is not set
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-# CONFIG_IEEE1394_VIDEO1394 is not set
-# CONFIG_IEEE80211_CRYPT_CCMP is not set
-# CONFIG_IEEE80211_CRYPT_TKIP is not set
-# CONFIG_IEEE80211_CRYPT_WEP is not set
-# CONFIG_IEEE80211_DEBUG is not set
-# CONFIG_IEEE80211 is not set
-# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
-# CONFIG_IEEE80211_SOFTMAC is not set
-# CONFIG_IEEE802154 is not set
-# CONFIG_IFB is not set
-# CONFIG_IGB is not set
-# CONFIG_IGBVF is not set
-# CONFIG_IIO is not set
-# CONFIG_RAMZSWAP is not set
-# CONFIG_BATMAN_ADV is not set
-# CONFIG_IKCONFIG is not set
-# CONFIG_IKCONFIG_PROC is not set
-# CONFIG_IMAGE_CMDLINE_HACK is not set
-# CONFIG_IMQ_BEHAVIOR_AA is not set
-# CONFIG_IMQ_BEHAVIOR_AB is not set
-# CONFIG_IMQ_BEHAVIOR_BA is not set
-# CONFIG_IMQ_BEHAVIOR_BB is not set
-# CONFIG_IMQ is not set
-CONFIG_IMQ_NUM_DEVS=2
-# CONFIG_INET6_AH is not set
-# CONFIG_INET6_ESP is not set
-# CONFIG_INET6_IPCOMP is not set
-# CONFIG_INET6_TUNNEL is not set
-# CONFIG_INET6_XFRM_MODE_BEET is not set
-# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET6_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_LRO is not set
-# CONFIG_INET_TCP_DIAG is not set
-# CONFIG_INET_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-CONFIG_INET=y
-# CONFIG_INFINIBAND is not set
-# CONFIG_INFTL is not set
-CONFIG_INIT_ENV_ARG_LIMIT=32
-# CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set
-# CONFIG_INITRAMFS_COMPRESSION_GZIP is not set
-# CONFIG_INITRAMFS_COMPRESSION_LZMA is not set
-CONFIG_INITRAMFS_COMPRESSION_NONE=y
-# CONFIG_INOTIFY is not set
-# CONFIG_INOTIFY_USER is not set
-# CONFIG_INPUT_APANEL is not set
-# CONFIG_INPUT_ATI_REMOTE2 is not set
-# CONFIG_INPUT_ATI_REMOTE is not set
-# CONFIG_INPUT_ATLAS_BTNS is not set
-# CONFIG_INPUT_CM109 is not set
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_FF_MEMLESS is not set
-# CONFIG_INPUT_GPIO is not set
-# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
-# CONFIG_INPUT is not set
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-# CONFIG_INPUT_MIMIO is not set
-CONFIG_INPUT_MISC=y
-# CONFIG_INPUT_MOUSEDEV is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_PCSPKR is not set
-# CONFIG_INPUT_POLLDEV is not set
-# CONFIG_INPUT_POWERMATE is not set
-# CONFIG_INPUT_SPARSEKMAP is not set
-# CONFIG_INPUT_TABLET is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_UINPUT is not set
-# CONFIG_INPUT_WINBOND_CIR is not set
-# CONFIG_INPUT_WISTRON_BTNS is not set
-# CONFIG_INSTRUMENTATION is not set
-# CONFIG_IOSCHED_AS is not set
-# CONFIG_IOSCHED_CFQ is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IP1000 is not set
-# CONFIG_IP175C_PHY is not set
-# CONFIG_IP6_NF_FILTER is not set
-# CONFIG_IP6_NF_IPTABLES is not set
-# CONFIG_IP6_NF_MANGLE is not set
-# CONFIG_IP6_NF_MATCH_AH is not set
-# CONFIG_IP6_NF_MATCH_EUI64 is not set
-# CONFIG_IP6_NF_MATCH_FRAG is not set
-# CONFIG_IP6_NF_MATCH_HL is not set
-# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
-# CONFIG_IP6_NF_MATCH_LIMIT is not set
-# CONFIG_IP6_NF_MATCH_MH is not set
-# CONFIG_IP6_NF_MATCH_OPTS is not set
-# CONFIG_IP6_NF_MATCH_OWNER is not set
-# CONFIG_IP6_NF_MATCH_RT is not set
-# CONFIG_IP6_NF_QUEUE is not set
-# CONFIG_IP6_NF_RAW is not set
-# CONFIG_IP6_NF_TARGET_HL is not set
-# CONFIG_IP6_NF_TARGET_IMQ is not set
-# CONFIG_IP6_NF_TARGET_LOG is not set
-# CONFIG_IP6_NF_TARGET_REJECT is not set
-# CONFIG_IP6_NF_TARGET_ROUTE is not set
-CONFIG_IP_ADVANCED_ROUTER=y
-# CONFIG_IPC_NS is not set
-# CONFIG_IP_DCCP is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_FIB_TRIE is not set
-# CONFIG_IPMI_HANDLER is not set
-CONFIG_IP_MROUTE=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_MULTIPLE_TABLES=y
-# CONFIG_IP_NF_AMANDA is not set
-# CONFIG_IP_NF_ARPFILTER is not set
-# CONFIG_IP_NF_ARP_MANGLE is not set
-# CONFIG_IP_NF_ARPTABLES is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CONNTRACK_MARK=y
-CONFIG_IP_NF_CONNTRACK=y
-CONFIG_IP_NF_CT_ACCT=y
-# CONFIG_IP_NF_CT_PROTO_SCTP is not set
-# CONFIG_IP_NF_FILTER is not set
-# CONFIG_IP_NF_FTP is not set
-# CONFIG_IP_NF_H323 is not set
-# CONFIG_IP_NF_IPTABLES is not set
-# CONFIG_IP_NF_IRC is not set
-# CONFIG_IP_NF_MANGLE is not set
-# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
-# CONFIG_IP_NF_MATCH_AH is not set
-# CONFIG_IP_NF_MATCH_ECN is not set
-# CONFIG_IP_NF_MATCH_HASHLIMIT is not set
-# CONFIG_IP_NF_MATCH_IPP2P is not set
-# CONFIG_IP_NF_MATCH_OWNER is not set
-# CONFIG_IP_NF_MATCH_RECENT is not set
-# CONFIG_IP_NF_MATCH_SET is not set
-# CONFIG_IP_NF_MATCH_TIME is not set
-# CONFIG_IP_NF_MATCH_TOS is not set
-# CONFIG_IP_NF_MATCH_TTL is not set
-# CONFIG_IP_NF_NAT_AMANDA is not set
-# CONFIG_IP_NF_NAT_FTP is not set
-# CONFIG_IP_NF_NAT_H323 is not set
-# CONFIG_IP_NF_NAT_IRC is not set
-CONFIG_IP_NF_NAT_NEEDED=y
-# CONFIG_IP_NF_NAT_PPTP is not set
-# CONFIG_IP_NF_NAT_SIP is not set
-# CONFIG_IP_NF_NAT_SNMP_BASIC is not set
-# CONFIG_IP_NF_NAT_TFTP is not set
-CONFIG_IP_NF_NAT=y
-# CONFIG_IP_NF_NETBIOS_NS is not set
-# CONFIG_IP_NF_PPTP is not set
-# CONFIG_IP_NF_QUEUE is not set
-# CONFIG_IP_NF_RAW is not set
-# CONFIG_IP_NF_SECURITY is not set
-CONFIG_IP_NF_SET_HASHSIZE=1024
-# CONFIG_IP_NF_SET_IPHASH is not set
-# CONFIG_IP_NF_SET_IPMAP is not set
-# CONFIG_IP_NF_SET_IPPORTHASH is not set
-# CONFIG_IP_NF_SET_IPTREE is not set
-# CONFIG_IP_NF_SET_IPTREEMAP is not set
-# CONFIG_IP_NF_SET is not set
-# CONFIG_IP_NF_SET_MACIPMAP is not set
-CONFIG_IP_NF_SET_MAX=256
-# CONFIG_IP_NF_SET_NETHASH is not set
-# CONFIG_IP_NF_SET_PORTMAP is not set
-# CONFIG_IP_NF_SIP is not set
-# CONFIG_IP_NF_TARGET_CLUSTERIP is not set
-# CONFIG_IP_NF_TARGET_ECN is not set
-# CONFIG_IP_NF_TARGET_IMQ is not set
-# CONFIG_IP_NF_TARGET_LOG is not set
-# CONFIG_IP_NF_TARGET_MASQUERADE is not set
-# CONFIG_IP_NF_TARGET_NETMAP is not set
-# CONFIG_IP_NF_TARGET_REDIRECT is not set
-# CONFIG_IP_NF_TARGET_REJECT is not set
-# CONFIG_IP_NF_TARGET_ROUTE is not set
-# CONFIG_IP_NF_TARGET_SAME is not set
-# CONFIG_IP_NF_TARGET_SET is not set
-# CONFIG_IP_NF_TARGET_TOS is not set
-# CONFIG_IP_NF_TARGET_TTL is not set
-# CONFIG_IP_NF_TARGET_ULOG is not set
-# CONFIG_IP_NF_TFTP is not set
-# CONFIG_IP_PIMSM_V1 is not set
-# CONFIG_IP_PIMSM_V2 is not set
-# CONFIG_IP_PNP is not set
-CONFIG_IP_ROUTE_FWMARK=y
-CONFIG_IP_ROUTE_MULTIPATH_CACHED=y
-# CONFIG_IP_ROUTE_MULTIPATH_DRR is not set
-# CONFIG_IP_ROUTE_MULTIPATH_RANDOM is not set
-# CONFIG_IP_ROUTE_MULTIPATH_RR is not set
-# CONFIG_IP_ROUTE_MULTIPATH_WRANDOM is not set
-CONFIG_IP_ROUTE_MULTIPATH=y
-CONFIG_IP_ROUTE_VERBOSE=y
-# CONFIG_IP_SCTP is not set
-CONFIG_IPSEC_NAT_TRAVERSAL=y
-# CONFIG_IPV6 is not set
-# CONFIG_IPV6_MIP6 is not set
-# CONFIG_IPV6_MROUTE is not set
-# CONFIG_IPV6_MULTIPLE_TABLES is not set
-CONFIG_IPV6_NDISC_NODETYPE=y
-# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTE_INFO is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-# CONFIG_IPV6_SIT is not set
-# CONFIG_IPV6_SIT_6RD is not set
-# CONFIG_IPV6_TUNNEL is not set
-# CONFIG_IP_VS is not set
-# CONFIG_IPW2100_DEBUG is not set
-# CONFIG_IPW2100 is not set
-CONFIG_IPW2100_MONITOR=y
-# CONFIG_IPW2200_DEBUG is not set
-# CONFIG_IPW2200 is not set
-CONFIG_IPW2200_MONITOR=y
-# CONFIG_IPW2200_PROMISCUOUS is not set
-# CONFIG_IPW2200_QOS is not set
-# CONFIG_IPW2200_RADIOTAP is not set
-# CONFIG_IPWIRELESS is not set
-# CONFIG_IPX is not set
-# CONFIG_IRDA is not set
-# CONFIG_IRQSOFF_TRACER is not set
-# CONFIG_ISCSI_TCP is not set
-CONFIG_ISDN=y
-# CONFIG_ISDN_AUDIO is not set
-# CONFIG_ISDN_CAPI_CAPIDRV is not set
-# CONFIG_ISDN_DIVERSION is not set
-# CONFIG_ISDN_DRV_ACT2000 is not set
-# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set
-# CONFIG_ISDN_DRV_EICON is not set
-# CONFIG_ISDN_DRV_HISAX is not set
-# CONFIG_ISDN_DRV_ICN is not set
-# CONFIG_ISDN_DRV_LOOP is not set
-# CONFIG_ISDN_DRV_PCBIT is not set
-# CONFIG_ISDN_DRV_SC is not set
-# CONFIG_ISDN_DRV_TPAM is not set
-# CONFIG_ISDN_WITH_ABC is not set
-# CONFIG_ISL29003 is not set
-# CONFIG_ISO9660_FS is not set
-# CONFIG_IWL3945 is not set
-# CONFIG_IWLAGN is not set
-# CONFIG_IWLCORE is not set
-# CONFIG_IWLWIFI is not set
-# CONFIG_IWLWIFI_LEDS is not set
-# CONFIG_IWMC3200TOP is not set
-# CONFIG_IXGB is not set
-# CONFIG_JBD2_DEBUG is not set
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_JBD is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_FS_DEBUG=0
-# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-# CONFIG_JFFS2_FS_XATTR is not set
-CONFIG_JFFS2_FS=y
-# CONFIG_JFFS2_LZO is not set
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_ZLIB=y
-# CONFIG_JFFS_FS is not set
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_JFS_POSIX_ACL is not set
-# CONFIG_JFS_SECURITY is not set
-# CONFIG_JFS_STATISTICS is not set
-# CONFIG_JME is not set
-CONFIG_JOLIET=y
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-# CONFIG_KALLSYMS is not set
-# CONFIG_KARMA_PARTITION is not set
-# CONFIG_KERNEL_BZIP2 is not set
-# CONFIG_KERNEL_GZIP is not set
-CONFIG_KERNEL_LZMA=y
-# CONFIG_KERNEL_LZO is not set
-# CONFIG_KEXEC is not set
-# CONFIG_KEYBOARD_ADP5588 is not set
-# CONFIG_KEYBOARD_LM8323 is not set
-# CONFIG_KEYBOARD_MAX7359 is not set
-# CONFIG_KEYBOARD_OPENCORES is not set
-# CONFIG_KEYS is not set
-# CONFIG_KGDB is not set
-# CONFIG_KMEMTRACE is not set
-CONFIG_KMOD=y
-# CONFIG_KPROBES is not set
-# CONFIG_KS8842 is not set
-# CONFIG_KS8851 is not set
-# CONFIG_KS8851_MLL is not set
-# CONFIG_KSM is not set
-# CONFIG_LANMEDIA is not set
-# CONFIG_LAPB is not set
-# CONFIG_LASAT is not set
-# CONFIG_LATENCYTOP is not set
-CONFIG_LBDAF=y
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_LEDS_ALIX is not set
-# CONFIG_LEDS_BD2802 is not set
-CONFIG_LEDS_CLASS=y
-# CONFIG_LEDS_DAC124S085 is not set
-CONFIG_LEDS_GPIO_PLATFORM=y
-# CONFIG_LEDS_LT3593 is not set
-# CONFIG_LEDS_LP3944 is not set
-# CONFIG_LEDS_LP5521 is not set
-# CONFIG_LEDS_PCA9532 is not set
-# CONFIG_LEDS_PCA955X is not set
-# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
-CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
-# CONFIG_LEDS_TRIGGER_GPIO is not set
-CONFIG_LEDS_TRIGGER_HEARTBEAT=y
-# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
-# CONFIG_LEDS_TRIGGER_MORSE is not set
-CONFIG_LEDS_TRIGGER_NETDEV=y
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_LIB80211_CRYPT_CCMP is not set
-# CONFIG_LIB80211_CRYPT_TKIP is not set
-# CONFIG_LIB80211_CRYPT_WEP is not set
-# CONFIG_LIB80211_DEBUG is not set
-# CONFIG_LIB80211 is not set
-# CONFIG_LIBCRC32C is not set
-# CONFIG_LIBERTAS is not set
-# CONFIG_LIBERTAS_THINFIRM is not set
-# CONFIG_LIBERTAS_USB is not set
-# CONFIG_LIBFC is not set
-# CONFIG_LIBFCOE is not set
-# CONFIG_LIBIPW_DEBUG is not set
-# CONFIG_LINE6_USB is not set
-# CONFIG_LLC2 is not set
-CONFIG_LLC=y
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_LOCKDEP_SUPPORT=y
-# CONFIG_LOCKD is not set
-CONFIG_LOCKD_V4=y
-# CONFIG_LOCK_STAT is not set
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_LOGIRUMBLEPAD2_FF is not set
-# CONFIG_LOGITECH_FF is not set
-# CONFIG_LOGO is not set
-# CONFIG_LSF is not set
-# CONFIG_LSI_ET1011C_PHY is not set
-# CONFIG_LTPC is not set
-# CONFIG_LXT_PHY is not set
-CONFIG_MAC80211_DEFAULT_PS_VALUE=1
-CONFIG_MAC80211_DEFAULT_PS=y
-# CONFIG_MAC80211 is not set
-# CONFIG_MAC_EMUMOUSEBTN is not set
-# CONFIG_MACINTOSH_DRIVERS is not set
-# CONFIG_MAC_PARTITION is not set
-# CONFIG_MACVLAN is not set
-# CONFIG_MAGIC_SYSRQ is not set
-# CONFIG_MARKEINS is not set
-# CONFIG_MARKERS is not set
-# CONFIG_MARVELL_PHY is not set
-# CONFIG_MDIO_BITBANG is not set
-# CONFIG_MD is not set
-# CONFIG_ME4000 is not set
-# CONFIG_MEDIA_ATTACH is not set
-# CONFIG_MEDIA_SUPPORT is not set
-# CONFIG_MEDIA_TUNER_CUSTOMISE is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_MEILHAUS is not set
-# CONFIG_MEMORY_FAILURE is not set
-# CONFIG_MEMSTICK is not set
-# CONFIG_MFD_88PM8607 is not set
-# CONFIG_MFD_ASIC3 is not set
-# CONFIG_MFD_CORE is not set
-# CONFIG_MFD_MC13783 is not set
-# CONFIG_MFD_PCF50633 is not set
-# CONFIG_MFD_SM501 is not set
-# CONFIG_MFD_TC6387XB is not set
-# CONFIG_MFD_TC6393XB is not set
-# CONFIG_MFD_TMIO is not set
-# CONFIG_MFD_WM831X is not set
-# CONFIG_MFD_WM8350_I2C is not set
-# CONFIG_MFD_WM8400 is not set
-# CONFIG_MG_DISK is not set
-# CONFIG_MIGRATION is not set
-CONFIG_MII=y
-CONFIG_MINI_FO=y
-# CONFIG_MINIX_FS is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_MIPS_FPU_EMU is not set
-CONFIG_MISC_DEVICES=y
-CONFIG_MISC_FILESYSTEMS=y
-# CONFIG_MISDN_AVMFRITZ is not set
-# CONFIG_MISDN_HFCPCI is not set
-# CONFIG_MISDN_HFCUSB is not set
-# CONFIG_MISDN_INFINEON is not set
-# CONFIG_MISDN is not set
-# CONFIG_MISDN_NETJET is not set
-# CONFIG_MISDN_SPEEDFAX is not set
-# CONFIG_MISDN_W6692 is not set
-# CONFIG_MKISS is not set
-# CONFIG_MMC_ARMMMCI is not set
-CONFIG_MMC_BLOCK_BOUNCE=y
-# CONFIG_MMC_BLOCK is not set
-# CONFIG_MMC_CB710 is not set
-# CONFIG_MMC_DEBUG is not set
-# CONFIG_MMC is not set
-# CONFIG_MMC_MVSDIO is not set
-# CONFIG_MMC_S3C is not set
-# CONFIG_MMC_SDHCI is not set
-# CONFIG_MMC_SDRICOH_CS is not set
-# CONFIG_MMC_SPI is not set
-# CONFIG_MMC_TEST is not set
-# CONFIG_MMC_UNSAFE_RESUME is not set
-# CONFIG_MMC_VIA_SDMMC is not set
-CONFIG_MMU=y
-# CONFIG_MODULE_FORCE_LOAD is not set
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MOUSE_APPLETOUCH is not set
-# CONFIG_MOUSE_INPORT is not set
-# CONFIG_MOUSE_LOGIBM is not set
-# CONFIG_MOUSE_PC110PAD is not set
-# CONFIG_MOUSE_PS2_SENTELIC is not set
-# CONFIG_MOUSE_SYNAPTICS_I2C is not set
-# CONFIG_MSDOS_FS is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_AFS_PARTS is not set
-# CONFIG_MTD_ALAUDA is not set
-# CONFIG_MTD_AR7_PARTS is not set
-# CONFIG_MTD_ARM_INTEGRATOR is not set
-CONFIG_MTD_BLKDEVS=y
-# CONFIG_MTD_BLOCK2MTD is not set
-CONFIG_MTD_BLOCK=y
-# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-CONFIG_MTD_CFI_AMDSTD=y
-# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
-CONFIG_MTD_CFI_INTELEXT=y
-# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-CONFIG_MTD_CFI_NOSWAP=y
-# CONFIG_MTD_CFI_STAA is not set
-CONFIG_MTD_CFI_UTIL=y
-CONFIG_MTD_CFI=y
-CONFIG_MTD_CHAR=y
-# CONFIG_MTD_CMDLINE_PARTS is not set
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_CONCAT is not set
-# CONFIG_MTD_DATAFLASH is not set
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-CONFIG_MTD_GEN_PROBE=y
-# CONFIG_MTD_GPIO_ADDR is not set
-# CONFIG_MTD_INTEL_VR_NOR is not set
-# CONFIG_MTD_JEDECPROBE is not set
-# CONFIG_MTD_LPDDR is not set
-# CONFIG_MTD_M25P80 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_MYLOADER_PARTS is not set
-# CONFIG_MTD_NAND_CAFE is not set
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_GPIO is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND is not set
-# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-# CONFIG_MTD_NAND_NANDSIM is not set
-# CONFIG_MTD_NAND_PLATFORM is not set
-# CONFIG_MTD_NAND_VERIFY_WRITE is not set
-# CONFIG_MTD_ONENAND is not set
-# CONFIG_MTD_OOPS is not set
-# CONFIG_MTD_OTP is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_PCI is not set
-# CONFIG_MTD_PHRAM is not set
-# CONFIG_MTD_PHYSMAP_COMPAT is not set
-# CONFIG_MTD_PHYSMAP is not set
-# CONFIG_MTD_PLATRAM is not set
-# CONFIG_MTD_PMC551 is not set
-# CONFIG_MTD_RAM is not set
-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
-# CONFIG_MTD_REDBOOT_PARTS is not set
-# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-# CONFIG_MTD_ROM is not set
-CONFIG_MTD_ROOTFS_ROOT_DEV=y
-CONFIG_MTD_ROOTFS_SPLIT=y
-# CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_SST25L is not set
-# CONFIG_MTD_TESTS is not set
-# CONFIG_MTD_UBI is not set
-CONFIG_MTD=y
-# CONFIG_MV643XX_ETH is not set
-# CONFIG_MVSWITCH_PHY is not set
-# CONFIG_MWAVE is not set
-# CONFIG_MWL8K is not set
-# CONFIG_MYRI10GE is not set
-# CONFIG_NAMESPACES is not set
-# CONFIG_NATIONAL_PHY is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_NEC_MARKEINS is not set
-# CONFIG_NET_9P is not set
-# CONFIG_NET_ACT_GACT is not set
-# CONFIG_NET_ACT_IPT is not set
-# CONFIG_NET_ACT_MIRRED is not set
-# CONFIG_NET_ACT_NAT is not set
-# CONFIG_NET_ACT_PEDIT is not set
-# CONFIG_NET_ACT_POLICE is not set
-# CONFIG_NET_ACT_SIMP is not set
-CONFIG_NET_ACT_SKBEDIT=y
-CONFIG_NET_CLS_ACT=y
-CONFIG_NET_CLS_BASIC=y
-# CONFIG_NET_CLS_FLOW is not set
-# CONFIG_NET_CLS_FW is not set
-CONFIG_NET_CLS_IND=y
-# CONFIG_NET_CLS_ROUTE4 is not set
-# CONFIG_NET_CLS_RSVP6 is not set
-# CONFIG_NET_CLS_RSVP is not set
-# CONFIG_NET_CLS_TCINDEX is not set
-# CONFIG_NET_CLS_U32 is not set
-CONFIG_NET_CLS=y
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETDEBUG is not set
-# CONFIG_NETDEV_10000 is not set
-CONFIG_NETDEV_1000=y
-CONFIG_NETDEVICES_MULTIQUEUE=y
-CONFIG_NETDEVICES=y
-# CONFIG_NET_DROP_MONITOR is not set
-# CONFIG_NET_DSA is not set
-# CONFIG_NET_EMATCH_CMP is not set
-# CONFIG_NET_EMATCH is not set
-# CONFIG_NET_EMATCH_META is not set
-# CONFIG_NET_EMATCH_NBYTE is not set
-CONFIG_NET_EMATCH_STACK=32
-# CONFIG_NET_EMATCH_TEXT is not set
-# CONFIG_NET_EMATCH_U32 is not set
-CONFIG_NET_ESTIMATOR=y
-CONFIG_NET_ETHERNET=y
-# CONFIG_NET_FC is not set
-CONFIG_NETFILTER_ADVANCED=y
-# CONFIG_NETFILTER_DEBUG is not set
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_NETLINK_LOG is not set
-# CONFIG_NETFILTER_NETLINK_QUEUE is not set
-# CONFIG_NETFILTER_TPROXY is not set
-# CONFIG_NETFILTER_XTABLES is not set
-# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set
-# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set
-# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
-# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
-# CONFIG_NETFILTER_XT_MATCH_ESP is not set
-# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_HELPER is not set
-# CONFIG_NETFILTER_XT_MATCH_HL is not set
-# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
-# CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG is not set
-# CONFIG_NETFILTER_XT_MATCH_LAYER7 is not set
-# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
-# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_MAC is not set
-# CONFIG_NETFILTER_XT_MATCH_MARK is not set
-# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
-# CONFIG_NETFILTER_XT_MATCH_OSF is not set
-# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
-# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
-# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
-# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
-# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
-# CONFIG_NETFILTER_XT_MATCH_REALM is not set
-# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
-# CONFIG_NETFILTER_XT_MATCH_RECENT_PROC_COMPAT is not set
-# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
-# CONFIG_NETFILTER_XT_MATCH_STATE is not set
-# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
-# CONFIG_NETFILTER_XT_MATCH_STRING is not set
-# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
-# CONFIG_NETFILTER_XT_MATCH_TIME is not set
-# CONFIG_NETFILTER_XT_MATCH_U32 is not set
-# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
-# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
-# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
-# CONFIG_NETFILTER_XT_TARGET_HL is not set
-# CONFIG_NETFILTER_XT_TARGET_IMQ is not set
-# CONFIG_NETFILTER_XT_TARGET_LED is not set
-# CONFIG_NETFILTER_XT_TARGET_MARK is not set
-# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
-# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
-# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
-# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
-# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
-CONFIG_NETFILTER=y
-CONFIG_NET_IPGRE_BROADCAST=y
-# CONFIG_NET_IPGRE is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_ISA is not set
-# CONFIG_NET_KEY is not set
-# CONFIG_NET_KEY_MIGRATE is not set
-CONFIG_NET_PCI=y
-# CONFIG_NET_PCMCIA is not set
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_NETPOLL is not set
-CONFIG_NET_RADIO=y
-# CONFIG_NETROM is not set
-# CONFIG_NET_SB1000 is not set
-# CONFIG_NET_SCH_ATM is not set
-# CONFIG_NET_SCH_CBQ is not set
-# CONFIG_NET_SCH_CLK_CPU is not set
-# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
-CONFIG_NET_SCH_CLK_JIFFIES=y
-# CONFIG_NET_SCH_DRR is not set
-# CONFIG_NET_SCH_DSMARK is not set
-CONFIG_NET_SCHED=y
-# CONFIG_NET_SCH_ESFQ is not set
-CONFIG_NET_SCH_ESFQ_NFCT=y
-CONFIG_NET_SCH_FIFO=y
-# CONFIG_NET_SCH_GRED is not set
-# CONFIG_NET_SCH_HFSC is not set
-# CONFIG_NET_SCH_HTB is not set
-# CONFIG_NET_SCH_INGRESS is not set
-# CONFIG_NET_SCH_MULTIQ is not set
-# CONFIG_NET_SCH_NETEM is not set
-# CONFIG_NET_SCH_PRIO is not set
-# CONFIG_NET_SCH_RED is not set
-# CONFIG_NET_SCH_RR is not set
-# CONFIG_NET_SCH_SFQ is not set
-# CONFIG_NET_SCH_TBF is not set
-# CONFIG_NET_SCH_TEQL is not set
-# CONFIG_NET_TULIP is not set
-# CONFIG_NET_VENDOR_3COM is not set
-CONFIG_NET_WIRELESS_RTNETLINK=y
-CONFIG_NET_WIRELESS=y
-CONFIG_NETWORK_FILESYSTEMS=y
-# CONFIG_NETWORK_SECMARK is not set
-# CONFIG_NETXEN_NIC is not set
-CONFIG_NET=y
-# CONFIG_NEW_GPIO is not set
-CONFIG_NEW_LEDS=y
-# CONFIG_NF_CONNTRACK_AMANDA is not set
-CONFIG_NF_CONNTRACK_ENABLED=y
-# CONFIG_NF_CONNTRACK_EVENTS is not set
-# CONFIG_NF_CONNTRACK_FTP is not set
-# CONFIG_NF_CONNTRACK_H323 is not set
-# CONFIG_NF_CONNTRACK_IPV4 is not set
-# CONFIG_NF_CONNTRACK_IPV6 is not set
-# CONFIG_NF_CONNTRACK_IRC is not set
-# CONFIG_NF_CONNTRACK is not set
-CONFIG_NF_CONNTRACK_MARK=y
-# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
-# CONFIG_NF_CONNTRACK_PPTP is not set
-CONFIG_NF_CONNTRACK_PROC_COMPAT=y
-# CONFIG_NF_CONNTRACK_RTSP is not set
-# CONFIG_NF_CONNTRACK_SANE is not set
-# CONFIG_NF_CONNTRACK_SIP is not set
-CONFIG_NF_CONNTRACK_SUPPORT=y
-# CONFIG_NF_CONNTRACK_TFTP is not set
-# CONFIG_NF_CT_ACCT is not set
-# CONFIG_NF_CT_NETLINK is not set
-# CONFIG_NF_CT_PROTO_DCCP is not set
-# CONFIG_NF_CT_PROTO_GRE is not set
-# CONFIG_NF_CT_PROTO_SCTP is not set
-# CONFIG_NF_CT_PROTO_UDPLITE is not set
-# CONFIG_NF_DEFRAG_IPV4 is not set
-# CONFIG_NF_NAT_AMANDA is not set
-# CONFIG_NF_NAT_FTP is not set
-# CONFIG_NF_NAT_H323 is not set
-# CONFIG_NF_NAT_IRC is not set
-# CONFIG_NF_NAT is not set
-CONFIG_NF_NAT_NEEDED=y
-# CONFIG_NF_NAT_PPTP is not set
-# CONFIG_NF_NAT_PROTO_GRE is not set
-# CONFIG_NF_NAT_RTSP is not set
-# CONFIG_NF_NAT_SIP is not set
-# CONFIG_NF_NAT_SNMP_BASIC is not set
-# CONFIG_NF_NAT_TFTP is not set
-# CONFIG_NFS_ACL_SUPPORT is not set
-CONFIG_NFS_COMMON=y
-# CONFIG_NFS_DIRECTIO is not set
-# CONFIG_NFSD is not set
-CONFIG_NFSD_TCP=y
-# CONFIG_NFSD_V2_ACL is not set
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V4 is not set
-# CONFIG_NFS_FS is not set
-# CONFIG_NFS_V3_ACL is not set
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V4_1 is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFTL is not set
-# CONFIG_NILFS2_FS is not set
-CONFIG_NL80211=y
-CONFIG_NLATTR=y
-# CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-# CONFIG_NO_HZ is not set
-# CONFIG_NOP_USB_XCEIV is not set
-# CONFIG_NORTEL_HERMES is not set
-# CONFIG_NOZOMI is not set
-# CONFIG_NS83820 is not set
-# CONFIG_NTFS_DEBUG is not set
-# CONFIG_NTFS_FS is not set
-# CONFIG_NTFS_RW is not set
-# CONFIG_NVRAM is not set
-# CONFIG_OC_ETM is not set
-# CONFIG_OCF_BENCH is not set
-# CONFIG_OCF_EP80579 is not set
-# CONFIG_OCF_HIFNHIPP is not set
-# CONFIG_OCF_HIFN is not set
-# CONFIG_OCF_IXP4XX is not set
-# CONFIG_OCF_OCF is not set
-# CONFIG_OCF_OCFNULL is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_OCF_SAFE is not set
-# CONFIG_OCF_TALITOS is not set
-# CONFIG_OMFS_FS is not set
-# CONFIG_ORION_WATCHDOG is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_P54_COMMON is not set
-CONFIG_PACKET_MMAP=y
-CONFIG_PACKET=y
-# CONFIG_PAGE_POISONING is not set
-# CONFIG_PAGE_SIZE_16KB is not set
-# CONFIG_PAGE_SIZE_32KB is not set
-CONFIG_PAGE_SIZE_4KB=y
-# CONFIG_PAGE_SIZE_64KB is not set
-# CONFIG_PAGE_SIZE_8KB is not set
-# CONFIG_PANTHERLORD_FF is not set
-# CONFIG_PARPORT is not set
-# CONFIG_PARPORT_PC is not set
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_PATA_ALI is not set
-# CONFIG_PATA_AMD is not set
-# CONFIG_PATA_ARTOP is not set
-# CONFIG_PATA_ATIIXP is not set
-# CONFIG_PATA_ATP867X is not set
-# CONFIG_PATA_CMD640_PCI is not set
-# CONFIG_PATA_CMD64X is not set
-# CONFIG_PATA_CS5520 is not set
-# CONFIG_PATA_CS5530 is not set
-# CONFIG_PATA_CS5535 is not set
-# CONFIG_PATA_CS5536 is not set
-# CONFIG_PATA_CYPRESS is not set
-# CONFIG_PATA_EFAR is not set
-# CONFIG_PATA_HPT366 is not set
-# CONFIG_PATA_HPT37X is not set
-# CONFIG_PATA_HPT3X2N is not set
-# CONFIG_PATA_HPT3X3 is not set
-# CONFIG_PATA_ISAPNP is not set
-# CONFIG_PATA_IT8213 is not set
-# CONFIG_PATA_IT821X is not set
-# CONFIG_PATA_JMICRON is not set
-# CONFIG_PATA_LEGACY is not set
-# CONFIG_PATA_MARVELL is not set
-# CONFIG_PATA_MPIIX is not set
-# CONFIG_PATA_NETCELL is not set
-# CONFIG_PATA_NINJA32 is not set
-# CONFIG_PATA_NS87410 is not set
-# CONFIG_PATA_NS87415 is not set
-# CONFIG_PATA_OLDPIIX is not set
-# CONFIG_PATA_OPTIDMA is not set
-# CONFIG_PATA_OPTI is not set
-# CONFIG_PATA_PCMCIA is not set
-# CONFIG_PATA_PDC2027X is not set
-# CONFIG_PATA_PDC_OLD is not set
-# CONFIG_PATA_PLATFORM is not set
-# CONFIG_PATA_QDI is not set
-# CONFIG_PATA_RADISYS is not set
-# CONFIG_PATA_RDC is not set
-# CONFIG_PATA_RZ1000 is not set
-# CONFIG_PATA_SC1200 is not set
-# CONFIG_PATA_SCH is not set
-# CONFIG_PATA_SERVERWORKS is not set
-# CONFIG_PATA_SIL680 is not set
-# CONFIG_PATA_SIS is not set
-# CONFIG_PATA_TOSHIBA is not set
-# CONFIG_PATA_TRIFLEX is not set
-# CONFIG_PATA_VIA is not set
-# CONFIG_PATA_WINBOND is not set
-# CONFIG_PATA_WINBOND_VLB is not set
-# CONFIG_PC300TOO is not set
-# CONFIG_PCCARD is not set
-# CONFIG_PCF8575 is not set
-# CONFIG_PCI is not set
-# CONFIG_PCI200SYN is not set
-# CONFIG_PCI_ATMEL is not set
-# CONFIG_PCI_DEBUG is not set
-# CONFIG_PCI_DISABLE_COMMON_QUIRKS is not set
-# CONFIG_PCIEAER_INJECT is not set
-# CONFIG_PCIEASPM is not set
-# CONFIG_PCIE_ECRC is not set
-# CONFIG_PCI_HERMES is not set
-# CONFIG_PCI_IOV is not set
-# CONFIG_PCI_LEGACY is not set
-# CONFIG_PCI_MSI is not set
-# CONFIG_PCIPCWATCHDOG is not set
-CONFIG_PCI_QUIRKS=y
-# CONFIG_PCI_STUB is not set
-CONFIG_PCI_SYSCALL=y
-# CONFIG_PCMCIA_AHA152X is not set
-# CONFIG_PCMCIA_ATMEL is not set
-# CONFIG_PCMCIA_DEBUG is not set
-# CONFIG_PCMCIA_FDOMAIN is not set
-# CONFIG_PCMCIA_HERMES is not set
-# CONFIG_PCMCIA_IOCTL is not set
-# CONFIG_PCMCIA is not set
-# CONFIG_PCMCIA_LOAD_CIS is not set
-# CONFIG_PCMCIA_NETWAVE is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
-# CONFIG_PCMCIA_QLOGIC is not set
-# CONFIG_PCMCIA_RAYCS is not set
-# CONFIG_PCMCIA_SPECTRUM is not set
-# CONFIG_PCMCIA_SYM53C500 is not set
-# CONFIG_PCMCIA_WAVELAN is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_PCNET32 is not set
-# CONFIG_PCSPKR_PLATFORM is not set
-# CONFIG_PD6729 is not set
-# CONFIG_PDC_ADMA is not set
-# CONFIG_PERF_COUNTERS is not set
-# CONFIG_PERF_EVENTS is not set
-# CONFIG_PHANTOM is not set
-# CONFIG_PHONE is not set
-# CONFIG_PHONET is not set
-# CONFIG_PHYLIB is not set
-# CONFIG_PHYS_ADDR_T_64BIT is not set
-# CONFIG_PID_NS is not set
-# CONFIG_PLAN9AUTH is not set
-CONFIG_PLIST=y
-# CONFIG_PLX_HERMES is not set
-# CONFIG_PMIC_ADP5520 is not set
-# CONFIG_PMIC_DA903X is not set
-# CONFIG_PM is not set
-# CONFIG_POHMELFS is not set
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_POWER_SUPPLY is not set
-# CONFIG_PPC_16K_PAGES is not set
-# CONFIG_PPC_256K_PAGES is not set
-CONFIG_PPC_4K_PAGES=y
-CONFIG_PPC4xx_GPIO=y
-# CONFIG_PPC_64K_PAGES is not set
-# CONFIG_PPC_DISABLE_WERROR is not set
-# CONFIG_PPC_EMULATED_STATS is not set
-# CONFIG_PPP_ASYNC is not set
-# CONFIG_PPP_BSDCOMP is not set
-# CONFIG_PPP_DEFLATE is not set
-CONFIG_PPP_FILTER=y
-# CONFIG_PPP is not set
-# CONFIG_PPP_MPPE is not set
-CONFIG_PPP_MULTILINK=y
-# CONFIG_PPPOATM is not set
-# CONFIG_PPPOE is not set
-# CONFIG_PPPOL2TP is not set
-# CONFIG_PPP_SYNC_TTY is not set
-# CONFIG_PPS is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_RCU is not set
-# CONFIG_PREEMPT_RCU_TRACE is not set
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_TI_DAC7512 is not set
-CONFIG_TINY_RCU=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_PRINTK=y
-# CONFIG_PRISM2_USB is not set
-# CONFIG_PRISM54 is not set
-# CONFIG_PROBE_INITRD_HEADER is not set
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-# CONFIG_PROC_PAGE_MONITOR is not set
-CONFIG_PROC_SYSCTL=y
-# CONFIG_PROFILING is not set
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_QEMU is not set
-# CONFIG_QLA3XXX is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_QSEMI_PHY is not set
-# CONFIG_QT2160 is not set
-# CONFIG_QUOTA is not set
-# CONFIG_R3964 is not set
-# CONFIG_R6040 is not set
-# CONFIG_R8169 is not set
-# CONFIG_RADIO_ADAPTERS is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_GEMTEK_PCI is not set
-# CONFIG_RADIO_MAESTRO is not set
-# CONFIG_RADIO_MAXIRADIO is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_ZOLTRIX is not set
-# CONFIG_RAID_ATTRS is not set
-CONFIG_RAMFS=y
-# CONFIG_RAR_REGISTER is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-CONFIG_RCU_FANOUT=32
-# CONFIG_RCU_FANOUT_EXACT is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_RCU_TRACE is not set
-# CONFIG_RD_BZIP2 is not set
-# CONFIG_RDC_17F3101X is not set
-# CONFIG_RD_GZIP is not set
-CONFIG_RD_LZMA=y
-# CONFIG_RD_LZO is not set
-# CONFIG_RDS is not set
-# CONFIG_REALTEK_PHY is not set
-# CONFIG_REDWOOD is not set
-# CONFIG_REGULATOR_BQ24022 is not set
-# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
-# CONFIG_REGULATOR is not set
-# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_REISERFS_FS_XATTR is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-# CONFIG_RELAY is not set
-# CONFIG_RESOURCES_64BIT is not set
-# CONFIG_RFD_FTL is not set
-# CONFIG_RFKILL_INPUT is not set
-# CONFIG_RFKILL is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_ROSE is not set
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_RT2860 is not set
-# CONFIG_RT2870 is not set
-# CONFIG_RT2X00 is not set
-# CONFIG_RT3070 is not set
-# CONFIG_RT3090 is not set
-# CONFIG_RTC_CLASS is not set
-# CONFIG_RTC_DEBUG is not set
-# CONFIG_RTC_DRV_BQ32K is not set
-# CONFIG_RTC_DRV_BQ4802 is not set
-CONFIG_RTC_DRV_CMOS=y
-# CONFIG_RTC_DRV_DS1286 is not set
-# CONFIG_RTC_DRV_DS1305 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1374 is not set
-# CONFIG_RTC_DRV_DS1390 is not set
-# CONFIG_RTC_DRV_DS1511 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_DS3234 is not set
-# CONFIG_RTC_DRV_FM3130 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_M41T80 is not set
-# CONFIG_RTC_DRV_M41T94 is not set
-# CONFIG_RTC_DRV_M48T35 is not set
-# CONFIG_RTC_DRV_M48T59 is not set
-# CONFIG_RTC_DRV_M48T86 is not set
-# CONFIG_RTC_DRV_MAX6900 is not set
-# CONFIG_RTC_DRV_MAX6902 is not set
-# CONFIG_RTC_DRV_MSM6242 is not set
-# CONFIG_RTC_DRV_PCF2123 is not set
-# CONFIG_RTC_DRV_PCF50606 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_R9701 is not set
-# CONFIG_RTC_DRV_RP5C01 is not set
-# CONFIG_RTC_DRV_RS5C348 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-# CONFIG_RTC_DRV_RTC7301 is not set
-# CONFIG_RTC_DRV_RX8025 is not set
-# CONFIG_RTC_DRV_RX8581 is not set
-# CONFIG_RTC_DRV_S35390A is not set
-# CONFIG_RTC_DRV_STK17TA8 is not set
-# CONFIG_RTC_DRV_TEST is not set
-# CONFIG_RTC_DRV_V3020 is not set
-# CONFIG_RTC_DRV_X1205 is not set
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-CONFIG_RTC_HCTOSYS=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-CONFIG_RTC_INTF_DEV=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_LIB=y
-# CONFIG_RTL8180 is not set
-# CONFIG_RTL8187 is not set
-# CONFIG_RTL8187SE is not set
-# CONFIG_RTL8192E is not set
-# CONFIG_RTL8192U is not set
-# CONFIG_RTL8192SU is not set
-# CONFIG_RTL8306_PHY is not set
-# CONFIG_RTL8366_SMI is not set
-# CONFIG_RTL8366S_PHY_DEBUG_FS is not set
-# CONFIG_RTL8366S_PHY is not set
-# CONFIG_RTL8366RB_PHY is not set
-CONFIG_RT_MUTEXES=y
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_RUNTIME_DEBUG is not set
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-# CONFIG_S2IO is not set
-# CONFIG_SAMPLES is not set
-# CONFIG_SATA_AHCI is not set
-# CONFIG_SATA_INIC162X is not set
-# CONFIG_SATA_MV is not set
-# CONFIG_SATA_NV is not set
-# CONFIG_SATA_PMP is not set
-# CONFIG_SATA_PROMISE is not set
-# CONFIG_SATA_QSTOR is not set
-# CONFIG_SATA_SIL24 is not set
-# CONFIG_SATA_SIL is not set
-# CONFIG_SATA_SIS is not set
-# CONFIG_SATA_SVW is not set
-# CONFIG_SATA_SX4 is not set
-# CONFIG_SATA_ULI is not set
-# CONFIG_SATA_VIA is not set
-# CONFIG_SATA_VITESSE is not set
-# CONFIG_SBC_FITPC2_WATCHDOG is not set
-# CONFIG_SC92031 is not set
-# CONFIG_SCC is not set
-# CONFIG_SCHED_BFS is not set
-CONFIG_SCHED_CFS=y
-# CONFIG_SCHED_DEBUG is not set
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_SCHED_TRACER is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_3W_SAS is not set
-# CONFIG_SCSI_7000FASST is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC94XX is not set
-# CONFIG_SCSI_ARCMSR is not set
-# CONFIG_SCSI_BFA_FC is not set
-# CONFIG_SCSI_BNX2_ISCSI is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DEBUG is not set
-# CONFIG_SCSI_DH is not set
-CONFIG_SCSI_DMA=y
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DPT_I2O is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_ESP_CORE is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_HPSA is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
-CONFIG_SCSI_LOWLEVEL=y
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_MPT2SAS is not set
-CONFIG_SCSI_MULTI_LUN=y
-# CONFIG_SCSI_MVSAS is not set
-# CONFIG_SCSI_MVSAS_DEBUG is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_NETLINK is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_OSD_INITIATOR is not set
-# CONFIG_SCSI_PAS16 is not set
-# CONFIG_SCSI_PM8001 is not set
-# CONFIG_SCSI_PMCRAID is not set
-CONFIG_SCSI_PROC_FS=y
-# CONFIG_SCSI_PSI240I is not set
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_QLA_ISCSI is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-# CONFIG_SCSI_SEAGATE is not set
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_SRP_ATTRS is not set
-# CONFIG_SCSI_SRP is not set
-# CONFIG_SCSI_STEX is not set
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-CONFIG_SCSI_WAIT_SCAN=m
-# CONFIG_SECCOMP is not set
-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-# CONFIG_SECURITYFS is not set
-# CONFIG_SECURITY is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-# CONFIG_SENSORS_ABITUGURU3 is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_AD7414 is not set
-# CONFIG_SENSORS_AD7418 is not set
-# CONFIG_SENSORS_ADCXX is not set
-# CONFIG_SENSORS_ADM1021 is not set
-# CONFIG_SENSORS_ADM1025 is not set
-# CONFIG_SENSORS_ADM1026 is not set
-# CONFIG_SENSORS_ADM1029 is not set
-# CONFIG_SENSORS_ADM1031 is not set
-# CONFIG_SENSORS_ADM9240 is not set
-# CONFIG_SENSORS_ADS7828 is not set
-# CONFIG_SENSORS_ADT7462 is not set
-# CONFIG_SENSORS_ADT7470 is not set
-# CONFIG_SENSORS_ADT7473 is not set
-# CONFIG_SENSORS_ADT7475 is not set
-# CONFIG_SENSORS_AMC6821 is not set
-# CONFIG_SENSORS_APPLESMC is not set
-# CONFIG_SENSORS_ASB100 is not set
-# CONFIG_SENSORS_ATK0110 is not set
-# CONFIG_SENSORS_ATXP1 is not set
-# CONFIG_SENSORS_CORETEMP is not set
-# CONFIG_SENSORS_DME1737 is not set
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_DS1621 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_F71882FG is not set
-# CONFIG_SENSORS_F75375S is not set
-# CONFIG_SENSORS_FSCHER is not set
-# CONFIG_SENSORS_FSCHMD is not set
-# CONFIG_SENSORS_FSCPOS is not set
-# CONFIG_SENSORS_G760A is not set
-# CONFIG_SENSORS_GL518SM is not set
-# CONFIG_SENSORS_GL520SM is not set
-# CONFIG_SENSORS_HDAPS is not set
-# CONFIG_SENSORS_I5K_AMB is not set
-# CONFIG_SENSORS_IT87 is not set
-# CONFIG_SENSORS_K8TEMP is not set
-# CONFIG_SENSORS_LIS3LV02D is not set
-# CONFIG_SENSORS_LIS3_I2C is not set
-# CONFIG_SENSORS_LIS3_SPI is not set
-# CONFIG_SENSORS_LM63 is not set
-# CONFIG_SENSORS_LM70 is not set
-# CONFIG_SENSORS_LM73 is not set
-# CONFIG_SENSORS_LM75 is not set
-# CONFIG_SENSORS_LM77 is not set
-# CONFIG_SENSORS_LM78 is not set
-# CONFIG_SENSORS_LM80 is not set
-# CONFIG_SENSORS_LM83 is not set
-# CONFIG_SENSORS_LM85 is not set
-# CONFIG_SENSORS_LM87 is not set
-# CONFIG_SENSORS_LM90 is not set
-# CONFIG_SENSORS_LM92 is not set
-# CONFIG_SENSORS_LM93 is not set
-# CONFIG_SENSORS_LM95241 is not set
-# CONFIG_SENSORS_LTC4215 is not set
-# CONFIG_SENSORS_LTC4245 is not set
-# CONFIG_SENSORS_M41T00 is not set
-# CONFIG_SENSORS_MAX1111 is not set
-# CONFIG_SENSORS_MAX1619 is not set
-# CONFIG_SENSORS_MAX6650 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_SENSORS_PC87360 is not set
-# CONFIG_SENSORS_PC87427 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_SHT15 is not set
-# CONFIG_SENSORS_SIS5595 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_SMSC47M192 is not set
-# CONFIG_SENSORS_SMSC47M1 is not set
-# CONFIG_SENSORS_THMC50 is not set
-# CONFIG_SENSORS_TMP401 is not set
-# CONFIG_SENSORS_TMP421 is not set
-# CONFIG_SENSORS_TSL2550 is not set
-# CONFIG_SENSORS_VIA686A is not set
-# CONFIG_SENSORS_VT1211 is not set
-# CONFIG_SENSORS_VT8231 is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83781D is not set
-# CONFIG_SENSORS_W83791D is not set
-# CONFIG_SENSORS_W83792D is not set
-# CONFIG_SENSORS_W83793 is not set
-# CONFIG_SENSORS_W83L785TS is not set
-# CONFIG_SENSORS_W83L786NG is not set
-CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_SERIAL_8250_CS is not set
-CONFIG_SERIAL_8250_NR_UARTS=2
-# CONFIG_SERIAL_8250_PCI is not set
-CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-# CONFIG_SERIAL_JSM is not set
-# CONFIG_SERIAL_MAX3100 is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set
-# CONFIG_SERIAL_UARTLITE is not set
-# CONFIG_SERIO is not set
-# CONFIG_SFI is not set
-# CONFIG_SGI_IOC4 is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_SHAPER is not set
-CONFIG_SHMEM=y
-CONFIG_SIGNALFD=y
-# CONFIG_SIMPLE_GPIO is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SIS900 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2_DEBUG is not set
-# CONFIG_SKY2 is not set
-CONFIG_SLABINFO=y
-CONFIG_SLAB=y
-# CONFIG_SLHC is not set
-# CONFIG_SLICOSS is not set
-# CONFIG_SLIP is not set
-# CONFIG_SLOB is not set
-# CONFIG_SLOW_WORK_DEBUG is not set
-# CONFIG_SLOW_WORK is not set
-# CONFIG_SLUB_DEBUG is not set
-# CONFIG_SLUB is not set
-# CONFIG_SMARTJOYPLUS_FF is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_SMB_NLS_DEFAULT is not set
-# CONFIG_SMC911X is not set
-# CONFIG_SMC91X is not set
-# CONFIG_SMP is not set
-# CONFIG_SMSC911X is not set
-# CONFIG_SMSC9420 is not set
-# CONFIG_SMSC_PHY is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ADLIB is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALS4000 is not set
-# CONFIG_SND_ARM is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AW2 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_CS5530 is not set
-# CONFIG_SND_CS5535AUDIO is not set
-# CONFIG_SND_CTXFI is not set
-# CONFIG_SND_DARLA20 is not set
-# CONFIG_SND_DARLA24 is not set
-# CONFIG_SND_DEBUG is not set
-CONFIG_SND_DRIVERS=y
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_DYNAMIC_MINORS is not set
-# CONFIG_SND_ECHO3G is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_GINA20 is not set
-# CONFIG_SND_GINA24 is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_HIFIER is not set
-# CONFIG_SND_HRTIMER is not set
-# CONFIG_SND_HWDEP is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-# CONFIG_SND_INDIGODJ is not set
-# CONFIG_SND_INDIGODJX is not set
-# CONFIG_SND_INDIGOIO is not set
-# CONFIG_SND_INDIGOIOX is not set
-# CONFIG_SND_INDIGO is not set
-# CONFIG_SND_INTEL8X0 is not set
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_ISA is not set
-# CONFIG_SND is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_LAYLA20 is not set
-# CONFIG_SND_LAYLA24 is not set
-# CONFIG_SND_LX6464ES is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIA is not set
-# CONFIG_SND_MIPS is not set
-# CONFIG_SND_MIRO is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_MIXER_OSS is not set
-# CONFIG_SND_MONA is not set
-# CONFIG_SND_MPU401 is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-CONFIG_SND_OSSEMUL=y
-# CONFIG_SND_OXYGEN is not set
-CONFIG_SND_PCI=y
-# CONFIG_SND_PCMCIA is not set
-# CONFIG_SND_PCM is not set
-# CONFIG_SND_PCM_OSS is not set
-CONFIG_SND_PCM_OSS_PLUGINS=y
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_PDAUDIOCF is not set
-# CONFIG_SND_RAWMIDI is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RTCTIMER is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SEQUENCER is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_SIS7019 is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SOC is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_SPI is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_SND_SUPPORT_OLD_API is not set
-# CONFIG_SND_TIMER is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_CAIAQ is not set
-# CONFIG_SND_USB_US122L is not set
-# CONFIG_SND_USB_USX2Y is not set
-CONFIG_SND_USB=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VIRTUOSO is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_WAVEFRONT is not set
-# CONFIG_SND_YMFPCI is not set
-# CONFIG_SNI_RM is not set
-# CONFIG_SOC_CAMERA is not set
-# CONFIG_SOFT_WATCHDOG is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_SONYPI is not set
-# CONFIG_SONY_LAPTOP is not set
-# CONFIG_SOUND is not set
-# CONFIG_SOUND_PRIME is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_STATIC is not set
-# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-# CONFIG_SPI_AT25 is not set
-# CONFIG_SPI_DEBUG is not set
-# CONFIG_SPI_DESIGNWARE is not set
-# CONFIG_SPI_GPIO_OLD is not set
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-# CONFIG_SPI_ORION is not set
-# CONFIG_SPI_TLE62X0 is not set
-# CONFIG_SPI_XILINX is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-CONFIG_SQUASHFS_LZMA=y
-CONFIG_SQUASHFS_SUPPORT_ZLIB=y
-# CONFIG_SQUASHFS_VMALLOC is not set
-CONFIG_SQUASHFS=y
-# CONFIG_SSB_BLOCKIO is not set
-# CONFIG_SSB_DEBUG is not set
-# CONFIG_SSB is not set
-# CONFIG_SSB_PCMCIAHOST is not set
-CONFIG_SSB_POSSIBLE=y
-# CONFIG_SSB_SDIOHOST is not set
-# CONFIG_SSB_SILENT is not set
-# CONFIG_SSFDC is not set
-# CONFIG_STACK_TRACER is not set
-CONFIG_STACKTRACE_SUPPORT=y
-# CONFIG_STAGING_EXCLUDE_BUILD is not set
-CONFIG_STAGING=y
-CONFIG_STANDALONE=y
-CONFIG_STDBINUTILS=y
-# CONFIG_STE10XP is not set
-CONFIG_STP=y
-CONFIG_STRIP_ASM_SYMS=y
-# CONFIG_STRIP is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_SUNRPC_BIND34 is not set
-# CONFIG_SUNRPC_GSS is not set
-# CONFIG_SUNRPC is not set
-# CONFIG_SUNRPC_REGISTER_V4 is not set
-CONFIG_SUSPEND_UP_POSSIBLE=y
-CONFIG_SWAP=y
-# CONFIG_SWCONFIG is not set
-# CONFIG_SYNCLINK_CS is not set
-CONFIG_SYN_COOKIES=y
-CONFIG_SYSCTL_SYSCALL_CHECK=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_SYSCTL=y
-# CONFIG_SYSFS_DEPRECATED is not set
-# CONFIG_SYSFS_DEPRECATED_V2 is not set
-CONFIG_SYSFS=y
-# CONFIG_SYS_HYPERVISOR is not set
-# CONFIG_SYSV68_PARTITION is not set
-# CONFIG_SYSV_FS is not set
-CONFIG_SYSVIPC_SYSCTL=y
-CONFIG_SYSVIPC=y
-# CONFIG_TASKSTATS is not set
-# CONFIG_TCG_TPM is not set
-# CONFIG_TCIC is not set
-CONFIG_TCP_CONG_ADVANCED=y
-# CONFIG_TCP_CONG_BIC is not set
-# CONFIG_TCP_CONG_CUBIC is not set
-# CONFIG_TCP_CONG_HSTCP is not set
-# CONFIG_TCP_CONG_HTCP is not set
-# CONFIG_TCP_CONG_HYBLA is not set
-# CONFIG_TCP_CONG_ILLINOIS is not set
-# CONFIG_TCP_CONG_LP is not set
-# CONFIG_TCP_CONG_SCALABLE is not set
-# CONFIG_TCP_CONG_VEGAS is not set
-# CONFIG_TCP_CONG_VENO is not set
-CONFIG_TCP_CONG_WESTWOOD=y
-# CONFIG_TCP_CONG_YEAH is not set
-# CONFIG_TCP_MD5SIG is not set
-# CONFIG_TEXTSEARCH_BM is not set
-# CONFIG_TEXTSEARCH_FSM is not set
-# CONFIG_TEXTSEARCH_KMP is not set
-CONFIG_TEXTSEARCH=y
-# CONFIG_THERMAL_HWMON is not set
-# CONFIG_THERMAL is not set
-# CONFIG_THRUSTMASTER_FF is not set
-CONFIG_TICK_ONESHOT=y
-# CONFIG_TIFM_CORE is not set
-# CONFIG_TIGON3 is not set
-CONFIG_TIMERFD=y
-# CONFIG_TINY_SHMEM is not set
-# CONFIG_TIPC is not set
-# CONFIG_TLAN is not set
-# CONFIG_TMD_HERMES is not set
-# CONFIG_TMPFS_POSIX_ACL is not set
-CONFIG_TMPFS=y
-# CONFIG_TOUCHSCREEN_AD7877 is not set
-# CONFIG_TOUCHSCREEN_AD7879_I2C is not set
-# CONFIG_TOUCHSCREEN_AD7879 is not set
-# CONFIG_TOUCHSCREEN_AD7879_SPI is not set
-# CONFIG_TOUCHSCREEN_ADS7846 is not set
-# CONFIG_TOUCHSCREEN_EETI is not set
-# CONFIG_TOUCHSCREEN_ELO is not set
-# CONFIG_TOUCHSCREEN_FILTER is not set
-# 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_PENMOUNT is not set
-# CONFIG_TOUCHSCREEN_S3C2410 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_W90X900 is not set
-# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
-# CONFIG_TPS65010 is not set
-# CONFIG_TRACE_BRANCH_PROFILING is not set
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-CONFIG_TRACING_SUPPORT=y
-# CONFIG_TRANZPORT is not set
-# CONFIG_TREE_RCU is not set
-# CONFIG_TREE_RCU_TRACE is not set
-# CONFIG_TR is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_TUNER_TEA5761 is not set
-# CONFIG_TUN is not set
-# CONFIG_TWL4030_CORE is not set
-# CONFIG_UACCESS_WITH_MEMCPY is not set
-# CONFIG_UCB1400_CORE is not set
-# CONFIG_UDF_FS is not set
-CONFIG_UDF_NLS=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-# CONFIG_UFS_FS is not set
-# CONFIG_UIO is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_UNEVICTABLE_LRU is not set
-# CONFIG_UNION_MOUNT is not set
-CONFIG_UNIX98_PTYS=y
-# CONFIG_UNIXWARE_DISKLABEL is not set
-CONFIG_UNIX=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_ADUTUX is not set
-# CONFIG_USB_AIPTEK is not set
-CONFIG_USB_ALI_M5632=y
-CONFIG_USB_AN2720=y
-# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_APPLETOUCH is not set
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARMLINUX=y
-# CONFIG_USB_ATI_REMOTE2 is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_ATMEL is not set
-# CONFIG_USB_ATM is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_BANDWIDTH is not set
-CONFIG_USB_BELKIN=y
-# CONFIG_USB_BERRY_CHARGE is not set
-# CONFIG_USB_C67X00_HCD is not set
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_CPC is not set
-# CONFIG_USB_CXACRU is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_DABUSB is not set
-# CONFIG_USB_DEBUG is not set
-# CONFIG_USB_DEVICE_CLASS is not set
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_DSBR is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_EHCI_HCD_PPC_OF is not set
-CONFIG_USB_EHCI_ROOT_HUB_TT=y
-# CONFIG_USB_EHCI_SPLIT_ISO is not set
-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EPSON2888 is not set
-# CONFIG_USB_ET61X251 is not set
-CONFIG_USB_EZUSB=y
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_GADGET is not set
-# CONFIG_USB_GADGET_DEBUG is not set
-# CONFIG_USB_GL860 is not set
-# CONFIG_USB_GPIO_VBUS is not set
-# CONFIG_USB_GSPCA_CONEX is not set
-# CONFIG_USB_GSPCA_ETOMS is not set
-# CONFIG_USB_GSPCA_FINEPIX is not set
-# CONFIG_USB_GSPCA is not set
-# CONFIG_USB_GSPCA_JEILINJ is not set
-# CONFIG_USB_GSPCA_MARS is not set
-# CONFIG_USB_GSPCA_MR97310A is not set
-# CONFIG_USB_GSPCA_OV519 is not set
-# CONFIG_USB_GSPCA_OV534 is not set
-# CONFIG_USB_GSPCA_PAC207 is not set
-# CONFIG_USB_GSPCA_PAC7302 is not set
-# CONFIG_USB_GSPCA_PAC7311 is not set
-CONFIG_USB_GSPCA_SN9C20X_EVDEV=y
-# CONFIG_USB_GSPCA_SN9C20X is not set
-# CONFIG_USB_GSPCA_SONIXB is not set
-# CONFIG_USB_GSPCA_SONIXJ is not set
-# CONFIG_USB_GSPCA_SPCA500 is not set
-# CONFIG_USB_GSPCA_SPCA501 is not set
-# CONFIG_USB_GSPCA_SPCA505 is not set
-# CONFIG_USB_GSPCA_SPCA506 is not set
-# CONFIG_USB_GSPCA_SPCA508 is not set
-# CONFIG_USB_GSPCA_SPCA561 is not set
-# CONFIG_USB_GSPCA_SQ905C is not set
-# CONFIG_USB_GSPCA_SQ905 is not set
-# CONFIG_USB_GSPCA_STK014 is not set
-# CONFIG_USB_GSPCA_STV0680 is not set
-# CONFIG_USB_GSPCA_SUNPLUS is not set
-# CONFIG_USB_GSPCA_T613 is not set
-# CONFIG_USB_GSPCA_TV8532 is not set
-# CONFIG_USB_GSPCA_VC032X is not set
-# CONFIG_USB_GSPCA_ZC3XX is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HID is not set
-# CONFIG_USB_HSO is not set
-# CONFIG_USB_HWA_HCD is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_IOWARRIOR is not set
-# CONFIG_USB_IP_COMMON is not set
-# CONFIG_USB_ISIGHTFW is not set
-# CONFIG_USB is not set
-# CONFIG_USB_ISP116X_HCD is not set
-# CONFIG_USB_ISP1362_HCD is not set
-# CONFIG_USB_ISP1760_HCD is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_KC2190 is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LIBUSUAL is not set
-# CONFIG_USB_M5602 is not set
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-# CONFIG_USB_MON is not set
-# CONFIG_USB_MOUSE is not set
-# CONFIG_USB_MUSB_HDRC is not set
-# CONFIG_USB_NET_AX8817X is not set
-# CONFIG_USB_NET_CDC_EEM is not set
-# CONFIG_USB_NET_CDCETHER is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_DM9601 is not set
-# CONFIG_USB_NET_GL620A is not set
-# CONFIG_USB_NET_INT51X1 is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_NET1080 is not set
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_RNDIS_WLAN is not set
-# CONFIG_USB_NET_SMSC95XX is not set
-# CONFIG_USB_NET_ZAURUS is not set
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-# CONFIG_USB_OHCI_HCD is not set
-# CONFIG_USB_OHCI_HCD_PCI is not set
-# CONFIG_USB_OHCI_HCD_PPC_OF is not set
-# CONFIG_USB_OHCI_HCD_PPC_SOC is not set
-# CONFIG_USB_OHCI_HCD_SSB is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-# CONFIG_USB_OTG_BLACKLIST_HUB is not set
-# CONFIG_USB_OTG is not set
-# CONFIG_USB_OTG_WHITELIST is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_OXU210HP_HCD is not set
-# CONFIG_USBPCWATCHDOG is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_PHIDGET is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_PRINTER is not set
-# CONFIG_USB_PWC_INPUT_EVDEV is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_R8A66597_HCD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_S2255 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SERIAL_AIRCABLE is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-# CONFIG_USB_SERIAL_BELKIN is not set
-# CONFIG_USB_SERIAL_CH341 is not set
-# CONFIG_USB_SERIAL_CP2101 is not set
-# CONFIG_USB_SERIAL_CP210X is not set
-# CONFIG_USB_SERIAL_CYBERJACK is not set
-# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
-# CONFIG_USB_SERIAL_DEBUG is not set
-# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
-# CONFIG_USB_SERIAL_EMPEG is not set
-# CONFIG_USB_SERIAL_FTDI_SIO is not set
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-# CONFIG_USB_SERIAL_GARMIN is not set
-CONFIG_USB_SERIAL_GENERIC=y
-# CONFIG_USB_SERIAL_HP4X is not set
-# CONFIG_USB_SERIAL_IPAQ is not set
-# CONFIG_USB_SERIAL_IPW is not set
-# CONFIG_USB_SERIAL_IR is not set
-# CONFIG_USB_SERIAL is not set
-# CONFIG_USB_SERIAL_IUU is not set
-# CONFIG_USB_SERIAL_KEYSPAN is not set
-CONFIG_USB_SERIAL_KEYSPAN_MPR=y
-# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
-CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
-# CONFIG_USB_SERIAL_KLSI is not set
-# CONFIG_USB_SERIAL_KOBIL_SCT is not set
-# CONFIG_USB_SERIAL_MCT_U232 is not set
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 is not set
-# CONFIG_USB_SERIAL_MOTOROLA is not set
-# CONFIG_USB_SERIAL_NAVMAN is not set
-# CONFIG_USB_SERIAL_OMNINET is not set
-# CONFIG_USB_SERIAL_OPTICON is not set
-# CONFIG_USB_SERIAL_OPTION is not set
-# CONFIG_USB_SERIAL_OTI6858 is not set
-# CONFIG_USB_SERIAL_PL2303 is not set
-# CONFIG_USB_SERIAL_QUALCOMM is not set
-# CONFIG_USB_SERIAL_QUATECH2 is not set
-# CONFIG_USB_SERIAL_QUATECH_USB2 is not set
-# CONFIG_USB_SERIAL_SAFE is not set
-CONFIG_USB_SERIAL_SAFE_PADDED=y
-# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-# CONFIG_USB_SERIAL_SPCP8X5 is not set
-# CONFIG_USB_SERIAL_SYMBOL is not set
-# CONFIG_USB_SERIAL_TI is not set
-# CONFIG_USB_SERIAL_VISOR is not set
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-# CONFIG_USB_SERIAL_XIRCOM is not set
-# CONFIG_USB_SEVSEG is not set
-# CONFIG_USB_SISUSBVGA is not set
-# CONFIG_USB_SL811_HCD is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_SPEEDTOUCH is not set
-# CONFIG_USB_STKWEBCAM is not set
-CONFIG_USB_STORAGE_ALAUDA=y
-# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
-CONFIG_USB_STORAGE_DATAFAB=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-CONFIG_USB_STORAGE_DPCM=y
-CONFIG_USB_STORAGE_FREECOM=y
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE is not set
-CONFIG_USB_STORAGE_JUMPSHOT=y
-CONFIG_USB_STORAGE_KARMA=y
-# CONFIG_USB_STORAGE_ONETOUCH is not set
-CONFIG_USB_STORAGE_SDDR09=y
-CONFIG_USB_STORAGE_SDDR55=y
-# CONFIG_USB_STORAGE_SIERRA is not set
-CONFIG_USB_STORAGE_USBAT=y
-# CONFIG_USB_STV06XX is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_SUPPORT is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_TEST is not set
-# CONFIG_USB_TMC is not set
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_UEAGLEATM is not set
-# CONFIG_USB_ULPI is not set
-# CONFIG_USB_USBNET is not set
-# CONFIG_USB_USBNET_MII is not set
-# CONFIG_USB_VICAM is not set
-CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
-# CONFIG_USB_VIDEO_CLASS is not set
-# CONFIG_USB_VST is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_WDM is not set
-# CONFIG_USB_WHCI_HCD is not set
-# CONFIG_USB_WUSB_CBAF is not set
-# CONFIG_USB_WUSB is not set
-# CONFIG_USB_XHCI_HCD is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_XUSBATM is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_ZD1201 is not set
-# CONFIG_USB_ZR364XX is not set
-# CONFIG_USE_GENERIC_SMP_HELPERS is not set
-# CONFIG_UTS_NS is not set
-# CONFIG_UWB is not set
-# CONFIG_VETH is not set
-# CONFIG_VFAT_FS is not set
-# CONFIG_VGA_ARB is not set
-# CONFIG_VGASTATE is not set
-# CONFIG_VIA_RHINE is not set
-# CONFIG_VIA_VELOCITY is not set
-# CONFIG_VIDEO_ADV7170 is not set
-# CONFIG_VIDEO_ADV7175 is not set
-# CONFIG_VIDEO_ADV7180 is not set
-# CONFIG_VIDEO_ADV7343 is not set
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# CONFIG_VIDEO_ALLOW_V4L1 is not set
-# CONFIG_VIDEO_BT819 is not set
-# CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_BT856 is not set
-# CONFIG_VIDEO_BT866 is not set
-# CONFIG_VIDEO_CAFE_CCIC is not set
-# CONFIG_VIDEO_CAPTURE_DRIVERS is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CS5345 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_CX231XX is not set
-# CONFIG_VIDEO_CX2341X is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_CX88 is not set
-# CONFIG_VIDEO_DEV is not set
-# CONFIG_VIDEO_DPC is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
-# CONFIG_VIDEO_GO7007 is not set
-# CONFIG_VIDEO_HDPVR is not set
-# CONFIG_VIDEO_HELPER_CHIPS_AUTO is not set
-# CONFIG_VIDEO_HEXIUM_GEMINI is not set
-# CONFIG_VIDEO_HEXIUM_ORION is not set
-# CONFIG_VIDEO_IR_I2C is not set
-# CONFIG_VIDEO_IVTV is not set
-# CONFIG_VIDEO_KS0127 is not set
-# CONFIG_VIDEO_M52790 is not set
-# CONFIG_VIDEO_MEDIA is not set
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_MT9V011 is not set
-# CONFIG_VIDEO_MXB is not set
-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-# CONFIG_VIDEO_OV7670 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_VIDEO_PMS is not set
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_VIDEO_SAA6588 is not set
-# CONFIG_VIDEO_SAA7110 is not set
-# CONFIG_VIDEO_SAA7111 is not set
-# CONFIG_VIDEO_SAA7114 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_SAA7134 is not set
-# CONFIG_VIDEO_SAA717X is not set
-# CONFIG_VIDEO_SAA7185 is not set
-# CONFIG_VIDEO_SAA7191 is not set
-# CONFIG_VIDEO_SH_MOBILE_CEU is not set
-# CONFIG_VIDEO_STRADIS is not set
-# CONFIG_VIDEO_TCM825X is not set
-# CONFIG_VIDEO_TDA7432 is not set
-# CONFIG_VIDEO_TDA9840 is not set
-# CONFIG_VIDEO_TDA9875 is not set
-# CONFIG_VIDEO_TEA6415C is not set
-# CONFIG_VIDEO_TEA6420 is not set
-# CONFIG_VIDEO_THS7303 is not set
-# CONFIG_VIDEO_TLV320AIC23B is not set
-# CONFIG_VIDEO_TVAUDIO is not set
-# CONFIG_VIDEO_TVP514X is not set
-# CONFIG_VIDEO_TVP5150 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-# CONFIG_VIDEO_USBVISION is not set
-CONFIG_VIDEO_V4L1_COMPAT=y
-# CONFIG_VIDEO_V4L1 is not set
-# CONFIG_VIDEO_V4L2_COMMON is not set
-# CONFIG_VIDEO_V4L2 is not set
-# CONFIG_VIDEO_VIVI is not set
-# CONFIG_VIDEO_VP27SMPX is not set
-# CONFIG_VIDEO_VPX3220 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIRQ_DEBUG is not set
-CONFIG_VIRT_TO_BUS=y
-# CONFIG_VIRTUALIZATION is not set
-# CONFIG_VITESSE_PHY is not set
-# CONFIG_VLAN_8021Q_GVRP is not set
-CONFIG_VLAN_8021Q=y
-# CONFIG_VME_BUS is not set
-# CONFIG_VM_EVENT_COUNTERS is not set
-# CONFIG_VMSPLIT_1G is not set
-# CONFIG_VMSPLIT_2G is not set
-# CONFIG_VMSPLIT_2G_OPT is not set
-# CONFIG_VMSPLIT_3G_OPT is not set
-CONFIG_VMSPLIT_3G=y
-# CONFIG_VMXNET3 is not set
-# CONFIG_VT6655 is not set
-# CONFIG_VT6656 is not set
-# CONFIG_VT is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_W1_CON is not set
-# CONFIG_W1 is not set
-# CONFIG_W1_MASTER_DS1WM is not set
-# CONFIG_W1_MASTER_DS2482 is not set
-# CONFIG_W1_MASTER_DS2490 is not set
-# CONFIG_W1_MASTER_GPIO is not set
-# CONFIG_W1_MASTER_MATROX is not set
-# CONFIG_W1_SLAVE_BQ27000 is not set
-# CONFIG_W1_SLAVE_DS2431 is not set
-# CONFIG_W1_SLAVE_DS2433 is not set
-# CONFIG_W1_SLAVE_DS2760 is not set
-# CONFIG_W1_SLAVE_SMEM is not set
-# CONFIG_W1_SLAVE_THERM is not set
-# CONFIG_W83627HF_WDT is not set
-# CONFIG_W83697HF_WDT is not set
-# CONFIG_W83877F_WDT is not set
-# CONFIG_W83977F_WDT is not set
-# CONFIG_WAN is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_WANXL is not set
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-CONFIG_WATCHDOG=y
-# CONFIG_WDTPCI is not set
-# CONFIG_WIMAX is not set
-CONFIG_WIRELESS_EXT_SYSFS=y
-CONFIG_WIRELESS_EXT=y
-CONFIG_WIRELESS_OLD_REGULATORY=y
-CONFIG_WIRELESS=y
-CONFIG_WLAN_80211=y
-# CONFIG_WLAN_PRE80211 is not set
-CONFIG_WLAN=y
-# CONFIG_WORKQUEUE_TRACER is not set
-# CONFIG_WR_PPMC is not set
-CONFIG_WEXT_CORE=y
-CONFIG_WEXT_PROC=y
-CONFIG_WEXT_PRIV=y
-CONFIG_WEXT_SPY=y
-# CONFIG_X25 is not set
-# CONFIG_XFRM_IPCOMP is not set
-# CONFIG_XFRM_MIGRATE is not set
-# CONFIG_XFRM_STATISTICS is not set
-# CONFIG_XFRM_SUB_POLICY is not set
-# CONFIG_XFRM_USER is not set
-CONFIG_XFRM=y
-# CONFIG_XFS_DEBUG is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_XFS_POSIX_ACL is not set
-# CONFIG_XFS_QUOTA is not set
-# CONFIG_XFS_RT is not set
-# CONFIG_XFS_SECURITY is not set
-# CONFIG_XILINX_EMACLITE is not set
-# CONFIG_XILINX_LL_TEMAC is not set
-# CONFIG_XIP_KERNEL is not set
-# CONFIG_YAFFS_FS is not set
-# CONFIG_YAM is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_YENTA is not set
-# CONFIG_YENTA_O2 is not set
-# CONFIG_YENTA_RICOH is not set
-# CONFIG_YENTA_TI is not set
-# CONFIG_YENTA_TOSHIBA is not set
-# CONFIG_ZD1211RW_DEBUG is not set
-# CONFIG_ZD1211RW is not set
-# CONFIG_ZEROPLUS_FF is not set
-# CONFIG_ZISOFS_FS is not set
-CONFIG_ZISOFS=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZONE_DMA_FLAG=1
-CONFIG_ZONE_DMA=y
-CONFIG_DEFAULT_SECURITY_DAC=y
-CONFIG_DEFAULT_SECURITY=""
+++ /dev/null
-# CONFIG_6PACK is not set
-# CONFIG_8139CP is not set
-# CONFIG_8139TOO is not set
-# CONFIG_9P_FS is not set
-# CONFIG_AB3100_CORE is not set
-# CONFIG_AB4500_CORE is not set
-# CONFIG_ACCESSIBILITY is not set
-# CONFIG_ACENIC is not set
-# CONFIG_ACPI_POWER_METER is not set
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_AD525X_DPOT is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_ADFS_FS is not set
-# CONFIG_ADM6996_PHY is not set
-# CONFIG_ADM8211 is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_AF_RXRPC is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_AGP is not set
-CONFIG_AIO=y
-# CONFIG_AIRO_CS is not set
-# CONFIG_AIRO is not set
-# CONFIG_ALIM7101_WDT is not set
-# CONFIG_ALTERA_PCIE_CHDMA is not set
-# CONFIG_R8187SE is not set
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ANDROID is not set
-CONFIG_ANON_INODES=y
-# CONFIG_APPLICOM is not set
-# CONFIG_AR8216_PHY is not set
-# CONFIG_AR9170_USB is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91 is not set
-# CONFIG_ARCH_BCMRING is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_DAVINCI is not set
-# CONFIG_ARCH_DOVE is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_EP93XX is not set
-CONFIG_ARCH_FLATMEM_ENABLE=y
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_GEMINI is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP13XX is not set
-# CONFIG_ARCH_IOP32X is not set
-# CONFIG_ARCH_IOP33X is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_IXP23XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_KIRKWOOD is not set
-# CONFIG_ARCH_KS8695 is not set
-# CONFIG_ARCH_L7200 is not set
-# CONFIG_ARCH_LH7A40X is not set
-# CONFIG_ARCH_LOKI is not set
-# CONFIG_ARCH_MMP is not set
-# CONFIG_ARCH_MSM is not set
-# CONFIG_ARCH_MV78XX0 is not set
-# CONFIG_ARCH_MXC is not set
-# CONFIG_ARCH_NETX is not set
-# CONFIG_ARCH_NOMADIK is not set
-# CONFIG_ARCH_NS9XXX is not set
-# CONFIG_ARCH_OMAP is not set
-# CONFIG_ARCH_ORION5X is not set
-# CONFIG_ARCH_PNX4008 is not set
-# CONFIG_ARCH_PXA is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_RPC is not set
-# CONFIG_ARCH_S3C2410 is not set
-# CONFIG_ARCH_S3C64XX is not set
-# CONFIG_ARCH_S5PC1XX is not set
-# CONFIG_ARCH_SA1100 is not set
-# CONFIG_ARCH_SHARK is not set
-# CONFIG_ARCH_STMP3XXX is not set
-# CONFIG_ARCH_U300 is not set
-# CONFIG_ARCH_U8500 is not set
-# CONFIG_ARCH_VERSATILE is not set
-# CONFIG_ARCH_W90X900 is not set
-# CONFIG_ARCNET is not set
-# CONFIG_ARM_UNWIND is not set
-CONFIG_ARPD=y
-# CONFIG_ARTHUR is not set
-CONFIG_ASK_IP_FIB_HASH=y
-# CONFIG_ASUS_OLED is not set
-# CONFIG_ASYNC_TX_DMA is not set
-# CONFIG_AT24 is not set
-# CONFIG_AT76C50X_USB is not set
-# CONFIG_ATA_ACPI is not set
-# CONFIG_ATA_GENERIC is not set
-# CONFIG_ATA is not set
-# CONFIG_ATALK is not set
-# CONFIG_ATA_NONSTANDARD is not set
-# CONFIG_ATA_OVER_ETH is not set
-# CONFIG_ATA_PIIX is not set
-# CONFIG_ATARI_PARTITION is not set
-CONFIG_ATA_SFF=y
-# CONFIG_ATA_VERBOSE_ERROR is not set
-# CONFIG_ATH5K is not set
-# CONFIG_ATH9K is not set
-# CONFIG_ATL1C is not set
-# CONFIG_ATL1E is not set
-# CONFIG_ATL1 is not set
-# CONFIG_ATL2 is not set
-# CONFIG_ATM_AMBASSADOR is not set
-CONFIG_ATM_BR2684_IPFILTER=y
-# CONFIG_ATM_BR2684 is not set
-# CONFIG_ATM_CLIP is not set
-CONFIG_ATM_CLIP_NO_ICMP=y
-# CONFIG_ATM_DRIVERS is not set
-# CONFIG_ATM_DUMMY is not set
-# CONFIG_ATMEL is not set
-# CONFIG_ATM_ENI is not set
-# CONFIG_ATM_FIRESTREAM is not set
-# CONFIG_ATM_FORE200E is not set
-# CONFIG_ATM_FORE200E_MAYBE is not set
-# CONFIG_ATM_HE is not set
-# CONFIG_ATM_HORIZON is not set
-# CONFIG_ATM_IA is not set
-# CONFIG_ATM_IDT77252 is not set
-# CONFIG_ATM is not set
-# CONFIG_ATM_LANAI is not set
-# CONFIG_ATM_LANE is not set
-# CONFIG_ATM_MPOA is not set
-# CONFIG_ATM_NICSTAR is not set
-# CONFIG_ATM_SOLOS is not set
-# CONFIG_ATM_TCP is not set
-# CONFIG_ATM_ZATM is not set
-# CONFIG_AUDIT is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUXDISPLAY is not set
-# CONFIG_AX25_DAMA_SLAVE is not set
-# CONFIG_AX25 is not set
-# CONFIG_AX88796 is not set
-# CONFIG_B3DFG is not set
-# CONFIG_B43 is not set
-# CONFIG_B43LEGACY is not set
-# CONFIG_B44 is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-# CONFIG_BACKTRACE_SELF_TEST is not set
-CONFIG_BASE_FULL=y
-CONFIG_BASE_SMALL=0
-# CONFIG_BASLER_EXCITE is not set
-# CONFIG_BATTERY_BQ27000_HDQ is not set
-# CONFIG_BATTERY_BQ27x00 is not set
-# CONFIG_BATTERY_DS2760 is not set
-# CONFIG_BATTERY_DS2782 is not set
-# CONFIG_BATTERY_MAX17040 is not set
-# CONFIG_BAYCOM_EPP is not set
-# CONFIG_BAYCOM_PAR is not set
-# CONFIG_BAYCOM_SER_FDX is not set
-# CONFIG_BAYCOM_SER_HDX is not set
-CONFIG_BCM43XX_DEBUG=y
-CONFIG_BCM43XX_DMA_AND_PIO_MODE=y
-# CONFIG_BCM43XX_DMA_MODE is not set
-CONFIG_BCM43XX_DMA=y
-# CONFIG_BCM43XX is not set
-# CONFIG_BCM43XX_PIO_MODE is not set
-CONFIG_BCM43XX_PIO=y
-# CONFIG_BE2ISCSI is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_BINARY_PRINTF is not set
-# CONFIG_BINFMT_AOUT is not set
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-# CONFIG_BLINK is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_BLK_DEV_4DRIVES is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI14XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_ATIIXP is not set
-# CONFIG_BLK_DEV_BSG is not set
-# CONFIG_BLK_DEV_CMD640 is not set
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_CS5535 is not set
-# CONFIG_BLK_DEV_CS5536 is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_DELKIN is not set
-# CONFIG_BLK_DEV_DTC2278 is not set
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_GENERIC is not set
-# CONFIG_BLK_DEV_HD_IDE is not set
-# CONFIG_BLK_DEV_HD is not set
-# CONFIG_BLK_DEV_HD_ONLY is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_HT6560B is not set
-# CONFIG_BLK_DEV_IDEACPI is not set
-# CONFIG_BLK_DEV_IDECD is not set
-# CONFIG_BLK_DEV_IDECS is not set
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDEPCI is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-# CONFIG_BLK_DEV_IDE_SATA is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_BLK_DEV_IDETAPE is not set
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_BLK_DEV_INTEGRITY is not set
-# CONFIG_BLK_DEV_IO_TRACE is not set
-# CONFIG_BLK_DEV_IT8172 is not set
-# CONFIG_BLK_DEV_IT8213 is not set
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_JMICRON is not set
-# CONFIG_BLK_DEV_LOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_OFFBOARD is not set
-# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PIIX is not set
-# CONFIG_BLK_DEV_PLATFORM is not set
-# CONFIG_BLK_DEV_QD65XX is not set
-# CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_RZ1000 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-# CONFIG_BLK_DEV_SD is not set
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SIS5513 is not set
-# CONFIG_BLK_DEV_SL82C105 is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_SR is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_TC86C001 is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_UB is not set
-# CONFIG_BLK_DEV_UMC8672 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_BLK_DEV_XIP is not set
-CONFIG_BLK_DEV=y
-CONFIG_BLOCK=y
-# CONFIG_BNX2 is not set
-# CONFIG_BONDING is not set
-# CONFIG_BOOT_PRINTK_DELAY is not set
-# CONFIG_BOOT_TRACER is not set
-# CONFIG_BPQETHER is not set
-# CONFIG_BRIDGE_EBT_802_3 is not set
-# CONFIG_BRIDGE_EBT_AMONG is not set
-# CONFIG_BRIDGE_EBT_ARP is not set
-# CONFIG_BRIDGE_EBT_ARPREPLY is not set
-# CONFIG_BRIDGE_EBT_BROUTE is not set
-# CONFIG_BRIDGE_EBT_DNAT is not set
-# CONFIG_BRIDGE_EBT_IP6 is not set
-# CONFIG_BRIDGE_EBT_IP is not set
-# CONFIG_BRIDGE_EBT_LIMIT is not set
-# CONFIG_BRIDGE_EBT_LOG is not set
-# CONFIG_BRIDGE_EBT_MARK is not set
-# CONFIG_BRIDGE_EBT_MARK_T is not set
-# CONFIG_BRIDGE_EBT_NFLOG is not set
-# CONFIG_BRIDGE_EBT_PKTTYPE is not set
-# CONFIG_BRIDGE_EBT_REDIRECT is not set
-# CONFIG_BRIDGE_EBT_SNAT is not set
-# CONFIG_BRIDGE_EBT_STP is not set
-# CONFIG_BRIDGE_EBT_T_FILTER is not set
-# CONFIG_BRIDGE_EBT_T_NAT is not set
-# CONFIG_BRIDGE_EBT_ULOG is not set
-# CONFIG_BRIDGE_EBT_VLAN is not set
-# CONFIG_BRIDGE_NETFILTER is not set
-# CONFIG_BRIDGE_NF_EBTABLES is not set
-CONFIG_BRIDGE=y
-# CONFIG_BROADCOM_PHY is not set
-CONFIG_BROKEN_ON_SMP=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_BSD_PROCESS_ACCT=y
-# CONFIG_BT_ATH3K is not set
-# CONFIG_BT_BNEP is not set
-CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
-# CONFIG_BT_CMTP is not set
-# CONFIG_BT_HCIBCM203X is not set
-# CONFIG_BT_HCIBFUSB is not set
-# CONFIG_BT_HCIBLUECARD is not set
-# CONFIG_BT_HCIBPA10X is not set
-# CONFIG_BT_HCIBT3C is not set
-# CONFIG_BT_HCIBTSDIO is not set
-# CONFIG_BT_HCIBTUART is not set
-# CONFIG_BT_HCIBTUSB is not set
-# CONFIG_BT_HCIDTL1 is not set
-CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIUART_H4=y
-# CONFIG_BT_HCIUART is not set
-# CONFIG_BT_HCIUART_LL is not set
-# CONFIG_BT_HCIUSB is not set
-CONFIG_BT_HCIUSB_SCO=y
-# CONFIG_BT_HCIVHCI is not set
-# CONFIG_BT_HIDP is not set
-# CONFIG_BT is not set
-# CONFIG_BT_L2CAP is not set
-# CONFIG_BT_MRVL is not set
-# CONFIG_BT_RFCOMM is not set
-CONFIG_BT_RFCOMM_TTY=y
-# CONFIG_BTRFS_FS is not set
-# CONFIG_BT_SCO is not set
-CONFIG_BUG=y
-# CONFIG_C2PORT is not set
-# CONFIG_CAN is not set
-# CONFIG_CAPI_AVM is not set
-# CONFIG_CAPI_EICON is not set
-# CONFIG_CAPI_TRACE is not set
-CONFIG_CARDBUS=y
-# CONFIG_CARDMAN_4000 is not set
-# CONFIG_CARDMAN_4040 is not set
-# CONFIG_CASSINI is not set
-# CONFIG_CB710_CORE is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_CFG80211 is not set
-# CONFIG_CGROUPS is not set
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_CHELSIO_T3 is not set
-# CONFIG_CHR_DEV_OSST is not set
-# CONFIG_CHR_DEV_SCH is not set
-# CONFIG_CHR_DEV_SG is not set
-# CONFIG_CHR_DEV_ST is not set
-# CONFIG_CICADA_PHY is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_EXPERIMENTAL is not set
-# CONFIG_CIFS is not set
-CONFIG_CIFS_POSIX=y
-# CONFIG_CIFS_STATS2 is not set
-CONFIG_CIFS_STATS=y
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# CONFIG_CIFS_XATTR is not set
-# CONFIG_CLASSIC_RCU=y
-CONFIG_CLS_U32_MARK=y
-CONFIG_CLS_U32_PERF=y
-CONFIG_CMDLINE=""
-# CONFIG_CNIC is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_COMEDI is not set
-# CONFIG_COMPAT_BRK is not set
-CONFIG_COMPAT_NET_DEV_OPS=y
-# CONFIG_CONFIGFS_FS is not set
-# CONFIG_CONNECTOR is not set
-CONFIG_CONSTRUCTORS=y
-# CONFIG_CONTEXT_SWITCH_TRACER is not set
-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-# CONFIG_CPU_DCACHE_DISABLE is not set
-# CONFIG_CPU_FREQ is not set
-# CONFIG_CPU_IDLE is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_CRASH_DUMP is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_CRC7 is not set
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC_ITU_T is not set
-# CONFIG_CRC_T10DIF is not set
-CONFIG_CROSSCOMPILE=y
-# CONFIG_CRYPTO_AEAD is not set
-# CONFIG_CRYPTO_AES_586 is not set
-# CONFIG_CRYPTO_AES is not set
-CONFIG_CRYPTO_ALGAPI2=y
-CONFIG_CRYPTO_ALGAPI=y
-# CONFIG_CRYPTO_ANSI_CPRNG is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_AUTHENC is not set
-# CONFIG_CRYPTO_BLKCIPHER is not set
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_CAMELLIA is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_CBC is not set
-# CONFIG_CRYPTO_CCM is not set
-# CONFIG_CRYPTO_CRC32C_INTEL is not set
-# CONFIG_CRYPTO_CRC32C is not set
-# CONFIG_CRYPTO_CRYPTD is not set
-# CONFIG_CRYPTO_CTR is not set
-# CONFIG_CRYPTO_CTS is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_DES is not set
-# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-# CONFIG_CRYPTO_ECB is not set
-# CONFIG_CRYPTO_FCRYPT is not set
-# CONFIG_CRYPTO_FIPS is not set
-# CONFIG_CRYPTO_GCM is not set
-# CONFIG_CRYPTO_GF128MUL is not set
-# CONFIG_CRYPTO_GHASH is not set
-# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set
-# CONFIG_CRYPTO_HASH is not set
-# CONFIG_CRYPTO_HMAC is not set
-# CONFIG_CRYPTO_HW is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_LRW is not set
-# CONFIG_CRYPTO_LZO is not set
-# CONFIG_CRYPTO_MANAGER2 is not set
-# CONFIG_CRYPTO_MANAGER is not set
-CONFIG_CRYPTO_MANAGER_NO_TESTS=y
-# CONFIG_CRYPTO_MD4 is not set
-# CONFIG_CRYPTO_MD5 is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_PCBC is not set
-CONFIG_CRYPTO_PCOMP=y
-# CONFIG_CRYPTO_PRNG is not set
-# CONFIG_CRYPTO_RMD128 is not set
-# CONFIG_CRYPTO_RMD160 is not set
-# CONFIG_CRYPTO_RMD256 is not set
-# CONFIG_CRYPTO_RMD320 is not set
-# CONFIG_CRYPTO_RNG is not set
-# CONFIG_CRYPTO_SALSA20_586 is not set
-# CONFIG_CRYPTO_SALSA20 is not set
-# CONFIG_CRYPTO_SEED is not set
-# CONFIG_CRYPTO_SEQIV is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_SHA1 is not set
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_TEST is not set
-# CONFIG_CRYPTO_TGR192 is not set
-# CONFIG_CRYPTO_TWOFISH_586 is not set
-# CONFIG_CRYPTO_TWOFISH_COMMON is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-CONFIG_CRYPTO_UNLZMA=y
-# CONFIG_CRYPTO_VMAC is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_XCBC is not set
-# CONFIG_CRYPTO_XTS is not set
-CONFIG_CRYPTO=y
-CONFIG_CRYPTO_ZLIB=y
-# CONFIG_CUSE is not set
-# CONFIG_DAB is not set
-# CONFIG_DAVICOM_PHY is not set
-# CONFIG_DCB is not set
-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_CREDENTIALS is not set
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_DEBUG_DEVRES is not set
-# CONFIG_DEBUG_ERRORS is not set
-# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
-CONFIG_DEBUG_FS=y
-# CONFIG_DEBUG_GPIO is not set
-# CONFIG_DEBUG_KERNEL is not set
-# CONFIG_DEBUG_KMEMLEAK is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_LIST is not set
-# CONFIG_DEBUG_LL is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_LOCK_ALLOC is not set
-# CONFIG_DEBUG_NOTIFIERS is not set
-# CONFIG_DEBUG_MEMORY_INIT is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_OBJECTS is not set
-# CONFIG_DEBUG_SG is not set
-# CONFIG_DEBUG_SHIRQ is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
-# CONFIG_DEBUG_PREEMPT is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_WRITECOUNT is not set
-# CONFIG_DECNET is not set
-CONFIG_DECOMPRESS_LZMA_NEEDED=y
-# CONFIG_DEFAULT_AS is not set
-# CONFIG_DEFAULT_BIC is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_CUBIC is not set
-CONFIG_DEFAULT_DEADLINE=y
-# CONFIG_DEFAULT_HTCP is not set
-CONFIG_DEFAULT_IOSCHED="deadline"
-CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
-# CONFIG_DEFAULT_NOOP is not set
-# CONFIG_DEFAULT_RENO is not set
-CONFIG_DEFAULT_TCP_CONG="westwood"
-# CONFIG_DEFAULT_VEGAS is not set
-CONFIG_DEFAULT_WESTWOOD=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-# CONFIG_DETECT_HUNG_TASK is not set
-# CONFIG_DETECT_SOFTLOCKUP is not set
-# CONFIG_DEVKMEM is not set
-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
-# CONFIG_DEVTMPFS_MOUNT is not set
-# CONFIG_DEVTMPFS is not set
-# CONFIG_DGRS is not set
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_DISPLAY_SUPPORT is not set
-# CONFIG_DL2K is not set
-# CONFIG_DLM is not set
-# CONFIG_DMA_API_DEBUG is not set
-# CONFIG_DMADEVICES is not set
-# CONFIG_DMA_ENGINE is not set
-# CONFIG_DMASCC is not set
-# CONFIG_DMATEST is not set
-# CONFIG_DM_LOG_USERSPACE is not set
-# CONFIG_DNET is not set
-# CONFIG_DNOTIFY is not set
-# CONFIG_DRAGONRISE_FF is not set
-# CONFIG_DRM is not set
-# CONFIG_DS1682 is not set
-# CONFIG_DST is not set
-# CONFIG_DTLK is not set
-# CONFIG_DUMMY is not set
-# CONFIG_DVB_CORE is not set
-# CONFIG_DVB is not set
-# CONFIG_DYNAMIC_DEBUG is not set
-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
-# CONFIG_E1000E is not set
-# CONFIG_E1000 is not set
-# CONFIG_E100 is not set
-# CONFIG_ECHO is not set
-# CONFIG_ECONET is not set
-# CONFIG_EDAC is not set
-# CONFIG_EEPRO100 is not set
-# CONFIG_EEPROM_93CX6 is not set
-# CONFIG_EEPROM_AT24 is not set
-# CONFIG_EEPROM_AT25 is not set
-# CONFIG_EEPROM_LEGACY is not set
-# CONFIG_EEPROM_MAX6875 is not set
-# CONFIG_EFI_PARTITION is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_ELF_CORE is not set
-CONFIG_EMBEDDED=y
-# CONFIG_ENABLE_MUST_CHECK is not set
-CONFIG_ENABLE_WARN_DEPRECATED=y
-# CONFIG_ENC28J60 is not set
-# CONFIG_ENCLOSURE_SERVICES is not set
-# CONFIG_EPIC100 is not set
-CONFIG_EPOLL=y
-# CONFIG_EQUALIZER is not set
-# CONFIG_ET131X is not set
-# CONFIG_ETHOC is not set
-CONFIG_EVENTFD=y
-# CONFIG_EVENT_TRACER is not set
-CONFIG_EXPERIMENTAL=y
-# CONFIG_EXPORTFS is not set
-# CONFIG_EXT2_FS is not set
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_EXT3_FS_XATTR is not set
-# CONFIG_EXT4_DEBUG is not set
-# CONFIG_EXT4DEV_FS is not set
-# CONFIG_EXT4_FS is not set
-# CONFIG_EXT4_USE_FOR_EXT23 is not set
-CONFIG_EXTRA_FIRMWARE=""
-CONFIG_EXTRA_TARGETS=""
-# CONFIG_EZX_PCAP is not set
-# CONFIG_FAIR_GROUP_SCHED is not set
-# CONFIG_FAULT_INJECTION is not set
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_FAT_FS is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_ARC is not set
-# CONFIG_FB_ARK is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_BACKLIGHT is not set
-# CONFIG_FB_BOOT_VESA_SUPPORT is not set
-# CONFIG_FB_BROADSHEET is not set
-# CONFIG_FB_CARMINE is not set
-# CONFIG_FB_CFB_COPYAREA is not set
-# CONFIG_FB_CFB_FILLRECT is not set
-# CONFIG_FB_CFB_IMAGEBLIT is not set
-# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_DDC is not set
-# CONFIG_FB_EARLYSUSPEND is not set
-# CONFIG_FB_FOREIGN_ENDIAN is not set
-# CONFIG_FB_GEODE is not set
-# CONFIG_FB_GOLDFISH is not set
-# CONFIG_FB_HGA is not set
-# CONFIG_FB_IBM_GXT4500 is not set
-# CONFIG_FB_IMSTT is not set
-# CONFIG_FB is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_LE80578 is not set
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_MB862XX is not set
-# CONFIG_FB_METRONOME is not set
-# CONFIG_FB_MODE_HELPERS is not set
-# CONFIG_FB_N411 is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_OF is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_PM3 is not set
-# CONFIG_FB_PS3 is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_S3 is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS 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_TRIDENT is not set
-# CONFIG_FB_UDL is not set
-# CONFIG_FB_VGA16 is not set
-# CONFIG_FB_VIA is not set
-# CONFIG_FB_VIRTUAL is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_VT8623 is not set
-# CONFIG_FCOE_FNIC is not set
-# CONFIG_FCOE is not set
-# CONFIG_FDDI is not set
-# CONFIG_FEALNX is not set
-CONFIG_FIB_RULES=y
-CONFIG_FILE_LOCKING=y
-# CONFIG_FIREWIRE is not set
-# CONFIG_FIRMWARE_IN_KERNEL is not set
-# CONFIG_FIXED_PHY is not set
-CONFIG_FLATMEM_MANUAL=y
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_FORCEDETH is not set
-CONFIG_FRAME_WARN=1024
-# CONFIG_FRAMEBUFFER_CONSOLE is not set
-# CONFIG_FREEZER is not set
-# CONFIG_FSCACHE is not set
-CONFIG_FSNOTIFY=y
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_FTL is not set
-# CONFIG_FTRACE is not set
-# CONFIG_FTRACE_STARTUP_TEST is not set
-# CONFIG_FUNCTION_TRACER is not set
-# CONFIG_FUSE_FS is not set
-# CONFIG_FUSION_FC is not set
-# CONFIG_FUSION is not set
-# CONFIG_FUSION_SAS is not set
-# CONFIG_FUSION_SPI is not set
-CONFIG_FUTEX=y
-CONFIG_FW_LOADER=y
-CONFIG_GACT_PROB=y
-# CONFIG_GAMEPORT is not set
-# CONFIG_GCOV_KERNEL is not set
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_TIME=y
-# CONFIG_GIGASET_DEBUG is not set
-# CONFIG_GFS2_FS is not set
-# CONFIG_GPIO_ADP5588 is not set
-# CONFIG_GPIO_BT8XX is not set
-# CONFIG_GPIO_CS5535 is not set
-# CONFIG_GPIO_DEVICE is not set
-# CONFIG_GPIO_LANGWELL is not set
-# CONFIG_GPIOLIB is not set
-# CONFIG_GPIO_MAX7301 is not set
-# CONFIG_GPIO_MAX732X is not set
-# CONFIG_GPIO_MC33880 is not set
-# CONFIG_GPIO_MCP23S08 is not set
-# CONFIG_GPIO_PCA953X is not set
-# CONFIG_GPIO_PCF857X is not set
-# CONFIG_GPIO_SYSFS is not set
-# CONFIG_GPIO_XILINX is not set
-# CONFIG_GREENASIA_FF is not set
-# CONFIG_GROUP_SCHED is not set
-# CONFIG_HAMACHI is not set
-CONFIG_HAMRADIO=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_HAVE_AOUT is not set
-CONFIG_HAVE_MLOCKED_PAGE_BIT=y
-CONFIG_HAVE_MLOCK=y
-# CONFIG_HCALL_STATS is not set
-# CONFIG_HDLC_CISCO is not set
-# CONFIG_HDLC_FR is not set
-# CONFIG_HDLC is not set
-# CONFIG_HDLC_PPP is not set
-# CONFIG_HDLC_RAW_ETH is not set
-# CONFIG_HDLC_RAW is not set
-# CONFIG_HEADERS_CHECK is not set
-# CONFIG_HECI is not set
-# CONFIG_HERMES is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_HID_A4TECH is not set
-# CONFIG_HID_APPLE is not set
-# CONFIG_HID_BELKIN is not set
-# CONFIG_HID_BRIGHT is not set
-# CONFIG_HID_CHERRY is not set
-# CONFIG_HID_CHICONY is not set
-# CONFIG_HID_COMPAT is not set
-# CONFIG_HID_CYPRESS is not set
-# CONFIG_HID_DEBUG is not set
-# CONFIG_HID_DELL is not set
-# CONFIG_HID_DRAGONRISE is not set
-# CONFIG_HID_EZKEY is not set
-# CONFIG_HID_FF is not set
-# CONFIG_HID_GREENASIA is not set
-# CONFIG_HID_GYRATION is not set
-# CONFIG_HID is not set
-# CONFIG_HID_KENSINGTON is not set
-# CONFIG_HID_KYE is not set
-# CONFIG_HID_LOGITECH is not set
-# CONFIG_HID_MICROSOFT is not set
-# CONFIG_HID_MONTEREY is not set
-# CONFIG_HID_NTRIG is not set
-# CONFIG_HID_PANTHERLORD is not set
-# CONFIG_HID_PETALYNX is not set
-# CONFIG_HID_PID is not set
-# CONFIG_HIDRAW is not set
-# CONFIG_HID_SAMSUNG is not set
-# CONFIG_HID_SMARTJOYPLUS is not set
-# CONFIG_HID_SONY is not set
-# CONFIG_HID_SUNPLUS is not set
-# CONFIG_HID_SUPPORT is not set
-# CONFIG_HID_THRUSTMASTER is not set
-# CONFIG_HID_TOPSEED is not set
-# CONFIG_HID_TWINHAN is not set
-# CONFIG_HID_WACOM is not set
-# CONFIG_HID_ZEROPLUS is not set
-# CONFIG_HIGHMEM is not set
-CONFIG_HIGH_RES_TIMERS=y
-# CONFIG_HIPPI is not set
-# CONFIG_HOSTAP_CS is not set
-# CONFIG_HOSTAP is not set
-# CONFIG_HOSTAP_PCI is not set
-# CONFIG_HOSTAP_PLX is not set
-# CONFIG_HOTPLUG_CPU is not set
-# CONFIG_HOTPLUG_PCI is not set
-CONFIG_HOTPLUG=y
-# CONFIG_HP100 is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_HP_ILO is not set
-# CONFIG_HTC_EGPIO is not set
-# CONFIG_HTC_PASIC3 is not set
-# CONFIG_HUGETLB_PAGE is not set
-# CONFIG_HVC_UDBG is not set
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-# CONFIG_HW_RANDOM_AMD is not set
-# CONFIG_HW_RANDOM_GEODE is not set
-# CONFIG_HW_RANDOM_INTEL is not set
-# CONFIG_HW_RANDOM_TIMERIOMEM is not set
-# CONFIG_HW_RANDOM_VIA is not set
-# CONFIG_HYPERV is not set
-# CONFIG_HYSDN is not set
-CONFIG_HZ=100
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ_100=y
-# CONFIG_HZ_1024 is not set
-# CONFIG_HZ_128 is not set
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_256 is not set
-# CONFIG_HZ_300 is not set
-# CONFIG_HZ_48 is not set
-# CONFIG_I2C_ALGOBIT is not set
-# CONFIG_I2C_ALGOPCA is not set
-# CONFIG_I2C_ALGOPCF is not set
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_CHARDEV is not set
-# CONFIG_I2C_COMPAT is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_ELEKTOR is not set
-# CONFIG_I2C_GPIO is not set
-# CONFIG_I2C_HELPER_AUTO is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-# CONFIG_I2C_IBM_IIC is not set
-# CONFIG_I2C_ISCH is not set
-# CONFIG_I2C is not set
-# CONFIG_I2C_MPC is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_OCORES is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PCA_ISA is not set
-# CONFIG_I2C_PCA_PLATFORM is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_I2C_SIMTEC is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_TAOS_EVM is not set
-# CONFIG_I2C_TINY_USB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2O is not set
-# CONFIG_I82092 is not set
-# CONFIG_I82365 is not set
-# CONFIG_IBM_ASM is not set
-# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
-# CONFIG_IBM_NEW_EMAC_RGMII is not set
-# CONFIG_IBM_NEW_EMAC_TAH is not set
-# CONFIG_IBM_NEW_EMAC_ZMII is not set
-# CONFIG_ICPLUS_PHY is not set
-# CONFIG_ICS932S401 is not set
-# CONFIG_IDEDISK_MULTI_MODE is not set
-# CONFIG_IDEDMA_IVB is not set
-# CONFIG_IDEDMA_ONLYDISK is not set
-# CONFIG_IDE_GD is not set
-# CONFIG_IDE is not set
-CONFIG_IDE_MAX_HWIFS=4
-# CONFIG_IDEPCI_SHARE_IRQ is not set
-# CONFIG_IDE_PHISON is not set
-CONFIG_IDE_PROC_FS=y
-# CONFIG_IDE_TASK_IOCTL is not set
-# CONFIG_IEEE1394_DV1394 is not set
-# CONFIG_IEEE1394_ETH1394 is not set
-# CONFIG_IEEE1394 is not set
-# CONFIG_IEEE1394_OHCI1394 is not set
-# CONFIG_IEEE1394_PCILYNX is not set
-# CONFIG_IEEE1394_RAWIO is not set
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-# CONFIG_IEEE1394_VIDEO1394 is not set
-# CONFIG_IEEE80211_CRYPT_CCMP is not set
-# CONFIG_IEEE80211_CRYPT_TKIP is not set
-# CONFIG_IEEE80211_CRYPT_WEP is not set
-# CONFIG_IEEE80211_DEBUG is not set
-# CONFIG_IEEE80211 is not set
-# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
-# CONFIG_IEEE80211_SOFTMAC is not set
-# CONFIG_IEEE802154 is not set
-# CONFIG_IFB is not set
-# CONFIG_IGB is not set
-# CONFIG_IGBVF is not set
-# CONFIG_IIO is not set
-# CONFIG_RAMZSWAP is not set
-# CONFIG_BATMAN_ADV is not set
-# CONFIG_IKCONFIG is not set
-# CONFIG_IKCONFIG_PROC is not set
-# CONFIG_IMAGE_CMDLINE_HACK is not set
-# CONFIG_IMQ_BEHAVIOR_AA is not set
-# CONFIG_IMQ_BEHAVIOR_AB is not set
-# CONFIG_IMQ_BEHAVIOR_BA is not set
-# CONFIG_IMQ_BEHAVIOR_BB is not set
-# CONFIG_IMQ is not set
-CONFIG_IMQ_NUM_DEVS=2
-# CONFIG_INET6_AH is not set
-# CONFIG_INET6_ESP is not set
-# CONFIG_INET6_IPCOMP is not set
-# CONFIG_INET6_TUNNEL is not set
-# CONFIG_INET6_XFRM_MODE_BEET is not set
-# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET6_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_LRO is not set
-# CONFIG_INET_TCP_DIAG is not set
-# CONFIG_INET_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-CONFIG_INET=y
-# CONFIG_INFINIBAND is not set
-# CONFIG_INFTL is not set
-CONFIG_INIT_ENV_ARG_LIMIT=32
-# CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set
-# CONFIG_INITRAMFS_COMPRESSION_GZIP is not set
-# CONFIG_INITRAMFS_COMPRESSION_LZMA is not set
-CONFIG_INITRAMFS_COMPRESSION_NONE=y
-# CONFIG_INOTIFY is not set
-# CONFIG_INOTIFY_USER is not set
-# CONFIG_INPUT_APANEL is not set
-# CONFIG_INPUT_ATI_REMOTE2 is not set
-# CONFIG_INPUT_ATI_REMOTE is not set
-# CONFIG_INPUT_ATLAS_BTNS is not set
-# CONFIG_INPUT_CM109 is not set
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_FF_MEMLESS is not set
-# CONFIG_INPUT_GPIO is not set
-# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
-# CONFIG_INPUT is not set
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-# CONFIG_INPUT_MIMIO is not set
-CONFIG_INPUT_MISC=y
-# CONFIG_INPUT_MOUSEDEV is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_PCSPKR is not set
-# CONFIG_INPUT_POLLDEV is not set
-# CONFIG_INPUT_POWERMATE is not set
-# CONFIG_INPUT_SPARSEKMAP is not set
-# CONFIG_INPUT_TABLET is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_UINPUT is not set
-# CONFIG_INPUT_WINBOND_CIR is not set
-# CONFIG_INPUT_WISTRON_BTNS is not set
-# CONFIG_INSTRUMENTATION is not set
-# CONFIG_IOSCHED_AS is not set
-# CONFIG_IOSCHED_CFQ is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IP1000 is not set
-# CONFIG_IP175C_PHY is not set
-# CONFIG_IP6_NF_FILTER is not set
-# CONFIG_IP6_NF_IPTABLES is not set
-# CONFIG_IP6_NF_MANGLE is not set
-# CONFIG_IP6_NF_MATCH_AH is not set
-# CONFIG_IP6_NF_MATCH_EUI64 is not set
-# CONFIG_IP6_NF_MATCH_FRAG is not set
-# CONFIG_IP6_NF_MATCH_HL is not set
-# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
-# CONFIG_IP6_NF_MATCH_LIMIT is not set
-# CONFIG_IP6_NF_MATCH_MH is not set
-# CONFIG_IP6_NF_MATCH_OPTS is not set
-# CONFIG_IP6_NF_MATCH_OWNER is not set
-# CONFIG_IP6_NF_MATCH_RT is not set
-# CONFIG_IP6_NF_QUEUE is not set
-# CONFIG_IP6_NF_RAW is not set
-# CONFIG_IP6_NF_TARGET_HL is not set
-# CONFIG_IP6_NF_TARGET_IMQ is not set
-# CONFIG_IP6_NF_TARGET_LOG is not set
-# CONFIG_IP6_NF_TARGET_REJECT is not set
-# CONFIG_IP6_NF_TARGET_ROUTE is not set
-CONFIG_IP_ADVANCED_ROUTER=y
-# CONFIG_IPC_NS is not set
-# CONFIG_IP_DCCP is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_FIB_TRIE is not set
-# CONFIG_IPMI_HANDLER is not set
-CONFIG_IP_MROUTE=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_MULTIPLE_TABLES=y
-# CONFIG_IP_NF_AMANDA is not set
-# CONFIG_IP_NF_ARPFILTER is not set
-# CONFIG_IP_NF_ARP_MANGLE is not set
-# CONFIG_IP_NF_ARPTABLES is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CONNTRACK_MARK=y
-CONFIG_IP_NF_CONNTRACK=y
-CONFIG_IP_NF_CT_ACCT=y
-# CONFIG_IP_NF_CT_PROTO_SCTP is not set
-# CONFIG_IP_NF_FILTER is not set
-# CONFIG_IP_NF_FTP is not set
-# CONFIG_IP_NF_H323 is not set
-# CONFIG_IP_NF_IPTABLES is not set
-# CONFIG_IP_NF_IRC is not set
-# CONFIG_IP_NF_MANGLE is not set
-# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
-# CONFIG_IP_NF_MATCH_AH is not set
-# CONFIG_IP_NF_MATCH_ECN is not set
-# CONFIG_IP_NF_MATCH_HASHLIMIT is not set
-# CONFIG_IP_NF_MATCH_IPP2P is not set
-# CONFIG_IP_NF_MATCH_OWNER is not set
-# CONFIG_IP_NF_MATCH_RECENT is not set
-# CONFIG_IP_NF_MATCH_SET is not set
-# CONFIG_IP_NF_MATCH_TIME is not set
-# CONFIG_IP_NF_MATCH_TOS is not set
-# CONFIG_IP_NF_MATCH_TTL is not set
-# CONFIG_IP_NF_NAT_AMANDA is not set
-# CONFIG_IP_NF_NAT_FTP is not set
-# CONFIG_IP_NF_NAT_H323 is not set
-# CONFIG_IP_NF_NAT_IRC is not set
-CONFIG_IP_NF_NAT_NEEDED=y
-# CONFIG_IP_NF_NAT_PPTP is not set
-# CONFIG_IP_NF_NAT_SIP is not set
-# CONFIG_IP_NF_NAT_SNMP_BASIC is not set
-# CONFIG_IP_NF_NAT_TFTP is not set
-CONFIG_IP_NF_NAT=y
-# CONFIG_IP_NF_NETBIOS_NS is not set
-# CONFIG_IP_NF_PPTP is not set
-# CONFIG_IP_NF_QUEUE is not set
-# CONFIG_IP_NF_RAW is not set
-# CONFIG_IP_NF_SECURITY is not set
-CONFIG_IP_NF_SET_HASHSIZE=1024
-# CONFIG_IP_NF_SET_IPHASH is not set
-# CONFIG_IP_NF_SET_IPMAP is not set
-# CONFIG_IP_NF_SET_IPPORTHASH is not set
-# CONFIG_IP_NF_SET_IPTREE is not set
-# CONFIG_IP_NF_SET_IPTREEMAP is not set
-# CONFIG_IP_NF_SET is not set
-# CONFIG_IP_NF_SET_MACIPMAP is not set
-CONFIG_IP_NF_SET_MAX=256
-# CONFIG_IP_NF_SET_NETHASH is not set
-# CONFIG_IP_NF_SET_PORTMAP is not set
-# CONFIG_IP_NF_SIP is not set
-# CONFIG_IP_NF_TARGET_CLUSTERIP is not set
-# CONFIG_IP_NF_TARGET_ECN is not set
-# CONFIG_IP_NF_TARGET_IMQ is not set
-# CONFIG_IP_NF_TARGET_LOG is not set
-# CONFIG_IP_NF_TARGET_MASQUERADE is not set
-# CONFIG_IP_NF_TARGET_NETMAP is not set
-# CONFIG_IP_NF_TARGET_REDIRECT is not set
-# CONFIG_IP_NF_TARGET_REJECT is not set
-# CONFIG_IP_NF_TARGET_ROUTE is not set
-# CONFIG_IP_NF_TARGET_SAME is not set
-# CONFIG_IP_NF_TARGET_SET is not set
-# CONFIG_IP_NF_TARGET_TOS is not set
-# CONFIG_IP_NF_TARGET_TTL is not set
-# CONFIG_IP_NF_TARGET_ULOG is not set
-# CONFIG_IP_NF_TFTP is not set
-# CONFIG_IP_PIMSM_V1 is not set
-# CONFIG_IP_PIMSM_V2 is not set
-# CONFIG_IP_PNP is not set
-CONFIG_IP_ROUTE_FWMARK=y
-CONFIG_IP_ROUTE_MULTIPATH_CACHED=y
-# CONFIG_IP_ROUTE_MULTIPATH_DRR is not set
-# CONFIG_IP_ROUTE_MULTIPATH_RANDOM is not set
-# CONFIG_IP_ROUTE_MULTIPATH_RR is not set
-# CONFIG_IP_ROUTE_MULTIPATH_WRANDOM is not set
-CONFIG_IP_ROUTE_MULTIPATH=y
-CONFIG_IP_ROUTE_VERBOSE=y
-# CONFIG_IP_SCTP is not set
-CONFIG_IPSEC_NAT_TRAVERSAL=y
-# CONFIG_IPV6 is not set
-# CONFIG_IPV6_MIP6 is not set
-# CONFIG_IPV6_MROUTE is not set
-# CONFIG_IPV6_MULTIPLE_TABLES is not set
-CONFIG_IPV6_NDISC_NODETYPE=y
-# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTE_INFO is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-# CONFIG_IPV6_SIT is not set
-# CONFIG_IPV6_SIT_6RD is not set
-# CONFIG_IPV6_TUNNEL is not set
-# CONFIG_IP_VS is not set
-# CONFIG_IPW2100_DEBUG is not set
-# CONFIG_IPW2100 is not set
-CONFIG_IPW2100_MONITOR=y
-# CONFIG_IPW2200_DEBUG is not set
-# CONFIG_IPW2200 is not set
-CONFIG_IPW2200_MONITOR=y
-# CONFIG_IPW2200_PROMISCUOUS is not set
-# CONFIG_IPW2200_QOS is not set
-# CONFIG_IPW2200_RADIOTAP is not set
-# CONFIG_IPWIRELESS is not set
-# CONFIG_IPX is not set
-# CONFIG_IRDA is not set
-# CONFIG_IRQSOFF_TRACER is not set
-# CONFIG_ISCSI_TCP is not set
-CONFIG_ISDN=y
-# CONFIG_ISDN_AUDIO is not set
-# CONFIG_ISDN_CAPI_CAPIDRV is not set
-# CONFIG_ISDN_DIVERSION is not set
-# CONFIG_ISDN_DRV_ACT2000 is not set
-# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set
-# CONFIG_ISDN_DRV_EICON is not set
-# CONFIG_ISDN_DRV_HISAX is not set
-# CONFIG_ISDN_DRV_ICN is not set
-# CONFIG_ISDN_DRV_LOOP is not set
-# CONFIG_ISDN_DRV_PCBIT is not set
-# CONFIG_ISDN_DRV_SC is not set
-# CONFIG_ISDN_DRV_TPAM is not set
-# CONFIG_ISDN_WITH_ABC is not set
-# CONFIG_ISL29003 is not set
-# CONFIG_ISO9660_FS is not set
-# CONFIG_IWL3945 is not set
-# CONFIG_IWLAGN is not set
-# CONFIG_IWLCORE is not set
-# CONFIG_IWLWIFI is not set
-# CONFIG_IWLWIFI_LEDS is not set
-# CONFIG_IWMC3200TOP is not set
-# CONFIG_IXGB is not set
-# CONFIG_JBD2_DEBUG is not set
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_JBD is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_FS_DEBUG=0
-# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-# CONFIG_JFFS2_FS_XATTR is not set
-CONFIG_JFFS2_FS=y
-# CONFIG_JFFS2_LZO is not set
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_ZLIB=y
-# CONFIG_JFFS_FS is not set
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_JFS_POSIX_ACL is not set
-# CONFIG_JFS_SECURITY is not set
-# CONFIG_JFS_STATISTICS is not set
-# CONFIG_JME is not set
-CONFIG_JOLIET=y
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-# CONFIG_KALLSYMS is not set
-# CONFIG_KARMA_PARTITION is not set
-# CONFIG_KERNEL_BZIP2 is not set
-# CONFIG_KERNEL_GZIP is not set
-CONFIG_KERNEL_LZMA=y
-# CONFIG_KERNEL_LZO is not set
-# CONFIG_KEXEC is not set
-# CONFIG_KEYBOARD_ADP5588 is not set
-# CONFIG_KEYBOARD_LM8323 is not set
-# CONFIG_KEYBOARD_MAX7359 is not set
-# CONFIG_KEYBOARD_OPENCORES is not set
-# CONFIG_KEYS is not set
-# CONFIG_KGDB is not set
-# CONFIG_KMEMTRACE is not set
-CONFIG_KMOD=y
-# CONFIG_KPROBES is not set
-# CONFIG_KS8842 is not set
-# CONFIG_KS8851 is not set
-# CONFIG_KS8851_MLL is not set
-# CONFIG_KSM is not set
-# CONFIG_LANMEDIA is not set
-# CONFIG_LAPB is not set
-# CONFIG_LASAT is not set
-# CONFIG_LATENCYTOP is not set
-CONFIG_LBDAF=y
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_LEDS_ALIX is not set
-# CONFIG_LEDS_BD2802 is not set
-CONFIG_LEDS_CLASS=y
-# CONFIG_LEDS_DAC124S085 is not set
-CONFIG_LEDS_GPIO_PLATFORM=y
-# CONFIG_LEDS_LT3593 is not set
-# CONFIG_LEDS_LP3944 is not set
-# CONFIG_LEDS_LP5521 is not set
-# CONFIG_LEDS_PCA9532 is not set
-# CONFIG_LEDS_PCA955X is not set
-# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
-CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
-# CONFIG_LEDS_TRIGGER_GPIO is not set
-CONFIG_LEDS_TRIGGER_HEARTBEAT=y
-# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
-# CONFIG_LEDS_TRIGGER_MORSE is not set
-CONFIG_LEDS_TRIGGER_NETDEV=y
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_LIB80211_CRYPT_CCMP is not set
-# CONFIG_LIB80211_CRYPT_TKIP is not set
-# CONFIG_LIB80211_CRYPT_WEP is not set
-# CONFIG_LIB80211_DEBUG is not set
-# CONFIG_LIB80211 is not set
-# CONFIG_LIBCRC32C is not set
-# CONFIG_LIBERTAS is not set
-# CONFIG_LIBERTAS_THINFIRM is not set
-# CONFIG_LIBERTAS_USB is not set
-# CONFIG_LIBFC is not set
-# CONFIG_LIBFCOE is not set
-# CONFIG_LIBIPW_DEBUG is not set
-# CONFIG_LINE6_USB is not set
-# CONFIG_LLC2 is not set
-CONFIG_LLC=y
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_LOCKDEP_SUPPORT=y
-# CONFIG_LOCKD is not set
-CONFIG_LOCKD_V4=y
-# CONFIG_LOCK_STAT is not set
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_LOGIRUMBLEPAD2_FF is not set
-# CONFIG_LOGITECH_FF is not set
-# CONFIG_LOGO is not set
-# CONFIG_LSF is not set
-# CONFIG_LSI_ET1011C_PHY is not set
-# CONFIG_LTPC is not set
-# CONFIG_LXT_PHY is not set
-CONFIG_MAC80211_DEFAULT_PS_VALUE=1
-CONFIG_MAC80211_DEFAULT_PS=y
-# CONFIG_MAC80211 is not set
-# CONFIG_MAC_EMUMOUSEBTN is not set
-# CONFIG_MACINTOSH_DRIVERS is not set
-# CONFIG_MAC_PARTITION is not set
-# CONFIG_MACVLAN is not set
-# CONFIG_MAGIC_SYSRQ is not set
-# CONFIG_MARKEINS is not set
-# CONFIG_MARKERS is not set
-# CONFIG_MARVELL_PHY is not set
-# CONFIG_MDIO_BITBANG is not set
-# CONFIG_MD is not set
-# CONFIG_ME4000 is not set
-# CONFIG_MEDIA_ATTACH is not set
-# CONFIG_MEDIA_SUPPORT is not set
-# CONFIG_MEDIA_TUNER_CUSTOMISE is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_MEILHAUS is not set
-# CONFIG_MEMORY_FAILURE is not set
-# CONFIG_MEMSTICK is not set
-# CONFIG_MFD_88PM8607 is not set
-# CONFIG_MFD_ASIC3 is not set
-# CONFIG_MFD_CORE is not set
-# CONFIG_MFD_MC13783 is not set
-# CONFIG_MFD_PCF50633 is not set
-# CONFIG_MFD_SM501 is not set
-# CONFIG_MFD_TC6387XB is not set
-# CONFIG_MFD_TC6393XB is not set
-# CONFIG_MFD_TMIO is not set
-# CONFIG_MFD_WM831X is not set
-# CONFIG_MFD_WM8350_I2C is not set
-# CONFIG_MFD_WM8400 is not set
-# CONFIG_MG_DISK is not set
-# CONFIG_MIGRATION is not set
-CONFIG_MII=y
-CONFIG_MINI_FO=y
-# CONFIG_MINIX_FS is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_MIPS_FPU_EMU is not set
-CONFIG_MISC_DEVICES=y
-CONFIG_MISC_FILESYSTEMS=y
-# CONFIG_MISDN_AVMFRITZ is not set
-# CONFIG_MISDN_HFCPCI is not set
-# CONFIG_MISDN_HFCUSB is not set
-# CONFIG_MISDN_INFINEON is not set
-# CONFIG_MISDN is not set
-# CONFIG_MISDN_NETJET is not set
-# CONFIG_MISDN_SPEEDFAX is not set
-# CONFIG_MISDN_W6692 is not set
-# CONFIG_MKISS is not set
-# CONFIG_MMC_ARMMMCI is not set
-CONFIG_MMC_BLOCK_BOUNCE=y
-# CONFIG_MMC_BLOCK is not set
-# CONFIG_MMC_CB710 is not set
-# CONFIG_MMC_DEBUG is not set
-# CONFIG_MMC is not set
-# CONFIG_MMC_MVSDIO is not set
-# CONFIG_MMC_S3C is not set
-# CONFIG_MMC_SDHCI is not set
-# CONFIG_MMC_SDRICOH_CS is not set
-# CONFIG_MMC_SPI is not set
-# CONFIG_MMC_TEST is not set
-# CONFIG_MMC_UNSAFE_RESUME is not set
-# CONFIG_MMC_VIA_SDMMC is not set
-CONFIG_MMU=y
-# CONFIG_MODULE_FORCE_LOAD is not set
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MOUSE_APPLETOUCH is not set
-# CONFIG_MOUSE_INPORT is not set
-# CONFIG_MOUSE_LOGIBM is not set
-# CONFIG_MOUSE_PC110PAD is not set
-# CONFIG_MOUSE_PS2_SENTELIC is not set
-# CONFIG_MOUSE_SYNAPTICS_I2C is not set
-# CONFIG_MSDOS_FS is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_AFS_PARTS is not set
-# CONFIG_MTD_ALAUDA is not set
-# CONFIG_MTD_AR7_PARTS is not set
-# CONFIG_MTD_ARM_INTEGRATOR is not set
-CONFIG_MTD_BLKDEVS=y
-# CONFIG_MTD_BLOCK2MTD is not set
-CONFIG_MTD_BLOCK=y
-# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-CONFIG_MTD_CFI_AMDSTD=y
-# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
-CONFIG_MTD_CFI_INTELEXT=y
-# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-CONFIG_MTD_CFI_NOSWAP=y
-# CONFIG_MTD_CFI_STAA is not set
-CONFIG_MTD_CFI_UTIL=y
-CONFIG_MTD_CFI=y
-CONFIG_MTD_CHAR=y
-# CONFIG_MTD_CMDLINE_PARTS is not set
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_CONCAT is not set
-# CONFIG_MTD_DATAFLASH is not set
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-CONFIG_MTD_GEN_PROBE=y
-# CONFIG_MTD_GPIO_ADDR is not set
-# CONFIG_MTD_INTEL_VR_NOR is not set
-# CONFIG_MTD_JEDECPROBE is not set
-# CONFIG_MTD_LPDDR is not set
-# CONFIG_MTD_M25P80 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_MYLOADER_PARTS is not set
-# CONFIG_MTD_NAND_CAFE is not set
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_GPIO is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND is not set
-# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-# CONFIG_MTD_NAND_NANDSIM is not set
-# CONFIG_MTD_NAND_PLATFORM is not set
-# CONFIG_MTD_NAND_VERIFY_WRITE is not set
-# CONFIG_MTD_ONENAND is not set
-# CONFIG_MTD_OOPS is not set
-# CONFIG_MTD_OTP is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_PCI is not set
-# CONFIG_MTD_PHRAM is not set
-# CONFIG_MTD_PHYSMAP_COMPAT is not set
-# CONFIG_MTD_PHYSMAP is not set
-# CONFIG_MTD_PLATRAM is not set
-# CONFIG_MTD_PMC551 is not set
-# CONFIG_MTD_RAM is not set
-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
-# CONFIG_MTD_REDBOOT_PARTS is not set
-# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-# CONFIG_MTD_ROM is not set
-CONFIG_MTD_ROOTFS_ROOT_DEV=y
-CONFIG_MTD_ROOTFS_SPLIT=y
-# CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_SST25L is not set
-# CONFIG_MTD_TESTS is not set
-# CONFIG_MTD_UBI is not set
-CONFIG_MTD=y
-# CONFIG_MV643XX_ETH is not set
-# CONFIG_MVSWITCH_PHY is not set
-# CONFIG_MWAVE is not set
-# CONFIG_MWL8K is not set
-# CONFIG_MYRI10GE is not set
-# CONFIG_NAMESPACES is not set
-# CONFIG_NATIONAL_PHY is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_NEC_MARKEINS is not set
-# CONFIG_NET_9P is not set
-# CONFIG_NET_ACT_GACT is not set
-# CONFIG_NET_ACT_IPT is not set
-# CONFIG_NET_ACT_MIRRED is not set
-# CONFIG_NET_ACT_NAT is not set
-# CONFIG_NET_ACT_PEDIT is not set
-# CONFIG_NET_ACT_POLICE is not set
-# CONFIG_NET_ACT_SIMP is not set
-CONFIG_NET_ACT_SKBEDIT=y
-CONFIG_NET_CLS_ACT=y
-CONFIG_NET_CLS_BASIC=y
-# CONFIG_NET_CLS_FLOW is not set
-# CONFIG_NET_CLS_FW is not set
-CONFIG_NET_CLS_IND=y
-# CONFIG_NET_CLS_ROUTE4 is not set
-# CONFIG_NET_CLS_RSVP6 is not set
-# CONFIG_NET_CLS_RSVP is not set
-# CONFIG_NET_CLS_TCINDEX is not set
-# CONFIG_NET_CLS_U32 is not set
-CONFIG_NET_CLS=y
-# CONFIG_NETCONSOLE is not set
-# CONFIG_NETDEBUG is not set
-# CONFIG_NETDEV_10000 is not set
-CONFIG_NETDEV_1000=y
-CONFIG_NETDEVICES_MULTIQUEUE=y
-CONFIG_NETDEVICES=y
-# CONFIG_NET_DROP_MONITOR is not set
-# CONFIG_NET_DSA is not set
-# CONFIG_NET_EMATCH_CMP is not set
-# CONFIG_NET_EMATCH is not set
-# CONFIG_NET_EMATCH_META is not set
-# CONFIG_NET_EMATCH_NBYTE is not set
-CONFIG_NET_EMATCH_STACK=32
-# CONFIG_NET_EMATCH_TEXT is not set
-# CONFIG_NET_EMATCH_U32 is not set
-CONFIG_NET_ESTIMATOR=y
-CONFIG_NET_ETHERNET=y
-# CONFIG_NET_FC is not set
-CONFIG_NETFILTER_ADVANCED=y
-# CONFIG_NETFILTER_DEBUG is not set
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_NETLINK_LOG is not set
-# CONFIG_NETFILTER_NETLINK_QUEUE is not set
-# CONFIG_NETFILTER_TPROXY is not set
-# CONFIG_NETFILTER_XTABLES is not set
-# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set
-# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set
-# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
-# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
-# CONFIG_NETFILTER_XT_MATCH_ESP is not set
-# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_HELPER is not set
-# CONFIG_NETFILTER_XT_MATCH_HL is not set
-# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
-# CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG is not set
-# CONFIG_NETFILTER_XT_MATCH_LAYER7 is not set
-# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
-# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_MAC is not set
-# CONFIG_NETFILTER_XT_MATCH_MARK is not set
-# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
-# CONFIG_NETFILTER_XT_MATCH_OSF is not set
-# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
-# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
-# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
-# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
-# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
-# CONFIG_NETFILTER_XT_MATCH_REALM is not set
-# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
-# CONFIG_NETFILTER_XT_MATCH_RECENT_PROC_COMPAT is not set
-# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
-# CONFIG_NETFILTER_XT_MATCH_STATE is not set
-# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
-# CONFIG_NETFILTER_XT_MATCH_STRING is not set
-# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
-# CONFIG_NETFILTER_XT_MATCH_TIME is not set
-# CONFIG_NETFILTER_XT_MATCH_U32 is not set
-# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
-# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
-# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
-# CONFIG_NETFILTER_XT_TARGET_HL is not set
-# CONFIG_NETFILTER_XT_TARGET_IMQ is not set
-# CONFIG_NETFILTER_XT_TARGET_LED is not set
-# CONFIG_NETFILTER_XT_TARGET_MARK is not set
-# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
-# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
-# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
-# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
-# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
-CONFIG_NETFILTER=y
-CONFIG_NET_IPGRE_BROADCAST=y
-# CONFIG_NET_IPGRE is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_ISA is not set
-# CONFIG_NET_KEY is not set
-# CONFIG_NET_KEY_MIGRATE is not set
-CONFIG_NET_PCI=y
-# CONFIG_NET_PCMCIA is not set
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_NETPOLL is not set
-CONFIG_NET_RADIO=y
-# CONFIG_NETROM is not set
-# CONFIG_NET_SB1000 is not set
-# CONFIG_NET_SCH_ATM is not set
-# CONFIG_NET_SCH_CBQ is not set
-# CONFIG_NET_SCH_CLK_CPU is not set
-# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
-CONFIG_NET_SCH_CLK_JIFFIES=y
-# CONFIG_NET_SCH_DRR is not set
-# CONFIG_NET_SCH_DSMARK is not set
-CONFIG_NET_SCHED=y
-# CONFIG_NET_SCH_ESFQ is not set
-CONFIG_NET_SCH_ESFQ_NFCT=y
-CONFIG_NET_SCH_FIFO=y
-# CONFIG_NET_SCH_GRED is not set
-# CONFIG_NET_SCH_HFSC is not set
-# CONFIG_NET_SCH_HTB is not set
-# CONFIG_NET_SCH_INGRESS is not set
-# CONFIG_NET_SCH_MULTIQ is not set
-# CONFIG_NET_SCH_NETEM is not set
-# CONFIG_NET_SCH_PRIO is not set
-# CONFIG_NET_SCH_RED is not set
-# CONFIG_NET_SCH_RR is not set
-# CONFIG_NET_SCH_SFQ is not set
-# CONFIG_NET_SCH_TBF is not set
-# CONFIG_NET_SCH_TEQL is not set
-# CONFIG_NET_TULIP is not set
-# CONFIG_NET_VENDOR_3COM is not set
-CONFIG_NET_WIRELESS_RTNETLINK=y
-CONFIG_NET_WIRELESS=y
-CONFIG_NETWORK_FILESYSTEMS=y
-# CONFIG_NETWORK_SECMARK is not set
-# CONFIG_NETXEN_NIC is not set
-CONFIG_NET=y
-# CONFIG_NEW_GPIO is not set
-CONFIG_NEW_LEDS=y
-# CONFIG_NF_CONNTRACK_AMANDA is not set
-CONFIG_NF_CONNTRACK_ENABLED=y
-# CONFIG_NF_CONNTRACK_EVENTS is not set
-# CONFIG_NF_CONNTRACK_FTP is not set
-# CONFIG_NF_CONNTRACK_H323 is not set
-# CONFIG_NF_CONNTRACK_IPV4 is not set
-# CONFIG_NF_CONNTRACK_IPV6 is not set
-# CONFIG_NF_CONNTRACK_IRC is not set
-# CONFIG_NF_CONNTRACK is not set
-CONFIG_NF_CONNTRACK_MARK=y
-# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
-# CONFIG_NF_CONNTRACK_PPTP is not set
-CONFIG_NF_CONNTRACK_PROC_COMPAT=y
-# CONFIG_NF_CONNTRACK_RTSP is not set
-# CONFIG_NF_CONNTRACK_SANE is not set
-# CONFIG_NF_CONNTRACK_SIP is not set
-CONFIG_NF_CONNTRACK_SUPPORT=y
-# CONFIG_NF_CONNTRACK_TFTP is not set
-# CONFIG_NF_CT_ACCT is not set
-# CONFIG_NF_CT_NETLINK is not set
-# CONFIG_NF_CT_PROTO_DCCP is not set
-# CONFIG_NF_CT_PROTO_GRE is not set
-# CONFIG_NF_CT_PROTO_SCTP is not set
-# CONFIG_NF_CT_PROTO_UDPLITE is not set
-# CONFIG_NF_DEFRAG_IPV4 is not set
-# CONFIG_NF_NAT_AMANDA is not set
-# CONFIG_NF_NAT_FTP is not set
-# CONFIG_NF_NAT_H323 is not set
-# CONFIG_NF_NAT_IRC is not set
-# CONFIG_NF_NAT is not set
-CONFIG_NF_NAT_NEEDED=y
-# CONFIG_NF_NAT_PPTP is not set
-# CONFIG_NF_NAT_PROTO_GRE is not set
-# CONFIG_NF_NAT_RTSP is not set
-# CONFIG_NF_NAT_SIP is not set
-# CONFIG_NF_NAT_SNMP_BASIC is not set
-# CONFIG_NF_NAT_TFTP is not set
-# CONFIG_NFS_ACL_SUPPORT is not set
-CONFIG_NFS_COMMON=y
-# CONFIG_NFS_DIRECTIO is not set
-# CONFIG_NFSD is not set
-CONFIG_NFSD_TCP=y
-# CONFIG_NFSD_V2_ACL is not set
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V4 is not set
-# CONFIG_NFS_FS is not set
-# CONFIG_NFS_V3_ACL is not set
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V4_1 is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFTL is not set
-# CONFIG_NILFS2_FS is not set
-CONFIG_NL80211=y
-CONFIG_NLATTR=y
-# CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-# CONFIG_NO_HZ is not set
-# CONFIG_NOP_USB_XCEIV is not set
-# CONFIG_NORTEL_HERMES is not set
-# CONFIG_NOZOMI is not set
-# CONFIG_NS83820 is not set
-# CONFIG_NTFS_DEBUG is not set
-# CONFIG_NTFS_FS is not set
-# CONFIG_NTFS_RW is not set
-# CONFIG_NVRAM is not set
-# CONFIG_OC_ETM is not set
-# CONFIG_OCF_BENCH is not set
-# CONFIG_OCF_EP80579 is not set
-# CONFIG_OCF_HIFNHIPP is not set
-# CONFIG_OCF_HIFN is not set
-# CONFIG_OCF_IXP4XX is not set
-# CONFIG_OCF_OCF is not set
-# CONFIG_OCF_OCFNULL is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_OCF_SAFE is not set
-# CONFIG_OCF_TALITOS is not set
-# CONFIG_OMFS_FS is not set
-# CONFIG_ORION_WATCHDOG is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_P54_COMMON is not set
-CONFIG_PACKET_MMAP=y
-CONFIG_PACKET=y
-# CONFIG_PAGE_POISONING is not set
-# CONFIG_PAGE_SIZE_16KB is not set
-# CONFIG_PAGE_SIZE_32KB is not set
-CONFIG_PAGE_SIZE_4KB=y
-# CONFIG_PAGE_SIZE_64KB is not set
-# CONFIG_PAGE_SIZE_8KB is not set
-# CONFIG_PANTHERLORD_FF is not set
-# CONFIG_PARPORT is not set
-# CONFIG_PARPORT_PC is not set
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_PATA_ALI is not set
-# CONFIG_PATA_AMD is not set
-# CONFIG_PATA_ARTOP is not set
-# CONFIG_PATA_ATIIXP is not set
-# CONFIG_PATA_ATP867X is not set
-# CONFIG_PATA_CMD640_PCI is not set
-# CONFIG_PATA_CMD64X is not set
-# CONFIG_PATA_CS5520 is not set
-# CONFIG_PATA_CS5530 is not set
-# CONFIG_PATA_CS5535 is not set
-# CONFIG_PATA_CS5536 is not set
-# CONFIG_PATA_CYPRESS is not set
-# CONFIG_PATA_EFAR is not set
-# CONFIG_PATA_HPT366 is not set
-# CONFIG_PATA_HPT37X is not set
-# CONFIG_PATA_HPT3X2N is not set
-# CONFIG_PATA_HPT3X3 is not set
-# CONFIG_PATA_ISAPNP is not set
-# CONFIG_PATA_IT8213 is not set
-# CONFIG_PATA_IT821X is not set
-# CONFIG_PATA_JMICRON is not set
-# CONFIG_PATA_LEGACY is not set
-# CONFIG_PATA_MARVELL is not set
-# CONFIG_PATA_MPIIX is not set
-# CONFIG_PATA_NETCELL is not set
-# CONFIG_PATA_NINJA32 is not set
-# CONFIG_PATA_NS87410 is not set
-# CONFIG_PATA_NS87415 is not set
-# CONFIG_PATA_OLDPIIX is not set
-# CONFIG_PATA_OPTIDMA is not set
-# CONFIG_PATA_OPTI is not set
-# CONFIG_PATA_PCMCIA is not set
-# CONFIG_PATA_PDC2027X is not set
-# CONFIG_PATA_PDC_OLD is not set
-# CONFIG_PATA_PLATFORM is not set
-# CONFIG_PATA_QDI is not set
-# CONFIG_PATA_RADISYS is not set
-# CONFIG_PATA_RDC is not set
-# CONFIG_PATA_RZ1000 is not set
-# CONFIG_PATA_SC1200 is not set
-# CONFIG_PATA_SCH is not set
-# CONFIG_PATA_SERVERWORKS is not set
-# CONFIG_PATA_SIL680 is not set
-# CONFIG_PATA_SIS is not set
-# CONFIG_PATA_TOSHIBA is not set
-# CONFIG_PATA_TRIFLEX is not set
-# CONFIG_PATA_VIA is not set
-# CONFIG_PATA_WINBOND is not set
-# CONFIG_PATA_WINBOND_VLB is not set
-# CONFIG_PC300TOO is not set
-# CONFIG_PCCARD is not set
-# CONFIG_PCF8575 is not set
-# CONFIG_PCI200SYN is not set
-# CONFIG_PCI_ATMEL is not set
-# CONFIG_PCI_DEBUG is not set
-# CONFIG_PCI_DISABLE_COMMON_QUIRKS is not set
-# CONFIG_PCIEAER_INJECT is not set
-# CONFIG_PCIEASPM is not set
-# CONFIG_PCIE_ECRC is not set
-# CONFIG_PCI_HERMES is not set
-# CONFIG_PCI_IOV is not set
-# CONFIG_PCI_LEGACY is not set
-# CONFIG_PCI_MSI is not set
-# CONFIG_PCIPCWATCHDOG is not set
-CONFIG_PCI_QUIRKS=y
-# CONFIG_PCI_STUB is not set
-CONFIG_PCI_SYSCALL=y
-CONFIG_PCI=y
-# CONFIG_PCMCIA_AHA152X is not set
-# CONFIG_PCMCIA_ATMEL is not set
-# CONFIG_PCMCIA_DEBUG is not set
-# CONFIG_PCMCIA_FDOMAIN is not set
-# CONFIG_PCMCIA_HERMES is not set
-# CONFIG_PCMCIA_IOCTL is not set
-# CONFIG_PCMCIA is not set
-# CONFIG_PCMCIA_LOAD_CIS is not set
-# CONFIG_PCMCIA_NETWAVE is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
-# CONFIG_PCMCIA_QLOGIC is not set
-# CONFIG_PCMCIA_RAYCS is not set
-# CONFIG_PCMCIA_SPECTRUM is not set
-# CONFIG_PCMCIA_SYM53C500 is not set
-# CONFIG_PCMCIA_WAVELAN is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_PCNET32 is not set
-# CONFIG_PCSPKR_PLATFORM is not set
-# CONFIG_PD6729 is not set
-# CONFIG_PDC_ADMA is not set
-# CONFIG_PERF_COUNTERS is not set
-# CONFIG_PERF_EVENTS is not set
-# CONFIG_PHANTOM is not set
-# CONFIG_PHONE is not set
-# CONFIG_PHONET is not set
-# CONFIG_PHYLIB is not set
-# CONFIG_PHYS_ADDR_T_64BIT is not set
-# CONFIG_PID_NS is not set
-# CONFIG_PLAN9AUTH is not set
-CONFIG_PLIST=y
-# CONFIG_PLX_HERMES is not set
-# CONFIG_PMIC_ADP5520 is not set
-# CONFIG_PMIC_DA903X is not set
-# CONFIG_PM is not set
-# CONFIG_POHMELFS is not set
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_POWER_SUPPLY is not set
-# CONFIG_PPC_16K_PAGES is not set
-# CONFIG_PPC_256K_PAGES is not set
-CONFIG_PPC_4K_PAGES=y
-CONFIG_PPC4xx_GPIO=y
-# CONFIG_PPC_64K_PAGES is not set
-# CONFIG_PPC_DISABLE_WERROR is not set
-# CONFIG_PPC_EMULATED_STATS is not set
-# CONFIG_PPP_ASYNC is not set
-# CONFIG_PPP_BSDCOMP is not set
-# CONFIG_PPP_DEFLATE is not set
-CONFIG_PPP_FILTER=y
-# CONFIG_PPP is not set
-# CONFIG_PPP_MPPE is not set
-CONFIG_PPP_MULTILINK=y
-# CONFIG_PPPOATM is not set
-# CONFIG_PPPOE is not set
-# CONFIG_PPPOL2TP is not set
-# CONFIG_PPP_SYNC_TTY is not set
-# CONFIG_PPS is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_RCU is not set
-# CONFIG_PREEMPT_RCU_TRACE is not set
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_TI_DAC7512 is not set
-CONFIG_TINY_RCU=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_PRINTK=y
-# CONFIG_PRISM2_USB is not set
-# CONFIG_PRISM54 is not set
-# CONFIG_PROBE_INITRD_HEADER is not set
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-# CONFIG_PROC_PAGE_MONITOR is not set
-CONFIG_PROC_SYSCTL=y
-# CONFIG_PROFILING is not set
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_QEMU is not set
-# CONFIG_QLA3XXX is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_QSEMI_PHY is not set
-# CONFIG_QT2160 is not set
-# CONFIG_QUOTA is not set
-# CONFIG_R3964 is not set
-# CONFIG_R6040 is not set
-# CONFIG_R8169 is not set
-# CONFIG_RADIO_ADAPTERS is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_GEMTEK_PCI is not set
-# CONFIG_RADIO_MAESTRO is not set
-# CONFIG_RADIO_MAXIRADIO is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_ZOLTRIX is not set
-# CONFIG_RAID_ATTRS is not set
-CONFIG_RAMFS=y
-# CONFIG_RAR_REGISTER is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-CONFIG_RCU_FANOUT=32
-# CONFIG_RCU_FANOUT_EXACT is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_RCU_TRACE is not set
-# CONFIG_RD_BZIP2 is not set
-# CONFIG_RDC_17F3101X is not set
-# CONFIG_RD_GZIP is not set
-CONFIG_RD_LZMA=y
-# CONFIG_RD_LZO is not set
-# CONFIG_RDS is not set
-# CONFIG_REALTEK_PHY is not set
-# CONFIG_REDWOOD is not set
-# CONFIG_REGULATOR_BQ24022 is not set
-# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
-# CONFIG_REGULATOR is not set
-# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_REISERFS_FS_XATTR is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-# CONFIG_RELAY is not set
-# CONFIG_RESOURCES_64BIT is not set
-# CONFIG_RFD_FTL is not set
-# CONFIG_RFKILL_INPUT is not set
-# CONFIG_RFKILL is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_ROSE is not set
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_RT2860 is not set
-# CONFIG_RT2870 is not set
-# CONFIG_RT2X00 is not set
-# CONFIG_RT3070 is not set
-# CONFIG_RT3090 is not set
-# CONFIG_RTC_CLASS is not set
-# CONFIG_RTC_DEBUG is not set
-# CONFIG_RTC_DRV_BQ32K is not set
-# CONFIG_RTC_DRV_BQ4802 is not set
-CONFIG_RTC_DRV_CMOS=y
-# CONFIG_RTC_DRV_DS1286 is not set
-# CONFIG_RTC_DRV_DS1305 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1374 is not set
-# CONFIG_RTC_DRV_DS1390 is not set
-# CONFIG_RTC_DRV_DS1511 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_DS3234 is not set
-# CONFIG_RTC_DRV_FM3130 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_M41T80 is not set
-# CONFIG_RTC_DRV_M41T94 is not set
-# CONFIG_RTC_DRV_M48T35 is not set
-# CONFIG_RTC_DRV_M48T59 is not set
-# CONFIG_RTC_DRV_M48T86 is not set
-# CONFIG_RTC_DRV_MAX6900 is not set
-# CONFIG_RTC_DRV_MAX6902 is not set
-# CONFIG_RTC_DRV_MSM6242 is not set
-# CONFIG_RTC_DRV_PCF2123 is not set
-# CONFIG_RTC_DRV_PCF50606 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_R9701 is not set
-# CONFIG_RTC_DRV_RP5C01 is not set
-# CONFIG_RTC_DRV_RS5C348 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-# CONFIG_RTC_DRV_RTC7301 is not set
-# CONFIG_RTC_DRV_RX8025 is not set
-# CONFIG_RTC_DRV_RX8581 is not set
-# CONFIG_RTC_DRV_S35390A is not set
-# CONFIG_RTC_DRV_STK17TA8 is not set
-# CONFIG_RTC_DRV_TEST is not set
-# CONFIG_RTC_DRV_V3020 is not set
-# CONFIG_RTC_DRV_X1205 is not set
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-CONFIG_RTC_HCTOSYS=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-CONFIG_RTC_INTF_DEV=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_LIB=y
-# CONFIG_RTL8180 is not set
-# CONFIG_RTL8187 is not set
-# CONFIG_RTL8187SE is not set
-# CONFIG_RTL8192E is not set
-# CONFIG_RTL8192U is not set
-# CONFIG_RTL8192SU is not set
-# CONFIG_RTL8306_PHY is not set
-# CONFIG_RTL8366_SMI is not set
-# CONFIG_RTL8366S_PHY_DEBUG_FS is not set
-# CONFIG_RTL8366S_PHY is not set
-# CONFIG_RTL8366RB_PHY is not set
-CONFIG_RT_MUTEXES=y
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_RUNTIME_DEBUG is not set
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-# CONFIG_S2IO is not set
-# CONFIG_SAMPLES is not set
-# CONFIG_SATA_AHCI is not set
-# CONFIG_SATA_INIC162X is not set
-# CONFIG_SATA_MV is not set
-# CONFIG_SATA_NV is not set
-# CONFIG_SATA_PMP is not set
-# CONFIG_SATA_PROMISE is not set
-# CONFIG_SATA_QSTOR is not set
-# CONFIG_SATA_SIL24 is not set
-# CONFIG_SATA_SIL is not set
-# CONFIG_SATA_SIS is not set
-# CONFIG_SATA_SVW is not set
-# CONFIG_SATA_SX4 is not set
-# CONFIG_SATA_ULI is not set
-# CONFIG_SATA_VIA is not set
-# CONFIG_SATA_VITESSE is not set
-# CONFIG_SBC_FITPC2_WATCHDOG is not set
-# CONFIG_SC92031 is not set
-# CONFIG_SCC is not set
-# CONFIG_SCHED_BFS is not set
-CONFIG_SCHED_CFS=y
-# CONFIG_SCHED_DEBUG is not set
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_SCHED_TRACER is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_3W_SAS is not set
-# CONFIG_SCSI_7000FASST is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC94XX is not set
-# CONFIG_SCSI_ARCMSR is not set
-# CONFIG_SCSI_BFA_FC is not set
-# CONFIG_SCSI_BNX2_ISCSI is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DEBUG is not set
-# CONFIG_SCSI_DH is not set
-CONFIG_SCSI_DMA=y
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DPT_I2O is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_ESP_CORE is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_HPSA is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
-CONFIG_SCSI_LOWLEVEL=y
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_MPT2SAS is not set
-CONFIG_SCSI_MULTI_LUN=y
-# CONFIG_SCSI_MVSAS is not set
-# CONFIG_SCSI_MVSAS_DEBUG is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_NETLINK is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_OSD_INITIATOR is not set
-# CONFIG_SCSI_PAS16 is not set
-# CONFIG_SCSI_PM8001 is not set
-# CONFIG_SCSI_PMCRAID is not set
-CONFIG_SCSI_PROC_FS=y
-# CONFIG_SCSI_PSI240I is not set
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_QLA_ISCSI is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-# CONFIG_SCSI_SEAGATE is not set
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_SRP_ATTRS is not set
-# CONFIG_SCSI_SRP is not set
-# CONFIG_SCSI_STEX is not set
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-CONFIG_SCSI_WAIT_SCAN=m
-# CONFIG_SECCOMP is not set
-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-# CONFIG_SECURITYFS is not set
-# CONFIG_SECURITY is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-# CONFIG_SENSORS_ABITUGURU3 is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_AD7414 is not set
-# CONFIG_SENSORS_AD7418 is not set
-# CONFIG_SENSORS_ADCXX is not set
-# CONFIG_SENSORS_ADM1021 is not set
-# CONFIG_SENSORS_ADM1025 is not set
-# CONFIG_SENSORS_ADM1026 is not set
-# CONFIG_SENSORS_ADM1029 is not set
-# CONFIG_SENSORS_ADM1031 is not set
-# CONFIG_SENSORS_ADM9240 is not set
-# CONFIG_SENSORS_ADS7828 is not set
-# CONFIG_SENSORS_ADT7462 is not set
-# CONFIG_SENSORS_ADT7470 is not set
-# CONFIG_SENSORS_ADT7473 is not set
-# CONFIG_SENSORS_ADT7475 is not set
-# CONFIG_SENSORS_AMC6821 is not set
-# CONFIG_SENSORS_APPLESMC is not set
-# CONFIG_SENSORS_ASB100 is not set
-# CONFIG_SENSORS_ATK0110 is not set
-# CONFIG_SENSORS_ATXP1 is not set
-# CONFIG_SENSORS_CORETEMP is not set
-# CONFIG_SENSORS_DME1737 is not set
-# CONFIG_SENSORS_DS1337 is not set
-# CONFIG_SENSORS_DS1374 is not set
-# CONFIG_SENSORS_DS1621 is not set
-# CONFIG_SENSORS_EEPROM is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_F71882FG is not set
-# CONFIG_SENSORS_F75375S is not set
-# CONFIG_SENSORS_FSCHER is not set
-# CONFIG_SENSORS_FSCHMD is not set
-# CONFIG_SENSORS_FSCPOS is not set
-# CONFIG_SENSORS_G760A is not set
-# CONFIG_SENSORS_GL518SM is not set
-# CONFIG_SENSORS_GL520SM is not set
-# CONFIG_SENSORS_HDAPS is not set
-# CONFIG_SENSORS_I5K_AMB is not set
-# CONFIG_SENSORS_IT87 is not set
-# CONFIG_SENSORS_K8TEMP is not set
-# CONFIG_SENSORS_LIS3LV02D is not set
-# CONFIG_SENSORS_LIS3_I2C is not set
-# CONFIG_SENSORS_LIS3_SPI is not set
-# CONFIG_SENSORS_LM63 is not set
-# CONFIG_SENSORS_LM70 is not set
-# CONFIG_SENSORS_LM73 is not set
-# CONFIG_SENSORS_LM75 is not set
-# CONFIG_SENSORS_LM77 is not set
-# CONFIG_SENSORS_LM78 is not set
-# CONFIG_SENSORS_LM80 is not set
-# CONFIG_SENSORS_LM83 is not set
-# CONFIG_SENSORS_LM85 is not set
-# CONFIG_SENSORS_LM87 is not set
-# CONFIG_SENSORS_LM90 is not set
-# CONFIG_SENSORS_LM92 is not set
-# CONFIG_SENSORS_LM93 is not set
-# CONFIG_SENSORS_LM95241 is not set
-# CONFIG_SENSORS_LTC4215 is not set
-# CONFIG_SENSORS_LTC4245 is not set
-# CONFIG_SENSORS_M41T00 is not set
-# CONFIG_SENSORS_MAX1111 is not set
-# CONFIG_SENSORS_MAX1619 is not set
-# CONFIG_SENSORS_MAX6650 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_SENSORS_PC87360 is not set
-# CONFIG_SENSORS_PC87427 is not set
-# CONFIG_SENSORS_PCA9539 is not set
-# CONFIG_SENSORS_PCF8574 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_SHT15 is not set
-# CONFIG_SENSORS_SIS5595 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_SMSC47M192 is not set
-# CONFIG_SENSORS_SMSC47M1 is not set
-# CONFIG_SENSORS_THMC50 is not set
-# CONFIG_SENSORS_TMP401 is not set
-# CONFIG_SENSORS_TMP421 is not set
-# CONFIG_SENSORS_TSL2550 is not set
-# CONFIG_SENSORS_VIA686A is not set
-# CONFIG_SENSORS_VT1211 is not set
-# CONFIG_SENSORS_VT8231 is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83781D is not set
-# CONFIG_SENSORS_W83791D is not set
-# CONFIG_SENSORS_W83792D is not set
-# CONFIG_SENSORS_W83793 is not set
-# CONFIG_SENSORS_W83L785TS is not set
-# CONFIG_SENSORS_W83L786NG is not set
-CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_SERIAL_8250_CS is not set
-CONFIG_SERIAL_8250_NR_UARTS=2
-# CONFIG_SERIAL_8250_PCI is not set
-CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-# CONFIG_SERIAL_JSM is not set
-# CONFIG_SERIAL_MAX3100 is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set
-# CONFIG_SERIAL_UARTLITE is not set
-# CONFIG_SERIO is not set
-# CONFIG_SFI is not set
-# CONFIG_SGI_IOC4 is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_SHAPER is not set
-CONFIG_SHMEM=y
-CONFIG_SIGNALFD=y
-# CONFIG_SIMPLE_GPIO is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SIS900 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2_DEBUG is not set
-# CONFIG_SKY2 is not set
-CONFIG_SLABINFO=y
-CONFIG_SLAB=y
-# CONFIG_SLHC is not set
-# CONFIG_SLICOSS is not set
-# CONFIG_SLIP is not set
-# CONFIG_SLOB is not set
-# CONFIG_SLOW_WORK_DEBUG is not set
-# CONFIG_SLOW_WORK is not set
-# CONFIG_SLUB_DEBUG is not set
-# CONFIG_SLUB is not set
-# CONFIG_SMARTJOYPLUS_FF is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_SMB_NLS_DEFAULT is not set
-# CONFIG_SMC911X is not set
-# CONFIG_SMC91X is not set
-# CONFIG_SMP is not set
-# CONFIG_SMSC911X is not set
-# CONFIG_SMSC9420 is not set
-# CONFIG_SMSC_PHY is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ADLIB is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALS4000 is not set
-# CONFIG_SND_ARM is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AW2 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_CS5530 is not set
-# CONFIG_SND_CS5535AUDIO is not set
-# CONFIG_SND_CTXFI is not set
-# CONFIG_SND_DARLA20 is not set
-# CONFIG_SND_DARLA24 is not set
-# CONFIG_SND_DEBUG is not set
-CONFIG_SND_DRIVERS=y
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_DYNAMIC_MINORS is not set
-# CONFIG_SND_ECHO3G is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_GINA20 is not set
-# CONFIG_SND_GINA24 is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_HIFIER is not set
-# CONFIG_SND_HRTIMER is not set
-# CONFIG_SND_HWDEP is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-# CONFIG_SND_INDIGODJ is not set
-# CONFIG_SND_INDIGODJX is not set
-# CONFIG_SND_INDIGOIO is not set
-# CONFIG_SND_INDIGOIOX is not set
-# CONFIG_SND_INDIGO is not set
-# CONFIG_SND_INTEL8X0 is not set
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_ISA is not set
-# CONFIG_SND is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_LAYLA20 is not set
-# CONFIG_SND_LAYLA24 is not set
-# CONFIG_SND_LX6464ES is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIA is not set
-# CONFIG_SND_MIPS is not set
-# CONFIG_SND_MIRO is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_MIXER_OSS is not set
-# CONFIG_SND_MONA is not set
-# CONFIG_SND_MPU401 is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-CONFIG_SND_OSSEMUL=y
-# CONFIG_SND_OXYGEN is not set
-CONFIG_SND_PCI=y
-# CONFIG_SND_PCMCIA is not set
-# CONFIG_SND_PCM is not set
-# CONFIG_SND_PCM_OSS is not set
-CONFIG_SND_PCM_OSS_PLUGINS=y
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_PDAUDIOCF is not set
-# CONFIG_SND_RAWMIDI is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RTCTIMER is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SEQUENCER is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_SIS7019 is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SOC is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_SPI is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_SND_SUPPORT_OLD_API is not set
-# CONFIG_SND_TIMER is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_CAIAQ is not set
-# CONFIG_SND_USB_US122L is not set
-# CONFIG_SND_USB_USX2Y is not set
-CONFIG_SND_USB=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VIRTUOSO is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_WAVEFRONT is not set
-# CONFIG_SND_YMFPCI is not set
-# CONFIG_SNI_RM is not set
-# CONFIG_SOC_CAMERA is not set
-# CONFIG_SOFT_WATCHDOG is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_SONYPI is not set
-# CONFIG_SONY_LAPTOP is not set
-# CONFIG_SOUND is not set
-# CONFIG_SOUND_PRIME is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_STATIC is not set
-# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-# CONFIG_SPI_AT25 is not set
-# CONFIG_SPI_DEBUG is not set
-# CONFIG_SPI_DESIGNWARE is not set
-# CONFIG_SPI_GPIO_OLD is not set
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-# CONFIG_SPI_ORION is not set
-# CONFIG_SPI_TLE62X0 is not set
-# CONFIG_SPI_XILINX is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-CONFIG_SQUASHFS_LZMA=y
-CONFIG_SQUASHFS_SUPPORT_ZLIB=y
-# CONFIG_SQUASHFS_VMALLOC is not set
-CONFIG_SQUASHFS=y
-# CONFIG_SSB_BLOCKIO is not set
-# CONFIG_SSB_DEBUG is not set
-# CONFIG_SSB is not set
-# CONFIG_SSB_PCMCIAHOST is not set
-CONFIG_SSB_POSSIBLE=y
-# CONFIG_SSB_SDIOHOST is not set
-# CONFIG_SSB_SILENT is not set
-# CONFIG_SSFDC is not set
-# CONFIG_STACK_TRACER is not set
-CONFIG_STACKTRACE_SUPPORT=y
-# CONFIG_STAGING_EXCLUDE_BUILD is not set
-CONFIG_STAGING=y
-CONFIG_STANDALONE=y
-CONFIG_STDBINUTILS=y
-# CONFIG_STE10XP is not set
-CONFIG_STP=y
-CONFIG_STRIP_ASM_SYMS=y
-# CONFIG_STRIP is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_SUNRPC_BIND34 is not set
-# CONFIG_SUNRPC_GSS is not set
-# CONFIG_SUNRPC is not set
-# CONFIG_SUNRPC_REGISTER_V4 is not set
-CONFIG_SUSPEND_UP_POSSIBLE=y
-CONFIG_SWAP=y
-# CONFIG_SWCONFIG is not set
-# CONFIG_SYNCLINK_CS is not set
-CONFIG_SYN_COOKIES=y
-CONFIG_SYSCTL_SYSCALL_CHECK=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_SYSCTL=y
-# CONFIG_SYSFS_DEPRECATED is not set
-# CONFIG_SYSFS_DEPRECATED_V2 is not set
-CONFIG_SYSFS=y
-# CONFIG_SYS_HYPERVISOR is not set
-# CONFIG_SYSV68_PARTITION is not set
-# CONFIG_SYSV_FS is not set
-CONFIG_SYSVIPC_SYSCTL=y
-CONFIG_SYSVIPC=y
-# CONFIG_TASKSTATS is not set
-# CONFIG_TCG_TPM is not set
-# CONFIG_TCIC is not set
-CONFIG_TCP_CONG_ADVANCED=y
-# CONFIG_TCP_CONG_BIC is not set
-# CONFIG_TCP_CONG_CUBIC is not set
-# CONFIG_TCP_CONG_HSTCP is not set
-# CONFIG_TCP_CONG_HTCP is not set
-# CONFIG_TCP_CONG_HYBLA is not set
-# CONFIG_TCP_CONG_ILLINOIS is not set
-# CONFIG_TCP_CONG_LP is not set
-# CONFIG_TCP_CONG_SCALABLE is not set
-# CONFIG_TCP_CONG_VEGAS is not set
-# CONFIG_TCP_CONG_VENO is not set
-CONFIG_TCP_CONG_WESTWOOD=y
-# CONFIG_TCP_CONG_YEAH is not set
-# CONFIG_TCP_MD5SIG is not set
-# CONFIG_TEXTSEARCH_BM is not set
-# CONFIG_TEXTSEARCH_FSM is not set
-# CONFIG_TEXTSEARCH_KMP is not set
-CONFIG_TEXTSEARCH=y
-# CONFIG_THERMAL_HWMON is not set
-# CONFIG_THERMAL is not set
-# CONFIG_THRUSTMASTER_FF is not set
-CONFIG_TICK_ONESHOT=y
-# CONFIG_TIFM_CORE is not set
-# CONFIG_TIGON3 is not set
-CONFIG_TIMERFD=y
-# CONFIG_TINY_SHMEM is not set
-# CONFIG_TIPC is not set
-# CONFIG_TLAN is not set
-# CONFIG_TMD_HERMES is not set
-# CONFIG_TMPFS_POSIX_ACL is not set
-CONFIG_TMPFS=y
-# CONFIG_TOUCHSCREEN_AD7877 is not set
-# CONFIG_TOUCHSCREEN_AD7879_I2C is not set
-# CONFIG_TOUCHSCREEN_AD7879 is not set
-# CONFIG_TOUCHSCREEN_AD7879_SPI is not set
-# CONFIG_TOUCHSCREEN_ADS7846 is not set
-# CONFIG_TOUCHSCREEN_EETI is not set
-# CONFIG_TOUCHSCREEN_ELO is not set
-# CONFIG_TOUCHSCREEN_FILTER is not set
-# 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_PENMOUNT is not set
-# CONFIG_TOUCHSCREEN_S3C2410 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_W90X900 is not set
-# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
-# CONFIG_TPS65010 is not set
-# CONFIG_TRACE_BRANCH_PROFILING is not set
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-CONFIG_TRACING_SUPPORT=y
-# CONFIG_TRANZPORT is not set
-# CONFIG_TREE_RCU is not set
-# CONFIG_TREE_RCU_TRACE is not set
-# CONFIG_TR is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_TUNER_TEA5761 is not set
-# CONFIG_TUN is not set
-# CONFIG_TWL4030_CORE is not set
-# CONFIG_UACCESS_WITH_MEMCPY is not set
-# CONFIG_UDF_FS is not set
-CONFIG_UDF_NLS=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-# CONFIG_UFS_FS is not set
-# CONFIG_UIO is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_UNEVICTABLE_LRU is not set
-# CONFIG_UNION_MOUNT is not set
-CONFIG_UNIX98_PTYS=y
-# CONFIG_UNIXWARE_DISKLABEL is not set
-CONFIG_UNIX=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_USB_ACECAD is not set
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_ADUTUX is not set
-# CONFIG_USB_AIPTEK is not set
-CONFIG_USB_ALI_M5632=y
-CONFIG_USB_AN2720=y
-# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_APPLETOUCH is not set
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARMLINUX=y
-# CONFIG_USB_ATI_REMOTE2 is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_ATMEL is not set
-# CONFIG_USB_ATM is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_BANDWIDTH is not set
-CONFIG_USB_BELKIN=y
-# CONFIG_USB_BERRY_CHARGE is not set
-# CONFIG_USB_C67X00_HCD is not set
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_CPC is not set
-# CONFIG_USB_CXACRU is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_DABUSB is not set
-# CONFIG_USB_DEBUG is not set
-# CONFIG_USB_DEVICE_CLASS is not set
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_DSBR is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_EHCI_HCD_PPC_OF is not set
-CONFIG_USB_EHCI_ROOT_HUB_TT=y
-# CONFIG_USB_EHCI_SPLIT_ISO is not set
-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EPSON2888 is not set
-# CONFIG_USB_ET61X251 is not set
-CONFIG_USB_EZUSB=y
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_GADGET is not set
-# CONFIG_USB_GADGET_DEBUG is not set
-# CONFIG_USB_GL860 is not set
-# CONFIG_USB_GPIO_VBUS is not set
-# CONFIG_USB_GSPCA_CONEX is not set
-# CONFIG_USB_GSPCA_ETOMS is not set
-# CONFIG_USB_GSPCA_FINEPIX is not set
-# CONFIG_USB_GSPCA is not set
-# CONFIG_USB_GSPCA_JEILINJ is not set
-# CONFIG_USB_GSPCA_MARS is not set
-# CONFIG_USB_GSPCA_MR97310A is not set
-# CONFIG_USB_GSPCA_OV519 is not set
-# CONFIG_USB_GSPCA_OV534 is not set
-# CONFIG_USB_GSPCA_PAC207 is not set
-# CONFIG_USB_GSPCA_PAC7302 is not set
-# CONFIG_USB_GSPCA_PAC7311 is not set
-CONFIG_USB_GSPCA_SN9C20X_EVDEV=y
-# CONFIG_USB_GSPCA_SN9C20X is not set
-# CONFIG_USB_GSPCA_SONIXB is not set
-# CONFIG_USB_GSPCA_SONIXJ is not set
-# CONFIG_USB_GSPCA_SPCA500 is not set
-# CONFIG_USB_GSPCA_SPCA501 is not set
-# CONFIG_USB_GSPCA_SPCA505 is not set
-# CONFIG_USB_GSPCA_SPCA506 is not set
-# CONFIG_USB_GSPCA_SPCA508 is not set
-# CONFIG_USB_GSPCA_SPCA561 is not set
-# CONFIG_USB_GSPCA_SQ905C is not set
-# CONFIG_USB_GSPCA_SQ905 is not set
-# CONFIG_USB_GSPCA_STK014 is not set
-# CONFIG_USB_GSPCA_STV0680 is not set
-# CONFIG_USB_GSPCA_SUNPLUS is not set
-# CONFIG_USB_GSPCA_T613 is not set
-# CONFIG_USB_GSPCA_TV8532 is not set
-# CONFIG_USB_GSPCA_VC032X is not set
-# CONFIG_USB_GSPCA_ZC3XX is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HID is not set
-# CONFIG_USB_HSO is not set
-# CONFIG_USB_HWA_HCD is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_IOWARRIOR is not set
-# CONFIG_USB_IP_COMMON is not set
-# CONFIG_USB_ISIGHTFW is not set
-# CONFIG_USB is not set
-# CONFIG_USB_ISP116X_HCD is not set
-# CONFIG_USB_ISP1362_HCD is not set
-# CONFIG_USB_ISP1760_HCD is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_KBTAB is not set
-# CONFIG_USB_KC2190 is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LIBUSUAL is not set
-# CONFIG_USB_M5602 is not set
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-# CONFIG_USB_MON is not set
-# CONFIG_USB_MOUSE is not set
-# CONFIG_USB_MUSB_HDRC is not set
-# CONFIG_USB_NET_AX8817X is not set
-# CONFIG_USB_NET_CDC_EEM is not set
-# CONFIG_USB_NET_CDCETHER is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_DM9601 is not set
-# CONFIG_USB_NET_GL620A is not set
-# CONFIG_USB_NET_INT51X1 is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_NET1080 is not set
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_RNDIS_WLAN is not set
-# CONFIG_USB_NET_SMSC95XX is not set
-# CONFIG_USB_NET_ZAURUS is not set
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-# CONFIG_USB_OHCI_HCD is not set
-# CONFIG_USB_OHCI_HCD_PCI is not set
-# CONFIG_USB_OHCI_HCD_PPC_OF is not set
-# CONFIG_USB_OHCI_HCD_PPC_SOC is not set
-# CONFIG_USB_OHCI_HCD_SSB is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-# CONFIG_USB_OTG_BLACKLIST_HUB is not set
-# CONFIG_USB_OTG is not set
-# CONFIG_USB_OTG_WHITELIST is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_OXU210HP_HCD is not set
-# CONFIG_USBPCWATCHDOG is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_PHIDGET is not set
-# CONFIG_USB_POWERMATE is not set
-# CONFIG_USB_PRINTER is not set
-# CONFIG_USB_PWC_INPUT_EVDEV is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_R8A66597_HCD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_S2255 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SERIAL_AIRCABLE is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-# CONFIG_USB_SERIAL_BELKIN is not set
-# CONFIG_USB_SERIAL_CH341 is not set
-# CONFIG_USB_SERIAL_CP2101 is not set
-# CONFIG_USB_SERIAL_CP210X is not set
-# CONFIG_USB_SERIAL_CYBERJACK is not set
-# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
-# CONFIG_USB_SERIAL_DEBUG is not set
-# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
-# CONFIG_USB_SERIAL_EMPEG is not set
-# CONFIG_USB_SERIAL_FTDI_SIO is not set
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-# CONFIG_USB_SERIAL_GARMIN is not set
-CONFIG_USB_SERIAL_GENERIC=y
-# CONFIG_USB_SERIAL_HP4X is not set
-# CONFIG_USB_SERIAL_IPAQ is not set
-# CONFIG_USB_SERIAL_IPW is not set
-# CONFIG_USB_SERIAL_IR is not set
-# CONFIG_USB_SERIAL is not set
-# CONFIG_USB_SERIAL_IUU is not set
-# CONFIG_USB_SERIAL_KEYSPAN is not set
-CONFIG_USB_SERIAL_KEYSPAN_MPR=y
-# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
-CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
-# CONFIG_USB_SERIAL_KLSI is not set
-# CONFIG_USB_SERIAL_KOBIL_SCT is not set
-# CONFIG_USB_SERIAL_MCT_U232 is not set
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 is not set
-# CONFIG_USB_SERIAL_MOTOROLA is not set
-# CONFIG_USB_SERIAL_NAVMAN is not set
-# CONFIG_USB_SERIAL_OMNINET is not set
-# CONFIG_USB_SERIAL_OPTICON is not set
-# CONFIG_USB_SERIAL_OPTION is not set
-# CONFIG_USB_SERIAL_OTI6858 is not set
-# CONFIG_USB_SERIAL_PL2303 is not set
-# CONFIG_USB_SERIAL_QUALCOMM is not set
-# CONFIG_USB_SERIAL_QUATECH2 is not set
-# CONFIG_USB_SERIAL_QUATECH_USB2 is not set
-# CONFIG_USB_SERIAL_SAFE is not set
-CONFIG_USB_SERIAL_SAFE_PADDED=y
-# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-# CONFIG_USB_SERIAL_SPCP8X5 is not set
-# CONFIG_USB_SERIAL_SYMBOL is not set
-# CONFIG_USB_SERIAL_TI is not set
-# CONFIG_USB_SERIAL_VISOR is not set
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-# CONFIG_USB_SERIAL_XIRCOM is not set
-# CONFIG_USB_SEVSEG is not set
-# CONFIG_USB_SISUSBVGA is not set
-# CONFIG_USB_SL811_HCD is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_SPEEDTOUCH is not set
-# CONFIG_USB_STKWEBCAM is not set
-CONFIG_USB_STORAGE_ALAUDA=y
-# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
-CONFIG_USB_STORAGE_DATAFAB=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-CONFIG_USB_STORAGE_DPCM=y
-CONFIG_USB_STORAGE_FREECOM=y
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE is not set
-CONFIG_USB_STORAGE_JUMPSHOT=y
-CONFIG_USB_STORAGE_KARMA=y
-# CONFIG_USB_STORAGE_ONETOUCH is not set
-CONFIG_USB_STORAGE_SDDR09=y
-CONFIG_USB_STORAGE_SDDR55=y
-# CONFIG_USB_STORAGE_SIERRA is not set
-CONFIG_USB_STORAGE_USBAT=y
-# CONFIG_USB_STV06XX is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_SUPPORT is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_TEST is not set
-# CONFIG_USB_TMC is not set
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_UEAGLEATM is not set
-# CONFIG_USB_ULPI is not set
-# CONFIG_USB_USBNET is not set
-# CONFIG_USB_USBNET_MII is not set
-# CONFIG_USB_VICAM is not set
-CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
-# CONFIG_USB_VIDEO_CLASS is not set
-# CONFIG_USB_VST is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_WACOM is not set
-# CONFIG_USB_WDM is not set
-# CONFIG_USB_WHCI_HCD is not set
-# CONFIG_USB_WUSB_CBAF is not set
-# CONFIG_USB_WUSB is not set
-# CONFIG_USB_XHCI_HCD is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_XUSBATM is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_ZD1201 is not set
-# CONFIG_USB_ZR364XX is not set
-# CONFIG_USE_GENERIC_SMP_HELPERS is not set
-# CONFIG_UTS_NS is not set
-# CONFIG_UWB is not set
-# CONFIG_VETH is not set
-# CONFIG_VFAT_FS is not set
-# CONFIG_VGA_ARB is not set
-# CONFIG_VGASTATE is not set
-# CONFIG_VIA_RHINE is not set
-# CONFIG_VIA_VELOCITY is not set
-# CONFIG_VIDEO_ADV7170 is not set
-# CONFIG_VIDEO_ADV7175 is not set
-# CONFIG_VIDEO_ADV7180 is not set
-# CONFIG_VIDEO_ADV7343 is not set
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# CONFIG_VIDEO_ALLOW_V4L1 is not set
-# CONFIG_VIDEO_BT819 is not set
-# CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_BT856 is not set
-# CONFIG_VIDEO_BT866 is not set
-# CONFIG_VIDEO_CAFE_CCIC is not set
-# CONFIG_VIDEO_CAPTURE_DRIVERS is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CS5345 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_CX231XX is not set
-# CONFIG_VIDEO_CX2341X is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_CX88 is not set
-# CONFIG_VIDEO_DEV is not set
-# CONFIG_VIDEO_DPC is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
-# CONFIG_VIDEO_GO7007 is not set
-# CONFIG_VIDEO_HDPVR is not set
-# CONFIG_VIDEO_HELPER_CHIPS_AUTO is not set
-# CONFIG_VIDEO_HEXIUM_GEMINI is not set
-# CONFIG_VIDEO_HEXIUM_ORION is not set
-# CONFIG_VIDEO_IR_I2C is not set
-# CONFIG_VIDEO_IVTV is not set
-# CONFIG_VIDEO_KS0127 is not set
-# CONFIG_VIDEO_M52790 is not set
-# CONFIG_VIDEO_MEDIA is not set
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_MT9V011 is not set
-# CONFIG_VIDEO_MXB is not set
-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-# CONFIG_VIDEO_OV7670 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_VIDEO_PMS is not set
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_VIDEO_SAA6588 is not set
-# CONFIG_VIDEO_SAA7110 is not set
-# CONFIG_VIDEO_SAA7111 is not set
-# CONFIG_VIDEO_SAA7114 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_SAA7134 is not set
-# CONFIG_VIDEO_SAA717X is not set
-# CONFIG_VIDEO_SAA7185 is not set
-# CONFIG_VIDEO_SAA7191 is not set
-# CONFIG_VIDEO_SH_MOBILE_CEU is not set
-# CONFIG_VIDEO_STRADIS is not set
-# CONFIG_VIDEO_TCM825X is not set
-# CONFIG_VIDEO_TDA7432 is not set
-# CONFIG_VIDEO_TDA9840 is not set
-# CONFIG_VIDEO_TDA9875 is not set
-# CONFIG_VIDEO_TEA6415C is not set
-# CONFIG_VIDEO_TEA6420 is not set
-# CONFIG_VIDEO_THS7303 is not set
-# CONFIG_VIDEO_TLV320AIC23B is not set
-# CONFIG_VIDEO_TVAUDIO is not set
-# CONFIG_VIDEO_TVP514X is not set
-# CONFIG_VIDEO_TVP5150 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-# CONFIG_VIDEO_USBVISION is not set
-CONFIG_VIDEO_V4L1_COMPAT=y
-# CONFIG_VIDEO_V4L1 is not set
-# CONFIG_VIDEO_V4L2_COMMON is not set
-# CONFIG_VIDEO_V4L2 is not set
-# CONFIG_VIDEO_VIVI is not set
-# CONFIG_VIDEO_VP27SMPX is not set
-# CONFIG_VIDEO_VPX3220 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIRQ_DEBUG is not set
-CONFIG_VIRT_TO_BUS=y
-# CONFIG_VIRTUALIZATION is not set
-# CONFIG_VITESSE_PHY is not set
-# CONFIG_VLAN_8021Q_GVRP is not set
-CONFIG_VLAN_8021Q=y
-# CONFIG_VME_BUS is not set
-# CONFIG_VM_EVENT_COUNTERS is not set
-# CONFIG_VMSPLIT_1G is not set
-# CONFIG_VMSPLIT_2G is not set
-# CONFIG_VMSPLIT_2G_OPT is not set
-# CONFIG_VMSPLIT_3G_OPT is not set
-CONFIG_VMSPLIT_3G=y
-# CONFIG_VMXNET3 is not set
-# CONFIG_VT6655 is not set
-# CONFIG_VT6656 is not set
-# CONFIG_VT is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_W1_CON is not set
-# CONFIG_W1 is not set
-# CONFIG_W1_MASTER_DS1WM is not set
-# CONFIG_W1_MASTER_DS2482 is not set
-# CONFIG_W1_MASTER_DS2490 is not set
-# CONFIG_W1_MASTER_GPIO is not set
-# CONFIG_W1_MASTER_MATROX is not set
-# CONFIG_W1_SLAVE_BQ27000 is not set
-# CONFIG_W1_SLAVE_DS2431 is not set
-# CONFIG_W1_SLAVE_DS2433 is not set
-# CONFIG_W1_SLAVE_DS2760 is not set
-# CONFIG_W1_SLAVE_SMEM is not set
-# CONFIG_W1_SLAVE_THERM is not set
-# CONFIG_W83627HF_WDT is not set
-# CONFIG_W83697HF_WDT is not set
-# CONFIG_W83877F_WDT is not set
-# CONFIG_W83977F_WDT is not set
-# CONFIG_WAN is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_WANXL is not set
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-CONFIG_WATCHDOG=y
-# CONFIG_WDTPCI is not set
-# CONFIG_WIMAX is not set
-CONFIG_WIRELESS_EXT_SYSFS=y
-CONFIG_WIRELESS_EXT=y
-CONFIG_WIRELESS_OLD_REGULATORY=y
-CONFIG_WIRELESS=y
-CONFIG_WLAN_80211=y
-# CONFIG_WLAN_PRE80211 is not set
-CONFIG_WLAN=y
-# CONFIG_WORKQUEUE_TRACER is not set
-# CONFIG_WR_PPMC is not set
-CONFIG_WEXT_CORE=y
-CONFIG_WEXT_PROC=y
-CONFIG_WEXT_PRIV=y
-CONFIG_WEXT_SPY=y
-# CONFIG_X25 is not set
-# CONFIG_XFRM_IPCOMP is not set
-# CONFIG_XFRM_MIGRATE is not set
-# CONFIG_XFRM_STATISTICS is not set
-# CONFIG_XFRM_SUB_POLICY is not set
-# CONFIG_XFRM_USER is not set
-CONFIG_XFRM=y
-# CONFIG_XFS_DEBUG is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_XFS_POSIX_ACL is not set
-# CONFIG_XFS_QUOTA is not set
-# CONFIG_XFS_RT is not set
-# CONFIG_XFS_SECURITY is not set
-# CONFIG_XILINX_EMACLITE is not set
-# CONFIG_XILINX_LL_TEMAC is not set
-# CONFIG_XIP_KERNEL is not set
-# CONFIG_YAFFS_FS is not set
-# CONFIG_YAM is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_YENTA is not set
-# CONFIG_YENTA_O2 is not set
-# CONFIG_YENTA_RICOH is not set
-# CONFIG_YENTA_TI is not set
-# CONFIG_YENTA_TOSHIBA is not set
-# CONFIG_ZD1211RW_DEBUG is not set
-# CONFIG_ZD1211RW is not set
-# CONFIG_ZEROPLUS_FF is not set
-# CONFIG_ZISOFS_FS is not set
-CONFIG_ZISOFS=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZONE_DMA_FLAG=1
-CONFIG_ZONE_DMA=y
-CONFIG_DEFAULT_SECURITY_DAC=y
-CONFIG_DEFAULT_SECURITY=""
-# CONFIG_NETFILTER_XT_TARGET_CT is not set
+++ /dev/null
-/*
- * character device wrapper for generic gpio layer
- *
- * 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, MA02111-1307USA
- *
- * Feedback, Bugs... blogic@openwrt.org
- *
- */
-
-#include <linux/module.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/gpio.h>
-#include <asm/atomic.h>
-#include <linux/init.h>
-#include <linux/genhd.h>
-#include <linux/device.h>
-#include <linux/platform_device.h>
-#include <linux/gpio_dev.h>
-
-#define DRVNAME "gpiodev"
-#define DEVNAME "gpio"
-
-static int dev_major;
-static unsigned int gpio_access_mask;
-static struct class *gpiodev_class;
-
-/* Counter is 1, if the device is not opened and zero (or less) if opened. */
-static atomic_t gpio_open_cnt = ATOMIC_INIT(1);
-
-static int
-gpio_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg)
-{
- int retval = 0;
-
- if (((1 << arg) & gpio_access_mask) != (1 << arg))
- {
- retval = -EINVAL;
- goto out;
- }
-
- switch (cmd)
- {
- case GPIO_GET:
- retval = gpio_get_value(arg);
- break;
-
- case GPIO_SET:
- gpio_set_value(arg, 1);
- break;
-
- case GPIO_CLEAR:
- gpio_set_value(arg, 0);
- break;
-
- case GPIO_DIR_IN:
- gpio_direction_input(arg);
- break;
-
- case GPIO_DIR_OUT:
- gpio_direction_output(arg, 0);
- break;
-
- default:
- retval = -EINVAL;
- break;
- }
-
-out:
- return retval;
-}
-
-static int
-gpio_open(struct inode *inode, struct file *file)
-{
- int result = 0;
- unsigned int dev_minor = MINOR(inode->i_rdev);
-
- if (dev_minor != 0)
- {
- printk(KERN_ERR DRVNAME ": trying to access unknown minor device -> %d\n", dev_minor);
- result = -ENODEV;
- goto out;
- }
-
- /* FIXME: We should really allow multiple applications to open the device
- * at the same time, as long as the apps access different IO pins.
- * The generic gpio-registration functions can be used for that.
- * Two new IOCTLs have to be introduced for that. Need to check userspace
- * compatibility first. --mb */
- if (!atomic_dec_and_test(&gpio_open_cnt)) {
- atomic_inc(&gpio_open_cnt);
- printk(KERN_ERR DRVNAME ": Device with minor ID %d already in use\n", dev_minor);
- result = -EBUSY;
- goto out;
- }
-
-out:
- return result;
-}
-
-static int
-gpio_close(struct inode * inode, struct file * file)
-{
- smp_mb__before_atomic_inc();
- atomic_inc(&gpio_open_cnt);
-
- return 0;
-}
-
-struct file_operations gpio_fops = {
- ioctl: gpio_ioctl,
- open: gpio_open,
- release: gpio_close
-};
-
-static int
-gpio_probe(struct platform_device *dev)
-{
- int result = 0;
-
- dev_major = register_chrdev(0, DEVNAME, &gpio_fops);
- if (!dev_major)
- {
- printk(KERN_ERR DRVNAME ": Error whilst opening %s \n", DEVNAME);
- result = -ENODEV;
- goto out;
- }
-
- gpiodev_class = class_create(THIS_MODULE, DRVNAME);
- class_device_create(gpiodev_class, NULL, MKDEV(dev_major, 0), NULL, DEVNAME);
-
- printk(KERN_INFO DRVNAME ": gpio device registered with major %d\n", dev_major);
-
- if (dev->num_resources != 1)
- {
- printk(KERN_ERR DRVNAME ": device may only have 1 resource\n");
- result = -ENODEV;
- goto out;
- }
-
- gpio_access_mask = dev->resource[0].start;
-
- printk(KERN_INFO DRVNAME ": gpio platform device registered with access mask %08X\n", gpio_access_mask);
-out:
- return result;
-}
-
-static int
-gpio_remove(struct platform_device *dev)
-{
- unregister_chrdev(dev_major, DEVNAME);
- return 0;
-}
-
-static struct
-platform_driver gpio_driver = {
- .probe = gpio_probe,
- .remove = gpio_remove,
- .driver = {
- .name = "GPIODEV",
- .owner = THIS_MODULE,
- },
-};
-
-static int __init
-gpio_mod_init(void)
-{
- int ret = platform_driver_register(&gpio_driver);
- if (ret)
- printk(KERN_INFO DRVNAME ": Error registering platfom driver!");
-
- return ret;
-}
-
-static void __exit
-gpio_mod_exit(void)
-{
- platform_driver_unregister(&gpio_driver);
-}
-
-module_init (gpio_mod_init);
-module_exit (gpio_mod_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("John Crispin / OpenWrt");
-MODULE_DESCRIPTION("Character device for for generic gpio api");
+++ /dev/null
-/*
- * Driver for buttons on GPIO lines not capable of generating interrupts
- *
- * Copyright (C) 2007,2008 Gabor Juhos <juhosg at openwrt.org>
- *
- * This file was based on: /drivers/input/misc/cobalt_btns.c
- * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
- *
- * also was based on: /drivers/input/keyboard/gpio_keys.c
- * Copyright 2005 Phil Blundell
- *
- * This program is free software; you can 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/init.h>
-
-#include <linux/input.h>
-#include <linux/input-polldev.h>
-#include <linux/ioport.h>
-#include <linux/platform_device.h>
-
-#include <linux/gpio_buttons.h>
-
-#include <asm/gpio.h>
-
-#define DRV_NAME "gpio-buttons"
-#define DRV_VERSION "0.1.1"
-#define PFX DRV_NAME ": "
-
-struct gpio_buttons_dev {
- struct input_polled_dev *poll_dev;
- struct gpio_buttons_platform_data *pdata;
-};
-
-static void gpio_buttons_poll(struct input_polled_dev *dev)
-{
- struct gpio_buttons_dev *bdev = dev->private;
- struct gpio_buttons_platform_data *pdata = bdev->pdata;
- struct input_dev *input = dev->input;
- int i;
-
- for (i = 0; i < bdev->pdata->nbuttons; i++) {
- struct gpio_button *button = &pdata->buttons[i];
- unsigned int type = button->type ?: EV_KEY;
- int state;
-
- state = gpio_get_value(button->gpio) ? 1 : 0;
- state ^= button->active_low;
-
- if (state) {
- button->count++;
- } else {
- if (button->count >= button->threshold) {
- input_event(input, type, button->code, 1);
- input_sync(input);
- }
- button->count = 0;
- }
-
- if (button->count == button->threshold) {
- input_event(input, type, button->code, 0);
- input_sync(input);
- }
- }
-}
-
-static int __devinit gpio_buttons_probe(struct platform_device *pdev)
-{
- struct gpio_buttons_platform_data *pdata = pdev->dev.platform_data;
- struct gpio_buttons_dev *bdev;
- struct input_polled_dev *poll_dev;
- struct input_dev *input;
- int error, i;
-
-
- if (!pdata)
- return -ENXIO;
-
- bdev = kzalloc(sizeof(*bdev), GFP_KERNEL);
- if (!bdev) {
- printk(KERN_ERR DRV_NAME "no memory for device\n");
- return -ENOMEM;
- }
-
- poll_dev = input_allocate_polled_device();
- if (!poll_dev) {
- printk(KERN_ERR DRV_NAME "no memory for polled device\n");
- error = -ENOMEM;
- goto err_free_bdev;
- }
-
- poll_dev->private = bdev;
- poll_dev->poll = gpio_buttons_poll;
- poll_dev->poll_interval = pdata->poll_interval;
-
- input = poll_dev->input;
-
- input->evbit[0] = BIT(EV_KEY);
- input->name = pdev->name;
- input->phys = "gpio-buttons/input0";
- input->dev.parent = &pdev->dev;
-
- input->id.bustype = BUS_HOST;
- input->id.vendor = 0x0001;
- input->id.product = 0x0001;
- input->id.version = 0x0100;
-
- for (i = 0; i < pdata->nbuttons; i++) {
- struct gpio_button *button = &pdata->buttons[i];
- unsigned int gpio = button->gpio;
- unsigned int type = button->type ?: EV_KEY;
-
- error = gpio_request(gpio, button->desc ?
- button->desc : DRV_NAME);
- if (error) {
- printk(KERN_ERR PFX "unable to claim gpio %u, "
- "error %d\n", gpio, error);
- goto err_free_gpio;
- }
-
- error = gpio_direction_input(gpio);
- if (error) {
- printk(KERN_ERR PFX "unable to set direction on "
- "gpio %u, error %d\n", gpio, error);
- goto err_free_gpio;
- }
-
- input_set_capability(input, type, button->code);
- button->count = 0;
- }
-
- bdev->poll_dev = poll_dev;
- bdev->pdata = pdata;
- platform_set_drvdata(pdev, bdev);
-
- error = input_register_polled_device(poll_dev);
- if (error) {
- printk(KERN_ERR PFX "unable to register polled device, "
- "error %d\n", error);
- goto err_free_gpio;
- }
-
- return 0;
-
-err_free_gpio:
- for (i = i - 1; i >= 0; i--)
- gpio_free(pdata->buttons[i].gpio);
-
- input_free_polled_device(poll_dev);
-
-err_free_bdev:
- kfree(bdev);
-
- platform_set_drvdata(pdev, NULL);
- return error;
-}
-
-static int __devexit gpio_buttons_remove(struct platform_device *pdev)
-{
- struct gpio_buttons_dev *bdev = platform_get_drvdata(pdev);
- struct gpio_buttons_platform_data *pdata = bdev->pdata;
- int i;
-
- input_unregister_polled_device(bdev->poll_dev);
-
- for (i = 0; i < pdata->nbuttons; i++)
- gpio_free(pdata->buttons[i].gpio);
-
- input_free_polled_device(bdev->poll_dev);
-
- kfree(bdev);
- platform_set_drvdata(pdev, NULL);
-
- return 0;
-}
-
-static struct platform_driver gpio_buttons_driver = {
- .probe = gpio_buttons_probe,
- .remove = __devexit_p(gpio_buttons_remove),
- .driver = {
- .name = DRV_NAME,
- .owner = THIS_MODULE,
- },
-};
-
-static int __init gpio_buttons_init(void)
-{
- printk(KERN_INFO DRV_NAME " driver version " DRV_VERSION "\n");
- return platform_driver_register(&gpio_buttons_driver);
-}
-
-static void __exit gpio_buttons_exit(void)
-{
- platform_driver_unregister(&gpio_buttons_driver);
-}
-
-module_init(gpio_buttons_init);
-module_exit(gpio_buttons_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Gabor Juhos <juhosg at openwrt.org>");
-MODULE_VERSION(DRV_VERSION);
-MODULE_DESCRIPTION("Polled buttons driver for CPU GPIOs");
-
+++ /dev/null
-/*
- * LED Kernel Default ON Trigger
- *
- * Copyright 2008 Nick Forbes <nick.forbes@incepta.com>
- *
- * Based on Richard Purdie's ledtrig-timer.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 <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/leds.h>
-#include "leds.h"
-
-static void defon_trig_activate(struct led_classdev *led_cdev)
-{
- led_set_brightness(led_cdev, LED_FULL);
-}
-
-static struct led_trigger defon_led_trigger = {
- .name = "default-on",
- .activate = defon_trig_activate,
-};
-
-static int __init defon_trig_init(void)
-{
- return led_trigger_register(&defon_led_trigger);
-}
-
-static void __exit defon_trig_exit(void)
-{
- led_trigger_unregister(&defon_led_trigger);
-}
-
-module_init(defon_trig_init);
-module_exit(defon_trig_exit);
-
-MODULE_AUTHOR("Nick Forbes <nick.forbes@incepta.com>");
-MODULE_DESCRIPTION("Default-ON LED trigger");
-MODULE_LICENSE("GPL");
+++ /dev/null
-/*
- * LED Morse Trigger
- *
- * Copyright (C) 2007 Gabor Juhos <juhosg at openwrt.org>
- *
- * This file was based on: drivers/led/ledtrig-timer.c
- * Copyright 2005-2006 Openedhand Ltd.
- * Author: Richard Purdie <rpurdie@openedhand.com>
- *
- * also based on the patch '[PATCH] 2.5.59 morse code panics' posted
- * in the LKML by Tomas Szepe at Thu, 30 Jan 2003
- * Copyright (C) 2002 Andrew Rodland <arodland@noln.com>
- * Copyright (C) 2003 Tomas Szepe <szepe@pinerecords.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/version.h>
-#include <linux/module.h>
-#include <linux/jiffies.h>
-#include <linux/init.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include <linux/device.h>
-#include <linux/sysdev.h>
-#include <linux/timer.h>
-#include <linux/ctype.h>
-#include <linux/leds.h>
-
-#include "leds.h"
-
-#define MORSE_DELAY_BASE (HZ/2)
-
-#define MORSE_STATE_BLINK_START 0
-#define MORSE_STATE_BLINK_STOP 1
-
-#define MORSE_DIT_LEN 1
-#define MORSE_DAH_LEN 3
-#define MORSE_SPACE_LEN 7
-
-struct morse_trig_data {
- unsigned long delay;
- char *msg;
-
- unsigned char morse;
- unsigned char state;
- char *msgpos;
- struct timer_list timer;
-};
-
-const unsigned char morsetable[] = {
- 0122, 0, 0310, 0, 0, 0163, /* "#$%&' */
- 055, 0155, 0, 0, 0163, 0141, 0152, 0051, /* ()*+,-./ */
- 077, 076, 074, 070, 060, 040, 041, 043, 047, 057, /* 0-9 */
- 0107, 0125, 0, 0061, 0, 0114, 0, /* :;<=>?@ */
- 006, 021, 025, 011, 002, 024, 013, 020, 004, /* A-I */
- 036, 015, 022, 007, 005, 017, 026, 033, 012, /* J-R */
- 010, 003, 014, 030, 016, 031, 035, 023, /* S-Z */
- 0, 0, 0, 0, 0154 /* [\]^_ */
-};
-
-static inline unsigned char tomorse(char c) {
- if (c >= 'a' && c <= 'z')
- c = c - 'a' + 'A';
- if (c >= '"' && c <= '_') {
- return morsetable[c - '"'];
- } else
- return 0;
-}
-
-static inline unsigned long dit_len(struct morse_trig_data *morse_data)
-{
- return MORSE_DIT_LEN*morse_data->delay;
-}
-
-static inline unsigned long dah_len(struct morse_trig_data *morse_data)
-{
- return MORSE_DAH_LEN*morse_data->delay;
-}
-
-static inline unsigned long space_len(struct morse_trig_data *morse_data)
-{
- return MORSE_SPACE_LEN*morse_data->delay;
-}
-
-static void morse_timer_function(unsigned long data)
-{
- struct led_classdev *led_cdev = (struct led_classdev *)data;
- struct morse_trig_data *morse_data = led_cdev->trigger_data;
- unsigned long brightness = LED_OFF;
- unsigned long delay = 0;
-
- if (!morse_data->msg)
- goto set_led;
-
- switch (morse_data->state) {
- case MORSE_STATE_BLINK_START:
- /* Starting a new blink. We have a valid code in morse. */
- delay = (morse_data->morse & 001) ? dah_len(morse_data):
- dit_len(morse_data);
- brightness = LED_FULL;
- morse_data->state = MORSE_STATE_BLINK_STOP;
- morse_data->morse >>= 1;
- break;
- case MORSE_STATE_BLINK_STOP:
- /* Coming off of a blink. */
- morse_data->state = MORSE_STATE_BLINK_START;
-
- if (morse_data->morse > 1) {
- /* Not done yet, just a one-dit pause. */
- delay = dit_len(morse_data);
- break;
- }
-
- /* Get a new char, figure out how much space. */
- /* First time through */
- if (!morse_data->msgpos)
- morse_data->msgpos = (char *)morse_data->msg;
-
- if (!*morse_data->msgpos) {
- /* Repeating */
- morse_data->msgpos = (char *)morse_data->msg;
- delay = space_len(morse_data);
- } else {
- /* Inter-letter space */
- delay = dah_len(morse_data);
- }
-
- if (!(morse_data->morse = tomorse(*morse_data->msgpos))) {
- delay = space_len(morse_data);
- /* And get us back here */
- morse_data->state = MORSE_STATE_BLINK_STOP;
- }
- morse_data->msgpos++;
- break;
- }
-
- mod_timer(&morse_data->timer, jiffies + msecs_to_jiffies(delay));
-
-set_led:
- led_set_brightness(led_cdev, brightness);
-}
-
-static ssize_t _morse_delay_show(struct led_classdev *led_cdev, char *buf)
-{
- struct morse_trig_data *morse_data = led_cdev->trigger_data;
-
- sprintf(buf, "%lu\n", morse_data->delay);
-
- return strlen(buf) + 1;
-}
-
-static ssize_t _morse_delay_store(struct led_classdev *led_cdev,
- const char *buf, size_t size)
-{
- struct morse_trig_data *morse_data = led_cdev->trigger_data;
- char *after;
- unsigned long state = simple_strtoul(buf, &after, 10);
- size_t count = after - buf;
- int ret = -EINVAL;
-
- if (*after && isspace(*after))
- count++;
-
- if (count == size) {
- morse_data->delay = state;
- mod_timer(&morse_data->timer, jiffies + 1);
- ret = count;
- }
-
- return ret;
-}
-
-static ssize_t _morse_msg_show(struct led_classdev *led_cdev, char *buf)
-{
- struct morse_trig_data *morse_data = led_cdev->trigger_data;
-
- if (!morse_data->msg)
- sprintf(buf, "<none>\n");
- else
- sprintf(buf, "%s\n", morse_data->msg);
-
- return strlen(buf) + 1;
-}
-
-static ssize_t _morse_msg_store(struct led_classdev *led_cdev,
- const char *buf, size_t size)
-{
- struct morse_trig_data *morse_data = led_cdev->trigger_data;
- char *m;
-
- m = kmalloc(size, GFP_KERNEL);
- if (!m)
- return -ENOMEM;
-
- memcpy(m,buf,size);
- m[size]='\0';
-
- if (morse_data->msg)
- kfree(morse_data->msg);
-
- morse_data->msg = m;
- morse_data->msgpos = NULL;
- morse_data->state = MORSE_STATE_BLINK_STOP;
-
- mod_timer(&morse_data->timer, jiffies + 1);
-
- return size;
-}
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
-static ssize_t morse_delay_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct led_classdev *led_cdev = dev_get_drvdata(dev);
-
- return _morse_delay_show(led_cdev, buf);
-}
-
-static ssize_t morse_delay_store(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
-{
- struct led_classdev *led_cdev = dev_get_drvdata(dev);
-
- return _morse_delay_store(led_cdev, buf, size);
-}
-
-static ssize_t morse_msg_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct led_classdev *led_cdev = dev_get_drvdata(dev);
-
- return _morse_msg_show(led_cdev, buf);
-}
-
-static ssize_t morse_msg_store(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
-{
- struct led_classdev *led_cdev = dev_get_drvdata(dev);
-
- return _morse_msg_store(led_cdev, buf, size);
-}
-
-static DEVICE_ATTR(delay, 0644, morse_delay_show, morse_delay_store);
-static DEVICE_ATTR(message, 0644, morse_msg_show, morse_msg_store);
-
-#define led_device_create_file(leddev, attr) \
- device_create_file(leddev->dev, &dev_attr_ ## attr)
-#define led_device_remove_file(leddev, attr) \
- device_remove_file(leddev->dev, &dev_attr_ ## attr)
-
-#else
-static ssize_t morse_delay_show(struct class_device *dev, char *buf)
-{
- struct led_classdev *led_cdev = class_get_devdata(dev);
-
- return _morse_delay_show(led_cdev, buf);
-}
-
-static ssize_t morse_delay_store(struct class_device *dev, const char *buf,
- size_t size)
-{
- struct led_classdev *led_cdev = class_get_devdata(dev);
-
- return _morse_delay_store(led_cdev, buf, size);
-}
-
-static ssize_t morse_msg_show(struct class_device *dev, char *buf)
-{
- struct led_classdev *led_cdev = class_get_devdata(dev);
-
- return _morse_msg_show(led_cdev, buf);
-}
-
-static ssize_t morse_msg_store(struct class_device *dev, const char *buf,
- size_t size)
-{
- struct led_classdev *led_cdev = class_get_devdata(dev);
-
- return _morse_msg_store(led_cdev, buf, size);
-}
-
-static CLASS_DEVICE_ATTR(delay, 0644, morse_delay_show, morse_delay_store);
-static CLASS_DEVICE_ATTR(message, 0644, morse_msg_show, morse_msg_store);
-
-#define led_device_create_file(leddev, attr) \
- class_device_create_file(leddev->class_dev, &class_device_attr_ ## attr)
-#define led_device_remove_file(leddev, attr) \
- class_device_remove_file(leddev->class_dev, &class_device_attr_ ## attr)
-
-#endif
-
-static void morse_trig_activate(struct led_classdev *led_cdev)
-{
- struct morse_trig_data *morse_data;
- int rc;
-
- morse_data = kzalloc(sizeof(*morse_data), GFP_KERNEL);
- if (!morse_data)
- return;
-
- morse_data->delay = MORSE_DELAY_BASE;
- init_timer(&morse_data->timer);
- morse_data->timer.function = morse_timer_function;
- morse_data->timer.data = (unsigned long)led_cdev;
-
- rc = led_device_create_file(led_cdev, delay);
- if (rc) goto err;
-
- rc = led_device_create_file(led_cdev, message);
- if (rc) goto err_delay;
-
- led_cdev->trigger_data = morse_data;
-
- return;
-
-err_delay:
- led_device_remove_file(led_cdev, delay);
-err:
- kfree(morse_data);
-}
-
-static void morse_trig_deactivate(struct led_classdev *led_cdev)
-{
- struct morse_trig_data *morse_data = led_cdev->trigger_data;
-
- if (!morse_data)
- return;
-
- led_device_remove_file(led_cdev, message);
- led_device_remove_file(led_cdev, delay);
-
- del_timer_sync(&morse_data->timer);
- if (morse_data->msg)
- kfree(morse_data->msg);
-
- kfree(morse_data);
-}
-
-static struct led_trigger morse_led_trigger = {
- .name = "morse",
- .activate = morse_trig_activate,
- .deactivate = morse_trig_deactivate,
-};
-
-static int __init morse_trig_init(void)
-{
- return led_trigger_register(&morse_led_trigger);
-}
-
-static void __exit morse_trig_exit(void)
-{
- led_trigger_unregister(&morse_led_trigger);
-}
-
-module_init(morse_trig_init);
-module_exit(morse_trig_exit);
-
-MODULE_AUTHOR("Gabor Juhos <juhosg at openwrt.org>");
-MODULE_DESCRIPTION("Morse LED trigger");
-MODULE_LICENSE("GPL");
+++ /dev/null
-/*
- * LED Kernel Netdev Trigger
- *
- * Toggles the LED to reflect the link and traffic state of a named net device
- *
- * Copyright 2007 Oliver Jowett <oliver@opencloud.com>
- *
- * Derived from ledtrig-timer.c which is:
- * Copyright 2005-2006 Openedhand Ltd.
- * Author: Richard Purdie <rpurdie@openedhand.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/module.h>
-#include <linux/jiffies.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include <linux/device.h>
-#include <linux/sysdev.h>
-#include <linux/netdevice.h>
-#include <linux/timer.h>
-#include <linux/ctype.h>
-#include <linux/leds.h>
-#include "leds.h"
-
-/*
- * Configurable sysfs attributes:
- *
- * device_name - network device name to monitor
- *
- * interval - duration of LED blink, in milliseconds
- *
- * mode - either "none" (LED is off) or a space separated list of one or more of:
- * link: LED's normal state reflects whether the link is up (has carrier) or not
- * tx: LED blinks on transmitted data
- * rx: LED blinks on receive data
- *
- * Some suggestions:
- *
- * Simple link status LED:
- * $ echo netdev >someled/trigger
- * $ echo eth0 >someled/device_name
- * $ echo link >someled/mode
- *
- * Ethernet-style link/activity LED:
- * $ echo netdev >someled/trigger
- * $ echo eth0 >someled/device_name
- * $ echo "link tx rx" >someled/mode
- *
- * Modem-style tx/rx LEDs:
- * $ echo netdev >led1/trigger
- * $ echo ppp0 >led1/device_name
- * $ echo tx >led1/mode
- * $ echo netdev >led2/trigger
- * $ echo ppp0 >led2/device_name
- * $ echo rx >led2/mode
- *
- */
-
-#define MODE_LINK 1
-#define MODE_TX 2
-#define MODE_RX 4
-
-struct led_netdev_data {
- rwlock_t lock;
-
- struct timer_list timer;
- struct notifier_block notifier;
-
- struct led_classdev *led_cdev;
- struct net_device *net_dev;
-
- char device_name[IFNAMSIZ];
- unsigned interval;
- unsigned mode;
- unsigned link_up;
- unsigned last_activity;
-};
-
-static void set_baseline_state(struct led_netdev_data *trigger_data)
-{
- if ((trigger_data->mode & MODE_LINK) != 0 && trigger_data->link_up)
- led_set_brightness(trigger_data->led_cdev, LED_FULL);
- else
- led_set_brightness(trigger_data->led_cdev, LED_OFF);
-
- if ((trigger_data->mode & (MODE_TX | MODE_RX)) != 0 && trigger_data->link_up)
- mod_timer(&trigger_data->timer, jiffies + trigger_data->interval);
- else
- del_timer(&trigger_data->timer);
-}
-
-static ssize_t led_device_name_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct led_classdev *led_cdev = dev_get_drvdata(dev);
- struct led_netdev_data *trigger_data = led_cdev->trigger_data;
-
- read_lock(&trigger_data->lock);
- sprintf(buf, "%s\n", trigger_data->device_name);
- read_unlock(&trigger_data->lock);
-
- return strlen(buf) + 1;
-}
-
-static ssize_t led_device_name_store(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
-{
- struct led_classdev *led_cdev = dev_get_drvdata(dev);
- struct led_netdev_data *trigger_data = led_cdev->trigger_data;
-
- if (size < 0 || size >= IFNAMSIZ)
- return -EINVAL;
-
- write_lock(&trigger_data->lock);
-
- strcpy(trigger_data->device_name, buf);
- if (size > 0 && trigger_data->device_name[size-1] == '\n')
- trigger_data->device_name[size-1] = 0;
-
- if (trigger_data->device_name[0] != 0) {
- /* check for existing device to update from */
- trigger_data->net_dev = dev_get_by_name(trigger_data->device_name);
- if (trigger_data->net_dev != NULL)
- trigger_data->link_up = (dev_get_flags(trigger_data->net_dev) & IFF_LOWER_UP) != 0;
- set_baseline_state(trigger_data); /* updates LEDs, may start timers */
- }
-
- write_unlock(&trigger_data->lock);
- return size;
-}
-
-static DEVICE_ATTR(device_name, 0644, led_device_name_show, led_device_name_store);
-
-static ssize_t led_mode_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct led_classdev *led_cdev = dev_get_drvdata(dev);
- struct led_netdev_data *trigger_data = led_cdev->trigger_data;
-
- read_lock(&trigger_data->lock);
-
- if (trigger_data->mode == 0) {
- strcpy(buf, "none\n");
- } else {
- if (trigger_data->mode & MODE_LINK)
- strcat(buf, "link ");
- if (trigger_data->mode & MODE_TX)
- strcat(buf, "tx ");
- if (trigger_data->mode & MODE_RX)
- strcat(buf, "rx ");
- strcat(buf, "\n");
- }
-
- read_unlock(&trigger_data->lock);
-
- return strlen(buf)+1;
-}
-
-static ssize_t led_mode_store(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
-{
- struct led_classdev *led_cdev = dev_get_drvdata(dev);
- struct led_netdev_data *trigger_data = led_cdev->trigger_data;
- char copybuf[1024];
- int new_mode = -1;
- char *p, *token;
-
- /* take a copy since we don't want to trash the inbound buffer when using strsep */
- strncpy(copybuf, buf, sizeof(copybuf));
- copybuf[1023] = 0;
- p = copybuf;
-
- while ((token = strsep(&p, " \t\n")) != NULL) {
- if (!*token)
- continue;
-
- if (new_mode == -1)
- new_mode = 0;
-
- if (!strcmp(token, "none"))
- new_mode = 0;
- else if (!strcmp(token, "tx"))
- new_mode |= MODE_TX;
- else if (!strcmp(token, "rx"))
- new_mode |= MODE_RX;
- else if (!strcmp(token, "link"))
- new_mode |= MODE_LINK;
- else
- return -EINVAL;
- }
-
- if (new_mode == -1)
- return -EINVAL;
-
- write_lock(&trigger_data->lock);
- trigger_data->mode = new_mode;
- set_baseline_state(trigger_data);
- write_unlock(&trigger_data->lock);
-
- return size;
-}
-
-static DEVICE_ATTR(mode, 0644, led_mode_show, led_mode_store);
-
-static ssize_t led_interval_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct led_classdev *led_cdev = dev_get_drvdata(dev);
- struct led_netdev_data *trigger_data = led_cdev->trigger_data;
-
- read_lock(&trigger_data->lock);
- sprintf(buf, "%u\n", jiffies_to_msecs(trigger_data->interval));
- read_unlock(&trigger_data->lock);
-
- return strlen(buf) + 1;
-}
-
-static ssize_t led_interval_store(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t size)
-{
- struct led_classdev *led_cdev = dev_get_drvdata(dev);
- struct led_netdev_data *trigger_data = led_cdev->trigger_data;
- int ret = -EINVAL;
- char *after;
- unsigned long value = simple_strtoul(buf, &after, 10);
- size_t count = after - buf;
-
- if (*after && isspace(*after))
- count++;
-
- /* impose some basic bounds on the timer interval */
- if (count == size && value >= 5 && value <= 10000) {
- write_lock(&trigger_data->lock);
- trigger_data->interval = msecs_to_jiffies(value);
- set_baseline_state(trigger_data); // resets timer
- write_unlock(&trigger_data->lock);
- ret = count;
- }
-
- return ret;
-}
-
-static DEVICE_ATTR(interval, 0644, led_interval_show, led_interval_store);
-
-static int netdev_trig_notify(struct notifier_block *nb,
- unsigned long evt,
- void *dv)
-{
- struct net_device *dev = dv;
- struct led_netdev_data *trigger_data = container_of(nb, struct led_netdev_data, notifier);
-
- if (evt != NETDEV_UP && evt != NETDEV_DOWN && evt != NETDEV_CHANGE && evt != NETDEV_REGISTER && evt != NETDEV_UNREGISTER)
- return NOTIFY_DONE;
-
- write_lock(&trigger_data->lock);
-
- if (strcmp(dev->name, trigger_data->device_name))
- goto done;
-
- if (evt == NETDEV_REGISTER) {
- if (trigger_data->net_dev != NULL)
- dev_put(trigger_data->net_dev);
- dev_hold(dev);
- trigger_data->net_dev = dev;
- trigger_data->link_up = 0;
- goto done;
- }
-
- if (evt == NETDEV_UNREGISTER && trigger_data->net_dev != NULL) {
- dev_put(trigger_data->net_dev);
- trigger_data->net_dev = NULL;
- goto done;
- }
-
- /* UP / DOWN / CHANGE */
-
- trigger_data->link_up = (evt != NETDEV_DOWN && netif_carrier_ok(dev));
- set_baseline_state(trigger_data);
-
-done:
- write_unlock(&trigger_data->lock);
- return NOTIFY_DONE;
-}
-
-/* here's the real work! */
-static void netdev_trig_timer(unsigned long arg)
-{
- struct led_netdev_data *trigger_data = (struct led_netdev_data *)arg;
- struct net_device_stats *dev_stats;
- unsigned new_activity;
-
- write_lock(&trigger_data->lock);
-
- if (!trigger_data->link_up || !trigger_data->net_dev || (trigger_data->mode & (MODE_TX | MODE_RX)) == 0) {
- /* we don't need to do timer work, just reflect link state. */
- led_set_brightness(trigger_data->led_cdev, ((trigger_data->mode & MODE_LINK) != 0 && trigger_data->link_up) ? LED_FULL : LED_OFF);
- goto no_restart;
- }
-
- dev_stats = trigger_data->net_dev->get_stats(trigger_data->net_dev);
- new_activity =
- ((trigger_data->mode & MODE_TX) ? dev_stats->tx_packets : 0) +
- ((trigger_data->mode & MODE_RX) ? dev_stats->rx_packets : 0);
-
- if (trigger_data->mode & MODE_LINK) {
- /* base state is ON (link present) */
- /* if there's no link, we don't get this far and the LED is off */
-
- /* OFF -> ON always */
- /* ON -> OFF on activity */
- if (trigger_data->led_cdev->brightness == LED_OFF) {
- led_set_brightness(trigger_data->led_cdev, LED_FULL);
- } else if (trigger_data->last_activity != new_activity) {
- led_set_brightness(trigger_data->led_cdev, LED_OFF);
- }
- } else {
- /* base state is OFF */
- /* ON -> OFF always */
- /* OFF -> ON on activity */
- if (trigger_data->led_cdev->brightness == LED_FULL) {
- led_set_brightness(trigger_data->led_cdev, LED_OFF);
- } else if (trigger_data->last_activity != new_activity) {
- led_set_brightness(trigger_data->led_cdev, LED_FULL);
- }
- }
-
- trigger_data->last_activity = new_activity;
- mod_timer(&trigger_data->timer, jiffies + trigger_data->interval);
-
-no_restart:
- write_unlock(&trigger_data->lock);
-}
-
-static void netdev_trig_activate(struct led_classdev *led_cdev)
-{
- struct led_netdev_data *trigger_data;
- int rc;
-
- trigger_data = kzalloc(sizeof(struct led_netdev_data), GFP_KERNEL);
- if (!trigger_data)
- return;
-
- rwlock_init(&trigger_data->lock);
-
- trigger_data->notifier.notifier_call = netdev_trig_notify;
- trigger_data->notifier.priority = 10;
-
- setup_timer(&trigger_data->timer, netdev_trig_timer, (unsigned long) trigger_data);
-
- trigger_data->led_cdev = led_cdev;
- trigger_data->net_dev = NULL;
- trigger_data->device_name[0] = 0;
-
- trigger_data->mode = 0;
- trigger_data->interval = msecs_to_jiffies(50);
- trigger_data->link_up = 0;
- trigger_data->last_activity = 0;
-
- led_cdev->trigger_data = trigger_data;
-
- rc = device_create_file(led_cdev->dev, &dev_attr_device_name);
- if (rc)
- goto err_out;
- rc = device_create_file(led_cdev->dev, &dev_attr_mode);
- if (rc)
- goto err_out_device_name;
- rc = device_create_file(led_cdev->dev, &dev_attr_interval);
- if (rc)
- goto err_out_mode;
-
- register_netdevice_notifier(&trigger_data->notifier);
- return;
-
-err_out_mode:
- device_remove_file(led_cdev->dev, &dev_attr_mode);
-err_out_device_name:
- device_remove_file(led_cdev->dev, &dev_attr_device_name);
-err_out:
- led_cdev->trigger_data = NULL;
- kfree(trigger_data);
-}
-
-static void netdev_trig_deactivate(struct led_classdev *led_cdev)
-{
- struct led_netdev_data *trigger_data = led_cdev->trigger_data;
-
- if (trigger_data) {
- unregister_netdevice_notifier(&trigger_data->notifier);
-
- device_remove_file(led_cdev->dev, &dev_attr_device_name);
- device_remove_file(led_cdev->dev, &dev_attr_mode);
- device_remove_file(led_cdev->dev, &dev_attr_interval);
-
- write_lock(&trigger_data->lock);
-
- if (trigger_data->net_dev) {
- dev_put(trigger_data->net_dev);
- trigger_data->net_dev = NULL;
- }
-
- write_unlock(&trigger_data->lock);
-
- del_timer_sync(&trigger_data->timer);
-
- kfree(trigger_data);
- }
-}
-
-static struct led_trigger netdev_led_trigger = {
- .name = "netdev",
- .activate = netdev_trig_activate,
- .deactivate = netdev_trig_deactivate,
-};
-
-static int __init netdev_trig_init(void)
-{
- return led_trigger_register(&netdev_led_trigger);
-}
-
-static void __exit netdev_trig_exit(void)
-{
- led_trigger_unregister(&netdev_led_trigger);
-}
-
-module_init(netdev_trig_init);
-module_exit(netdev_trig_exit);
-
-MODULE_AUTHOR("Oliver Jowett <oliver@opencloud.com>");
-MODULE_DESCRIPTION("Netdev LED trigger");
-MODULE_LICENSE("GPL");
+++ /dev/null
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -1367,6 +1367,71 @@ config CRAMFS
-
- If unsure, say N.
-
-+config SQUASHFS
-+ tristate "SquashFS 3.0 - Squashed file system support"
-+ select ZLIB_INFLATE
-+ help
-+ Saying Y here includes support for SquashFS 3.0 (a Compressed Read-Only File
-+ System). Squashfs is a highly compressed read-only filesystem for Linux.
-+ It uses zlib compression to compress both files, inodes and directories.
-+ Inodes in the system are very small and all blocks are packed to minimise
-+ data overhead. Block sizes greater than 4K are supported up to a maximum of 64K.
-+ SquashFS 3.0 supports 64 bit filesystems and files (larger than 4GB), full
-+ uid/gid information, hard links and timestamps.
-+
-+ Squashfs is intended for general read-only filesystem use, for archival
-+ use (i.e. in cases where a .tar.gz file may be used), and in embedded
-+ systems where low overhead is needed. Further information and filesystem tools
-+ are available from http://squashfs.sourceforge.net.
-+
-+ If you want to compile this as a module ( = code which can be
-+ inserted in and removed from the running kernel whenever you want),
-+ say M here and read <file:Documentation/modules.txt>. The module
-+ will be called squashfs. Note that the root file system (the one
-+ containing the directory /) cannot be compiled as a module.
-+
-+ If unsure, say N.
-+
-+config SQUASHFS_EMBEDDED
-+
-+ bool "Additional options for memory-constrained systems"
-+ depends on SQUASHFS
-+ default n
-+ help
-+ Saying Y here allows you to specify cache sizes and how Squashfs
-+ allocates memory. This is only intended for memory constrained
-+ systems.
-+
-+ If unsure, say N.
-+
-+config SQUASHFS_FRAGMENT_CACHE_SIZE
-+ int "Number of fragments cached" if SQUASHFS_EMBEDDED
-+ depends on SQUASHFS
-+ default "3"
-+ help
-+ By default SquashFS caches the last 3 fragments read from
-+ the filesystem. Increasing this amount may mean SquashFS
-+ has to re-read fragments less often from disk, at the expense
-+ of extra system memory. Decreasing this amount will mean
-+ SquashFS uses less memory at the expense of extra reads from disk.
-+
-+ Note there must be at least one cached fragment. Anything
-+ much more than three will probably not make much difference.
-+
-+config SQUASHFS_VMALLOC
-+ bool "Use Vmalloc rather than Kmalloc" if SQUASHFS_EMBEDDED
-+ depends on SQUASHFS
-+ default n
-+ help
-+ By default SquashFS uses kmalloc to obtain fragment cache memory.
-+ Kmalloc memory is the standard kernel allocator, but it can fail
-+ on memory constrained systems. Because of the way Vmalloc works,
-+ Vmalloc can succeed when kmalloc fails. Specifying this option
-+ will make SquashFS always use Vmalloc to allocate the
-+ fragment cache memory.
-+
-+ If unsure, say N.
-+
- config VXFS_FS
- tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
- depends on BLOCK
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -73,6 +73,7 @@ obj-$(CONFIG_JBD) += jbd/
- obj-$(CONFIG_JBD2) += jbd2/
- obj-$(CONFIG_EXT2_FS) += ext2/
- obj-$(CONFIG_CRAMFS) += cramfs/
-+obj-$(CONFIG_SQUASHFS) += squashfs/
- obj-y += ramfs/
- obj-$(CONFIG_HUGETLBFS) += hugetlbfs/
- obj-$(CONFIG_CODA_FS) += coda/
---- /dev/null
-+++ b/fs/squashfs/inode.c
-@@ -0,0 +1,2122 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.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,
-+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * inode.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/smp_lock.h>
-+#include <linux/slab.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
-+#include <linux/vfs.h>
-+#include <linux/init.h>
-+#include <linux/dcache.h>
-+#include <linux/wait.h>
-+#include <linux/zlib.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+#include "squashfs.h"
-+
-+static void squashfs_put_super(struct super_block *);
-+static int squashfs_statfs(struct dentry *, struct kstatfs *);
-+static int squashfs_symlink_readpage(struct file *file, struct page *page);
-+static int squashfs_readpage(struct file *file, struct page *page);
-+static int squashfs_readpage4K(struct file *file, struct page *page);
-+static int squashfs_readdir(struct file *, void *, filldir_t);
-+static struct inode *squashfs_alloc_inode(struct super_block *sb);
-+static void squashfs_destroy_inode(struct inode *inode);
-+static int init_inodecache(void);
-+static void destroy_inodecache(void);
-+static struct dentry *squashfs_lookup(struct inode *, struct dentry *,
-+ struct nameidata *);
-+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode);
-+static long long read_blocklist(struct inode *inode, int index,
-+ int readahead_blks, char *block_list,
-+ unsigned short **block_p, unsigned int *bsize);
-+static int squashfs_get_sb(struct file_system_type *, int,
-+ const char *, void *, struct vfsmount *);
-+
-+
-+static z_stream stream;
-+
-+static struct file_system_type squashfs_fs_type = {
-+ .owner = THIS_MODULE,
-+ .name = "squashfs",
-+ .get_sb = squashfs_get_sb,
-+ .kill_sb = kill_block_super,
-+ .fs_flags = FS_REQUIRES_DEV
-+};
-+
-+static unsigned char squashfs_filetype_table[] = {
-+ DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK
-+};
-+
-+static struct super_operations squashfs_ops = {
-+ .alloc_inode = squashfs_alloc_inode,
-+ .destroy_inode = squashfs_destroy_inode,
-+ .statfs = squashfs_statfs,
-+ .put_super = squashfs_put_super,
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_symlink_aops = {
-+ .readpage = squashfs_symlink_readpage
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_aops = {
-+ .readpage = squashfs_readpage
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_aops_4K = {
-+ .readpage = squashfs_readpage4K
-+};
-+
-+static struct file_operations squashfs_dir_ops = {
-+ .read = generic_read_dir,
-+ .readdir = squashfs_readdir
-+};
-+
-+SQSH_EXTERN struct inode_operations squashfs_dir_inode_ops = {
-+ .lookup = squashfs_lookup
-+};
-+
-+
-+static struct buffer_head *get_block_length(struct super_block *s,
-+ int *cur_index, int *offset, int *c_byte)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ unsigned short temp;
-+ struct buffer_head *bh;
-+
-+ if (!(bh = sb_bread(s, *cur_index)))
-+ goto out;
-+
-+ if (msblk->devblksize - *offset == 1) {
-+ if (msblk->swap)
-+ ((unsigned char *) &temp)[1] = *((unsigned char *)
-+ (bh->b_data + *offset));
-+ else
-+ ((unsigned char *) &temp)[0] = *((unsigned char *)
-+ (bh->b_data + *offset));
-+ brelse(bh);
-+ if (!(bh = sb_bread(s, ++(*cur_index))))
-+ goto out;
-+ if (msblk->swap)
-+ ((unsigned char *) &temp)[0] = *((unsigned char *)
-+ bh->b_data);
-+ else
-+ ((unsigned char *) &temp)[1] = *((unsigned char *)
-+ bh->b_data);
-+ *c_byte = temp;
-+ *offset = 1;
-+ } else {
-+ if (msblk->swap) {
-+ ((unsigned char *) &temp)[1] = *((unsigned char *)
-+ (bh->b_data + *offset));
-+ ((unsigned char *) &temp)[0] = *((unsigned char *)
-+ (bh->b_data + *offset + 1));
-+ } else {
-+ ((unsigned char *) &temp)[0] = *((unsigned char *)
-+ (bh->b_data + *offset));
-+ ((unsigned char *) &temp)[1] = *((unsigned char *)
-+ (bh->b_data + *offset + 1));
-+ }
-+ *c_byte = temp;
-+ *offset += 2;
-+ }
-+
-+ if (SQUASHFS_CHECK_DATA(msblk->sblk.flags)) {
-+ if (*offset == msblk->devblksize) {
-+ brelse(bh);
-+ if (!(bh = sb_bread(s, ++(*cur_index))))
-+ goto out;
-+ *offset = 0;
-+ }
-+ if (*((unsigned char *) (bh->b_data + *offset)) !=
-+ SQUASHFS_MARKER_BYTE) {
-+ ERROR("Metadata block marker corrupt @ %x\n",
-+ *cur_index);
-+ brelse(bh);
-+ goto out;
-+ }
-+ (*offset)++;
-+ }
-+ return bh;
-+
-+out:
-+ return NULL;
-+}
-+
-+
-+SQSH_EXTERN unsigned int squashfs_read_data(struct super_block *s, char *buffer,
-+ long long index, unsigned int length,
-+ long long *next_index)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ struct buffer_head *bh[((SQUASHFS_FILE_MAX_SIZE - 1) >>
-+ msblk->devblksize_log2) + 2];
-+ unsigned int offset = index & ((1 << msblk->devblksize_log2) - 1);
-+ unsigned int cur_index = index >> msblk->devblksize_log2;
-+ int bytes, avail_bytes, b = 0, k;
-+ char *c_buffer;
-+ unsigned int compressed;
-+ unsigned int c_byte = length;
-+
-+ if (c_byte) {
-+ bytes = msblk->devblksize - offset;
-+ compressed = SQUASHFS_COMPRESSED_BLOCK(c_byte);
-+ c_buffer = compressed ? msblk->read_data : buffer;
-+ c_byte = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte);
-+
-+ TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed
-+ ? "" : "un", (unsigned int) c_byte);
-+
-+ if (!(bh[0] = sb_getblk(s, cur_index)))
-+ goto block_release;
-+
-+ for (b = 1; bytes < c_byte; b++) {
-+ if (!(bh[b] = sb_getblk(s, ++cur_index)))
-+ goto block_release;
-+ bytes += msblk->devblksize;
-+ }
-+ ll_rw_block(READ, b, bh);
-+ } else {
-+ if (!(bh[0] = get_block_length(s, &cur_index, &offset,
-+ &c_byte)))
-+ goto read_failure;
-+
-+ bytes = msblk->devblksize - offset;
-+ compressed = SQUASHFS_COMPRESSED(c_byte);
-+ c_buffer = compressed ? msblk->read_data : buffer;
-+ c_byte = SQUASHFS_COMPRESSED_SIZE(c_byte);
-+
-+ TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed
-+ ? "" : "un", (unsigned int) c_byte);
-+
-+ for (b = 1; bytes < c_byte; b++) {
-+ if (!(bh[b] = sb_getblk(s, ++cur_index)))
-+ goto block_release;
-+ bytes += msblk->devblksize;
-+ }
-+ ll_rw_block(READ, b - 1, bh + 1);
-+ }
-+
-+ if (compressed)
-+ down(&msblk->read_data_mutex);
-+
-+ for (bytes = 0, k = 0; k < b; k++) {
-+ avail_bytes = (c_byte - bytes) > (msblk->devblksize - offset) ?
-+ msblk->devblksize - offset :
-+ c_byte - bytes;
-+ wait_on_buffer(bh[k]);
-+ if (!buffer_uptodate(bh[k]))
-+ goto block_release;
-+ memcpy(c_buffer + bytes, bh[k]->b_data + offset, avail_bytes);
-+ bytes += avail_bytes;
-+ offset = 0;
-+ brelse(bh[k]);
-+ }
-+
-+ /*
-+ * uncompress block
-+ */
-+ if (compressed) {
-+ int zlib_err;
-+
-+ stream.next_in = c_buffer;
-+ stream.avail_in = c_byte;
-+ stream.next_out = buffer;
-+ stream.avail_out = msblk->read_size;
-+
-+ if (((zlib_err = zlib_inflateInit(&stream)) != Z_OK) ||
-+ ((zlib_err = zlib_inflate(&stream, Z_FINISH))
-+ != Z_STREAM_END) || ((zlib_err =
-+ zlib_inflateEnd(&stream)) != Z_OK)) {
-+ ERROR("zlib_fs returned unexpected result 0x%x\n",
-+ zlib_err);
-+ bytes = 0;
-+ } else
-+ bytes = stream.total_out;
-+
-+ up(&msblk->read_data_mutex);
-+ }
-+
-+ if (next_index)
-+ *next_index = index + c_byte + (length ? 0 :
-+ (SQUASHFS_CHECK_DATA(msblk->sblk.flags)
-+ ? 3 : 2));
-+ return bytes;
-+
-+block_release:
-+ while (--b >= 0)
-+ brelse(bh[b]);
-+
-+read_failure:
-+ ERROR("sb_bread failed reading block 0x%x\n", cur_index);
-+ return 0;
-+}
-+
-+
-+SQSH_EXTERN int squashfs_get_cached_block(struct super_block *s, char *buffer,
-+ long long block, unsigned int offset,
-+ int length, long long *next_block,
-+ unsigned int *next_offset)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ int n, i, bytes, return_length = length;
-+ long long next_index;
-+
-+ TRACE("Entered squashfs_get_cached_block [%llx:%x]\n", block, offset);
-+
-+ while ( 1 ) {
-+ for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+ if (msblk->block_cache[i].block == block)
-+ break;
-+
-+ down(&msblk->block_cache_mutex);
-+
-+ if (i == SQUASHFS_CACHED_BLKS) {
-+ /* read inode header block */
-+ for (i = msblk->next_cache, n = SQUASHFS_CACHED_BLKS;
-+ n ; n --, i = (i + 1) %
-+ SQUASHFS_CACHED_BLKS)
-+ if (msblk->block_cache[i].block !=
-+ SQUASHFS_USED_BLK)
-+ break;
-+
-+ if (n == 0) {
-+ wait_queue_t wait;
-+
-+ init_waitqueue_entry(&wait, current);
-+ add_wait_queue(&msblk->waitq, &wait);
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ up(&msblk->block_cache_mutex);
-+ schedule();
-+ set_current_state(TASK_RUNNING);
-+ remove_wait_queue(&msblk->waitq, &wait);
-+ continue;
-+ }
-+ msblk->next_cache = (i + 1) % SQUASHFS_CACHED_BLKS;
-+
-+ if (msblk->block_cache[i].block ==
-+ SQUASHFS_INVALID_BLK) {
-+ if (!(msblk->block_cache[i].data =
-+ kmalloc(SQUASHFS_METADATA_SIZE,
-+ GFP_KERNEL))) {
-+ ERROR("Failed to allocate cache"
-+ "block\n");
-+ up(&msblk->block_cache_mutex);
-+ goto out;
-+ }
-+ }
-+
-+ msblk->block_cache[i].block = SQUASHFS_USED_BLK;
-+ up(&msblk->block_cache_mutex);
-+
-+ if (!(msblk->block_cache[i].length =
-+ squashfs_read_data(s,
-+ msblk->block_cache[i].data,
-+ block, 0, &next_index))) {
-+ ERROR("Unable to read cache block [%llx:%x]\n",
-+ block, offset);
-+ goto out;
-+ }
-+
-+ down(&msblk->block_cache_mutex);
-+ wake_up(&msblk->waitq);
-+ msblk->block_cache[i].block = block;
-+ msblk->block_cache[i].next_index = next_index;
-+ TRACE("Read cache block [%llx:%x]\n", block, offset);
-+ }
-+
-+ if (msblk->block_cache[i].block != block) {
-+ up(&msblk->block_cache_mutex);
-+ continue;
-+ }
-+
-+ if ((bytes = msblk->block_cache[i].length - offset) >= length) {
-+ if (buffer)
-+ memcpy(buffer, msblk->block_cache[i].data +
-+ offset, length);
-+ if (msblk->block_cache[i].length - offset == length) {
-+ *next_block = msblk->block_cache[i].next_index;
-+ *next_offset = 0;
-+ } else {
-+ *next_block = block;
-+ *next_offset = offset + length;
-+ }
-+ up(&msblk->block_cache_mutex);
-+ goto finish;
-+ } else {
-+ if (buffer) {
-+ memcpy(buffer, msblk->block_cache[i].data +
-+ offset, bytes);
-+ buffer += bytes;
-+ }
-+ block = msblk->block_cache[i].next_index;
-+ up(&msblk->block_cache_mutex);
-+ length -= bytes;
-+ offset = 0;
-+ }
-+ }
-+
-+finish:
-+ return return_length;
-+out:
-+ return 0;
-+}
-+
-+
-+static int get_fragment_location(struct super_block *s, unsigned int fragment,
-+ long long *fragment_start_block,
-+ unsigned int *fragment_size)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ long long start_block =
-+ msblk->fragment_index[SQUASHFS_FRAGMENT_INDEX(fragment)];
-+ int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET(fragment);
-+ struct squashfs_fragment_entry fragment_entry;
-+
-+ if (msblk->swap) {
-+ struct squashfs_fragment_entry sfragment_entry;
-+
-+ if (!squashfs_get_cached_block(s, (char *) &sfragment_entry,
-+ start_block, offset,
-+ sizeof(sfragment_entry), &start_block,
-+ &offset))
-+ goto out;
-+ SQUASHFS_SWAP_FRAGMENT_ENTRY(&fragment_entry, &sfragment_entry);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *) &fragment_entry,
-+ start_block, offset,
-+ sizeof(fragment_entry), &start_block,
-+ &offset))
-+ goto out;
-+
-+ *fragment_start_block = fragment_entry.start_block;
-+ *fragment_size = fragment_entry.size;
-+
-+ return 1;
-+
-+out:
-+ return 0;
-+}
-+
-+
-+SQSH_EXTERN void release_cached_fragment(struct squashfs_sb_info *msblk, struct
-+ squashfs_fragment_cache *fragment)
-+{
-+ down(&msblk->fragment_mutex);
-+ fragment->locked --;
-+ wake_up(&msblk->fragment_wait_queue);
-+ up(&msblk->fragment_mutex);
-+}
-+
-+
-+SQSH_EXTERN struct squashfs_fragment_cache *get_cached_fragment(struct super_block
-+ *s, long long start_block,
-+ int length)
-+{
-+ int i, n;
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+
-+ while ( 1 ) {
-+ down(&msblk->fragment_mutex);
-+
-+ for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS &&
-+ msblk->fragment[i].block != start_block; i++);
-+
-+ if (i == SQUASHFS_CACHED_FRAGMENTS) {
-+ for (i = msblk->next_fragment, n =
-+ SQUASHFS_CACHED_FRAGMENTS; n &&
-+ msblk->fragment[i].locked; n--, i = (i + 1) %
-+ SQUASHFS_CACHED_FRAGMENTS);
-+
-+ if (n == 0) {
-+ wait_queue_t wait;
-+
-+ init_waitqueue_entry(&wait, current);
-+ add_wait_queue(&msblk->fragment_wait_queue,
-+ &wait);
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ up(&msblk->fragment_mutex);
-+ schedule();
-+ set_current_state(TASK_RUNNING);
-+ remove_wait_queue(&msblk->fragment_wait_queue,
-+ &wait);
-+ continue;
-+ }
-+ msblk->next_fragment = (msblk->next_fragment + 1) %
-+ SQUASHFS_CACHED_FRAGMENTS;
-+
-+ if (msblk->fragment[i].data == NULL)
-+ if (!(msblk->fragment[i].data = SQUASHFS_ALLOC
-+ (SQUASHFS_FILE_MAX_SIZE))) {
-+ ERROR("Failed to allocate fragment "
-+ "cache block\n");
-+ up(&msblk->fragment_mutex);
-+ goto out;
-+ }
-+
-+ msblk->fragment[i].block = SQUASHFS_INVALID_BLK;
-+ msblk->fragment[i].locked = 1;
-+ up(&msblk->fragment_mutex);
-+
-+ if (!(msblk->fragment[i].length = squashfs_read_data(s,
-+ msblk->fragment[i].data,
-+ start_block, length, NULL))) {
-+ ERROR("Unable to read fragment cache block "
-+ "[%llx]\n", start_block);
-+ msblk->fragment[i].locked = 0;
-+ goto out;
-+ }
-+
-+ msblk->fragment[i].block = start_block;
-+ TRACE("New fragment %d, start block %lld, locked %d\n",
-+ i, msblk->fragment[i].block,
-+ msblk->fragment[i].locked);
-+ break;
-+ }
-+
-+ msblk->fragment[i].locked++;
-+ up(&msblk->fragment_mutex);
-+ TRACE("Got fragment %d, start block %lld, locked %d\n", i,
-+ msblk->fragment[i].block,
-+ msblk->fragment[i].locked);
-+ break;
-+ }
-+
-+ return &msblk->fragment[i];
-+
-+out:
-+ return NULL;
-+}
-+
-+
-+static struct inode *squashfs_new_inode(struct super_block *s,
-+ struct squashfs_base_inode_header *inodeb)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ struct inode *i = new_inode(s);
-+
-+ if (i) {
-+ i->i_ino = inodeb->inode_number;
-+ i->i_mtime.tv_sec = inodeb->mtime;
-+ i->i_atime.tv_sec = inodeb->mtime;
-+ i->i_ctime.tv_sec = inodeb->mtime;
-+ i->i_uid = msblk->uid[inodeb->uid];
-+ i->i_mode = inodeb->mode;
-+ i->i_size = 0;
-+ if (inodeb->guid == SQUASHFS_GUIDS)
-+ i->i_gid = i->i_uid;
-+ else
-+ i->i_gid = msblk->guid[inodeb->guid];
-+ }
-+
-+ return i;
-+}
-+
-+
-+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode)
-+{
-+ struct inode *i;
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ long long block = SQUASHFS_INODE_BLK(inode) +
-+ sblk->inode_table_start;
-+ unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
-+ long long next_block;
-+ unsigned int next_offset;
-+ union squashfs_inode_header id, sid;
-+ struct squashfs_base_inode_header *inodeb = &id.base,
-+ *sinodeb = &sid.base;
-+
-+ TRACE("Entered squashfs_iget\n");
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *) sinodeb, block,
-+ offset, sizeof(*sinodeb), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_BASE_INODE_HEADER(inodeb, sinodeb,
-+ sizeof(*sinodeb));
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *) inodeb, block,
-+ offset, sizeof(*inodeb), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ switch(inodeb->inode_type) {
-+ case SQUASHFS_FILE_TYPE: {
-+ unsigned int frag_size;
-+ long long frag_blk;
-+ struct squashfs_reg_inode_header *inodep = &id.reg;
-+ struct squashfs_reg_inode_header *sinodep = &sid.reg;
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *)
-+ sinodep, block, offset,
-+ sizeof(*sinodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_REG_INODE_HEADER(inodep, sinodep);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *)
-+ inodep, block, offset,
-+ sizeof(*inodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ frag_blk = SQUASHFS_INVALID_BLK;
-+ if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+ !get_fragment_location(s,
-+ inodep->fragment, &frag_blk, &frag_size))
-+ goto failed_read;
-+
-+ if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_nlink = 1;
-+ i->i_size = inodep->file_size;
-+ i->i_fop = &generic_ro_fops;
-+ i->i_mode |= S_IFREG;
-+ i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+ SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+ SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+ SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+ SQUASHFS_I(i)->start_block = inodep->start_block;
-+ SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+ SQUASHFS_I(i)->offset = next_offset;
-+ if (sblk->block_size > 4096)
-+ i->i_data.a_ops = &squashfs_aops;
-+ else
-+ i->i_data.a_ops = &squashfs_aops_4K;
-+
-+ TRACE("File inode %x:%x, start_block %llx, "
-+ "block_list_start %llx, offset %x\n",
-+ SQUASHFS_INODE_BLK(inode), offset,
-+ inodep->start_block, next_block,
-+ next_offset);
-+ break;
-+ }
-+ case SQUASHFS_LREG_TYPE: {
-+ unsigned int frag_size;
-+ long long frag_blk;
-+ struct squashfs_lreg_inode_header *inodep = &id.lreg;
-+ struct squashfs_lreg_inode_header *sinodep = &sid.lreg;
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *)
-+ sinodep, block, offset,
-+ sizeof(*sinodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_LREG_INODE_HEADER(inodep, sinodep);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *)
-+ inodep, block, offset,
-+ sizeof(*inodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ frag_blk = SQUASHFS_INVALID_BLK;
-+ if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+ !get_fragment_location(s,
-+ inodep->fragment, &frag_blk, &frag_size))
-+ goto failed_read;
-+
-+ if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_nlink = inodep->nlink;
-+ i->i_size = inodep->file_size;
-+ i->i_fop = &generic_ro_fops;
-+ i->i_mode |= S_IFREG;
-+ i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+ SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+ SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+ SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+ SQUASHFS_I(i)->start_block = inodep->start_block;
-+ SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+ SQUASHFS_I(i)->offset = next_offset;
-+ if (sblk->block_size > 4096)
-+ i->i_data.a_ops = &squashfs_aops;
-+ else
-+ i->i_data.a_ops = &squashfs_aops_4K;
-+
-+ TRACE("File inode %x:%x, start_block %llx, "
-+ "block_list_start %llx, offset %x\n",
-+ SQUASHFS_INODE_BLK(inode), offset,
-+ inodep->start_block, next_block,
-+ next_offset);
-+ break;
-+ }
-+ case SQUASHFS_DIR_TYPE: {
-+ struct squashfs_dir_inode_header *inodep = &id.dir;
-+ struct squashfs_dir_inode_header *sinodep = &sid.dir;
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *)
-+ sinodep, block, offset,
-+ sizeof(*sinodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_DIR_INODE_HEADER(inodep, sinodep);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *)
-+ inodep, block, offset,
-+ sizeof(*inodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_nlink = inodep->nlink;
-+ i->i_size = inodep->file_size;
-+ i->i_op = &squashfs_dir_inode_ops;
-+ i->i_fop = &squashfs_dir_ops;
-+ i->i_mode |= S_IFDIR;
-+ SQUASHFS_I(i)->start_block = inodep->start_block;
-+ SQUASHFS_I(i)->offset = inodep->offset;
-+ SQUASHFS_I(i)->u.s2.directory_index_count = 0;
-+ SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode;
-+
-+ TRACE("Directory inode %x:%x, start_block %x, offset "
-+ "%x\n", SQUASHFS_INODE_BLK(inode),
-+ offset, inodep->start_block,
-+ inodep->offset);
-+ break;
-+ }
-+ case SQUASHFS_LDIR_TYPE: {
-+ struct squashfs_ldir_inode_header *inodep = &id.ldir;
-+ struct squashfs_ldir_inode_header *sinodep = &sid.ldir;
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *)
-+ sinodep, block, offset,
-+ sizeof(*sinodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_LDIR_INODE_HEADER(inodep,
-+ sinodep);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *)
-+ inodep, block, offset,
-+ sizeof(*inodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_nlink = inodep->nlink;
-+ i->i_size = inodep->file_size;
-+ i->i_op = &squashfs_dir_inode_ops;
-+ i->i_fop = &squashfs_dir_ops;
-+ i->i_mode |= S_IFDIR;
-+ SQUASHFS_I(i)->start_block = inodep->start_block;
-+ SQUASHFS_I(i)->offset = inodep->offset;
-+ SQUASHFS_I(i)->u.s2.directory_index_start = next_block;
-+ SQUASHFS_I(i)->u.s2.directory_index_offset =
-+ next_offset;
-+ SQUASHFS_I(i)->u.s2.directory_index_count =
-+ inodep->i_count;
-+ SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode;
-+
-+ TRACE("Long directory inode %x:%x, start_block %x, "
-+ "offset %x\n",
-+ SQUASHFS_INODE_BLK(inode), offset,
-+ inodep->start_block, inodep->offset);
-+ break;
-+ }
-+ case SQUASHFS_SYMLINK_TYPE: {
-+ struct squashfs_symlink_inode_header *inodep =
-+ &id.symlink;
-+ struct squashfs_symlink_inode_header *sinodep =
-+ &sid.symlink;
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *)
-+ sinodep, block, offset,
-+ sizeof(*sinodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_SYMLINK_INODE_HEADER(inodep,
-+ sinodep);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *)
-+ inodep, block, offset,
-+ sizeof(*inodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_nlink = inodep->nlink;
-+ i->i_size = inodep->symlink_size;
-+ i->i_op = &page_symlink_inode_operations;
-+ i->i_data.a_ops = &squashfs_symlink_aops;
-+ i->i_mode |= S_IFLNK;
-+ SQUASHFS_I(i)->start_block = next_block;
-+ SQUASHFS_I(i)->offset = next_offset;
-+
-+ TRACE("Symbolic link inode %x:%x, start_block %llx, "
-+ "offset %x\n",
-+ SQUASHFS_INODE_BLK(inode), offset,
-+ next_block, next_offset);
-+ break;
-+ }
-+ case SQUASHFS_BLKDEV_TYPE:
-+ case SQUASHFS_CHRDEV_TYPE: {
-+ struct squashfs_dev_inode_header *inodep = &id.dev;
-+ struct squashfs_dev_inode_header *sinodep = &sid.dev;
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *)
-+ sinodep, block, offset,
-+ sizeof(*sinodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_DEV_INODE_HEADER(inodep, sinodep);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *)
-+ inodep, block, offset,
-+ sizeof(*inodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ if ((i = squashfs_new_inode(s, inodeb)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_nlink = inodep->nlink;
-+ i->i_mode |= (inodeb->inode_type ==
-+ SQUASHFS_CHRDEV_TYPE) ? S_IFCHR :
-+ S_IFBLK;
-+ init_special_inode(i, i->i_mode,
-+ old_decode_dev(inodep->rdev));
-+
-+ TRACE("Device inode %x:%x, rdev %x\n",
-+ SQUASHFS_INODE_BLK(inode), offset,
-+ inodep->rdev);
-+ break;
-+ }
-+ case SQUASHFS_FIFO_TYPE:
-+ case SQUASHFS_SOCKET_TYPE: {
-+ struct squashfs_ipc_inode_header *inodep = &id.ipc;
-+ struct squashfs_ipc_inode_header *sinodep = &sid.ipc;
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *)
-+ sinodep, block, offset,
-+ sizeof(*sinodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_IPC_INODE_HEADER(inodep, sinodep);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *)
-+ inodep, block, offset,
-+ sizeof(*inodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ if ((i = squashfs_new_inode(s, inodeb)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_nlink = inodep->nlink;
-+ i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE)
-+ ? S_IFIFO : S_IFSOCK;
-+ init_special_inode(i, i->i_mode, 0);
-+ break;
-+ }
-+ default:
-+ ERROR("Unknown inode type %d in squashfs_iget!\n",
-+ inodeb->inode_type);
-+ goto failed_read1;
-+ }
-+
-+ insert_inode_hash(i);
-+ return i;
-+
-+failed_read:
-+ ERROR("Unable to read inode [%llx:%x]\n", block, offset);
-+
-+failed_read1:
-+ return NULL;
-+}
-+
-+
-+static int read_fragment_index_table(struct super_block *s)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+ /* Allocate fragment index table */
-+ if (!(msblk->fragment_index = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES
-+ (sblk->fragments), GFP_KERNEL))) {
-+ ERROR("Failed to allocate uid/gid table\n");
-+ return 0;
-+ }
-+
-+ if (SQUASHFS_FRAGMENT_INDEX_BYTES(sblk->fragments) &&
-+ !squashfs_read_data(s, (char *)
-+ msblk->fragment_index,
-+ sblk->fragment_table_start,
-+ SQUASHFS_FRAGMENT_INDEX_BYTES
-+ (sblk->fragments) |
-+ SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+ ERROR("unable to read fragment index table\n");
-+ return 0;
-+ }
-+
-+ if (msblk->swap) {
-+ int i;
-+ long long fragment;
-+
-+ for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES(sblk->fragments);
-+ i++) {
-+ SQUASHFS_SWAP_FRAGMENT_INDEXES((&fragment),
-+ &msblk->fragment_index[i], 1);
-+ msblk->fragment_index[i] = fragment;
-+ }
-+ }
-+
-+ return 1;
-+}
-+
-+
-+static int supported_squashfs_filesystem(struct squashfs_sb_info *msblk, int silent)
-+{
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+ msblk->iget = squashfs_iget;
-+ msblk->read_blocklist = read_blocklist;
-+ msblk->read_fragment_index_table = read_fragment_index_table;
-+
-+ if (sblk->s_major == 1) {
-+ if (!squashfs_1_0_supported(msblk)) {
-+ SERROR("Major/Minor mismatch, Squashfs 1.0 filesystems "
-+ "are unsupported\n");
-+ SERROR("Please recompile with "
-+ "Squashfs 1.0 support enabled\n");
-+ return 0;
-+ }
-+ } else if (sblk->s_major == 2) {
-+ if (!squashfs_2_0_supported(msblk)) {
-+ SERROR("Major/Minor mismatch, Squashfs 2.0 filesystems "
-+ "are unsupported\n");
-+ SERROR("Please recompile with "
-+ "Squashfs 2.0 support enabled\n");
-+ return 0;
-+ }
-+ } else if(sblk->s_major != SQUASHFS_MAJOR || sblk->s_minor >
-+ SQUASHFS_MINOR) {
-+ SERROR("Major/Minor mismatch, trying to mount newer %d.%d "
-+ "filesystem\n", sblk->s_major, sblk->s_minor);
-+ SERROR("Please update your kernel\n");
-+ return 0;
-+ }
-+
-+ return 1;
-+}
-+
-+
-+static int squashfs_fill_super(struct super_block *s, void *data, int silent)
-+{
-+ struct squashfs_sb_info *msblk;
-+ struct squashfs_super_block *sblk;
-+ int i;
-+ char b[BDEVNAME_SIZE];
-+ struct inode *root;
-+
-+ TRACE("Entered squashfs_read_superblock\n");
-+
-+ if (!(s->s_fs_info = kmalloc(sizeof(struct squashfs_sb_info),
-+ GFP_KERNEL))) {
-+ ERROR("Failed to allocate superblock\n");
-+ goto failure;
-+ }
-+ memset(s->s_fs_info, 0, sizeof(struct squashfs_sb_info));
-+ msblk = s->s_fs_info;
-+ sblk = &msblk->sblk;
-+
-+ msblk->devblksize = sb_min_blocksize(s, BLOCK_SIZE);
-+ msblk->devblksize_log2 = ffz(~msblk->devblksize);
-+
-+ init_MUTEX(&msblk->read_data_mutex);
-+ init_MUTEX(&msblk->read_page_mutex);
-+ init_MUTEX(&msblk->block_cache_mutex);
-+ init_MUTEX(&msblk->fragment_mutex);
-+ init_MUTEX(&msblk->meta_index_mutex);
-+
-+ init_waitqueue_head(&msblk->waitq);
-+ init_waitqueue_head(&msblk->fragment_wait_queue);
-+
-+ if (!squashfs_read_data(s, (char *) sblk, SQUASHFS_START,
-+ sizeof(struct squashfs_super_block) |
-+ SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+ SERROR("unable to read superblock\n");
-+ goto failed_mount;
-+ }
-+
-+ /* Check it is a SQUASHFS superblock */
-+ msblk->swap = 0;
-+ if ((s->s_magic = sblk->s_magic) != SQUASHFS_MAGIC) {
-+ if (sblk->s_magic == SQUASHFS_MAGIC_SWAP) {
-+ struct squashfs_super_block ssblk;
-+
-+ WARNING("Mounting a different endian SQUASHFS "
-+ "filesystem on %s\n", bdevname(s->s_bdev, b));
-+
-+ SQUASHFS_SWAP_SUPER_BLOCK(&ssblk, sblk);
-+ memcpy(sblk, &ssblk, sizeof(struct squashfs_super_block));
-+ msblk->swap = 1;
-+ } else {
-+ SERROR("Can't find a SQUASHFS superblock on %s\n",
-+ bdevname(s->s_bdev, b));
-+ goto failed_mount;
-+ }
-+ }
-+
-+ /* Check the MAJOR & MINOR versions */
-+ if(!supported_squashfs_filesystem(msblk, silent))
-+ goto failed_mount;
-+
-+ TRACE("Found valid superblock on %s\n", bdevname(s->s_bdev, b));
-+ TRACE("Inodes are %scompressed\n",
-+ SQUASHFS_UNCOMPRESSED_INODES
-+ (sblk->flags) ? "un" : "");
-+ TRACE("Data is %scompressed\n",
-+ SQUASHFS_UNCOMPRESSED_DATA(sblk->flags)
-+ ? "un" : "");
-+ TRACE("Check data is %s present in the filesystem\n",
-+ SQUASHFS_CHECK_DATA(sblk->flags) ?
-+ "" : "not");
-+ TRACE("Filesystem size %lld bytes\n", sblk->bytes_used);
-+ TRACE("Block size %d\n", sblk->block_size);
-+ TRACE("Number of inodes %d\n", sblk->inodes);
-+ if (sblk->s_major > 1)
-+ TRACE("Number of fragments %d\n", sblk->fragments);
-+ TRACE("Number of uids %d\n", sblk->no_uids);
-+ TRACE("Number of gids %d\n", sblk->no_guids);
-+ TRACE("sblk->inode_table_start %llx\n", sblk->inode_table_start);
-+ TRACE("sblk->directory_table_start %llx\n", sblk->directory_table_start);
-+ if (sblk->s_major > 1)
-+ TRACE("sblk->fragment_table_start %llx\n",
-+ sblk->fragment_table_start);
-+ TRACE("sblk->uid_start %llx\n", sblk->uid_start);
-+
-+ s->s_flags |= MS_RDONLY;
-+ s->s_op = &squashfs_ops;
-+
-+ /* Init inode_table block pointer array */
-+ if (!(msblk->block_cache = kmalloc(sizeof(struct squashfs_cache) *
-+ SQUASHFS_CACHED_BLKS, GFP_KERNEL))) {
-+ ERROR("Failed to allocate block cache\n");
-+ goto failed_mount;
-+ }
-+
-+ for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+ msblk->block_cache[i].block = SQUASHFS_INVALID_BLK;
-+
-+ msblk->next_cache = 0;
-+
-+ /* Allocate read_data block */
-+ msblk->read_size = (sblk->block_size < SQUASHFS_METADATA_SIZE) ?
-+ SQUASHFS_METADATA_SIZE :
-+ sblk->block_size;
-+
-+ if (!(msblk->read_data = kmalloc(msblk->read_size, GFP_KERNEL))) {
-+ ERROR("Failed to allocate read_data block\n");
-+ goto failed_mount;
-+ }
-+
-+ /* Allocate read_page block */
-+ if (!(msblk->read_page = kmalloc(sblk->block_size, GFP_KERNEL))) {
-+ ERROR("Failed to allocate read_page block\n");
-+ goto failed_mount;
-+ }
-+
-+ /* Allocate uid and gid tables */
-+ if (!(msblk->uid = kmalloc((sblk->no_uids + sblk->no_guids) *
-+ sizeof(unsigned int), GFP_KERNEL))) {
-+ ERROR("Failed to allocate uid/gid table\n");
-+ goto failed_mount;
-+ }
-+ msblk->guid = msblk->uid + sblk->no_uids;
-+
-+ if (msblk->swap) {
-+ unsigned int suid[sblk->no_uids + sblk->no_guids];
-+
-+ if (!squashfs_read_data(s, (char *) &suid, sblk->uid_start,
-+ ((sblk->no_uids + sblk->no_guids) *
-+ sizeof(unsigned int)) |
-+ SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+ ERROR("unable to read uid/gid table\n");
-+ goto failed_mount;
-+ }
-+
-+ SQUASHFS_SWAP_DATA(msblk->uid, suid, (sblk->no_uids +
-+ sblk->no_guids), (sizeof(unsigned int) * 8));
-+ } else
-+ if (!squashfs_read_data(s, (char *) msblk->uid, sblk->uid_start,
-+ ((sblk->no_uids + sblk->no_guids) *
-+ sizeof(unsigned int)) |
-+ SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+ ERROR("unable to read uid/gid table\n");
-+ goto failed_mount;
-+ }
-+
-+
-+ if (sblk->s_major == 1 && squashfs_1_0_supported(msblk))
-+ goto allocate_root;
-+
-+ if (!(msblk->fragment = kmalloc(sizeof(struct squashfs_fragment_cache) *
-+ SQUASHFS_CACHED_FRAGMENTS, GFP_KERNEL))) {
-+ ERROR("Failed to allocate fragment block cache\n");
-+ goto failed_mount;
-+ }
-+
-+ for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) {
-+ msblk->fragment[i].locked = 0;
-+ msblk->fragment[i].block = SQUASHFS_INVALID_BLK;
-+ msblk->fragment[i].data = NULL;
-+ }
-+
-+ msblk->next_fragment = 0;
-+
-+ /* Allocate fragment index table */
-+ if (msblk->read_fragment_index_table(s) == 0)
-+ goto failed_mount;
-+
-+allocate_root:
-+ if ((root = (msblk->iget)(s, sblk->root_inode)) == NULL)
-+ goto failed_mount;
-+
-+ if ((s->s_root = d_alloc_root(root)) == NULL) {
-+ ERROR("Root inode create failed\n");
-+ iput(root);
-+ goto failed_mount;
-+ }
-+
-+ TRACE("Leaving squashfs_read_super\n");
-+ return 0;
-+
-+failed_mount:
-+ kfree(msblk->fragment_index);
-+ kfree(msblk->fragment);
-+ kfree(msblk->uid);
-+ kfree(msblk->read_page);
-+ kfree(msblk->read_data);
-+ kfree(msblk->block_cache);
-+ kfree(msblk->fragment_index_2);
-+ kfree(s->s_fs_info);
-+ s->s_fs_info = NULL;
-+ return -EINVAL;
-+
-+failure:
-+ return -ENOMEM;
-+}
-+
-+
-+static int squashfs_statfs(struct dentry *dentry, struct kstatfs *buf)
-+{
-+ struct squashfs_sb_info *msblk = dentry->d_inode->i_sb->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+ TRACE("Entered squashfs_statfs\n");
-+
-+ buf->f_type = SQUASHFS_MAGIC;
-+ buf->f_bsize = sblk->block_size;
-+ buf->f_blocks = ((sblk->bytes_used - 1) >> sblk->block_log) + 1;
-+ buf->f_bfree = buf->f_bavail = 0;
-+ buf->f_files = sblk->inodes;
-+ buf->f_ffree = 0;
-+ buf->f_namelen = SQUASHFS_NAME_LEN;
-+
-+ return 0;
-+}
-+
-+
-+static int squashfs_symlink_readpage(struct file *file, struct page *page)
-+{
-+ struct inode *inode = page->mapping->host;
-+ int index = page->index << PAGE_CACHE_SHIFT, length, bytes;
-+ long long block = SQUASHFS_I(inode)->start_block;
-+ int offset = SQUASHFS_I(inode)->offset;
-+ void *pageaddr = kmap(page);
-+
-+ TRACE("Entered squashfs_symlink_readpage, page index %ld, start block "
-+ "%llx, offset %x\n", page->index,
-+ SQUASHFS_I(inode)->start_block,
-+ SQUASHFS_I(inode)->offset);
-+
-+ for (length = 0; length < index; length += bytes) {
-+ if (!(bytes = squashfs_get_cached_block(inode->i_sb, NULL,
-+ block, offset, PAGE_CACHE_SIZE, &block,
-+ &offset))) {
-+ ERROR("Unable to read symbolic link [%llx:%x]\n", block,
-+ offset);
-+ goto skip_read;
-+ }
-+ }
-+
-+ if (length != index) {
-+ ERROR("(squashfs_symlink_readpage) length != index\n");
-+ bytes = 0;
-+ goto skip_read;
-+ }
-+
-+ bytes = (i_size_read(inode) - length) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE :
-+ i_size_read(inode) - length;
-+
-+ if (!(bytes = squashfs_get_cached_block(inode->i_sb, pageaddr, block,
-+ offset, bytes, &block, &offset)))
-+ ERROR("Unable to read symbolic link [%llx:%x]\n", block, offset);
-+
-+skip_read:
-+ memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+ kunmap(page);
-+ SetPageUptodate(page);
-+ unlock_page(page);
-+
-+ return 0;
-+}
-+
-+
-+struct meta_index *locate_meta_index(struct inode *inode, int index, int offset)
-+{
-+ struct meta_index *meta = NULL;
-+ struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+ int i;
-+
-+ down(&msblk->meta_index_mutex);
-+
-+ TRACE("locate_meta_index: index %d, offset %d\n", index, offset);
-+
-+ if(msblk->meta_index == NULL)
-+ goto not_allocated;
-+
-+ for (i = 0; i < SQUASHFS_META_NUMBER; i ++)
-+ if (msblk->meta_index[i].inode_number == inode->i_ino &&
-+ msblk->meta_index[i].offset >= offset &&
-+ msblk->meta_index[i].offset <= index &&
-+ msblk->meta_index[i].locked == 0) {
-+ TRACE("locate_meta_index: entry %d, offset %d\n", i,
-+ msblk->meta_index[i].offset);
-+ meta = &msblk->meta_index[i];
-+ offset = meta->offset;
-+ }
-+
-+ if (meta)
-+ meta->locked = 1;
-+
-+not_allocated:
-+ up(&msblk->meta_index_mutex);
-+
-+ return meta;
-+}
-+
-+
-+struct meta_index *empty_meta_index(struct inode *inode, int offset, int skip)
-+{
-+ struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+ struct meta_index *meta = NULL;
-+ int i;
-+
-+ down(&msblk->meta_index_mutex);
-+
-+ TRACE("empty_meta_index: offset %d, skip %d\n", offset, skip);
-+
-+ if(msblk->meta_index == NULL) {
-+ if (!(msblk->meta_index = kmalloc(sizeof(struct meta_index) *
-+ SQUASHFS_META_NUMBER, GFP_KERNEL))) {
-+ ERROR("Failed to allocate meta_index\n");
-+ goto failed;
-+ }
-+ for(i = 0; i < SQUASHFS_META_NUMBER; i++) {
-+ msblk->meta_index[i].inode_number = 0;
-+ msblk->meta_index[i].locked = 0;
-+ }
-+ msblk->next_meta_index = 0;
-+ }
-+
-+ for(i = SQUASHFS_META_NUMBER; i &&
-+ msblk->meta_index[msblk->next_meta_index].locked; i --)
-+ msblk->next_meta_index = (msblk->next_meta_index + 1) %
-+ SQUASHFS_META_NUMBER;
-+
-+ if(i == 0) {
-+ TRACE("empty_meta_index: failed!\n");
-+ goto failed;
-+ }
-+
-+ TRACE("empty_meta_index: returned meta entry %d, %p\n",
-+ msblk->next_meta_index,
-+ &msblk->meta_index[msblk->next_meta_index]);
-+
-+ meta = &msblk->meta_index[msblk->next_meta_index];
-+ msblk->next_meta_index = (msblk->next_meta_index + 1) %
-+ SQUASHFS_META_NUMBER;
-+
-+ meta->inode_number = inode->i_ino;
-+ meta->offset = offset;
-+ meta->skip = skip;
-+ meta->entries = 0;
-+ meta->locked = 1;
-+
-+failed:
-+ up(&msblk->meta_index_mutex);
-+ return meta;
-+}
-+
-+
-+void release_meta_index(struct inode *inode, struct meta_index *meta)
-+{
-+ meta->locked = 0;
-+}
-+
-+
-+static int read_block_index(struct super_block *s, int blocks, char *block_list,
-+ long long *start_block, int *offset)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ unsigned int *block_listp;
-+ int block = 0;
-+
-+ if (msblk->swap) {
-+ char sblock_list[blocks << 2];
-+
-+ if (!squashfs_get_cached_block(s, sblock_list, *start_block,
-+ *offset, blocks << 2, start_block, offset)) {
-+ ERROR("Unable to read block list [%llx:%x]\n",
-+ *start_block, *offset);
-+ goto failure;
-+ }
-+ SQUASHFS_SWAP_INTS(((unsigned int *)block_list),
-+ ((unsigned int *)sblock_list), blocks);
-+ } else
-+ if (!squashfs_get_cached_block(s, block_list, *start_block,
-+ *offset, blocks << 2, start_block, offset)) {
-+ ERROR("Unable to read block list [%llx:%x]\n",
-+ *start_block, *offset);
-+ goto failure;
-+ }
-+
-+ for (block_listp = (unsigned int *) block_list; blocks;
-+ block_listp++, blocks --)
-+ block += SQUASHFS_COMPRESSED_SIZE_BLOCK(*block_listp);
-+
-+ return block;
-+
-+failure:
-+ return -1;
-+}
-+
-+
-+#define SIZE 256
-+
-+static inline int calculate_skip(int blocks) {
-+ int skip = (blocks - 1) / ((SQUASHFS_SLOTS * SQUASHFS_META_ENTRIES + 1) * SQUASHFS_META_INDEXES);
-+ return skip >= 7 ? 7 : skip + 1;
-+}
-+
-+
-+static int get_meta_index(struct inode *inode, int index,
-+ long long *index_block, int *index_offset,
-+ long long *data_block, char *block_list)
-+{
-+ struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ int skip = calculate_skip(i_size_read(inode) >> sblk->block_log);
-+ int offset = 0;
-+ struct meta_index *meta;
-+ struct meta_entry *meta_entry;
-+ long long cur_index_block = SQUASHFS_I(inode)->u.s1.block_list_start;
-+ int cur_offset = SQUASHFS_I(inode)->offset;
-+ long long cur_data_block = SQUASHFS_I(inode)->start_block;
-+ int i;
-+
-+ index /= SQUASHFS_META_INDEXES * skip;
-+
-+ while ( offset < index ) {
-+ meta = locate_meta_index(inode, index, offset + 1);
-+
-+ if (meta == NULL) {
-+ if ((meta = empty_meta_index(inode, offset + 1,
-+ skip)) == NULL)
-+ goto all_done;
-+ } else {
-+ offset = index < meta->offset + meta->entries ? index :
-+ meta->offset + meta->entries - 1;
-+ meta_entry = &meta->meta_entry[offset - meta->offset];
-+ cur_index_block = meta_entry->index_block + sblk->inode_table_start;
-+ cur_offset = meta_entry->offset;
-+ cur_data_block = meta_entry->data_block;
-+ TRACE("get_meta_index: offset %d, meta->offset %d, "
-+ "meta->entries %d\n", offset, meta->offset,
-+ meta->entries);
-+ TRACE("get_meta_index: index_block 0x%llx, offset 0x%x"
-+ " data_block 0x%llx\n", cur_index_block,
-+ cur_offset, cur_data_block);
-+ }
-+
-+ for (i = meta->offset + meta->entries; i <= index &&
-+ i < meta->offset + SQUASHFS_META_ENTRIES; i++) {
-+ int blocks = skip * SQUASHFS_META_INDEXES;
-+
-+ while (blocks) {
-+ int block = blocks > (SIZE >> 2) ? (SIZE >> 2) :
-+ blocks;
-+ int res = read_block_index(inode->i_sb, block,
-+ block_list, &cur_index_block,
-+ &cur_offset);
-+
-+ if (res == -1)
-+ goto failed;
-+
-+ cur_data_block += res;
-+ blocks -= block;
-+ }
-+
-+ meta_entry = &meta->meta_entry[i - meta->offset];
-+ meta_entry->index_block = cur_index_block - sblk->inode_table_start;
-+ meta_entry->offset = cur_offset;
-+ meta_entry->data_block = cur_data_block;
-+ meta->entries ++;
-+ offset ++;
-+ }
-+
-+ TRACE("get_meta_index: meta->offset %d, meta->entries %d\n",
-+ meta->offset, meta->entries);
-+
-+ release_meta_index(inode, meta);
-+ }
-+
-+all_done:
-+ *index_block = cur_index_block;
-+ *index_offset = cur_offset;
-+ *data_block = cur_data_block;
-+
-+ return offset * SQUASHFS_META_INDEXES * skip;
-+
-+failed:
-+ release_meta_index(inode, meta);
-+ return -1;
-+}
-+
-+
-+static long long read_blocklist(struct inode *inode, int index,
-+ int readahead_blks, char *block_list,
-+ unsigned short **block_p, unsigned int *bsize)
-+{
-+ long long block_ptr;
-+ int offset;
-+ long long block;
-+ int res = get_meta_index(inode, index, &block_ptr, &offset, &block,
-+ block_list);
-+
-+ TRACE("read_blocklist: res %d, index %d, block_ptr 0x%llx, offset"
-+ " 0x%x, block 0x%llx\n", res, index, block_ptr, offset,
-+ block);
-+
-+ if(res == -1)
-+ goto failure;
-+
-+ index -= res;
-+
-+ while ( index ) {
-+ int blocks = index > (SIZE >> 2) ? (SIZE >> 2) : index;
-+ int res = read_block_index(inode->i_sb, blocks, block_list,
-+ &block_ptr, &offset);
-+ if (res == -1)
-+ goto failure;
-+ block += res;
-+ index -= blocks;
-+ }
-+
-+ if (read_block_index(inode->i_sb, 1, block_list,
-+ &block_ptr, &offset) == -1)
-+ goto failure;
-+ *bsize = *((unsigned int *) block_list);
-+
-+ return block;
-+
-+failure:
-+ return 0;
-+}
-+
-+
-+static int squashfs_readpage(struct file *file, struct page *page)
-+{
-+ struct inode *inode = page->mapping->host;
-+ struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ unsigned char block_list[SIZE];
-+ long long block;
-+ unsigned int bsize, i = 0, bytes = 0, byte_offset = 0;
-+ int index = page->index >> (sblk->block_log - PAGE_CACHE_SHIFT);
-+ void *pageaddr;
-+ struct squashfs_fragment_cache *fragment = NULL;
-+ char *data_ptr = msblk->read_page;
-+
-+ int mask = (1 << (sblk->block_log - PAGE_CACHE_SHIFT)) - 1;
-+ int start_index = page->index & ~mask;
-+ int end_index = start_index | mask;
-+
-+ TRACE("Entered squashfs_readpage, page index %lx, start block %llx\n",
-+ page->index,
-+ SQUASHFS_I(inode)->start_block);
-+
-+ if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
-+ PAGE_CACHE_SHIFT))
-+ goto skip_read;
-+
-+ if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+ || index < (i_size_read(inode) >>
-+ sblk->block_log)) {
-+ if ((block = (msblk->read_blocklist)(inode, index, 1,
-+ block_list, NULL, &bsize)) == 0)
-+ goto skip_read;
-+
-+ down(&msblk->read_page_mutex);
-+
-+ if (!(bytes = squashfs_read_data(inode->i_sb, msblk->read_page,
-+ block, bsize, NULL))) {
-+ ERROR("Unable to read page, block %llx, size %x\n", block,
-+ bsize);
-+ up(&msblk->read_page_mutex);
-+ goto skip_read;
-+ }
-+ } else {
-+ if ((fragment = get_cached_fragment(inode->i_sb,
-+ SQUASHFS_I(inode)->
-+ u.s1.fragment_start_block,
-+ SQUASHFS_I(inode)->u.s1.fragment_size))
-+ == NULL) {
-+ ERROR("Unable to read page, block %llx, size %x\n",
-+ SQUASHFS_I(inode)->
-+ u.s1.fragment_start_block,
-+ (int) SQUASHFS_I(inode)->
-+ u.s1.fragment_size);
-+ goto skip_read;
-+ }
-+ bytes = SQUASHFS_I(inode)->u.s1.fragment_offset +
-+ (i_size_read(inode) & (sblk->block_size
-+ - 1));
-+ byte_offset = SQUASHFS_I(inode)->u.s1.fragment_offset;
-+ data_ptr = fragment->data;
-+ }
-+
-+ for (i = start_index; i <= end_index && byte_offset < bytes;
-+ i++, byte_offset += PAGE_CACHE_SIZE) {
-+ struct page *push_page;
-+ int available_bytes = (bytes - byte_offset) > PAGE_CACHE_SIZE ?
-+ PAGE_CACHE_SIZE : bytes - byte_offset;
-+
-+ TRACE("bytes %d, i %d, byte_offset %d, available_bytes %d\n",
-+ bytes, i, byte_offset, available_bytes);
-+
-+ if (i == page->index) {
-+ pageaddr = kmap_atomic(page, KM_USER0);
-+ memcpy(pageaddr, data_ptr + byte_offset,
-+ available_bytes);
-+ memset(pageaddr + available_bytes, 0,
-+ PAGE_CACHE_SIZE - available_bytes);
-+ kunmap_atomic(pageaddr, KM_USER0);
-+ flush_dcache_page(page);
-+ SetPageUptodate(page);
-+ unlock_page(page);
-+ } else if ((push_page =
-+ grab_cache_page_nowait(page->mapping, i))) {
-+ pageaddr = kmap_atomic(push_page, KM_USER0);
-+
-+ memcpy(pageaddr, data_ptr + byte_offset,
-+ available_bytes);
-+ memset(pageaddr + available_bytes, 0,
-+ PAGE_CACHE_SIZE - available_bytes);
-+ kunmap_atomic(pageaddr, KM_USER0);
-+ flush_dcache_page(push_page);
-+ SetPageUptodate(push_page);
-+ unlock_page(push_page);
-+ page_cache_release(push_page);
-+ }
-+ }
-+
-+ if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+ || index < (i_size_read(inode) >>
-+ sblk->block_log))
-+ up(&msblk->read_page_mutex);
-+ else
-+ release_cached_fragment(msblk, fragment);
-+
-+ return 0;
-+
-+skip_read:
-+ pageaddr = kmap_atomic(page, KM_USER0);
-+ memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+ kunmap_atomic(pageaddr, KM_USER0);
-+ flush_dcache_page(page);
-+ SetPageUptodate(page);
-+ unlock_page(page);
-+
-+ return 0;
-+}
-+
-+
-+static int squashfs_readpage4K(struct file *file, struct page *page)
-+{
-+ struct inode *inode = page->mapping->host;
-+ struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ unsigned char block_list[SIZE];
-+ long long block;
-+ unsigned int bsize, bytes = 0;
-+ void *pageaddr;
-+
-+ TRACE("Entered squashfs_readpage4K, page index %lx, start block %llx\n",
-+ page->index,
-+ SQUASHFS_I(inode)->start_block);
-+
-+ if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
-+ PAGE_CACHE_SHIFT)) {
-+ pageaddr = kmap_atomic(page, KM_USER0);
-+ goto skip_read;
-+ }
-+
-+ if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+ || page->index < (i_size_read(inode) >>
-+ sblk->block_log)) {
-+ block = (msblk->read_blocklist)(inode, page->index, 1,
-+ block_list, NULL, &bsize);
-+
-+ down(&msblk->read_page_mutex);
-+ bytes = squashfs_read_data(inode->i_sb, msblk->read_page, block,
-+ bsize, NULL);
-+ pageaddr = kmap_atomic(page, KM_USER0);
-+ if (bytes)
-+ memcpy(pageaddr, msblk->read_page, bytes);
-+ else
-+ ERROR("Unable to read page, block %llx, size %x\n",
-+ block, bsize);
-+ up(&msblk->read_page_mutex);
-+ } else {
-+ struct squashfs_fragment_cache *fragment =
-+ get_cached_fragment(inode->i_sb,
-+ SQUASHFS_I(inode)->
-+ u.s1.fragment_start_block,
-+ SQUASHFS_I(inode)-> u.s1.fragment_size);
-+ pageaddr = kmap_atomic(page, KM_USER0);
-+ if (fragment) {
-+ bytes = i_size_read(inode) & (sblk->block_size - 1);
-+ memcpy(pageaddr, fragment->data + SQUASHFS_I(inode)->
-+ u.s1.fragment_offset, bytes);
-+ release_cached_fragment(msblk, fragment);
-+ } else
-+ ERROR("Unable to read page, block %llx, size %x\n",
-+ SQUASHFS_I(inode)->
-+ u.s1.fragment_start_block, (int)
-+ SQUASHFS_I(inode)-> u.s1.fragment_size);
-+ }
-+
-+skip_read:
-+ memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+ kunmap_atomic(pageaddr, KM_USER0);
-+ flush_dcache_page(page);
-+ SetPageUptodate(page);
-+ unlock_page(page);
-+
-+ return 0;
-+}
-+
-+
-+static int get_dir_index_using_offset(struct super_block *s, long long
-+ *next_block, unsigned int *next_offset,
-+ long long index_start,
-+ unsigned int index_offset, int i_count,
-+ long long f_pos)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ int i, length = 0;
-+ struct squashfs_dir_index index;
-+
-+ TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n",
-+ i_count, (unsigned int) f_pos);
-+
-+ f_pos =- 3;
-+ if (f_pos == 0)
-+ goto finish;
-+
-+ for (i = 0; i < i_count; i++) {
-+ if (msblk->swap) {
-+ struct squashfs_dir_index sindex;
-+ squashfs_get_cached_block(s, (char *) &sindex,
-+ index_start, index_offset,
-+ sizeof(sindex), &index_start,
-+ &index_offset);
-+ SQUASHFS_SWAP_DIR_INDEX(&index, &sindex);
-+ } else
-+ squashfs_get_cached_block(s, (char *) &index,
-+ index_start, index_offset,
-+ sizeof(index), &index_start,
-+ &index_offset);
-+
-+ if (index.index > f_pos)
-+ break;
-+
-+ squashfs_get_cached_block(s, NULL, index_start, index_offset,
-+ index.size + 1, &index_start,
-+ &index_offset);
-+
-+ length = index.index;
-+ *next_block = index.start_block + sblk->directory_table_start;
-+ }
-+
-+ *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+
-+finish:
-+ return length + 3;
-+}
-+
-+
-+static int get_dir_index_using_name(struct super_block *s, long long
-+ *next_block, unsigned int *next_offset,
-+ long long index_start,
-+ unsigned int index_offset, int i_count,
-+ const char *name, int size)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ int i, length = 0;
-+ char buffer[sizeof(struct squashfs_dir_index) + SQUASHFS_NAME_LEN + 1];
-+ struct squashfs_dir_index *index = (struct squashfs_dir_index *) buffer;
-+ char str[SQUASHFS_NAME_LEN + 1];
-+
-+ TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count);
-+
-+ strncpy(str, name, size);
-+ str[size] = '\0';
-+
-+ for (i = 0; i < i_count; i++) {
-+ if (msblk->swap) {
-+ struct squashfs_dir_index sindex;
-+ squashfs_get_cached_block(s, (char *) &sindex,
-+ index_start, index_offset,
-+ sizeof(sindex), &index_start,
-+ &index_offset);
-+ SQUASHFS_SWAP_DIR_INDEX(index, &sindex);
-+ } else
-+ squashfs_get_cached_block(s, (char *) index,
-+ index_start, index_offset,
-+ sizeof(struct squashfs_dir_index),
-+ &index_start, &index_offset);
-+
-+ squashfs_get_cached_block(s, index->name, index_start,
-+ index_offset, index->size + 1,
-+ &index_start, &index_offset);
-+
-+ index->name[index->size + 1] = '\0';
-+
-+ if (strcmp(index->name, str) > 0)
-+ break;
-+
-+ length = index->index;
-+ *next_block = index->start_block + sblk->directory_table_start;
-+ }
-+
-+ *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+ return length + 3;
-+}
-+
-+
-+static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir)
-+{
-+ struct inode *i = file->f_dentry->d_inode;
-+ struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ long long next_block = SQUASHFS_I(i)->start_block +
-+ sblk->directory_table_start;
-+ int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
-+ dir_count;
-+ struct squashfs_dir_header dirh;
-+ char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN + 1];
-+ struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer;
-+
-+ TRACE("Entered squashfs_readdir [%llx:%x]\n", next_block, next_offset);
-+
-+ while(file->f_pos < 3) {
-+ char *name;
-+ int size, i_ino;
-+
-+ if(file->f_pos == 0) {
-+ name = ".";
-+ size = 1;
-+ i_ino = i->i_ino;
-+ } else {
-+ name = "..";
-+ size = 2;
-+ i_ino = SQUASHFS_I(i)->u.s2.parent_inode;
-+ }
-+ TRACE("Calling filldir(%x, %s, %d, %d, %d, %d)\n",
-+ (unsigned int) dirent, name, size, (int)
-+ file->f_pos, i_ino,
-+ squashfs_filetype_table[1]);
-+
-+ if (filldir(dirent, name, size,
-+ file->f_pos, i_ino,
-+ squashfs_filetype_table[1]) < 0) {
-+ TRACE("Filldir returned less than 0\n");
-+ goto finish;
-+ }
-+ file->f_pos += size;
-+ dirs_read++;
-+ }
-+
-+ length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
-+ SQUASHFS_I(i)->u.s2.directory_index_start,
-+ SQUASHFS_I(i)->u.s2.directory_index_offset,
-+ SQUASHFS_I(i)->u.s2.directory_index_count,
-+ file->f_pos);
-+
-+ while (length < i_size_read(i)) {
-+ /* read directory header */
-+ if (msblk->swap) {
-+ struct squashfs_dir_header sdirh;
-+
-+ if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+ next_block, next_offset, sizeof(sdirh),
-+ &next_block, &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(sdirh);
-+ SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
-+ } else {
-+ if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+ next_block, next_offset, sizeof(dirh),
-+ &next_block, &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(dirh);
-+ }
-+
-+ dir_count = dirh.count + 1;
-+ while (dir_count--) {
-+ if (msblk->swap) {
-+ struct squashfs_dir_entry sdire;
-+ if (!squashfs_get_cached_block(i->i_sb, (char *)
-+ &sdire, next_block, next_offset,
-+ sizeof(sdire), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(sdire);
-+ SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
-+ } else {
-+ if (!squashfs_get_cached_block(i->i_sb, (char *)
-+ dire, next_block, next_offset,
-+ sizeof(*dire), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(*dire);
-+ }
-+
-+ if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+ next_block, next_offset,
-+ dire->size + 1, &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ length += dire->size + 1;
-+
-+ if (file->f_pos >= length)
-+ continue;
-+
-+ dire->name[dire->size + 1] = '\0';
-+
-+ TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d, %d)\n",
-+ (unsigned int) dirent, dire->name,
-+ dire->size + 1, (int) file->f_pos,
-+ dirh.start_block, dire->offset,
-+ dirh.inode_number + dire->inode_number,
-+ squashfs_filetype_table[dire->type]);
-+
-+ if (filldir(dirent, dire->name, dire->size + 1,
-+ file->f_pos,
-+ dirh.inode_number + dire->inode_number,
-+ squashfs_filetype_table[dire->type])
-+ < 0) {
-+ TRACE("Filldir returned less than 0\n");
-+ goto finish;
-+ }
-+ file->f_pos = length;
-+ dirs_read++;
-+ }
-+ }
-+
-+finish:
-+ return dirs_read;
-+
-+failed_read:
-+ ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+ next_offset);
-+ return 0;
-+}
-+
-+
-+static struct dentry *squashfs_lookup(struct inode *i, struct dentry *dentry,
-+ struct nameidata *nd)
-+{
-+ const unsigned char *name = dentry->d_name.name;
-+ int len = dentry->d_name.len;
-+ struct inode *inode = NULL;
-+ struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ long long next_block = SQUASHFS_I(i)->start_block +
-+ sblk->directory_table_start;
-+ int next_offset = SQUASHFS_I(i)->offset, length = 0,
-+ dir_count;
-+ struct squashfs_dir_header dirh;
-+ char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN];
-+ struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer;
-+
-+ TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset);
-+
-+ if (len > SQUASHFS_NAME_LEN)
-+ goto exit_loop;
-+
-+ length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
-+ SQUASHFS_I(i)->u.s2.directory_index_start,
-+ SQUASHFS_I(i)->u.s2.directory_index_offset,
-+ SQUASHFS_I(i)->u.s2.directory_index_count, name,
-+ len);
-+
-+ while (length < i_size_read(i)) {
-+ /* read directory header */
-+ if (msblk->swap) {
-+ struct squashfs_dir_header sdirh;
-+ if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+ next_block, next_offset, sizeof(sdirh),
-+ &next_block, &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(sdirh);
-+ SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
-+ } else {
-+ if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+ next_block, next_offset, sizeof(dirh),
-+ &next_block, &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(dirh);
-+ }
-+
-+ dir_count = dirh.count + 1;
-+ while (dir_count--) {
-+ if (msblk->swap) {
-+ struct squashfs_dir_entry sdire;
-+ if (!squashfs_get_cached_block(i->i_sb, (char *)
-+ &sdire, next_block,next_offset,
-+ sizeof(sdire), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(sdire);
-+ SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
-+ } else {
-+ if (!squashfs_get_cached_block(i->i_sb, (char *)
-+ dire, next_block,next_offset,
-+ sizeof(*dire), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(*dire);
-+ }
-+
-+ if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+ next_block, next_offset, dire->size + 1,
-+ &next_block, &next_offset))
-+ goto failed_read;
-+
-+ length += dire->size + 1;
-+
-+ if (name[0] < dire->name[0])
-+ goto exit_loop;
-+
-+ if ((len == dire->size + 1) && !strncmp(name,
-+ dire->name, len)) {
-+ squashfs_inode_t ino =
-+ SQUASHFS_MKINODE(dirh.start_block,
-+ dire->offset);
-+
-+ TRACE("calling squashfs_iget for directory "
-+ "entry %s, inode %x:%x, %d\n", name,
-+ dirh.start_block, dire->offset,
-+ dirh.inode_number + dire->inode_number);
-+
-+ inode = (msblk->iget)(i->i_sb, ino);
-+
-+ goto exit_loop;
-+ }
-+ }
-+ }
-+
-+exit_loop:
-+ d_add(dentry, inode);
-+ return ERR_PTR(0);
-+
-+failed_read:
-+ ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+ next_offset);
-+ goto exit_loop;
-+}
-+
-+
-+static void squashfs_put_super(struct super_block *s)
-+{
-+ int i;
-+
-+ if (s->s_fs_info) {
-+ struct squashfs_sb_info *sbi = s->s_fs_info;
-+ if (sbi->block_cache)
-+ for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+ if (sbi->block_cache[i].block !=
-+ SQUASHFS_INVALID_BLK)
-+ kfree(sbi->block_cache[i].data);
-+ if (sbi->fragment)
-+ for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++)
-+ SQUASHFS_FREE(sbi->fragment[i].data);
-+ kfree(sbi->fragment);
-+ kfree(sbi->block_cache);
-+ kfree(sbi->read_data);
-+ kfree(sbi->read_page);
-+ kfree(sbi->uid);
-+ kfree(sbi->fragment_index);
-+ kfree(sbi->fragment_index_2);
-+ kfree(sbi->meta_index);
-+ kfree(s->s_fs_info);
-+ s->s_fs_info = NULL;
-+ }
-+}
-+
-+
-+static int squashfs_get_sb(struct file_system_type *fs_type,
-+ int flags, const char *dev_name, void *data,
-+ struct vfsmount *mnt)
-+{
-+ return get_sb_bdev(fs_type, flags, dev_name, data, squashfs_fill_super, mnt);
-+}
-+
-+
-+static int __init init_squashfs_fs(void)
-+{
-+ int err = init_inodecache();
-+ if (err)
-+ goto out;
-+
-+ printk(KERN_INFO "squashfs: version 3.0 (2006/03/15) "
-+ "Phillip Lougher\n");
-+
-+ if (!(stream.workspace = vmalloc(zlib_inflate_workspacesize()))) {
-+ ERROR("Failed to allocate zlib workspace\n");
-+ destroy_inodecache();
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+
-+ if ((err = register_filesystem(&squashfs_fs_type))) {
-+ vfree(stream.workspace);
-+ destroy_inodecache();
-+ }
-+
-+out:
-+ return err;
-+}
-+
-+
-+static void __exit exit_squashfs_fs(void)
-+{
-+ vfree(stream.workspace);
-+ unregister_filesystem(&squashfs_fs_type);
-+ destroy_inodecache();
-+}
-+
-+
-+static struct kmem_cache * squashfs_inode_cachep;
-+
-+
-+static struct inode *squashfs_alloc_inode(struct super_block *sb)
-+{
-+ struct squashfs_inode_info *ei;
-+ ei = kmem_cache_alloc(squashfs_inode_cachep, GFP_KERNEL);
-+ if (!ei)
-+ return NULL;
-+ return &ei->vfs_inode;
-+}
-+
-+
-+static void squashfs_destroy_inode(struct inode *inode)
-+{
-+ kmem_cache_free(squashfs_inode_cachep, SQUASHFS_I(inode));
-+}
-+
-+
-+static void init_once(void * foo, struct kmem_cache * cachep, unsigned long flags)
-+{
-+ struct squashfs_inode_info *ei = foo;
-+
-+ inode_init_once(&ei->vfs_inode);
-+}
-+
-+
-+static int __init init_inodecache(void)
-+{
-+ squashfs_inode_cachep = kmem_cache_create("squashfs_inode_cache",
-+ sizeof(struct squashfs_inode_info),
-+ 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT,
-+ init_once);
-+ if (squashfs_inode_cachep == NULL)
-+ return -ENOMEM;
-+ return 0;
-+}
-+
-+
-+static void destroy_inodecache(void)
-+{
-+ kmem_cache_destroy(squashfs_inode_cachep);
-+}
-+
-+
-+module_init(init_squashfs_fs);
-+module_exit(exit_squashfs_fs);
-+MODULE_DESCRIPTION("squashfs, a compressed read-only filesystem");
-+MODULE_AUTHOR("Phillip Lougher <phillip@lougher.org.uk>");
-+MODULE_LICENSE("GPL");
---- /dev/null
-+++ b/fs/squashfs/Makefile
-@@ -0,0 +1,7 @@
-+#
-+# Makefile for the linux squashfs routines.
-+#
-+
-+obj-$(CONFIG_SQUASHFS) += squashfs.o
-+squashfs-y += inode.o
-+squashfs-y += squashfs2_0.o
---- /dev/null
-+++ b/fs/squashfs/squashfs2_0.c
-@@ -0,0 +1,758 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.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,
-+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs2_0.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/smp_lock.h>
-+#include <linux/slab.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
-+#include <linux/vfs.h>
-+#include <linux/init.h>
-+#include <linux/dcache.h>
-+#include <linux/wait.h>
-+#include <linux/zlib.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+#include "squashfs.h"
-+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir);
-+static struct dentry *squashfs_lookup_2(struct inode *, struct dentry *,
-+ struct nameidata *);
-+
-+static struct file_operations squashfs_dir_ops_2 = {
-+ .read = generic_read_dir,
-+ .readdir = squashfs_readdir_2
-+};
-+
-+static struct inode_operations squashfs_dir_inode_ops_2 = {
-+ .lookup = squashfs_lookup_2
-+};
-+
-+static unsigned char squashfs_filetype_table[] = {
-+ DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK
-+};
-+
-+static int read_fragment_index_table_2(struct super_block *s)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+ if (!(msblk->fragment_index_2 = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES_2
-+ (sblk->fragments), GFP_KERNEL))) {
-+ ERROR("Failed to allocate uid/gid table\n");
-+ return 0;
-+ }
-+
-+ if (SQUASHFS_FRAGMENT_INDEX_BYTES_2(sblk->fragments) &&
-+ !squashfs_read_data(s, (char *)
-+ msblk->fragment_index_2,
-+ sblk->fragment_table_start,
-+ SQUASHFS_FRAGMENT_INDEX_BYTES_2
-+ (sblk->fragments) |
-+ SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+ ERROR("unable to read fragment index table\n");
-+ return 0;
-+ }
-+
-+ if (msblk->swap) {
-+ int i;
-+ unsigned int fragment;
-+
-+ for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES_2(sblk->fragments);
-+ i++) {
-+ SQUASHFS_SWAP_FRAGMENT_INDEXES_2((&fragment),
-+ &msblk->fragment_index_2[i], 1);
-+ msblk->fragment_index_2[i] = fragment;
-+ }
-+ }
-+
-+ return 1;
-+}
-+
-+
-+static int get_fragment_location_2(struct super_block *s, unsigned int fragment,
-+ long long *fragment_start_block,
-+ unsigned int *fragment_size)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ long long start_block =
-+ msblk->fragment_index_2[SQUASHFS_FRAGMENT_INDEX_2(fragment)];
-+ int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET_2(fragment);
-+ struct squashfs_fragment_entry_2 fragment_entry;
-+
-+ if (msblk->swap) {
-+ struct squashfs_fragment_entry_2 sfragment_entry;
-+
-+ if (!squashfs_get_cached_block(s, (char *) &sfragment_entry,
-+ start_block, offset,
-+ sizeof(sfragment_entry), &start_block,
-+ &offset))
-+ goto out;
-+ SQUASHFS_SWAP_FRAGMENT_ENTRY_2(&fragment_entry, &sfragment_entry);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *) &fragment_entry,
-+ start_block, offset,
-+ sizeof(fragment_entry), &start_block,
-+ &offset))
-+ goto out;
-+
-+ *fragment_start_block = fragment_entry.start_block;
-+ *fragment_size = fragment_entry.size;
-+
-+ return 1;
-+
-+out:
-+ return 0;
-+}
-+
-+
-+static struct inode *squashfs_new_inode(struct super_block *s,
-+ struct squashfs_base_inode_header_2 *inodeb, unsigned int ino)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ struct inode *i = new_inode(s);
-+
-+ if (i) {
-+ i->i_ino = ino;
-+ i->i_mtime.tv_sec = sblk->mkfs_time;
-+ i->i_atime.tv_sec = sblk->mkfs_time;
-+ i->i_ctime.tv_sec = sblk->mkfs_time;
-+ i->i_uid = msblk->uid[inodeb->uid];
-+ i->i_mode = inodeb->mode;
-+ i->i_nlink = 1;
-+ i->i_size = 0;
-+ if (inodeb->guid == SQUASHFS_GUIDS)
-+ i->i_gid = i->i_uid;
-+ else
-+ i->i_gid = msblk->guid[inodeb->guid];
-+ }
-+
-+ return i;
-+}
-+
-+
-+static struct inode *squashfs_iget_2(struct super_block *s, squashfs_inode_t inode)
-+{
-+ struct inode *i;
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ unsigned int block = SQUASHFS_INODE_BLK(inode) +
-+ sblk->inode_table_start;
-+ unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
-+ unsigned int ino = SQUASHFS_MK_VFS_INODE(block
-+ - sblk->inode_table_start, offset);
-+ long long next_block;
-+ unsigned int next_offset;
-+ union squashfs_inode_header_2 id, sid;
-+ struct squashfs_base_inode_header_2 *inodeb = &id.base,
-+ *sinodeb = &sid.base;
-+
-+ TRACE("Entered squashfs_iget\n");
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *) sinodeb, block,
-+ offset, sizeof(*sinodeb), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_BASE_INODE_HEADER_2(inodeb, sinodeb,
-+ sizeof(*sinodeb));
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *) inodeb, block,
-+ offset, sizeof(*inodeb), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ switch(inodeb->inode_type) {
-+ case SQUASHFS_FILE_TYPE: {
-+ struct squashfs_reg_inode_header_2 *inodep = &id.reg;
-+ struct squashfs_reg_inode_header_2 *sinodep = &sid.reg;
-+ long long frag_blk;
-+ unsigned int frag_size;
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *)
-+ sinodep, block, offset,
-+ sizeof(*sinodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_REG_INODE_HEADER_2(inodep, sinodep);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *)
-+ inodep, block, offset,
-+ sizeof(*inodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ frag_blk = SQUASHFS_INVALID_BLK;
-+ if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+ !get_fragment_location_2(s,
-+ inodep->fragment, &frag_blk, &frag_size))
-+ goto failed_read;
-+
-+ if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_size = inodep->file_size;
-+ i->i_fop = &generic_ro_fops;
-+ i->i_mode |= S_IFREG;
-+ i->i_mtime.tv_sec = inodep->mtime;
-+ i->i_atime.tv_sec = inodep->mtime;
-+ i->i_ctime.tv_sec = inodep->mtime;
-+ i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+ i->i_blksize = PAGE_CACHE_SIZE;
-+ SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+ SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+ SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+ SQUASHFS_I(i)->start_block = inodep->start_block;
-+ SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+ SQUASHFS_I(i)->offset = next_offset;
-+ if (sblk->block_size > 4096)
-+ i->i_data.a_ops = &squashfs_aops;
-+ else
-+ i->i_data.a_ops = &squashfs_aops_4K;
-+
-+ TRACE("File inode %x:%x, start_block %x, "
-+ "block_list_start %llx, offset %x\n",
-+ SQUASHFS_INODE_BLK(inode), offset,
-+ inodep->start_block, next_block,
-+ next_offset);
-+ break;
-+ }
-+ case SQUASHFS_DIR_TYPE: {
-+ struct squashfs_dir_inode_header_2 *inodep = &id.dir;
-+ struct squashfs_dir_inode_header_2 *sinodep = &sid.dir;
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *)
-+ sinodep, block, offset,
-+ sizeof(*sinodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_DIR_INODE_HEADER_2(inodep, sinodep);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *)
-+ inodep, block, offset,
-+ sizeof(*inodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_size = inodep->file_size;
-+ i->i_op = &squashfs_dir_inode_ops_2;
-+ i->i_fop = &squashfs_dir_ops_2;
-+ i->i_mode |= S_IFDIR;
-+ i->i_mtime.tv_sec = inodep->mtime;
-+ i->i_atime.tv_sec = inodep->mtime;
-+ i->i_ctime.tv_sec = inodep->mtime;
-+ SQUASHFS_I(i)->start_block = inodep->start_block;
-+ SQUASHFS_I(i)->offset = inodep->offset;
-+ SQUASHFS_I(i)->u.s2.directory_index_count = 0;
-+ SQUASHFS_I(i)->u.s2.parent_inode = 0;
-+
-+ TRACE("Directory inode %x:%x, start_block %x, offset "
-+ "%x\n", SQUASHFS_INODE_BLK(inode),
-+ offset, inodep->start_block,
-+ inodep->offset);
-+ break;
-+ }
-+ case SQUASHFS_LDIR_TYPE: {
-+ struct squashfs_ldir_inode_header_2 *inodep = &id.ldir;
-+ struct squashfs_ldir_inode_header_2 *sinodep = &sid.ldir;
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *)
-+ sinodep, block, offset,
-+ sizeof(*sinodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_LDIR_INODE_HEADER_2(inodep,
-+ sinodep);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *)
-+ inodep, block, offset,
-+ sizeof(*inodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_size = inodep->file_size;
-+ i->i_op = &squashfs_dir_inode_ops_2;
-+ i->i_fop = &squashfs_dir_ops_2;
-+ i->i_mode |= S_IFDIR;
-+ i->i_mtime.tv_sec = inodep->mtime;
-+ i->i_atime.tv_sec = inodep->mtime;
-+ i->i_ctime.tv_sec = inodep->mtime;
-+ SQUASHFS_I(i)->start_block = inodep->start_block;
-+ SQUASHFS_I(i)->offset = inodep->offset;
-+ SQUASHFS_I(i)->u.s2.directory_index_start = next_block;
-+ SQUASHFS_I(i)->u.s2.directory_index_offset =
-+ next_offset;
-+ SQUASHFS_I(i)->u.s2.directory_index_count =
-+ inodep->i_count;
-+ SQUASHFS_I(i)->u.s2.parent_inode = 0;
-+
-+ TRACE("Long directory inode %x:%x, start_block %x, "
-+ "offset %x\n",
-+ SQUASHFS_INODE_BLK(inode), offset,
-+ inodep->start_block, inodep->offset);
-+ break;
-+ }
-+ case SQUASHFS_SYMLINK_TYPE: {
-+ struct squashfs_symlink_inode_header_2 *inodep =
-+ &id.symlink;
-+ struct squashfs_symlink_inode_header_2 *sinodep =
-+ &sid.symlink;
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *)
-+ sinodep, block, offset,
-+ sizeof(*sinodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(inodep,
-+ sinodep);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *)
-+ inodep, block, offset,
-+ sizeof(*inodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_size = inodep->symlink_size;
-+ i->i_op = &page_symlink_inode_operations;
-+ i->i_data.a_ops = &squashfs_symlink_aops;
-+ i->i_mode |= S_IFLNK;
-+ SQUASHFS_I(i)->start_block = next_block;
-+ SQUASHFS_I(i)->offset = next_offset;
-+
-+ TRACE("Symbolic link inode %x:%x, start_block %llx, "
-+ "offset %x\n",
-+ SQUASHFS_INODE_BLK(inode), offset,
-+ next_block, next_offset);
-+ break;
-+ }
-+ case SQUASHFS_BLKDEV_TYPE:
-+ case SQUASHFS_CHRDEV_TYPE: {
-+ struct squashfs_dev_inode_header_2 *inodep = &id.dev;
-+ struct squashfs_dev_inode_header_2 *sinodep = &sid.dev;
-+
-+ if (msblk->swap) {
-+ if (!squashfs_get_cached_block(s, (char *)
-+ sinodep, block, offset,
-+ sizeof(*sinodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+ SQUASHFS_SWAP_DEV_INODE_HEADER_2(inodep, sinodep);
-+ } else
-+ if (!squashfs_get_cached_block(s, (char *)
-+ inodep, block, offset,
-+ sizeof(*inodep), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_mode |= (inodeb->inode_type ==
-+ SQUASHFS_CHRDEV_TYPE) ? S_IFCHR :
-+ S_IFBLK;
-+ init_special_inode(i, i->i_mode,
-+ old_decode_dev(inodep->rdev));
-+
-+ TRACE("Device inode %x:%x, rdev %x\n",
-+ SQUASHFS_INODE_BLK(inode), offset,
-+ inodep->rdev);
-+ break;
-+ }
-+ case SQUASHFS_FIFO_TYPE:
-+ case SQUASHFS_SOCKET_TYPE: {
-+ if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+ goto failed_read1;
-+
-+ i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE)
-+ ? S_IFIFO : S_IFSOCK;
-+ init_special_inode(i, i->i_mode, 0);
-+ break;
-+ }
-+ default:
-+ ERROR("Unknown inode type %d in squashfs_iget!\n",
-+ inodeb->inode_type);
-+ goto failed_read1;
-+ }
-+
-+ insert_inode_hash(i);
-+ return i;
-+
-+failed_read:
-+ ERROR("Unable to read inode [%x:%x]\n", block, offset);
-+
-+failed_read1:
-+ return NULL;
-+}
-+
-+
-+static int get_dir_index_using_offset(struct super_block *s, long long
-+ *next_block, unsigned int *next_offset,
-+ long long index_start,
-+ unsigned int index_offset, int i_count,
-+ long long f_pos)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ int i, length = 0;
-+ struct squashfs_dir_index_2 index;
-+
-+ TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n",
-+ i_count, (unsigned int) f_pos);
-+
-+ if (f_pos == 0)
-+ goto finish;
-+
-+ for (i = 0; i < i_count; i++) {
-+ if (msblk->swap) {
-+ struct squashfs_dir_index_2 sindex;
-+ squashfs_get_cached_block(s, (char *) &sindex,
-+ index_start, index_offset,
-+ sizeof(sindex), &index_start,
-+ &index_offset);
-+ SQUASHFS_SWAP_DIR_INDEX_2(&index, &sindex);
-+ } else
-+ squashfs_get_cached_block(s, (char *) &index,
-+ index_start, index_offset,
-+ sizeof(index), &index_start,
-+ &index_offset);
-+
-+ if (index.index > f_pos)
-+ break;
-+
-+ squashfs_get_cached_block(s, NULL, index_start, index_offset,
-+ index.size + 1, &index_start,
-+ &index_offset);
-+
-+ length = index.index;
-+ *next_block = index.start_block + sblk->directory_table_start;
-+ }
-+
-+ *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+
-+finish:
-+ return length;
-+}
-+
-+
-+static int get_dir_index_using_name(struct super_block *s, long long
-+ *next_block, unsigned int *next_offset,
-+ long long index_start,
-+ unsigned int index_offset, int i_count,
-+ const char *name, int size)
-+{
-+ struct squashfs_sb_info *msblk = s->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ int i, length = 0;
-+ char buffer[sizeof(struct squashfs_dir_index_2) + SQUASHFS_NAME_LEN + 1];
-+ struct squashfs_dir_index_2 *index = (struct squashfs_dir_index_2 *) buffer;
-+ char str[SQUASHFS_NAME_LEN + 1];
-+
-+ TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count);
-+
-+ strncpy(str, name, size);
-+ str[size] = '\0';
-+
-+ for (i = 0; i < i_count; i++) {
-+ if (msblk->swap) {
-+ struct squashfs_dir_index_2 sindex;
-+ squashfs_get_cached_block(s, (char *) &sindex,
-+ index_start, index_offset,
-+ sizeof(sindex), &index_start,
-+ &index_offset);
-+ SQUASHFS_SWAP_DIR_INDEX_2(index, &sindex);
-+ } else
-+ squashfs_get_cached_block(s, (char *) index,
-+ index_start, index_offset,
-+ sizeof(struct squashfs_dir_index_2),
-+ &index_start, &index_offset);
-+
-+ squashfs_get_cached_block(s, index->name, index_start,
-+ index_offset, index->size + 1,
-+ &index_start, &index_offset);
-+
-+ index->name[index->size + 1] = '\0';
-+
-+ if (strcmp(index->name, str) > 0)
-+ break;
-+
-+ length = index->index;
-+ *next_block = index->start_block + sblk->directory_table_start;
-+ }
-+
-+ *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+ return length;
-+}
-+
-+
-+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir)
-+{
-+ struct inode *i = file->f_dentry->d_inode;
-+ struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ long long next_block = SQUASHFS_I(i)->start_block +
-+ sblk->directory_table_start;
-+ int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
-+ dir_count;
-+ struct squashfs_dir_header_2 dirh;
-+ char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN + 1];
-+ struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer;
-+
-+ TRACE("Entered squashfs_readdir_2 [%llx:%x]\n", next_block, next_offset);
-+
-+ length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
-+ SQUASHFS_I(i)->u.s2.directory_index_start,
-+ SQUASHFS_I(i)->u.s2.directory_index_offset,
-+ SQUASHFS_I(i)->u.s2.directory_index_count,
-+ file->f_pos);
-+
-+ while (length < i_size_read(i)) {
-+ /* read directory header */
-+ if (msblk->swap) {
-+ struct squashfs_dir_header_2 sdirh;
-+
-+ if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+ next_block, next_offset, sizeof(sdirh),
-+ &next_block, &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(sdirh);
-+ SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh);
-+ } else {
-+ if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+ next_block, next_offset, sizeof(dirh),
-+ &next_block, &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(dirh);
-+ }
-+
-+ dir_count = dirh.count + 1;
-+ while (dir_count--) {
-+ if (msblk->swap) {
-+ struct squashfs_dir_entry_2 sdire;
-+ if (!squashfs_get_cached_block(i->i_sb, (char *)
-+ &sdire, next_block, next_offset,
-+ sizeof(sdire), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(sdire);
-+ SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire);
-+ } else {
-+ if (!squashfs_get_cached_block(i->i_sb, (char *)
-+ dire, next_block, next_offset,
-+ sizeof(*dire), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(*dire);
-+ }
-+
-+ if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+ next_block, next_offset,
-+ dire->size + 1, &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ length += dire->size + 1;
-+
-+ if (file->f_pos >= length)
-+ continue;
-+
-+ dire->name[dire->size + 1] = '\0';
-+
-+ TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d)\n",
-+ (unsigned int) dirent, dire->name,
-+ dire->size + 1, (int) file->f_pos,
-+ dirh.start_block, dire->offset,
-+ squashfs_filetype_table[dire->type]);
-+
-+ if (filldir(dirent, dire->name, dire->size + 1,
-+ file->f_pos, SQUASHFS_MK_VFS_INODE(
-+ dirh.start_block, dire->offset),
-+ squashfs_filetype_table[dire->type])
-+ < 0) {
-+ TRACE("Filldir returned less than 0\n");
-+ goto finish;
-+ }
-+ file->f_pos = length;
-+ dirs_read++;
-+ }
-+ }
-+
-+finish:
-+ return dirs_read;
-+
-+failed_read:
-+ ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+ next_offset);
-+ return 0;
-+}
-+
-+
-+static struct dentry *squashfs_lookup_2(struct inode *i, struct dentry *dentry,
-+ struct nameidata *nd)
-+{
-+ const unsigned char *name = dentry->d_name.name;
-+ int len = dentry->d_name.len;
-+ struct inode *inode = NULL;
-+ struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+ long long next_block = SQUASHFS_I(i)->start_block +
-+ sblk->directory_table_start;
-+ int next_offset = SQUASHFS_I(i)->offset, length = 0,
-+ dir_count;
-+ struct squashfs_dir_header_2 dirh;
-+ char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN];
-+ struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer;
-+ int sorted = sblk->s_major == 2 && sblk->s_minor >= 1;
-+
-+ TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset);
-+
-+ if (len > SQUASHFS_NAME_LEN)
-+ goto exit_loop;
-+
-+ length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
-+ SQUASHFS_I(i)->u.s2.directory_index_start,
-+ SQUASHFS_I(i)->u.s2.directory_index_offset,
-+ SQUASHFS_I(i)->u.s2.directory_index_count, name,
-+ len);
-+
-+ while (length < i_size_read(i)) {
-+ /* read directory header */
-+ if (msblk->swap) {
-+ struct squashfs_dir_header_2 sdirh;
-+ if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+ next_block, next_offset, sizeof(sdirh),
-+ &next_block, &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(sdirh);
-+ SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh);
-+ } else {
-+ if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+ next_block, next_offset, sizeof(dirh),
-+ &next_block, &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(dirh);
-+ }
-+
-+ dir_count = dirh.count + 1;
-+ while (dir_count--) {
-+ if (msblk->swap) {
-+ struct squashfs_dir_entry_2 sdire;
-+ if (!squashfs_get_cached_block(i->i_sb, (char *)
-+ &sdire, next_block,next_offset,
-+ sizeof(sdire), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(sdire);
-+ SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire);
-+ } else {
-+ if (!squashfs_get_cached_block(i->i_sb, (char *)
-+ dire, next_block,next_offset,
-+ sizeof(*dire), &next_block,
-+ &next_offset))
-+ goto failed_read;
-+
-+ length += sizeof(*dire);
-+ }
-+
-+ if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+ next_block, next_offset, dire->size + 1,
-+ &next_block, &next_offset))
-+ goto failed_read;
-+
-+ length += dire->size + 1;
-+
-+ if (sorted && name[0] < dire->name[0])
-+ goto exit_loop;
-+
-+ if ((len == dire->size + 1) && !strncmp(name,
-+ dire->name, len)) {
-+ squashfs_inode_t ino =
-+ SQUASHFS_MKINODE(dirh.start_block,
-+ dire->offset);
-+
-+ TRACE("calling squashfs_iget for directory "
-+ "entry %s, inode %x:%x, %lld\n", name,
-+ dirh.start_block, dire->offset, ino);
-+
-+ inode = (msblk->iget)(i->i_sb, ino);
-+
-+ goto exit_loop;
-+ }
-+ }
-+ }
-+
-+exit_loop:
-+ d_add(dentry, inode);
-+ return ERR_PTR(0);
-+
-+failed_read:
-+ ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+ next_offset);
-+ goto exit_loop;
-+}
-+
-+
-+int squashfs_2_0_supported(struct squashfs_sb_info *msblk)
-+{
-+ struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+ msblk->iget = squashfs_iget_2;
-+ msblk->read_fragment_index_table = read_fragment_index_table_2;
-+
-+ sblk->bytes_used = sblk->bytes_used_2;
-+ sblk->uid_start = sblk->uid_start_2;
-+ sblk->guid_start = sblk->guid_start_2;
-+ sblk->inode_table_start = sblk->inode_table_start_2;
-+ sblk->directory_table_start = sblk->directory_table_start_2;
-+ sblk->fragment_table_start = sblk->fragment_table_start_2;
-+
-+ return 1;
-+}
---- /dev/null
-+++ b/fs/squashfs/squashfs.h
-@@ -0,0 +1,86 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.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,
-+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs.h
-+ */
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+#undef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+#endif
-+
-+#ifdef SQUASHFS_TRACE
-+#define TRACE(s, args...) printk(KERN_NOTICE "SQUASHFS: "s, ## args)
-+#else
-+#define TRACE(s, args...) {}
-+#endif
-+
-+#define ERROR(s, args...) printk(KERN_ERR "SQUASHFS error: "s, ## args)
-+
-+#define SERROR(s, args...) do { \
-+ if (!silent) \
-+ printk(KERN_ERR "SQUASHFS error: "s, ## args);\
-+ } while(0)
-+
-+#define WARNING(s, args...) printk(KERN_WARNING "SQUASHFS: "s, ## args)
-+
-+static inline struct squashfs_inode_info *SQUASHFS_I(struct inode *inode)
-+{
-+ return list_entry(inode, struct squashfs_inode_info, vfs_inode);
-+}
-+
-+#if defined(CONFIG_SQUASHFS_1_0_COMPATIBILITY ) || defined(CONFIG_SQUASHFS_2_0_COMPATIBILITY)
-+#define SQSH_EXTERN
-+extern unsigned int squashfs_read_data(struct super_block *s, char *buffer,
-+ long long index, unsigned int length,
-+ long long *next_index);
-+extern int squashfs_get_cached_block(struct super_block *s, char *buffer,
-+ long long block, unsigned int offset,
-+ int length, long long *next_block,
-+ unsigned int *next_offset);
-+extern void release_cached_fragment(struct squashfs_sb_info *msblk, struct
-+ squashfs_fragment_cache *fragment);
-+extern struct squashfs_fragment_cache *get_cached_fragment(struct super_block
-+ *s, long long start_block,
-+ int length);
-+extern struct address_space_operations squashfs_symlink_aops;
-+extern struct address_space_operations squashfs_aops;
-+extern struct address_space_operations squashfs_aops_4K;
-+extern struct inode_operations squashfs_dir_inode_ops;
-+#else
-+#define SQSH_EXTERN static
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+extern int squashfs_1_0_supported(struct squashfs_sb_info *msblk);
-+#else
-+static inline int squashfs_1_0_supported(struct squashfs_sb_info *msblk)
-+{
-+ return 0;
-+}
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+extern int squashfs_2_0_supported(struct squashfs_sb_info *msblk);
-+#else
-+static inline int squashfs_2_0_supported(struct squashfs_sb_info *msblk)
-+{
-+ return 0;
-+}
-+#endif
---- a/include/linux/magic.h
-+++ b/include/linux/magic.h
-@@ -35,6 +35,9 @@
- #define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs"
- #define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs"
-
-+#define SQUASHFS_MAGIC 0x73717368
-+#define SQUASHFS_MAGIC_SWAP 0x68737173
-+
- #define SMB_SUPER_MAGIC 0x517B
- #define USBDEVICE_SUPER_MAGIC 0x9fa2
- #define CGROUP_SUPER_MAGIC 0x27e0eb
---- /dev/null
-+++ b/include/linux/squashfs_fs.h
-@@ -0,0 +1,911 @@
-+#ifndef SQUASHFS_FS
-+#define SQUASHFS_FS
-+
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.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,
-+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs.h
-+ */
-+
-+#ifndef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#define CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_VMALLOC
-+#define SQUASHFS_ALLOC(a) vmalloc(a)
-+#define SQUASHFS_FREE(a) vfree(a)
-+#else
-+#define SQUASHFS_ALLOC(a) kmalloc(a, GFP_KERNEL)
-+#define SQUASHFS_FREE(a) kfree(a)
-+#endif
-+#define SQUASHFS_CACHED_FRAGMENTS CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE
-+#define SQUASHFS_MAJOR 3
-+#define SQUASHFS_MINOR 0
-+#define SQUASHFS_START 0
-+
-+/* size of metadata (inode and directory) blocks */
-+#define SQUASHFS_METADATA_SIZE 8192
-+#define SQUASHFS_METADATA_LOG 13
-+
-+/* default size of data blocks */
-+#define SQUASHFS_FILE_SIZE 65536
-+#define SQUASHFS_FILE_LOG 16
-+
-+#define SQUASHFS_FILE_MAX_SIZE 65536
-+
-+/* Max number of uids and gids */
-+#define SQUASHFS_UIDS 256
-+#define SQUASHFS_GUIDS 255
-+
-+/* Max length of filename (not 255) */
-+#define SQUASHFS_NAME_LEN 256
-+
-+#define SQUASHFS_INVALID ((long long) 0xffffffffffff)
-+#define SQUASHFS_INVALID_FRAG ((unsigned int) 0xffffffff)
-+#define SQUASHFS_INVALID_BLK ((long long) -1)
-+#define SQUASHFS_USED_BLK ((long long) -2)
-+
-+/* Filesystem flags */
-+#define SQUASHFS_NOI 0
-+#define SQUASHFS_NOD 1
-+#define SQUASHFS_CHECK 2
-+#define SQUASHFS_NOF 3
-+#define SQUASHFS_NO_FRAG 4
-+#define SQUASHFS_ALWAYS_FRAG 5
-+#define SQUASHFS_DUPLICATE 6
-+
-+#define SQUASHFS_BIT(flag, bit) ((flag >> bit) & 1)
-+
-+#define SQUASHFS_UNCOMPRESSED_INODES(flags) SQUASHFS_BIT(flags, \
-+ SQUASHFS_NOI)
-+
-+#define SQUASHFS_UNCOMPRESSED_DATA(flags) SQUASHFS_BIT(flags, \
-+ SQUASHFS_NOD)
-+
-+#define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags) SQUASHFS_BIT(flags, \
-+ SQUASHFS_NOF)
-+
-+#define SQUASHFS_NO_FRAGMENTS(flags) SQUASHFS_BIT(flags, \
-+ SQUASHFS_NO_FRAG)
-+
-+#define SQUASHFS_ALWAYS_FRAGMENTS(flags) SQUASHFS_BIT(flags, \
-+ SQUASHFS_ALWAYS_FRAG)
-+
-+#define SQUASHFS_DUPLICATES(flags) SQUASHFS_BIT(flags, \
-+ SQUASHFS_DUPLICATE)
-+
-+#define SQUASHFS_CHECK_DATA(flags) SQUASHFS_BIT(flags, \
-+ SQUASHFS_CHECK)
-+
-+#define SQUASHFS_MKFLAGS(noi, nod, check_data, nof, no_frag, always_frag, \
-+ duplicate_checking) (noi | (nod << 1) | (check_data << 2) \
-+ | (nof << 3) | (no_frag << 4) | (always_frag << 5) | \
-+ (duplicate_checking << 6))
-+
-+/* Max number of types and file types */
-+#define SQUASHFS_DIR_TYPE 1
-+#define SQUASHFS_FILE_TYPE 2
-+#define SQUASHFS_SYMLINK_TYPE 3
-+#define SQUASHFS_BLKDEV_TYPE 4
-+#define SQUASHFS_CHRDEV_TYPE 5
-+#define SQUASHFS_FIFO_TYPE 6
-+#define SQUASHFS_SOCKET_TYPE 7
-+#define SQUASHFS_LDIR_TYPE 8
-+#define SQUASHFS_LREG_TYPE 9
-+
-+/* 1.0 filesystem type definitions */
-+#define SQUASHFS_TYPES 5
-+#define SQUASHFS_IPC_TYPE 0
-+
-+/* Flag whether block is compressed or uncompressed, bit is set if block is
-+ * uncompressed */
-+#define SQUASHFS_COMPRESSED_BIT (1 << 15)
-+
-+#define SQUASHFS_COMPRESSED_SIZE(B) (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \
-+ (B) & ~SQUASHFS_COMPRESSED_BIT : SQUASHFS_COMPRESSED_BIT)
-+
-+#define SQUASHFS_COMPRESSED(B) (!((B) & SQUASHFS_COMPRESSED_BIT))
-+
-+#define SQUASHFS_COMPRESSED_BIT_BLOCK (1 << 24)
-+
-+#define SQUASHFS_COMPRESSED_SIZE_BLOCK(B) (((B) & \
-+ ~SQUASHFS_COMPRESSED_BIT_BLOCK) ? (B) & \
-+ ~SQUASHFS_COMPRESSED_BIT_BLOCK : SQUASHFS_COMPRESSED_BIT_BLOCK)
-+
-+#define SQUASHFS_COMPRESSED_BLOCK(B) (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK))
-+
-+/*
-+ * Inode number ops. Inodes consist of a compressed block number, and an
-+ * uncompressed offset within that block
-+ */
-+#define SQUASHFS_INODE_BLK(a) ((unsigned int) ((a) >> 16))
-+
-+#define SQUASHFS_INODE_OFFSET(a) ((unsigned int) ((a) & 0xffff))
-+
-+#define SQUASHFS_MKINODE(A, B) ((squashfs_inode_t)(((squashfs_inode_t) (A)\
-+ << 16) + (B)))
-+
-+/* Compute 32 bit VFS inode number from squashfs inode number */
-+#define SQUASHFS_MK_VFS_INODE(a, b) ((unsigned int) (((a) << 8) + \
-+ ((b) >> 2) + 1))
-+/* XXX */
-+
-+/* Translate between VFS mode and squashfs mode */
-+#define SQUASHFS_MODE(a) ((a) & 0xfff)
-+
-+/* fragment and fragment table defines */
-+#define SQUASHFS_FRAGMENT_BYTES(A) (A * sizeof(struct squashfs_fragment_entry))
-+
-+#define SQUASHFS_FRAGMENT_INDEX(A) (SQUASHFS_FRAGMENT_BYTES(A) / \
-+ SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_OFFSET(A) (SQUASHFS_FRAGMENT_BYTES(A) % \
-+ SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEXES(A) ((SQUASHFS_FRAGMENT_BYTES(A) + \
-+ SQUASHFS_METADATA_SIZE - 1) / \
-+ SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_BYTES(A) (SQUASHFS_FRAGMENT_INDEXES(A) *\
-+ sizeof(long long))
-+
-+/* cached data constants for filesystem */
-+#define SQUASHFS_CACHED_BLKS 8
-+
-+#define SQUASHFS_MAX_FILE_SIZE_LOG 64
-+
-+#define SQUASHFS_MAX_FILE_SIZE ((long long) 1 << \
-+ (SQUASHFS_MAX_FILE_SIZE_LOG - 2))
-+
-+#define SQUASHFS_MARKER_BYTE 0xff
-+
-+/* meta index cache */
-+#define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int))
-+#define SQUASHFS_META_ENTRIES 31
-+#define SQUASHFS_META_NUMBER 8
-+#define SQUASHFS_SLOTS 4
-+
-+#include <linux/magic.h>
-+
-+struct meta_entry {
-+ long long data_block;
-+ unsigned int index_block;
-+ unsigned short offset;
-+ unsigned short pad;
-+};
-+
-+struct meta_index {
-+ unsigned int inode_number;
-+ unsigned int offset;
-+ unsigned short entries;
-+ unsigned short skip;
-+ unsigned short locked;
-+ unsigned short pad;
-+ struct meta_entry meta_entry[SQUASHFS_META_ENTRIES];
-+};
-+
-+
-+/*
-+ * definitions for structures on disk
-+ */
-+
-+typedef long long squashfs_block_t;
-+typedef long long squashfs_inode_t;
-+
-+struct squashfs_super_block {
-+ unsigned int s_magic;
-+ unsigned int inodes;
-+ unsigned int bytes_used_2;
-+ unsigned int uid_start_2;
-+ unsigned int guid_start_2;
-+ unsigned int inode_table_start_2;
-+ unsigned int directory_table_start_2;
-+ unsigned int s_major:16;
-+ unsigned int s_minor:16;
-+ unsigned int block_size_1:16;
-+ unsigned int block_log:16;
-+ unsigned int flags:8;
-+ unsigned int no_uids:8;
-+ unsigned int no_guids:8;
-+ unsigned int mkfs_time /* time of filesystem creation */;
-+ squashfs_inode_t root_inode;
-+ unsigned int block_size;
-+ unsigned int fragments;
-+ unsigned int fragment_table_start_2;
-+ long long bytes_used;
-+ long long uid_start;
-+ long long guid_start;
-+ long long inode_table_start;
-+ long long directory_table_start;
-+ long long fragment_table_start;
-+ long long unused;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_index {
-+ unsigned int index;
-+ unsigned int start_block;
-+ unsigned char size;
-+ unsigned char name[0];
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_BASE_INODE_HEADER \
-+ unsigned int inode_type:4; \
-+ unsigned int mode:12; \
-+ unsigned int uid:8; \
-+ unsigned int guid:8; \
-+ unsigned int mtime; \
-+ unsigned int inode_number;
-+
-+struct squashfs_base_inode_header {
-+ SQUASHFS_BASE_INODE_HEADER;
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header {
-+ SQUASHFS_BASE_INODE_HEADER;
-+ unsigned int nlink;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header {
-+ SQUASHFS_BASE_INODE_HEADER;
-+ unsigned int nlink;
-+ unsigned short rdev;
-+} __attribute__ ((packed));
-+
-+struct squashfs_symlink_inode_header {
-+ SQUASHFS_BASE_INODE_HEADER;
-+ unsigned int nlink;
-+ unsigned short symlink_size;
-+ char symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header {
-+ SQUASHFS_BASE_INODE_HEADER;
-+ squashfs_block_t start_block;
-+ unsigned int fragment;
-+ unsigned int offset;
-+ unsigned int file_size;
-+ unsigned short block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_lreg_inode_header {
-+ SQUASHFS_BASE_INODE_HEADER;
-+ unsigned int nlink;
-+ squashfs_block_t start_block;
-+ unsigned int fragment;
-+ unsigned int offset;
-+ long long file_size;
-+ unsigned short block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header {
-+ SQUASHFS_BASE_INODE_HEADER;
-+ unsigned int nlink;
-+ unsigned int file_size:19;
-+ unsigned int offset:13;
-+ unsigned int start_block;
-+ unsigned int parent_inode;
-+} __attribute__ ((packed));
-+
-+struct squashfs_ldir_inode_header {
-+ SQUASHFS_BASE_INODE_HEADER;
-+ unsigned int nlink;
-+ unsigned int file_size:27;
-+ unsigned int offset:13;
-+ unsigned int start_block;
-+ unsigned int i_count:16;
-+ unsigned int parent_inode;
-+ struct squashfs_dir_index index[0];
-+} __attribute__ ((packed));
-+
-+union squashfs_inode_header {
-+ struct squashfs_base_inode_header base;
-+ struct squashfs_dev_inode_header dev;
-+ struct squashfs_symlink_inode_header symlink;
-+ struct squashfs_reg_inode_header reg;
-+ struct squashfs_lreg_inode_header lreg;
-+ struct squashfs_dir_inode_header dir;
-+ struct squashfs_ldir_inode_header ldir;
-+ struct squashfs_ipc_inode_header ipc;
-+};
-+
-+struct squashfs_dir_entry {
-+ unsigned int offset:13;
-+ unsigned int type:3;
-+ unsigned int size:8;
-+ int inode_number:16;
-+ char name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_header {
-+ unsigned int count:8;
-+ unsigned int start_block;
-+ unsigned int inode_number;
-+} __attribute__ ((packed));
-+
-+struct squashfs_fragment_entry {
-+ long long start_block;
-+ unsigned int size;
-+ unsigned int unused;
-+} __attribute__ ((packed));
-+
-+extern int squashfs_uncompress_block(void *d, int dstlen, void *s, int srclen);
-+extern int squashfs_uncompress_init(void);
-+extern int squashfs_uncompress_exit(void);
-+
-+/*
-+ * macros to convert each packed bitfield structure from little endian to big
-+ * endian and vice versa. These are needed when creating or using a filesystem
-+ * on a machine with different byte ordering to the target architecture.
-+ *
-+ */
-+
-+#define SQUASHFS_SWAP_START \
-+ int bits;\
-+ int b_pos;\
-+ unsigned long long val;\
-+ unsigned char *s;\
-+ unsigned char *d;
-+
-+#define SQUASHFS_SWAP_SUPER_BLOCK(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_super_block));\
-+ SQUASHFS_SWAP((s)->s_magic, d, 0, 32);\
-+ SQUASHFS_SWAP((s)->inodes, d, 32, 32);\
-+ SQUASHFS_SWAP((s)->bytes_used_2, d, 64, 32);\
-+ SQUASHFS_SWAP((s)->uid_start_2, d, 96, 32);\
-+ SQUASHFS_SWAP((s)->guid_start_2, d, 128, 32);\
-+ SQUASHFS_SWAP((s)->inode_table_start_2, d, 160, 32);\
-+ SQUASHFS_SWAP((s)->directory_table_start_2, d, 192, 32);\
-+ SQUASHFS_SWAP((s)->s_major, d, 224, 16);\
-+ SQUASHFS_SWAP((s)->s_minor, d, 240, 16);\
-+ SQUASHFS_SWAP((s)->block_size_1, d, 256, 16);\
-+ SQUASHFS_SWAP((s)->block_log, d, 272, 16);\
-+ SQUASHFS_SWAP((s)->flags, d, 288, 8);\
-+ SQUASHFS_SWAP((s)->no_uids, d, 296, 8);\
-+ SQUASHFS_SWAP((s)->no_guids, d, 304, 8);\
-+ SQUASHFS_SWAP((s)->mkfs_time, d, 312, 32);\
-+ SQUASHFS_SWAP((s)->root_inode, d, 344, 64);\
-+ SQUASHFS_SWAP((s)->block_size, d, 408, 32);\
-+ SQUASHFS_SWAP((s)->fragments, d, 440, 32);\
-+ SQUASHFS_SWAP((s)->fragment_table_start_2, d, 472, 32);\
-+ SQUASHFS_SWAP((s)->bytes_used, d, 504, 64);\
-+ SQUASHFS_SWAP((s)->uid_start, d, 568, 64);\
-+ SQUASHFS_SWAP((s)->guid_start, d, 632, 64);\
-+ SQUASHFS_SWAP((s)->inode_table_start, d, 696, 64);\
-+ SQUASHFS_SWAP((s)->directory_table_start, d, 760, 64);\
-+ SQUASHFS_SWAP((s)->fragment_table_start, d, 824, 64);\
-+ SQUASHFS_SWAP((s)->unused, d, 888, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\
-+ SQUASHFS_MEMSET(s, d, n);\
-+ SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+ SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+ SQUASHFS_SWAP((s)->uid, d, 16, 8);\
-+ SQUASHFS_SWAP((s)->guid, d, 24, 8);\
-+ SQUASHFS_SWAP((s)->mtime, d, 32, 32);\
-+ SQUASHFS_SWAP((s)->inode_number, d, 64, 32);
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, n) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+ sizeof(struct squashfs_ipc_inode_header))\
-+ SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+ sizeof(struct squashfs_dev_inode_header)); \
-+ SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+ SQUASHFS_SWAP((s)->rdev, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+ sizeof(struct squashfs_symlink_inode_header));\
-+ SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+ SQUASHFS_SWAP((s)->symlink_size, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+ sizeof(struct squashfs_reg_inode_header));\
-+ SQUASHFS_SWAP((s)->start_block, d, 96, 64);\
-+ SQUASHFS_SWAP((s)->fragment, d, 160, 32);\
-+ SQUASHFS_SWAP((s)->offset, d, 192, 32);\
-+ SQUASHFS_SWAP((s)->file_size, d, 224, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LREG_INODE_HEADER(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+ sizeof(struct squashfs_lreg_inode_header));\
-+ SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+ SQUASHFS_SWAP((s)->start_block, d, 128, 64);\
-+ SQUASHFS_SWAP((s)->fragment, d, 192, 32);\
-+ SQUASHFS_SWAP((s)->offset, d, 224, 32);\
-+ SQUASHFS_SWAP((s)->file_size, d, 256, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+ sizeof(struct squashfs_dir_inode_header));\
-+ SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+ SQUASHFS_SWAP((s)->file_size, d, 128, 19);\
-+ SQUASHFS_SWAP((s)->offset, d, 147, 13);\
-+ SQUASHFS_SWAP((s)->start_block, d, 160, 32);\
-+ SQUASHFS_SWAP((s)->parent_inode, d, 192, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+ sizeof(struct squashfs_ldir_inode_header));\
-+ SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+ SQUASHFS_SWAP((s)->file_size, d, 128, 27);\
-+ SQUASHFS_SWAP((s)->offset, d, 155, 13);\
-+ SQUASHFS_SWAP((s)->start_block, d, 168, 32);\
-+ SQUASHFS_SWAP((s)->i_count, d, 200, 16);\
-+ SQUASHFS_SWAP((s)->parent_inode, d, 216, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INDEX(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index));\
-+ SQUASHFS_SWAP((s)->index, d, 0, 32);\
-+ SQUASHFS_SWAP((s)->start_block, d, 32, 32);\
-+ SQUASHFS_SWAP((s)->size, d, 64, 8);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_HEADER(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header));\
-+ SQUASHFS_SWAP((s)->count, d, 0, 8);\
-+ SQUASHFS_SWAP((s)->start_block, d, 8, 32);\
-+ SQUASHFS_SWAP((s)->inode_number, d, 40, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_ENTRY(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry));\
-+ SQUASHFS_SWAP((s)->offset, d, 0, 13);\
-+ SQUASHFS_SWAP((s)->type, d, 13, 3);\
-+ SQUASHFS_SWAP((s)->size, d, 16, 8);\
-+ SQUASHFS_SWAP((s)->inode_number, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry));\
-+ SQUASHFS_SWAP((s)->start_block, d, 0, 64);\
-+ SQUASHFS_SWAP((s)->size, d, 64, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_SHORTS(s, d, n) {\
-+ int entry;\
-+ int bit_position;\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, n * 2);\
-+ for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+ 16)\
-+ SQUASHFS_SWAP(s[entry], d, bit_position, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_INTS(s, d, n) {\
-+ int entry;\
-+ int bit_position;\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, n * 4);\
-+ for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+ 32)\
-+ SQUASHFS_SWAP(s[entry], d, bit_position, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LONG_LONGS(s, d, n) {\
-+ int entry;\
-+ int bit_position;\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, n * 8);\
-+ for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+ 64)\
-+ SQUASHFS_SWAP(s[entry], d, bit_position, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_DATA(s, d, n, bits) {\
-+ int entry;\
-+ int bit_position;\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, n * bits / 8);\
-+ for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+ bits)\
-+ SQUASHFS_SWAP(s[entry], d, bit_position, bits);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_INDEXES(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n)
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+
-+struct squashfs_base_inode_header_1 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:4; /* index into uid table */
-+ unsigned int guid:4; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header_1 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:4; /* index into uid table */
-+ unsigned int guid:4; /* index into guid table */
-+ unsigned int type:4;
-+ unsigned int offset:4;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header_1 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:4; /* index into uid table */
-+ unsigned int guid:4; /* index into guid table */
-+ unsigned short rdev;
-+} __attribute__ ((packed));
-+
-+struct squashfs_symlink_inode_header_1 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:4; /* index into uid table */
-+ unsigned int guid:4; /* index into guid table */
-+ unsigned short symlink_size;
-+ char symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header_1 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:4; /* index into uid table */
-+ unsigned int guid:4; /* index into guid table */
-+ unsigned int mtime;
-+ unsigned int start_block;
-+ unsigned int file_size:32;
-+ unsigned short block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header_1 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:4; /* index into uid table */
-+ unsigned int guid:4; /* index into guid table */
-+ unsigned int file_size:19;
-+ unsigned int offset:13;
-+ unsigned int mtime;
-+ unsigned int start_block:24;
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n) \
-+ SQUASHFS_MEMSET(s, d, n);\
-+ SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+ SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+ SQUASHFS_SWAP((s)->uid, d, 16, 4);\
-+ SQUASHFS_SWAP((s)->guid, d, 20, 4);
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER_1(s, d, n) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER_1(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+ sizeof(struct squashfs_ipc_inode_header_1));\
-+ SQUASHFS_SWAP((s)->type, d, 24, 4);\
-+ SQUASHFS_SWAP((s)->offset, d, 28, 4);\
-+}
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER_1(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+ sizeof(struct squashfs_dev_inode_header_1));\
-+ SQUASHFS_SWAP((s)->rdev, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_1(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+ sizeof(struct squashfs_symlink_inode_header_1));\
-+ SQUASHFS_SWAP((s)->symlink_size, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER_1(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+ sizeof(struct squashfs_reg_inode_header_1));\
-+ SQUASHFS_SWAP((s)->mtime, d, 24, 32);\
-+ SQUASHFS_SWAP((s)->start_block, d, 56, 32);\
-+ SQUASHFS_SWAP((s)->file_size, d, 88, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER_1(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+ sizeof(struct squashfs_dir_inode_header_1));\
-+ SQUASHFS_SWAP((s)->file_size, d, 24, 19);\
-+ SQUASHFS_SWAP((s)->offset, d, 43, 13);\
-+ SQUASHFS_SWAP((s)->mtime, d, 56, 32);\
-+ SQUASHFS_SWAP((s)->start_block, d, 88, 24);\
-+}
-+
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+
-+struct squashfs_dir_index_2 {
-+ unsigned int index:27;
-+ unsigned int start_block:29;
-+ unsigned char size;
-+ unsigned char name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_base_inode_header_2 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:8; /* index into uid table */
-+ unsigned int guid:8; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header_2 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:8; /* index into uid table */
-+ unsigned int guid:8; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header_2 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:8; /* index into uid table */
-+ unsigned int guid:8; /* index into guid table */
-+ unsigned short rdev;
-+} __attribute__ ((packed));
-+
-+struct squashfs_symlink_inode_header_2 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:8; /* index into uid table */
-+ unsigned int guid:8; /* index into guid table */
-+ unsigned short symlink_size;
-+ char symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header_2 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:8; /* index into uid table */
-+ unsigned int guid:8; /* index into guid table */
-+ unsigned int mtime;
-+ unsigned int start_block;
-+ unsigned int fragment;
-+ unsigned int offset;
-+ unsigned int file_size:32;
-+ unsigned short block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header_2 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:8; /* index into uid table */
-+ unsigned int guid:8; /* index into guid table */
-+ unsigned int file_size:19;
-+ unsigned int offset:13;
-+ unsigned int mtime;
-+ unsigned int start_block:24;
-+} __attribute__ ((packed));
-+
-+struct squashfs_ldir_inode_header_2 {
-+ unsigned int inode_type:4;
-+ unsigned int mode:12; /* protection */
-+ unsigned int uid:8; /* index into uid table */
-+ unsigned int guid:8; /* index into guid table */
-+ unsigned int file_size:27;
-+ unsigned int offset:13;
-+ unsigned int mtime;
-+ unsigned int start_block:24;
-+ unsigned int i_count:16;
-+ struct squashfs_dir_index_2 index[0];
-+} __attribute__ ((packed));
-+
-+union squashfs_inode_header_2 {
-+ struct squashfs_base_inode_header_2 base;
-+ struct squashfs_dev_inode_header_2 dev;
-+ struct squashfs_symlink_inode_header_2 symlink;
-+ struct squashfs_reg_inode_header_2 reg;
-+ struct squashfs_dir_inode_header_2 dir;
-+ struct squashfs_ldir_inode_header_2 ldir;
-+ struct squashfs_ipc_inode_header_2 ipc;
-+};
-+
-+struct squashfs_dir_header_2 {
-+ unsigned int count:8;
-+ unsigned int start_block:24;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_entry_2 {
-+ unsigned int offset:13;
-+ unsigned int type:3;
-+ unsigned int size:8;
-+ char name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_fragment_entry_2 {
-+ unsigned int start_block;
-+ unsigned int size;
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\
-+ SQUASHFS_MEMSET(s, d, n);\
-+ SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+ SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+ SQUASHFS_SWAP((s)->uid, d, 16, 8);\
-+ SQUASHFS_SWAP((s)->guid, d, 24, 8);\
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, n) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER_2(s, d) \
-+ SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, sizeof(struct squashfs_ipc_inode_header_2))
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER_2(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+ sizeof(struct squashfs_dev_inode_header_2)); \
-+ SQUASHFS_SWAP((s)->rdev, d, 32, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+ sizeof(struct squashfs_symlink_inode_header_2));\
-+ SQUASHFS_SWAP((s)->symlink_size, d, 32, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER_2(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+ sizeof(struct squashfs_reg_inode_header_2));\
-+ SQUASHFS_SWAP((s)->mtime, d, 32, 32);\
-+ SQUASHFS_SWAP((s)->start_block, d, 64, 32);\
-+ SQUASHFS_SWAP((s)->fragment, d, 96, 32);\
-+ SQUASHFS_SWAP((s)->offset, d, 128, 32);\
-+ SQUASHFS_SWAP((s)->file_size, d, 160, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER_2(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+ sizeof(struct squashfs_dir_inode_header_2));\
-+ SQUASHFS_SWAP((s)->file_size, d, 32, 19);\
-+ SQUASHFS_SWAP((s)->offset, d, 51, 13);\
-+ SQUASHFS_SWAP((s)->mtime, d, 64, 32);\
-+ SQUASHFS_SWAP((s)->start_block, d, 96, 24);\
-+}
-+
-+#define SQUASHFS_SWAP_LDIR_INODE_HEADER_2(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+ sizeof(struct squashfs_ldir_inode_header_2));\
-+ SQUASHFS_SWAP((s)->file_size, d, 32, 27);\
-+ SQUASHFS_SWAP((s)->offset, d, 59, 13);\
-+ SQUASHFS_SWAP((s)->mtime, d, 72, 32);\
-+ SQUASHFS_SWAP((s)->start_block, d, 104, 24);\
-+ SQUASHFS_SWAP((s)->i_count, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INDEX_2(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index_2));\
-+ SQUASHFS_SWAP((s)->index, d, 0, 27);\
-+ SQUASHFS_SWAP((s)->start_block, d, 27, 29);\
-+ SQUASHFS_SWAP((s)->size, d, 56, 8);\
-+}
-+#define SQUASHFS_SWAP_DIR_HEADER_2(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header_2));\
-+ SQUASHFS_SWAP((s)->count, d, 0, 8);\
-+ SQUASHFS_SWAP((s)->start_block, d, 8, 24);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_ENTRY_2(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry_2));\
-+ SQUASHFS_SWAP((s)->offset, d, 0, 13);\
-+ SQUASHFS_SWAP((s)->type, d, 13, 3);\
-+ SQUASHFS_SWAP((s)->size, d, 16, 8);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_ENTRY_2(s, d) {\
-+ SQUASHFS_SWAP_START\
-+ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry_2));\
-+ SQUASHFS_SWAP((s)->start_block, d, 0, 32);\
-+ SQUASHFS_SWAP((s)->size, d, 32, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_INDEXES_2(s, d, n) SQUASHFS_SWAP_INTS(s, d, n)
-+
-+/* fragment and fragment table defines */
-+#define SQUASHFS_FRAGMENT_BYTES_2(A) (A * sizeof(struct squashfs_fragment_entry_2))
-+
-+#define SQUASHFS_FRAGMENT_INDEX_2(A) (SQUASHFS_FRAGMENT_BYTES_2(A) / \
-+ SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_OFFSET_2(A) (SQUASHFS_FRAGMENT_BYTES_2(A) % \
-+ SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEXES_2(A) ((SQUASHFS_FRAGMENT_BYTES_2(A) + \
-+ SQUASHFS_METADATA_SIZE - 1) / \
-+ SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_BYTES_2(A) (SQUASHFS_FRAGMENT_INDEXES_2(A) *\
-+ sizeof(int))
-+
-+#endif
-+
-+#ifdef __KERNEL__
-+
-+/*
-+ * macros used to swap each structure entry, taking into account
-+ * bitfields and different bitfield placing conventions on differing
-+ * architectures
-+ */
-+
-+#include <asm/byteorder.h>
-+
-+#ifdef __BIG_ENDIAN
-+ /* convert from little endian to big endian */
-+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \
-+ tbits, b_pos)
-+#else
-+ /* convert from big endian to little endian */
-+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \
-+ tbits, 64 - tbits - b_pos)
-+#endif
-+
-+#define _SQUASHFS_SWAP(value, p, pos, tbits, SHIFT) {\
-+ b_pos = pos % 8;\
-+ val = 0;\
-+ s = (unsigned char *)p + (pos / 8);\
-+ d = ((unsigned char *) &val) + 7;\
-+ for(bits = 0; bits < (tbits + b_pos); bits += 8) \
-+ *d-- = *s++;\
-+ value = (val >> (SHIFT))/* & ((1 << tbits) - 1)*/;\
-+}
-+
-+#define SQUASHFS_MEMSET(s, d, n) memset(s, 0, n);
-+
-+#endif
-+#endif
---- /dev/null
-+++ b/include/linux/squashfs_fs_i.h
-@@ -0,0 +1,45 @@
-+#ifndef SQUASHFS_FS_I
-+#define SQUASHFS_FS_I
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.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,
-+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs_i.h
-+ */
-+
-+struct squashfs_inode_info {
-+ long long start_block;
-+ unsigned int offset;
-+ union {
-+ struct {
-+ long long fragment_start_block;
-+ unsigned int fragment_size;
-+ unsigned int fragment_offset;
-+ long long block_list_start;
-+ } s1;
-+ struct {
-+ long long directory_index_start;
-+ unsigned int directory_index_offset;
-+ unsigned int directory_index_count;
-+ unsigned int parent_inode;
-+ } s2;
-+ } u;
-+ struct inode vfs_inode;
-+};
-+#endif
---- /dev/null
-+++ b/include/linux/squashfs_fs_sb.h
-@@ -0,0 +1,74 @@
-+#ifndef SQUASHFS_FS_SB
-+#define SQUASHFS_FS_SB
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.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,
-+ * 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs_sb.h
-+ */
-+
-+#include <linux/squashfs_fs.h>
-+
-+struct squashfs_cache {
-+ long long block;
-+ int length;
-+ long long next_index;
-+ char *data;
-+};
-+
-+struct squashfs_fragment_cache {
-+ long long block;
-+ int length;
-+ unsigned int locked;
-+ char *data;
-+};
-+
-+struct squashfs_sb_info {
-+ struct squashfs_super_block sblk;
-+ int devblksize;
-+ int devblksize_log2;
-+ int swap;
-+ struct squashfs_cache *block_cache;
-+ struct squashfs_fragment_cache *fragment;
-+ int next_cache;
-+ int next_fragment;
-+ int next_meta_index;
-+ unsigned int *uid;
-+ unsigned int *guid;
-+ long long *fragment_index;
-+ unsigned int *fragment_index_2;
-+ unsigned int read_size;
-+ char *read_data;
-+ char *read_page;
-+ struct semaphore read_data_mutex;
-+ struct semaphore read_page_mutex;
-+ struct semaphore block_cache_mutex;
-+ struct semaphore fragment_mutex;
-+ struct semaphore meta_index_mutex;
-+ wait_queue_head_t waitq;
-+ wait_queue_head_t fragment_wait_queue;
-+ struct meta_index *meta_index;
-+ struct inode *(*iget)(struct super_block *s, squashfs_inode_t \
-+ inode);
-+ long long (*read_blocklist)(struct inode *inode, int \
-+ index, int readahead_blks, char *block_list, \
-+ unsigned short **block_p, unsigned int *bsize);
-+ int (*read_fragment_index_table)(struct super_block *s);
-+};
-+#endif
---- a/init/do_mounts_rd.c
-+++ b/init/do_mounts_rd.c
-@@ -5,6 +5,7 @@
- #include <linux/ext2_fs.h>
- #include <linux/romfs_fs.h>
- #include <linux/cramfs_fs.h>
-+#include <linux/squashfs_fs.h>
- #include <linux/initrd.h>
- #include <linux/string.h>
-
-@@ -39,6 +40,7 @@ static int __init crd_load(int in_fd, in
- * numbers could not be found.
- *
- * We currently check for the following magic numbers:
-+ * squashfs
- * minix
- * ext2
- * romfs
-@@ -53,6 +55,7 @@ identify_ramdisk_image(int fd, int start
- struct ext2_super_block *ext2sb;
- struct romfs_super_block *romfsb;
- struct cramfs_super *cramfsb;
-+ struct squashfs_super_block *squashfsb;
- int nblocks = -1;
- unsigned char *buf;
-
-@@ -64,6 +67,7 @@ identify_ramdisk_image(int fd, int start
- ext2sb = (struct ext2_super_block *) buf;
- romfsb = (struct romfs_super_block *) buf;
- cramfsb = (struct cramfs_super *) buf;
-+ squashfsb = (struct squashfs_super_block *) buf;
- memset(buf, 0xe5, size);
-
- /*
-@@ -101,6 +105,15 @@ identify_ramdisk_image(int fd, int start
- goto done;
- }
-
-+ /* squashfs is at block zero too */
-+ if (squashfsb->s_magic == SQUASHFS_MAGIC) {
-+ printk(KERN_NOTICE
-+ "RAMDISK: squashfs filesystem found at block %d\n",
-+ start_block);
-+ nblocks = (squashfsb->bytes_used+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS;
-+ goto done;
-+ }
-+
- /*
- * Read block 1 to test for minix and ext2 superblock
- */
+++ /dev/null
---- /dev/null
-+++ b/include/linux/LzmaDecode.h
-@@ -0,0 +1,100 @@
-+/*
-+ LzmaDecode.h
-+ LZMA Decoder interface
-+
-+ LZMA SDK 4.05 Copyright (c) 1999-2004 Igor Pavlov (2004-08-25)
-+ http://www.7-zip.org/
-+
-+ LZMA SDK is licensed under two licenses:
-+ 1) GNU Lesser General Public License (GNU LGPL)
-+ 2) Common Public License (CPL)
-+ It means that you can select one of these two licenses and
-+ follow rules of that license.
-+
-+ SPECIAL EXCEPTION:
-+ Igor Pavlov, as the author of this code, expressly permits you to
-+ statically or dynamically link your code (or bind by name) to the
-+ interfaces of this file without subjecting your linked code to the
-+ terms of the CPL or GNU LGPL. Any modifications or additions
-+ to this file, however, are subject to the LGPL or CPL terms.
-+*/
-+
-+#ifndef __LZMADECODE_H
-+#define __LZMADECODE_H
-+
-+/* #define _LZMA_IN_CB */
-+/* Use callback for input data */
-+
-+/* #define _LZMA_OUT_READ */
-+/* Use read function for output data */
-+
-+/* #define _LZMA_PROB32 */
-+/* It can increase speed on some 32-bit CPUs,
-+ but memory usage will be doubled in that case */
-+
-+/* #define _LZMA_LOC_OPT */
-+/* Enable local speed optimizations inside code */
-+
-+#ifndef UInt32
-+#ifdef _LZMA_UINT32_IS_ULONG
-+#define UInt32 unsigned long
-+#else
-+#define UInt32 unsigned int
-+#endif
-+#endif
-+
-+#ifdef _LZMA_PROB32
-+#define CProb UInt32
-+#else
-+#define CProb unsigned short
-+#endif
-+
-+#define LZMA_RESULT_OK 0
-+#define LZMA_RESULT_DATA_ERROR 1
-+#define LZMA_RESULT_NOT_ENOUGH_MEM 2
-+
-+#ifdef _LZMA_IN_CB
-+typedef struct _ILzmaInCallback
-+{
-+ int (*Read)(void *object, unsigned char **buffer, UInt32 *bufferSize);
-+} ILzmaInCallback;
-+#endif
-+
-+#define LZMA_BASE_SIZE 1846
-+#define LZMA_LIT_SIZE 768
-+
-+/*
-+bufferSize = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp)))* sizeof(CProb)
-+bufferSize += 100 in case of _LZMA_OUT_READ
-+by default CProb is unsigned short,
-+but if specify _LZMA_PROB_32, CProb will be UInt32(unsigned int)
-+*/
-+
-+#ifdef _LZMA_OUT_READ
-+int LzmaDecoderInit(
-+ unsigned char *buffer, UInt32 bufferSize,
-+ int lc, int lp, int pb,
-+ unsigned char *dictionary, UInt32 dictionarySize,
-+ #ifdef _LZMA_IN_CB
-+ ILzmaInCallback *inCallback
-+ #else
-+ unsigned char *inStream, UInt32 inSize
-+ #endif
-+);
-+#endif
-+
-+int LzmaDecode(
-+ unsigned char *buffer,
-+ #ifndef _LZMA_OUT_READ
-+ UInt32 bufferSize,
-+ int lc, int lp, int pb,
-+ #ifdef _LZMA_IN_CB
-+ ILzmaInCallback *inCallback,
-+ #else
-+ unsigned char *inStream, UInt32 inSize,
-+ #endif
-+ #endif
-+ unsigned char *outStream, UInt32 outSize,
-+ UInt32 *outSizeProcessed);
-+
-+#endif
---- /dev/null
-+++ b/lib/LzmaDecode.c
-@@ -0,0 +1,663 @@
-+/*
-+ LzmaDecode.c
-+ LZMA Decoder
-+
-+ LZMA SDK 4.05 Copyright (c) 1999-2004 Igor Pavlov (2004-08-25)
-+ http://www.7-zip.org/
-+
-+ LZMA SDK is licensed under two licenses:
-+ 1) GNU Lesser General Public License (GNU LGPL)
-+ 2) Common Public License (CPL)
-+ It means that you can select one of these two licenses and
-+ follow rules of that license.
-+
-+ SPECIAL EXCEPTION:
-+ Igor Pavlov, as the author of this code, expressly permits you to
-+ statically or dynamically link your code (or bind by name) to the
-+ interfaces of this file without subjecting your linked code to the
-+ terms of the CPL or GNU LGPL. Any modifications or additions
-+ to this file, however, are subject to the LGPL or CPL terms.
-+*/
-+
-+#include <linux/LzmaDecode.h>
-+
-+#ifndef Byte
-+#define Byte unsigned char
-+#endif
-+
-+#define kNumTopBits 24
-+#define kTopValue ((UInt32)1 << kNumTopBits)
-+
-+#define kNumBitModelTotalBits 11
-+#define kBitModelTotal (1 << kNumBitModelTotalBits)
-+#define kNumMoveBits 5
-+
-+typedef struct _CRangeDecoder
-+{
-+ Byte *Buffer;
-+ Byte *BufferLim;
-+ UInt32 Range;
-+ UInt32 Code;
-+ #ifdef _LZMA_IN_CB
-+ ILzmaInCallback *InCallback;
-+ int Result;
-+ #endif
-+ int ExtraBytes;
-+} CRangeDecoder;
-+
-+Byte RangeDecoderReadByte(CRangeDecoder *rd)
-+{
-+ if (rd->Buffer == rd->BufferLim)
-+ {
-+ #ifdef _LZMA_IN_CB
-+ UInt32 size;
-+ rd->Result = rd->InCallback->Read(rd->InCallback, &rd->Buffer, &size);
-+ rd->BufferLim = rd->Buffer + size;
-+ if (size == 0)
-+ #endif
-+ {
-+ rd->ExtraBytes = 1;
-+ return 0xFF;
-+ }
-+ }
-+ return (*rd->Buffer++);
-+}
-+
-+/* #define ReadByte (*rd->Buffer++) */
-+#define ReadByte (RangeDecoderReadByte(rd))
-+
-+void RangeDecoderInit(CRangeDecoder *rd,
-+ #ifdef _LZMA_IN_CB
-+ ILzmaInCallback *inCallback
-+ #else
-+ Byte *stream, UInt32 bufferSize
-+ #endif
-+ )
-+{
-+ int i;
-+ #ifdef _LZMA_IN_CB
-+ rd->InCallback = inCallback;
-+ rd->Buffer = rd->BufferLim = 0;
-+ #else
-+ rd->Buffer = stream;
-+ rd->BufferLim = stream + bufferSize;
-+ #endif
-+ rd->ExtraBytes = 0;
-+ rd->Code = 0;
-+ rd->Range = (0xFFFFFFFF);
-+ for(i = 0; i < 5; i++)
-+ rd->Code = (rd->Code << 8) | ReadByte;
-+}
-+
-+#define RC_INIT_VAR UInt32 range = rd->Range; UInt32 code = rd->Code;
-+#define RC_FLUSH_VAR rd->Range = range; rd->Code = code;
-+#define RC_NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | ReadByte; }
-+
-+UInt32 RangeDecoderDecodeDirectBits(CRangeDecoder *rd, int numTotalBits)
-+{
-+ RC_INIT_VAR
-+ UInt32 result = 0;
-+ int i;
-+ for (i = numTotalBits; i > 0; i--)
-+ {
-+ /* UInt32 t; */
-+ range >>= 1;
-+
-+ result <<= 1;
-+ if (code >= range)
-+ {
-+ code -= range;
-+ result |= 1;
-+ }
-+ /*
-+ t = (code - range) >> 31;
-+ t &= 1;
-+ code -= range & (t - 1);
-+ result = (result + result) | (1 - t);
-+ */
-+ RC_NORMALIZE
-+ }
-+ RC_FLUSH_VAR
-+ return result;
-+}
-+
-+int RangeDecoderBitDecode(CProb *prob, CRangeDecoder *rd)
-+{
-+ UInt32 bound = (rd->Range >> kNumBitModelTotalBits) * *prob;
-+ if (rd->Code < bound)
-+ {
-+ rd->Range = bound;
-+ *prob += (kBitModelTotal - *prob) >> kNumMoveBits;
-+ if (rd->Range < kTopValue)
-+ {
-+ rd->Code = (rd->Code << 8) | ReadByte;
-+ rd->Range <<= 8;
-+ }
-+ return 0;
-+ }
-+ else
-+ {
-+ rd->Range -= bound;
-+ rd->Code -= bound;
-+ *prob -= (*prob) >> kNumMoveBits;
-+ if (rd->Range < kTopValue)
-+ {
-+ rd->Code = (rd->Code << 8) | ReadByte;
-+ rd->Range <<= 8;
-+ }
-+ return 1;
-+ }
-+}
-+
-+#define RC_GET_BIT2(prob, mi, A0, A1) \
-+ UInt32 bound = (range >> kNumBitModelTotalBits) * *prob; \
-+ if (code < bound) \
-+ { A0; range = bound; *prob += (kBitModelTotal - *prob) >> kNumMoveBits; mi <<= 1; } \
-+ else \
-+ { A1; range -= bound; code -= bound; *prob -= (*prob) >> kNumMoveBits; mi = (mi + mi) + 1; } \
-+ RC_NORMALIZE
-+
-+#define RC_GET_BIT(prob, mi) RC_GET_BIT2(prob, mi, ; , ;)
-+
-+int RangeDecoderBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd)
-+{
-+ int mi = 1;
-+ int i;
-+ #ifdef _LZMA_LOC_OPT
-+ RC_INIT_VAR
-+ #endif
-+ for(i = numLevels; i > 0; i--)
-+ {
-+ #ifdef _LZMA_LOC_OPT
-+ CProb *prob = probs + mi;
-+ RC_GET_BIT(prob, mi)
-+ #else
-+ mi = (mi + mi) + RangeDecoderBitDecode(probs + mi, rd);
-+ #endif
-+ }
-+ #ifdef _LZMA_LOC_OPT
-+ RC_FLUSH_VAR
-+ #endif
-+ return mi - (1 << numLevels);
-+}
-+
-+int RangeDecoderReverseBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd)
-+{
-+ int mi = 1;
-+ int i;
-+ int symbol = 0;
-+ #ifdef _LZMA_LOC_OPT
-+ RC_INIT_VAR
-+ #endif
-+ for(i = 0; i < numLevels; i++)
-+ {
-+ #ifdef _LZMA_LOC_OPT
-+ CProb *prob = probs + mi;
-+ RC_GET_BIT2(prob, mi, ; , symbol |= (1 << i))
-+ #else
-+ int bit = RangeDecoderBitDecode(probs + mi, rd);
-+ mi = mi + mi + bit;
-+ symbol |= (bit << i);
-+ #endif
-+ }
-+ #ifdef _LZMA_LOC_OPT
-+ RC_FLUSH_VAR
-+ #endif
-+ return symbol;
-+}
-+
-+Byte LzmaLiteralDecode(CProb *probs, CRangeDecoder *rd)
-+{
-+ int symbol = 1;
-+ #ifdef _LZMA_LOC_OPT
-+ RC_INIT_VAR
-+ #endif
-+ do
-+ {
-+ #ifdef _LZMA_LOC_OPT
-+ CProb *prob = probs + symbol;
-+ RC_GET_BIT(prob, symbol)
-+ #else
-+ symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd);
-+ #endif
-+ }
-+ while (symbol < 0x100);
-+ #ifdef _LZMA_LOC_OPT
-+ RC_FLUSH_VAR
-+ #endif
-+ return symbol;
-+}
-+
-+Byte LzmaLiteralDecodeMatch(CProb *probs, CRangeDecoder *rd, Byte matchByte)
-+{
-+ int symbol = 1;
-+ #ifdef _LZMA_LOC_OPT
-+ RC_INIT_VAR
-+ #endif
-+ do
-+ {
-+ int bit;
-+ int matchBit = (matchByte >> 7) & 1;
-+ matchByte <<= 1;
-+ #ifdef _LZMA_LOC_OPT
-+ {
-+ CProb *prob = probs + ((1 + matchBit) << 8) + symbol;
-+ RC_GET_BIT2(prob, symbol, bit = 0, bit = 1)
-+ }
-+ #else
-+ bit = RangeDecoderBitDecode(probs + ((1 + matchBit) << 8) + symbol, rd);
-+ symbol = (symbol << 1) | bit;
-+ #endif
-+ if (matchBit != bit)
-+ {
-+ while (symbol < 0x100)
-+ {
-+ #ifdef _LZMA_LOC_OPT
-+ CProb *prob = probs + symbol;
-+ RC_GET_BIT(prob, symbol)
-+ #else
-+ symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd);
-+ #endif
-+ }
-+ break;
-+ }
-+ }
-+ while (symbol < 0x100);
-+ #ifdef _LZMA_LOC_OPT
-+ RC_FLUSH_VAR
-+ #endif
-+ return symbol;
-+}
-+
-+#define kNumPosBitsMax 4
-+#define kNumPosStatesMax (1 << kNumPosBitsMax)
-+
-+#define kLenNumLowBits 3
-+#define kLenNumLowSymbols (1 << kLenNumLowBits)
-+#define kLenNumMidBits 3
-+#define kLenNumMidSymbols (1 << kLenNumMidBits)
-+#define kLenNumHighBits 8
-+#define kLenNumHighSymbols (1 << kLenNumHighBits)
-+
-+#define LenChoice 0
-+#define LenChoice2 (LenChoice + 1)
-+#define LenLow (LenChoice2 + 1)
-+#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
-+#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
-+#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
-+
-+int LzmaLenDecode(CProb *p, CRangeDecoder *rd, int posState)
-+{
-+ if(RangeDecoderBitDecode(p + LenChoice, rd) == 0)
-+ return RangeDecoderBitTreeDecode(p + LenLow +
-+ (posState << kLenNumLowBits), kLenNumLowBits, rd);
-+ if(RangeDecoderBitDecode(p + LenChoice2, rd) == 0)
-+ return kLenNumLowSymbols + RangeDecoderBitTreeDecode(p + LenMid +
-+ (posState << kLenNumMidBits), kLenNumMidBits, rd);
-+ return kLenNumLowSymbols + kLenNumMidSymbols +
-+ RangeDecoderBitTreeDecode(p + LenHigh, kLenNumHighBits, rd);
-+}
-+
-+#define kNumStates 12
-+
-+#define kStartPosModelIndex 4
-+#define kEndPosModelIndex 14
-+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
-+
-+#define kNumPosSlotBits 6
-+#define kNumLenToPosStates 4
-+
-+#define kNumAlignBits 4
-+#define kAlignTableSize (1 << kNumAlignBits)
-+
-+#define kMatchMinLen 2
-+
-+#define IsMatch 0
-+#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
-+#define IsRepG0 (IsRep + kNumStates)
-+#define IsRepG1 (IsRepG0 + kNumStates)
-+#define IsRepG2 (IsRepG1 + kNumStates)
-+#define IsRep0Long (IsRepG2 + kNumStates)
-+#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
-+#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
-+#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
-+#define LenCoder (Align + kAlignTableSize)
-+#define RepLenCoder (LenCoder + kNumLenProbs)
-+#define Literal (RepLenCoder + kNumLenProbs)
-+
-+#if Literal != LZMA_BASE_SIZE
-+StopCompilingDueBUG
-+#endif
-+
-+#ifdef _LZMA_OUT_READ
-+
-+typedef struct _LzmaVarState
-+{
-+ CRangeDecoder RangeDecoder;
-+ Byte *Dictionary;
-+ UInt32 DictionarySize;
-+ UInt32 DictionaryPos;
-+ UInt32 GlobalPos;
-+ UInt32 Reps[4];
-+ int lc;
-+ int lp;
-+ int pb;
-+ int State;
-+ int PreviousIsMatch;
-+ int RemainLen;
-+} LzmaVarState;
-+
-+int LzmaDecoderInit(
-+ unsigned char *buffer, UInt32 bufferSize,
-+ int lc, int lp, int pb,
-+ unsigned char *dictionary, UInt32 dictionarySize,
-+ #ifdef _LZMA_IN_CB
-+ ILzmaInCallback *inCallback
-+ #else
-+ unsigned char *inStream, UInt32 inSize
-+ #endif
-+ )
-+{
-+ LzmaVarState *vs = (LzmaVarState *)buffer;
-+ CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));
-+ UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));
-+ UInt32 i;
-+ if (bufferSize < numProbs * sizeof(CProb) + sizeof(LzmaVarState))
-+ return LZMA_RESULT_NOT_ENOUGH_MEM;
-+ vs->Dictionary = dictionary;
-+ vs->DictionarySize = dictionarySize;
-+ vs->DictionaryPos = 0;
-+ vs->GlobalPos = 0;
-+ vs->Reps[0] = vs->Reps[1] = vs->Reps[2] = vs->Reps[3] = 1;
-+ vs->lc = lc;
-+ vs->lp = lp;
-+ vs->pb = pb;
-+ vs->State = 0;
-+ vs->PreviousIsMatch = 0;
-+ vs->RemainLen = 0;
-+ dictionary[dictionarySize - 1] = 0;
-+ for (i = 0; i < numProbs; i++)
-+ p[i] = kBitModelTotal >> 1;
-+ RangeDecoderInit(&vs->RangeDecoder,
-+ #ifdef _LZMA_IN_CB
-+ inCallback
-+ #else
-+ inStream, inSize
-+ #endif
-+ );
-+ return LZMA_RESULT_OK;
-+}
-+
-+int LzmaDecode(unsigned char *buffer,
-+ unsigned char *outStream, UInt32 outSize,
-+ UInt32 *outSizeProcessed)
-+{
-+ LzmaVarState *vs = (LzmaVarState *)buffer;
-+ CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));
-+ CRangeDecoder rd = vs->RangeDecoder;
-+ int state = vs->State;
-+ int previousIsMatch = vs->PreviousIsMatch;
-+ Byte previousByte;
-+ UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3];
-+ UInt32 nowPos = 0;
-+ UInt32 posStateMask = (1 << (vs->pb)) - 1;
-+ UInt32 literalPosMask = (1 << (vs->lp)) - 1;
-+ int lc = vs->lc;
-+ int len = vs->RemainLen;
-+ UInt32 globalPos = vs->GlobalPos;
-+
-+ Byte *dictionary = vs->Dictionary;
-+ UInt32 dictionarySize = vs->DictionarySize;
-+ UInt32 dictionaryPos = vs->DictionaryPos;
-+
-+ if (len == -1)
-+ {
-+ *outSizeProcessed = 0;
-+ return LZMA_RESULT_OK;
-+ }
-+
-+ while(len > 0 && nowPos < outSize)
-+ {
-+ UInt32 pos = dictionaryPos - rep0;
-+ if (pos >= dictionarySize)
-+ pos += dictionarySize;
-+ outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos];
-+ if (++dictionaryPos == dictionarySize)
-+ dictionaryPos = 0;
-+ len--;
-+ }
-+ if (dictionaryPos == 0)
-+ previousByte = dictionary[dictionarySize - 1];
-+ else
-+ previousByte = dictionary[dictionaryPos - 1];
-+#else
-+
-+int LzmaDecode(
-+ Byte *buffer, UInt32 bufferSize,
-+ int lc, int lp, int pb,
-+ #ifdef _LZMA_IN_CB
-+ ILzmaInCallback *inCallback,
-+ #else
-+ unsigned char *inStream, UInt32 inSize,
-+ #endif
-+ unsigned char *outStream, UInt32 outSize,
-+ UInt32 *outSizeProcessed)
-+{
-+ UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));
-+ CProb *p = (CProb *)buffer;
-+ CRangeDecoder rd;
-+ UInt32 i;
-+ int state = 0;
-+ int previousIsMatch = 0;
-+ Byte previousByte = 0;
-+ UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1;
-+ UInt32 nowPos = 0;
-+ UInt32 posStateMask = (1 << pb) - 1;
-+ UInt32 literalPosMask = (1 << lp) - 1;
-+ int len = 0;
-+ if (bufferSize < numProbs * sizeof(CProb))
-+ return LZMA_RESULT_NOT_ENOUGH_MEM;
-+ for (i = 0; i < numProbs; i++)
-+ p[i] = kBitModelTotal >> 1;
-+ RangeDecoderInit(&rd,
-+ #ifdef _LZMA_IN_CB
-+ inCallback
-+ #else
-+ inStream, inSize
-+ #endif
-+ );
-+#endif
-+
-+ *outSizeProcessed = 0;
-+ while(nowPos < outSize)
-+ {
-+ int posState = (int)(
-+ (nowPos
-+ #ifdef _LZMA_OUT_READ
-+ + globalPos
-+ #endif
-+ )
-+ & posStateMask);
-+ #ifdef _LZMA_IN_CB
-+ if (rd.Result != LZMA_RESULT_OK)
-+ return rd.Result;
-+ #endif
-+ if (rd.ExtraBytes != 0)
-+ return LZMA_RESULT_DATA_ERROR;
-+ if (RangeDecoderBitDecode(p + IsMatch + (state << kNumPosBitsMax) + posState, &rd) == 0)
-+ {
-+ CProb *probs = p + Literal + (LZMA_LIT_SIZE *
-+ (((
-+ (nowPos
-+ #ifdef _LZMA_OUT_READ
-+ + globalPos
-+ #endif
-+ )
-+ & literalPosMask) << lc) + (previousByte >> (8 - lc))));
-+
-+ if (state < 4) state = 0;
-+ else if (state < 10) state -= 3;
-+ else state -= 6;
-+ if (previousIsMatch)
-+ {
-+ Byte matchByte;
-+ #ifdef _LZMA_OUT_READ
-+ UInt32 pos = dictionaryPos - rep0;
-+ if (pos >= dictionarySize)
-+ pos += dictionarySize;
-+ matchByte = dictionary[pos];
-+ #else
-+ matchByte = outStream[nowPos - rep0];
-+ #endif
-+ previousByte = LzmaLiteralDecodeMatch(probs, &rd, matchByte);
-+ previousIsMatch = 0;
-+ }
-+ else
-+ previousByte = LzmaLiteralDecode(probs, &rd);
-+ outStream[nowPos++] = previousByte;
-+ #ifdef _LZMA_OUT_READ
-+ dictionary[dictionaryPos] = previousByte;
-+ if (++dictionaryPos == dictionarySize)
-+ dictionaryPos = 0;
-+ #endif
-+ }
-+ else
-+ {
-+ previousIsMatch = 1;
-+ if (RangeDecoderBitDecode(p + IsRep + state, &rd) == 1)
-+ {
-+ if (RangeDecoderBitDecode(p + IsRepG0 + state, &rd) == 0)
-+ {
-+ if (RangeDecoderBitDecode(p + IsRep0Long + (state << kNumPosBitsMax) + posState, &rd) == 0)
-+ {
-+ #ifdef _LZMA_OUT_READ
-+ UInt32 pos;
-+ #endif
-+ if (
-+ (nowPos
-+ #ifdef _LZMA_OUT_READ
-+ + globalPos
-+ #endif
-+ )
-+ == 0)
-+ return LZMA_RESULT_DATA_ERROR;
-+ state = state < 7 ? 9 : 11;
-+ #ifdef _LZMA_OUT_READ
-+ pos = dictionaryPos - rep0;
-+ if (pos >= dictionarySize)
-+ pos += dictionarySize;
-+ previousByte = dictionary[pos];
-+ dictionary[dictionaryPos] = previousByte;
-+ if (++dictionaryPos == dictionarySize)
-+ dictionaryPos = 0;
-+ #else
-+ previousByte = outStream[nowPos - rep0];
-+ #endif
-+ outStream[nowPos++] = previousByte;
-+ continue;
-+ }
-+ }
-+ else
-+ {
-+ UInt32 distance;
-+ if(RangeDecoderBitDecode(p + IsRepG1 + state, &rd) == 0)
-+ distance = rep1;
-+ else
-+ {
-+ if(RangeDecoderBitDecode(p + IsRepG2 + state, &rd) == 0)
-+ distance = rep2;
-+ else
-+ {
-+ distance = rep3;
-+ rep3 = rep2;
-+ }
-+ rep2 = rep1;
-+ }
-+ rep1 = rep0;
-+ rep0 = distance;
-+ }
-+ len = LzmaLenDecode(p + RepLenCoder, &rd, posState);
-+ state = state < 7 ? 8 : 11;
-+ }
-+ else
-+ {
-+ int posSlot;
-+ rep3 = rep2;
-+ rep2 = rep1;
-+ rep1 = rep0;
-+ state = state < 7 ? 7 : 10;
-+ len = LzmaLenDecode(p + LenCoder, &rd, posState);
-+ posSlot = RangeDecoderBitTreeDecode(p + PosSlot +
-+ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
-+ kNumPosSlotBits), kNumPosSlotBits, &rd);
-+ if (posSlot >= kStartPosModelIndex)
-+ {
-+ int numDirectBits = ((posSlot >> 1) - 1);
-+ rep0 = ((2 | ((UInt32)posSlot & 1)) << numDirectBits);
-+ if (posSlot < kEndPosModelIndex)
-+ {
-+ rep0 += RangeDecoderReverseBitTreeDecode(
-+ p + SpecPos + rep0 - posSlot - 1, numDirectBits, &rd);
-+ }
-+ else
-+ {
-+ rep0 += RangeDecoderDecodeDirectBits(&rd,
-+ numDirectBits - kNumAlignBits) << kNumAlignBits;
-+ rep0 += RangeDecoderReverseBitTreeDecode(p + Align, kNumAlignBits, &rd);
-+ }
-+ }
-+ else
-+ rep0 = posSlot;
-+ rep0++;
-+ }
-+ if (rep0 == (UInt32)(0))
-+ {
-+ /* it's for stream version */
-+ len = -1;
-+ break;
-+ }
-+ if (rep0 > nowPos
-+ #ifdef _LZMA_OUT_READ
-+ + globalPos
-+ #endif
-+ )
-+ {
-+ return LZMA_RESULT_DATA_ERROR;
-+ }
-+ len += kMatchMinLen;
-+ do
-+ {
-+ #ifdef _LZMA_OUT_READ
-+ UInt32 pos = dictionaryPos - rep0;
-+ if (pos >= dictionarySize)
-+ pos += dictionarySize;
-+ previousByte = dictionary[pos];
-+ dictionary[dictionaryPos] = previousByte;
-+ if (++dictionaryPos == dictionarySize)
-+ dictionaryPos = 0;
-+ #else
-+ previousByte = outStream[nowPos - rep0];
-+ #endif
-+ outStream[nowPos++] = previousByte;
-+ len--;
-+ }
-+ while(len > 0 && nowPos < outSize);
-+ }
-+ }
-+
-+ #ifdef _LZMA_OUT_READ
-+ vs->RangeDecoder = rd;
-+ vs->DictionaryPos = dictionaryPos;
-+ vs->GlobalPos = globalPos + nowPos;
-+ vs->Reps[0] = rep0;
-+ vs->Reps[1] = rep1;
-+ vs->Reps[2] = rep2;
-+ vs->Reps[3] = rep3;
-+ vs->State = state;
-+ vs->PreviousIsMatch = previousIsMatch;
-+ vs->RemainLen = len;
-+ #endif
-+
-+ *outSizeProcessed = nowPos;
-+ return LZMA_RESULT_OK;
-+}
---- a/lib/Makefile
-+++ b/lib/Makefile
-@@ -14,7 +14,7 @@ lib-$(CONFIG_SMP) += cpumask.o
- lib-y += kobject.o kref.o klist.o
-
- obj-y += div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \
-- bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o
-+ bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o LzmaDecode.o
-
- ifeq ($(CONFIG_DEBUG_KOBJECT),y)
- CFLAGS_kobject.o += -DDEBUG
+++ /dev/null
---- a/fs/squashfs/inode.c
-+++ b/fs/squashfs/inode.c
-@@ -4,6 +4,9 @@
- * Copyright (c) 2002, 2003, 2004, 2005, 2006
- * Phillip Lougher <phillip@lougher.org.uk>
- *
-+ * LZMA decompressor support added by Oleg I. Vdovikin
-+ * Copyright (c) 2005 Oleg I.Vdovikin <oleg@cs.msu.su>
-+ *
- * 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,
-@@ -21,6 +24,7 @@
- * inode.c
- */
-
-+#define SQUASHFS_LZMA
- #include <linux/types.h>
- #include <linux/squashfs_fs.h>
- #include <linux/module.h>
-@@ -44,6 +48,19 @@
-
- #include "squashfs.h"
-
-+#ifdef SQUASHFS_LZMA
-+#include <linux/LzmaDecode.h>
-+
-+/* default LZMA settings, should be in sync with mksquashfs */
-+#define LZMA_LC 3
-+#define LZMA_LP 0
-+#define LZMA_PB 2
-+
-+#define LZMA_WORKSPACE_SIZE ((LZMA_BASE_SIZE + \
-+ (LZMA_LIT_SIZE << (LZMA_LC + LZMA_LP))) * sizeof(CProb))
-+
-+#endif
-+
- static void squashfs_put_super(struct super_block *);
- static int squashfs_statfs(struct dentry *, struct kstatfs *);
- static int squashfs_symlink_readpage(struct file *file, struct page *page);
-@@ -64,7 +81,11 @@ static int squashfs_get_sb(struct file_s
- const char *, void *, struct vfsmount *);
-
-
-+#ifdef SQUASHFS_LZMA
-+static unsigned char lzma_workspace[LZMA_WORKSPACE_SIZE];
-+#else
- static z_stream stream;
-+#endif
-
- static struct file_system_type squashfs_fs_type = {
- .owner = THIS_MODULE,
-@@ -249,6 +270,15 @@ SQSH_EXTERN unsigned int squashfs_read_d
- if (compressed) {
- int zlib_err;
-
-+#ifdef SQUASHFS_LZMA
-+ if ((zlib_err = LzmaDecode(lzma_workspace,
-+ LZMA_WORKSPACE_SIZE, LZMA_LC, LZMA_LP, LZMA_PB,
-+ c_buffer, c_byte, buffer, msblk->read_size, &bytes)) != LZMA_RESULT_OK)
-+ {
-+ ERROR("lzma returned unexpected result 0x%x\n", zlib_err);
-+ bytes = 0;
-+ }
-+#else
- stream.next_in = c_buffer;
- stream.avail_in = c_byte;
- stream.next_out = buffer;
-@@ -263,7 +293,7 @@ SQSH_EXTERN unsigned int squashfs_read_d
- bytes = 0;
- } else
- bytes = stream.total_out;
--
-+#endif
- up(&msblk->read_data_mutex);
- }
-
-@@ -2045,15 +2075,19 @@ static int __init init_squashfs_fs(void)
- printk(KERN_INFO "squashfs: version 3.0 (2006/03/15) "
- "Phillip Lougher\n");
-
-+#ifndef SQUASHFS_LZMA
- if (!(stream.workspace = vmalloc(zlib_inflate_workspacesize()))) {
- ERROR("Failed to allocate zlib workspace\n");
- destroy_inodecache();
- err = -ENOMEM;
- goto out;
- }
-+#endif
-
- if ((err = register_filesystem(&squashfs_fs_type))) {
-+#ifndef SQUASHFS_LZMA
- vfree(stream.workspace);
-+#endif
- destroy_inodecache();
- }
-
-@@ -2064,7 +2098,9 @@ out:
-
- static void __exit exit_squashfs_fs(void)
- {
-+#ifndef SQUASHFS_LZMA
- vfree(stream.workspace);
-+#endif
- unregister_filesystem(&squashfs_fs_type);
- destroy_inodecache();
- }
+++ /dev/null
---- a/Makefile
-+++ b/Makefile
-@@ -533,6 +533,9 @@ endif
- NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
- CHECKFLAGS += $(NOSTDINC_FLAGS)
-
-+# improve gcc optimization
-+CFLAGS += $(call cc-option,-funit-at-a-time,)
-+
- # warn about C99 declaration after statement
- KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
-
+++ /dev/null
---- a/fs/squashfs/inode.c
-+++ b/fs/squashfs/inode.c
-@@ -33,6 +33,7 @@
- #include <linux/fs.h>
- #include <linux/smp_lock.h>
- #include <linux/slab.h>
-+#include <linux/exportfs.h>
- #include <linux/squashfs_fs_sb.h>
- #include <linux/squashfs_fs_i.h>
- #include <linux/buffer_head.h>
-@@ -2125,7 +2126,7 @@ static void squashfs_destroy_inode(struc
- }
-
-
--static void init_once(void * foo, struct kmem_cache * cachep, unsigned long flags)
-+static void init_once(struct kmem_cache * cachep, void *foo)
- {
- struct squashfs_inode_info *ei = foo;
-
+++ /dev/null
---- a/include/asm-mips/system.h
-+++ b/include/asm-mips/system.h
-@@ -185,7 +185,7 @@ extern __u64 __xchg_u64_unsupported_on_3
- if something tries to do an invalid xchg(). */
- extern void __xchg_called_with_bad_pointer(void);
-
--static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-+static __always_inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
- {
- switch (size) {
- case 4:
+++ /dev/null
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -51,6 +51,7 @@
- #define SST49LF040B 0x0050
- #define SST49LF008A 0x005a
- #define AT49BV6416 0x00d6
-+#define MANUFACTURER_SAMSUNG 0x00ec
-
- static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
- static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
-@@ -298,12 +299,19 @@ struct mtd_info *cfi_cmdset_0002(struct
-
- if (extp->MajorVersion != '1' ||
- (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
-- printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query "
-- "version %c.%c.\n", extp->MajorVersion,
-- extp->MinorVersion);
-- kfree(extp);
-- kfree(mtd);
-- return NULL;
-+ if (cfi->mfr == MANUFACTURER_SAMSUNG &&
-+ (extp->MajorVersion == '3' && extp->MinorVersion == '3')) {
-+ printk(KERN_NOTICE " Newer Samsung flash detected, "
-+ "should be compatibile with Amd/Fujitsu.\n");
-+ }
-+ else {
-+ printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query "
-+ "version %c.%c.\n", extp->MajorVersion,
-+ extp->MinorVersion);
-+ kfree(extp);
-+ kfree(mtd);
-+ return NULL;
-+ }
- }
-
- /* Install our own private info structure */
+++ /dev/null
---- a/drivers/mtd/chips/cfi_cmdset_0001.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0001.c
-@@ -1008,7 +1008,7 @@ static void __xipram xip_enable(struct m
-
- static int __xipram xip_wait_for_operation(
- struct map_info *map, struct flchip *chip,
-- unsigned long adr, unsigned int chip_op_time )
-+ unsigned long adr, int *chip_op_time )
- {
- struct cfi_private *cfi = map->fldrv_priv;
- struct cfi_pri_intelext *cfip = cfi->cmdset_priv;
-@@ -1017,7 +1017,7 @@ static int __xipram xip_wait_for_operati
- flstate_t oldstate, newstate;
-
- start = xip_currtime();
-- usec = chip_op_time * 8;
-+ usec = *chip_op_time * 8;
- if (usec == 0)
- usec = 500000;
- done = 0;
-@@ -1127,8 +1127,8 @@ static int __xipram xip_wait_for_operati
- #define XIP_INVAL_CACHED_RANGE(map, from, size) \
- INVALIDATE_CACHED_RANGE(map, from, size)
-
--#define INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, inval_adr, inval_len, usec) \
-- xip_wait_for_operation(map, chip, cmd_adr, usec)
-+#define INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, inval_adr, inval_len, p_usec) \
-+ xip_wait_for_operation(map, chip, cmd_adr, p_usec)
-
- #else
-
-@@ -1140,65 +1140,65 @@ static int __xipram xip_wait_for_operati
- static int inval_cache_and_wait_for_operation(
- struct map_info *map, struct flchip *chip,
- unsigned long cmd_adr, unsigned long inval_adr, int inval_len,
-- unsigned int chip_op_time)
-+ int *chip_op_time )
- {
- struct cfi_private *cfi = map->fldrv_priv;
- map_word status, status_OK = CMD(0x80);
-- int chip_state = chip->state;
-- unsigned int timeo, sleep_time;
-+ int z, chip_state = chip->state;
-+ unsigned long timeo;
-
- spin_unlock(chip->mutex);
- if (inval_len)
- INVALIDATE_CACHED_RANGE(map, inval_adr, inval_len);
-+ if (*chip_op_time)
-+ cfi_udelay(*chip_op_time);
- spin_lock(chip->mutex);
-
-- /* set our timeout to 8 times the expected delay */
-- timeo = chip_op_time * 8;
-- if (!timeo)
-- timeo = 500000;
-- sleep_time = chip_op_time / 2;
-+ timeo = *chip_op_time * 8 * HZ / 1000000;
-+ if (timeo < HZ/2)
-+ timeo = HZ/2;
-+ timeo += jiffies;
-
-+ z = 0;
- for (;;) {
-+ if (chip->state != chip_state) {
-+ /* Someone's suspended the operation: sleep */
-+ DECLARE_WAITQUEUE(wait, current);
-+
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ add_wait_queue(&chip->wq, &wait);
-+ spin_unlock(chip->mutex);
-+ schedule();
-+ remove_wait_queue(&chip->wq, &wait);
-+ timeo = jiffies + (HZ / 2); /* FIXME */
-+ spin_lock(chip->mutex);
-+ continue;
-+ }
-+
- status = map_read(map, cmd_adr);
- if (map_word_andequal(map, status, status_OK, status_OK))
- break;
-
-- if (!timeo) {
-+ /* OK Still waiting */
-+ if (time_after(jiffies, timeo)) {
- map_write(map, CMD(0x70), cmd_adr);
- chip->state = FL_STATUS;
- return -ETIME;
- }
-
-- /* OK Still waiting. Drop the lock, wait a while and retry. */
-+ /* Latency issues. Drop the lock, wait a while and retry */
-+ z++;
- spin_unlock(chip->mutex);
-- if (sleep_time >= 1000000/HZ) {
-- /*
-- * Half of the normal delay still remaining
-- * can be performed with a sleeping delay instead
-- * of busy waiting.
-- */
-- msleep(sleep_time/1000);
-- timeo -= sleep_time;
-- sleep_time = 1000000/HZ;
-- } else {
-- udelay(1);
-- cond_resched();
-- timeo--;
-- }
-+ cfi_udelay(1);
- spin_lock(chip->mutex);
--
-- while (chip->state != chip_state) {
-- /* Someone's suspended the operation: sleep */
-- DECLARE_WAITQUEUE(wait, current);
-- set_current_state(TASK_UNINTERRUPTIBLE);
-- add_wait_queue(&chip->wq, &wait);
-- spin_unlock(chip->mutex);
-- schedule();
-- remove_wait_queue(&chip->wq, &wait);
-- spin_lock(chip->mutex);
-- }
- }
-
-+ if (!z) {
-+ if (!--(*chip_op_time))
-+ *chip_op_time = 1;
-+ } else if (z > 1)
-+ ++(*chip_op_time);
-+
- /* Done and happy. */
- chip->state = FL_STATUS;
- return 0;
-@@ -1207,7 +1207,8 @@ static int inval_cache_and_wait_for_oper
- #endif
-
- #define WAIT_TIMEOUT(map, chip, adr, udelay) \
-- INVAL_CACHE_AND_WAIT(map, chip, adr, 0, 0, udelay);
-+ ({ int __udelay = (udelay); \
-+ INVAL_CACHE_AND_WAIT(map, chip, adr, 0, 0, &__udelay); })
-
-
- static int do_point_onechip (struct map_info *map, struct flchip *chip, loff_t adr, size_t len)
-@@ -1438,7 +1439,7 @@ static int __xipram do_write_oneword(str
-
- ret = INVAL_CACHE_AND_WAIT(map, chip, adr,
- adr, map_bankwidth(map),
-- chip->word_write_time);
-+ &chip->word_write_time);
- if (ret) {
- xip_enable(map, chip, adr);
- printk(KERN_ERR "%s: word write error (status timeout)\n", map->name);
-@@ -1678,7 +1679,7 @@ static int __xipram do_write_buffer(stru
-
- ret = INVAL_CACHE_AND_WAIT(map, chip, cmd_adr,
- initial_adr, initial_len,
-- chip->buffer_write_time);
-+ &chip->buffer_write_time);
- if (ret) {
- map_write(map, CMD(0x70), cmd_adr);
- chip->state = FL_STATUS;
-@@ -1813,7 +1814,7 @@ static int __xipram do_erase_oneblock(st
-
- ret = INVAL_CACHE_AND_WAIT(map, chip, adr,
- adr, len,
-- chip->erase_time);
-+ &chip->erase_time);
- if (ret) {
- map_write(map, CMD(0x70), adr);
- chip->state = FL_STATUS;
+++ /dev/null
---- a/fs/squashfs/Makefile
-+++ b/fs/squashfs/Makefile
-@@ -4,4 +4,3 @@
-
- obj-$(CONFIG_SQUASHFS) += squashfs.o
- squashfs-y += inode.o
--squashfs-y += squashfs2_0.o
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -24,6 +24,9 @@
- #ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
- #undef CONFIG_SQUASHFS_1_0_COMPATIBILITY
- #endif
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#undef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#endif
-
- #ifdef SQUASHFS_TRACE
- #define TRACE(s, args...) printk(KERN_NOTICE "SQUASHFS: "s, ## args)
+++ /dev/null
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -120,6 +120,8 @@
- #endif
- .endm
-
-+ j kernel_entry
-+ nop
- #ifndef CONFIG_NO_EXCEPT_FILL
- /*
- * Reserved space for exception handlers.
+++ /dev/null
-MIPS: allow disabling the kernel FPU emulator
-
-This patch allows turning off the in-kernel Algorithmics
-FPU emulator support, which allows one to save a couple of
-precious blocks on an embedded system.
-
-Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -831,6 +831,17 @@ config I8259
- config MIPS_BONITO64
- bool
-
-+config MIPS_FPU_EMU
-+ bool "Enable FPU emulation"
-+ default y
-+ help
-+ This option allows building a kernel with or without the Algorithmics
-+ FPU emulator enabled. Turning off this option results in a kernel which
-+ does not catch floating operations exceptions. Make sure that your toolchain
-+ is configured to enable software floating point emulation in that case.
-+
-+ If unsure say Y here.
-+
- config MIPS_MSC
- bool
-
---- a/arch/mips/math-emu/Makefile
-+++ b/arch/mips/math-emu/Makefile
-@@ -2,12 +2,14 @@
- # Makefile for the Linux/MIPS kernel FPU emulation.
- #
-
--obj-y := cp1emu.o ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
-+obj-y := kernel_linkage.o dsemul.o cp1emu.o
-+
-+obj-$(CONFIG_MIPS_FPU_EMU) += ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
- ieee754xcpt.o dp_frexp.o dp_modf.o dp_div.o dp_mul.o dp_sub.o \
- dp_add.o dp_fsp.o dp_cmp.o dp_logb.o dp_scalb.o dp_simple.o \
- dp_tint.o dp_fint.o dp_tlong.o dp_flong.o sp_frexp.o sp_modf.o \
- sp_div.o sp_mul.o sp_sub.o sp_add.o sp_fdp.o sp_cmp.o sp_logb.o \
- sp_scalb.o sp_simple.o sp_tint.o sp_fint.o sp_tlong.o sp_flong.o \
-- dp_sqrt.o sp_sqrt.o kernel_linkage.o dsemul.o
-+ dp_sqrt.o sp_sqrt.o
-
- EXTRA_CFLAGS += -Werror
---- a/arch/mips/math-emu/cp1emu.c
-+++ b/arch/mips/math-emu/cp1emu.c
-@@ -57,6 +57,12 @@
- #endif
- #define __mips 4
-
-+/* Further private data for which no space exists in mips_fpu_struct */
-+
-+struct mips_fpu_emulator_stats fpuemustats;
-+
-+#ifdef CONFIG_MIPS_FPU_EMU
-+
- /* Function which emulates a floating point instruction. */
-
- static int fpu_emu(struct pt_regs *, struct mips_fpu_struct *,
-@@ -67,10 +73,6 @@ static int fpux_emu(struct pt_regs *,
- struct mips_fpu_struct *, mips_instruction);
- #endif
-
--/* Further private data for which no space exists in mips_fpu_struct */
--
--struct mips_fpu_emulator_stats fpuemustats;
--
- /* Control registers */
-
- #define FPCREG_RID 0 /* $0 = revision id */
-@@ -1277,6 +1279,13 @@ int fpu_emulator_cop1Handler(struct pt_r
-
- return sig;
- }
-+#else
-+int fpu_emulator_cop1Handler(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
-+ int has_fpu)
-+{
-+ return 0;
-+}
-+#endif /* CONFIG_MIPS_FPU_EMU */
-
- #ifdef CONFIG_DEBUG_FS
- extern struct dentry *mips_debugfs_dir;
---- a/arch/mips/math-emu/dsemul.c
-+++ b/arch/mips/math-emu/dsemul.c
-@@ -110,6 +110,7 @@ int mips_dsemul(struct pt_regs *regs, mi
- return SIGILL; /* force out of emulation loop */
- }
-
-+#ifdef CONFIG_MIPS_FPU_EMU
- int do_dsemulret(struct pt_regs *xcp)
- {
- struct emuframe __user *fr;
-@@ -166,3 +167,9 @@ int do_dsemulret(struct pt_regs *xcp)
-
- return 1;
- }
-+#else
-+int do_dsemulret(struct pt_regs *xcp)
-+{
-+ return 0;
-+}
-+#endif /* CONFIG_MIPS_FPU_EMU */
---- a/arch/mips/math-emu/kernel_linkage.c
-+++ b/arch/mips/math-emu/kernel_linkage.c
-@@ -28,6 +28,7 @@
-
- #define SIGNALLING_NAN 0x7ff800007ff80000LL
-
-+#ifdef CONFIG_MIPS_FPU_EMU
- void fpu_emulator_init_fpu(void)
- {
- static int first = 1;
-@@ -111,4 +112,36 @@ int fpu_emulator_restore_context32(struc
-
- return err;
- }
--#endif
-+#endif /* CONFIG_64BIT */
-+#else
-+
-+void fpu_emulator_init_fpu(void)
-+{
-+ printk(KERN_INFO "FPU emulator disabled, make sure your toolchain"
-+ "was compiled with software floating point support (soft-float)\n");
-+ return;
-+}
-+
-+int fpu_emulator_save_context(struct sigcontext __user *sc)
-+{
-+ return 0;
-+}
-+
-+int fpu_emulator_restore_context(struct sigcontext __user *sc)
-+{
-+ return 0;
-+}
-+
-+#ifdef CONFIG_64BIT
-+int fpu_emulator_save_context32(struct sigcontext32 __user *sc)
-+{
-+ return 0;
-+}
-+
-+int fpu_emulator_restore_context32(struct sigcontext32 __user *sc)
-+{
-+ return 0;
-+}
-+
-+#endif /* CONFIG_64BIT */
-+#endif /* CONFIG_MIPS_FPU_EMU */
+++ /dev/null
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -16,6 +16,7 @@
- #include <linux/list.h>
- #include <linux/init.h>
- #include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
- #include <linux/buffer_head.h>
- #include <linux/mutex.h>
- #include <linux/mount.h>
-@@ -237,10 +238,11 @@ static void block2mtd_free_device(struct
-
-
- /* FIXME: ensure that mtd->size % erase_size == 0 */
--static struct block2mtd_dev *add_device(char *devname, int erase_size)
-+static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname)
- {
- struct block_device *bdev;
- struct block2mtd_dev *dev;
-+ struct mtd_partition *part;
-
- if (!devname)
- return NULL;
-@@ -279,14 +281,18 @@ static struct block2mtd_dev *add_device(
-
- /* Setup the MTD structure */
- /* make the name contain the block device in */
-- dev->mtd.name = kmalloc(sizeof("block2mtd: ") + strlen(devname),
-- GFP_KERNEL);
-+
-+ if (!mtdname)
-+ mtdname = devname;
-+
-+ dev->mtd.name = kmalloc(strlen(mtdname) + 1, GFP_KERNEL);
-+
- if (!dev->mtd.name)
- goto devinit_err;
-+
-+ strcpy(dev->mtd.name, mtdname);
-
-- sprintf(dev->mtd.name, "block2mtd: %s", devname);
--
-- dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
-+ dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK & ~(erase_size - 1);
- dev->mtd.erasesize = erase_size;
- dev->mtd.writesize = 1;
- dev->mtd.type = MTD_RAM;
-@@ -298,15 +304,18 @@ static struct block2mtd_dev *add_device(
- dev->mtd.read = block2mtd_read;
- dev->mtd.priv = dev;
- dev->mtd.owner = THIS_MODULE;
--
-- if (add_mtd_device(&dev->mtd)) {
-+
-+ part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
-+ part->name = dev->mtd.name;
-+ part->offset = 0;
-+ part->size = dev->mtd.size;
-+ if (add_mtd_partitions(&dev->mtd, part, 1)) {
- /* Device didnt get added, so free the entry */
- goto devinit_err;
- }
- list_add(&dev->list, &blkmtd_device_list);
- INFO("mtd%d: [%s] erase_size = %dKiB [%d]", dev->mtd.index,
-- dev->mtd.name + strlen("blkmtd: "),
-- dev->mtd.erasesize >> 10, dev->mtd.erasesize);
-+ mtdname, dev->mtd.erasesize >> 10, dev->mtd.erasesize);
- return dev;
-
- devinit_err:
-@@ -379,9 +388,9 @@ static char block2mtd_paramline[80 + 12]
-
- static int block2mtd_setup2(const char *val)
- {
-- char buf[80 + 12]; /* 80 for device, 12 for erase size */
-+ char buf[80 + 12 + 80]; /* 80 for device, 12 for erase size, 80 for name */
- char *str = buf;
-- char *token[2];
-+ char *token[3];
- char *name;
- size_t erase_size = PAGE_SIZE;
- int i, ret;
-@@ -392,7 +401,7 @@ static int block2mtd_setup2(const char *
- strcpy(str, val);
- kill_final_newline(str);
-
-- for (i = 0; i < 2; i++)
-+ for (i = 0; i < 3; i++)
- token[i] = strsep(&str, ",");
-
- if (str)
-@@ -411,8 +420,10 @@ static int block2mtd_setup2(const char *
- parse_err("illegal erase size");
- }
- }
-+ if (token[2] && (strlen(token[2]) + 1 > 80))
-+ parse_err("mtd device name too long");
-
-- add_device(name, erase_size);
-+ add_device(name, erase_size, token[2]);
-
- return 0;
- }
-@@ -446,7 +457,7 @@ static int block2mtd_setup(const char *v
-
-
- module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
--MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>]\"");
-+MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>]]\"");
-
- static int __init block2mtd_init(void)
- {
+++ /dev/null
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -47,6 +47,16 @@ config MTD_PARTITIONS
- devices. Partitioning on NFTL 'devices' is a different - that's the
- 'normal' form of partitioning used on a block device.
-
-+config MTD_ROOTFS_ROOT_DEV
-+ bool "Automatically set 'rootfs' partition to be root filesystem"
-+ depends on MTD_PARTITIONS
-+ default y
-+
-+config MTD_ROOTFS_SPLIT
-+ bool "Automatically split 'rootfs' partition for squashfs"
-+ depends on MTD_PARTITIONS
-+ default y
-+
- config MTD_REDBOOT_PARTS
- tristate "RedBoot partition table parsing"
- depends on MTD_PARTITIONS
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -20,6 +20,8 @@
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/partitions.h>
- #include <linux/mtd/compatmac.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/root_dev.h>
-
- /* Our partition linked list */
- static LIST_HEAD(mtd_partitions);
-@@ -39,7 +41,7 @@ struct mtd_part {
- * the pointer to that structure with this macro.
- */
- #define PART(x) ((struct mtd_part *)(x))
--
-+#define IS_PART(mtd) (mtd->read == part_read)
-
- /*
- * MTD methods which simply translate the effective address and pass through
-@@ -322,6 +324,316 @@ int del_mtd_partitions(struct mtd_info *
- return 0;
- }
-
-+static u_int32_t cur_offset = 0;
-+static int add_one_partition(struct mtd_info *master, const struct mtd_partition *part,
-+ int i, struct mtd_part **slp)
-+{
-+ struct mtd_part *slave;
-+
-+ /* allocate the partition structure */
-+ slave = kzalloc (sizeof(*slave), GFP_KERNEL);
-+ if (!slave) {
-+ printk ("memory allocation error while creating partitions for \"%s\"\n",
-+ master->name);
-+ del_mtd_partitions(master);
-+ return -ENOMEM;
-+ }
-+ list_add(&slave->list, &mtd_partitions);
-+
-+ /* set up the MTD object for this partition */
-+ slave->mtd.type = master->type;
-+ slave->mtd.flags = master->flags & ~part->mask_flags;
-+ slave->mtd.size = part->size;
-+ slave->mtd.writesize = master->writesize;
-+ slave->mtd.oobsize = master->oobsize;
-+ slave->mtd.oobavail = master->oobavail;
-+ slave->mtd.subpage_sft = master->subpage_sft;
-+
-+ slave->mtd.name = part->name;
-+ slave->mtd.owner = master->owner;
-+
-+ slave->mtd.read = part_read;
-+ slave->mtd.write = part_write;
-+
-+ if (master->panic_write)
-+ slave->mtd.panic_write = part_panic_write;
-+
-+ slave->mtd.refresh_device = part->refresh_partition;
-+
-+ if(master->point && master->unpoint){
-+ slave->mtd.point = part_point;
-+ slave->mtd.unpoint = part_unpoint;
-+ }
-+
-+ if (master->read_oob)
-+ slave->mtd.read_oob = part_read_oob;
-+ if (master->write_oob)
-+ slave->mtd.write_oob = part_write_oob;
-+ if(master->read_user_prot_reg)
-+ slave->mtd.read_user_prot_reg = part_read_user_prot_reg;
-+ if(master->read_fact_prot_reg)
-+ slave->mtd.read_fact_prot_reg = part_read_fact_prot_reg;
-+ if(master->write_user_prot_reg)
-+ slave->mtd.write_user_prot_reg = part_write_user_prot_reg;
-+ if(master->lock_user_prot_reg)
-+ slave->mtd.lock_user_prot_reg = part_lock_user_prot_reg;
-+ if(master->get_user_prot_info)
-+ slave->mtd.get_user_prot_info = part_get_user_prot_info;
-+ if(master->get_fact_prot_info)
-+ slave->mtd.get_fact_prot_info = part_get_fact_prot_info;
-+ if (master->sync)
-+ slave->mtd.sync = part_sync;
-+ if (!i && master->suspend && master->resume) {
-+ slave->mtd.suspend = part_suspend;
-+ slave->mtd.resume = part_resume;
-+ }
-+ if (master->writev)
-+ slave->mtd.writev = part_writev;
-+ if (master->lock)
-+ slave->mtd.lock = part_lock;
-+ if (master->unlock)
-+ slave->mtd.unlock = part_unlock;
-+ if (master->block_isbad)
-+ slave->mtd.block_isbad = part_block_isbad;
-+ if (master->block_markbad)
-+ slave->mtd.block_markbad = part_block_markbad;
-+ slave->mtd.erase = part_erase;
-+ slave->master = master;
-+ slave->offset = part->offset;
-+ slave->index = i;
-+
-+ if (slave->offset == MTDPART_OFS_APPEND)
-+ slave->offset = cur_offset;
-+ if (slave->offset == MTDPART_OFS_NXTBLK) {
-+ slave->offset = cur_offset;
-+ if ((cur_offset % master->erasesize) != 0) {
-+ /* Round up to next erasesize */
-+ slave->offset = ((cur_offset / master->erasesize) + 1) * master->erasesize;
-+ printk(KERN_NOTICE "Moving partition %d: "
-+ "0x%08x -> 0x%08x\n", i,
-+ cur_offset, slave->offset);
-+ }
-+ }
-+ if (slave->mtd.size == MTDPART_SIZ_FULL)
-+ slave->mtd.size = master->size - slave->offset;
-+ cur_offset = slave->offset + slave->mtd.size;
-+
-+ printk (KERN_NOTICE "0x%08x-0x%08x : \"%s\"\n", slave->offset,
-+ slave->offset + slave->mtd.size, slave->mtd.name);
-+
-+ /* let's do some sanity checks */
-+ if (slave->offset >= master->size) {
-+ /* let's register it anyway to preserve ordering */
-+ slave->offset = 0;
-+ slave->mtd.size = 0;
-+ printk ("mtd: partition \"%s\" is out of reach -- disabled\n",
-+ part->name);
-+ }
-+ if (slave->offset + slave->mtd.size > master->size) {
-+ slave->mtd.size = master->size - slave->offset;
-+ printk ("mtd: partition \"%s\" extends beyond the end of device \"%s\" -- size truncated to %#x\n",
-+ part->name, master->name, slave->mtd.size);
-+ }
-+ if (master->numeraseregions>1) {
-+ /* Deal with variable erase size stuff */
-+ int i;
-+ struct mtd_erase_region_info *regions = master->eraseregions;
-+
-+ /* Find the first erase regions which is part of this partition. */
-+ for (i=0; i < master->numeraseregions && slave->offset >= regions[i].offset; i++)
-+ ;
-+
-+ for (i--; i < master->numeraseregions && slave->offset + slave->mtd.size > regions[i].offset; i++) {
-+ if (slave->mtd.erasesize < regions[i].erasesize) {
-+ slave->mtd.erasesize = regions[i].erasesize;
-+ }
-+ }
-+ } else {
-+ /* Single erase size */
-+ slave->mtd.erasesize = master->erasesize;
-+ }
-+
-+ if ((slave->mtd.flags & MTD_WRITEABLE) &&
-+ (slave->offset % slave->mtd.erasesize)) {
-+ /* Doesn't start on a boundary of major erase size */
-+ /* FIXME: Let it be writable if it is on a boundary of _minor_ erase size though */
-+ slave->mtd.flags &= ~MTD_WRITEABLE;
-+ printk ("mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n",
-+ part->name);
-+ }
-+ if ((slave->mtd.flags & MTD_WRITEABLE) &&
-+ (slave->mtd.size % slave->mtd.erasesize)) {
-+ slave->mtd.flags &= ~MTD_WRITEABLE;
-+ printk ("mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n",
-+ part->name);
-+ }
-+
-+ slave->mtd.ecclayout = master->ecclayout;
-+ if (master->block_isbad) {
-+ uint32_t offs = 0;
-+
-+ while(offs < slave->mtd.size) {
-+ if (master->block_isbad(master,
-+ offs + slave->offset))
-+ slave->mtd.ecc_stats.badblocks++;
-+ offs += slave->mtd.erasesize;
-+ }
-+ }
-+
-+ if(part->mtdp)
-+ { /* store the object pointer (caller may or may not register it */
-+ *part->mtdp = &slave->mtd;
-+ slave->registered = 0;
-+ }
-+ else
-+ {
-+ /* register our partition */
-+ add_mtd_device(&slave->mtd);
-+ slave->registered = 1;
-+ }
-+
-+ if (slp)
-+ *slp = slave;
-+
-+ return 0;
-+}
-+
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+#define ROOTFS_SPLIT_NAME "rootfs_data"
-+#define ROOTFS_REMOVED_NAME "<removed>"
-+static int split_squashfs(struct mtd_info *master, int offset, int *split_offset)
-+{
-+ char buf[512];
-+ struct squashfs_super_block *sb = (struct squashfs_super_block *) buf;
-+ int len, ret;
-+
-+ ret = master->read(master, offset, sizeof(*sb), &len, buf);
-+ if (ret || (len != sizeof(*sb))) {
-+ printk(KERN_ALERT "split_squashfs: error occured while reading "
-+ "from \"%s\"\n", master->name);
-+ return -EINVAL;
-+ }
-+
-+ if (*((u32 *) buf) != SQUASHFS_MAGIC) {
-+ printk(KERN_ALERT "split_squashfs: no squashfs found in \"%s\"\n",
-+ master->name);
-+ *split_offset = 0;
-+ return 0;
-+ }
-+
-+ if (sb->bytes_used <= 0) {
-+ printk(KERN_ALERT "split_squashfs: squashfs is empty in \"%s\"\n",
-+ master->name);
-+ *split_offset = 0;
-+ return 0;
-+ }
-+
-+ len = (u32) sb->bytes_used;
-+ len += (offset & 0x000fffff);
-+ len += (master->erasesize - 1);
-+ len &= ~(master->erasesize - 1);
-+ len -= (offset & 0x000fffff);
-+ *split_offset = offset + len;
-+
-+ return 0;
-+}
-+
-+static int split_rootfs_data(struct mtd_info *master, struct mtd_info *rpart, struct mtd_partition *part,
-+ int index)
-+{
-+ struct mtd_partition *dpart;
-+ struct mtd_part *slave = NULL;
-+ int split_offset = 0;
-+ int ret;
-+
-+ ret = split_squashfs(master, part->offset, &split_offset);
-+ if (ret)
-+ return ret;
-+
-+ if (split_offset <= 0)
-+ return 0;
-+
-+ dpart = kmalloc(sizeof(*part)+sizeof(ROOTFS_SPLIT_NAME)+1, GFP_KERNEL);
-+ if (dpart == NULL) {
-+ printk(KERN_INFO "split_squashfs: no memory for partition \"%s\"\n",
-+ ROOTFS_SPLIT_NAME);
-+ return -ENOMEM;
-+ }
-+
-+ memcpy(dpart, part, sizeof(*part));
-+ dpart->name = (unsigned char *)&dpart[1];
-+ strcpy(dpart->name, ROOTFS_SPLIT_NAME);
-+
-+ dpart->size -= split_offset - dpart->offset;
-+ dpart->offset = split_offset;
-+
-+ if (dpart == NULL)
-+ return 1;
-+
-+ printk(KERN_INFO "mtd: partition \"%s\" created automatically, ofs=%X, len=%X \n",
-+ ROOTFS_SPLIT_NAME, dpart->offset, dpart->size);
-+
-+ ret = add_one_partition(master, dpart, index, &slave);
-+ if (ret)
-+ kfree(dpart);
-+ else if (slave)
-+ rpart->split = &slave->mtd;
-+
-+ return ret;
-+}
-+
-+static int refresh_rootfs_split(struct mtd_info *mtd)
-+{
-+ struct mtd_partition tpart;
-+ struct mtd_part *part;
-+ int index = 0;
-+ int offset, size;
-+ int ret;
-+
-+ part = PART(mtd);
-+
-+ /* check for the new squashfs offset first */
-+ ret = split_squashfs(part->master, part->offset, &offset);
-+ if (ret)
-+ return ret;
-+
-+ if ((offset > 0) && !mtd->split) {
-+ printk(KERN_INFO "%s: creating new split partition for \"%s\"\n", __func__, mtd->name);
-+ /* if we don't have a rootfs split partition, create a new one */
-+ tpart.name = mtd->name;
-+ tpart.size = mtd->size;
-+ tpart.offset = part->offset;
-+
-+ /* find the index of the last partition */
-+ if (!list_empty(&mtd_partitions))
-+ index = list_first_entry(&mtd_partitions, struct mtd_part, list)->index + 1;
-+
-+ return split_rootfs_data(part->master, &part->mtd, &tpart, index);
-+ } else if ((offset > 0) && mtd->split) {
-+ /* update the offsets of the existing partition */
-+ size = mtd->size + part->offset - offset;
-+
-+ part = PART(mtd->split);
-+ part->offset = offset;
-+ part->mtd.size = size;
-+ printk(KERN_INFO "%s: %s partition \"" ROOTFS_SPLIT_NAME "\", offset: 0x%06x (0x%06x)\n",
-+ __func__, (!strcmp(part->mtd.name, ROOTFS_SPLIT_NAME) ? "updating" : "creating"),
-+ part->offset, part->mtd.size);
-+ strcpy(part->mtd.name, ROOTFS_SPLIT_NAME);
-+ } else if ((offset <= 0) && mtd->split) {
-+ printk(KERN_INFO "%s: removing partition \"%s\"\n", __func__, mtd->split->name);
-+
-+ /* mark existing partition as removed */
-+ part = PART(mtd->split);
-+ strcpy(part->mtd.name, ROOTFS_REMOVED_NAME);
-+ part->offset = 0;
-+ part->mtd.size = 0;
-+ }
-+
-+ return 0;
-+}
-+#endif /* CONFIG_MTD_ROOTFS_SPLIT */
-+
- /*
- * This function, given a master MTD object and a partition table, creates
- * and registers slave MTD objects which are bound to the master according to
-@@ -334,171 +646,31 @@ int add_mtd_partitions(struct mtd_info *
- int nbparts)
- {
- struct mtd_part *slave;
-- u_int32_t cur_offset = 0;
-- int i;
-+ struct mtd_partition *part;
-+ int i, j, ret = 0;
-
- printk (KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name);
-
-- for (i = 0; i < nbparts; i++) {
--
-- /* allocate the partition structure */
-- slave = kzalloc (sizeof(*slave), GFP_KERNEL);
-- if (!slave) {
-- printk ("memory allocation error while creating partitions for \"%s\"\n",
-- master->name);
-- del_mtd_partitions(master);
-- return -ENOMEM;
-- }
-- list_add(&slave->list, &mtd_partitions);
--
-- /* set up the MTD object for this partition */
-- slave->mtd.type = master->type;
-- slave->mtd.flags = master->flags & ~parts[i].mask_flags;
-- slave->mtd.size = parts[i].size;
-- slave->mtd.writesize = master->writesize;
-- slave->mtd.oobsize = master->oobsize;
-- slave->mtd.oobavail = master->oobavail;
-- slave->mtd.subpage_sft = master->subpage_sft;
--
-- slave->mtd.name = parts[i].name;
-- slave->mtd.owner = master->owner;
--
-- slave->mtd.read = part_read;
-- slave->mtd.write = part_write;
--
-- if (master->panic_write)
-- slave->mtd.panic_write = part_panic_write;
--
-- if(master->point && master->unpoint){
-- slave->mtd.point = part_point;
-- slave->mtd.unpoint = part_unpoint;
-- }
--
-- if (master->read_oob)
-- slave->mtd.read_oob = part_read_oob;
-- if (master->write_oob)
-- slave->mtd.write_oob = part_write_oob;
-- if(master->read_user_prot_reg)
-- slave->mtd.read_user_prot_reg = part_read_user_prot_reg;
-- if(master->read_fact_prot_reg)
-- slave->mtd.read_fact_prot_reg = part_read_fact_prot_reg;
-- if(master->write_user_prot_reg)
-- slave->mtd.write_user_prot_reg = part_write_user_prot_reg;
-- if(master->lock_user_prot_reg)
-- slave->mtd.lock_user_prot_reg = part_lock_user_prot_reg;
-- if(master->get_user_prot_info)
-- slave->mtd.get_user_prot_info = part_get_user_prot_info;
-- if(master->get_fact_prot_info)
-- slave->mtd.get_fact_prot_info = part_get_fact_prot_info;
-- if (master->sync)
-- slave->mtd.sync = part_sync;
-- if (!i && master->suspend && master->resume) {
-- slave->mtd.suspend = part_suspend;
-- slave->mtd.resume = part_resume;
-- }
-- if (master->writev)
-- slave->mtd.writev = part_writev;
-- if (master->lock)
-- slave->mtd.lock = part_lock;
-- if (master->unlock)
-- slave->mtd.unlock = part_unlock;
-- if (master->block_isbad)
-- slave->mtd.block_isbad = part_block_isbad;
-- if (master->block_markbad)
-- slave->mtd.block_markbad = part_block_markbad;
-- slave->mtd.erase = part_erase;
-- slave->master = master;
-- slave->offset = parts[i].offset;
-- slave->index = i;
--
-- if (slave->offset == MTDPART_OFS_APPEND)
-- slave->offset = cur_offset;
-- if (slave->offset == MTDPART_OFS_NXTBLK) {
-- slave->offset = cur_offset;
-- if ((cur_offset % master->erasesize) != 0) {
-- /* Round up to next erasesize */
-- slave->offset = ((cur_offset / master->erasesize) + 1) * master->erasesize;
-- printk(KERN_NOTICE "Moving partition %d: "
-- "0x%08x -> 0x%08x\n", i,
-- cur_offset, slave->offset);
-- }
-- }
-- if (slave->mtd.size == MTDPART_SIZ_FULL)
-- slave->mtd.size = master->size - slave->offset;
-- cur_offset = slave->offset + slave->mtd.size;
--
-- printk (KERN_NOTICE "0x%08x-0x%08x : \"%s\"\n", slave->offset,
-- slave->offset + slave->mtd.size, slave->mtd.name);
--
-- /* let's do some sanity checks */
-- if (slave->offset >= master->size) {
-- /* let's register it anyway to preserve ordering */
-- slave->offset = 0;
-- slave->mtd.size = 0;
-- printk ("mtd: partition \"%s\" is out of reach -- disabled\n",
-- parts[i].name);
-- }
-- if (slave->offset + slave->mtd.size > master->size) {
-- slave->mtd.size = master->size - slave->offset;
-- printk ("mtd: partition \"%s\" extends beyond the end of device \"%s\" -- size truncated to %#x\n",
-- parts[i].name, master->name, slave->mtd.size);
-- }
-- if (master->numeraseregions>1) {
-- /* Deal with variable erase size stuff */
-- int i;
-- struct mtd_erase_region_info *regions = master->eraseregions;
--
-- /* Find the first erase regions which is part of this partition. */
-- for (i=0; i < master->numeraseregions && slave->offset >= regions[i].offset; i++)
-- ;
--
-- for (i--; i < master->numeraseregions && slave->offset + slave->mtd.size > regions[i].offset; i++) {
-- if (slave->mtd.erasesize < regions[i].erasesize) {
-- slave->mtd.erasesize = regions[i].erasesize;
-- }
-+ for (i = 0, j = 0; i < nbparts; i++) {
-+ part = (struct mtd_partition *) &parts[i];
-+ ret = add_one_partition(master, part, j, &slave);
-+ if (ret)
-+ return ret;
-+ j++;
-+
-+ if (strcmp(part->name, "rootfs") == 0 && slave->registered) {
-+#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV
-+ if (ROOT_DEV == 0) {
-+ printk(KERN_NOTICE "mtd: partition \"rootfs\" "
-+ "set to be root filesystem\n");
-+ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, slave->mtd.index);
- }
-- } else {
-- /* Single erase size */
-- slave->mtd.erasesize = master->erasesize;
-- }
--
-- if ((slave->mtd.flags & MTD_WRITEABLE) &&
-- (slave->offset % slave->mtd.erasesize)) {
-- /* Doesn't start on a boundary of major erase size */
-- /* FIXME: Let it be writable if it is on a boundary of _minor_ erase size though */
-- slave->mtd.flags &= ~MTD_WRITEABLE;
-- printk ("mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n",
-- parts[i].name);
-- }
-- if ((slave->mtd.flags & MTD_WRITEABLE) &&
-- (slave->mtd.size % slave->mtd.erasesize)) {
-- slave->mtd.flags &= ~MTD_WRITEABLE;
-- printk ("mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n",
-- parts[i].name);
-- }
--
-- slave->mtd.ecclayout = master->ecclayout;
-- if (master->block_isbad) {
-- uint32_t offs = 0;
--
-- while(offs < slave->mtd.size) {
-- if (master->block_isbad(master,
-- offs + slave->offset))
-- slave->mtd.ecc_stats.badblocks++;
-- offs += slave->mtd.erasesize;
-- }
-- }
--
-- if(parts[i].mtdp)
-- { /* store the object pointer (caller may or may not register it */
-- *parts[i].mtdp = &slave->mtd;
-- slave->registered = 0;
-- }
-- else
-- {
-- /* register our partition */
-- add_mtd_device(&slave->mtd);
-- slave->registered = 1;
-+#endif
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+ ret = split_rootfs_data(master, &slave->mtd, part, j);
-+ if (ret == 0)
-+ j++;
-+#endif
- }
- }
-
-@@ -574,6 +746,32 @@ int parse_mtd_partitions(struct mtd_info
- return ret;
- }
-
-+int refresh_mtd_partitions(struct mtd_info *mtd)
-+{
-+ int ret = 0;
-+
-+ if (IS_PART(mtd)) {
-+ struct mtd_part *part;
-+ struct mtd_info *master;
-+
-+ part = PART(mtd);
-+ master = part->master;
-+ if (master->refresh_device)
-+ ret = master->refresh_device(master);
-+ }
-+
-+ if (!ret && mtd->refresh_device)
-+ ret = mtd->refresh_device(mtd);
-+
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+ if (!ret && IS_PART(mtd) && !strcmp(mtd->name, "rootfs"))
-+ refresh_rootfs_split(mtd);
-+#endif
-+
-+ return 0;
-+}
-+
- EXPORT_SYMBOL_GPL(parse_mtd_partitions);
-+EXPORT_SYMBOL_GPL(refresh_mtd_partitions);
- EXPORT_SYMBOL_GPL(register_mtd_parser);
- EXPORT_SYMBOL_GPL(deregister_mtd_parser);
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -34,6 +34,8 @@ struct block2mtd_dev {
- struct block_device *blkdev;
- struct mtd_info mtd;
- struct mutex write_mutex;
-+ rwlock_t bdev_mutex;
-+ char devname[0];
- };
-
-
-@@ -86,6 +88,12 @@ static int block2mtd_erase(struct mtd_in
- size_t len = instr->len;
- int err;
-
-+ read_lock(&dev->bdev_mutex);
-+ if (!dev->blkdev) {
-+ err = -EINVAL;
-+ goto done;
-+ }
-+
- instr->state = MTD_ERASING;
- mutex_lock(&dev->write_mutex);
- err = _block2mtd_erase(dev, from, len);
-@@ -98,6 +106,10 @@ static int block2mtd_erase(struct mtd_in
-
- instr->state = MTD_ERASE_DONE;
- mtd_erase_callback(instr);
-+
-+done:
-+ read_unlock(&dev->bdev_mutex);
-+
- return err;
- }
-
-@@ -109,10 +121,14 @@ static int block2mtd_read(struct mtd_inf
- struct page *page;
- int index = from >> PAGE_SHIFT;
- int offset = from & (PAGE_SIZE-1);
-- int cpylen;
-+ int cpylen, err = 0;
-+
-+ read_lock(&dev->bdev_mutex);
-+ if (!dev->blkdev || (from > mtd->size)) {
-+ err = -EINVAL;
-+ goto done;
-+ }
-
-- if (from > mtd->size)
-- return -EINVAL;
- if (from + len > mtd->size)
- len = mtd->size - from;
-
-@@ -127,10 +143,14 @@ static int block2mtd_read(struct mtd_inf
- len = len - cpylen;
-
- page = page_read(dev->blkdev->bd_inode->i_mapping, index);
-- if (!page)
-- return -ENOMEM;
-- if (IS_ERR(page))
-- return PTR_ERR(page);
-+ if (!page) {
-+ err = -ENOMEM;
-+ goto done;
-+ }
-+ if (IS_ERR(page)) {
-+ err = PTR_ERR(page);
-+ goto done;
-+ }
-
- memcpy(buf, page_address(page) + offset, cpylen);
- page_cache_release(page);
-@@ -141,7 +161,10 @@ static int block2mtd_read(struct mtd_inf
- offset = 0;
- index++;
- }
-- return 0;
-+
-+done:
-+ read_unlock(&dev->bdev_mutex);
-+ return err;
- }
-
-
-@@ -193,12 +216,22 @@ static int block2mtd_write(struct mtd_in
- size_t *retlen, const u_char *buf)
- {
- struct block2mtd_dev *dev = mtd->priv;
-- int err;
-+ int err = 0;
-+
-+ read_lock(&dev->bdev_mutex);
-+ if (!dev->blkdev) {
-+ err = -EINVAL;
-+ goto done;
-+ }
-
- if (!len)
-- return 0;
-- if (to >= mtd->size)
-- return -ENOSPC;
-+ goto done;
-+
-+ if (to >= mtd->size) {
-+ err = -ENOSPC;
-+ goto done;
-+ }
-+
- if (to + len > mtd->size)
- len = mtd->size - to;
-
-@@ -207,6 +240,9 @@ static int block2mtd_write(struct mtd_in
- mutex_unlock(&dev->write_mutex);
- if (err > 0)
- err = 0;
-+
-+done:
-+ read_unlock(&dev->bdev_mutex);
- return err;
- }
-
-@@ -215,51 +251,29 @@ static int block2mtd_write(struct mtd_in
- static void block2mtd_sync(struct mtd_info *mtd)
- {
- struct block2mtd_dev *dev = mtd->priv;
-- sync_blockdev(dev->blkdev);
-- return;
--}
--
--
--static void block2mtd_free_device(struct block2mtd_dev *dev)
--{
-- if (!dev)
-- return;
--
-- kfree(dev->mtd.name);
-
-- if (dev->blkdev) {
-- invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
-- 0, -1);
-- close_bdev_excl(dev->blkdev);
-- }
-+ read_lock(&dev->bdev_mutex);
-+ if (dev->blkdev)
-+ sync_blockdev(dev->blkdev);
-+ read_unlock(&dev->bdev_mutex);
-
-- kfree(dev);
-+ return;
- }
-
-
--/* FIXME: ensure that mtd->size % erase_size == 0 */
--static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname)
-+static int _open_bdev(struct block2mtd_dev *dev)
- {
- struct block_device *bdev;
-- struct block2mtd_dev *dev;
-- struct mtd_partition *part;
--
-- if (!devname)
-- return NULL;
--
-- dev = kzalloc(sizeof(struct block2mtd_dev), GFP_KERNEL);
-- if (!dev)
-- return NULL;
-
- /* Get a handle on the device */
-- bdev = open_bdev_excl(devname, O_RDWR, NULL);
-+ bdev = open_bdev_excl(dev->devname, O_RDWR, NULL);
- #ifndef MODULE
- if (IS_ERR(bdev)) {
-
- /* We might not have rootfs mounted at this point. Try
- to resolve the device name by other means. */
-
-- dev_t devt = name_to_dev_t(devname);
-+ dev_t devt = name_to_dev_t(dev->devname);
- if (devt) {
- bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
- }
-@@ -267,17 +281,96 @@ static struct block2mtd_dev *add_device(
- #endif
-
- if (IS_ERR(bdev)) {
-- ERROR("error: cannot open device %s", devname);
-- goto devinit_err;
-+ ERROR("error: cannot open device %s", dev->devname);
-+ return 1;
- }
- dev->blkdev = bdev;
-
- if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) {
- ERROR("attempting to use an MTD device as a block device");
-- goto devinit_err;
-+ return 1;
- }
-
-+ return 0;
-+}
-+
-+static void _close_bdev(struct block2mtd_dev *dev)
-+{
-+ struct block_device *bdev;
-+
-+ if (!dev->blkdev)
-+ return;
-+
-+ bdev = dev->blkdev;
-+ invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, 0, -1);
-+ close_bdev_excl(dev->blkdev);
-+ dev->blkdev = NULL;
-+}
-+
-+static void block2mtd_free_device(struct block2mtd_dev *dev)
-+{
-+ if (!dev)
-+ return;
-+
-+ kfree(dev->mtd.name);
-+ _close_bdev(dev);
-+ kfree(dev);
-+}
-+
-+
-+static int block2mtd_refresh(struct mtd_info *mtd)
-+{
-+ struct block2mtd_dev *dev = mtd->priv;
-+ struct block_device *bdev;
-+ dev_t devt;
-+ int err = 0;
-+
-+ /* no other mtd function can run at this point */
-+ write_lock(&dev->bdev_mutex);
-+
-+ /* get the device number for the whole disk */
-+ devt = MKDEV(MAJOR(dev->blkdev->bd_dev), 0);
-+
-+ /* close the old block device */
-+ _close_bdev(dev);
-+
-+ /* open the whole disk, issue a partition rescan, then */
-+ bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
-+ if (!bdev || !bdev->bd_disk)
-+ err = -EINVAL;
-+ else {
-+ err = rescan_partitions(bdev->bd_disk, bdev);
-+ }
-+ if (bdev)
-+ close_bdev_excl(bdev);
-+
-+ /* try to open the partition block device again */
-+ _open_bdev(dev);
-+ write_unlock(&dev->bdev_mutex);
-+
-+ return err;
-+}
-+
-+/* FIXME: ensure that mtd->size % erase_size == 0 */
-+static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname)
-+{
-+ struct block2mtd_dev *dev;
-+ struct mtd_partition *part;
-+
-+ if (!devname)
-+ return NULL;
-+
-+ dev = kzalloc(sizeof(struct block2mtd_dev) + strlen(devname) + 1, GFP_KERNEL);
-+ if (!dev)
-+ return NULL;
-+
-+ strcpy(dev->devname, devname);
-+
-+ if (_open_bdev(dev))
-+ goto devinit_err;
-+
- mutex_init(&dev->write_mutex);
-+ rwlock_init(&dev->bdev_mutex);
-
- /* Setup the MTD structure */
- /* make the name contain the block device in */
-@@ -304,6 +397,7 @@ static struct block2mtd_dev *add_device(
- dev->mtd.read = block2mtd_read;
- dev->mtd.priv = dev;
- dev->mtd.owner = THIS_MODULE;
-+ dev->mtd.refresh_device = block2mtd_refresh;
-
- part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
- part->name = dev->mtd.name;
---- a/drivers/mtd/mtdchar.c
-+++ b/drivers/mtd/mtdchar.c
-@@ -17,6 +17,7 @@
-
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/compatmac.h>
-+#include <linux/mtd/partitions.h>
-
- #include <asm/uaccess.h>
-
-@@ -756,6 +757,13 @@ static int mtd_ioctl(struct inode *inode
- file->f_pos = 0;
- break;
- }
-+#ifdef CONFIG_MTD_PARTITIONS
-+ case MTDREFRESH:
-+ {
-+ ret = refresh_mtd_partitions(mtd);
-+ break;
-+ }
-+#endif
-
- default:
- ret = -ENOTTY;
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -98,6 +98,7 @@ struct mtd_oob_ops {
- uint8_t *oobbuf;
- };
-
-+struct mtd_info;
- struct mtd_info {
- u_char type;
- u_int32_t flags;
-@@ -211,6 +212,9 @@ struct mtd_info {
- struct module *owner;
- int usecount;
-
-+ int (*refresh_device)(struct mtd_info *mtd);
-+ struct mtd_info *split;
-+
- /* If the driver is something smart, like UBI, it may need to maintain
- * its own reference counting. The below functions are only for driver.
- * The driver may register its callbacks. These callbacks are not
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -36,6 +36,7 @@
- * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK).
- */
-
-+struct mtd_partition;
- struct mtd_partition {
- char *name; /* identifier string */
- u_int32_t size; /* partition size */
-@@ -43,6 +44,7 @@ struct mtd_partition {
- u_int32_t mask_flags; /* master MTD flags to mask out for this partition */
- struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/
- struct mtd_info **mtdp; /* pointer to store the MTD object */
-+ int (*refresh_partition)(struct mtd_info *);
- };
-
- #define MTDPART_OFS_NXTBLK (-2)
-@@ -52,6 +54,7 @@ struct mtd_partition {
-
- int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
- int del_mtd_partitions(struct mtd_info *);
-+int refresh_mtd_partitions(struct mtd_info *);
-
- /*
- * Functions dealing with the various ways of partitioning the space
---- a/include/mtd/mtd-abi.h
-+++ b/include/mtd/mtd-abi.h
-@@ -95,6 +95,7 @@ struct otp_info {
- #define ECCGETLAYOUT _IOR('M', 17, struct nand_ecclayout)
- #define ECCGETSTATS _IOR('M', 18, struct mtd_ecc_stats)
- #define MTDFILEMODE _IO('M', 19)
-+#define MTDREFRESH _IO('M', 23)
-
- /*
- * Obsolete legacy interface. Keep it in order not to break userspace
+++ /dev/null
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -251,14 +251,21 @@ static int parse_redboot_partitions(stru
- #endif
- names += strlen(names)+1;
-
--#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
- if(fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_base) {
-- i++;
-- parts[i].offset = parts[i-1].size + parts[i-1].offset;
-- parts[i].size = fl->next->img->flash_base - parts[i].offset;
-- parts[i].name = nullname;
-- }
-+ if (!strcmp(parts[i].name, "rootfs")) {
-+ parts[i].size = fl->next->img->flash_base;
-+ parts[i].size &= ~(master->erasesize - 1);
-+ parts[i].size -= parts[i].offset;
-+#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
-+ nrparts--;
-+ } else {
-+ i++;
-+ parts[i].offset = parts[i-1].size + parts[i-1].offset;
-+ parts[i].size = fl->next->img->flash_base - parts[i].offset;
-+ parts[i].name = nullname;
- #endif
-+ }
-+ }
- tmp_fl = fl;
- fl = fl->next;
- kfree(tmp_fl);
+++ /dev/null
---- a/include/linux/mtd/nand.h
-+++ b/include/linux/mtd/nand.h
-@@ -573,6 +573,7 @@ struct platform_nand_chip {
- int chip_delay;
- unsigned int options;
- const char **part_probe_types;
-+ int (*chip_fixup)(struct mtd_info *mtd);
- void *priv;
- };
-
---- a/drivers/mtd/nand/plat_nand.c
-+++ b/drivers/mtd/nand/plat_nand.c
-@@ -70,7 +70,18 @@ static int __init plat_nand_probe(struct
- platform_set_drvdata(pdev, data);
-
- /* Scan to find existance of the device */
-- if (nand_scan(&data->mtd, 1)) {
-+ if (nand_scan_ident(&data->mtd, 1)) {
-+ res = -ENXIO;
-+ goto out;
-+ }
-+
-+ if (pdata->chip.chip_fixup) {
-+ res = pdata->chip.chip_fixup(&data->mtd);
-+ if (res)
-+ goto out;
-+ }
-+
-+ if (nand_scan_tail(&data->mtd)) {
- res = -ENXIO;
- goto out;
- }
+++ /dev/null
---- /dev/null
-+++ b/include/linux/netfilter/xt_layer7.h
-@@ -0,0 +1,13 @@
-+#ifndef _XT_LAYER7_H
-+#define _XT_LAYER7_H
-+
-+#define MAX_PATTERN_LEN 8192
-+#define MAX_PROTOCOL_LEN 256
-+
-+struct xt_layer7_info {
-+ char protocol[MAX_PROTOCOL_LEN];
-+ char pattern[MAX_PATTERN_LEN];
-+ u_int8_t invert;
-+};
-+
-+#endif /* _XT_LAYER7_H */
---- a/include/net/netfilter/nf_conntrack.h
-+++ b/include/net/netfilter/nf_conntrack.h
-@@ -124,6 +124,22 @@ struct nf_conn
- u_int32_t secmark;
- #endif
-
-+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || \
-+ defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+ struct {
-+ /*
-+ * e.g. "http". NULL before decision. "unknown" after decision
-+ * if no match.
-+ */
-+ char *app_proto;
-+ /*
-+ * application layer data so far. NULL after match decision.
-+ */
-+ char *app_data;
-+ unsigned int app_data_len;
-+ } layer7;
-+#endif
-+
- /* Storage reserved for other modules: */
- union nf_conntrack_proto proto;
-
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -735,6 +735,27 @@ config NETFILTER_XT_MATCH_STATE
-
- To compile it as a module, choose M here. If unsure, say N.
-
-+config NETFILTER_XT_MATCH_LAYER7
-+ tristate '"layer7" match support'
-+ depends on NETFILTER_XTABLES
-+ depends on EXPERIMENTAL && (IP_NF_CONNTRACK || NF_CONNTRACK)
-+ depends on NF_CT_ACCT
-+ help
-+ Say Y if you want to be able to classify connections (and their
-+ packets) based on regular expression matching of their application
-+ layer data. This is one way to classify applications such as
-+ peer-to-peer filesharing systems that do not always use the same
-+ port.
-+
-+ To compile it as a module, choose M here. If unsure, say N.
-+
-+config NETFILTER_XT_MATCH_LAYER7_DEBUG
-+ bool 'Layer 7 debugging output'
-+ depends on NETFILTER_XT_MATCH_LAYER7
-+ help
-+ Say Y to get lots of debugging output.
-+
-+
- config NETFILTER_XT_MATCH_STATISTIC
- tristate '"statistic" match support'
- depends on NETFILTER_XTABLES
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -77,6 +77,7 @@ obj-$(CONFIG_NETFILTER_XT_MATCH_RATEEST)
- obj-$(CONFIG_NETFILTER_XT_MATCH_REALM) += xt_realm.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_SCTP) += xt_sctp.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STATE) += xt_state.o
-+obj-$(CONFIG_NETFILTER_XT_MATCH_LAYER7) += xt_layer7.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STATISTIC) += xt_statistic.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STRING) += xt_string.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_TCPMSS) += xt_tcpmss.o
---- a/net/netfilter/nf_conntrack_core.c
-+++ b/net/netfilter/nf_conntrack_core.c
-@@ -208,6 +208,14 @@ destroy_conntrack(struct nf_conntrack *n
- * too. */
- nf_ct_remove_expectations(ct);
-
-+ #if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+ if(ct->layer7.app_proto)
-+ kfree(ct->layer7.app_proto);
-+ if(ct->layer7.app_data)
-+ kfree(ct->layer7.app_data);
-+ #endif
-+
-+
- /* We overload first tuple to link into unconfirmed list. */
- if (!nf_ct_is_confirmed(ct)) {
- BUG_ON(hlist_unhashed(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnode));
---- a/net/netfilter/nf_conntrack_standalone.c
-+++ b/net/netfilter/nf_conntrack_standalone.c
-@@ -181,6 +181,12 @@ static int ct_seq_show(struct seq_file *
- return -ENOSPC;
- #endif
-
-+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+ if(ct->layer7.app_proto &&
-+ seq_printf(s, "l7proto=%s ", ct->layer7.app_proto))
-+ return -ENOSPC;
-+#endif
-+
- if (seq_printf(s, "use=%u\n", atomic_read(&ct->ct_general.use)))
- return -ENOSPC;
-
---- /dev/null
-+++ b/net/netfilter/regexp/regexp.c
-@@ -0,0 +1,1197 @@
-+/*
-+ * regcomp and regexec -- regsub and regerror are elsewhere
-+ * @(#)regexp.c 1.3 of 18 April 87
-+ *
-+ * Copyright (c) 1986 by University of Toronto.
-+ * Written by Henry Spencer. Not derived from licensed software.
-+ *
-+ * Permission is granted to anyone to use this software for any
-+ * purpose on any computer system, and to redistribute it freely,
-+ * subject to the following restrictions:
-+ *
-+ * 1. The author is not responsible for the consequences of use of
-+ * this software, no matter how awful, even if they arise
-+ * from defects in it.
-+ *
-+ * 2. The origin of this software must not be misrepresented, either
-+ * by explicit claim or by omission.
-+ *
-+ * 3. Altered versions must be plainly marked as such, and must not
-+ * be misrepresented as being the original software.
-+ *
-+ * Beware that some of this code is subtly aware of the way operator
-+ * precedence is structured in regular expressions. Serious changes in
-+ * regular-expression syntax might require a total rethink.
-+ *
-+ * This code was modified by Ethan Sommer to work within the kernel
-+ * (it now uses kmalloc etc..)
-+ *
-+ * Modified slightly by Matthew Strait to use more modern C.
-+ */
-+
-+#include "regexp.h"
-+#include "regmagic.h"
-+
-+/* added by ethan and matt. Lets it work in both kernel and user space.
-+(So iptables can use it, for instance.) Yea, it goes both ways... */
-+#if __KERNEL__
-+ #define malloc(foo) kmalloc(foo,GFP_ATOMIC)
-+#else
-+ #define printk(format,args...) printf(format,##args)
-+#endif
-+
-+void regerror(char * s)
-+{
-+ printk("<3>Regexp: %s\n", s);
-+ /* NOTREACHED */
-+}
-+
-+/*
-+ * The "internal use only" fields in regexp.h are present to pass info from
-+ * compile to execute that permits the execute phase to run lots faster on
-+ * simple cases. They are:
-+ *
-+ * regstart char that must begin a match; '\0' if none obvious
-+ * reganch is the match anchored (at beginning-of-line only)?
-+ * regmust string (pointer into program) that match must include, or NULL
-+ * regmlen length of regmust string
-+ *
-+ * Regstart and reganch permit very fast decisions on suitable starting points
-+ * for a match, cutting down the work a lot. Regmust permits fast rejection
-+ * of lines that cannot possibly match. The regmust tests are costly enough
-+ * that regcomp() supplies a regmust only if the r.e. contains something
-+ * potentially expensive (at present, the only such thing detected is * or +
-+ * at the start of the r.e., which can involve a lot of backup). Regmlen is
-+ * supplied because the test in regexec() needs it and regcomp() is computing
-+ * it anyway.
-+ */
-+
-+/*
-+ * Structure for regexp "program". This is essentially a linear encoding
-+ * of a nondeterministic finite-state machine (aka syntax charts or
-+ * "railroad normal form" in parsing technology). Each node is an opcode
-+ * plus a "next" pointer, possibly plus an operand. "Next" pointers of
-+ * all nodes except BRANCH implement concatenation; a "next" pointer with
-+ * a BRANCH on both ends of it is connecting two alternatives. (Here we
-+ * have one of the subtle syntax dependencies: an individual BRANCH (as
-+ * opposed to a collection of them) is never concatenated with anything
-+ * because of operator precedence.) The operand of some types of node is
-+ * a literal string; for others, it is a node leading into a sub-FSM. In
-+ * particular, the operand of a BRANCH node is the first node of the branch.
-+ * (NB this is *not* a tree structure: the tail of the branch connects
-+ * to the thing following the set of BRANCHes.) The opcodes are:
-+ */
-+
-+/* definition number opnd? meaning */
-+#define END 0 /* no End of program. */
-+#define BOL 1 /* no Match "" at beginning of line. */
-+#define EOL 2 /* no Match "" at end of line. */
-+#define ANY 3 /* no Match any one character. */
-+#define ANYOF 4 /* str Match any character in this string. */
-+#define ANYBUT 5 /* str Match any character not in this string. */
-+#define BRANCH 6 /* node Match this alternative, or the next... */
-+#define BACK 7 /* no Match "", "next" ptr points backward. */
-+#define EXACTLY 8 /* str Match this string. */
-+#define NOTHING 9 /* no Match empty string. */
-+#define STAR 10 /* node Match this (simple) thing 0 or more times. */
-+#define PLUS 11 /* node Match this (simple) thing 1 or more times. */
-+#define OPEN 20 /* no Mark this point in input as start of #n. */
-+ /* OPEN+1 is number 1, etc. */
-+#define CLOSE 30 /* no Analogous to OPEN. */
-+
-+/*
-+ * Opcode notes:
-+ *
-+ * BRANCH The set of branches constituting a single choice are hooked
-+ * together with their "next" pointers, since precedence prevents
-+ * anything being concatenated to any individual branch. The
-+ * "next" pointer of the last BRANCH in a choice points to the
-+ * thing following the whole choice. This is also where the
-+ * final "next" pointer of each individual branch points; each
-+ * branch starts with the operand node of a BRANCH node.
-+ *
-+ * BACK Normal "next" pointers all implicitly point forward; BACK
-+ * exists to make loop structures possible.
-+ *
-+ * STAR,PLUS '?', and complex '*' and '+', are implemented as circular
-+ * BRANCH structures using BACK. Simple cases (one character
-+ * per match) are implemented with STAR and PLUS for speed
-+ * and to minimize recursive plunges.
-+ *
-+ * OPEN,CLOSE ...are numbered at compile time.
-+ */
-+
-+/*
-+ * A node is one char of opcode followed by two chars of "next" pointer.
-+ * "Next" pointers are stored as two 8-bit pieces, high order first. The
-+ * value is a positive offset from the opcode of the node containing it.
-+ * An operand, if any, simply follows the node. (Note that much of the
-+ * code generation knows about this implicit relationship.)
-+ *
-+ * Using two bytes for the "next" pointer is vast overkill for most things,
-+ * but allows patterns to get big without disasters.
-+ */
-+#define OP(p) (*(p))
-+#define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377))
-+#define OPERAND(p) ((p) + 3)
-+
-+/*
-+ * See regmagic.h for one further detail of program structure.
-+ */
-+
-+
-+/*
-+ * Utility definitions.
-+ */
-+#ifndef CHARBITS
-+#define UCHARAT(p) ((int)*(unsigned char *)(p))
-+#else
-+#define UCHARAT(p) ((int)*(p)&CHARBITS)
-+#endif
-+
-+#define FAIL(m) { regerror(m); return(NULL); }
-+#define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?')
-+#define META "^$.[()|?+*\\"
-+
-+/*
-+ * Flags to be passed up and down.
-+ */
-+#define HASWIDTH 01 /* Known never to match null string. */
-+#define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */
-+#define SPSTART 04 /* Starts with * or +. */
-+#define WORST 0 /* Worst case. */
-+
-+/*
-+ * Global work variables for regcomp().
-+ */
-+struct match_globals {
-+char *reginput; /* String-input pointer. */
-+char *regbol; /* Beginning of input, for ^ check. */
-+char **regstartp; /* Pointer to startp array. */
-+char **regendp; /* Ditto for endp. */
-+char *regparse; /* Input-scan pointer. */
-+int regnpar; /* () count. */
-+char regdummy;
-+char *regcode; /* Code-emit pointer; ®dummy = don't. */
-+long regsize; /* Code size. */
-+};
-+
-+/*
-+ * Forward declarations for regcomp()'s friends.
-+ */
-+#ifndef STATIC
-+#define STATIC static
-+#endif
-+STATIC char *reg(struct match_globals *g, int paren,int *flagp);
-+STATIC char *regbranch(struct match_globals *g, int *flagp);
-+STATIC char *regpiece(struct match_globals *g, int *flagp);
-+STATIC char *regatom(struct match_globals *g, int *flagp);
-+STATIC char *regnode(struct match_globals *g, char op);
-+STATIC char *regnext(struct match_globals *g, char *p);
-+STATIC void regc(struct match_globals *g, char b);
-+STATIC void reginsert(struct match_globals *g, char op, char *opnd);
-+STATIC void regtail(struct match_globals *g, char *p, char *val);
-+STATIC void regoptail(struct match_globals *g, char *p, char *val);
-+
-+
-+__kernel_size_t my_strcspn(const char *s1,const char *s2)
-+{
-+ char *scan1;
-+ char *scan2;
-+ int count;
-+
-+ count = 0;
-+ for (scan1 = (char *)s1; *scan1 != '\0'; scan1++) {
-+ for (scan2 = (char *)s2; *scan2 != '\0';) /* ++ moved down. */
-+ if (*scan1 == *scan2++)
-+ return(count);
-+ count++;
-+ }
-+ return(count);
-+}
-+
-+/*
-+ - regcomp - compile a regular expression into internal code
-+ *
-+ * We can't allocate space until we know how big the compiled form will be,
-+ * but we can't compile it (and thus know how big it is) until we've got a
-+ * place to put the code. So we cheat: we compile it twice, once with code
-+ * generation turned off and size counting turned on, and once "for real".
-+ * This also means that we don't allocate space until we are sure that the
-+ * thing really will compile successfully, and we never have to move the
-+ * code and thus invalidate pointers into it. (Note that it has to be in
-+ * one piece because free() must be able to free it all.)
-+ *
-+ * Beware that the optimization-preparation code in here knows about some
-+ * of the structure of the compiled regexp.
-+ */
-+regexp *
-+regcomp(char *exp,int *patternsize)
-+{
-+ register regexp *r;
-+ register char *scan;
-+ register char *longest;
-+ register int len;
-+ int flags;
-+ struct match_globals g;
-+
-+ /* commented out by ethan
-+ extern char *malloc();
-+ */
-+
-+ if (exp == NULL)
-+ FAIL("NULL argument");
-+
-+ /* First pass: determine size, legality. */
-+ g.regparse = exp;
-+ g.regnpar = 1;
-+ g.regsize = 0L;
-+ g.regcode = &g.regdummy;
-+ regc(&g, MAGIC);
-+ if (reg(&g, 0, &flags) == NULL)
-+ return(NULL);
-+
-+ /* Small enough for pointer-storage convention? */
-+ if (g.regsize >= 32767L) /* Probably could be 65535L. */
-+ FAIL("regexp too big");
-+
-+ /* Allocate space. */
-+ *patternsize=sizeof(regexp) + (unsigned)g.regsize;
-+ r = (regexp *)malloc(sizeof(regexp) + (unsigned)g.regsize);
-+ if (r == NULL)
-+ FAIL("out of space");
-+
-+ /* Second pass: emit code. */
-+ g.regparse = exp;
-+ g.regnpar = 1;
-+ g.regcode = r->program;
-+ regc(&g, MAGIC);
-+ if (reg(&g, 0, &flags) == NULL)
-+ return(NULL);
-+
-+ /* Dig out information for optimizations. */
-+ r->regstart = '\0'; /* Worst-case defaults. */
-+ r->reganch = 0;
-+ r->regmust = NULL;
-+ r->regmlen = 0;
-+ scan = r->program+1; /* First BRANCH. */
-+ if (OP(regnext(&g, scan)) == END) { /* Only one top-level choice. */
-+ scan = OPERAND(scan);
-+
-+ /* Starting-point info. */
-+ if (OP(scan) == EXACTLY)
-+ r->regstart = *OPERAND(scan);
-+ else if (OP(scan) == BOL)
-+ r->reganch++;
-+
-+ /*
-+ * If there's something expensive in the r.e., find the
-+ * longest literal string that must appear and make it the
-+ * regmust. Resolve ties in favor of later strings, since
-+ * the regstart check works with the beginning of the r.e.
-+ * and avoiding duplication strengthens checking. Not a
-+ * strong reason, but sufficient in the absence of others.
-+ */
-+ if (flags&SPSTART) {
-+ longest = NULL;
-+ len = 0;
-+ for (; scan != NULL; scan = regnext(&g, scan))
-+ if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) {
-+ longest = OPERAND(scan);
-+ len = strlen(OPERAND(scan));
-+ }
-+ r->regmust = longest;
-+ r->regmlen = len;
-+ }
-+ }
-+
-+ return(r);
-+}
-+
-+/*
-+ - reg - regular expression, i.e. main body or parenthesized thing
-+ *
-+ * Caller must absorb opening parenthesis.
-+ *
-+ * Combining parenthesis handling with the base level of regular expression
-+ * is a trifle forced, but the need to tie the tails of the branches to what
-+ * follows makes it hard to avoid.
-+ */
-+static char *
-+reg(struct match_globals *g, int paren, int *flagp /* Parenthesized? */ )
-+{
-+ register char *ret;
-+ register char *br;
-+ register char *ender;
-+ register int parno = 0; /* 0 makes gcc happy */
-+ int flags;
-+
-+ *flagp = HASWIDTH; /* Tentatively. */
-+
-+ /* Make an OPEN node, if parenthesized. */
-+ if (paren) {
-+ if (g->regnpar >= NSUBEXP)
-+ FAIL("too many ()");
-+ parno = g->regnpar;
-+ g->regnpar++;
-+ ret = regnode(g, OPEN+parno);
-+ } else
-+ ret = NULL;
-+
-+ /* Pick up the branches, linking them together. */
-+ br = regbranch(g, &flags);
-+ if (br == NULL)
-+ return(NULL);
-+ if (ret != NULL)
-+ regtail(g, ret, br); /* OPEN -> first. */
-+ else
-+ ret = br;
-+ if (!(flags&HASWIDTH))
-+ *flagp &= ~HASWIDTH;
-+ *flagp |= flags&SPSTART;
-+ while (*g->regparse == '|') {
-+ g->regparse++;
-+ br = regbranch(g, &flags);
-+ if (br == NULL)
-+ return(NULL);
-+ regtail(g, ret, br); /* BRANCH -> BRANCH. */
-+ if (!(flags&HASWIDTH))
-+ *flagp &= ~HASWIDTH;
-+ *flagp |= flags&SPSTART;
-+ }
-+
-+ /* Make a closing node, and hook it on the end. */
-+ ender = regnode(g, (paren) ? CLOSE+parno : END);
-+ regtail(g, ret, ender);
-+
-+ /* Hook the tails of the branches to the closing node. */
-+ for (br = ret; br != NULL; br = regnext(g, br))
-+ regoptail(g, br, ender);
-+
-+ /* Check for proper termination. */
-+ if (paren && *g->regparse++ != ')') {
-+ FAIL("unmatched ()");
-+ } else if (!paren && *g->regparse != '\0') {
-+ if (*g->regparse == ')') {
-+ FAIL("unmatched ()");
-+ } else
-+ FAIL("junk on end"); /* "Can't happen". */
-+ /* NOTREACHED */
-+ }
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regbranch - one alternative of an | operator
-+ *
-+ * Implements the concatenation operator.
-+ */
-+static char *
-+regbranch(struct match_globals *g, int *flagp)
-+{
-+ register char *ret;
-+ register char *chain;
-+ register char *latest;
-+ int flags;
-+
-+ *flagp = WORST; /* Tentatively. */
-+
-+ ret = regnode(g, BRANCH);
-+ chain = NULL;
-+ while (*g->regparse != '\0' && *g->regparse != '|' && *g->regparse != ')') {
-+ latest = regpiece(g, &flags);
-+ if (latest == NULL)
-+ return(NULL);
-+ *flagp |= flags&HASWIDTH;
-+ if (chain == NULL) /* First piece. */
-+ *flagp |= flags&SPSTART;
-+ else
-+ regtail(g, chain, latest);
-+ chain = latest;
-+ }
-+ if (chain == NULL) /* Loop ran zero times. */
-+ (void) regnode(g, NOTHING);
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regpiece - something followed by possible [*+?]
-+ *
-+ * Note that the branching code sequences used for ? and the general cases
-+ * of * and + are somewhat optimized: they use the same NOTHING node as
-+ * both the endmarker for their branch list and the body of the last branch.
-+ * It might seem that this node could be dispensed with entirely, but the
-+ * endmarker role is not redundant.
-+ */
-+static char *
-+regpiece(struct match_globals *g, int *flagp)
-+{
-+ register char *ret;
-+ register char op;
-+ register char *next;
-+ int flags;
-+
-+ ret = regatom(g, &flags);
-+ if (ret == NULL)
-+ return(NULL);
-+
-+ op = *g->regparse;
-+ if (!ISMULT(op)) {
-+ *flagp = flags;
-+ return(ret);
-+ }
-+
-+ if (!(flags&HASWIDTH) && op != '?')
-+ FAIL("*+ operand could be empty");
-+ *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH);
-+
-+ if (op == '*' && (flags&SIMPLE))
-+ reginsert(g, STAR, ret);
-+ else if (op == '*') {
-+ /* Emit x* as (x&|), where & means "self". */
-+ reginsert(g, BRANCH, ret); /* Either x */
-+ regoptail(g, ret, regnode(g, BACK)); /* and loop */
-+ regoptail(g, ret, ret); /* back */
-+ regtail(g, ret, regnode(g, BRANCH)); /* or */
-+ regtail(g, ret, regnode(g, NOTHING)); /* null. */
-+ } else if (op == '+' && (flags&SIMPLE))
-+ reginsert(g, PLUS, ret);
-+ else if (op == '+') {
-+ /* Emit x+ as x(&|), where & means "self". */
-+ next = regnode(g, BRANCH); /* Either */
-+ regtail(g, ret, next);
-+ regtail(g, regnode(g, BACK), ret); /* loop back */
-+ regtail(g, next, regnode(g, BRANCH)); /* or */
-+ regtail(g, ret, regnode(g, NOTHING)); /* null. */
-+ } else if (op == '?') {
-+ /* Emit x? as (x|) */
-+ reginsert(g, BRANCH, ret); /* Either x */
-+ regtail(g, ret, regnode(g, BRANCH)); /* or */
-+ next = regnode(g, NOTHING); /* null. */
-+ regtail(g, ret, next);
-+ regoptail(g, ret, next);
-+ }
-+ g->regparse++;
-+ if (ISMULT(*g->regparse))
-+ FAIL("nested *?+");
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regatom - the lowest level
-+ *
-+ * Optimization: gobbles an entire sequence of ordinary characters so that
-+ * it can turn them into a single node, which is smaller to store and
-+ * faster to run. Backslashed characters are exceptions, each becoming a
-+ * separate node; the code is simpler that way and it's not worth fixing.
-+ */
-+static char *
-+regatom(struct match_globals *g, int *flagp)
-+{
-+ register char *ret;
-+ int flags;
-+
-+ *flagp = WORST; /* Tentatively. */
-+
-+ switch (*g->regparse++) {
-+ case '^':
-+ ret = regnode(g, BOL);
-+ break;
-+ case '$':
-+ ret = regnode(g, EOL);
-+ break;
-+ case '.':
-+ ret = regnode(g, ANY);
-+ *flagp |= HASWIDTH|SIMPLE;
-+ break;
-+ case '[': {
-+ register int class;
-+ register int classend;
-+
-+ if (*g->regparse == '^') { /* Complement of range. */
-+ ret = regnode(g, ANYBUT);
-+ g->regparse++;
-+ } else
-+ ret = regnode(g, ANYOF);
-+ if (*g->regparse == ']' || *g->regparse == '-')
-+ regc(g, *g->regparse++);
-+ while (*g->regparse != '\0' && *g->regparse != ']') {
-+ if (*g->regparse == '-') {
-+ g->regparse++;
-+ if (*g->regparse == ']' || *g->regparse == '\0')
-+ regc(g, '-');
-+ else {
-+ class = UCHARAT(g->regparse-2)+1;
-+ classend = UCHARAT(g->regparse);
-+ if (class > classend+1)
-+ FAIL("invalid [] range");
-+ for (; class <= classend; class++)
-+ regc(g, class);
-+ g->regparse++;
-+ }
-+ } else
-+ regc(g, *g->regparse++);
-+ }
-+ regc(g, '\0');
-+ if (*g->regparse != ']')
-+ FAIL("unmatched []");
-+ g->regparse++;
-+ *flagp |= HASWIDTH|SIMPLE;
-+ }
-+ break;
-+ case '(':
-+ ret = reg(g, 1, &flags);
-+ if (ret == NULL)
-+ return(NULL);
-+ *flagp |= flags&(HASWIDTH|SPSTART);
-+ break;
-+ case '\0':
-+ case '|':
-+ case ')':
-+ FAIL("internal urp"); /* Supposed to be caught earlier. */
-+ break;
-+ case '?':
-+ case '+':
-+ case '*':
-+ FAIL("?+* follows nothing");
-+ break;
-+ case '\\':
-+ if (*g->regparse == '\0')
-+ FAIL("trailing \\");
-+ ret = regnode(g, EXACTLY);
-+ regc(g, *g->regparse++);
-+ regc(g, '\0');
-+ *flagp |= HASWIDTH|SIMPLE;
-+ break;
-+ default: {
-+ register int len;
-+ register char ender;
-+
-+ g->regparse--;
-+ len = my_strcspn((const char *)g->regparse, (const char *)META);
-+ if (len <= 0)
-+ FAIL("internal disaster");
-+ ender = *(g->regparse+len);
-+ if (len > 1 && ISMULT(ender))
-+ len--; /* Back off clear of ?+* operand. */
-+ *flagp |= HASWIDTH;
-+ if (len == 1)
-+ *flagp |= SIMPLE;
-+ ret = regnode(g, EXACTLY);
-+ while (len > 0) {
-+ regc(g, *g->regparse++);
-+ len--;
-+ }
-+ regc(g, '\0');
-+ }
-+ break;
-+ }
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regnode - emit a node
-+ */
-+static char * /* Location. */
-+regnode(struct match_globals *g, char op)
-+{
-+ register char *ret;
-+ register char *ptr;
-+
-+ ret = g->regcode;
-+ if (ret == &g->regdummy) {
-+ g->regsize += 3;
-+ return(ret);
-+ }
-+
-+ ptr = ret;
-+ *ptr++ = op;
-+ *ptr++ = '\0'; /* Null "next" pointer. */
-+ *ptr++ = '\0';
-+ g->regcode = ptr;
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regc - emit (if appropriate) a byte of code
-+ */
-+static void
-+regc(struct match_globals *g, char b)
-+{
-+ if (g->regcode != &g->regdummy)
-+ *g->regcode++ = b;
-+ else
-+ g->regsize++;
-+}
-+
-+/*
-+ - reginsert - insert an operator in front of already-emitted operand
-+ *
-+ * Means relocating the operand.
-+ */
-+static void
-+reginsert(struct match_globals *g, char op, char* opnd)
-+{
-+ register char *src;
-+ register char *dst;
-+ register char *place;
-+
-+ if (g->regcode == &g->regdummy) {
-+ g->regsize += 3;
-+ return;
-+ }
-+
-+ src = g->regcode;
-+ g->regcode += 3;
-+ dst = g->regcode;
-+ while (src > opnd)
-+ *--dst = *--src;
-+
-+ place = opnd; /* Op node, where operand used to be. */
-+ *place++ = op;
-+ *place++ = '\0';
-+ *place++ = '\0';
-+}
-+
-+/*
-+ - regtail - set the next-pointer at the end of a node chain
-+ */
-+static void
-+regtail(struct match_globals *g, char *p, char *val)
-+{
-+ register char *scan;
-+ register char *temp;
-+ register int offset;
-+
-+ if (p == &g->regdummy)
-+ return;
-+
-+ /* Find last node. */
-+ scan = p;
-+ for (;;) {
-+ temp = regnext(g, scan);
-+ if (temp == NULL)
-+ break;
-+ scan = temp;
-+ }
-+
-+ if (OP(scan) == BACK)
-+ offset = scan - val;
-+ else
-+ offset = val - scan;
-+ *(scan+1) = (offset>>8)&0377;
-+ *(scan+2) = offset&0377;
-+}
-+
-+/*
-+ - regoptail - regtail on operand of first argument; nop if operandless
-+ */
-+static void
-+regoptail(struct match_globals *g, char *p, char *val)
-+{
-+ /* "Operandless" and "op != BRANCH" are synonymous in practice. */
-+ if (p == NULL || p == &g->regdummy || OP(p) != BRANCH)
-+ return;
-+ regtail(g, OPERAND(p), val);
-+}
-+
-+/*
-+ * regexec and friends
-+ */
-+
-+
-+/*
-+ * Forwards.
-+ */
-+STATIC int regtry(struct match_globals *g, regexp *prog, char *string);
-+STATIC int regmatch(struct match_globals *g, char *prog);
-+STATIC int regrepeat(struct match_globals *g, char *p);
-+
-+#ifdef DEBUG
-+int regnarrate = 0;
-+void regdump();
-+STATIC char *regprop(char *op);
-+#endif
-+
-+/*
-+ - regexec - match a regexp against a string
-+ */
-+int
-+regexec(regexp *prog, char *string)
-+{
-+ register char *s;
-+ struct match_globals g;
-+
-+ /* Be paranoid... */
-+ if (prog == NULL || string == NULL) {
-+ printk("<3>Regexp: NULL parameter\n");
-+ return(0);
-+ }
-+
-+ /* Check validity of program. */
-+ if (UCHARAT(prog->program) != MAGIC) {
-+ printk("<3>Regexp: corrupted program\n");
-+ return(0);
-+ }
-+
-+ /* If there is a "must appear" string, look for it. */
-+ if (prog->regmust != NULL) {
-+ s = string;
-+ while ((s = strchr(s, prog->regmust[0])) != NULL) {
-+ if (strncmp(s, prog->regmust, prog->regmlen) == 0)
-+ break; /* Found it. */
-+ s++;
-+ }
-+ if (s == NULL) /* Not present. */
-+ return(0);
-+ }
-+
-+ /* Mark beginning of line for ^ . */
-+ g.regbol = string;
-+
-+ /* Simplest case: anchored match need be tried only once. */
-+ if (prog->reganch)
-+ return(regtry(&g, prog, string));
-+
-+ /* Messy cases: unanchored match. */
-+ s = string;
-+ if (prog->regstart != '\0')
-+ /* We know what char it must start with. */
-+ while ((s = strchr(s, prog->regstart)) != NULL) {
-+ if (regtry(&g, prog, s))
-+ return(1);
-+ s++;
-+ }
-+ else
-+ /* We don't -- general case. */
-+ do {
-+ if (regtry(&g, prog, s))
-+ return(1);
-+ } while (*s++ != '\0');
-+
-+ /* Failure. */
-+ return(0);
-+}
-+
-+/*
-+ - regtry - try match at specific point
-+ */
-+static int /* 0 failure, 1 success */
-+regtry(struct match_globals *g, regexp *prog, char *string)
-+{
-+ register int i;
-+ register char **sp;
-+ register char **ep;
-+
-+ g->reginput = string;
-+ g->regstartp = prog->startp;
-+ g->regendp = prog->endp;
-+
-+ sp = prog->startp;
-+ ep = prog->endp;
-+ for (i = NSUBEXP; i > 0; i--) {
-+ *sp++ = NULL;
-+ *ep++ = NULL;
-+ }
-+ if (regmatch(g, prog->program + 1)) {
-+ prog->startp[0] = string;
-+ prog->endp[0] = g->reginput;
-+ return(1);
-+ } else
-+ return(0);
-+}
-+
-+/*
-+ - regmatch - main matching routine
-+ *
-+ * Conceptually the strategy is simple: check to see whether the current
-+ * node matches, call self recursively to see whether the rest matches,
-+ * and then act accordingly. In practice we make some effort to avoid
-+ * recursion, in particular by going through "ordinary" nodes (that don't
-+ * need to know whether the rest of the match failed) by a loop instead of
-+ * by recursion.
-+ */
-+static int /* 0 failure, 1 success */
-+regmatch(struct match_globals *g, char *prog)
-+{
-+ register char *scan = prog; /* Current node. */
-+ char *next; /* Next node. */
-+
-+#ifdef DEBUG
-+ if (scan != NULL && regnarrate)
-+ fprintf(stderr, "%s(\n", regprop(scan));
-+#endif
-+ while (scan != NULL) {
-+#ifdef DEBUG
-+ if (regnarrate)
-+ fprintf(stderr, "%s...\n", regprop(scan));
-+#endif
-+ next = regnext(g, scan);
-+
-+ switch (OP(scan)) {
-+ case BOL:
-+ if (g->reginput != g->regbol)
-+ return(0);
-+ break;
-+ case EOL:
-+ if (*g->reginput != '\0')
-+ return(0);
-+ break;
-+ case ANY:
-+ if (*g->reginput == '\0')
-+ return(0);
-+ g->reginput++;
-+ break;
-+ case EXACTLY: {
-+ register int len;
-+ register char *opnd;
-+
-+ opnd = OPERAND(scan);
-+ /* Inline the first character, for speed. */
-+ if (*opnd != *g->reginput)
-+ return(0);
-+ len = strlen(opnd);
-+ if (len > 1 && strncmp(opnd, g->reginput, len) != 0)
-+ return(0);
-+ g->reginput += len;
-+ }
-+ break;
-+ case ANYOF:
-+ if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) == NULL)
-+ return(0);
-+ g->reginput++;
-+ break;
-+ case ANYBUT:
-+ if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) != NULL)
-+ return(0);
-+ g->reginput++;
-+ break;
-+ case NOTHING:
-+ case BACK:
-+ break;
-+ case OPEN+1:
-+ case OPEN+2:
-+ case OPEN+3:
-+ case OPEN+4:
-+ case OPEN+5:
-+ case OPEN+6:
-+ case OPEN+7:
-+ case OPEN+8:
-+ case OPEN+9: {
-+ register int no;
-+ register char *save;
-+
-+ no = OP(scan) - OPEN;
-+ save = g->reginput;
-+
-+ if (regmatch(g, next)) {
-+ /*
-+ * Don't set startp if some later
-+ * invocation of the same parentheses
-+ * already has.
-+ */
-+ if (g->regstartp[no] == NULL)
-+ g->regstartp[no] = save;
-+ return(1);
-+ } else
-+ return(0);
-+ }
-+ break;
-+ case CLOSE+1:
-+ case CLOSE+2:
-+ case CLOSE+3:
-+ case CLOSE+4:
-+ case CLOSE+5:
-+ case CLOSE+6:
-+ case CLOSE+7:
-+ case CLOSE+8:
-+ case CLOSE+9:
-+ {
-+ register int no;
-+ register char *save;
-+
-+ no = OP(scan) - CLOSE;
-+ save = g->reginput;
-+
-+ if (regmatch(g, next)) {
-+ /*
-+ * Don't set endp if some later
-+ * invocation of the same parentheses
-+ * already has.
-+ */
-+ if (g->regendp[no] == NULL)
-+ g->regendp[no] = save;
-+ return(1);
-+ } else
-+ return(0);
-+ }
-+ break;
-+ case BRANCH: {
-+ register char *save;
-+
-+ if (OP(next) != BRANCH) /* No choice. */
-+ next = OPERAND(scan); /* Avoid recursion. */
-+ else {
-+ do {
-+ save = g->reginput;
-+ if (regmatch(g, OPERAND(scan)))
-+ return(1);
-+ g->reginput = save;
-+ scan = regnext(g, scan);
-+ } while (scan != NULL && OP(scan) == BRANCH);
-+ return(0);
-+ /* NOTREACHED */
-+ }
-+ }
-+ break;
-+ case STAR:
-+ case PLUS: {
-+ register char nextch;
-+ register int no;
-+ register char *save;
-+ register int min;
-+
-+ /*
-+ * Lookahead to avoid useless match attempts
-+ * when we know what character comes next.
-+ */
-+ nextch = '\0';
-+ if (OP(next) == EXACTLY)
-+ nextch = *OPERAND(next);
-+ min = (OP(scan) == STAR) ? 0 : 1;
-+ save = g->reginput;
-+ no = regrepeat(g, OPERAND(scan));
-+ while (no >= min) {
-+ /* If it could work, try it. */
-+ if (nextch == '\0' || *g->reginput == nextch)
-+ if (regmatch(g, next))
-+ return(1);
-+ /* Couldn't or didn't -- back up. */
-+ no--;
-+ g->reginput = save + no;
-+ }
-+ return(0);
-+ }
-+ break;
-+ case END:
-+ return(1); /* Success! */
-+ break;
-+ default:
-+ printk("<3>Regexp: memory corruption\n");
-+ return(0);
-+ break;
-+ }
-+
-+ scan = next;
-+ }
-+
-+ /*
-+ * We get here only if there's trouble -- normally "case END" is
-+ * the terminating point.
-+ */
-+ printk("<3>Regexp: corrupted pointers\n");
-+ return(0);
-+}
-+
-+/*
-+ - regrepeat - repeatedly match something simple, report how many
-+ */
-+static int
-+regrepeat(struct match_globals *g, char *p)
-+{
-+ register int count = 0;
-+ register char *scan;
-+ register char *opnd;
-+
-+ scan = g->reginput;
-+ opnd = OPERAND(p);
-+ switch (OP(p)) {
-+ case ANY:
-+ count = strlen(scan);
-+ scan += count;
-+ break;
-+ case EXACTLY:
-+ while (*opnd == *scan) {
-+ count++;
-+ scan++;
-+ }
-+ break;
-+ case ANYOF:
-+ while (*scan != '\0' && strchr(opnd, *scan) != NULL) {
-+ count++;
-+ scan++;
-+ }
-+ break;
-+ case ANYBUT:
-+ while (*scan != '\0' && strchr(opnd, *scan) == NULL) {
-+ count++;
-+ scan++;
-+ }
-+ break;
-+ default: /* Oh dear. Called inappropriately. */
-+ printk("<3>Regexp: internal foulup\n");
-+ count = 0; /* Best compromise. */
-+ break;
-+ }
-+ g->reginput = scan;
-+
-+ return(count);
-+}
-+
-+/*
-+ - regnext - dig the "next" pointer out of a node
-+ */
-+static char*
-+regnext(struct match_globals *g, char *p)
-+{
-+ register int offset;
-+
-+ if (p == &g->regdummy)
-+ return(NULL);
-+
-+ offset = NEXT(p);
-+ if (offset == 0)
-+ return(NULL);
-+
-+ if (OP(p) == BACK)
-+ return(p-offset);
-+ else
-+ return(p+offset);
-+}
-+
-+#ifdef DEBUG
-+
-+STATIC char *regprop();
-+
-+/*
-+ - regdump - dump a regexp onto stdout in vaguely comprehensible form
-+ */
-+void
-+regdump(regexp *r)
-+{
-+ register char *s;
-+ register char op = EXACTLY; /* Arbitrary non-END op. */
-+ register char *next;
-+ /* extern char *strchr(); */
-+
-+
-+ s = r->program + 1;
-+ while (op != END) { /* While that wasn't END last time... */
-+ op = OP(s);
-+ printf("%2d%s", s-r->program, regprop(s)); /* Where, what. */
-+ next = regnext(s);
-+ if (next == NULL) /* Next ptr. */
-+ printf("(0)");
-+ else
-+ printf("(%d)", (s-r->program)+(next-s));
-+ s += 3;
-+ if (op == ANYOF || op == ANYBUT || op == EXACTLY) {
-+ /* Literal string, where present. */
-+ while (*s != '\0') {
-+ putchar(*s);
-+ s++;
-+ }
-+ s++;
-+ }
-+ putchar('\n');
-+ }
-+
-+ /* Header fields of interest. */
-+ if (r->regstart != '\0')
-+ printf("start `%c' ", r->regstart);
-+ if (r->reganch)
-+ printf("anchored ");
-+ if (r->regmust != NULL)
-+ printf("must have \"%s\"", r->regmust);
-+ printf("\n");
-+}
-+
-+/*
-+ - regprop - printable representation of opcode
-+ */
-+static char *
-+regprop(char *op)
-+{
-+#define BUFLEN 50
-+ register char *p;
-+ static char buf[BUFLEN];
-+
-+ strcpy(buf, ":");
-+
-+ switch (OP(op)) {
-+ case BOL:
-+ p = "BOL";
-+ break;
-+ case EOL:
-+ p = "EOL";
-+ break;
-+ case ANY:
-+ p = "ANY";
-+ break;
-+ case ANYOF:
-+ p = "ANYOF";
-+ break;
-+ case ANYBUT:
-+ p = "ANYBUT";
-+ break;
-+ case BRANCH:
-+ p = "BRANCH";
-+ break;
-+ case EXACTLY:
-+ p = "EXACTLY";
-+ break;
-+ case NOTHING:
-+ p = "NOTHING";
-+ break;
-+ case BACK:
-+ p = "BACK";
-+ break;
-+ case END:
-+ p = "END";
-+ break;
-+ case OPEN+1:
-+ case OPEN+2:
-+ case OPEN+3:
-+ case OPEN+4:
-+ case OPEN+5:
-+ case OPEN+6:
-+ case OPEN+7:
-+ case OPEN+8:
-+ case OPEN+9:
-+ snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "OPEN%d", OP(op)-OPEN);
-+ p = NULL;
-+ break;
-+ case CLOSE+1:
-+ case CLOSE+2:
-+ case CLOSE+3:
-+ case CLOSE+4:
-+ case CLOSE+5:
-+ case CLOSE+6:
-+ case CLOSE+7:
-+ case CLOSE+8:
-+ case CLOSE+9:
-+ snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "CLOSE%d", OP(op)-CLOSE);
-+ p = NULL;
-+ break;
-+ case STAR:
-+ p = "STAR";
-+ break;
-+ case PLUS:
-+ p = "PLUS";
-+ break;
-+ default:
-+ printk("<3>Regexp: corrupted opcode\n");
-+ break;
-+ }
-+ if (p != NULL)
-+ strncat(buf, p, BUFLEN-strlen(buf));
-+ return(buf);
-+}
-+#endif
-+
-+
---- /dev/null
-+++ b/net/netfilter/regexp/regexp.h
-@@ -0,0 +1,41 @@
-+/*
-+ * Definitions etc. for regexp(3) routines.
-+ *
-+ * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof],
-+ * not the System V one.
-+ */
-+
-+#ifndef REGEXP_H
-+#define REGEXP_H
-+
-+
-+/*
-+http://www.opensource.apple.com/darwinsource/10.3/expect-1/expect/expect.h ,
-+which contains a version of this library, says:
-+
-+ *
-+ * NSUBEXP must be at least 10, and no greater than 117 or the parser
-+ * will not work properly.
-+ *
-+
-+However, it looks rather like this library is limited to 10. If you think
-+otherwise, let us know.
-+*/
-+
-+#define NSUBEXP 10
-+typedef struct regexp {
-+ char *startp[NSUBEXP];
-+ char *endp[NSUBEXP];
-+ char regstart; /* Internal use only. */
-+ char reganch; /* Internal use only. */
-+ char *regmust; /* Internal use only. */
-+ int regmlen; /* Internal use only. */
-+ char program[1]; /* Unwarranted chumminess with compiler. */
-+} regexp;
-+
-+regexp * regcomp(char *exp, int *patternsize);
-+int regexec(regexp *prog, char *string);
-+void regsub(regexp *prog, char *source, char *dest);
-+void regerror(char *s);
-+
-+#endif
---- /dev/null
-+++ b/net/netfilter/regexp/regmagic.h
-@@ -0,0 +1,5 @@
-+/*
-+ * The first byte of the regexp internal "program" is actually this magic
-+ * number; the start node begins in the second byte.
-+ */
-+#define MAGIC 0234
---- /dev/null
-+++ b/net/netfilter/regexp/regsub.c
-@@ -0,0 +1,95 @@
-+/*
-+ * regsub
-+ * @(#)regsub.c 1.3 of 2 April 86
-+ *
-+ * Copyright (c) 1986 by University of Toronto.
-+ * Written by Henry Spencer. Not derived from licensed software.
-+ *
-+ * Permission is granted to anyone to use this software for any
-+ * purpose on any computer system, and to redistribute it freely,
-+ * subject to the following restrictions:
-+ *
-+ * 1. The author is not responsible for the consequences of use of
-+ * this software, no matter how awful, even if they arise
-+ * from defects in it.
-+ *
-+ * 2. The origin of this software must not be misrepresented, either
-+ * by explicit claim or by omission.
-+ *
-+ * 3. Altered versions must be plainly marked as such, and must not
-+ * be misrepresented as being the original software.
-+ *
-+ *
-+ * This code was modified by Ethan Sommer to work within the kernel
-+ * (it now uses kmalloc etc..)
-+ *
-+ */
-+#include "regexp.h"
-+#include "regmagic.h"
-+#include <linux/string.h>
-+
-+
-+#ifndef CHARBITS
-+#define UCHARAT(p) ((int)*(unsigned char *)(p))
-+#else
-+#define UCHARAT(p) ((int)*(p)&CHARBITS)
-+#endif
-+
-+#if 0
-+//void regerror(char * s)
-+//{
-+// printk("regexp(3): %s", s);
-+// /* NOTREACHED */
-+//}
-+#endif
-+
-+/*
-+ - regsub - perform substitutions after a regexp match
-+ */
-+void
-+regsub(regexp * prog, char * source, char * dest)
-+{
-+ register char *src;
-+ register char *dst;
-+ register char c;
-+ register int no;
-+ register int len;
-+
-+ /* Not necessary and gcc doesn't like it -MLS */
-+ /*extern char *strncpy();*/
-+
-+ if (prog == NULL || source == NULL || dest == NULL) {
-+ regerror("NULL parm to regsub");
-+ return;
-+ }
-+ if (UCHARAT(prog->program) != MAGIC) {
-+ regerror("damaged regexp fed to regsub");
-+ return;
-+ }
-+
-+ src = source;
-+ dst = dest;
-+ while ((c = *src++) != '\0') {
-+ if (c == '&')
-+ no = 0;
-+ else if (c == '\\' && '0' <= *src && *src <= '9')
-+ no = *src++ - '0';
-+ else
-+ no = -1;
-+
-+ if (no < 0) { /* Ordinary character. */
-+ if (c == '\\' && (*src == '\\' || *src == '&'))
-+ c = *src++;
-+ *dst++ = c;
-+ } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) {
-+ len = prog->endp[no] - prog->startp[no];
-+ (void) strncpy(dst, prog->startp[no], len);
-+ dst += len;
-+ if (len != 0 && *(dst-1) == '\0') { /* strncpy hit NUL. */
-+ regerror("damaged match string");
-+ return;
-+ }
-+ }
-+ }
-+ *dst++ = '\0';
-+}
---- /dev/null
-+++ b/net/netfilter/xt_layer7.c
-@@ -0,0 +1,666 @@
-+/*
-+ Kernel module to match application layer (OSI layer 7) data in connections.
-+
-+ http://l7-filter.sf.net
-+
-+ (C) 2003-2009 Matthew Strait and Ethan Sommer.
-+
-+ 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.
-+ http://www.gnu.org/licenses/gpl.txt
-+
-+ Based on ipt_string.c (C) 2000 Emmanuel Roger <winfield@freegates.be>,
-+ xt_helper.c (C) 2002 Harald Welte and cls_layer7.c (C) 2003 Matthew Strait,
-+ Ethan Sommer, Justin Levandoski.
-+*/
-+
-+#include <linux/spinlock.h>
-+#include <linux/version.h>
-+#include <net/ip.h>
-+#include <net/tcp.h>
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter.h>
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_core.h>
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
-+#include <net/netfilter/nf_conntrack_extend.h>
-+#include <net/netfilter/nf_conntrack_acct.h>
-+#endif
-+#include <linux/netfilter/x_tables.h>
-+#include <linux/netfilter/xt_layer7.h>
-+#include <linux/ctype.h>
-+#include <linux/proc_fs.h>
-+
-+#include "regexp/regexp.c"
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Matthew Strait <quadong@users.sf.net>, Ethan Sommer <sommere@users.sf.net>");
-+MODULE_DESCRIPTION("iptables application layer match module");
-+MODULE_ALIAS("ipt_layer7");
-+MODULE_VERSION("2.21");
-+
-+static int maxdatalen = 2048; // this is the default
-+module_param(maxdatalen, int, 0444);
-+MODULE_PARM_DESC(maxdatalen, "maximum bytes of data looked at by l7-filter");
-+#ifdef CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG
-+ #define DPRINTK(format,args...) printk(format,##args)
-+#else
-+ #define DPRINTK(format,args...)
-+#endif
-+
-+/* Number of packets whose data we look at.
-+This can be modified through /proc/net/layer7_numpackets */
-+static int num_packets = 10;
-+
-+static struct pattern_cache {
-+ char * regex_string;
-+ regexp * pattern;
-+ struct pattern_cache * next;
-+} * first_pattern_cache = NULL;
-+
-+DEFINE_SPINLOCK(l7_lock);
-+
-+static int total_acct_packets(struct nf_conn *ct)
-+{
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 26)
-+ BUG_ON(ct == NULL);
-+ return (ct->counters[IP_CT_DIR_ORIGINAL].packets + ct->counters[IP_CT_DIR_REPLY].packets);
-+#else
-+ struct nf_conn_counter *acct;
-+
-+ BUG_ON(ct == NULL);
-+ acct = nf_conn_acct_find(ct);
-+ if (!acct)
-+ return 0;
-+ return (acct[IP_CT_DIR_ORIGINAL].packets + acct[IP_CT_DIR_REPLY].packets);
-+#endif
-+}
-+
-+#ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
-+/* Converts an unfriendly string into a friendly one by
-+replacing unprintables with periods and all whitespace with " ". */
-+static char * friendly_print(unsigned char * s)
-+{
-+ char * f = kmalloc(strlen(s) + 1, GFP_ATOMIC);
-+ int i;
-+
-+ if(!f) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "friendly_print, bailing.\n");
-+ return NULL;
-+ }
-+
-+ for(i = 0; i < strlen(s); i++){
-+ if(isprint(s[i]) && s[i] < 128) f[i] = s[i];
-+ else if(isspace(s[i])) f[i] = ' ';
-+ else f[i] = '.';
-+ }
-+ f[i] = '\0';
-+ return f;
-+}
-+
-+static char dec2hex(int i)
-+{
-+ switch (i) {
-+ case 0 ... 9:
-+ return (i + '0');
-+ break;
-+ case 10 ... 15:
-+ return (i - 10 + 'a');
-+ break;
-+ default:
-+ if (net_ratelimit())
-+ printk("layer7: Problem in dec2hex\n");
-+ return '\0';
-+ }
-+}
-+
-+static char * hex_print(unsigned char * s)
-+{
-+ char * g = kmalloc(strlen(s)*3 + 1, GFP_ATOMIC);
-+ int i;
-+
-+ if(!g) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in hex_print, "
-+ "bailing.\n");
-+ return NULL;
-+ }
-+
-+ for(i = 0; i < strlen(s); i++) {
-+ g[i*3 ] = dec2hex(s[i]/16);
-+ g[i*3 + 1] = dec2hex(s[i]%16);
-+ g[i*3 + 2] = ' ';
-+ }
-+ g[i*3] = '\0';
-+
-+ return g;
-+}
-+#endif // DEBUG
-+
-+/* Use instead of regcomp. As we expect to be seeing the same regexps over and
-+over again, it make sense to cache the results. */
-+static regexp * compile_and_cache(const char * regex_string,
-+ const char * protocol)
-+{
-+ struct pattern_cache * node = first_pattern_cache;
-+ struct pattern_cache * last_pattern_cache = first_pattern_cache;
-+ struct pattern_cache * tmp;
-+ unsigned int len;
-+
-+ while (node != NULL) {
-+ if (!strcmp(node->regex_string, regex_string))
-+ return node->pattern;
-+
-+ last_pattern_cache = node;/* points at the last non-NULL node */
-+ node = node->next;
-+ }
-+
-+ /* If we reach the end of the list, then we have not yet cached
-+ the pattern for this regex. Let's do that now.
-+ Be paranoid about running out of memory to avoid list corruption. */
-+ tmp = kmalloc(sizeof(struct pattern_cache), GFP_ATOMIC);
-+
-+ if(!tmp) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "compile_and_cache, bailing.\n");
-+ return NULL;
-+ }
-+
-+ tmp->regex_string = kmalloc(strlen(regex_string) + 1, GFP_ATOMIC);
-+ tmp->pattern = kmalloc(sizeof(struct regexp), GFP_ATOMIC);
-+ tmp->next = NULL;
-+
-+ if(!tmp->regex_string || !tmp->pattern) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "compile_and_cache, bailing.\n");
-+ kfree(tmp->regex_string);
-+ kfree(tmp->pattern);
-+ kfree(tmp);
-+ return NULL;
-+ }
-+
-+ /* Ok. The new node is all ready now. */
-+ node = tmp;
-+
-+ if(first_pattern_cache == NULL) /* list is empty */
-+ first_pattern_cache = node; /* make node the beginning */
-+ else
-+ last_pattern_cache->next = node; /* attach node to the end */
-+
-+ /* copy the string and compile the regex */
-+ len = strlen(regex_string);
-+ DPRINTK("About to compile this: \"%s\"\n", regex_string);
-+ node->pattern = regcomp((char *)regex_string, &len);
-+ if ( !node->pattern ) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: Error compiling regexp "
-+ "\"%s\" (%s)\n",
-+ regex_string, protocol);
-+ /* pattern is now cached as NULL, so we won't try again. */
-+ }
-+
-+ strcpy(node->regex_string, regex_string);
-+ return node->pattern;
-+}
-+
-+static int can_handle(const struct sk_buff *skb)
-+{
-+ if(!ip_hdr(skb)) /* not IP */
-+ return 0;
-+ if(ip_hdr(skb)->protocol != IPPROTO_TCP &&
-+ ip_hdr(skb)->protocol != IPPROTO_UDP &&
-+ ip_hdr(skb)->protocol != IPPROTO_ICMP)
-+ return 0;
-+ return 1;
-+}
-+
-+/* Returns offset the into the skb->data that the application data starts */
-+static int app_data_offset(const struct sk_buff *skb)
-+{
-+ /* In case we are ported somewhere (ebtables?) where ip_hdr(skb)
-+ isn't set, this can be gotten from 4*(skb->data[0] & 0x0f) as well. */
-+ int ip_hl = 4*ip_hdr(skb)->ihl;
-+
-+ if( ip_hdr(skb)->protocol == IPPROTO_TCP ) {
-+ /* 12 == offset into TCP header for the header length field.
-+ Can't get this with skb->h.th->doff because the tcphdr
-+ struct doesn't get set when routing (this is confirmed to be
-+ true in Netfilter as well as QoS.) */
-+ int tcp_hl = 4*(skb->data[ip_hl + 12] >> 4);
-+
-+ return ip_hl + tcp_hl;
-+ } else if( ip_hdr(skb)->protocol == IPPROTO_UDP ) {
-+ return ip_hl + 8; /* UDP header is always 8 bytes */
-+ } else if( ip_hdr(skb)->protocol == IPPROTO_ICMP ) {
-+ return ip_hl + 8; /* ICMP header is 8 bytes */
-+ } else {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: tried to handle unknown "
-+ "protocol!\n");
-+ return ip_hl + 8; /* something reasonable */
-+ }
-+}
-+
-+/* handles whether there's a match when we aren't appending data anymore */
-+static int match_no_append(struct nf_conn * conntrack,
-+ struct nf_conn * master_conntrack,
-+ enum ip_conntrack_info ctinfo,
-+ enum ip_conntrack_info master_ctinfo,
-+ const struct xt_layer7_info * info)
-+{
-+ /* If we're in here, throw the app data away */
-+ if(master_conntrack->layer7.app_data != NULL) {
-+
-+ #ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
-+ if(!master_conntrack->layer7.app_proto) {
-+ char * f =
-+ friendly_print(master_conntrack->layer7.app_data);
-+ char * g =
-+ hex_print(master_conntrack->layer7.app_data);
-+ DPRINTK("\nl7-filter gave up after %d bytes "
-+ "(%d packets):\n%s\n",
-+ strlen(f), total_acct_packets(master_conntrack), f);
-+ kfree(f);
-+ DPRINTK("In hex: %s\n", g);
-+ kfree(g);
-+ }
-+ #endif
-+
-+ kfree(master_conntrack->layer7.app_data);
-+ master_conntrack->layer7.app_data = NULL; /* don't free again */
-+ }
-+
-+ if(master_conntrack->layer7.app_proto){
-+ /* Here child connections set their .app_proto (for /proc) */
-+ if(!conntrack->layer7.app_proto) {
-+ conntrack->layer7.app_proto =
-+ kmalloc(strlen(master_conntrack->layer7.app_proto)+1,
-+ GFP_ATOMIC);
-+ if(!conntrack->layer7.app_proto){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory "
-+ "in match_no_append, "
-+ "bailing.\n");
-+ return 1;
-+ }
-+ strcpy(conntrack->layer7.app_proto,
-+ master_conntrack->layer7.app_proto);
-+ }
-+
-+ return (!strcmp(master_conntrack->layer7.app_proto,
-+ info->protocol));
-+ }
-+ else {
-+ /* If not classified, set to "unknown" to distinguish from
-+ connections that are still being tested. */
-+ master_conntrack->layer7.app_proto =
-+ kmalloc(strlen("unknown")+1, GFP_ATOMIC);
-+ if(!master_conntrack->layer7.app_proto){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "match_no_append, bailing.\n");
-+ return 1;
-+ }
-+ strcpy(master_conntrack->layer7.app_proto, "unknown");
-+ return 0;
-+ }
-+}
-+
-+/* add the new app data to the conntrack. Return number of bytes added. */
-+static int add_data(struct nf_conn * master_conntrack,
-+ char * app_data, int appdatalen)
-+{
-+ int length = 0, i;
-+ int oldlength = master_conntrack->layer7.app_data_len;
-+
-+ /* This is a fix for a race condition by Deti Fliegl. However, I'm not
-+ clear on whether the race condition exists or whether this really
-+ fixes it. I might just be being dense... Anyway, if it's not really
-+ a fix, all it does is waste a very small amount of time. */
-+ if(!master_conntrack->layer7.app_data) return 0;
-+
-+ /* Strip nulls. Make everything lower case (our regex lib doesn't
-+ do case insensitivity). Add it to the end of the current data. */
-+ for(i = 0; i < maxdatalen-oldlength-1 &&
-+ i < appdatalen; i++) {
-+ if(app_data[i] != '\0') {
-+ /* the kernel version of tolower mungs 'upper ascii' */
-+ master_conntrack->layer7.app_data[length+oldlength] =
-+ isascii(app_data[i])?
-+ tolower(app_data[i]) : app_data[i];
-+ length++;
-+ }
-+ }
-+
-+ master_conntrack->layer7.app_data[length+oldlength] = '\0';
-+ master_conntrack->layer7.app_data_len = length + oldlength;
-+
-+ return length;
-+}
-+
-+/* taken from drivers/video/modedb.c */
-+static int my_atoi(const char *s)
-+{
-+ int val = 0;
-+
-+ for (;; s++) {
-+ switch (*s) {
-+ case '0'...'9':
-+ val = 10*val+(*s-'0');
-+ break;
-+ default:
-+ return val;
-+ }
-+ }
-+}
-+
-+/* write out num_packets to userland. */
-+static int layer7_read_proc(char* page, char ** start, off_t off, int count,
-+ int* eof, void * data)
-+{
-+ if(num_packets > 99 && net_ratelimit())
-+ printk(KERN_ERR "layer7: NOT REACHED. num_packets too big\n");
-+
-+ page[0] = num_packets/10 + '0';
-+ page[1] = num_packets%10 + '0';
-+ page[2] = '\n';
-+ page[3] = '\0';
-+
-+ *eof=1;
-+
-+ return 3;
-+}
-+
-+/* Read in num_packets from userland */
-+static int layer7_write_proc(struct file* file, const char* buffer,
-+ unsigned long count, void *data)
-+{
-+ char * foo = kmalloc(count, GFP_ATOMIC);
-+
-+ if(!foo){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory, bailing. "
-+ "num_packets unchanged.\n");
-+ return count;
-+ }
-+
-+ if(copy_from_user(foo, buffer, count)) {
-+ return -EFAULT;
-+ }
-+
-+
-+ num_packets = my_atoi(foo);
-+ kfree (foo);
-+
-+ /* This has an arbitrary limit to make the math easier. I'm lazy.
-+ But anyway, 99 is a LOT! If you want more, you're doing it wrong! */
-+ if(num_packets > 99) {
-+ printk(KERN_WARNING "layer7: num_packets can't be > 99.\n");
-+ num_packets = 99;
-+ } else if(num_packets < 1) {
-+ printk(KERN_WARNING "layer7: num_packets can't be < 1.\n");
-+ num_packets = 1;
-+ }
-+
-+ return count;
-+}
-+
-+static bool
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+match(const struct sk_buff *skbin, const struct xt_match_param *par)
-+#else
-+match(const struct sk_buff *skbin,
-+ const struct net_device *in,
-+ const struct net_device *out,
-+ const struct xt_match *match,
-+ const void *matchinfo,
-+ int offset,
-+ unsigned int protoff,
-+ bool *hotdrop)
-+#endif
-+{
-+ /* sidestep const without getting a compiler warning... */
-+ struct sk_buff * skb = (struct sk_buff *)skbin;
-+
-+ const struct xt_layer7_info * info =
-+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+ par->matchinfo;
-+ #else
-+ matchinfo;
-+ #endif
-+
-+ enum ip_conntrack_info master_ctinfo, ctinfo;
-+ struct nf_conn *master_conntrack, *conntrack;
-+ unsigned char * app_data;
-+ unsigned int pattern_result, appdatalen;
-+ regexp * comppattern;
-+
-+ /* Be paranoid/incompetent - lock the entire match function. */
-+ spin_lock_bh(&l7_lock);
-+
-+ if(!can_handle(skb)){
-+ DPRINTK("layer7: This is some protocol I can't handle.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+
-+ /* Treat parent & all its children together as one connection, except
-+ for the purpose of setting conntrack->layer7.app_proto in the actual
-+ connection. This makes /proc/net/ip_conntrack more satisfying. */
-+ if(!(conntrack = nf_ct_get(skb, &ctinfo)) ||
-+ !(master_conntrack=nf_ct_get(skb,&master_ctinfo))){
-+ DPRINTK("layer7: couldn't get conntrack.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+
-+ /* Try to get a master conntrack (and its master etc) for FTP, etc. */
-+ while (master_ct(master_conntrack) != NULL)
-+ master_conntrack = master_ct(master_conntrack);
-+
-+ /* if we've classified it or seen too many packets */
-+ if(total_acct_packets(master_conntrack) > num_packets ||
-+ master_conntrack->layer7.app_proto) {
-+
-+ pattern_result = match_no_append(conntrack, master_conntrack,
-+ ctinfo, master_ctinfo, info);
-+
-+ /* skb->cb[0] == seen. Don't do things twice if there are
-+ multiple l7 rules. I'm not sure that using cb for this purpose
-+ is correct, even though it says "put your private variables
-+ there". But it doesn't look like it is being used for anything
-+ else in the skbs that make it here. */
-+ skb->cb[0] = 1; /* marking it seen here's probably irrelevant */
-+
-+ spin_unlock_bh(&l7_lock);
-+ return (pattern_result ^ info->invert);
-+ }
-+
-+ if(skb_is_nonlinear(skb)){
-+ if(skb_linearize(skb) != 0){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: failed to linearize "
-+ "packet, bailing.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+ }
-+
-+ /* now that the skb is linearized, it's safe to set these. */
-+ app_data = skb->data + app_data_offset(skb);
-+ appdatalen = skb_tail_pointer(skb) - app_data;
-+
-+ /* the return value gets checked later, when we're ready to use it */
-+ comppattern = compile_and_cache(info->pattern, info->protocol);
-+
-+ /* On the first packet of a connection, allocate space for app data */
-+ if(total_acct_packets(master_conntrack) == 1 && !skb->cb[0] &&
-+ !master_conntrack->layer7.app_data){
-+ master_conntrack->layer7.app_data =
-+ kmalloc(maxdatalen, GFP_ATOMIC);
-+ if(!master_conntrack->layer7.app_data){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "match, bailing.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+
-+ master_conntrack->layer7.app_data[0] = '\0';
-+ }
-+
-+ /* Can be here, but unallocated, if numpackets is increased near
-+ the beginning of a connection */
-+ if(master_conntrack->layer7.app_data == NULL){
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert; /* unmatched */
-+ }
-+
-+ if(!skb->cb[0]){
-+ int newbytes;
-+ newbytes = add_data(master_conntrack, app_data, appdatalen);
-+
-+ if(newbytes == 0) { /* didn't add any data */
-+ skb->cb[0] = 1;
-+ /* Didn't match before, not going to match now */
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+ }
-+
-+ /* If looking for "unknown", then never match. "Unknown" means that
-+ we've given up; we're still trying with these packets. */
-+ if(!strcmp(info->protocol, "unknown")) {
-+ pattern_result = 0;
-+ /* If looking for "unset", then always match. "Unset" means that we
-+ haven't yet classified the connection. */
-+ } else if(!strcmp(info->protocol, "unset")) {
-+ pattern_result = 2;
-+ DPRINTK("layer7: matched unset: not yet classified "
-+ "(%d/%d packets)\n",
-+ total_acct_packets(master_conntrack), num_packets);
-+ /* If the regexp failed to compile, don't bother running it */
-+ } else if(comppattern &&
-+ regexec(comppattern, master_conntrack->layer7.app_data)){
-+ DPRINTK("layer7: matched %s\n", info->protocol);
-+ pattern_result = 1;
-+ } else pattern_result = 0;
-+
-+ if(pattern_result == 1) {
-+ master_conntrack->layer7.app_proto =
-+ kmalloc(strlen(info->protocol)+1, GFP_ATOMIC);
-+ if(!master_conntrack->layer7.app_proto){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "match, bailing.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return (pattern_result ^ info->invert);
-+ }
-+ strcpy(master_conntrack->layer7.app_proto, info->protocol);
-+ } else if(pattern_result > 1) { /* cleanup from "unset" */
-+ pattern_result = 1;
-+ }
-+
-+ /* mark the packet seen */
-+ skb->cb[0] = 1;
-+
-+ spin_unlock_bh(&l7_lock);
-+ return (pattern_result ^ info->invert);
-+}
-+
-+// load nf_conntrack_ipv4
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+static bool check(const struct xt_mtchk_param *par)
-+{
-+ if (nf_ct_l3proto_try_module_get(par->match->family) < 0) {
-+ printk(KERN_WARNING "can't load conntrack support for "
-+ "proto=%d\n", par->match->family);
-+#else
-+static bool check(const char *tablename, const void *inf,
-+ const struct xt_match *match, void *matchinfo,
-+ unsigned int hook_mask)
-+{
-+ if (nf_ct_l3proto_try_module_get(match->family) < 0) {
-+ printk(KERN_WARNING "can't load conntrack support for "
-+ "proto=%d\n", match->family);
-+#endif
-+ return 0;
-+ }
-+ return 1;
-+}
-+
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+ static void destroy(const struct xt_mtdtor_param *par)
-+ {
-+ nf_ct_l3proto_module_put(par->match->family);
-+ }
-+#else
-+ static void destroy(const struct xt_match *match, void *matchinfo)
-+ {
-+ nf_ct_l3proto_module_put(match->family);
-+ }
-+#endif
-+
-+static struct xt_match xt_layer7_match[] __read_mostly = {
-+{
-+ .name = "layer7",
-+ .family = AF_INET,
-+ .checkentry = check,
-+ .match = match,
-+ .destroy = destroy,
-+ .matchsize = sizeof(struct xt_layer7_info),
-+ .me = THIS_MODULE
-+}
-+};
-+
-+static void layer7_cleanup_proc(void)
-+{
-+ remove_proc_entry("layer7_numpackets", init_net.proc_net);
-+}
-+
-+/* register the proc file */
-+static void layer7_init_proc(void)
-+{
-+ struct proc_dir_entry* entry;
-+ entry = create_proc_entry("layer7_numpackets", 0644, init_net.proc_net);
-+ entry->read_proc = layer7_read_proc;
-+ entry->write_proc = layer7_write_proc;
-+}
-+
-+static int __init xt_layer7_init(void)
-+{
-+ need_conntrack();
-+
-+ layer7_init_proc();
-+ if(maxdatalen < 1) {
-+ printk(KERN_WARNING "layer7: maxdatalen can't be < 1, "
-+ "using 1\n");
-+ maxdatalen = 1;
-+ }
-+ /* This is not a hard limit. It's just here to prevent people from
-+ bringing their slow machines to a grinding halt. */
-+ else if(maxdatalen > 65536) {
-+ printk(KERN_WARNING "layer7: maxdatalen can't be > 65536, "
-+ "using 65536\n");
-+ maxdatalen = 65536;
-+ }
-+ return xt_register_matches(xt_layer7_match,
-+ ARRAY_SIZE(xt_layer7_match));
-+}
-+
-+static void __exit xt_layer7_fini(void)
-+{
-+ layer7_cleanup_proc();
-+ xt_unregister_matches(xt_layer7_match, ARRAY_SIZE(xt_layer7_match));
-+}
-+
-+module_init(xt_layer7_init);
-+module_exit(xt_layer7_fini);
+++ /dev/null
---- a/include/linux/netfilter/xt_layer7.h
-+++ b/include/linux/netfilter/xt_layer7.h
-@@ -8,6 +8,7 @@ struct xt_layer7_info {
- char protocol[MAX_PROTOCOL_LEN];
- char pattern[MAX_PATTERN_LEN];
- u_int8_t invert;
-+ u_int8_t pkt;
- };
-
- #endif /* _XT_LAYER7_H */
---- a/net/netfilter/xt_layer7.c
-+++ b/net/netfilter/xt_layer7.c
-@@ -314,34 +314,36 @@ static int match_no_append(struct nf_con
- }
-
- /* add the new app data to the conntrack. Return number of bytes added. */
--static int add_data(struct nf_conn * master_conntrack,
-- char * app_data, int appdatalen)
-+static int add_datastr(char *target, int offset, char *app_data, int len)
- {
- int length = 0, i;
-- int oldlength = master_conntrack->layer7.app_data_len;
--
-- /* This is a fix for a race condition by Deti Fliegl. However, I'm not
-- clear on whether the race condition exists or whether this really
-- fixes it. I might just be being dense... Anyway, if it's not really
-- a fix, all it does is waste a very small amount of time. */
-- if(!master_conntrack->layer7.app_data) return 0;
-+
-+ if (!target) return 0;
-
- /* Strip nulls. Make everything lower case (our regex lib doesn't
- do case insensitivity). Add it to the end of the current data. */
-- for(i = 0; i < maxdatalen-oldlength-1 &&
-- i < appdatalen; i++) {
-+ for(i = 0; i < maxdatalen-offset-1 && i < len; i++) {
- if(app_data[i] != '\0') {
- /* the kernel version of tolower mungs 'upper ascii' */
-- master_conntrack->layer7.app_data[length+oldlength] =
-+ target[length+offset] =
- isascii(app_data[i])?
- tolower(app_data[i]) : app_data[i];
- length++;
- }
- }
-+ target[length+offset] = '\0';
-+
-+ return length;
-+}
-
-- master_conntrack->layer7.app_data[length+oldlength] = '\0';
-- master_conntrack->layer7.app_data_len = length + oldlength;
-+/* add the new app data to the conntrack. Return number of bytes added. */
-+static int add_data(struct nf_conn * master_conntrack,
-+ char * app_data, int appdatalen)
-+{
-+ int length;
-
-+ length = add_datastr(master_conntrack->layer7.app_data, master_conntrack->layer7.app_data_len, app_data, appdatalen);
-+ master_conntrack->layer7.app_data_len += length;
- return length;
- }
-
-@@ -438,7 +440,7 @@ match(const struct sk_buff *skbin,
-
- enum ip_conntrack_info master_ctinfo, ctinfo;
- struct nf_conn *master_conntrack, *conntrack;
-- unsigned char * app_data;
-+ unsigned char *app_data, *tmp_data;
- unsigned int pattern_result, appdatalen;
- regexp * comppattern;
-
-@@ -466,9 +468,8 @@ match(const struct sk_buff *skbin,
- master_conntrack = master_ct(master_conntrack);
-
- /* if we've classified it or seen too many packets */
-- if(total_acct_packets(master_conntrack) > num_packets ||
-- master_conntrack->layer7.app_proto) {
--
-+ if(!info->pkt && (total_acct_packets(master_conntrack) > num_packets ||
-+ master_conntrack->layer7.app_proto)) {
- pattern_result = match_no_append(conntrack, master_conntrack,
- ctinfo, master_ctinfo, info);
-
-@@ -500,6 +501,25 @@ match(const struct sk_buff *skbin,
- /* the return value gets checked later, when we're ready to use it */
- comppattern = compile_and_cache(info->pattern, info->protocol);
-
-+ if (info->pkt) {
-+ tmp_data = kmalloc(maxdatalen, GFP_ATOMIC);
-+ if(!tmp_data){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in match, bailing.\n");
-+ return info->invert;
-+ }
-+
-+ tmp_data[0] = '\0';
-+ add_datastr(tmp_data, 0, app_data, appdatalen);
-+ pattern_result = ((comppattern && regexec(comppattern, tmp_data)) ? 1 : 0);
-+
-+ kfree(tmp_data);
-+ tmp_data = NULL;
-+ spin_unlock_bh(&l7_lock);
-+
-+ return (pattern_result ^ info->invert);
-+ }
-+
- /* On the first packet of a connection, allocate space for app data */
- if(total_acct_packets(master_conntrack) == 1 && !skb->cb[0] &&
- !master_conntrack->layer7.app_data){
+++ /dev/null
-commit c8942f1f0a7e2160ebf2e51ba89e50ee5895a1e7
-Author: Patrick McHardy <kaber@trash.net>
-Date: Wed May 21 14:08:38 2008 -0700
-
- netfilter: Move linux/types.h inclusions outside of #ifdef __KERNEL__
-
- Greg Steuck <greg@nest.cx> points out that some of the netfilter
- headers can't be used in userspace without including linux/types.h
- first. The headers include their own linux/types.h include statements,
- these are stripped by make headers-install because they are inside
- #ifdef __KERNEL__ however. Move them out to fix this.
-
- Reported and Tested by Greg Steuck.
-
- Signed-off-by: Patrick McHardy <kaber@trash.net>
- Signed-off-by: David S. Miller <davem@davemloft.net>
-
---- a/include/linux/netfilter.h
-+++ b/include/linux/netfilter.h
-@@ -3,7 +3,6 @@
-
- #ifdef __KERNEL__
- #include <linux/init.h>
--#include <linux/types.h>
- #include <linux/skbuff.h>
- #include <linux/net.h>
- #include <linux/if.h>
-@@ -12,6 +11,7 @@
- #include <linux/wait.h>
- #include <linux/list.h>
- #endif
-+#include <linux/types.h>
- #include <linux/compiler.h>
-
- /* Responses from hook functions. */
---- a/include/linux/netfilter_arp/arp_tables.h
-+++ b/include/linux/netfilter_arp/arp_tables.h
-@@ -11,11 +11,11 @@
-
- #ifdef __KERNEL__
- #include <linux/if.h>
--#include <linux/types.h>
- #include <linux/in.h>
- #include <linux/if_arp.h>
- #include <linux/skbuff.h>
- #endif
-+#include <linux/types.h>
- #include <linux/compiler.h>
- #include <linux/netfilter_arp.h>
-
---- a/include/linux/netfilter_ipv4/ip_tables.h
-+++ b/include/linux/netfilter_ipv4/ip_tables.h
-@@ -17,11 +17,11 @@
-
- #ifdef __KERNEL__
- #include <linux/if.h>
--#include <linux/types.h>
- #include <linux/in.h>
- #include <linux/ip.h>
- #include <linux/skbuff.h>
- #endif
-+#include <linux/types.h>
- #include <linux/compiler.h>
- #include <linux/netfilter_ipv4.h>
-
---- a/include/linux/netfilter_ipv6/ip6_tables.h
-+++ b/include/linux/netfilter_ipv6/ip6_tables.h
-@@ -17,11 +17,11 @@
-
- #ifdef __KERNEL__
- #include <linux/if.h>
--#include <linux/types.h>
- #include <linux/in6.h>
- #include <linux/ipv6.h>
- #include <linux/skbuff.h>
- #endif
-+#include <linux/types.h>
- #include <linux/compiler.h>
- #include <linux/netfilter_ipv6.h>
-
+++ /dev/null
---- /dev/null
-+++ b/drivers/net/imq.c
-@@ -0,0 +1,474 @@
-+/*
-+ * Pseudo-driver for the intermediate queue device.
-+ *
-+ * 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.
-+ *
-+ * Authors: Patrick McHardy, <kaber@trash.net>
-+ *
-+ * The first version was written by Martin Devera, <devik@cdi.cz>
-+ *
-+ * Credits: Jan Rafaj <imq2t@cedric.vabo.cz>
-+ * - Update patch to 2.4.21
-+ * Sebastian Strollo <sstrollo@nortelnetworks.com>
-+ * - Fix "Dead-loop on netdevice imq"-issue
-+ * Marcel Sebek <sebek64@post.cz>
-+ * - Update to 2.6.2-rc1
-+ *
-+ * After some time of inactivity there is a group taking care
-+ * of IMQ again: http://www.linuximq.net
-+ *
-+ *
-+ * 2004/06/30 - New version of IMQ patch to kernels <=2.6.7
-+ * including the following changes:
-+ *
-+ * - Correction of ipv6 support "+"s issue (Hasso Tepper)
-+ * - Correction of imq_init_devs() issue that resulted in
-+ * kernel OOPS unloading IMQ as module (Norbert Buchmuller)
-+ * - Addition of functionality to choose number of IMQ devices
-+ * during kernel config (Andre Correa)
-+ * - Addition of functionality to choose how IMQ hooks on
-+ * PRE and POSTROUTING (after or before NAT) (Andre Correa)
-+ * - Cosmetic corrections (Norbert Buchmuller) (Andre Correa)
-+ *
-+ *
-+ * 2005/12/16 - IMQ versions between 2.6.7 and 2.6.13 were
-+ * released with almost no problems. 2.6.14-x was released
-+ * with some important changes: nfcache was removed; After
-+ * some weeks of trouble we figured out that some IMQ fields
-+ * in skb were missing in skbuff.c - skb_clone and copy_skb_header.
-+ * These functions are correctly patched by this new patch version.
-+ *
-+ * Thanks for all who helped to figure out all the problems with
-+ * 2.6.14.x: Patrick McHardy, Rune Kock, VeNoMouS, Max CtRiX,
-+ * Kevin Shanahan, Richard Lucassen, Valery Dachev (hopefully
-+ * I didn't forget anybody). I apologize again for my lack of time.
-+ *
-+ *
-+ * 2008/06/17 - 2.6.25 - Changed imq.c to use qdisc_run() instead
-+ * of qdisc_restart() and moved qdisc_run() to tasklet to avoid
-+ * recursive locking. New initialization routines to fix 'rmmod' not
-+ * working anymore. Used code from ifb.c. (Jussi Kivilinna)
-+ *
-+ * Also, many thanks to pablo Sebastian Greco for making the initial
-+ * patch and to those who helped the testing.
-+ *
-+ * More info at: http://www.linuximq.net/ (Andre Correa)
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/moduleparam.h>
-+#include <linux/skbuff.h>
-+#include <linux/netdevice.h>
-+#include <linux/rtnetlink.h>
-+#include <linux/if_arp.h>
-+#include <linux/netfilter.h>
-+#include <linux/netfilter_ipv4.h>
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ #include <linux/netfilter_ipv6.h>
-+#endif
-+#include <linux/imq.h>
-+#include <net/pkt_sched.h>
-+#include <net/netfilter/nf_queue.h>
-+
-+struct imq_private {
-+ struct tasklet_struct tasklet;
-+ unsigned long tasklet_pending;
-+};
-+
-+static nf_hookfn imq_nf_hook;
-+
-+static struct nf_hook_ops imq_ingress_ipv4 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET,
-+ .hooknum = NF_INET_PRE_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ .priority = NF_IP_PRI_MANGLE + 1
-+#else
-+ .priority = NF_IP_PRI_NAT_DST + 1
-+#endif
-+};
-+
-+static struct nf_hook_ops imq_egress_ipv4 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET,
-+ .hooknum = NF_INET_POST_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_AA) || defined(CONFIG_IMQ_BEHAVIOR_BA)
-+ .priority = NF_IP_PRI_LAST
-+#else
-+ .priority = NF_IP_PRI_NAT_SRC - 1
-+#endif
-+};
-+
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+static struct nf_hook_ops imq_ingress_ipv6 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET6,
-+ .hooknum = NF_INET_PRE_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ .priority = NF_IP6_PRI_MANGLE + 1
-+#else
-+ .priority = NF_IP6_PRI_NAT_DST + 1
-+#endif
-+};
-+
-+static struct nf_hook_ops imq_egress_ipv6 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET6,
-+ .hooknum = NF_INET_POST_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_AA) || defined(CONFIG_IMQ_BEHAVIOR_BA)
-+ .priority = NF_IP6_PRI_LAST
-+#else
-+ .priority = NF_IP6_PRI_NAT_SRC - 1
-+#endif
-+};
-+#endif
-+
-+#if defined(CONFIG_IMQ_NUM_DEVS)
-+static unsigned int numdevs = CONFIG_IMQ_NUM_DEVS;
-+#else
-+static unsigned int numdevs = IMQ_MAX_DEVS;
-+#endif
-+
-+static struct net_device *imq_devs_cache[IMQ_MAX_DEVS];
-+
-+static struct net_device_stats *imq_get_stats(struct net_device *dev)
-+{
-+ return &dev->stats;
-+}
-+
-+/* called for packets kfree'd in qdiscs at places other than enqueue */
-+static void imq_skb_destructor(struct sk_buff *skb)
-+{
-+ struct nf_queue_entry *entry = skb->nf_queue_entry;
-+
-+ if (entry) {
-+ if (entry->indev)
-+ dev_put(entry->indev);
-+ if (entry->outdev)
-+ dev_put(entry->outdev);
-+ kfree(entry);
-+ }
-+}
-+
-+static int imq_dev_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+ dev->stats.tx_bytes += skb->len;
-+ dev->stats.tx_packets++;
-+
-+ skb->imq_flags = 0;
-+ skb->destructor = NULL;
-+
-+ dev->trans_start = jiffies;
-+ nf_reinject(skb->nf_queue_entry, NF_ACCEPT);
-+ return 0;
-+}
-+
-+static int imq_nf_queue(struct nf_queue_entry *entry, unsigned queue_num)
-+{
-+ struct net_device *dev;
-+ struct imq_private *priv;
-+ struct sk_buff *skb2 = NULL;
-+ struct Qdisc *q;
-+ unsigned int index = entry->skb->imq_flags & IMQ_F_IFMASK;
-+ int ret = -1;
-+
-+ if (index > numdevs)
-+ return -1;
-+
-+ /* check for imq device by index from cache */
-+ dev = imq_devs_cache[index];
-+ if (!dev) {
-+ char buf[8];
-+
-+ /* get device by name and cache result */
-+ snprintf(buf, sizeof(buf), "imq%d", index);
-+ dev = dev_get_by_name(&init_net, buf);
-+ if (!dev) {
-+ /* not found ?!*/
-+ BUG();
-+ return -1;
-+ }
-+
-+ imq_devs_cache[index] = dev;
-+ }
-+
-+ priv = netdev_priv(dev);
-+ if (!(dev->flags & IFF_UP)) {
-+ entry->skb->imq_flags = 0;
-+ nf_reinject(entry, NF_ACCEPT);
-+ return 0;
-+ }
-+ dev->last_rx = jiffies;
-+
-+ if (entry->skb->destructor) {
-+ skb2 = entry->skb;
-+ entry->skb = skb_clone(entry->skb, GFP_ATOMIC);
-+ if (!entry->skb)
-+ return -1;
-+ }
-+ entry->skb->nf_queue_entry = entry;
-+
-+ dev->stats.rx_bytes += entry->skb->len;
-+ dev->stats.rx_packets++;
-+
-+ spin_lock_bh(&dev->queue_lock);
-+ q = dev->qdisc;
-+ if (q->enqueue) {
-+ q->enqueue(skb_get(entry->skb), q);
-+ if (skb_shared(entry->skb)) {
-+ entry->skb->destructor = imq_skb_destructor;
-+ kfree_skb(entry->skb);
-+ ret = 0;
-+ }
-+ }
-+ if (!test_and_set_bit(1, &priv->tasklet_pending))
-+ tasklet_schedule(&priv->tasklet);
-+ spin_unlock_bh(&dev->queue_lock);
-+
-+ if (skb2)
-+ kfree_skb(ret ? entry->skb : skb2);
-+
-+ return ret;
-+}
-+
-+static struct nf_queue_handler nfqh = {
-+ .name = "imq",
-+ .outfn = imq_nf_queue,
-+};
-+
-+static void qdisc_run_tasklet(unsigned long arg)
-+{
-+ struct net_device *dev = (struct net_device *)arg;
-+ struct imq_private *priv = netdev_priv(dev);
-+
-+ spin_lock(&dev->queue_lock);
-+ qdisc_run(dev);
-+ clear_bit(1, &priv->tasklet_pending);
-+ spin_unlock(&dev->queue_lock);
-+}
-+
-+static unsigned int imq_nf_hook(unsigned int hook, struct sk_buff *pskb,
-+ const struct net_device *indev,
-+ const struct net_device *outdev,
-+ int (*okfn)(struct sk_buff *))
-+{
-+ if (pskb->imq_flags & IMQ_F_ENQUEUE)
-+ return NF_QUEUE;
-+
-+ return NF_ACCEPT;
-+}
-+
-+static int imq_close(struct net_device *dev)
-+{
-+ struct imq_private *priv = netdev_priv(dev);
-+
-+ tasklet_kill(&priv->tasklet);
-+ netif_stop_queue(dev);
-+
-+ return 0;
-+}
-+
-+static int imq_open(struct net_device *dev)
-+{
-+ struct imq_private *priv = netdev_priv(dev);
-+
-+ tasklet_init(&priv->tasklet, qdisc_run_tasklet, (unsigned long)dev);
-+ netif_start_queue(dev);
-+
-+ return 0;
-+}
-+
-+static void imq_setup(struct net_device *dev)
-+{
-+ dev->hard_start_xmit = imq_dev_xmit;
-+ dev->open = imq_open;
-+ dev->get_stats = imq_get_stats;
-+ dev->stop = imq_close;
-+ dev->type = ARPHRD_VOID;
-+ dev->mtu = 16000;
-+ dev->tx_queue_len = 11000;
-+ dev->flags = IFF_NOARP;
-+}
-+
-+static struct rtnl_link_ops imq_link_ops __read_mostly = {
-+ .kind = "imq",
-+ .priv_size = sizeof(struct imq_private),
-+ .setup = imq_setup,
-+};
-+
-+static int __init imq_init_hooks(void)
-+{
-+ int err;
-+
-+ err = nf_register_queue_handler(PF_INET, &nfqh);
-+ if (err)
-+ goto err1;
-+
-+ err = nf_register_hook(&imq_ingress_ipv4);
-+ if (err)
-+ goto err2;
-+
-+ err = nf_register_hook(&imq_egress_ipv4);
-+ if (err)
-+ goto err3;
-+
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ err = nf_register_queue_handler(PF_INET6, &nfqh);
-+ if (err)
-+ goto err4;
-+
-+ err = nf_register_hook(&imq_ingress_ipv6);
-+ if (err)
-+ goto err5;
-+
-+ err = nf_register_hook(&imq_egress_ipv6);
-+ if (err)
-+ goto err6;
-+#endif
-+
-+ return 0;
-+
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+err6:
-+ nf_unregister_hook(&imq_ingress_ipv6);
-+err5:
-+ nf_unregister_queue_handler(PF_INET6, &nfqh);
-+err4:
-+ nf_unregister_hook(&imq_egress_ipv4);
-+#endif
-+err3:
-+ nf_unregister_hook(&imq_ingress_ipv4);
-+err2:
-+ nf_unregister_queue_handler(PF_INET, &nfqh);
-+err1:
-+ return err;
-+}
-+
-+static int __init imq_init_one(int index)
-+{
-+ struct net_device *dev;
-+ int ret;
-+
-+ dev = alloc_netdev(sizeof(struct imq_private), "imq%d", imq_setup);
-+ if (!dev)
-+ return -ENOMEM;
-+
-+ ret = dev_alloc_name(dev, dev->name);
-+ if (ret < 0)
-+ goto fail;
-+
-+ dev->rtnl_link_ops = &imq_link_ops;
-+ ret = register_netdevice(dev);
-+ if (ret < 0)
-+ goto fail;
-+
-+ return 0;
-+fail:
-+ free_netdev(dev);
-+ return ret;
-+}
-+
-+static int __init imq_init_devs(void)
-+{
-+ int err, i;
-+
-+ if (!numdevs || numdevs > IMQ_MAX_DEVS) {
-+ printk(KERN_ERR "IMQ: numdevs has to be betweed 1 and %u\n",
-+ IMQ_MAX_DEVS);
-+ return -EINVAL;
-+ }
-+
-+ rtnl_lock();
-+ err = __rtnl_link_register(&imq_link_ops);
-+
-+ for (i = 0; i < numdevs && !err; i++)
-+ err = imq_init_one(i);
-+
-+ if (err) {
-+ __rtnl_link_unregister(&imq_link_ops);
-+ memset(imq_devs_cache, 0, sizeof(imq_devs_cache));
-+ }
-+ rtnl_unlock();
-+
-+ return err;
-+}
-+
-+static int __init imq_init_module(void)
-+{
-+ int err;
-+
-+ err = imq_init_devs();
-+ if (err) {
-+ printk(KERN_ERR "IMQ: Error trying imq_init_devs(net)\n");
-+ return err;
-+ }
-+
-+ err = imq_init_hooks();
-+ if (err) {
-+ printk(KERN_ERR "IMQ: Error trying imq_init_hooks()\n");
-+ rtnl_link_unregister(&imq_link_ops);
-+ memset(imq_devs_cache, 0, sizeof(imq_devs_cache));
-+ return err;
-+ }
-+
-+ printk(KERN_INFO "IMQ driver loaded successfully.\n");
-+
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ printk(KERN_INFO "\tHooking IMQ before NAT on PREROUTING.\n");
-+#else
-+ printk(KERN_INFO "\tHooking IMQ after NAT on PREROUTING.\n");
-+#endif
-+#if defined(CONFIG_IMQ_BEHAVIOR_AB) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ printk(KERN_INFO "\tHooking IMQ before NAT on POSTROUTING.\n");
-+#else
-+ printk(KERN_INFO "\tHooking IMQ after NAT on POSTROUTING.\n");
-+#endif
-+
-+ return 0;
-+}
-+
-+static void __exit imq_unhook(void)
-+{
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ nf_unregister_hook(&imq_ingress_ipv6);
-+ nf_unregister_hook(&imq_egress_ipv6);
-+ nf_unregister_queue_handler(PF_INET6, &nfqh);
-+#endif
-+ nf_unregister_hook(&imq_ingress_ipv4);
-+ nf_unregister_hook(&imq_egress_ipv4);
-+ nf_unregister_queue_handler(PF_INET, &nfqh);
-+}
-+
-+static void __exit imq_cleanup_devs(void)
-+{
-+ rtnl_link_unregister(&imq_link_ops);
-+ memset(imq_devs_cache, 0, sizeof(imq_devs_cache));
-+}
-+
-+static void __exit imq_exit_module(void)
-+{
-+ imq_unhook();
-+ imq_cleanup_devs();
-+ printk(KERN_INFO "IMQ driver unloaded successfully.\n");
-+}
-+
-+module_init(imq_init_module);
-+module_exit(imq_exit_module);
-+
-+module_param(numdevs, int, 0);
-+MODULE_PARM_DESC(numdevs, "number of IMQ devices (how many imq* devices will "
-+ "be created)");
-+MODULE_AUTHOR("http://www.linuximq.net");
-+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See "
-+ "http://www.linuximq.net/ for more information.");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS_RTNL_LINK("imq");
-+
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -117,6 +117,129 @@ config EQUALIZER
- To compile this driver as a module, choose M here: the module
- will be called eql. If unsure, say N.
-
-+config IMQ
-+ tristate "IMQ (intermediate queueing device) support"
-+ depends on NETDEVICES && NETFILTER
-+ ---help---
-+ The IMQ device(s) is used as placeholder for QoS queueing
-+ disciplines. Every packet entering/leaving the IP stack can be
-+ directed through the IMQ device where it's enqueued/dequeued to the
-+ attached qdisc. This allows you to treat network devices as classes
-+ and distribute bandwidth among them. Iptables is used to specify
-+ through which IMQ device, if any, packets travel.
-+
-+ More information at: http://www.linuximq.net/
-+
-+ To compile this driver as a module, choose M here: the module
-+ will be called imq. If unsure, say N.
-+
-+choice
-+ prompt "IMQ behavior (PRE/POSTROUTING)"
-+ depends on IMQ
-+ default IMQ_BEHAVIOR_AB
-+ help
-+
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ IMQ can work in any of the following ways:
-+
-+ PREROUTING | POSTROUTING
-+ -----------------|-------------------
-+ #1 After NAT | After NAT
-+ #2 After NAT | Before NAT
-+ #3 Before NAT | After NAT
-+ #4 Before NAT | Before NAT
-+
-+ The default behavior is to hook before NAT on PREROUTING
-+ and after NAT on POSTROUTING (#3).
-+
-+ This settings are specially usefull when trying to use IMQ
-+ to shape NATed clients.
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_AA
-+ bool "IMQ AA"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: After NAT
-+ POSTROUTING: After NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_AB
-+ bool "IMQ AB"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: After NAT
-+ POSTROUTING: Before NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_BA
-+ bool "IMQ BA"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: Before NAT
-+ POSTROUTING: After NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_BB
-+ bool "IMQ BB"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: Before NAT
-+ POSTROUTING: Before NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+endchoice
-+
-+config IMQ_NUM_DEVS
-+
-+ int "Number of IMQ devices"
-+ range 2 16
-+ depends on IMQ
-+ default "16"
-+ help
-+
-+ This settings defines how many IMQ devices will be
-+ created.
-+
-+ The default value is 16.
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
- config TUN
- tristate "Universal TUN/TAP device driver support"
- select CRC32
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -143,6 +143,7 @@ obj-$(CONFIG_SLHC) += slhc.o
- obj-$(CONFIG_XEN_NETDEV_FRONTEND) += xen-netfront.o
-
- obj-$(CONFIG_DUMMY) += dummy.o
-+obj-$(CONFIG_IMQ) += imq.o
- obj-$(CONFIG_IFB) += ifb.o
- obj-$(CONFIG_MACVLAN) += macvlan.o
- obj-$(CONFIG_DE600) += de600.o
---- /dev/null
-+++ b/include/linux/imq.h
-@@ -0,0 +1,9 @@
-+#ifndef _IMQ_H
-+#define _IMQ_H
-+
-+#define IMQ_MAX_DEVS 16
-+
-+#define IMQ_F_IFMASK 0x7f
-+#define IMQ_F_ENQUEUE 0x80
-+
-+#endif /* _IMQ_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ipt_IMQ.h
-@@ -0,0 +1,8 @@
-+#ifndef _IPT_IMQ_H
-+#define _IPT_IMQ_H
-+
-+struct ipt_imq_info {
-+ unsigned int todev; /* target imq device */
-+};
-+
-+#endif /* _IPT_IMQ_H */
---- /dev/null
-+++ b/include/linux/netfilter_ipv6/ip6t_IMQ.h
-@@ -0,0 +1,8 @@
-+#ifndef _IP6T_IMQ_H
-+#define _IP6T_IMQ_H
-+
-+struct ip6t_imq_info {
-+ unsigned int todev; /* target imq device */
-+};
-+
-+#endif /* _IP6T_IMQ_H */
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -296,6 +296,10 @@ struct sk_buff {
- struct nf_conntrack *nfct;
- struct sk_buff *nfct_reasm;
- #endif
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ unsigned char imq_flags;
-+ struct nf_queue_entry *nf_queue_entry;
-+#endif
- #ifdef CONFIG_BRIDGE_NETFILTER
- struct nf_bridge_info *nf_bridge;
- #endif
-@@ -1736,6 +1740,10 @@ static inline void __nf_copy(struct sk_b
- dst->nfct_reasm = src->nfct_reasm;
- nf_conntrack_get_reasm(src->nfct_reasm);
- #endif
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ dst->imq_flags = src->imq_flags;
-+ dst->nf_queue_entry = src->nf_queue_entry;
-+#endif
- #ifdef CONFIG_BRIDGE_NETFILTER
- dst->nf_bridge = src->nf_bridge;
- nf_bridge_get(src->nf_bridge);
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -95,6 +95,9 @@
- #include <net/net_namespace.h>
- #include <net/sock.h>
- #include <linux/rtnetlink.h>
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+#include <linux/imq.h>
-+#endif
- #include <linux/proc_fs.h>
- #include <linux/seq_file.h>
- #include <linux/stat.h>
-@@ -1537,7 +1540,11 @@ static int dev_gso_segment(struct sk_buf
- int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
- {
- if (likely(!skb->next)) {
-- if (!list_empty(&ptype_all))
-+ if (!list_empty(&ptype_all)
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ && !(skb->imq_flags & IMQ_F_ENQUEUE)
-+#endif
-+ )
- dev_queue_xmit_nit(skb, dev);
-
- if (netif_needs_gso(dev, skb)) {
---- /dev/null
-+++ b/net/ipv4/netfilter/ipt_IMQ.c
-@@ -0,0 +1,69 @@
-+/*
-+ * This target marks packets to be enqueued to an imq device
-+ */
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter_ipv4/ip_tables.h>
-+#include <linux/netfilter_ipv4/ipt_IMQ.h>
-+#include <linux/imq.h>
-+
-+static unsigned int imq_target(struct sk_buff *pskb,
-+ const struct net_device *in,
-+ const struct net_device *out,
-+ unsigned int hooknum,
-+ const struct xt_target *target,
-+ const void *targinfo)
-+{
-+ struct ipt_imq_info *mr = (struct ipt_imq_info *)targinfo;
-+
-+ pskb->imq_flags = mr->todev | IMQ_F_ENQUEUE;
-+
-+ return XT_CONTINUE;
-+}
-+
-+static bool imq_checkentry(const char *tablename,
-+ const void *e,
-+ const struct xt_target *target,
-+ void *targinfo,
-+ unsigned int hook_mask)
-+{
-+ struct ipt_imq_info *mr;
-+
-+ mr = (struct ipt_imq_info *)targinfo;
-+
-+ if (mr->todev > IMQ_MAX_DEVS) {
-+ printk(KERN_WARNING
-+ "IMQ: invalid device specified, highest is %u\n",
-+ IMQ_MAX_DEVS);
-+ return 0;
-+ }
-+
-+ return 1;
-+}
-+
-+static struct xt_target ipt_imq_reg = {
-+ .name = "IMQ",
-+ .family = AF_INET,
-+ .target = imq_target,
-+ .targetsize = sizeof(struct ipt_imq_info),
-+ .checkentry = imq_checkentry,
-+ .me = THIS_MODULE,
-+ .table = "mangle"
-+};
-+
-+static int __init init(void)
-+{
-+ return xt_register_target(&ipt_imq_reg);
-+}
-+
-+static void __exit fini(void)
-+{
-+ xt_unregister_target(&ipt_imq_reg);
-+}
-+
-+module_init(init);
-+module_exit(fini);
-+
-+MODULE_AUTHOR("http://www.linuximq.net");
-+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See http://www.linuximq.net/ for more information.");
-+MODULE_LICENSE("GPL");
---- a/net/ipv4/netfilter/Kconfig
-+++ b/net/ipv4/netfilter/Kconfig
-@@ -123,6 +123,17 @@ config IP_NF_FILTER
-
- To compile it as a module, choose M here. If unsure, say N.
-
-+config IP_NF_TARGET_IMQ
-+ tristate "IMQ target support"
-+ depends on IP_NF_MANGLE && IMQ
-+ help
-+ This option adds a `IMQ' target which is used to specify if and
-+ to which IMQ device packets should get enqueued/dequeued.
-+
-+ For more information visit: http://www.linuximq.net/
-+
-+ To compile it as a module, choose M here. If unsure, say N.
-+
- config IP_NF_TARGET_REJECT
- tristate "REJECT target support"
- depends on IP_NF_FILTER
---- a/net/ipv4/netfilter/Makefile
-+++ b/net/ipv4/netfilter/Makefile
-@@ -51,6 +51,7 @@ obj-$(CONFIG_IP_NF_MATCH_TTL) += ipt_ttl
- obj-$(CONFIG_IP_NF_TARGET_CLUSTERIP) += ipt_CLUSTERIP.o
- obj-$(CONFIG_IP_NF_TARGET_ECN) += ipt_ECN.o
- obj-$(CONFIG_IP_NF_TARGET_LOG) += ipt_LOG.o
-+obj-$(CONFIG_IP_NF_TARGET_IMQ) += ipt_IMQ.o
- obj-$(CONFIG_IP_NF_TARGET_MASQUERADE) += ipt_MASQUERADE.o
- obj-$(CONFIG_IP_NF_TARGET_NETMAP) += ipt_NETMAP.o
- obj-$(CONFIG_IP_NF_TARGET_REDIRECT) += ipt_REDIRECT.o
---- /dev/null
-+++ b/net/ipv6/netfilter/ip6t_IMQ.c
-@@ -0,0 +1,69 @@
-+/*
-+ * This target marks packets to be enqueued to an imq device
-+ */
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter_ipv6/ip6_tables.h>
-+#include <linux/netfilter_ipv6/ip6t_IMQ.h>
-+#include <linux/imq.h>
-+
-+static unsigned int imq_target(struct sk_buff *pskb,
-+ const struct net_device *in,
-+ const struct net_device *out,
-+ unsigned int hooknum,
-+ const struct xt_target *target,
-+ const void *targinfo)
-+{
-+ struct ip6t_imq_info *mr = (struct ip6t_imq_info *)targinfo;
-+
-+ pskb->imq_flags = mr->todev | IMQ_F_ENQUEUE;
-+
-+ return XT_CONTINUE;
-+}
-+
-+static bool imq_checkentry(const char *tablename,
-+ const void *entry,
-+ const struct xt_target *target,
-+ void *targinfo,
-+ unsigned int hook_mask)
-+{
-+ struct ip6t_imq_info *mr;
-+
-+ mr = (struct ip6t_imq_info *)targinfo;
-+
-+ if (mr->todev > IMQ_MAX_DEVS) {
-+ printk(KERN_WARNING
-+ "IMQ: invalid device specified, highest is %u\n",
-+ IMQ_MAX_DEVS);
-+ return 0;
-+ }
-+
-+ return 1;
-+}
-+
-+static struct xt_target ip6t_imq_reg = {
-+ .name = "IMQ",
-+ .family = AF_INET6,
-+ .target = imq_target,
-+ .targetsize = sizeof(struct ip6t_imq_info),
-+ .table = "mangle",
-+ .checkentry = imq_checkentry,
-+ .me = THIS_MODULE
-+};
-+
-+static int __init init(void)
-+{
-+ return xt_register_target(&ip6t_imq_reg);
-+}
-+
-+static void __exit fini(void)
-+{
-+ xt_unregister_target(&ip6t_imq_reg);
-+}
-+
-+module_init(init);
-+module_exit(fini);
-+
-+MODULE_AUTHOR("http://www.linuximq.net");
-+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See http://www.linuximq.net/ for more information.");
-+MODULE_LICENSE("GPL");
---- a/net/ipv6/netfilter/Kconfig
-+++ b/net/ipv6/netfilter/Kconfig
-@@ -179,6 +179,15 @@ config IP6_NF_MANGLE
-
- To compile it as a module, choose M here. If unsure, say N.
-
-+config IP6_NF_TARGET_IMQ
-+ tristate "IMQ target support"
-+ depends on IP6_NF_MANGLE && IMQ
-+ help
-+ This option adds a `IMQ' target which is used to specify if and
-+ to which imq device packets should get enqueued/dequeued.
-+
-+ To compile it as a module, choose M here. If unsure, say N.
-+
- config IP6_NF_TARGET_HL
- tristate 'HL (hoplimit) target support'
- depends on IP6_NF_MANGLE
---- a/net/ipv6/netfilter/Makefile
-+++ b/net/ipv6/netfilter/Makefile
-@@ -6,6 +6,7 @@
- obj-$(CONFIG_IP6_NF_IPTABLES) += ip6_tables.o
- obj-$(CONFIG_IP6_NF_FILTER) += ip6table_filter.o
- obj-$(CONFIG_IP6_NF_MANGLE) += ip6table_mangle.o
-+obj-$(CONFIG_IP6_NF_TARGET_IMQ) += ip6t_IMQ.o
- obj-$(CONFIG_IP6_NF_QUEUE) += ip6_queue.o
- obj-$(CONFIG_IP6_NF_RAW) += ip6table_raw.o
-
---- a/net/sched/sch_generic.c
-+++ b/net/sched/sch_generic.c
-@@ -203,6 +203,7 @@ void __qdisc_run(struct net_device *dev)
-
- clear_bit(__LINK_STATE_QDISC_RUNNING, &dev->state);
- }
-+EXPORT_SYMBOL(__qdisc_run);
-
- static void dev_watchdog(unsigned long arg)
- {
+++ /dev/null
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -145,7 +145,7 @@ config NF_CONNTRACK_FTP
-
- config NF_CONNTRACK_H323
- tristate "H.323 protocol support"
-- depends on NF_CONNTRACK && (IPV6 || IPV6=n)
-+ depends on NF_CONNTRACK
- depends on NETFILTER_ADVANCED
- help
- H.323 is a VoIP signalling protocol from ITU-T. As one of the most
-@@ -423,7 +423,7 @@ config NETFILTER_XT_TARGET_CONNSECMARK
-
- config NETFILTER_XT_TARGET_TCPMSS
- tristate '"TCPMSS" target support'
-- depends on NETFILTER_XTABLES && (IPV6 || IPV6=n)
-+ depends on NETFILTER_XTABLES
- default m if NETFILTER_ADVANCED=n
- ---help---
- This option adds a `TCPMSS' target, which allows you to alter the
+++ /dev/null
---- /dev/null
-+++ b/include/linux/netfilter/nf_conntrack_rtsp.h
-@@ -0,0 +1,63 @@
-+/*
-+ * RTSP extension for IP connection tracking.
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_conntrack_irc.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.
-+ */
-+#ifndef _IP_CONNTRACK_RTSP_H
-+#define _IP_CONNTRACK_RTSP_H
-+
-+//#define IP_NF_RTSP_DEBUG 1
-+#define IP_NF_RTSP_VERSION "0.6.21"
-+
-+#ifdef __KERNEL__
-+/* port block types */
-+typedef enum {
-+ pb_single, /* client_port=x */
-+ pb_range, /* client_port=x-y */
-+ pb_discon /* client_port=x/y (rtspbis) */
-+} portblock_t;
-+
-+/* We record seq number and length of rtsp headers here, all in host order. */
-+
-+/*
-+ * This structure is per expected connection. It is a member of struct
-+ * ip_conntrack_expect. The TCP SEQ for the conntrack expect is stored
-+ * there and we are expected to only store the length of the data which
-+ * needs replaced. If a packet contains multiple RTSP messages, we create
-+ * one expected connection per message.
-+ *
-+ * We use these variables to mark the entire header block. This may seem
-+ * like overkill, but the nature of RTSP requires it. A header may appear
-+ * multiple times in a message. We must treat two Transport headers the
-+ * same as one Transport header with two entries.
-+ */
-+struct ip_ct_rtsp_expect
-+{
-+ u_int32_t len; /* length of header block */
-+ portblock_t pbtype; /* Type of port block that was requested */
-+ u_int16_t loport; /* Port that was requested, low or first */
-+ u_int16_t hiport; /* Port that was requested, high or second */
-+#if 0
-+ uint method; /* RTSP method */
-+ uint cseq; /* CSeq from request */
-+#endif
-+};
-+
-+extern unsigned int (*nf_nat_rtsp_hook)(struct sk_buff *skb,
-+ enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen,
-+ struct ip_ct_rtsp_expect *prtspexp,
-+ struct nf_conntrack_expect *exp);
-+
-+extern void (*nf_nat_rtsp_hook_expectfn)(struct nf_conn *ct, struct nf_conntrack_expect *exp);
-+
-+#define RTSP_PORT 554
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _IP_CONNTRACK_RTSP_H */
---- /dev/null
-+++ b/include/linux/netfilter_helpers.h
-@@ -0,0 +1,133 @@
-+/*
-+ * Helpers for netfiler modules. This file provides implementations for basic
-+ * functions such as strncasecmp(), etc.
-+ *
-+ * gcc will warn for defined but unused functions, so we only include the
-+ * functions requested. The following macros are used:
-+ * NF_NEED_STRNCASECMP nf_strncasecmp()
-+ * NF_NEED_STRTOU16 nf_strtou16()
-+ * NF_NEED_STRTOU32 nf_strtou32()
-+ */
-+#ifndef _NETFILTER_HELPERS_H
-+#define _NETFILTER_HELPERS_H
-+
-+/* Only include these functions for kernel code. */
-+#ifdef __KERNEL__
-+
-+#include <linux/ctype.h>
-+#define iseol(c) ( (c) == '\r' || (c) == '\n' )
-+
-+/*
-+ * The standard strncasecmp()
-+ */
-+#ifdef NF_NEED_STRNCASECMP
-+static int
-+nf_strncasecmp(const char* s1, const char* s2, u_int32_t len)
-+{
-+ if (s1 == NULL || s2 == NULL)
-+ {
-+ if (s1 == NULL && s2 == NULL)
-+ {
-+ return 0;
-+ }
-+ return (s1 == NULL) ? -1 : 1;
-+ }
-+ while (len > 0 && tolower(*s1) == tolower(*s2))
-+ {
-+ len--;
-+ s1++;
-+ s2++;
-+ }
-+ return ( (len == 0) ? 0 : (tolower(*s1) - tolower(*s2)) );
-+}
-+#endif /* NF_NEED_STRNCASECMP */
-+
-+/*
-+ * Parse a string containing a 16-bit unsigned integer.
-+ * Returns the number of chars used, or zero if no number is found.
-+ */
-+#ifdef NF_NEED_STRTOU16
-+static int
-+nf_strtou16(const char* pbuf, u_int16_t* pval)
-+{
-+ int n = 0;
-+
-+ *pval = 0;
-+ while (isdigit(pbuf[n]))
-+ {
-+ *pval = (*pval * 10) + (pbuf[n] - '0');
-+ n++;
-+ }
-+
-+ return n;
-+}
-+#endif /* NF_NEED_STRTOU16 */
-+
-+/*
-+ * Parse a string containing a 32-bit unsigned integer.
-+ * Returns the number of chars used, or zero if no number is found.
-+ */
-+#ifdef NF_NEED_STRTOU32
-+static int
-+nf_strtou32(const char* pbuf, u_int32_t* pval)
-+{
-+ int n = 0;
-+
-+ *pval = 0;
-+ while (pbuf[n] >= '0' && pbuf[n] <= '9')
-+ {
-+ *pval = (*pval * 10) + (pbuf[n] - '0');
-+ n++;
-+ }
-+
-+ return n;
-+}
-+#endif /* NF_NEED_STRTOU32 */
-+
-+/*
-+ * Given a buffer and length, advance to the next line and mark the current
-+ * line.
-+ */
-+#ifdef NF_NEED_NEXTLINE
-+static int
-+nf_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
-+{
-+ uint off = *poff;
-+ uint physlen = 0;
-+
-+ if (off >= len)
-+ {
-+ return 0;
-+ }
-+
-+ while (p[off] != '\n')
-+ {
-+ if (len-off <= 1)
-+ {
-+ return 0;
-+ }
-+
-+ physlen++;
-+ off++;
-+ }
-+
-+ /* if we saw a crlf, physlen needs adjusted */
-+ if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
-+ {
-+ physlen--;
-+ }
-+
-+ /* advance past the newline */
-+ off++;
-+
-+ *plineoff = *poff;
-+ *plinelen = physlen;
-+ *poff = off;
-+
-+ return 1;
-+}
-+#endif /* NF_NEED_NEXTLINE */
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NETFILTER_HELPERS_H */
---- /dev/null
-+++ b/include/linux/netfilter_mime.h
-@@ -0,0 +1,89 @@
-+/*
-+ * MIME functions for netfilter modules. This file provides implementations
-+ * for basic MIME parsing. MIME headers are used in many protocols, such as
-+ * HTTP, RTSP, SIP, etc.
-+ *
-+ * gcc will warn for defined but unused functions, so we only include the
-+ * functions requested. The following macros are used:
-+ * NF_NEED_MIME_NEXTLINE nf_mime_nextline()
-+ */
-+#ifndef _NETFILTER_MIME_H
-+#define _NETFILTER_MIME_H
-+
-+/* Only include these functions for kernel code. */
-+#ifdef __KERNEL__
-+
-+#include <linux/ctype.h>
-+
-+/*
-+ * Given a buffer and length, advance to the next line and mark the current
-+ * line. If the current line is empty, *plinelen will be set to zero. If
-+ * not, it will be set to the actual line length (including CRLF).
-+ *
-+ * 'line' in this context means logical line (includes LWS continuations).
-+ * Returns 1 on success, 0 on failure.
-+ */
-+#ifdef NF_NEED_MIME_NEXTLINE
-+static int
-+nf_mime_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
-+{
-+ uint off = *poff;
-+ uint physlen = 0;
-+ int is_first_line = 1;
-+
-+ if (off >= len)
-+ {
-+ return 0;
-+ }
-+
-+ do
-+ {
-+ while (p[off] != '\n')
-+ {
-+ if (len-off <= 1)
-+ {
-+ return 0;
-+ }
-+
-+ physlen++;
-+ off++;
-+ }
-+
-+ /* if we saw a crlf, physlen needs adjusted */
-+ if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
-+ {
-+ physlen--;
-+ }
-+
-+ /* advance past the newline */
-+ off++;
-+
-+ /* check for an empty line */
-+ if (physlen == 0)
-+ {
-+ break;
-+ }
-+
-+ /* check for colon on the first physical line */
-+ if (is_first_line)
-+ {
-+ is_first_line = 0;
-+ if (memchr(p+(*poff), ':', physlen) == NULL)
-+ {
-+ return 0;
-+ }
-+ }
-+ }
-+ while (p[off] == ' ' || p[off] == '\t');
-+
-+ *plineoff = *poff;
-+ *plinelen = (physlen == 0) ? 0 : (off - *poff);
-+ *poff = off;
-+
-+ return 1;
-+}
-+#endif /* NF_NEED_MIME_NEXTLINE */
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NETFILTER_MIME_H */
---- a/net/ipv4/netfilter/Makefile
-+++ b/net/ipv4/netfilter/Makefile
-@@ -23,6 +23,7 @@ obj-$(CONFIG_NF_NAT_AMANDA) += nf_nat_am
- obj-$(CONFIG_NF_NAT_FTP) += nf_nat_ftp.o
- obj-$(CONFIG_NF_NAT_H323) += nf_nat_h323.o
- obj-$(CONFIG_NF_NAT_IRC) += nf_nat_irc.o
-+obj-$(CONFIG_NF_NAT_RTSP) += nf_nat_rtsp.o
- obj-$(CONFIG_NF_NAT_PPTP) += nf_nat_pptp.o
- obj-$(CONFIG_NF_NAT_SIP) += nf_nat_sip.o
- obj-$(CONFIG_NF_NAT_SNMP_BASIC) += nf_nat_snmp_basic.o
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -258,6 +258,16 @@ config NF_CONNTRACK_TFTP
-
- To compile it as a module, choose M here. If unsure, say N.
-
-+config NF_CONNTRACK_RTSP
-+ tristate "RTSP protocol support"
-+ depends on NF_CONNTRACK
-+ help
-+ Support the RTSP protocol. This allows UDP transports to be setup
-+ properly, including RTP and RDT.
-+
-+ If you want to compile it as a module, say 'M' here and read
-+ Documentation/modules.txt. If unsure, say 'Y'.
-+
- config NF_CT_NETLINK
- tristate 'Connection tracking netlink interface'
- depends on NF_CONNTRACK
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -32,6 +32,7 @@ obj-$(CONFIG_NF_CONNTRACK_PPTP) += nf_co
- obj-$(CONFIG_NF_CONNTRACK_SANE) += nf_conntrack_sane.o
- obj-$(CONFIG_NF_CONNTRACK_SIP) += nf_conntrack_sip.o
- obj-$(CONFIG_NF_CONNTRACK_TFTP) += nf_conntrack_tftp.o
-+obj-$(CONFIG_NF_CONNTRACK_RTSP) += nf_conntrack_rtsp.o
-
- # generic X tables
- obj-$(CONFIG_NETFILTER_XTABLES) += x_tables.o xt_tcpudp.o
---- a/net/ipv4/netfilter/Kconfig
-+++ b/net/ipv4/netfilter/Kconfig
-@@ -266,6 +266,11 @@ config NF_NAT_IRC
- depends on IP_NF_IPTABLES && NF_CONNTRACK && NF_NAT
- default NF_NAT && NF_CONNTRACK_IRC
-
-+config NF_NAT_RTSP
-+ tristate
-+ depends on IP_NF_IPTABLES && NF_CONNTRACK && NF_NAT
-+ default NF_NAT && NF_CONNTRACK_RTSP
-+
- config NF_NAT_TFTP
- tristate
- depends on IP_NF_IPTABLES && NF_CONNTRACK && NF_NAT
---- /dev/null
-+++ b/net/netfilter/nf_conntrack_rtsp.c
-@@ -0,0 +1,513 @@
-+/*
-+ * RTSP extension for IP connection tracking
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_conntrack_irc.c
-+ *
-+ * 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.
-+ *
-+ * Module load syntax:
-+ * insmod nf_conntrack_rtsp.o ports=port1,port2,...port<MAX_PORTS>
-+ * max_outstanding=n setup_timeout=secs
-+ *
-+ * If no ports are specified, the default will be port 554.
-+ *
-+ * With max_outstanding you can define the maximum number of not yet
-+ * answered SETUP requests per RTSP session (default 8).
-+ * With setup_timeout you can specify how long the system waits for
-+ * an expected data channel (default 300 seconds).
-+ *
-+ * 2005-02-13: Harald Welte <laforge at netfilter.org>
-+ * - port to 2.6
-+ * - update to recent post-2.6.11 api changes
-+ * 2006-09-14: Steven Van Acker <deepstar at singularity.be>
-+ * - removed calls to NAT code from conntrack helper: NAT no longer needed to use rtsp-conntrack
-+ * 2007-04-18: Michael Guntsche <mike at it-loops.com>
-+ * - Port to new NF API
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/netfilter.h>
-+#include <linux/ip.h>
-+#include <linux/inet.h>
-+#include <net/tcp.h>
-+
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_expect.h>
-+#include <net/netfilter/nf_conntrack_helper.h>
-+#include <linux/netfilter/nf_conntrack_rtsp.h>
-+
-+#define NF_NEED_STRNCASECMP
-+#define NF_NEED_STRTOU16
-+#define NF_NEED_STRTOU32
-+#define NF_NEED_NEXTLINE
-+#include <linux/netfilter_helpers.h>
-+#define NF_NEED_MIME_NEXTLINE
-+#include <linux/netfilter_mime.h>
-+
-+#include <linux/ctype.h>
-+#define MAX_SIMUL_SETUP 8 /* XXX: use max_outstanding */
-+#define INFOP(fmt, args...) printk(KERN_INFO "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#if 0
-+#define DEBUGP(fmt, args...) printk(KERN_DEBUG "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#else
-+#define DEBUGP(fmt, args...)
-+#endif
-+
-+#define MAX_PORTS 8
-+static int ports[MAX_PORTS];
-+static int num_ports = 0;
-+static int max_outstanding = 8;
-+static unsigned int setup_timeout = 300;
-+
-+MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
-+MODULE_DESCRIPTION("RTSP connection tracking module");
-+MODULE_LICENSE("GPL");
-+module_param_array(ports, int, &num_ports, 0400);
-+MODULE_PARM_DESC(ports, "port numbers of RTSP servers");
-+module_param(max_outstanding, int, 0400);
-+MODULE_PARM_DESC(max_outstanding, "max number of outstanding SETUP requests per RTSP session");
-+module_param(setup_timeout, int, 0400);
-+MODULE_PARM_DESC(setup_timeout, "timeout on for unestablished data channels");
-+
-+static char *rtsp_buffer;
-+static DEFINE_SPINLOCK(rtsp_buffer_lock);
-+
-+unsigned int (*nf_nat_rtsp_hook)(struct sk_buff *skb,
-+ enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen,struct ip_ct_rtsp_expect* prtspexp,
-+ struct nf_conntrack_expect *exp);
-+void (*nf_nat_rtsp_hook_expectfn)(struct nf_conn *ct, struct nf_conntrack_expect *exp);
-+
-+EXPORT_SYMBOL_GPL(nf_nat_rtsp_hook);
-+
-+/*
-+ * Max mappings we will allow for one RTSP connection (for RTP, the number
-+ * of allocated ports is twice this value). Note that SMIL burns a lot of
-+ * ports so keep this reasonably high. If this is too low, you will see a
-+ * lot of "no free client map entries" messages.
-+ */
-+#define MAX_PORT_MAPS 16
-+
-+/*** default port list was here in the masq code: 554, 3030, 4040 ***/
-+
-+#define SKIP_WSPACE(ptr,len,off) while(off < len && isspace(*(ptr+off))) { off++; }
-+
-+/*
-+ * Parse an RTSP packet.
-+ *
-+ * Returns zero if parsing failed.
-+ *
-+ * Parameters:
-+ * IN ptcp tcp data pointer
-+ * IN tcplen tcp data len
-+ * IN/OUT ptcpoff points to current tcp offset
-+ * OUT phdrsoff set to offset of rtsp headers
-+ * OUT phdrslen set to length of rtsp headers
-+ * OUT pcseqoff set to offset of CSeq header
-+ * OUT pcseqlen set to length of CSeq header
-+ */
-+static int
-+rtsp_parse_message(char* ptcp, uint tcplen, uint* ptcpoff,
-+ uint* phdrsoff, uint* phdrslen,
-+ uint* pcseqoff, uint* pcseqlen,
-+ uint* transoff, uint* translen)
-+{
-+ uint entitylen = 0;
-+ uint lineoff;
-+ uint linelen;
-+
-+ if (!nf_nextline(ptcp, tcplen, ptcpoff, &lineoff, &linelen))
-+ return 0;
-+
-+ *phdrsoff = *ptcpoff;
-+ while (nf_mime_nextline(ptcp, tcplen, ptcpoff, &lineoff, &linelen)) {
-+ if (linelen == 0) {
-+ if (entitylen > 0)
-+ *ptcpoff += min(entitylen, tcplen - *ptcpoff);
-+ break;
-+ }
-+ if (lineoff+linelen > tcplen) {
-+ INFOP("!! overrun !!\n");
-+ break;
-+ }
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "CSeq:", 5) == 0) {
-+ *pcseqoff = lineoff;
-+ *pcseqlen = linelen;
-+ }
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0) {
-+ *transoff = lineoff;
-+ *translen = linelen;
-+ }
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "Content-Length:", 15) == 0) {
-+ uint off = lineoff+15;
-+ SKIP_WSPACE(ptcp+lineoff, linelen, off);
-+ nf_strtou32(ptcp+off, &entitylen);
-+ }
-+ }
-+ *phdrslen = (*ptcpoff) - (*phdrsoff);
-+
-+ return 1;
-+}
-+
-+/*
-+ * Find lo/hi client ports (if any) in transport header
-+ * In:
-+ * ptcp, tcplen = packet
-+ * tranoff, tranlen = buffer to search
-+ *
-+ * Out:
-+ * pport_lo, pport_hi = lo/hi ports (host endian)
-+ *
-+ * Returns nonzero if any client ports found
-+ *
-+ * Note: it is valid (and expected) for the client to request multiple
-+ * transports, so we need to parse the entire line.
-+ */
-+static int
-+rtsp_parse_transport(char* ptran, uint tranlen,
-+ struct ip_ct_rtsp_expect* prtspexp)
-+{
-+ int rc = 0;
-+ uint off = 0;
-+
-+ if (tranlen < 10 || !iseol(ptran[tranlen-1]) ||
-+ nf_strncasecmp(ptran, "Transport:", 10) != 0) {
-+ INFOP("sanity check failed\n");
-+ return 0;
-+ }
-+
-+ DEBUGP("tran='%.*s'\n", (int)tranlen, ptran);
-+ off += 10;
-+ SKIP_WSPACE(ptran, tranlen, off);
-+
-+ /* Transport: tran;field;field=val,tran;field;field=val,... */
-+ while (off < tranlen) {
-+ const char* pparamend;
-+ uint nextparamoff;
-+
-+ pparamend = memchr(ptran+off, ',', tranlen-off);
-+ pparamend = (pparamend == NULL) ? ptran+tranlen : pparamend+1;
-+ nextparamoff = pparamend-ptran;
-+
-+ while (off < nextparamoff) {
-+ const char* pfieldend;
-+ uint nextfieldoff;
-+
-+ pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+ nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+ if (strncmp(ptran+off, "client_port=", 12) == 0) {
-+ u_int16_t port;
-+ uint numlen;
-+
-+ off += 12;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ if (prtspexp->loport != 0 && prtspexp->loport != port)
-+ DEBUGP("multiple ports found, port %hu ignored\n", port);
-+ else {
-+ DEBUGP("lo port found : %hu\n", port);
-+ prtspexp->loport = prtspexp->hiport = port;
-+ if (ptran[off] == '-') {
-+ off++;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ prtspexp->pbtype = pb_range;
-+ prtspexp->hiport = port;
-+
-+ // If we have a range, assume rtp:
-+ // loport must be even, hiport must be loport+1
-+ if ((prtspexp->loport & 0x0001) != 0 ||
-+ prtspexp->hiport != prtspexp->loport+1) {
-+ DEBUGP("incorrect range: %hu-%hu, correcting\n",
-+ prtspexp->loport, prtspexp->hiport);
-+ prtspexp->loport &= 0xfffe;
-+ prtspexp->hiport = prtspexp->loport+1;
-+ }
-+ } else if (ptran[off] == '/') {
-+ off++;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ prtspexp->pbtype = pb_discon;
-+ prtspexp->hiport = port;
-+ }
-+ rc = 1;
-+ }
-+ }
-+
-+ /*
-+ * Note we don't look for the destination parameter here.
-+ * If we are using NAT, the NAT module will handle it. If not,
-+ * and the client is sending packets elsewhere, the expectation
-+ * will quietly time out.
-+ */
-+
-+ off = nextfieldoff;
-+ }
-+
-+ off = nextparamoff;
-+ }
-+
-+ return rc;
-+}
-+
-+void expected(struct nf_conn *ct, struct nf_conntrack_expect *exp)
-+{
-+ if(nf_nat_rtsp_hook_expectfn) {
-+ nf_nat_rtsp_hook_expectfn(ct,exp);
-+ }
-+}
-+
-+/*** conntrack functions ***/
-+
-+/* outbound packet: client->server */
-+
-+static inline int
-+help_out(struct sk_buff *skb, unsigned char *rb_ptr, unsigned int datalen,
-+ struct nf_conn *ct, enum ip_conntrack_info ctinfo)
-+{
-+ struct ip_ct_rtsp_expect expinfo;
-+
-+ int dir = CTINFO2DIR(ctinfo); /* = IP_CT_DIR_ORIGINAL */
-+ //struct tcphdr* tcph = (void*)iph + iph->ihl * 4;
-+ //uint tcplen = pktlen - iph->ihl * 4;
-+ char* pdata = rb_ptr;
-+ //uint datalen = tcplen - tcph->doff * 4;
-+ uint dataoff = 0;
-+ int ret = NF_ACCEPT;
-+
-+ struct nf_conntrack_expect *exp;
-+
-+ __be16 be_loport;
-+
-+ memset(&expinfo, 0, sizeof(expinfo));
-+
-+ while (dataoff < datalen) {
-+ uint cmdoff = dataoff;
-+ uint hdrsoff = 0;
-+ uint hdrslen = 0;
-+ uint cseqoff = 0;
-+ uint cseqlen = 0;
-+ uint transoff = 0;
-+ uint translen = 0;
-+ uint off;
-+
-+ if (!rtsp_parse_message(pdata, datalen, &dataoff,
-+ &hdrsoff, &hdrslen,
-+ &cseqoff, &cseqlen,
-+ &transoff, &translen))
-+ break; /* not a valid message */
-+
-+ if (strncmp(pdata+cmdoff, "SETUP ", 6) != 0)
-+ continue; /* not a SETUP message */
-+ DEBUGP("found a setup message\n");
-+
-+ off = 0;
-+ if(translen) {
-+ rtsp_parse_transport(pdata+transoff, translen, &expinfo);
-+ }
-+
-+ if (expinfo.loport == 0) {
-+ DEBUGP("no udp transports found\n");
-+ continue; /* no udp transports found */
-+ }
-+
-+ DEBUGP("udp transport found, ports=(%d,%hu,%hu)\n",
-+ (int)expinfo.pbtype, expinfo.loport, expinfo.hiport);
-+
-+ exp = nf_ct_expect_alloc(ct);
-+ if (!exp) {
-+ ret = NF_DROP;
-+ goto out;
-+ }
-+
-+ be_loport = htons(expinfo.loport);
-+
-+ nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
-+ &ct->tuplehash[!dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3,
-+ IPPROTO_UDP, NULL, &be_loport);
-+
-+ exp->master = ct;
-+
-+ exp->expectfn = expected;
-+ exp->flags = 0;
-+
-+ if (expinfo.pbtype == pb_range) {
-+ DEBUGP("Changing expectation mask to handle multiple ports\n");
-+ exp->mask.src.u.udp.port = 0xfffe;
-+ }
-+
-+ DEBUGP("expect_related %u.%u.%u.%u:%u-%u.%u.%u.%u:%u\n",
-+ NIPQUAD(exp->tuple.src.u3.ip),
-+ ntohs(exp->tuple.src.u.udp.port),
-+ NIPQUAD(exp->tuple.dst.u3.ip),
-+ ntohs(exp->tuple.dst.u.udp.port));
-+
-+ if (nf_nat_rtsp_hook)
-+ /* pass the request off to the nat helper */
-+ ret = nf_nat_rtsp_hook(skb, ctinfo, hdrsoff, hdrslen, &expinfo, exp);
-+ else if (nf_ct_expect_related(exp) != 0) {
-+ INFOP("nf_ct_expect_related failed\n");
-+ ret = NF_DROP;
-+ }
-+ nf_ct_expect_put(exp);
-+ goto out;
-+ }
-+out:
-+
-+ return ret;
-+}
-+
-+
-+static inline int
-+help_in(struct sk_buff *skb, size_t pktlen,
-+ struct nf_conn* ct, enum ip_conntrack_info ctinfo)
-+{
-+ return NF_ACCEPT;
-+}
-+
-+static int help(struct sk_buff *skb, unsigned int protoff,
-+ struct nf_conn *ct, enum ip_conntrack_info ctinfo)
-+{
-+ struct tcphdr _tcph, *th;
-+ unsigned int dataoff, datalen;
-+ char *rb_ptr;
-+ int ret = NF_DROP;
-+
-+ /* Until there's been traffic both ways, don't look in packets. */
-+ if (ctinfo != IP_CT_ESTABLISHED &&
-+ ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) {
-+ DEBUGP("conntrackinfo = %u\n", ctinfo);
-+ return NF_ACCEPT;
-+ }
-+
-+ /* Not whole TCP header? */
-+ th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph);
-+
-+ if (!th)
-+ return NF_ACCEPT;
-+
-+ /* No data ? */
-+ dataoff = protoff + th->doff*4;
-+ datalen = skb->len - dataoff;
-+ if (dataoff >= skb->len)
-+ return NF_ACCEPT;
-+
-+ spin_lock_bh(&rtsp_buffer_lock);
-+ rb_ptr = skb_header_pointer(skb, dataoff,
-+ skb->len - dataoff, rtsp_buffer);
-+ BUG_ON(rb_ptr == NULL);
-+
-+#if 0
-+ /* Checksum invalid? Ignore. */
-+ /* FIXME: Source route IP option packets --RR */
-+ if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr,
-+ csum_partial((char*)tcph, tcplen, 0)))
-+ {
-+ DEBUGP("bad csum: %p %u %u.%u.%u.%u %u.%u.%u.%u\n",
-+ tcph, tcplen, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr));
-+ return NF_ACCEPT;
-+ }
-+#endif
-+
-+ switch (CTINFO2DIR(ctinfo)) {
-+ case IP_CT_DIR_ORIGINAL:
-+ ret = help_out(skb, rb_ptr, datalen, ct, ctinfo);
-+ break;
-+ case IP_CT_DIR_REPLY:
-+ DEBUGP("IP_CT_DIR_REPLY\n");
-+ /* inbound packet: server->client */
-+ ret = NF_ACCEPT;
-+ break;
-+ }
-+
-+ spin_unlock_bh(&rtsp_buffer_lock);
-+
-+ return ret;
-+}
-+
-+static struct nf_conntrack_helper rtsp_helpers[MAX_PORTS];
-+static char rtsp_names[MAX_PORTS][10];
-+
-+/* This function is intentionally _NOT_ defined as __exit */
-+static void
-+fini(void)
-+{
-+ int i;
-+ for (i = 0; i < num_ports; i++) {
-+ DEBUGP("unregistering port %d\n", ports[i]);
-+ nf_conntrack_helper_unregister(&rtsp_helpers[i]);
-+ }
-+ kfree(rtsp_buffer);
-+}
-+
-+static int __init
-+init(void)
-+{
-+ int i, ret;
-+ struct nf_conntrack_helper *hlpr;
-+ char *tmpname;
-+
-+ printk("nf_conntrack_rtsp v" IP_NF_RTSP_VERSION " loading\n");
-+
-+ if (max_outstanding < 1) {
-+ printk("nf_conntrack_rtsp: max_outstanding must be a positive integer\n");
-+ return -EBUSY;
-+ }
-+ if (setup_timeout < 0) {
-+ printk("nf_conntrack_rtsp: setup_timeout must be a positive integer\n");
-+ return -EBUSY;
-+ }
-+
-+ rtsp_buffer = kmalloc(65536, GFP_KERNEL);
-+ if (!rtsp_buffer)
-+ return -ENOMEM;
-+
-+ /* If no port given, default to standard rtsp port */
-+ if (ports[0] == 0) {
-+ ports[0] = RTSP_PORT;
-+ }
-+
-+ for (i = 0; (i < MAX_PORTS) && ports[i]; i++) {
-+ hlpr = &rtsp_helpers[i];
-+ memset(hlpr, 0, sizeof(struct nf_conntrack_helper));
-+ hlpr->tuple.src.u.tcp.port = htons(ports[i]);
-+ hlpr->tuple.dst.protonum = IPPROTO_TCP;
-+ hlpr->max_expected = max_outstanding;
-+ hlpr->timeout = setup_timeout;
-+ hlpr->me = THIS_MODULE;
-+ hlpr->help = help;
-+
-+ tmpname = &rtsp_names[i][0];
-+ if (ports[i] == RTSP_PORT) {
-+ sprintf(tmpname, "rtsp");
-+ } else {
-+ sprintf(tmpname, "rtsp-%d", i);
-+ }
-+ hlpr->name = tmpname;
-+
-+ DEBUGP("port #%d: %d\n", i, ports[i]);
-+
-+ ret = nf_conntrack_helper_register(hlpr);
-+
-+ if (ret) {
-+ printk("nf_conntrack_rtsp: ERROR registering port %d\n", ports[i]);
-+ fini();
-+ return -EBUSY;
-+ }
-+ num_ports++;
-+ }
-+ return 0;
-+}
-+
-+module_init(init);
-+module_exit(fini);
-+
-+EXPORT_SYMBOL(nf_nat_rtsp_hook_expectfn);
-+
---- /dev/null
-+++ b/net/ipv4/netfilter/nf_nat_rtsp.c
-@@ -0,0 +1,496 @@
-+/*
-+ * RTSP extension for TCP NAT alteration
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_nat_irc.c
-+ *
-+ * 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.
-+ *
-+ * Module load syntax:
-+ * insmod nf_nat_rtsp.o ports=port1,port2,...port<MAX_PORTS>
-+ * stunaddr=<address>
-+ * destaction=[auto|strip|none]
-+ *
-+ * If no ports are specified, the default will be port 554 only.
-+ *
-+ * stunaddr specifies the address used to detect that a client is using STUN.
-+ * If this address is seen in the destination parameter, it is assumed that
-+ * the client has already punched a UDP hole in the firewall, so we don't
-+ * mangle the client_port. If none is specified, it is autodetected. It
-+ * only needs to be set if you have multiple levels of NAT. It should be
-+ * set to the external address that the STUN clients detect. Note that in
-+ * this case, it will not be possible for clients to use UDP with servers
-+ * between the NATs.
-+ *
-+ * If no destaction is specified, auto is used.
-+ * destaction=auto: strip destination parameter if it is not stunaddr.
-+ * destaction=strip: always strip destination parameter (not recommended).
-+ * destaction=none: do not touch destination parameter (not recommended).
-+ */
-+
-+#include <linux/module.h>
-+#include <net/tcp.h>
-+#include <net/netfilter/nf_nat_helper.h>
-+#include <net/netfilter/nf_nat_rule.h>
-+#include <linux/netfilter/nf_conntrack_rtsp.h>
-+#include <net/netfilter/nf_conntrack_expect.h>
-+
-+#include <linux/inet.h>
-+#include <linux/ctype.h>
-+#define NF_NEED_STRNCASECMP
-+#define NF_NEED_STRTOU16
-+#include <linux/netfilter_helpers.h>
-+#define NF_NEED_MIME_NEXTLINE
-+#include <linux/netfilter_mime.h>
-+
-+#define INFOP(fmt, args...) printk(KERN_INFO "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#if 0
-+#define DEBUGP(fmt, args...) printk(KERN_DEBUG "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#else
-+#define DEBUGP(fmt, args...)
-+#endif
-+
-+#define MAX_PORTS 8
-+#define DSTACT_AUTO 0
-+#define DSTACT_STRIP 1
-+#define DSTACT_NONE 2
-+
-+static char* stunaddr = NULL;
-+static char* destaction = NULL;
-+
-+static u_int32_t extip = 0;
-+static int dstact = 0;
-+
-+MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
-+MODULE_DESCRIPTION("RTSP network address translation module");
-+MODULE_LICENSE("GPL");
-+module_param(stunaddr, charp, 0644);
-+MODULE_PARM_DESC(stunaddr, "Address for detecting STUN");
-+module_param(destaction, charp, 0644);
-+MODULE_PARM_DESC(destaction, "Action for destination parameter (auto/strip/none)");
-+
-+#define SKIP_WSPACE(ptr,len,off) while(off < len && isspace(*(ptr+off))) { off++; }
-+
-+/*** helper functions ***/
-+
-+static void
-+get_skb_tcpdata(struct sk_buff* skb, char** pptcpdata, uint* ptcpdatalen)
-+{
-+ struct iphdr* iph = ip_hdr(skb);
-+ struct tcphdr* tcph = (void *)iph + ip_hdrlen(skb);
-+
-+ *pptcpdata = (char*)tcph + tcph->doff*4;
-+ *ptcpdatalen = ((char*)skb_transport_header(skb) + skb->len) - *pptcpdata;
-+}
-+
-+/*** nat functions ***/
-+
-+/*
-+ * Mangle the "Transport:" header:
-+ * - Replace all occurences of "client_port=<spec>"
-+ * - Handle destination parameter
-+ *
-+ * In:
-+ * ct, ctinfo = conntrack context
-+ * skb = packet
-+ * tranoff = Transport header offset from TCP data
-+ * tranlen = Transport header length (incl. CRLF)
-+ * rport_lo = replacement low port (host endian)
-+ * rport_hi = replacement high port (host endian)
-+ *
-+ * Returns packet size difference.
-+ *
-+ * Assumes that a complete transport header is present, ending with CR or LF
-+ */
-+static int
-+rtsp_mangle_tran(enum ip_conntrack_info ctinfo,
-+ struct nf_conntrack_expect* exp,
-+ struct ip_ct_rtsp_expect* prtspexp,
-+ struct sk_buff* skb, uint tranoff, uint tranlen)
-+{
-+ char* ptcp;
-+ uint tcplen;
-+ char* ptran;
-+ char rbuf1[16]; /* Replacement buffer (one port) */
-+ uint rbuf1len; /* Replacement len (one port) */
-+ char rbufa[16]; /* Replacement buffer (all ports) */
-+ uint rbufalen; /* Replacement len (all ports) */
-+ u_int32_t newip;
-+ u_int16_t loport, hiport;
-+ uint off = 0;
-+ uint diff; /* Number of bytes we removed */
-+
-+ struct nf_conn *ct = exp->master;
-+ struct nf_conntrack_tuple *t;
-+
-+ char szextaddr[15+1];
-+ uint extaddrlen;
-+ int is_stun;
-+
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ ptran = ptcp+tranoff;
-+
-+ if (tranoff+tranlen > tcplen || tcplen-tranoff < tranlen ||
-+ tranlen < 10 || !iseol(ptran[tranlen-1]) ||
-+ nf_strncasecmp(ptran, "Transport:", 10) != 0)
-+ {
-+ INFOP("sanity check failed\n");
-+ return 0;
-+ }
-+ off += 10;
-+ SKIP_WSPACE(ptcp+tranoff, tranlen, off);
-+
-+ newip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip;
-+ t = &exp->tuple;
-+ t->dst.u3.ip = newip;
-+
-+ extaddrlen = extip ? sprintf(szextaddr, "%u.%u.%u.%u", NIPQUAD(extip))
-+ : sprintf(szextaddr, "%u.%u.%u.%u", NIPQUAD(newip));
-+ DEBUGP("stunaddr=%s (%s)\n", szextaddr, (extip?"forced":"auto"));
-+
-+ rbuf1len = rbufalen = 0;
-+ switch (prtspexp->pbtype)
-+ {
-+ case pb_single:
-+ for (loport = prtspexp->loport; loport != 0; loport++) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(loport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ DEBUGP("using port %hu\n", loport);
-+ break;
-+ }
-+ }
-+ if (loport != 0)
-+ {
-+ rbuf1len = sprintf(rbuf1, "%hu", loport);
-+ rbufalen = sprintf(rbufa, "%hu", loport);
-+ }
-+ break;
-+ case pb_range:
-+ for (loport = prtspexp->loport; loport != 0; loport += 2) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(loport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ hiport = loport + ~exp->mask.src.u.udp.port;
-+ DEBUGP("using ports %hu-%hu\n", loport, hiport);
-+ break;
-+ }
-+ }
-+ if (loport != 0)
-+ {
-+ rbuf1len = sprintf(rbuf1, "%hu", loport);
-+ rbufalen = sprintf(rbufa, "%hu-%hu", loport, loport+1);
-+ }
-+ break;
-+ case pb_discon:
-+ for (loport = prtspexp->loport; loport != 0; loport++) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(loport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ DEBUGP("using port %hu (1 of 2)\n", loport);
-+ break;
-+ }
-+ }
-+ for (hiport = prtspexp->hiport; hiport != 0; hiport++) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(hiport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ DEBUGP("using port %hu (2 of 2)\n", hiport);
-+ break;
-+ }
-+ }
-+ if (loport != 0 && hiport != 0)
-+ {
-+ rbuf1len = sprintf(rbuf1, "%hu", loport);
-+ if (hiport == loport+1)
-+ {
-+ rbufalen = sprintf(rbufa, "%hu-%hu", loport, hiport);
-+ }
-+ else
-+ {
-+ rbufalen = sprintf(rbufa, "%hu/%hu", loport, hiport);
-+ }
-+ }
-+ break;
-+ }
-+
-+ if (rbuf1len == 0)
-+ {
-+ return 0; /* cannot get replacement port(s) */
-+ }
-+
-+ /* Transport: tran;field;field=val,tran;field;field=val,... */
-+ while (off < tranlen)
-+ {
-+ uint saveoff;
-+ const char* pparamend;
-+ uint nextparamoff;
-+
-+ pparamend = memchr(ptran+off, ',', tranlen-off);
-+ pparamend = (pparamend == NULL) ? ptran+tranlen : pparamend+1;
-+ nextparamoff = pparamend-ptcp;
-+
-+ /*
-+ * We pass over each param twice. On the first pass, we look for a
-+ * destination= field. It is handled by the security policy. If it
-+ * is present, allowed, and equal to our external address, we assume
-+ * that STUN is being used and we leave the client_port= field alone.
-+ */
-+ is_stun = 0;
-+ saveoff = off;
-+ while (off < nextparamoff)
-+ {
-+ const char* pfieldend;
-+ uint nextfieldoff;
-+
-+ pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+ nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+ if (dstact != DSTACT_NONE && strncmp(ptran+off, "destination=", 12) == 0)
-+ {
-+ if (strncmp(ptran+off+12, szextaddr, extaddrlen) == 0)
-+ {
-+ is_stun = 1;
-+ }
-+ if (dstact == DSTACT_STRIP || (dstact == DSTACT_AUTO && !is_stun))
-+ {
-+ diff = nextfieldoff-off;
-+ if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
-+ off, diff, NULL, 0))
-+ {
-+ /* mangle failed, all we can do is bail */
-+ nf_ct_unexpect_related(exp);
-+ return 0;
-+ }
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ ptran = ptcp+tranoff;
-+ tranlen -= diff;
-+ nextparamoff -= diff;
-+ nextfieldoff -= diff;
-+ }
-+ }
-+
-+ off = nextfieldoff;
-+ }
-+ if (is_stun)
-+ {
-+ continue;
-+ }
-+ off = saveoff;
-+ while (off < nextparamoff)
-+ {
-+ const char* pfieldend;
-+ uint nextfieldoff;
-+
-+ pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+ nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+ if (strncmp(ptran+off, "client_port=", 12) == 0)
-+ {
-+ u_int16_t port;
-+ uint numlen;
-+ uint origoff;
-+ uint origlen;
-+ char* rbuf = rbuf1;
-+ uint rbuflen = rbuf1len;
-+
-+ off += 12;
-+ origoff = (ptran-ptcp)+off;
-+ origlen = 0;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ origlen += numlen;
-+ if (port != prtspexp->loport)
-+ {
-+ DEBUGP("multiple ports found, port %hu ignored\n", port);
-+ }
-+ else
-+ {
-+ if (ptran[off] == '-' || ptran[off] == '/')
-+ {
-+ off++;
-+ origlen++;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ origlen += numlen;
-+ rbuf = rbufa;
-+ rbuflen = rbufalen;
-+ }
-+
-+ /*
-+ * note we cannot just memcpy() if the sizes are the same.
-+ * the mangle function does skb resizing, checks for a
-+ * cloned skb, and updates the checksums.
-+ *
-+ * parameter 4 below is offset from start of tcp data.
-+ */
-+ diff = origlen-rbuflen;
-+ if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
-+ origoff, origlen, rbuf, rbuflen))
-+ {
-+ /* mangle failed, all we can do is bail */
-+ nf_ct_unexpect_related(exp);
-+ return 0;
-+ }
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ ptran = ptcp+tranoff;
-+ tranlen -= diff;
-+ nextparamoff -= diff;
-+ nextfieldoff -= diff;
-+ }
-+ }
-+
-+ off = nextfieldoff;
-+ }
-+
-+ off = nextparamoff;
-+ }
-+
-+ return 1;
-+}
-+
-+static uint
-+help_out(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen, struct ip_ct_rtsp_expect* prtspexp,
-+ struct nf_conntrack_expect* exp)
-+{
-+ char* ptcp;
-+ uint tcplen;
-+ uint hdrsoff;
-+ uint hdrslen;
-+ uint lineoff;
-+ uint linelen;
-+ uint off;
-+
-+ //struct iphdr* iph = (struct iphdr*)skb->nh.iph;
-+ //struct tcphdr* tcph = (struct tcphdr*)((void*)iph + iph->ihl*4);
-+
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ hdrsoff = matchoff;//exp->seq - ntohl(tcph->seq);
-+ hdrslen = matchlen;
-+ off = hdrsoff;
-+ DEBUGP("NAT rtsp help_out\n");
-+
-+ while (nf_mime_nextline(ptcp, hdrsoff+hdrslen, &off, &lineoff, &linelen))
-+ {
-+ if (linelen == 0)
-+ {
-+ break;
-+ }
-+ if (off > hdrsoff+hdrslen)
-+ {
-+ INFOP("!! overrun !!");
-+ break;
-+ }
-+ DEBUGP("hdr: len=%u, %.*s", linelen, (int)linelen, ptcp+lineoff);
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0)
-+ {
-+ uint oldtcplen = tcplen;
-+ DEBUGP("hdr: Transport\n");
-+ if (!rtsp_mangle_tran(ctinfo, exp, prtspexp, skb, lineoff, linelen))
-+ {
-+ DEBUGP("hdr: Transport mangle failed");
-+ break;
-+ }
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ hdrslen -= (oldtcplen-tcplen);
-+ off -= (oldtcplen-tcplen);
-+ lineoff -= (oldtcplen-tcplen);
-+ linelen -= (oldtcplen-tcplen);
-+ DEBUGP("rep: len=%u, %.*s", linelen, (int)linelen, ptcp+lineoff);
-+ }
-+ }
-+
-+ return NF_ACCEPT;
-+}
-+
-+static unsigned int
-+help(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen, struct ip_ct_rtsp_expect* prtspexp,
-+ struct nf_conntrack_expect* exp)
-+{
-+ int dir = CTINFO2DIR(ctinfo);
-+ int rc = NF_ACCEPT;
-+
-+ switch (dir)
-+ {
-+ case IP_CT_DIR_ORIGINAL:
-+ rc = help_out(skb, ctinfo, matchoff, matchlen, prtspexp, exp);
-+ break;
-+ case IP_CT_DIR_REPLY:
-+ DEBUGP("unmangle ! %u\n", ctinfo);
-+ /* XXX: unmangle */
-+ rc = NF_ACCEPT;
-+ break;
-+ }
-+ //UNLOCK_BH(&ip_rtsp_lock);
-+
-+ return rc;
-+}
-+
-+static void expected(struct nf_conn* ct, struct nf_conntrack_expect *exp)
-+{
-+ struct nf_nat_multi_range_compat mr;
-+ u_int32_t newdstip, newsrcip, newip;
-+
-+ struct nf_conn *master = ct->master;
-+
-+ newdstip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+ newsrcip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+ //FIXME (how to port that ?)
-+ //code from 2.4 : newip = (HOOK2MANIP(hooknum) == IP_NAT_MANIP_SRC) ? newsrcip : newdstip;
-+ newip = newdstip;
-+
-+ DEBUGP("newsrcip=%u.%u.%u.%u, newdstip=%u.%u.%u.%u, newip=%u.%u.%u.%u\n",
-+ NIPQUAD(newsrcip), NIPQUAD(newdstip), NIPQUAD(newip));
-+
-+ mr.rangesize = 1;
-+ // We don't want to manip the per-protocol, just the IPs.
-+ mr.range[0].flags = IP_NAT_RANGE_MAP_IPS;
-+ mr.range[0].min_ip = mr.range[0].max_ip = newip;
-+
-+ nf_nat_setup_info(ct, &mr.range[0], IP_NAT_MANIP_DST);
-+}
-+
-+
-+static void __exit fini(void)
-+{
-+ nf_nat_rtsp_hook = NULL;
-+ nf_nat_rtsp_hook_expectfn = NULL;
-+ synchronize_net();
-+}
-+
-+static int __init init(void)
-+{
-+ printk("nf_nat_rtsp v" IP_NF_RTSP_VERSION " loading\n");
-+
-+ BUG_ON(nf_nat_rtsp_hook);
-+ nf_nat_rtsp_hook = help;
-+ nf_nat_rtsp_hook_expectfn = &expected;
-+
-+ if (stunaddr != NULL)
-+ extip = in_aton(stunaddr);
-+
-+ if (destaction != NULL) {
-+ if (strcmp(destaction, "auto") == 0)
-+ dstact = DSTACT_AUTO;
-+
-+ if (strcmp(destaction, "strip") == 0)
-+ dstact = DSTACT_STRIP;
-+
-+ if (strcmp(destaction, "none") == 0)
-+ dstact = DSTACT_NONE;
-+ }
-+
-+ return 0;
-+}
-+
-+module_init(init);
-+module_exit(fini);
+++ /dev/null
---- a/include/linux/pkt_sched.h
-+++ b/include/linux/pkt_sched.h
-@@ -162,8 +162,37 @@ struct tc_sfq_xstats
- *
- * The only reason for this is efficiency, it is possible
- * to change these parameters in compile time.
-+ *
-+ * If you need to play with these values, use esfq instead.
- */
-
-+/* ESFQ section */
-+
-+enum
-+{
-+ /* traditional */
-+ TCA_SFQ_HASH_CLASSIC,
-+ TCA_SFQ_HASH_DST,
-+ TCA_SFQ_HASH_SRC,
-+ TCA_SFQ_HASH_FWMARK,
-+ /* conntrack */
-+ TCA_SFQ_HASH_CTORIGDST,
-+ TCA_SFQ_HASH_CTORIGSRC,
-+ TCA_SFQ_HASH_CTREPLDST,
-+ TCA_SFQ_HASH_CTREPLSRC,
-+ TCA_SFQ_HASH_CTNATCHG,
-+};
-+
-+struct tc_esfq_qopt
-+{
-+ unsigned quantum; /* Bytes per round allocated to flow */
-+ int perturb_period; /* Period of hash perturbation */
-+ __u32 limit; /* Maximal packets in queue */
-+ unsigned divisor; /* Hash divisor */
-+ unsigned flows; /* Maximal number of flows */
-+ unsigned hash_kind; /* Hash function to use for flow identification */
-+};
-+
- /* RED section */
-
- enum
---- a/net/sched/Kconfig
-+++ b/net/sched/Kconfig
-@@ -139,6 +139,37 @@ config NET_SCH_SFQ
- To compile this code as a module, choose M here: the
- module will be called sch_sfq.
-
-+config NET_SCH_ESFQ
-+ tristate "Enhanced Stochastic Fairness Queueing (ESFQ)"
-+ ---help---
-+ Say Y here if you want to use the Enhanced Stochastic Fairness
-+ Queueing (ESFQ) packet scheduling algorithm for some of your network
-+ devices or as a leaf discipline for a classful qdisc such as HTB or
-+ CBQ (see the top of <file:net/sched/sch_esfq.c> for details and
-+ references to the SFQ algorithm).
-+
-+ This is an enchanced SFQ version which allows you to control some
-+ hardcoded values in the SFQ scheduler.
-+
-+ ESFQ also adds control of the hash function used to identify packet
-+ flows. The original SFQ discipline hashes by connection; ESFQ add
-+ several other hashing methods, such as by src IP or by dst IP, which
-+ can be more fair to users in some networking situations.
-+
-+ To compile this code as a module, choose M here: the
-+ module will be called sch_esfq.
-+
-+config NET_SCH_ESFQ_NFCT
-+ bool "Connection Tracking Hash Types"
-+ depends on NET_SCH_ESFQ && NF_CONNTRACK
-+ ---help---
-+ Say Y here to enable support for hashing based on netfilter connection
-+ tracking information. This is useful for a router that is also using
-+ NAT to connect privately-addressed hosts to the Internet. If you want
-+ to provide fair distribution of upstream bandwidth, ESFQ must use
-+ connection tracking information, since all outgoing packets will share
-+ the same source address.
-+
- config NET_SCH_TEQL
- tristate "True Link Equalizer (TEQL)"
- ---help---
---- a/net/sched/Makefile
-+++ b/net/sched/Makefile
-@@ -23,6 +23,7 @@ obj-$(CONFIG_NET_SCH_GRED) += sch_gred.o
- obj-$(CONFIG_NET_SCH_INGRESS) += sch_ingress.o
- obj-$(CONFIG_NET_SCH_DSMARK) += sch_dsmark.o
- obj-$(CONFIG_NET_SCH_SFQ) += sch_sfq.o
-+obj-$(CONFIG_NET_SCH_ESFQ) += sch_esfq.o
- obj-$(CONFIG_NET_SCH_TBF) += sch_tbf.o
- obj-$(CONFIG_NET_SCH_TEQL) += sch_teql.o
- obj-$(CONFIG_NET_SCH_PRIO) += sch_prio.o
---- /dev/null
-+++ b/net/sched/sch_esfq.c
-@@ -0,0 +1,704 @@
-+/*
-+ * net/sched/sch_esfq.c Extended Stochastic Fairness Queueing discipline.
-+ *
-+ * 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.
-+ *
-+ * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
-+ *
-+ * Changes: Alexander Atanasov, <alex@ssi.bg>
-+ * Added dynamic depth,limit,divisor,hash_kind options.
-+ * Added dst and src hashes.
-+ *
-+ * Alexander Clouter, <alex@digriz.org.uk>
-+ * Ported ESFQ to Linux 2.6.
-+ *
-+ * Corey Hickey, <bugfood-c@fatooh.org>
-+ * Maintenance of the Linux 2.6 port.
-+ * Added fwmark hash (thanks to Robert Kurjata).
-+ * Added usage of jhash.
-+ * Added conntrack support.
-+ * Added ctnatchg hash (thanks to Ben Pfountz).
-+ */
-+
-+#include <linux/module.h>
-+#include <asm/uaccess.h>
-+#include <asm/system.h>
-+#include <linux/bitops.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/jiffies.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/socket.h>
-+#include <linux/sockios.h>
-+#include <linux/in.h>
-+#include <linux/errno.h>
-+#include <linux/interrupt.h>
-+#include <linux/if_ether.h>
-+#include <linux/inet.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/notifier.h>
-+#include <linux/init.h>
-+#include <net/ip.h>
-+#include <linux/ipv6.h>
-+#include <net/route.h>
-+#include <linux/skbuff.h>
-+#include <net/sock.h>
-+#include <net/pkt_sched.h>
-+#include <linux/jhash.h>
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+#include <net/netfilter/nf_conntrack.h>
-+#endif
-+
-+/* Stochastic Fairness Queuing algorithm.
-+ For more comments look at sch_sfq.c.
-+ The difference is that you can change limit, depth,
-+ hash table size and choose alternate hash types.
-+
-+ classic: same as in sch_sfq.c
-+ dst: destination IP address
-+ src: source IP address
-+ fwmark: netfilter mark value
-+ ctorigdst: original destination IP address
-+ ctorigsrc: original source IP address
-+ ctrepldst: reply destination IP address
-+ ctreplsrc: reply source IP
-+
-+*/
-+
-+#define ESFQ_HEAD 0
-+#define ESFQ_TAIL 1
-+
-+/* This type should contain at least SFQ_DEPTH*2 values */
-+typedef unsigned int esfq_index;
-+
-+struct esfq_head
-+{
-+ esfq_index next;
-+ esfq_index prev;
-+};
-+
-+struct esfq_sched_data
-+{
-+/* Parameters */
-+ int perturb_period;
-+ unsigned quantum; /* Allotment per round: MUST BE >= MTU */
-+ int limit;
-+ unsigned depth;
-+ unsigned hash_divisor;
-+ unsigned hash_kind;
-+/* Variables */
-+ struct timer_list perturb_timer;
-+ int perturbation;
-+ esfq_index tail; /* Index of current slot in round */
-+ esfq_index max_depth; /* Maximal depth */
-+
-+ esfq_index *ht; /* Hash table */
-+ esfq_index *next; /* Active slots link */
-+ short *allot; /* Current allotment per slot */
-+ unsigned short *hash; /* Hash value indexed by slots */
-+ struct sk_buff_head *qs; /* Slot queue */
-+ struct esfq_head *dep; /* Linked list of slots, indexed by depth */
-+};
-+
-+/* This contains the info we will hash. */
-+struct esfq_packet_info
-+{
-+ u32 proto; /* protocol or port */
-+ u32 src; /* source from packet header */
-+ u32 dst; /* destination from packet header */
-+ u32 ctorigsrc; /* original source from conntrack */
-+ u32 ctorigdst; /* original destination from conntrack */
-+ u32 ctreplsrc; /* reply source from conntrack */
-+ u32 ctrepldst; /* reply destination from conntrack */
-+ u32 mark; /* netfilter mark (fwmark) */
-+};
-+
-+static __inline__ unsigned esfq_jhash_1word(struct esfq_sched_data *q,u32 a)
-+{
-+ return jhash_1word(a, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static __inline__ unsigned esfq_jhash_2words(struct esfq_sched_data *q, u32 a, u32 b)
-+{
-+ return jhash_2words(a, b, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static __inline__ unsigned esfq_jhash_3words(struct esfq_sched_data *q, u32 a, u32 b, u32 c)
-+{
-+ return jhash_3words(a, b, c, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static unsigned esfq_hash(struct esfq_sched_data *q, struct sk_buff *skb)
-+{
-+ struct esfq_packet_info info;
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+ enum ip_conntrack_info ctinfo;
-+ struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
-+#endif
-+
-+ switch (skb->protocol) {
-+ case __constant_htons(ETH_P_IP):
-+ {
-+ struct iphdr *iph = ip_hdr(skb);
-+ info.dst = iph->daddr;
-+ info.src = iph->saddr;
-+ if (!(iph->frag_off&htons(IP_MF|IP_OFFSET)) &&
-+ (iph->protocol == IPPROTO_TCP ||
-+ iph->protocol == IPPROTO_UDP ||
-+ iph->protocol == IPPROTO_SCTP ||
-+ iph->protocol == IPPROTO_DCCP ||
-+ iph->protocol == IPPROTO_ESP))
-+ info.proto = *(((u32*)iph) + iph->ihl);
-+ else
-+ info.proto = iph->protocol;
-+ break;
-+ }
-+ case __constant_htons(ETH_P_IPV6):
-+ {
-+ struct ipv6hdr *iph = ipv6_hdr(skb);
-+ /* Hash ipv6 addresses into a u32. This isn't ideal,
-+ * but the code is simple. */
-+ info.dst = jhash2(iph->daddr.s6_addr32, 4, q->perturbation);
-+ info.src = jhash2(iph->saddr.s6_addr32, 4, q->perturbation);
-+ if (iph->nexthdr == IPPROTO_TCP ||
-+ iph->nexthdr == IPPROTO_UDP ||
-+ iph->nexthdr == IPPROTO_SCTP ||
-+ iph->nexthdr == IPPROTO_DCCP ||
-+ iph->nexthdr == IPPROTO_ESP)
-+ info.proto = *(u32*)&iph[1];
-+ else
-+ info.proto = iph->nexthdr;
-+ break;
-+ }
-+ default:
-+ info.dst = (u32)(unsigned long)skb->dst;
-+ info.src = (u32)(unsigned long)skb->sk;
-+ info.proto = skb->protocol;
-+ }
-+
-+ info.mark = skb->mark;
-+
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+ /* defaults if there is no conntrack info */
-+ info.ctorigsrc = info.src;
-+ info.ctorigdst = info.dst;
-+ info.ctreplsrc = info.dst;
-+ info.ctrepldst = info.src;
-+ /* collect conntrack info */
-+ if (ct && ct != &nf_conntrack_untracked) {
-+ if (skb->protocol == __constant_htons(ETH_P_IP)) {
-+ info.ctorigsrc = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+ info.ctorigdst = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip;
-+ info.ctreplsrc = ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip;
-+ info.ctrepldst = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip;
-+ }
-+ else if (skb->protocol == __constant_htons(ETH_P_IPV6)) {
-+ /* Again, hash ipv6 addresses into a single u32. */
-+ info.ctorigsrc = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip6, 4, q->perturbation);
-+ info.ctorigdst = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip6, 4, q->perturbation);
-+ info.ctreplsrc = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip6, 4, q->perturbation);
-+ info.ctrepldst = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip6, 4, q->perturbation);
-+ }
-+
-+ }
-+#endif
-+
-+ switch(q->hash_kind) {
-+ case TCA_SFQ_HASH_CLASSIC:
-+ return esfq_jhash_3words(q, info.dst, info.src, info.proto);
-+ case TCA_SFQ_HASH_DST:
-+ return esfq_jhash_1word(q, info.dst);
-+ case TCA_SFQ_HASH_SRC:
-+ return esfq_jhash_1word(q, info.src);
-+ case TCA_SFQ_HASH_FWMARK:
-+ return esfq_jhash_1word(q, info.mark);
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+ case TCA_SFQ_HASH_CTORIGDST:
-+ return esfq_jhash_1word(q, info.ctorigdst);
-+ case TCA_SFQ_HASH_CTORIGSRC:
-+ return esfq_jhash_1word(q, info.ctorigsrc);
-+ case TCA_SFQ_HASH_CTREPLDST:
-+ return esfq_jhash_1word(q, info.ctrepldst);
-+ case TCA_SFQ_HASH_CTREPLSRC:
-+ return esfq_jhash_1word(q, info.ctreplsrc);
-+ case TCA_SFQ_HASH_CTNATCHG:
-+ {
-+ if (info.ctorigdst == info.ctreplsrc)
-+ return esfq_jhash_1word(q, info.ctorigsrc);
-+ return esfq_jhash_1word(q, info.ctreplsrc);
-+ }
-+#endif
-+ default:
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "ESFQ: Unknown hash method. Falling back to classic.\n");
-+ }
-+ return esfq_jhash_3words(q, info.dst, info.src, info.proto);
-+}
-+
-+static inline void esfq_link(struct esfq_sched_data *q, esfq_index x)
-+{
-+ esfq_index p, n;
-+ int d = q->qs[x].qlen + q->depth;
-+
-+ p = d;
-+ n = q->dep[d].next;
-+ q->dep[x].next = n;
-+ q->dep[x].prev = p;
-+ q->dep[p].next = q->dep[n].prev = x;
-+}
-+
-+static inline void esfq_dec(struct esfq_sched_data *q, esfq_index x)
-+{
-+ esfq_index p, n;
-+
-+ n = q->dep[x].next;
-+ p = q->dep[x].prev;
-+ q->dep[p].next = n;
-+ q->dep[n].prev = p;
-+
-+ if (n == p && q->max_depth == q->qs[x].qlen + 1)
-+ q->max_depth--;
-+
-+ esfq_link(q, x);
-+}
-+
-+static inline void esfq_inc(struct esfq_sched_data *q, esfq_index x)
-+{
-+ esfq_index p, n;
-+ int d;
-+
-+ n = q->dep[x].next;
-+ p = q->dep[x].prev;
-+ q->dep[p].next = n;
-+ q->dep[n].prev = p;
-+ d = q->qs[x].qlen;
-+ if (q->max_depth < d)
-+ q->max_depth = d;
-+
-+ esfq_link(q, x);
-+}
-+
-+static unsigned int esfq_drop(struct Qdisc *sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_index d = q->max_depth;
-+ struct sk_buff *skb;
-+ unsigned int len;
-+
-+ /* Queue is full! Find the longest slot and
-+ drop a packet from it */
-+
-+ if (d > 1) {
-+ esfq_index x = q->dep[d+q->depth].next;
-+ skb = q->qs[x].prev;
-+ len = skb->len;
-+ __skb_unlink(skb, &q->qs[x]);
-+ kfree_skb(skb);
-+ esfq_dec(q, x);
-+ sch->q.qlen--;
-+ sch->qstats.drops++;
-+ sch->qstats.backlog -= len;
-+ return len;
-+ }
-+
-+ if (d == 1) {
-+ /* It is difficult to believe, but ALL THE SLOTS HAVE LENGTH 1. */
-+ d = q->next[q->tail];
-+ q->next[q->tail] = q->next[d];
-+ q->allot[q->next[d]] += q->quantum;
-+ skb = q->qs[d].prev;
-+ len = skb->len;
-+ __skb_unlink(skb, &q->qs[d]);
-+ kfree_skb(skb);
-+ esfq_dec(q, d);
-+ sch->q.qlen--;
-+ q->ht[q->hash[d]] = q->depth;
-+ sch->qstats.drops++;
-+ sch->qstats.backlog -= len;
-+ return len;
-+ }
-+
-+ return 0;
-+}
-+
-+static void esfq_q_enqueue(struct sk_buff *skb, struct esfq_sched_data *q, unsigned int end)
-+{
-+ unsigned hash = esfq_hash(q, skb);
-+ unsigned depth = q->depth;
-+ esfq_index x;
-+
-+ x = q->ht[hash];
-+ if (x == depth) {
-+ q->ht[hash] = x = q->dep[depth].next;
-+ q->hash[x] = hash;
-+ }
-+
-+ if (end == ESFQ_TAIL)
-+ __skb_queue_tail(&q->qs[x], skb);
-+ else
-+ __skb_queue_head(&q->qs[x], skb);
-+
-+ esfq_inc(q, x);
-+ if (q->qs[x].qlen == 1) { /* The flow is new */
-+ if (q->tail == depth) { /* It is the first flow */
-+ q->tail = x;
-+ q->next[x] = x;
-+ q->allot[x] = q->quantum;
-+ } else {
-+ q->next[x] = q->next[q->tail];
-+ q->next[q->tail] = x;
-+ q->tail = x;
-+ }
-+ }
-+}
-+
-+static int esfq_enqueue(struct sk_buff *skb, struct Qdisc* sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_q_enqueue(skb, q, ESFQ_TAIL);
-+ sch->qstats.backlog += skb->len;
-+ if (++sch->q.qlen < q->limit-1) {
-+ sch->bstats.bytes += skb->len;
-+ sch->bstats.packets++;
-+ return 0;
-+ }
-+
-+ sch->qstats.drops++;
-+ esfq_drop(sch);
-+ return NET_XMIT_CN;
-+}
-+
-+
-+static int esfq_requeue(struct sk_buff *skb, struct Qdisc* sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_q_enqueue(skb, q, ESFQ_HEAD);
-+ sch->qstats.backlog += skb->len;
-+ if (++sch->q.qlen < q->limit - 1) {
-+ sch->qstats.requeues++;
-+ return 0;
-+ }
-+
-+ sch->qstats.drops++;
-+ esfq_drop(sch);
-+ return NET_XMIT_CN;
-+}
-+
-+static struct sk_buff *esfq_q_dequeue(struct esfq_sched_data *q)
-+{
-+ struct sk_buff *skb;
-+ unsigned depth = q->depth;
-+ esfq_index a, old_a;
-+
-+ /* No active slots */
-+ if (q->tail == depth)
-+ return NULL;
-+
-+ a = old_a = q->next[q->tail];
-+
-+ /* Grab packet */
-+ skb = __skb_dequeue(&q->qs[a]);
-+ esfq_dec(q, a);
-+
-+ /* Is the slot empty? */
-+ if (q->qs[a].qlen == 0) {
-+ q->ht[q->hash[a]] = depth;
-+ a = q->next[a];
-+ if (a == old_a) {
-+ q->tail = depth;
-+ return skb;
-+ }
-+ q->next[q->tail] = a;
-+ q->allot[a] += q->quantum;
-+ } else if ((q->allot[a] -= skb->len) <= 0) {
-+ q->tail = a;
-+ a = q->next[a];
-+ q->allot[a] += q->quantum;
-+ }
-+
-+ return skb;
-+}
-+
-+static struct sk_buff *esfq_dequeue(struct Qdisc* sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ struct sk_buff *skb;
-+
-+ skb = esfq_q_dequeue(q);
-+ if (skb == NULL)
-+ return NULL;
-+ sch->q.qlen--;
-+ sch->qstats.backlog -= skb->len;
-+ return skb;
-+}
-+
-+static void esfq_q_destroy(struct esfq_sched_data *q)
-+{
-+ del_timer(&q->perturb_timer);
-+ if(q->ht)
-+ kfree(q->ht);
-+ if(q->dep)
-+ kfree(q->dep);
-+ if(q->next)
-+ kfree(q->next);
-+ if(q->allot)
-+ kfree(q->allot);
-+ if(q->hash)
-+ kfree(q->hash);
-+ if(q->qs)
-+ kfree(q->qs);
-+}
-+
-+static void esfq_destroy(struct Qdisc *sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_q_destroy(q);
-+}
-+
-+
-+static void esfq_reset(struct Qdisc* sch)
-+{
-+ struct sk_buff *skb;
-+
-+ while ((skb = esfq_dequeue(sch)) != NULL)
-+ kfree_skb(skb);
-+}
-+
-+static void esfq_perturbation(unsigned long arg)
-+{
-+ struct Qdisc *sch = (struct Qdisc*)arg;
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+
-+ q->perturbation = net_random()&0x1F;
-+
-+ if (q->perturb_period) {
-+ q->perturb_timer.expires = jiffies + q->perturb_period;
-+ add_timer(&q->perturb_timer);
-+ }
-+}
-+
-+static unsigned int esfq_check_hash(unsigned int kind)
-+{
-+ switch (kind) {
-+ case TCA_SFQ_HASH_CTORIGDST:
-+ case TCA_SFQ_HASH_CTORIGSRC:
-+ case TCA_SFQ_HASH_CTREPLDST:
-+ case TCA_SFQ_HASH_CTREPLSRC:
-+ case TCA_SFQ_HASH_CTNATCHG:
-+#ifndef CONFIG_NET_SCH_ESFQ_NFCT
-+ {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "ESFQ: Conntrack hash types disabled in kernel config. Falling back to classic.\n");
-+ return TCA_SFQ_HASH_CLASSIC;
-+ }
-+#endif
-+ case TCA_SFQ_HASH_CLASSIC:
-+ case TCA_SFQ_HASH_DST:
-+ case TCA_SFQ_HASH_SRC:
-+ case TCA_SFQ_HASH_FWMARK:
-+ return kind;
-+ default:
-+ {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "ESFQ: Unknown hash type. Falling back to classic.\n");
-+ return TCA_SFQ_HASH_CLASSIC;
-+ }
-+ }
-+}
-+
-+static int esfq_q_init(struct esfq_sched_data *q, struct rtattr *opt)
-+{
-+ struct tc_esfq_qopt *ctl = RTA_DATA(opt);
-+ esfq_index p = ~0U/2;
-+ int i;
-+
-+ if (opt && opt->rta_len < RTA_LENGTH(sizeof(*ctl)))
-+ return -EINVAL;
-+
-+ q->perturbation = 0;
-+ q->hash_kind = TCA_SFQ_HASH_CLASSIC;
-+ q->max_depth = 0;
-+ if (opt == NULL) {
-+ q->perturb_period = 0;
-+ q->hash_divisor = 1024;
-+ q->tail = q->limit = q->depth = 128;
-+
-+ } else {
-+ struct tc_esfq_qopt *ctl = RTA_DATA(opt);
-+ if (ctl->quantum)
-+ q->quantum = ctl->quantum;
-+ q->perturb_period = ctl->perturb_period*HZ;
-+ q->hash_divisor = ctl->divisor ? : 1024;
-+ q->tail = q->limit = q->depth = ctl->flows ? : 128;
-+
-+ if ( q->depth > p - 1 )
-+ return -EINVAL;
-+
-+ if (ctl->limit)
-+ q->limit = min_t(u32, ctl->limit, q->depth);
-+
-+ if (ctl->hash_kind) {
-+ q->hash_kind = esfq_check_hash(ctl->hash_kind);
-+ }
-+ }
-+
-+ q->ht = kmalloc(q->hash_divisor*sizeof(esfq_index), GFP_KERNEL);
-+ if (!q->ht)
-+ goto err_case;
-+ q->dep = kmalloc((1+q->depth*2)*sizeof(struct esfq_head), GFP_KERNEL);
-+ if (!q->dep)
-+ goto err_case;
-+ q->next = kmalloc(q->depth*sizeof(esfq_index), GFP_KERNEL);
-+ if (!q->next)
-+ goto err_case;
-+ q->allot = kmalloc(q->depth*sizeof(short), GFP_KERNEL);
-+ if (!q->allot)
-+ goto err_case;
-+ q->hash = kmalloc(q->depth*sizeof(unsigned short), GFP_KERNEL);
-+ if (!q->hash)
-+ goto err_case;
-+ q->qs = kmalloc(q->depth*sizeof(struct sk_buff_head), GFP_KERNEL);
-+ if (!q->qs)
-+ goto err_case;
-+
-+ for (i=0; i< q->hash_divisor; i++)
-+ q->ht[i] = q->depth;
-+ for (i=0; i<q->depth; i++) {
-+ skb_queue_head_init(&q->qs[i]);
-+ q->dep[i+q->depth].next = i+q->depth;
-+ q->dep[i+q->depth].prev = i+q->depth;
-+ }
-+
-+ for (i=0; i<q->depth; i++)
-+ esfq_link(q, i);
-+ return 0;
-+err_case:
-+ esfq_q_destroy(q);
-+ return -ENOBUFS;
-+}
-+
-+static int esfq_init(struct Qdisc *sch, struct rtattr *opt)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ int err;
-+
-+ q->quantum = psched_mtu(sch->dev); /* default */
-+ if ((err = esfq_q_init(q, opt)))
-+ return err;
-+
-+ init_timer(&q->perturb_timer);
-+ q->perturb_timer.data = (unsigned long)sch;
-+ q->perturb_timer.function = esfq_perturbation;
-+ if (q->perturb_period) {
-+ q->perturb_timer.expires = jiffies + q->perturb_period;
-+ add_timer(&q->perturb_timer);
-+ }
-+
-+ return 0;
-+}
-+
-+static int esfq_change(struct Qdisc *sch, struct rtattr *opt)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ struct esfq_sched_data new;
-+ struct sk_buff *skb;
-+ int err;
-+
-+ /* set up new queue */
-+ memset(&new, 0, sizeof(struct esfq_sched_data));
-+ new.quantum = psched_mtu(sch->dev); /* default */
-+ if ((err = esfq_q_init(&new, opt)))
-+ return err;
-+
-+ /* copy all packets from the old queue to the new queue */
-+ sch_tree_lock(sch);
-+ while ((skb = esfq_q_dequeue(q)) != NULL)
-+ esfq_q_enqueue(skb, &new, ESFQ_TAIL);
-+
-+ /* clean up the old queue */
-+ esfq_q_destroy(q);
-+
-+ /* copy elements of the new queue into the old queue */
-+ q->perturb_period = new.perturb_period;
-+ q->quantum = new.quantum;
-+ q->limit = new.limit;
-+ q->depth = new.depth;
-+ q->hash_divisor = new.hash_divisor;
-+ q->hash_kind = new.hash_kind;
-+ q->tail = new.tail;
-+ q->max_depth = new.max_depth;
-+ q->ht = new.ht;
-+ q->dep = new.dep;
-+ q->next = new.next;
-+ q->allot = new.allot;
-+ q->hash = new.hash;
-+ q->qs = new.qs;
-+
-+ /* finish up */
-+ if (q->perturb_period) {
-+ q->perturb_timer.expires = jiffies + q->perturb_period;
-+ add_timer(&q->perturb_timer);
-+ } else {
-+ q->perturbation = 0;
-+ }
-+ sch_tree_unlock(sch);
-+ return 0;
-+}
-+
-+static int esfq_dump(struct Qdisc *sch, struct sk_buff *skb)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ unsigned char *b = skb->tail;
-+ struct tc_esfq_qopt opt;
-+
-+ opt.quantum = q->quantum;
-+ opt.perturb_period = q->perturb_period/HZ;
-+
-+ opt.limit = q->limit;
-+ opt.divisor = q->hash_divisor;
-+ opt.flows = q->depth;
-+ opt.hash_kind = q->hash_kind;
-+
-+ RTA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt);
-+
-+ return skb->len;
-+
-+rtattr_failure:
-+ skb_trim(skb, b - skb->data);
-+ return -1;
-+}
-+
-+static struct Qdisc_ops esfq_qdisc_ops =
-+{
-+ .next = NULL,
-+ .cl_ops = NULL,
-+ .id = "esfq",
-+ .priv_size = sizeof(struct esfq_sched_data),
-+ .enqueue = esfq_enqueue,
-+ .dequeue = esfq_dequeue,
-+ .requeue = esfq_requeue,
-+ .drop = esfq_drop,
-+ .init = esfq_init,
-+ .reset = esfq_reset,
-+ .destroy = esfq_destroy,
-+ .change = esfq_change,
-+ .dump = esfq_dump,
-+ .owner = THIS_MODULE,
-+};
-+
-+static int __init esfq_module_init(void)
-+{
-+ return register_qdisc(&esfq_qdisc_ops);
-+}
-+static void __exit esfq_module_exit(void)
-+{
-+ unregister_qdisc(&esfq_qdisc_ops);
-+}
-+module_init(esfq_module_init)
-+module_exit(esfq_module_exit)
-+MODULE_LICENSE("GPL");
+++ /dev/null
---- a/fs/jffs2/build.c
-+++ b/fs/jffs2/build.c
-@@ -105,6 +105,17 @@ static int jffs2_build_filesystem(struct
- dbg_fsbuild("scanned flash completely\n");
- jffs2_dbg_dump_block_lists_nolock(c);
-
-+ if (c->flags & (1 << 7)) {
-+ printk("%s(): unlocking the mtd device... ", __func__);
-+ if (c->mtd->unlock)
-+ c->mtd->unlock(c->mtd, 0, c->mtd->size);
-+ printk("done.\n");
-+
-+ printk("%s(): erasing all blocks after the end marker... ", __func__);
-+ jffs2_erase_pending_blocks(c, -1);
-+ printk("done.\n");
-+ }
-+
- dbg_fsbuild("pass 1 starting\n");
- c->flags |= JFFS2_SB_FLAG_BUILDING;
- /* Now scan the directory tree, increasing nlink according to every dirent found. */
---- a/fs/jffs2/scan.c
-+++ b/fs/jffs2/scan.c
-@@ -142,9 +142,12 @@ int jffs2_scan_medium(struct jffs2_sb_in
-
- /* reset summary info for next eraseblock scan */
- jffs2_sum_reset_collected(s);
--
-- ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
-- buf_size, s);
-+
-+ if (c->flags & (1 << 7))
-+ ret = BLK_STATE_ALLFF;
-+ else
-+ ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
-+ buf_size, s);
-
- if (ret < 0)
- goto out;
-@@ -545,6 +548,17 @@ static int jffs2_scan_eraseblock (struct
- return err;
- }
-
-+ if ((buf[0] == 0xde) &&
-+ (buf[1] == 0xad) &&
-+ (buf[2] == 0xc0) &&
-+ (buf[3] == 0xde)) {
-+ /* end of filesystem. erase everything after this point */
-+ printk("%s(): End of filesystem marker found at 0x%x\n", __func__, jeb->offset);
-+ c->flags |= (1 << 7);
-+
-+ return BLK_STATE_ALLFF;
-+ }
-+
- /* We temporarily use 'ofs' as a pointer into the buffer/jeb */
- ofs = 0;
-
+++ /dev/null
---- /dev/null
-+++ b/include/asm-powerpc/segment.h
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_SEGMENT_H
-+#define _ASM_SEGMENT_H
-+
-+/* Only here because we have some old header files that expect it.. */
-+
-+#endif /* _ASM_SEGMENT_H */
+++ /dev/null
---- a/drivers/net/r8169.c
-+++ b/drivers/net/r8169.c
-@@ -1539,7 +1539,7 @@ static const struct rtl_cfg_info {
- .hw_start = rtl_hw_start_8169,
- .region = 1,
- .align = 0,
-- .intr_event = SYSErr | LinkChg | RxOverflow |
-+ .intr_event = LinkChg | RxOverflow |
- RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
- .napi_event = RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
- .msi = 0
-@@ -1548,7 +1548,7 @@ static const struct rtl_cfg_info {
- .hw_start = rtl_hw_start_8168,
- .region = 2,
- .align = 8,
-- .intr_event = SYSErr | LinkChg | RxOverflow |
-+ .intr_event = LinkChg | RxOverflow |
- TxErr | TxOK | RxOK | RxErr,
- .napi_event = TxErr | TxOK | RxOK | RxOverflow,
- .msi = RTL_FEATURE_MSI
-@@ -1557,7 +1557,7 @@ static const struct rtl_cfg_info {
- .hw_start = rtl_hw_start_8101,
- .region = 2,
- .align = 8,
-- .intr_event = SYSErr | LinkChg | RxOverflow | PCSTimeout |
-+ .intr_event = LinkChg | RxOverflow | PCSTimeout |
- RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
- .napi_event = RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
- .msi = RTL_FEATURE_MSI
-@@ -2905,10 +2905,12 @@ static irqreturn_t rtl8169_interrupt(int
- break;
- }
-
-+#if 0
- if (unlikely(status & SYSErr)) {
- rtl8169_pcierr_interrupt(dev);
- break;
- }
-+#endif
-
- if (status & LinkChg)
- rtl8169_check_link_status(dev, tp, ioaddr);
+++ /dev/null
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -1449,6 +1449,9 @@ config VXFS_FS
- To compile this as a module, choose M here: the module will be
- called freevxfs. If unsure, say N.
-
-+config MINI_FO
-+ tristate "Mini fanout overlay filesystem"
-+
- config MINIX_FS
- tristate "Minix file system support"
- depends on BLOCK
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -77,6 +77,7 @@ obj-$(CONFIG_SQUASHFS) += squashfs/
- obj-y += ramfs/
- obj-$(CONFIG_HUGETLBFS) += hugetlbfs/
- obj-$(CONFIG_CODA_FS) += coda/
-+obj-$(CONFIG_MINI_FO) += mini_fo/
- obj-$(CONFIG_MINIX_FS) += minix/
- obj-$(CONFIG_FAT_FS) += fat/
- obj-$(CONFIG_MSDOS_FS) += msdos/
---- /dev/null
-+++ b/fs/mini_fo/aux.c
-@@ -0,0 +1,577 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+/* check if file exists in storage */
-+int exists_in_storage(dentry_t *dentry)
-+{
-+ check_mini_fo_dentry(dentry);
-+ if(dtost(dentry) == MODIFIED || dtost(dentry) == CREATED || dtost(dentry) == DEL_REWRITTEN)
-+ return 1;
-+ return 0;
-+}
-+
-+/* check if dentry is in an existing state */
-+int is_mini_fo_existant(dentry_t *dentry)
-+{
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) == DELETED || dtost(dentry) == NON_EXISTANT)
-+ return 0;
-+ else
-+ return 1;
-+}
-+
-+/*
-+ * This function will create a negative storage dentry for
-+ * dentry, what is required for many create like options.
-+ * It will create the storage structure if necessary.
-+ */
-+int get_neg_sto_dentry(dentry_t *dentry)
-+{
-+ int err = 0;
-+ unsigned int len;
-+ const unsigned char *name;
-+
-+ if(!dentry ||
-+ !dtopd(dentry) ||
-+ !(dtost(dentry) == UNMODIFIED ||
-+ dtost(dentry) == NON_EXISTANT ||
-+ dtost(dentry) == DELETED)) {
-+ printk(KERN_CRIT "mini_fo: get_neg_sto_dentry: invalid dentry passed.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ /* Have we got a neg. dentry already? */
-+ if(dtohd2(dentry)) {
-+ err = 0;
-+ goto out;
-+ }
-+ if(dtost(dentry->d_parent) == UNMODIFIED) {
-+ /* build sto struct */
-+ err = build_sto_structure(dentry->d_parent->d_parent, dentry->d_parent);
-+ if(err ||
-+ dtost(dentry->d_parent) != MODIFIED) {
-+ printk(KERN_CRIT "mini_fo: get_neg_sto_dentry: ERROR building sto structure.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ }
-+
-+ len = dentry->d_name.len;
-+ name = dentry->d_name.name;
-+
-+ dtohd2(dentry) =
-+ lookup_one_len(name, dtohd2(dentry->d_parent), len);
-+
-+ out:
-+ return err;
-+}
-+
-+int check_mini_fo_dentry(dentry_t *dentry)
-+{
-+ ASSERT(dentry != NULL);
-+ ASSERT(dtopd(dentry) != NULL);
-+ ASSERT((dtohd(dentry) != NULL) || (dtohd2(dentry) != NULL));
-+
-+/* if(dtost(dentry) == MODIFIED) { */
-+/* ASSERT(dentry->d_inode != NULL); */
-+/* ASSERT(dtohd(dentry) != NULL); */
-+/* ASSERT(dtohd(dentry)->d_inode != NULL); */
-+/* ASSERT(dtohd2(dentry) != NULL); */
-+/* ASSERT(dtohd2(dentry)->d_inode != NULL); */
-+/* } */
-+/* else if(dtost(dentry) == UNMODIFIED) { */
-+/* ASSERT(dentry->d_inode != NULL); */
-+/* ASSERT( */
-+/* } */
-+ return 0;
-+}
-+
-+int check_mini_fo_file(file_t *file)
-+{
-+ ASSERT(file != NULL);
-+ ASSERT(ftopd(file) != NULL);
-+ ASSERT(file->f_dentry != NULL);
-+
-+ /* violent checking, check depending of state and type
-+ * if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {}
-+ */
-+ ASSERT((ftohf(file) != NULL) || (ftohf2(file) != NULL));
-+ return 0;
-+}
-+
-+int check_mini_fo_inode(inode_t *inode)
-+{
-+ ASSERT(inode != NULL);
-+ ASSERT(itopd(inode) != NULL);
-+ ASSERT((itohi(inode) != NULL) || (itohi2(inode) != NULL));
-+ return 0;
-+}
-+
-+/*
-+ * will walk a base path as provided by get_mini_fo_bpath and return
-+ * the (hopefully ;-) ) positive dentry of the renamed base dir.
-+ *
-+ * This does some work of path_init.
-+ */
-+dentry_t *bpath_walk(super_block_t *sb, char *bpath)
-+{
-+ int err;
-+ struct vfsmount *mnt;
-+ struct nameidata nd;
-+
-+ /* be paranoid */
-+ if(!bpath || bpath[0] != '/') {
-+ printk(KERN_CRIT "mini_fo: bpath_walk: Invalid string.\n");
-+ return NULL;
-+ }
-+ if(!sb || !stopd(sb)) {
-+ printk(KERN_CRIT "mini_fo: bpath_walk: Invalid sb.\n");
-+ return NULL;
-+ }
-+
-+ /* fix this: how do I reach this lock?
-+ * read_lock(¤t->fs->lock); */
-+ mnt = mntget(stopd(sb)->hidden_mnt);
-+ /* read_unlock(¤t->fs->lock); */
-+
-+ err = vfs_path_lookup(mnt->mnt_root, mnt, bpath+1, 0, &nd);
-+
-+ /* validate */
-+ if (err || !nd.dentry || !nd.dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: bpath_walk: path_walk failed.\n");
-+ return NULL;
-+ }
-+ return nd.dentry;
-+}
-+
-+
-+/* returns the full path of the basefile incl. its name */
-+int get_mini_fo_bpath(dentry_t *dentry, char **bpath, int *bpath_len)
-+{
-+ char *buf_walker;
-+ int len = 0;
-+ dentry_t *sky_walker;
-+
-+ if(!dentry || !dtohd(dentry)) {
-+ printk(KERN_CRIT "mini_fo: get_mini_fo_bpath: invalid dentry passed.\n");
-+ return -1;
-+ }
-+ sky_walker = dtohd(dentry);
-+
-+ do {
-+ len += sky_walker->d_name.len + 1 ; /* 1 for '/' */
-+ sky_walker = sky_walker->d_parent;
-+ } while(sky_walker != stopd(dentry->d_inode->i_sb)->base_dir_dentry);
-+
-+ /* 1 to oil the loop */
-+ *bpath = (char*) kmalloc(len + 1, GFP_KERNEL);
-+ if(!*bpath) {
-+ printk(KERN_CRIT "mini_fo: get_mini_fo_bpath: out of mem.\n");
-+ return -1;
-+ }
-+ buf_walker = *bpath+len; /* put it on last char */
-+ *buf_walker = '\n';
-+ sky_walker = dtohd(dentry);
-+
-+ do {
-+ buf_walker -= sky_walker->d_name.len;
-+ strncpy(buf_walker,
-+ sky_walker->d_name.name,
-+ sky_walker->d_name.len);
-+ *(--buf_walker) = '/';
-+ sky_walker = sky_walker->d_parent;
-+ } while(sky_walker != stopd(dentry->d_inode->i_sb)->base_dir_dentry);
-+
-+ /* bpath_len doesn't count newline! */
-+ *bpath_len = len;
-+ return 0;
-+}
-+
-+int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
-+ dentry_t *src_dentry, struct vfsmount *src_mnt)
-+{
-+ void *buf;
-+ mm_segment_t old_fs;
-+ file_t *tgt_file;
-+ file_t *src_file;
-+ int bytes, len, tmp, err;
-+ err = 0;
-+
-+ if(!(tgt_dentry->d_inode && src_dentry->d_inode)) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, neg. dentry passed.\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ dget(tgt_dentry);
-+ dget(src_dentry);
-+ mntget(tgt_mnt);
-+ mntget(src_mnt);
-+
-+ /* open file write only */
-+ tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1);
-+ if(!tgt_file || IS_ERR(tgt_file)) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening target file.\n");
-+ err = PTR_ERR(tgt_file);
-+ goto out_err;
-+ }
-+
-+ /* open file read only */
-+ src_file = dentry_open(src_dentry, src_mnt, 0x0);
-+ if(!src_file || IS_ERR(src_file)) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening source file.\n");
-+ err = PTR_ERR(src_file);
-+
-+ /* close target file */
-+ fput(tgt_file);
-+ goto out_err;
-+ }
-+
-+ /* check if the filesystem(s) support read respective write */
-+ if(!src_file->f_op->read || !tgt_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, no fs read or write support.\n");
-+ err = -EPERM;
-+ goto out_close;
-+ }
-+
-+ /* allocate a page for transfering the data */
-+ buf = (void *) __get_free_page(GFP_KERNEL);
-+ if(!buf) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, out of kernel mem.\n");
-+ goto out_err;
-+ }
-+
-+ tgt_file->f_pos = 0;
-+ src_file->f_pos = 0;
-+
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* Doing this I assume that a read operation will return a full
-+ * buffer while there is still data to read, and a less than
-+ * full buffer when all data has been read.
-+ */
-+ bytes = len = PAGE_SIZE;
-+ while(bytes == len) {
-+ bytes = src_file->f_op->read(src_file, buf, len,
-+ &src_file->f_pos);
-+ tmp = tgt_file->f_op->write(tgt_file, buf, bytes,
-+ &tgt_file->f_pos);
-+ if(tmp != bytes) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR writing.\n");
-+ goto out_close_unset;
-+ }
-+ }
-+
-+ free_page((unsigned long) buf);
-+ set_fs(old_fs);
-+ fput(tgt_file);
-+ fput(src_file);
-+ goto out;
-+
-+ out_close_unset:
-+ free_page((unsigned long) buf);
-+ set_fs(old_fs);
-+
-+ out_close:
-+ fput(tgt_file);
-+ fput(src_file);
-+
-+ out_err:
-+ dput(tgt_dentry);
-+ dput(src_dentry);
-+
-+ /* mk: not sure if this need to be done */
-+ mntput(tgt_mnt);
-+ mntput(src_mnt);
-+
-+ out:
-+ return err;
-+}
-+
-+/* mk:
-+ * ndl (no-duplicate list) stuff
-+ * This is used in mini_fo_readdir, to save the storage directory contents
-+ * and later when reading base, match them against the list in order
-+ * to avoid duplicates.
-+ */
-+
-+/* add a file specified by name and len to the ndl
-+ * Return values: 0 on success, <0 on failure.
-+ */
-+int ndl_add_entry(struct readdir_data *rd, const char *name, int len)
-+{
-+ struct ndl_entry *tmp_entry;
-+
-+ tmp_entry = (struct ndl_entry *)
-+ kmalloc(sizeof(struct ndl_entry), GFP_KERNEL);
-+ if(!tmp_entry) {
-+ printk(KERN_CRIT "mini_fo: ndl_add_entry: out of mem.\n");
-+ return -ENOMEM;
-+ }
-+ tmp_entry->name = (char*) kmalloc(len, GFP_KERNEL);
-+ if(!tmp_entry->name) {
-+ printk(KERN_CRIT "mini_fo: ndl_add_entry: out of mem.\n");
-+ return -ENOMEM;
-+ }
-+ strncpy(tmp_entry->name, name, len);
-+ tmp_entry->len = len;
-+
-+ list_add(&tmp_entry->list, &rd->ndl_list);
-+ rd->ndl_size++;
-+ return 0;
-+}
-+
-+/* delete all list entries and free memory */
-+void ndl_put_list(struct readdir_data *rd)
-+{
-+ struct list_head *tmp;
-+ struct ndl_entry *tmp_entry;
-+
-+ if(rd->ndl_size <= 0)
-+ return;
-+ while(!list_empty(&rd->ndl_list)) {
-+ tmp = rd->ndl_list.next;
-+ list_del(tmp);
-+ tmp_entry = list_entry(tmp, struct ndl_entry, list);
-+ kfree(tmp_entry->name);
-+ kfree(tmp_entry);
-+ }
-+ rd->ndl_size = 0;
-+}
-+
-+/* Check if a file specified by name and len is in the ndl
-+ * Return value: 0 if not in list, 1 if file is found in ndl.
-+ */
-+int ndl_check_entry(struct readdir_data *rd, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct ndl_entry *tmp_entry;
-+
-+ if(rd->ndl_size <= 0)
-+ return 0;
-+
-+ list_for_each(tmp, &rd->ndl_list) {
-+ tmp_entry = list_entry(tmp, struct ndl_entry, list);
-+ if(tmp_entry->len != len)
-+ continue;
-+ if(!strncmp(tmp_entry->name, name, len))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/* mk:
-+ * Recursive function to create corresponding directorys in the storage fs.
-+ * The function will build the storage directorys up to dentry.
-+ */
-+int build_sto_structure(dentry_t *dir, dentry_t *dentry)
-+{
-+ int err;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ if(dentry->d_parent != dir) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: invalid parameter or meta data corruption [1].\n");
-+ return 1;
-+ }
-+
-+ if(dtost(dir) != MODIFIED) {
-+ err = build_sto_structure(dir->d_parent, dentry->d_parent);
-+ if(err)
-+ return err;
-+ }
-+
-+ /* ok, coming back again. */
-+ check_mini_fo_dentry(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(!hidden_sto_dentry) {
-+ /*
-+ * This is the case after creating the first
-+ * hidden_sto_dentry.
-+ * After one negative storage_dentry, all pointers to
-+ * hidden_storage dentries are set to NULL. We need to
-+ * create the negative dentry before we create the storage
-+ * file.
-+ */
-+ unsigned int len;
-+ const unsigned char *name;
-+ len = dtohd(dentry)->d_name.len;
-+ name = dtohd(dentry)->d_name.name;
-+ hidden_sto_dentry = lookup_one_len(name, dtohd2(dir), len);
-+ dtohd2(dentry) = hidden_sto_dentry;
-+ }
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ /* lets be safe */
-+ if(dtohd2(dir) != hidden_sto_dir_dentry) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: invalid parameter or meta data corruption [2].\n");
-+ return 1;
-+ }
-+
-+ /* check for errors in lock_parent */
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if(IS_ERR(hidden_sto_dir_dentry)) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: lock_parent failed.\n");
-+ return err;
-+ }
-+
-+ err = vfs_mkdir(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dir->d_inode->i_mode);
-+
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: failed to create storage dir [1].\n");
-+ /* was: unlock_dir(dir); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&dir->d_inode->i_mutex);
-+#else
-+ up(&dir->d_inode->i_sem);
-+#endif
-+ dput(dir);
-+ return err;
-+ }
-+
-+ /* everything ok! */
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: failed to create storage dir [2].\n");
-+ /* was: unlock_dir(dir); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&dir->d_inode->i_mutex);
-+#else
-+ up(&dir->d_inode->i_sem);
-+#endif
-+ dput(dir);
-+ return 1;
-+ }
-+
-+ /* interpose the new inode and set new state */
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ dtopd(dentry)->state = MODIFIED;
-+
-+ /* initalize the wol list */
-+ itopd(dentry->d_inode)->deleted_list_size = -1;
-+ itopd(dentry->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(dentry);
-+
-+ fist_copy_attr_all(dentry->d_inode, itohi2(dentry->d_inode));
-+ fist_copy_attr_timesizes(dir->d_inode,
-+ hidden_sto_dir_dentry->d_inode);
-+ dir->d_inode->i_nlink++;
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ return 0;
-+}
-+
-+
-+#if 0 /* unused */
-+
-+/*
-+ * Read "len" bytes from "filename" into "buf".
-+ * "buf" is in kernel space.
-+ */
-+int
-+mini_fo_read_file(const char *filename, void *buf, int len)
-+{
-+ file_t *filp;
-+ mm_segment_t oldfs;
-+ int bytes;
-+ /* Chroot? Maybe NULL isn't right here */
-+ filp = filp_open(filename, O_RDONLY, 0);
-+ if (!filp || IS_ERR(filp)) {
-+ printk("mini_fo_read_file err %d\n", (int) PTR_ERR(filp));
-+ return -1; /* or do something else */
-+ }
-+
-+ if (!filp->f_op->read)
-+ return -2; /* file(system) doesn't allow reads */
-+
-+ /* now read len bytes from offset 0 */
-+ filp->f_pos = 0; /* start offset */
-+ oldfs = get_fs();
-+ set_fs(KERNEL_DS);
-+ bytes = filp->f_op->read(filp, buf, len, &filp->f_pos);
-+ set_fs(oldfs);
-+
-+ /* close the file */
-+ fput(filp);
-+
-+ return bytes;
-+}
-+
-+
-+
-+/*
-+ * Write "len" bytes from "buf" to "filename"
-+ * "buf" is in kernel space.
-+ */
-+int
-+mini_fo_write_file(const char *filename, void *buf, int len)
-+{
-+ file_t *filp;
-+ mm_segment_t oldfs;
-+ int bytes;
-+ /* Chroot? Maybe NULL isn't right here */
-+ filp = filp_open(filename, O_RDWR|O_CREAT, 0640);
-+ if (!filp || IS_ERR(filp)) {
-+ printk("mini_fo_write_file err %d\n", (int) PTR_ERR(filp));
-+ return -1; /* or do something else */
-+ }
-+
-+ if (!filp->f_op->write)
-+ return -2; /* file(system) doesn't allow writes */
-+
-+ /* now write len bytes from offset 0 */
-+ filp->f_pos = 0; /* start offset */
-+ oldfs = get_fs();
-+ set_fs(KERNEL_DS);
-+ bytes = filp->f_op->write(filp, buf, len, &filp->f_pos);
-+ set_fs(oldfs);
-+
-+ /* close the file */
-+ fput(filp);
-+
-+ return bytes;
-+}
-+
-+#endif /* unused */
-+
---- /dev/null
-+++ b/fs/mini_fo/ChangeLog
-@@ -0,0 +1,281 @@
-+2006-01-24 Markus Klotzbuecher <mk@mary.denx.de>
-+
-+ * Add tons of ugly ifdefs to Ed L. Cashin's mutex patch to
-+ retain backwards compatibility.
-+
-+2006-01-24 Ed L. Cashin <ecashin@coraid.com>
-+
-+ * Support for the new mutex infrastructure
-+ (7892f2f48d165a34b0b8130c8a195dfd807b8cb6)
-+
-+2005-10-15 Markus Klotzbuecher <mk@localhost.localdomain>
-+
-+ * Bugfix for a serious memory leak in mini_fo_follow_link.
-+
-+2005-09-21 Markus Klotzbuecher <mk@mary>
-+
-+ * new release 0.6.1
-+
-+ * fix of a compiler warning due to changes in 2.6.13
-+
-+2005-09-21 Klaus Wenninger <klaus.wenninger@siemens.com>
-+
-+ * file.c: readdir: fix for a bug that caused directory entries
-+ to show up twice when using storage filesystems such as
-+ minixfs or pramfs.
-+
-+2005-06-30 Eric Lammerts <eric@lammerts.org>
-+
-+ * fix for an oops when overwriting a binary thats beeing
-+ executed.
-+
-+2005-06-09 <mk@mary>
-+
-+ * Renamed overlay to mini_fo-overlay.
-+
-+ * Added mini_fo-merge script to allow merging of storage and base
-+ after making modifications.
-+
-+2005-05-22 root <mk@mary>
-+
-+ * Added overlay script that allows to easily mount mini_fo ontop
-+ of a given base directory
-+
-+2005-05-10 <mk@mary>
-+
-+ * inode.c: xattr functions return -EOPNOSUPP instead of
-+ -ENOSUPP, what confuses "ls -l"
-+
-+ * Changed license from LGPL to GPL.
-+
-+2005-05-08 root <mk@mary>
-+
-+ * Makefile: clean it up and added make install and make
-+ uninstall.
-+
-+2005-05-06 <mk@mary>
-+
-+ * merged devel branch back to main. [v0-6-0-pre3]
-+
-+ * removed unused files print.c and fist_ioctl. [devel-0-0-18]
-+
-+ * ioctl: removed fist_ioctl stuff, that is not needed for
-+ now.
-+
-+2005-05-03 <mk@mary>
-+
-+ * file.c: simplified mini_fo_open and mini_fo_setattr using
-+ new state changing functions. [devel-0-0-17]
-+
-+ * inode.c: Fixed getattr state bug (see below) in 2.4 function
-+ mini_fo_inode revalidate.
-+
-+ * inode.c: found an other bug in mini_fo_getattr. States are not
-+ reliable in this function, as a file can be opened, unlinked and
-+ the getattr function called. This results in a deleted dentry
-+ with an inode. Fix is to ignore states and simply use the inode
-+ available.
-+
-+2005-04-29 <mk@mary>
-+
-+ * file.c: Bugfix and cleanup in fasync and fsync. [devel-0-0-16]
-+
-+ * file.c: do not use mini_fo_lock so the generic version is
-+ used (I guess).
-+
-+ * inode.c: getattr, never call getattr on lower files, as this
-+ will cause the inum to change.
-+
-+ * inode.c: rename_reg_file renamed to rename_nondir, as it
-+ doesn't matter as long it't not a dir. Removed all
-+ rename_dev_file etc.
-+
-+ * tagged as devel-0-0-15
-+
-+ * inode.c: added support for chosing support for extended
-+ attrs at compile time by XATTR define in mini_fo.h .
-+
-+ * inode.c: fixed mini_fo_getattr to use mini_fo inode and not
-+ lower again, what avoids inode number changes that confused
-+ rm again. This is the proper solution.
-+
-+2005-04-24 <mk@mary>
-+
-+ * all files: updated Copyright notive to 2005. [devel-0-0-14]
-+
-+ * inode.c: fixed mini_fo_getattr to not change the inode
-+ number, even if lower files change.
-+
-+ * super.c: fixed a bug that caused deleted base file to show
-+ up suddenly after some time, or after creating a special
-+ file. The problem was that after some time or after special
-+ file creating sync_sb_inodes is called by the vfs, that
-+ called our mini_fo_put_inode. There was (wrongly) called
-+ __meta_put_lists, that nuked the lists, although the inode
-+ was going to continue its life. Moving __meta_put_lists to
-+ mini_fo_clear_inode, where an inode is really destroyed,
-+ solved the problem.
-+
-+
-+2005-04-23 <mk@mary>
-+
-+ * state.c, aux.c: more cleaning up and
-+ simplifications. [devel-0-0-13]
-+
-+ * inode.c: implemented mini_fo_getattr, that was required for
-+ 2.6 because inode_revalidate has been remove there, and the
-+ old "du" bug returned.
-+
-+
-+2005-04-20 <mk@mary>
-+
-+ * aux.c: get_neg_sto_dentry(): allow to be called for dentries
-+ in state UNMODIFIED, NON_EXISTANT _and_ DELETED.
-+
-+2005-04-19 <mk@mary>
-+
-+ * Fixed a bug under 2.6 that caused files deleted via mini_fo
-+ not to be deleted properly and therefore the fs filled up
-+ untill no memory was left. [devel-0-0-12]
-+
-+ * Added basic hard link support. This means that creating
-+ hardlinks will work, but existing ones will be treated as
-+ individual files. [devel-0-0-11]
-+
-+2005-04-17 <mk@mary>
-+
-+ * Bugfixes
-+
-+2005-04-13 root <mk@mary>
-+
-+ * Added file state.c for the state transition
-+ functions. Doesn't work very well yet, though...
-+
-+2005-04-12 <mk@mary>
-+
-+ * Porting to 2.6 started, which is easier than expected, also
-+ due to Olivier previous work.
-+
-+2005-04-08 <mk@mary>
-+
-+ * Fixed the bug that caused du to return invalid sizes of
-+ directory trees. The problem was that
-+ mini_fo_inode_revalidate didn't always copy the attributes
-+ from the base inode properly.
-+
-+2005-04-01 Markus Klotzbuecher <mk@chasey>
-+
-+ * Merged devel branch back to main trunk and updated the
-+ RELEASE notes. This will be 0-6-0-pre1.
-+
-+2005-03-31 Markus Klotzbuecher <mk@chasey>
-+
-+ * Fixed some bugs in rename_reg_file, that only showed up in
-+ the kernel compile test. Kernel compiles cleanly ontop of
-+ mini_fo, now also make mrproper etc. work. Seems pretty stable.
-+
-+2005-03-28 Markus Klotzbuecher <mk@chasey>
-+
-+ * Many, many directory renaming bugfixes and a lot of other
-+ cleanup. Dir renaming seems to work relatively stable.
-+
-+2005-03-22 Markus Klotzbuecher <mk@chasey>
-+
-+ * Finished implementing lightweight directory renaming. Some
-+ basic testing indicates it works fine.
-+ Next is to implement testcases for the testsuite and confirm
-+ everything is really working ok.
-+
-+2005-03-18 Markus Klotzbuecher <mk@chasey>
-+
-+ * Finished implementing meta.c stuff required for directory
-+ renaming.
-+
-+2005-03-17 Markus Klotzbuecher <mk@chasey>
-+
-+ * Fixed all compile warnings + an extremly old bug that
-+ somehow crept in while reworking the wol stuff to the META
-+ system. Turning on -Werror again... :-)
-+
-+ * Fixed some bugs in the new rename_reg_file function.
-+
-+ * Rewrote mini_fo rename and split it into several
-+ subfunctions, that handle the different types
-+ seperately. Rewrote the regular file function aswell, as it
-+ was implemented somewhat inefficient.
-+
-+2005-03-16 Markus Klotzbuecher <mk@chasey>
-+
-+ * Implemented new META subsystem, removed old WOL stuff in favor
-+ if it.
-+
-+ * After some basic testing everything seems ok...
-+
-+2005-03-11 Markus Klotzbuecher <mk@chasey>
-+
-+ * Renaming a non regular file caused trouble because I always
-+ tried to copy the contents. Now I only do this for regular
-+ files. mini_fo_rename still isn't implemented properly, renaming
-+ of device files, symlinks etc. results in a empty regular file
-+ instead of the proper type.
-+
-+ * Directory renaming suddenly works! What a surprise! I guess
-+ this is because renaming is implemented as making a copy and
-+ removing the original. Still this might not work
-+ everywhere...
-+
-+2005-03-09 Markus Klotzbuecher <mk@chasey>
-+
-+ * Bugfix, when a mini_fo directory that exists in storage
-+ (state: MODIFIED, CREATED and DEL_REWRITTEN) is deleted, a
-+ possibly existing WOL file contained in it needs to be
-+ deleted too.
-+
-+ * Starting cleanup: defined state names in order to get rid of
-+ the state numbers.
-+
-+2005-03-08 Markus Klotzbuecher <mk@chasey>
-+
-+ * Makefile fix, fist_ioctl was built against wrong sources if ARCH=um
-+
-+ * Fixed a bug in dentry.c, mini_fo_d_hash. In state 4 =
-+ DEL_REWRITTEN the hash was calculated from the base dentry,
-+ which was wrong and and caused assertions in
-+ __mini_fo_hidden_dentry to fail.
-+
-+2005-02-21 <mk@mary>
-+
-+ * Implemented directory deleting (inode.c)
-+
-+ * main.c: made mini_fo_parse_options a little more robust.
-+
-+2004-12-22 <mk@mary>
-+
-+ * Makefile cleanup and uml stuff, removed unneccessary files
-+
-+ * Created a new and hopefully more informative README
-+
-+ * CHANGELOG: created a new CHANGELOG and added old entries reversely
-+
-+
-+2004-10-24 Gleb Natapov <gleb@nbase.co.il>
-+
-+ * Fix: owner and group where not correctly copied from base to
-+ storage.
-+
-+
-+2004-10-05 Gleb Natapov <gleb@nbase.co.il>
-+
-+ * Implementation of fsync, fasync and lock mini_fo functions.
-+
-+
-+2004-09-29 Bob Lee <bob@pantasys.com>
-+
-+ * Fix of a serious pointer bug
-+
-+
-+2004-09-28 Gleb Natapov <gleb@nbase.co.il>
-+
-+ * Implementation of mini_fo_mknod and mini_fo_rename, support
-+ for device files.
-+
---- /dev/null
-+++ b/fs/mini_fo/dentry.c
-@@ -0,0 +1,244 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+/*
-+ * THIS IS A BOOLEAN FUNCTION: returns 1 if valid, 0 otherwise.
-+ */
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_d_revalidate(dentry_t *dentry, struct nameidata *nd)
-+#else
-+mini_fo_d_revalidate(dentry_t *dentry, int flags)
-+#endif
-+{
-+ int err1 = 1; /* valid = 1, invalid = 0 */
-+ int err2 = 1;
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ hidden_dentry = dtohd(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(hidden_dentry &&
-+ hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_revalidate) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err1 = hidden_dentry->d_op->d_revalidate(hidden_dentry, nd);
-+#else
-+ err1 = hidden_dentry->d_op->d_revalidate(hidden_dentry, flags);
-+#endif
-+ }
-+ if(hidden_sto_dentry &&
-+ hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_revalidate) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err2 = hidden_sto_dentry->d_op->d_revalidate(hidden_sto_dentry,
-+ nd);
-+#else
-+ err2 = hidden_sto_dentry->d_op->d_revalidate(hidden_sto_dentry,
-+ flags);
-+#endif
-+ }
-+
-+ /* mk: if one of the lower level dentries are valid,
-+ * the mini_fo dentry is too.
-+ */
-+ return (err1 || err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_d_hash(dentry_t *dentry, qstr_t *name)
-+{
-+ int err = 0;
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+ /* hidden_dentry = mini_fo_hidden_dentry(dentry);
-+ * hidden_sto_dentry = mini_fo_hidden_sto_dentry(dentry); */
-+
-+ /* state 1, 3, 4, 5: build the hash for the storage dentry */
-+ if((dtopd(dentry)->state == MODIFIED) ||
-+ (dtopd(dentry)->state == CREATED) ||
-+ (dtopd(dentry)->state == DEL_REWRITTEN) ||
-+ (dtopd(dentry)->state == DELETED)) {
-+ hidden_sto_dentry = dtohd2(dentry);
-+ if(hidden_sto_dentry &&
-+ hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_hash) {
-+ err = hidden_sto_dentry->d_op->d_hash(hidden_sto_dentry, name);
-+ }
-+ goto out;
-+ }
-+ /* state 2: build the hash for the base dentry */
-+ if(dtopd(dentry)->state == UNMODIFIED) {
-+ hidden_dentry = dtohd(dentry);
-+ if(hidden_dentry &&
-+ hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_hash) {
-+ err = hidden_dentry->d_op->d_hash(hidden_dentry, name);
-+ }
-+ goto out;
-+ }
-+ /* state 6: build hash for the dentry that exists */
-+ if(dtopd(dentry)->state == NON_EXISTANT) {
-+ hidden_sto_dentry = dtohd2(dentry);
-+ if(hidden_sto_dentry &&
-+ hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_hash) {
-+ err = hidden_sto_dentry->d_op->d_hash(hidden_sto_dentry, name);
-+ goto out;
-+ }
-+ hidden_dentry = dtohd(dentry);
-+ if(hidden_dentry &&
-+ hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_hash) {
-+ err = hidden_dentry->d_op->d_hash(hidden_dentry, name);
-+ goto out;
-+ }
-+ }
-+
-+ printk(KERN_CRIT "mini_fo: d_hash: invalid state detected.\n");
-+
-+ out:
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_d_compare(dentry_t *dentry, qstr_t *a, qstr_t *b)
-+{
-+ int err;
-+ dentry_t *hidden_dentry=NULL;
-+
-+ /* hidden_dentry = mini_fo_hidden_dentry(dentry); */
-+ if(dtohd2(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else if(dtohd(dentry))
-+ hidden_dentry = dtohd(dentry);
-+
-+ if (hidden_dentry && hidden_dentry->d_op && hidden_dentry->d_op->d_compare) {
-+ err = hidden_dentry->d_op->d_compare(hidden_dentry, a, b);
-+ } else {
-+ err = ((a->len != b->len) || memcmp(a->name, b->name, b->len));
-+ }
-+
-+ return err;
-+}
-+
-+
-+int
-+mini_fo_d_delete(dentry_t *dentry)
-+{
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+ int err = 0;
-+
-+ /* this could be a negative dentry, so check first */
-+ if (!dtopd(dentry)) {
-+ printk(KERN_CRIT "mini_fo_d_delete: negative dentry passed.\n");
-+ goto out;
-+ }
-+ hidden_dentry = dtohd(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(hidden_dentry) {
-+ if(hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_delete) {
-+ err = hidden_dentry->d_op->d_delete(hidden_dentry);
-+ }
-+ }
-+ if(hidden_sto_dentry) {
-+ if(hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_delete) {
-+ err = hidden_sto_dentry->d_op->d_delete(hidden_sto_dentry);
-+ }
-+ }
-+
-+ out:
-+ return err;
-+}
-+
-+
-+void
-+mini_fo_d_release(dentry_t *dentry)
-+{
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+
-+ /* this could be a negative dentry, so check first */
-+ if (!dtopd(dentry)) {
-+ printk(KERN_CRIT "mini_fo_d_release: no private data.\n");
-+ goto out;
-+ }
-+ hidden_dentry = dtohd(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(hidden_dentry) {
-+ /* decrement hidden dentry's counter and free its inode */
-+ dput(hidden_dentry);
-+ }
-+ if(hidden_sto_dentry) {
-+ /* decrement hidden dentry's counter and free its inode */
-+ dput(hidden_sto_dentry);
-+ }
-+
-+ /* free private data (mini_fo_dentry_info) here */
-+ kfree(dtopd(dentry));
-+ __dtopd(dentry) = NULL; /* just to be safe */
-+ out:
-+ return;
-+}
-+
-+
-+/*
-+ * we don't really need mini_fo_d_iput, because dentry_iput will call iput() if
-+ * mini_fo_d_iput is not defined. We left this implemented for ease of
-+ * tracing/debugging.
-+ */
-+void
-+mini_fo_d_iput(dentry_t *dentry, inode_t *inode)
-+{
-+ iput(inode);
-+}
-+
-+
-+struct dentry_operations mini_fo_dops = {
-+ d_revalidate: mini_fo_d_revalidate,
-+ d_hash: mini_fo_d_hash,
-+ d_compare: mini_fo_d_compare,
-+ d_release: mini_fo_d_release,
-+ d_delete: mini_fo_d_delete,
-+ d_iput: mini_fo_d_iput,
-+};
---- /dev/null
-+++ b/fs/mini_fo/file.c
-@@ -0,0 +1,713 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+#define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1))
-+
-+/*******************
-+ * File Operations *
-+ *******************/
-+
-+STATIC loff_t
-+mini_fo_llseek(file_t *file, loff_t offset, int origin)
-+{
-+ loff_t err;
-+ file_t *hidden_file = NULL;
-+
-+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+ /* Check if trying to llseek from a directory */
-+ err = -EISDIR;
-+ goto out;
-+ }
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ /* always set hidden position to this one */
-+ hidden_file->f_pos = file->f_pos;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ memcpy(&(hidden_file->f_ra),
-+ &(file->f_ra),
-+ sizeof(struct file_ra_state));
-+#else
-+ if (file->f_reada) { /* update readahead information if needed */
-+ hidden_file->f_reada = file->f_reada;
-+ hidden_file->f_ramax = file->f_ramax;
-+ hidden_file->f_raend = file->f_raend;
-+ hidden_file->f_ralen = file->f_ralen;
-+ hidden_file->f_rawin = file->f_rawin;
-+ }
-+#endif
-+ if (hidden_file->f_op && hidden_file->f_op->llseek)
-+ err = hidden_file->f_op->llseek(hidden_file, offset, origin);
-+ else
-+ err = generic_file_llseek(hidden_file, offset, origin);
-+
-+ if (err < 0)
-+ goto out;
-+
-+ if (err != file->f_pos) {
-+ file->f_pos = err;
-+ // ION maybe this?
-+ // file->f_pos = hidden_file->f_pos;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ file->f_reada = 0;
-+#endif
-+ file->f_version++;
-+ }
-+
-+ out:
-+ return err;
-+}
-+
-+
-+/* mk: fanout capable */
-+STATIC ssize_t
-+mini_fo_read(file_t *file, char *buf, size_t count, loff_t *ppos)
-+{
-+ int err = -EINVAL;
-+ file_t *hidden_file = NULL;
-+ loff_t pos = *ppos;
-+
-+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+ /* Check if trying to read from a directory */
-+ /* printk(KERN_CRIT "mini_fo_read: ERROR: trying to read data from a directory.\n"); */
-+ err = -EISDIR;
-+ goto out;
-+ }
-+
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ if (!hidden_file->f_op || !hidden_file->f_op->read)
-+ goto out;
-+
-+ err = hidden_file->f_op->read(hidden_file, buf, count, &pos);
-+ *ppos = pos;
-+
-+ if (err >= 0) {
-+ /* atime should also be updated for reads of size zero or more */
-+ fist_copy_attr_atime(file->f_dentry->d_inode,
-+ hidden_file->f_dentry->d_inode);
-+ }
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ /*
-+ * MAJOR HACK
-+ * because pread() does not have any way to tell us that it is
-+ * our caller, then we don't know for sure if we have to update
-+ * the file positions. This hack relies on read() having passed us
-+ * the "real" pointer of its struct file's f_pos field.
-+ */
-+ if (ppos == &file->f_pos)
-+ hidden_file->f_pos = *ppos = pos;
-+ if (hidden_file->f_reada) { /* update readahead information if needed */
-+ file->f_reada = hidden_file->f_reada;
-+ file->f_ramax = hidden_file->f_ramax;
-+ file->f_raend = hidden_file->f_raend;
-+ file->f_ralen = hidden_file->f_ralen;
-+ file->f_rawin = hidden_file->f_rawin;
-+ }
-+#else
-+ memcpy(&(file->f_ra),&(hidden_file->f_ra),sizeof(struct file_ra_state));
-+#endif
-+
-+ out:
-+ return err;
-+}
-+
-+
-+/* this mini_fo_write() does not modify data pages! */
-+STATIC ssize_t
-+mini_fo_write(file_t *file, const char *buf, size_t count, loff_t *ppos)
-+{
-+ int err = -EINVAL;
-+ file_t *hidden_file = NULL;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ loff_t pos = *ppos;
-+
-+ /* mk: fan out: */
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ /* This is bad! We have no storage file to write to. This
-+ * should never happen because if a file is opened for
-+ * writing, a copy should have been made earlier.
-+ */
-+ printk(KERN_CRIT "mini_fo: write : ERROR, no storage file to write.\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ }
-+
-+ inode = file->f_dentry->d_inode;
-+ hidden_inode = itohi2(inode);
-+ if(!hidden_inode) {
-+ printk(KERN_CRIT "mini_fo: write: no sto inode found, not good.\n");
-+ goto out;
-+ }
-+
-+ if (!hidden_file->f_op || !hidden_file->f_op->write)
-+ goto out;
-+
-+ /* adjust for append -- seek to the end of the file */
-+ if (file->f_flags & O_APPEND)
-+ pos = inode->i_size;
-+
-+ err = hidden_file->f_op->write(hidden_file, buf, count, &pos);
-+
-+ /*
-+ * copy ctime and mtime from lower layer attributes
-+ * atime is unchanged for both layers
-+ */
-+ if (err >= 0)
-+ fist_copy_attr_times(inode, hidden_inode);
-+
-+ *ppos = pos;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ /*
-+ * XXX: MAJOR HACK
-+ *
-+ * because pwrite() does not have any way to tell us that it is
-+ * our caller, then we don't know for sure if we have to update
-+ * the file positions. This hack relies on write() having passed us
-+ * the "real" pointer of its struct file's f_pos field.
-+ */
-+ if (ppos == &file->f_pos)
-+ hidden_file->f_pos = *ppos = pos;
-+#endif
-+ /* update this inode's size */
-+ if (pos > inode->i_size)
-+ inode->i_size = pos;
-+
-+ out:
-+ return err;
-+}
-+
-+/* Global variable to hold a file_t pointer.
-+ * This serves to allow mini_fo_filldir function to know which file is
-+ * beeing read, which is required for two reasons:
-+ *
-+ * - be able to call wol functions in order to avoid listing deleted
-+ * base files.
-+ * - if we're reading a directory which is in state 1, we need to
-+ * maintain a list (in mini_fo_filldir) of which files allready
-+ * have been copied to userspace,to detect files existing in base
-+ * and storage and not list them twice.
-+ */
-+filldir_t mini_fo_filldir_orig;
-+file_t *mini_fo_filldir_file;
-+
-+/* mainly copied from fs/readdir.c */
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_filldir(void * __buf, const char * name, int namlen, loff_t offset,
-+ u64 ino, unsigned int d_type)
-+#else
-+mini_fo_filldir(void * __buf, const char * name, int namlen, loff_t offset,
-+ ino_t ino, unsigned int d_type)
-+#endif
-+{
-+ struct getdents_callback * buf = (struct getdents_callback *) __buf;
-+ file_t* file = mini_fo_filldir_file;
-+
-+ /* In theses states we filter meta files in storage (WOL) */
-+ if(file && (dtopd(file->f_dentry)->state == MODIFIED ||
-+ dtopd(file->f_dentry)->state == CREATED ||
-+ dtopd(file->f_dentry)->state == DEL_REWRITTEN)) {
-+
-+ int tmp = strlen(META_FILENAME);
-+ if(tmp == namlen) {
-+ if(!strncmp(name, META_FILENAME, namlen))
-+ return 0;
-+ }
-+ }
-+
-+ /* check if we are merging the contents of storage and base */
-+ if(file && dtopd(file->f_dentry)->state == MODIFIED) {
-+ /* check if we are still reading storage contents, if
-+ * yes, we just save the name of the file for duplicate
-+ * checking later. */
-+
-+ if(!ftopd(file)->rd.sto_done) {
-+ /* put file into ndl list */
-+ if(ndl_add_entry(&ftopd(file)->rd, name, namlen))
-+ printk(KERN_CRIT "mini_fo_filldir: Error adding to ndl.\n");
-+ } else {
-+ /* check if file has been deleted */
-+ if(meta_check_d_entry(file->f_dentry, name, namlen))
-+ return 0;
-+
-+ /* do duplicate checking */
-+ if(ndl_check_entry(&ftopd(file)->rd, name, namlen))
-+ return 0;
-+ }
-+ }
-+
-+ return mini_fo_filldir_orig(buf, name, namlen, offset, ino, d_type);
-+}
-+
-+
-+STATIC int
-+mini_fo_readdir(file_t *file, void *dirent, filldir_t filldir)
-+{
-+ int err = 0;/* mk: ??? -ENOTDIR; */
-+ file_t *hidden_file = NULL;
-+ file_t *hidden_sto_file = NULL;
-+ inode_t *inode;
-+ struct getdents_callback *buf;
-+ int oldcount;
-+
-+#if defined(FIST_FILTER_NAME) || defined(FIST_FILTER_SCA)
-+ struct mini_fo_getdents_callback buf;
-+#endif /* FIST_FILTER_NAME || FIST_FILTER_SCA */
-+
-+ buf = (struct getdents_callback *) dirent;
-+ oldcount = buf->count;
-+ inode = file->f_dentry->d_inode;
-+ mini_fo_filldir_file = file;
-+ mini_fo_filldir_orig = filldir;
-+
-+ ftopd(file)->rd.sto_done = 0;
-+ do {
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_sto_file = ftohf2(file);
-+ err = vfs_readdir(hidden_sto_file, mini_fo_filldir, dirent);
-+ file->f_pos = hidden_sto_file->f_pos;
-+ if (err > 0)
-+ fist_copy_attr_atime(inode, hidden_sto_file->f_dentry->d_inode);
-+ /* not finshed yet, we'll be called again */
-+ if (buf->count != oldcount)
-+ break;
-+ }
-+
-+ ftopd(file)->rd.sto_done = 1;
-+
-+ if(ftohf(file)) {
-+ hidden_file = ftohf(file);
-+ err = vfs_readdir(hidden_file, mini_fo_filldir, dirent);
-+ file->f_pos = hidden_file->f_pos;
-+ if (err > 0)
-+ fist_copy_attr_atime(inode, hidden_file->f_dentry->d_inode);
-+ }
-+
-+ }
-+ } while (0);
-+
-+ /* mk:
-+ * we need to check if all the directory data has been copied to userspace,
-+ * or if we will be called again by userspace to complete the operation.
-+ */
-+ if(buf->count == oldcount) {
-+ ndl_put_list(&ftopd(file)->rd);
-+ }
-+
-+ /* unset this, safe */
-+ mini_fo_filldir_file = NULL;
-+ return err;
-+}
-+
-+
-+STATIC unsigned int
-+mini_fo_poll(file_t *file, poll_table *wait)
-+{
-+ unsigned int mask = DEFAULT_POLLMASK;
-+ file_t *hidden_file = NULL;
-+
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ if (!hidden_file->f_op || !hidden_file->f_op->poll)
-+ goto out;
-+
-+ mask = hidden_file->f_op->poll(hidden_file, wait);
-+
-+ out:
-+ return mask;
-+}
-+
-+/* FIST-LITE special version of mmap */
-+STATIC int
-+mini_fo_mmap(file_t *file, vm_area_t *vma)
-+{
-+ int err = 0;
-+ file_t *hidden_file = NULL;
-+
-+ /* fanout capability */
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ ASSERT(hidden_file != NULL);
-+ ASSERT(hidden_file->f_op != NULL);
-+ ASSERT(hidden_file->f_op->mmap != NULL);
-+
-+ vma->vm_file = hidden_file;
-+ err = hidden_file->f_op->mmap(hidden_file, vma);
-+ get_file(hidden_file); /* make sure it doesn't get freed on us */
-+ fput(file); /* no need to keep extra ref on ours */
-+
-+ return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_open(inode_t *inode, file_t *file)
-+{
-+ int err = 0;
-+ int hidden_flags;
-+ file_t *hidden_file = NULL;
-+ dentry_t *hidden_dentry = NULL;
-+
-+ /* fanout stuff */
-+ file_t *hidden_sto_file = NULL;
-+ dentry_t *hidden_sto_dentry = NULL;
-+
-+ __ftopd(file) =
-+ kmalloc(sizeof(struct mini_fo_file_info), GFP_KERNEL);
-+ if (!ftopd(file)) {
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+
-+ /* init the readdir_helper structure */
-+ INIT_LIST_HEAD(&ftopd(file)->rd.ndl_list);
-+ ftopd(file)->rd.ndl_size = 0;
-+
-+ /* In certain paths this could stay uninitalized and cause trouble */
-+ ftohf(file) = NULL;
-+ ftohf2(file) = NULL;
-+ hidden_flags = file->f_flags;
-+
-+ /* create storage files? */
-+ if(dtost(file->f_dentry) == UNMODIFIED) {
-+ if(!IS_WRITE_FLAG(file->f_flags)) {
-+ hidden_dentry = dtohd(file->f_dentry);
-+ dget(hidden_dentry);
-+ /* dentry_open will decrement mnt refcnt if err.
-+ * otherwise fput() will do an mntput() for us upon file close. */
-+ mntget(stopd(inode->i_sb)->hidden_mnt);
-+ hidden_file = dentry_open(hidden_dentry,
-+ stopd(inode->i_sb)->hidden_mnt,
-+ hidden_flags);
-+ if (IS_ERR(hidden_file)) {
-+ err = PTR_ERR(hidden_file);
-+ dput(hidden_dentry);
-+ goto out;
-+ }
-+ ftohf(file) = hidden_file; /* link two files */
-+ goto out;
-+ }
-+ else {
-+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+ err = dir_unmod_to_mod(file->f_dentry);
-+ } else
-+ err = nondir_unmod_to_mod(file->f_dentry, 1);
-+
-+ if (err) {
-+ printk("mini_fo_open: ERROR creating storage file.\n");
-+ goto out;
-+ }
-+ }
-+ }
-+ hidden_sto_dentry = dtohd2(file->f_dentry);
-+ dget(hidden_sto_dentry);
-+
-+ if(dtopd(file->f_dentry)->state == MODIFIED) {
-+ /* Directorys are special, interpose on both lower level files */
-+ if(S_ISDIR(itohi(inode)->i_mode)) {
-+ /* check for invalid file types of lower level files */
-+ if(!(S_ISDIR(itohi(inode)->i_mode) && S_ISDIR(itohi2(inode)->i_mode))) {
-+ printk(KERN_CRIT "mini_fo_open: meta data corruption detected.\n");
-+ dput(hidden_sto_dentry);
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* lower level directorys are ok, open the base file */
-+ hidden_dentry = dtohd(file->f_dentry);
-+ dget(hidden_dentry);
-+
-+ mntget(stopd(inode->i_sb)->hidden_mnt);
-+ hidden_file = dentry_open(hidden_dentry,
-+ stopd(inode->i_sb)->hidden_mnt,
-+ hidden_flags);
-+ if (IS_ERR(hidden_file)) {
-+ err = PTR_ERR(hidden_file);
-+ dput(hidden_dentry);
-+ dput(hidden_sto_dentry);
-+ goto out;
-+ }
-+ ftohf(file) = hidden_file; /* link the two files */
-+ }
-+ }
-+
-+ if(!exists_in_storage(file->f_dentry)) {
-+ printk(KERN_CRIT "mini_fo_open: invalid file state detected.\n");
-+ err = -EINVAL;
-+ dput(hidden_sto_dentry);
-+
-+ /* If the base file has been opened, we need to close it here */
-+ if(ftohf(file)) {
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ hidden_file->f_op->flush(hidden_file, NULL);
-+#else
-+ hidden_file->f_op->flush(hidden_file);
-+#endif
-+ dput(hidden_dentry);
-+ }
-+ goto out;
-+ }
-+
-+ /* ok, now we can safely open the storage file */
-+ mntget(stopd(inode->i_sb)->hidden_mnt2);
-+ hidden_sto_file = dentry_open(hidden_sto_dentry,
-+ stopd(inode->i_sb)->hidden_mnt2,
-+ hidden_flags);
-+
-+ /* dentry_open dputs the dentry if it fails */
-+ if (IS_ERR(hidden_sto_file)) {
-+ err = PTR_ERR(hidden_sto_file);
-+ /* close base file if open */
-+ if(ftohf(file)) {
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ hidden_file->f_op->flush(hidden_file, NULL);
-+#else
-+ hidden_file->f_op->flush(hidden_file);
-+#endif
-+ dput(hidden_dentry);
-+ }
-+ goto out;
-+ }
-+ ftohf2(file) = hidden_sto_file; /* link storage file */
-+
-+ out:
-+ if (err < 0 && ftopd(file)) {
-+ kfree(ftopd(file));
-+ }
-+ return err;
-+}
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_flush(file_t *file, fl_owner_t id)
-+#else
-+mini_fo_flush(file_t *file)
-+#endif
-+{
-+ int err1 = 0; /* assume ok (see open.c:close_fp) */
-+ int err2 = 0;
-+ file_t *hidden_file = NULL;
-+
-+ check_mini_fo_file(file);
-+
-+ /* mk: we don't do any state checking here, as its not worth the time.
-+ * Just flush the lower level files if they exist.
-+ */
-+ if(ftopd(file) != NULL) {
-+ if(ftohf(file) != NULL) {
-+ hidden_file = ftohf(file);
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ err1 = hidden_file->f_op->flush(hidden_file, id);
-+#else
-+ err1 = hidden_file->f_op->flush(hidden_file);
-+#endif
-+ }
-+ if(ftohf2(file) != NULL) {
-+ hidden_file = ftohf2(file);
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ err2 = hidden_file->f_op->flush(hidden_file, id);
-+#else
-+ err2 = hidden_file->f_op->flush(hidden_file);
-+#endif
-+ }
-+ }
-+ return (err1 | err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_release(inode_t *inode, file_t *file)
-+{
-+ int err = 0;
-+ file_t *hidden_file = NULL;
-+
-+ if (ftopd(file) != NULL) {
-+ if(ftohf(file)) {
-+ hidden_file = ftohf(file);
-+ fput(hidden_file);
-+ }
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ fput(hidden_file);
-+ }
-+ kfree(ftopd(file));
-+ }
-+ return err;
-+}
-+
-+STATIC int
-+mini_fo_fsync(file_t *file, dentry_t *dentry, int datasync)
-+{
-+ int err1 = 0;
-+ int err2 = 0;
-+ file_t *hidden_file = NULL;
-+ dentry_t *hidden_dentry;
-+
-+ check_mini_fo_file(file);
-+
-+ if ((hidden_file = ftohf(file)) != NULL) {
-+ hidden_dentry = dtohd(dentry);
-+ if (hidden_file->f_op && hidden_file->f_op->fsync) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ err1 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ }
-+
-+ if ((hidden_file = ftohf2(file)) != NULL) {
-+ hidden_dentry = dtohd2(dentry);
-+ if (hidden_file->f_op && hidden_file->f_op->fsync) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ err2 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ }
-+ else
-+ goto err;
-+
-+err:
-+ return (err1 || err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_fasync(int fd, file_t *file, int flag)
-+{
-+ int err1 = 0;
-+ int err2 = 0;
-+
-+ file_t *hidden_file = NULL;
-+
-+ check_mini_fo_file(file);
-+
-+ if((hidden_file = ftohf(file)) != NULL) {
-+ err1 = hidden_file->f_op->fasync(fd, hidden_file, flag);
-+ }
-+ if((hidden_file = ftohf2(file)) != NULL) {
-+ err2 = hidden_file->f_op->fasync(fd, hidden_file, flag);
-+ }
-+
-+ return (err1 || err2);
-+}
-+
-+
-+
-+struct file_operations mini_fo_dir_fops =
-+ {
-+ read: generic_read_dir,
-+ write: mini_fo_write,
-+ readdir: mini_fo_readdir,
-+ poll: mini_fo_poll,
-+ /* ioctl: mini_fo_ioctl, */
-+ mmap: mini_fo_mmap,
-+ open: mini_fo_open,
-+ flush: mini_fo_flush,
-+ release: mini_fo_release,
-+ fsync: mini_fo_fsync,
-+ fasync: mini_fo_fasync,
-+ /* not needed lock: mini_fo_lock, */
-+ /* not needed: readv */
-+ /* not needed: writev */
-+ /* not implemented: sendpage */
-+ /* not implemented: get_unmapped_area */
-+ };
-+
-+struct file_operations mini_fo_main_fops =
-+ {
-+ llseek: mini_fo_llseek,
-+ read: mini_fo_read,
-+ write: mini_fo_write,
-+ readdir: mini_fo_readdir,
-+ poll: mini_fo_poll,
-+ /* ioctl: mini_fo_ioctl, */
-+ mmap: mini_fo_mmap,
-+ open: mini_fo_open,
-+ flush: mini_fo_flush,
-+ release: mini_fo_release,
-+ fsync: mini_fo_fsync,
-+ fasync: mini_fo_fasync,
-+ /* not needed: lock: mini_fo_lock, */
-+ /* not needed: readv */
-+ /* not needed: writev */
-+ /* not implemented: sendpage */
-+ /* not implemented: get_unmapped_area */
-+ };
---- /dev/null
-+++ b/fs/mini_fo/fist.h
-@@ -0,0 +1,252 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifndef __FIST_H_
-+#define __FIST_H_
-+
-+/*
-+ * KERNEL ONLY CODE:
-+ */
-+#ifdef __KERNEL__
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
-+#include <linux/autoconf.h>
-+#else
-+#include <linux/config.h>
-+#endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+#ifdef CONFIG_MODVERSIONS
-+# define MODVERSIONS
-+# include <linux/modversions.h>
-+#endif /* CONFIG_MODVERSIONS */
-+#endif /* KERNEL_VERSION < 2.6.0 */
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/string.h>
-+#include <linux/stat.h>
-+#include <linux/errno.h>
-+#include <linux/wait.h>
-+#include <linux/limits.h>
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+#include <linux/locks.h>
-+#else
-+#include <linux/buffer_head.h>
-+#include <linux/pagemap.h>
-+#include <linux/namei.h>
-+#include <linux/module.h>
-+#include <linux/mount.h>
-+#include <linux/page-flags.h>
-+#include <linux/writeback.h>
-+#include <linux/statfs.h>
-+#endif
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/file.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <linux/poll.h>
-+#include <linux/list.h>
-+#include <linux/init.h>
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)
-+#include <linux/xattr.h>
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#include <linux/security.h>
-+#endif
-+
-+#include <linux/swap.h>
-+
-+#include <asm/system.h>
-+/* #include <asm/segment.h> */
-+#include <asm/mman.h>
-+#include <linux/seq_file.h>
-+
-+/*
-+ * MACROS:
-+ */
-+
-+/* those mapped to ATTR_* were copied from linux/fs.h */
-+#define FA_MODE ATTR_MODE
-+#define FA_UID ATTR_UID
-+#define FA_GID ATTR_GID
-+#define FA_SIZE ATTR_SIZE
-+#define FA_ATIME ATTR_ATIME
-+#define FA_MTIME ATTR_MTIME
-+#define FA_CTIME ATTR_CTIME
-+#define FA_ATIME_SET ATTR_ATIME_SET
-+#define FA_MTIME_SET ATTR_MTIME_SET
-+#define FA_FORCE ATTR_FORCE
-+#define FA_ATTR_FLAGS ATTR_ATTR_FLAG
-+
-+/* must be greater than all other ATTR_* flags! */
-+#define FA_NLINK 2048
-+#define FA_BLKSIZE 4096
-+#define FA_BLOCKS 8192
-+#define FA_TIMES (FA_ATIME|FA_MTIME|FA_CTIME)
-+#define FA_ALL 0
-+
-+/* macros to manage changes between kernels */
-+#define INODE_DATA(i) (&(i)->i_data)
-+
-+#define MIN(x,y) ((x < y) ? (x) : (y))
-+#define MAX(x,y) ((x > y) ? (x) : (y))
-+#define MAXPATHLEN PATH_MAX
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5)
-+# define lookup_one_len(a,b,c) lookup_one(a,b)
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) */
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8)
-+# define generic_file_llseek default_llseek
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8) */
-+
-+#ifndef SEEK_SET
-+# define SEEK_SET 0
-+#endif /* not SEEK_SET */
-+
-+#ifndef SEEK_CUR
-+# define SEEK_CUR 1
-+#endif /* not SEEK_CUR */
-+
-+#ifndef SEEK_END
-+# define SEEK_END 2
-+#endif /* not SEEK_END */
-+
-+#ifndef DEFAULT_POLLMASK
-+# define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)
-+#endif /* not DEFAULT_POLLMASK */
-+
-+/* XXX: fix this so fistgen generates kfree() code directly */
-+#define kfree_s(a,b) kfree(a)
-+
-+/*
-+ * TYPEDEFS:
-+ */
-+typedef struct dentry dentry_t;
-+typedef struct file file_t;
-+typedef struct inode inode_t;
-+typedef inode_t vnode_t;
-+typedef struct page page_t;
-+typedef struct qstr qstr_t;
-+typedef struct super_block super_block_t;
-+typedef super_block_t vfs_t;
-+typedef struct vm_area_struct vm_area_t;
-+
-+
-+/*
-+ * EXTERNALS:
-+ */
-+
-+#define FPPF(str,page) printk("PPF %s 0x%x/%d: Lck:%d Err:%d Ref:%d Upd:%d Other::%d:%d:%d:%d:\n", \
-+ str, \
-+ (int) page, \
-+ (int) page->index, \
-+ (PageLocked(page) ? 1 : 0), \
-+ (PageError(page) ? 1 : 0), \
-+ (PageReferenced(page) ? 1 : 0), \
-+ (Page_Uptodate(page) ? 1 : 0), \
-+ (PageDecrAfter(page) ? 1 : 0), \
-+ (PageSlab(page) ? 1 : 0), \
-+ (PageSwapCache(page) ? 1 : 0), \
-+ (PageReserved(page) ? 1 : 0) \
-+ )
-+#define EZKDBG printk("EZK %s:%d:%s\n",__FILE__,__LINE__,__FUNCTION__)
-+#if 0
-+# define EZKDBG1 printk("EZK %s:%d\n",__FILE__,__LINE__)
-+#else
-+# define EZKDBG1
-+#endif
-+
-+extern int fist_get_debug_value(void);
-+extern int fist_set_debug_value(int val);
-+#if 0 /* mini_fo doesn't need these */
-+extern void fist_dprint_internal(int level, char *str,...);
-+extern void fist_print_dentry(char *str, const dentry_t *dentry);
-+extern void fist_print_inode(char *str, const inode_t *inode);
-+extern void fist_print_file(char *str, const file_t *file);
-+extern void fist_print_buffer_flags(char *str, struct buffer_head *buffer);
-+extern void fist_print_page_flags(char *str, page_t *page);
-+extern void fist_print_page_bytes(char *str, page_t *page);
-+extern void fist_print_pte_flags(char *str, const page_t *page);
-+extern void fist_checkinode(inode_t *inode, char *msg);
-+extern void fist_print_sb(char *str, const super_block_t *sb);
-+
-+/* §$% by mk: special debug functions */
-+extern void fist_mk_print_dentry(char *str, const dentry_t *dentry);
-+extern void fist_mk_print_inode(char *str, const inode_t *inode);
-+
-+extern char *add_indent(void);
-+extern char *del_indent(void);
-+#endif/* mini_fo doesn't need these */
-+
-+
-+#define STATIC
-+#define ASSERT(EX) \
-+do { \
-+ if (!(EX)) { \
-+ printk(KERN_CRIT "ASSERTION FAILED: %s at %s:%d (%s)\n", #EX, \
-+ __FILE__, __LINE__, __FUNCTION__); \
-+ (*((char *)0))=0; \
-+ } \
-+} while (0)
-+/* same ASSERT, but tell me who was the caller of the function */
-+#define ASSERT2(EX) \
-+do { \
-+ if (!(EX)) { \
-+ printk(KERN_CRIT "ASSERTION FAILED (caller): %s at %s:%d (%s)\n", #EX, \
-+ file, line, func); \
-+ (*((char *)0))=0; \
-+ } \
-+} while (0)
-+
-+#if 0 /* mini_fo doesn't need these */
-+#define dprintk(format, args...) printk(KERN_DEBUG format, ##args)
-+#define fist_dprint(level, str, args...) fist_dprint_internal(level, KERN_DEBUG str, ## args)
-+#define print_entry_location() fist_dprint(4, "%sIN: %s %s:%d\n", add_indent(), __FUNCTION__, __FILE__, __LINE__)
-+#define print_exit_location() fist_dprint(4, "%s OUT: %s %s:%d\n", del_indent(), __FUNCTION__, __FILE__, __LINE__)
-+#define print_exit_status(status) fist_dprint(4, "%s OUT: %s %s:%d, STATUS: %d\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, status)
-+#define print_exit_pointer(status) \
-+do { \
-+ if (IS_ERR(status)) \
-+ fist_dprint(4, "%s OUT: %s %s:%d, RESULT: %ld\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, PTR_ERR(status)); \
-+ else \
-+ fist_dprint(4, "%s OUT: %s %s:%d, RESULT: 0x%x\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, PTR_ERR(status)); \
-+} while (0)
-+#endif/* mini_fo doesn't need these */
-+
-+#endif /* __KERNEL__ */
-+
-+
-+/*
-+ * DEFINITIONS FOR USER AND KERNEL CODE:
-+ * (Note: ioctl numbers 1--9 are reserved for fistgen, the rest
-+ * are auto-generated automatically based on the user's .fist file.)
-+ */
-+# define FIST_IOCTL_GET_DEBUG_VALUE _IOR(0x15, 1, int)
-+# define FIST_IOCTL_SET_DEBUG_VALUE _IOW(0x15, 2, int)
-+
-+#endif /* not __FIST_H_ */
---- /dev/null
-+++ b/fs/mini_fo/inode.c
-@@ -0,0 +1,1564 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd)
-+#else
-+mini_fo_create(inode_t *dir, dentry_t *dentry, int mode)
-+#endif
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = create_sto_reg_file(dentry, mode, nd);
-+#else
-+ err = create_sto_reg_file(dentry, mode);
-+#endif
-+ check_mini_fo_dentry(dentry);
-+ return err;
-+}
-+
-+
-+STATIC dentry_t *
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_lookup(inode_t *dir, dentry_t *dentry, struct nameidata* nd)
-+#else
-+mini_fo_lookup(inode_t *dir, dentry_t *dentry)
-+#endif
-+{
-+ int err = 0;
-+ dentry_t *hidden_dir_dentry;
-+ dentry_t *hidden_dentry = NULL;
-+
-+ dentry_t *hidden_sto_dir_dentry;
-+ dentry_t *hidden_sto_dentry = NULL;
-+
-+ /* whiteout flag */
-+ int del_flag = 0;
-+ char *bpath = NULL;
-+
-+ const char *name;
-+ unsigned int namelen;
-+
-+ /* Don't allow lookups of META-files */
-+ namelen = strlen(META_FILENAME);
-+ if(namelen == dentry->d_name.len) {
-+ if(!strncmp(dentry->d_name.name, META_FILENAME, namelen)) {
-+ err = -ENOENT;
-+ goto out;
-+ }
-+ }
-+
-+ hidden_dir_dentry = dtohd(dentry->d_parent);
-+ hidden_sto_dir_dentry = dtohd2(dentry->d_parent);
-+
-+ name = dentry->d_name.name;
-+ namelen = dentry->d_name.len;
-+
-+ /* must initialize dentry operations */
-+ dentry->d_op = &mini_fo_dops;
-+
-+ /* setup the del_flag */
-+ del_flag = __meta_check_d_entry(dir, name, namelen);
-+ bpath = __meta_check_r_entry(dir, name, namelen);
-+
-+ /* perform the lookups of base and storage files:
-+ *
-+ * This caused some serious trouble, as a lookup_one_len passing
-+ * a negative dentry oopses. Solution is to only do the lookup
-+ * if the dentry is positive, else we set it to NULL
-+ * More trouble, who said a *_dir_dentry can't be NULL?
-+ */
-+ if(bpath) {
-+ /* Cross-Interposing (C), yeah! */
-+ hidden_dentry = bpath_walk(dir->i_sb, bpath);
-+ if(!hidden_dentry || !hidden_dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo_lookup: bpath_walk failed.\n");
-+ err= -EINVAL;
-+ goto out;
-+ }
-+
-+ /* this can be set up safely without fear of spaghetti
-+ * interposing as it is only used for copying times */
-+ hidden_dir_dentry = hidden_dentry->d_parent;
-+ kfree(bpath);
-+ }
-+ else if(hidden_dir_dentry && hidden_dir_dentry->d_inode)
-+ hidden_dentry =
-+ lookup_one_len(name, hidden_dir_dentry, namelen);
-+ else
-+ hidden_dentry = NULL;
-+
-+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+ hidden_sto_dentry =
-+ lookup_one_len(name, hidden_sto_dir_dentry, namelen);
-+ else
-+ hidden_sto_dentry = NULL;
-+
-+ /* catch error in lookup */
-+ if (IS_ERR(hidden_dentry) || IS_ERR(hidden_sto_dentry)) {
-+ /* mk: we need to call dput on the dentry, whose
-+ * lookup_one_len operation failed, in order to avoid
-+ * unmount trouble.
-+ */
-+ if(IS_ERR(hidden_dentry)) {
-+ printk(KERN_CRIT "mini_fo_lookup: ERR from base dentry, lookup failed.\n");
-+ err = PTR_ERR(hidden_dentry);
-+ } else {
-+ dput(hidden_dentry);
-+ }
-+ if(IS_ERR(hidden_sto_dentry)) {
-+ printk(KERN_CRIT "mini_fo_lookup: ERR from storage dentry, lookup failed.\n");
-+ err = PTR_ERR(hidden_sto_dentry);
-+ } else {
-+ dput(hidden_sto_dentry);
-+ }
-+ goto out;
-+ }
-+
-+ /* allocate dentry private data */
-+ __dtopd(dentry) = (struct mini_fo_dentry_info *)
-+ kmalloc(sizeof(struct mini_fo_dentry_info), GFP_KERNEL);
-+
-+ if (!dtopd(dentry)) {
-+ err = -ENOMEM;
-+ goto out_dput;
-+ }
-+
-+ /* check for different states of the mini_fo file to be looked up. */
-+
-+ /* state 1, file has been modified */
-+ if(hidden_dentry && hidden_sto_dentry &&
-+ hidden_dentry->d_inode && hidden_sto_dentry->d_inode && !del_flag) {
-+
-+ /* update parent directory's atime */
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = MODIFIED;
-+ dtohd(dentry) = hidden_dentry;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ err = mini_fo_tri_interpose(hidden_dentry,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state1).\n");
-+ goto out_free;
-+ }
-+ goto out;
-+ }
-+ /* state 2, file is unmodified */
-+ if(hidden_dentry && hidden_dentry->d_inode && !del_flag) {
-+
-+ fist_copy_attr_atime(dir, hidden_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = UNMODIFIED;
-+ dtohd(dentry) = hidden_dentry;
-+ dtohd2(dentry) = hidden_sto_dentry; /* could be negative */
-+
-+ err = mini_fo_tri_interpose(hidden_dentry,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state2).\n");
-+ goto out_free;
-+ }
-+ goto out;
-+ }
-+ /* state 3, file has been newly created */
-+ if(hidden_sto_dentry && hidden_sto_dentry->d_inode && !del_flag) {
-+
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+ dtopd(dentry)->state = CREATED;
-+ dtohd(dentry) = hidden_dentry; /* could be negative */
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ err = mini_fo_tri_interpose(hidden_dentry,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state3).\n");
-+ goto out_free;
-+ }
-+ goto out;
-+ }
-+
-+ /* state 4, file has deleted and created again. */
-+ if(hidden_dentry && hidden_sto_dentry &&
-+ hidden_dentry->d_inode &&
-+ hidden_sto_dentry->d_inode && del_flag) {
-+
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+ dtopd(dentry)->state = DEL_REWRITTEN;
-+ dtohd(dentry) = NULL;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ err = mini_fo_tri_interpose(NULL,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state4).\n");
-+ goto out_free;
-+ }
-+ /* We will never need this dentry again, as the file has been
-+ * deleted from base */
-+ dput(hidden_dentry);
-+ goto out;
-+ }
-+ /* state 5, file has been deleted in base */
-+ if(hidden_dentry && hidden_sto_dentry &&
-+ hidden_dentry->d_inode &&
-+ !hidden_sto_dentry->d_inode && del_flag) {
-+
-+ /* check which parents atime we need for updating */
-+ if(hidden_sto_dir_dentry->d_inode)
-+ fist_copy_attr_atime(dir,
-+ hidden_sto_dir_dentry->d_inode);
-+ else
-+ fist_copy_attr_atime(dir,
-+ hidden_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = DELETED;
-+ dtohd(dentry) = NULL;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ /* add negative dentry to dcache to speed up lookups */
-+ d_add(dentry, NULL);
-+ dput(hidden_dentry);
-+ goto out;
-+ }
-+ /* state 6, file does not exist */
-+ if(((hidden_dentry && !hidden_dentry->d_inode) ||
-+ (hidden_sto_dentry && !hidden_sto_dentry->d_inode)) && !del_flag)
-+ {
-+ /* check which parents atime we need for updating */
-+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+ else
-+ fist_copy_attr_atime(dir, hidden_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = NON_EXISTANT;
-+ dtohd(dentry) = hidden_dentry;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+ d_add(dentry, NULL);
-+ goto out;
-+ }
-+
-+ /* if we get to here, were in an invalid state. bad. */
-+ printk(KERN_CRIT "mini_fo_lookup: ERROR, meta data corruption detected.\n");
-+
-+ /* end state checking */
-+ out_free:
-+ d_drop(dentry); /* so that our bad dentry will get destroyed */
-+ kfree(dtopd(dentry));
-+ __dtopd(dentry) = NULL; /* be safe */
-+
-+ out_dput:
-+ if(hidden_dentry)
-+ dput(hidden_dentry);
-+ if(hidden_sto_dentry)
-+ dput(hidden_sto_dentry); /* drops usage count and marks for release */
-+
-+ out:
-+ /* initalize wol if file exists and is directory */
-+ if(dentry->d_inode) {
-+ if(S_ISDIR(dentry->d_inode->i_mode)) {
-+ itopd(dentry->d_inode)->deleted_list_size = -1;
-+ itopd(dentry->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(dentry);
-+ }
-+ }
-+ return ERR_PTR(err);
-+}
-+
-+
-+STATIC int
-+mini_fo_link(dentry_t *old_dentry, inode_t *dir, dentry_t *new_dentry)
-+{
-+ int err;
-+ dentry_t *hidden_old_dentry;
-+ dentry_t *hidden_new_dentry;
-+ dentry_t *hidden_dir_dentry;
-+
-+
-+ check_mini_fo_dentry(old_dentry);
-+ check_mini_fo_dentry(new_dentry);
-+ check_mini_fo_inode(dir);
-+
-+ /* no links to directorys and existing targets target allowed */
-+ if(S_ISDIR(old_dentry->d_inode->i_mode) ||
-+ is_mini_fo_existant(new_dentry)) {
-+ err = -EPERM;
-+ goto out;
-+ }
-+
-+ /* bring it directly from unmod to del_rew */
-+ if(dtost(old_dentry) == UNMODIFIED) {
-+ err = nondir_unmod_to_mod(old_dentry, 1);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ err = meta_add_d_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ dput(dtohd(old_dentry));
-+ dtohd(old_dentry) = NULL;
-+ dtost(old_dentry) = DEL_REWRITTEN;
-+ }
-+
-+ err = get_neg_sto_dentry(new_dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ hidden_old_dentry = dtohd2(old_dentry);
-+ hidden_new_dentry = dtohd2(new_dentry);
-+
-+ dget(hidden_old_dentry);
-+ dget(hidden_new_dentry);
-+
-+ /* was: hidden_dir_dentry = lock_parent(hidden_new_dentry); */
-+ hidden_dir_dentry = dget(hidden_new_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = vfs_link(hidden_old_dentry,
-+ hidden_dir_dentry->d_inode,
-+ hidden_new_dentry);
-+ if (err || !hidden_new_dentry->d_inode)
-+ goto out_lock;
-+
-+ dtost(new_dentry) = CREATED;
-+ err = mini_fo_tri_interpose(NULL, hidden_new_dentry, new_dentry, dir->i_sb, 0);
-+ if (err)
-+ goto out_lock;
-+
-+ fist_copy_attr_timesizes(dir, hidden_new_dentry->d_inode);
-+ /* propagate number of hard-links */
-+ old_dentry->d_inode->i_nlink = itohi2(old_dentry->d_inode)->i_nlink;
-+
-+ out_lock:
-+ /* was: unlock_dir(hidden_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_dir_dentry);
-+
-+ dput(hidden_new_dentry);
-+ dput(hidden_old_dentry);
-+ if (!new_dentry->d_inode)
-+ d_drop(new_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_unlink(inode_t *dir, dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ dget(dentry);
-+ if(dtopd(dentry)->state == MODIFIED) {
-+ err = nondir_mod_to_del(dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == UNMODIFIED) {
-+ err = nondir_unmod_to_del(dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == CREATED) {
-+ err = nondir_creat_to_del(dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == DEL_REWRITTEN) {
-+ err = nondir_del_rew_to_del(dentry);
-+ goto out;
-+ }
-+
-+ printk(KERN_CRIT "mini_fo_unlink: ERROR, invalid state detected.\n");
-+
-+ out:
-+ fist_copy_attr_times(dir, itohi2(dentry->d_parent->d_inode));
-+
-+ if(!err) {
-+ /* is this causing my pain? d_delete(dentry); */
-+ d_drop(dentry);
-+ }
-+
-+ dput(dentry);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_symlink(inode_t *dir, dentry_t *dentry, const char *symname)
-+{
-+ int err=0;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ umode_t mode;
-+#endif
-+
-+ /* Fail if the symlink file exists */
-+ if(!(dtost(dentry) == DELETED ||
-+ dtost(dentry) == NON_EXISTANT)) {
-+ err = -EEXIST;
-+ goto out;
-+ }
-+
-+ err = get_neg_sto_dentry(dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ dget(hidden_sto_dentry);
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ mode = S_IALLUGO;
-+ err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry, symname, mode);
-+#else
-+ err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ symname);
-+#endif
-+ if (err || !hidden_sto_dentry->d_inode)
-+ goto out_lock;
-+
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ } else if(dtost(dentry) == NON_EXISTANT) {
-+ dtost(dentry) = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ dput(hidden_sto_dentry);
-+ if (!dentry->d_inode)
-+ d_drop(dentry);
-+ out:
-+ return err;
-+}
-+
-+STATIC int
-+mini_fo_mkdir(inode_t *dir, dentry_t *dentry, int mode)
-+{
-+ int err;
-+
-+ err = create_sto_dir(dentry, mode);
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_rmdir(inode_t *dir, dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+ dentry_t *meta_dentry;
-+ inode_t *hidden_sto_dir = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+ check_mini_fo_inode(dir);
-+
-+ dget(dentry);
-+ if(dtopd(dentry)->state == MODIFIED) {
-+ /* XXX: disabled, because it does not bother to check files on
-+ * the original filesystem - just a hack, but better than simply
-+ * removing it without testing */
-+ err = -EINVAL;
-+ goto out;
-+
-+ hidden_sto_dir = itohi2(dir);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was:hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* Delete an old WOL file contained in the storage dir */
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ hidden_sto_dentry,
-+ strlen(META_FILENAME));
-+ if(meta_dentry->d_inode) {
-+ err = vfs_unlink(hidden_sto_dentry->d_inode, meta_dentry);
-+ dput(meta_dentry);
-+ if(!err)
-+ d_delete(meta_dentry);
-+ }
-+
-+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+ dput(dtohd(dentry));
-+
-+ dtohd(dentry) = NULL;
-+ dtopd(dentry)->state = DELETED;
-+
-+ /* carefull with R files */
-+ if( __meta_is_r_entry(dir,
-+ dentry->d_name.name,
-+ dentry->d_name.len) == 1) {
-+ err = meta_remove_r_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: rmdir: meta_remove_r_entry failed.\n");
-+ goto out;
-+ }
-+ }
-+ else {
-+ /* ok, add deleted file to META */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+ }
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == UNMODIFIED) {
-+ /* XXX: simply adding it to the delete list here is fscking dangerous!
-+ * as a temporary hack, i will disable rmdir on unmodified directories
-+ * for now.
-+ */
-+ err = -EINVAL;
-+ goto out;
-+
-+ err = get_neg_sto_dentry(dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* dput base dentry, this will relase the inode and free the
-+ * dentry, as we will never need it again. */
-+ dput(dtohd(dentry));
-+ dtohd(dentry) = NULL;
-+ dtopd(dentry)->state = DELETED;
-+
-+ /* add deleted file to META-file */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == CREATED) {
-+ hidden_sto_dir = itohi2(dir);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* Delete an old WOL file contained in the storage dir */
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ hidden_sto_dentry,
-+ strlen(META_FILENAME));
-+ if(meta_dentry->d_inode) {
-+ /* is this necessary? dget(meta_dentry); */
-+ err = vfs_unlink(hidden_sto_dentry->d_inode,
-+ meta_dentry);
-+ dput(meta_dentry);
-+ if(!err)
-+ d_delete(meta_dentry);
-+ }
-+
-+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+ dtopd(dentry)->state = NON_EXISTANT;
-+
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == DEL_REWRITTEN) {
-+ hidden_sto_dir = itohi2(dir);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* Delete an old WOL file contained in the storage dir */
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ hidden_sto_dentry,
-+ strlen(META_FILENAME));
-+ if(meta_dentry->d_inode) {
-+ /* is this necessary? dget(meta_dentry); */
-+ err = vfs_unlink(hidden_sto_dentry->d_inode,
-+ meta_dentry);
-+ dput(meta_dentry);
-+ if(!err)
-+ d_delete(meta_dentry);
-+ }
-+
-+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+ dtopd(dentry)->state = DELETED;
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ goto out;
-+ }
-+
-+ printk(KERN_CRIT "mini_fo_rmdir: ERROR, invalid state detected.\n");
-+
-+ out:
-+ if(!err) {
-+ d_drop(dentry);
-+ }
-+
-+ fist_copy_attr_times(dir, itohi2(dentry->d_parent->d_inode));
-+ dput(dentry);
-+
-+ return err;
-+}
-+
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_mknod(inode_t *dir, dentry_t *dentry, int mode, dev_t dev)
-+#else
-+mini_fo_mknod(inode_t *dir, dentry_t *dentry, int mode, int dev)
-+#endif
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ err = create_sto_nod(dentry, mode, dev);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo_mknod: creating sto nod failed.\n");
-+ err = -EINVAL;
-+ }
-+
-+ check_mini_fo_dentry(dentry);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_rename(inode_t *old_dir, dentry_t *old_dentry,
-+ inode_t *new_dir, dentry_t *new_dentry)
-+{
-+ /* dispatch */
-+ if(S_ISDIR(old_dentry->d_inode->i_mode))
-+ return rename_directory(old_dir, old_dentry, new_dir, new_dentry);
-+ return rename_nondir(old_dir, old_dentry, new_dir, new_dentry);
-+
-+}
-+
-+int rename_directory(inode_t *old_dir, dentry_t *old_dentry,
-+ inode_t *new_dir, dentry_t *new_dentry)
-+{
-+ int err, bpath_len;
-+ char *bpath;
-+
-+ dentry_t *hidden_old_dentry;
-+ dentry_t *hidden_new_dentry;
-+ dentry_t *hidden_old_dir_dentry;
-+ dentry_t *hidden_new_dir_dentry;
-+
-+ err = 0;
-+ bpath = NULL;
-+ bpath_len = 0;
-+
-+ /* this is a test, chuck out if it works */
-+ if(!(dtopd(new_dentry)->state == DELETED ||
-+ dtopd(new_dentry)->state == NON_EXISTANT)) {
-+ printk(KERN_CRIT "mini_fo: rename_directory: \
-+ uh, ah, new_dentry not negative.\n");
-+ /* return -1; */
-+ }
-+
-+ /* state = UNMODIFIED */
-+ if(dtopd(old_dentry)->state == UNMODIFIED) {
-+ err = dir_unmod_to_mod(old_dentry);
-+ if (err)
-+ goto out;
-+ }
-+
-+ /* state = MODIFIED */
-+ if(dtopd(old_dentry)->state == MODIFIED) {
-+ bpath = meta_check_r_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if(bpath) {
-+ err = meta_remove_r_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: rename_directory:\
-+ meta_remove_r_entry \
-+ failed.\n");
-+ goto out;
-+ }
-+ err = meta_add_r_entry(new_dentry->d_parent,
-+ bpath,
-+ strlen(bpath),
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+ kfree(bpath);
-+ }
-+ else {/* wol it */
-+ err = meta_add_d_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if (err)
-+ goto out;
-+ /* put it on rename list */
-+ err = get_mini_fo_bpath(old_dentry,
-+ &bpath,
-+ &bpath_len);
-+ if (err)
-+ goto out;
-+ err = meta_add_r_entry(new_dentry->d_parent,
-+ bpath, bpath_len,
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+ if (err)
-+ goto out;
-+ }
-+ /* no state change, MODIFIED stays MODIFIED */
-+ }
-+ /* state = CREATED */
-+ if(dtopd(old_dentry)->state == CREATED ||
-+ dtopd(old_dentry)->state == DEL_REWRITTEN) {
-+ if(dtohd(old_dentry))
-+ dput(dtohd(old_dentry));
-+
-+ if(dtopd(new_dentry)->state == DELETED) {
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ dtohd(old_dentry) = NULL;
-+ }
-+ else if(dtopd(new_dentry)->state == NON_EXISTANT) {
-+ dtopd(old_dentry)->state = CREATED;
-+ /* steal new dentry's neg. base dentry */
-+ dtohd(old_dentry) = dtohd(new_dentry);
-+ dtohd(new_dentry) = NULL;
-+ }
-+ }
-+ if(dtopd(new_dentry)->state == UNMODIFIED ||
-+ dtopd(new_dentry)->state == NON_EXISTANT) {
-+ err = get_neg_sto_dentry(new_dentry);
-+ if(err)
-+ goto out;
-+ }
-+
-+ /* now move sto file */
-+ hidden_old_dentry = dtohd2(old_dentry);
-+ hidden_new_dentry = dtohd2(new_dentry);
-+
-+ dget(hidden_old_dentry);
-+ dget(hidden_new_dentry);
-+
-+ hidden_old_dir_dentry = dget(hidden_old_dentry->d_parent);
-+ hidden_new_dir_dentry = dget(hidden_new_dentry->d_parent);
-+ double_lock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+
-+ err = vfs_rename(hidden_old_dir_dentry->d_inode, hidden_old_dentry,
-+ hidden_new_dir_dentry->d_inode, hidden_new_dentry);
-+ if(err)
-+ goto out_lock;
-+
-+ fist_copy_attr_all(new_dir, hidden_new_dir_dentry->d_inode);
-+ if (new_dir != old_dir)
-+ fist_copy_attr_all(old_dir,
-+ hidden_old_dir_dentry->d_inode);
-+
-+ out_lock:
-+ /* double_unlock will dput the new/old parent dentries
-+ * whose refcnts were incremented via get_parent above. */
-+ double_unlock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+ dput(hidden_new_dentry);
-+ dput(hidden_old_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+int rename_nondir(inode_t *old_dir, dentry_t *old_dentry,
-+ inode_t *new_dir, dentry_t *new_dentry)
-+{
-+ int err=0;
-+
-+ check_mini_fo_dentry(old_dentry);
-+ check_mini_fo_dentry(new_dentry);
-+ check_mini_fo_inode(old_dir);
-+ check_mini_fo_inode(new_dir);
-+
-+ /* state: UNMODIFIED */
-+ if(dtost(old_dentry) == UNMODIFIED) {
-+ err = nondir_unmod_to_mod(old_dentry, 1);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ }
-+
-+ /* the easy states */
-+ if(exists_in_storage(old_dentry)) {
-+
-+ dentry_t *hidden_old_dentry;
-+ dentry_t *hidden_new_dentry;
-+ dentry_t *hidden_old_dir_dentry;
-+ dentry_t *hidden_new_dir_dentry;
-+
-+ /* if old file is MODIFIED, add it to the deleted_list */
-+ if(dtopd(old_dentry)->state == MODIFIED) {
-+ meta_add_d_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+
-+ dput(dtohd(old_dentry));
-+ }
-+ /* if old file is CREATED, we only release the base dentry */
-+ if(dtopd(old_dentry)->state == CREATED) {
-+ if(dtohd(old_dentry))
-+ dput(dtohd(old_dentry));
-+ }
-+
-+ /* now setup the new states (depends on new_dentry state) */
-+ /* new dentry state = MODIFIED */
-+ if(dtopd(new_dentry)->state == MODIFIED) {
-+ meta_add_d_entry(new_dentry->d_parent,
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+
-+ /* new dentry will be d_put'ed later by the vfs
-+ * so don't do it here
-+ * dput(dtohd(new_dentry));
-+ */
-+ dtohd(old_dentry) = NULL;
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ }
-+ /* new dentry state = UNMODIFIED */
-+ else if(dtopd(new_dentry)->state == UNMODIFIED) {
-+ if(get_neg_sto_dentry(new_dentry))
-+ return -EINVAL;
-+
-+ meta_add_d_entry(new_dentry->d_parent,
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+
-+ /* is this right??? */
-+ /*dput(dtohd(new_dentry));*/
-+ dtohd(old_dentry) = NULL;
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ }
-+ /* new dentry state = CREATED */
-+ else if(dtopd(new_dentry)->state == CREATED) {
-+ /* we keep the neg. base dentry (if exists) */
-+ dtohd(old_dentry) = dtohd(new_dentry);
-+ /* ...and set it to Null, or we'll get
-+ * dcache.c:345 if it gets dput twice... */
-+ dtohd(new_dentry) = NULL;
-+ dtopd(old_dentry)->state = CREATED;
-+ }
-+ /* new dentry state = NON_EXISTANT */
-+ else if(dtopd(new_dentry)->state == NON_EXISTANT) {
-+ if(get_neg_sto_dentry(new_dentry))
-+ return -EINVAL;
-+
-+ /* we keep the neg. base dentry (if exists) */
-+ dtohd(old_dentry) = dtohd(new_dentry);
-+ /* ...and set it to Null, or we'll get
-+ * Dr. dcache.c:345 if it gets dput twice... */
-+ dtohd(new_dentry) = NULL;
-+ dtopd(old_dentry)->state = CREATED;
-+ }
-+ /* new dentry state = DEL_REWRITTEN or DELETED */
-+ else if(dtopd(new_dentry)->state == DEL_REWRITTEN ||
-+ dtopd(new_dentry)->state == DELETED) {
-+ dtohd(old_dentry) = NULL;
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ }
-+ else { /* not possible, uhh, ahh */
-+ printk(KERN_CRIT
-+ "mini_fo: rename_reg_file: invalid state detected [1].\n");
-+ return -1;
-+ }
-+
-+ /* now we definitely have a sto file */
-+ hidden_old_dentry = dtohd2(old_dentry);
-+ hidden_new_dentry = dtohd2(new_dentry);
-+
-+ dget(hidden_old_dentry);
-+ dget(hidden_new_dentry);
-+
-+ hidden_old_dir_dentry = dget(hidden_old_dentry->d_parent);
-+ hidden_new_dir_dentry = dget(hidden_new_dentry->d_parent);
-+ double_lock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+
-+ err = vfs_rename(hidden_old_dir_dentry->d_inode,
-+ hidden_old_dentry,
-+ hidden_new_dir_dentry->d_inode,
-+ hidden_new_dentry);
-+ if(err)
-+ goto out_lock;
-+
-+ fist_copy_attr_all(new_dir, hidden_new_dir_dentry->d_inode);
-+ if (new_dir != old_dir)
-+ fist_copy_attr_all(old_dir, hidden_old_dir_dentry->d_inode);
-+
-+ out_lock:
-+ /* double_unlock will dput the new/old parent dentries
-+ * whose refcnts were incremented via get_parent above.
-+ */
-+ double_unlock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+ dput(hidden_new_dentry);
-+ dput(hidden_old_dentry);
-+ out:
-+ return err;
-+ }
-+ else { /* invalid state */
-+ printk(KERN_CRIT "mini_fo: rename_reg_file: ERROR: invalid state detected [2].\n");
-+ return -1;
-+ }
-+}
-+
-+
-+STATIC int
-+mini_fo_readlink(dentry_t *dentry, char *buf, int bufsiz)
-+{
-+ int err=0;
-+ dentry_t *hidden_dentry = NULL;
-+
-+ if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+ hidden_dentry = dtohd2(dentry);
-+ } else if(dtohd(dentry) && dtohd(dentry)->d_inode) {
-+ hidden_dentry = dtohd(dentry);
-+ } else {
-+ goto out;
-+ }
-+
-+ if (!hidden_dentry->d_inode->i_op ||
-+ !hidden_dentry->d_inode->i_op->readlink) {
-+ err = -EINVAL; goto out;
-+ }
-+
-+ err = hidden_dentry->d_inode->i_op->readlink(hidden_dentry,
-+ buf,
-+ bufsiz);
-+ if (err > 0)
-+ fist_copy_attr_atime(dentry->d_inode, hidden_dentry->d_inode);
-+
-+ out:
-+ return err;
-+}
-+
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+static int mini_fo_follow_link(dentry_t *dentry, struct nameidata *nd)
-+#else
-+static void* mini_fo_follow_link(dentry_t *dentry, struct nameidata *nd)
-+#endif
-+{
-+ char *buf;
-+ int len = PAGE_SIZE, err;
-+ mm_segment_t old_fs;
-+
-+ /* in 2.6 this is freed by mini_fo_put_link called by __do_follow_link */
-+ buf = kmalloc(len, GFP_KERNEL);
-+ if (!buf) {
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+
-+ /* read the symlink, and then we will follow it */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+ err = dentry->d_inode->i_op->readlink(dentry, buf, len);
-+ set_fs(old_fs);
-+ if (err < 0) {
-+ kfree(buf);
-+ buf = NULL;
-+ goto out;
-+ }
-+ buf[err] = 0;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ nd_set_link(nd, buf);
-+ err = 0;
-+#else
-+ err = vfs_follow_link(nd, buf);
-+#endif
-+
-+ out:
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ kfree(buf);
-+#endif
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+ return err;
-+#else
-+ return ERR_PTR(err);
-+#endif
-+}
-+
-+STATIC
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+void mini_fo_put_link(struct dentry *dentry, struct nameidata *nd)
-+#else
-+void mini_fo_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
-+#endif
-+{
-+ char *link;
-+ link = nd_get_link(nd);
-+ kfree(link);
-+}
-+#endif
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_permission(inode_t *inode, int mask, struct nameidata *nd)
-+#else
-+mini_fo_permission(inode_t *inode, int mask)
-+#endif
-+{
-+ inode_t *hidden_inode;
-+ int mode;
-+ int err;
-+
-+ if(itohi2(inode)) {
-+ hidden_inode = itohi2(inode);
-+ } else {
-+ hidden_inode = itohi(inode);
-+ }
-+ mode = inode->i_mode;
-+
-+ /* not really needed, as permission handles everything:
-+ * err = vfs_permission(inode, mask);
-+ * if (err)
-+ * goto out;
-+ */
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = permission(hidden_inode, mask, nd);
-+#else
-+ err = permission(hidden_inode, mask);
-+#endif
-+
-+ /* out: */
-+ return err;
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+STATIC int
-+mini_fo_inode_revalidate(dentry_t *dentry)
-+{
-+ int err = 0;
-+ dentry_t *hidden_dentry;
-+ inode_t *hidden_inode;
-+
-+ ASSERT(dentry->d_inode);
-+ ASSERT(itopd(dentry->d_inode));
-+
-+ if(itohi2(dentry->d_inode)) {
-+ hidden_dentry = dtohd2(dentry);
-+ hidden_inode = hidden_dentry->d_inode;
-+ } else if(itohi(dentry->d_inode)) {
-+ hidden_dentry = dtohd(dentry);
-+ hidden_inode = hidden_dentry->d_inode;
-+ } else {
-+ printk(KERN_CRIT "mini_fo_inode_revalidate: ERROR, invalid state detected.\n");
-+ err = -ENOENT;
-+ goto out;
-+ }
-+ if (hidden_inode && hidden_inode->i_op && hidden_inode->i_op->revalidate){
-+ err = hidden_inode->i_op->revalidate(hidden_dentry);
-+ if (err)
-+ goto out;
-+ }
-+ fist_copy_attr_all(dentry->d_inode, hidden_inode);
-+ out:
-+ return err;
-+}
-+#endif
-+
-+STATIC int
-+mini_fo_setattr(dentry_t *dentry, struct iattr *ia)
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(!is_mini_fo_existant(dentry)) {
-+ printk(KERN_CRIT "mini_fo_setattr: ERROR, invalid state detected [1].\n");
-+ goto out;
-+ }
-+
-+ if(dtost(dentry) == UNMODIFIED) {
-+ if(!IS_COPY_FLAG(ia->ia_valid))
-+ goto out; /* we ignore these changes to base */
-+
-+ if(S_ISDIR(dentry->d_inode->i_mode)) {
-+ err = dir_unmod_to_mod(dentry);
-+ } else {
-+ /* we copy contents if file is not beeing truncated */
-+ if(S_ISREG(dentry->d_inode->i_mode) &&
-+ !(ia->ia_size == 0 && (ia->ia_valid & ATTR_SIZE))) {
-+ err = nondir_unmod_to_mod(dentry, 1);
-+ } else
-+ err = nondir_unmod_to_mod(dentry, 0);
-+ }
-+ if(err) {
-+ err = -EINVAL;
-+ printk(KERN_CRIT "mini_fo_setattr: ERROR changing states.\n");
-+ goto out;
-+ }
-+ }
-+ if(!exists_in_storage(dentry)) {
-+ printk(KERN_CRIT "mini_fo_setattr: ERROR, invalid state detected [2].\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ ASSERT(dentry->d_inode);
-+ ASSERT(dtohd2(dentry));
-+ ASSERT(itopd(dentry->d_inode));
-+ ASSERT(itohi2(dentry->d_inode));
-+
-+ err = notify_change(dtohd2(dentry), ia);
-+ fist_copy_attr_all(dentry->d_inode, itohi2(dentry->d_inode));
-+ out:
-+ return err;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+STATIC int
-+mini_fo_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
-+{
-+ int err = 0;
-+ dentry_t *hidden_dentry;
-+
-+ ASSERT(dentry->d_inode);
-+ ASSERT(itopd(dentry->d_inode));
-+
-+ if(itohi2(dentry->d_inode)) {
-+ hidden_dentry = dtohd2(dentry);
-+ } else if(itohi(dentry->d_inode)) {
-+ hidden_dentry = dtohd(dentry);
-+ } else {
-+ printk(KERN_CRIT "mini_fo_getattr: ERROR, invalid state detected.\n");
-+ err = -ENOENT;
-+ goto out;
-+ }
-+ fist_copy_attr_all(dentry->d_inode, hidden_dentry->d_inode);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ generic_fillattr(dentry->d_inode, stat);
-+ if (!stat->blksize) {
-+ struct super_block *s = hidden_dentry->d_inode->i_sb;
-+ unsigned blocks;
-+ blocks = (stat->size+s->s_blocksize-1) >> s->s_blocksize_bits;
-+ stat->blocks = (s->s_blocksize / 512) * blocks;
-+ stat->blksize = s->s_blocksize;
-+ }
-+ out:
-+ return err;
-+}
-+#endif
-+
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+#if 0 /* no xattr_alloc() and xattr_free() */
-+/* This is lifted from fs/xattr.c */
-+static void *
-+xattr_alloc(size_t size, size_t limit)
-+{
-+ void *ptr;
-+
-+ if (size > limit)
-+ return ERR_PTR(-E2BIG);
-+
-+ if (!size) /* size request, no buffer is needed */
-+ return NULL;
-+ else if (size <= PAGE_SIZE)
-+ ptr = kmalloc((unsigned long) size, GFP_KERNEL);
-+ else
-+ ptr = vmalloc((unsigned long) size);
-+ if (!ptr)
-+ return ERR_PTR(-ENOMEM);
-+ return ptr;
-+}
-+
-+static void
-+xattr_free(void *ptr, size_t size)
-+{
-+ if (!size) /* size request, no buffer was needed */
-+ return;
-+ else if (size <= PAGE_SIZE)
-+ kfree(ptr);
-+ else
-+ vfree(ptr);
-+}
-+#endif /* no xattr_alloc() and xattr_free() */
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_getxattr(struct dentry *dentry, const char *name, void *value, size_t size) {
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+ /* Define these anyway so we don't need as much ifdef'ed code. */
-+ char *encoded_name = NULL;
-+ char *encoded_value = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->getxattr) {
-+ encoded_name = (char *)name;
-+ encoded_value = (char *)value;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->getxattr(hidden_dentry, encoded_name, encoded_value, size);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21) \
-+ && LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,23)) \
-+ || LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
-+mini_fo_setxattr(struct dentry *dentry, const char *name,
-+ const void *value, size_t size, int flags)
-+#else
-+mini_fo_setxattr(struct dentry *dentry, const char *name,
-+ void *value, size_t size, int flags)
-+#endif
-+
-+{
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+
-+ /* Define these anyway, so we don't have as much ifdef'ed code. */
-+ char *encoded_value = NULL;
-+ char *encoded_name = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->setxattr) {
-+ encoded_name = (char *)name;
-+ encoded_value = (char *)value;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->setxattr(hidden_dentry, encoded_name, encoded_value, size, flags);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_removexattr(struct dentry *dentry, const char *name) {
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+ char *encoded_name;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->removexattr) {
-+ encoded_name = (char *)name;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->removexattr(hidden_dentry, encoded_name);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_listxattr(struct dentry *dentry, char *list, size_t size) {
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+ char *encoded_list = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->listxattr) {
-+ encoded_list = list;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->listxattr(hidden_dentry, encoded_list, size);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+# endif /* defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) */
-+
-+struct inode_operations mini_fo_symlink_iops =
-+ {
-+ readlink: mini_fo_readlink,
-+ follow_link: mini_fo_follow_link,
-+ /* mk: permission: mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ revalidate: mini_fo_inode_revalidate,
-+#endif
-+ setattr: mini_fo_setattr,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ getattr: mini_fo_getattr,
-+ put_link: mini_fo_put_link,
-+#endif
-+
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+ setxattr: mini_fo_setxattr,
-+ getxattr: mini_fo_getxattr,
-+ listxattr: mini_fo_listxattr,
-+ removexattr: mini_fo_removexattr
-+# endif /* defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) */
-+ };
-+
-+struct inode_operations mini_fo_dir_iops =
-+ {
-+ create: mini_fo_create,
-+ lookup: mini_fo_lookup,
-+ link: mini_fo_link,
-+ unlink: mini_fo_unlink,
-+ symlink: mini_fo_symlink,
-+ mkdir: mini_fo_mkdir,
-+ rmdir: mini_fo_rmdir,
-+ mknod: mini_fo_mknod,
-+ rename: mini_fo_rename,
-+ /* no readlink/follow_link for non-symlinks */
-+ // off because we have setattr
-+ // truncate: mini_fo_truncate,
-+ /* mk:permission: mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ revalidate: mini_fo_inode_revalidate,
-+#endif
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ getattr: mini_fo_getattr,
-+#endif
-+ setattr: mini_fo_setattr,
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+ setxattr: mini_fo_setxattr,
-+ getxattr: mini_fo_getxattr,
-+ listxattr: mini_fo_listxattr,
-+ removexattr: mini_fo_removexattr
-+# endif /* XATTR && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) */
-+ };
-+
-+struct inode_operations mini_fo_main_iops =
-+ {
-+ /* permission: mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ revalidate: mini_fo_inode_revalidate,
-+#endif
-+ setattr: mini_fo_setattr,
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ getattr: mini_fo_getattr,
-+#endif
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+ setxattr: mini_fo_setxattr,
-+ getxattr: mini_fo_getxattr,
-+ listxattr: mini_fo_listxattr,
-+ removexattr: mini_fo_removexattr
-+# endif /* XATTR && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) */
-+ };
---- /dev/null
-+++ b/fs/mini_fo/main.c
-@@ -0,0 +1,423 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+#include <linux/module.h>
-+
-+/* This definition must only appear after we include <linux/module.h> */
-+#ifndef MODULE_LICENSE
-+# define MODULE_LICENSE(bison)
-+#endif /* not MODULE_LICENSE */
-+
-+/*
-+ * This is the mini_fo tri interpose function, which extends the
-+ * functionality of the regular interpose by interposing a higher
-+ * level inode on top of two lower level ones: the base filesystem
-+ * inode and the storage filesystem inode.
-+ *
-+ * sb we pass is mini_fo's super_block
-+ */
-+int
-+mini_fo_tri_interpose(dentry_t *hidden_dentry,
-+ dentry_t *hidden_sto_dentry,
-+ dentry_t *dentry, super_block_t *sb, int flag)
-+{
-+ inode_t *hidden_inode = NULL;
-+ inode_t *hidden_sto_inode = NULL; /* store corresponding storage inode */
-+ int err = 0;
-+ inode_t *inode;
-+
-+ /* Pointer to hidden_sto_inode if exists, else to hidden_inode.
-+ * This is used to copy the attributes of the correct inode. */
-+ inode_t *master_inode;
-+
-+ if(hidden_dentry)
-+ hidden_inode = hidden_dentry->d_inode;
-+ if(hidden_sto_dentry)
-+ hidden_sto_inode = hidden_sto_dentry->d_inode;
-+
-+ ASSERT(dentry->d_inode == NULL);
-+
-+ /* mk: One of the inodes associated with the dentrys is likely to
-+ * be NULL, so carefull:
-+ */
-+ ASSERT((hidden_inode != NULL) || (hidden_sto_inode != NULL));
-+
-+ if(hidden_sto_inode)
-+ master_inode = hidden_sto_inode;
-+ else
-+ master_inode = hidden_inode;
-+
-+ /*
-+ * We allocate our new inode below, by calling iget.
-+ * iget will call our read_inode which will initialize some
-+ * of the new inode's fields
-+ */
-+
-+ /*
-+ * original: inode = iget(sb, hidden_inode->i_ino);
-+ */
-+ inode = iget(sb, iunique(sb, 25));
-+ if (!inode) {
-+ err = -EACCES; /* should be impossible??? */
-+ goto out;
-+ }
-+
-+ /*
-+ * interpose the inode if not already interposed
-+ * this is possible if the inode is being reused
-+ * XXX: what happens if we get_empty_inode() but there's another already?
-+ * for now, ASSERT() that this can't happen; fix later.
-+ */
-+ if (itohi(inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo_tri_interpose: itohi(inode) != NULL.\n");
-+ }
-+ if (itohi2(inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo_tri_interpose: itohi2(inode) != NULL.\n");
-+ }
-+
-+ /* mk: Carefull, igrab can't handle NULL inodes (ok, why should it?), so
-+ * we need to check here:
-+ */
-+ if(hidden_inode)
-+ itohi(inode) = igrab(hidden_inode);
-+ else
-+ itohi(inode) = NULL;
-+
-+ if(hidden_sto_inode)
-+ itohi2(inode) = igrab(hidden_sto_inode);
-+ else
-+ itohi2(inode) = NULL;
-+
-+
-+ /* Use different set of inode ops for symlinks & directories*/
-+ if (S_ISLNK(master_inode->i_mode))
-+ inode->i_op = &mini_fo_symlink_iops;
-+ else if (S_ISDIR(master_inode->i_mode))
-+ inode->i_op = &mini_fo_dir_iops;
-+
-+ /* Use different set of file ops for directories */
-+ if (S_ISDIR(master_inode->i_mode))
-+ inode->i_fop = &mini_fo_dir_fops;
-+
-+ /* properly initialize special inodes */
-+ if (S_ISBLK(master_inode->i_mode) || S_ISCHR(master_inode->i_mode) ||
-+ S_ISFIFO(master_inode->i_mode) || S_ISSOCK(master_inode->i_mode)) {
-+ init_special_inode(inode, master_inode->i_mode, master_inode->i_rdev);
-+ }
-+
-+ /* Fix our inode's address operations to that of the lower inode */
-+ if (inode->i_mapping->a_ops != master_inode->i_mapping->a_ops) {
-+ inode->i_mapping->a_ops = master_inode->i_mapping->a_ops;
-+ }
-+
-+ /* only (our) lookup wants to do a d_add */
-+ if (flag)
-+ d_add(dentry, inode);
-+ else
-+ d_instantiate(dentry, inode);
-+
-+ ASSERT(dtopd(dentry) != NULL);
-+
-+ /* all well, copy inode attributes */
-+ fist_copy_attr_all(inode, master_inode);
-+
-+ out:
-+ return err;
-+}
-+
-+/* parse mount options "base=" and "sto=" */
-+dentry_t *
-+mini_fo_parse_options(super_block_t *sb, char *options)
-+{
-+ dentry_t *hidden_root = ERR_PTR(-EINVAL);
-+ dentry_t *hidden_root2 = ERR_PTR(-EINVAL);
-+ struct nameidata nd, nd2;
-+ char *name, *tmp, *end;
-+ int err = 0;
-+
-+ /* We don't want to go off the end of our arguments later on. */
-+ for (end = options; *end; end++);
-+
-+ while (options < end) {
-+ tmp = options;
-+ while (*tmp && *tmp != ',')
-+ tmp++;
-+ *tmp = '\0';
-+ if (!strncmp("base=", options, 5)) {
-+ name = options + 5;
-+ printk(KERN_INFO "mini_fo: using base directory: %s\n", name);
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ if (path_init(name, LOOKUP_FOLLOW, &nd))
-+ err = path_walk(name, &nd);
-+#else
-+ err = path_lookup(name, LOOKUP_FOLLOW, &nd);
-+#endif
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: error accessing hidden directory '%s'\n", name);
-+ hidden_root = ERR_PTR(err);
-+ goto out;
-+ }
-+ hidden_root = nd.dentry;
-+ stopd(sb)->base_dir_dentry = nd.dentry;
-+ stopd(sb)->hidden_mnt = nd.mnt;
-+
-+ } else if(!strncmp("sto=", options, 4)) {
-+ /* parse the storage dir */
-+ name = options + 4;
-+ printk(KERN_INFO "mini_fo: using storage directory: %s\n", name);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ if(path_init(name, LOOKUP_FOLLOW, &nd2))
-+ err = path_walk(name, &nd2);
-+#else
-+ err = path_lookup(name, LOOKUP_FOLLOW, &nd2);
-+#endif
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: error accessing hidden storage directory '%s'\n", name);
-+
-+ hidden_root2 = ERR_PTR(err);
-+ goto out;
-+ }
-+ hidden_root2 = nd2.dentry;
-+ stopd(sb)->storage_dir_dentry = nd2.dentry;
-+ stopd(sb)->hidden_mnt2 = nd2.mnt;
-+ stohs2(sb) = hidden_root2->d_sb;
-+
-+ /* validate storage dir, this is done in
-+ * mini_fo_read_super for the base directory.
-+ */
-+ if (IS_ERR(hidden_root2)) {
-+ printk(KERN_WARNING "mini_fo_parse_options: storage dentry lookup failed (err = %ld)\n", PTR_ERR(hidden_root2));
-+ goto out;
-+ }
-+ if (!hidden_root2->d_inode) {
-+ printk(KERN_WARNING "mini_fo_parse_options: no storage dir to interpose on.\n");
-+ goto out;
-+ }
-+ stohs2(sb) = hidden_root2->d_sb;
-+ } else {
-+ printk(KERN_WARNING "mini_fo: unrecognized option '%s'\n", options);
-+ hidden_root = ERR_PTR(-EINVAL);
-+ goto out;
-+ }
-+ options = tmp + 1;
-+ }
-+
-+ out:
-+ if(IS_ERR(hidden_root2))
-+ return hidden_root2;
-+ return hidden_root;
-+}
-+
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+static int
-+#else
-+super_block_t *
-+#endif
-+mini_fo_read_super(super_block_t *sb, void *raw_data, int silent)
-+{
-+ dentry_t *hidden_root;
-+ int err = 0;
-+
-+ if (!raw_data) {
-+ printk(KERN_WARNING "mini_fo_read_super: missing argument\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ /*
-+ * Allocate superblock private data
-+ */
-+ __stopd(sb) = kmalloc(sizeof(struct mini_fo_sb_info), GFP_KERNEL);
-+ if (!stopd(sb)) {
-+ printk(KERN_WARNING "%s: out of memory\n", __FUNCTION__);
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+ stohs(sb) = NULL;
-+
-+ hidden_root = mini_fo_parse_options(sb, raw_data);
-+ if (IS_ERR(hidden_root)) {
-+ printk(KERN_WARNING "mini_fo_read_super: lookup_dentry failed (err = %ld)\n", PTR_ERR(hidden_root));
-+ err = PTR_ERR(hidden_root);
-+ goto out_free;
-+ }
-+ if (!hidden_root->d_inode) {
-+ printk(KERN_WARNING "mini_fo_read_super: no directory to interpose on\n");
-+ goto out_free;
-+ }
-+ stohs(sb) = hidden_root->d_sb;
-+
-+ /*
-+ * Linux 2.4.2-ac3 and beyond has code in
-+ * mm/filemap.c:generic_file_write() that requires sb->s_maxbytes
-+ * to be populated. If not set, all write()s under that sb will
-+ * return 0.
-+ *
-+ * Linux 2.4.4+ automatically sets s_maxbytes to MAX_NON_LFS;
-+ * the filesystem should override it only if it supports LFS.
-+ */
-+ /* non-SCA code is good to go with LFS */
-+ sb->s_maxbytes = hidden_root->d_sb->s_maxbytes;
-+
-+ sb->s_op = &mini_fo_sops;
-+ /*
-+ * we can't use d_alloc_root if we want to use
-+ * our own interpose function unchanged,
-+ * so we simply replicate *most* of the code in d_alloc_root here
-+ */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ sb->s_root = d_alloc(NULL, &(const struct qstr) { "/", 1, 0 });
-+#else
-+ sb->s_root = d_alloc(NULL, &(const struct qstr){hash: 0, name: "/", len : 1});
-+#endif
-+ if (IS_ERR(sb->s_root)) {
-+ printk(KERN_WARNING "mini_fo_read_super: d_alloc failed\n");
-+ err = -ENOMEM;
-+ goto out_dput;
-+ }
-+
-+ sb->s_root->d_op = &mini_fo_dops;
-+ sb->s_root->d_sb = sb;
-+ sb->s_root->d_parent = sb->s_root;
-+
-+ /* link the upper and lower dentries */
-+ __dtopd(sb->s_root) = (struct mini_fo_dentry_info *)
-+ kmalloc(sizeof(struct mini_fo_dentry_info), GFP_KERNEL);
-+ if (!dtopd(sb->s_root)) {
-+ err = -ENOMEM;
-+ goto out_dput2;
-+ }
-+ dtopd(sb->s_root)->state = MODIFIED;
-+ dtohd(sb->s_root) = hidden_root;
-+
-+ /* fanout relevant, interpose on storage root dentry too */
-+ dtohd2(sb->s_root) = stopd(sb)->storage_dir_dentry;
-+
-+ /* ...and call tri-interpose to interpose root dir inodes
-+ * if (mini_fo_interpose(hidden_root, sb->s_root, sb, 0))
-+ */
-+ if(mini_fo_tri_interpose(hidden_root, dtohd2(sb->s_root), sb->s_root, sb, 0))
-+ goto out_dput2;
-+
-+ /* initalize the wol list */
-+ itopd(sb->s_root->d_inode)->deleted_list_size = -1;
-+ itopd(sb->s_root->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(sb->s_root);
-+
-+ goto out;
-+
-+ out_dput2:
-+ dput(sb->s_root);
-+ out_dput:
-+ dput(hidden_root);
-+ dput(dtohd2(sb->s_root)); /* release the hidden_sto_dentry too */
-+ out_free:
-+ kfree(stopd(sb));
-+ __stopd(sb) = NULL;
-+ out:
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ return err;
-+#else
-+ if (err) {
-+ return ERR_PTR(err);
-+ } else {
-+ return sb;
-+ }
-+#endif
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+static int mini_fo_get_sb(struct file_system_type *fs_type,
-+ int flags, const char *dev_name,
-+ void *raw_data, struct vfsmount *mnt)
-+{
-+ return get_sb_nodev(fs_type, flags, raw_data, mini_fo_read_super, mnt);
-+}
-+#else
-+static struct super_block *mini_fo_get_sb(struct file_system_type *fs_type,
-+ int flags, const char *dev_name,
-+ void *raw_data)
-+{
-+ return get_sb_nodev(fs_type, flags, raw_data, mini_fo_read_super);
-+}
-+#endif
-+
-+void mini_fo_kill_block_super(struct super_block *sb)
-+{
-+ generic_shutdown_super(sb);
-+ /*
-+ * XXX: BUG: Halcrow: Things get unstable sometime after this point:
-+ * lib/rwsem-spinlock.c:127: spin_is_locked on uninitialized
-+ * fs/fs-writeback.c:402: spin_lock(fs/super.c:a0381828) already
-+ * locked by fs/fs-writeback.c/402
-+ *
-+ * Apparently, someone's not releasing a lock on sb_lock...
-+ */
-+}
-+
-+static struct file_system_type mini_fo_fs_type = {
-+ .owner = THIS_MODULE,
-+ .name = "mini_fo",
-+ .get_sb = mini_fo_get_sb,
-+ .kill_sb = mini_fo_kill_block_super,
-+ .fs_flags = 0,
-+};
-+
-+
-+#else
-+static DECLARE_FSTYPE(mini_fo_fs_type, "mini_fo", mini_fo_read_super, 0);
-+#endif
-+
-+static int __init init_mini_fo_fs(void)
-+{
-+ printk("Registering mini_fo version $Id$\n");
-+ return register_filesystem(&mini_fo_fs_type);
-+}
-+static void __exit exit_mini_fo_fs(void)
-+{
-+ printk("Unregistering mini_fo version $Id$\n");
-+ unregister_filesystem(&mini_fo_fs_type);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+EXPORT_NO_SYMBOLS;
-+#endif
-+
-+MODULE_AUTHOR("Erez Zadok <ezk@cs.sunysb.edu>");
-+MODULE_DESCRIPTION("FiST-generated mini_fo filesystem");
-+MODULE_LICENSE("GPL");
-+
-+/* MODULE_PARM(fist_debug_var, "i"); */
-+/* MODULE_PARM_DESC(fist_debug_var, "Debug level"); */
-+
-+module_init(init_mini_fo_fs)
-+module_exit(exit_mini_fo_fs)
---- /dev/null
-+++ b/fs/mini_fo/Makefile
-@@ -0,0 +1,17 @@
-+#
-+# Makefile for mini_fo 2.4 and 2.6 Linux kernels
-+#
-+# Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+#
-+# 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.
-+#
-+
-+obj-$(CONFIG_MINI_FO) := mini_fo.o
-+mini_fo-objs := meta.o dentry.o file.o inode.o main.o super.o state.o aux.o
-+
-+# dependencies
-+${mini_fo-objs}: mini_fo.h fist.h
-+
---- /dev/null
-+++ b/fs/mini_fo/meta.c
-@@ -0,0 +1,1000 @@
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+int meta_build_lists(dentry_t *dentry)
-+{
-+ struct mini_fo_inode_info *inode_info;
-+
-+ dentry_t *meta_dentry = 0;
-+ file_t *meta_file = 0;
-+ mm_segment_t old_fs;
-+ void *buf;
-+
-+ int bytes, len;
-+ struct vfsmount *meta_mnt;
-+ char *entry;
-+
-+ inode_info = itopd(dentry->d_inode);
-+ if(!(inode_info->deleted_list_size == -1 &&
-+ inode_info->renamed_list_size == -1)) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ Error, list(s) not virgin.\n");
-+ return -1;
-+ }
-+
-+ /* init our meta lists */
-+ INIT_LIST_HEAD(&inode_info->deleted_list);
-+ inode_info->deleted_list_size = 0;
-+
-+ INIT_LIST_HEAD(&inode_info->renamed_list);
-+ inode_info->renamed_list_size = 0;
-+
-+ /* might there be a META-file? */
-+ if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen(META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ dput(meta_dentry);
-+ goto out_ok;
-+ }
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
-+
-+ /* open META-file for reading */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x0);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ ERROR opening META file.\n");
-+ goto out_err;
-+ }
-+
-+ /* check if fs supports reading */
-+ if(!meta_file->f_op->read) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ ERROR, fs does not support reading.\n");
-+ goto out_err_close;
-+ }
-+
-+ /* allocate a page for transfering the data */
-+ buf = (void *) __get_free_page(GFP_KERNEL);
-+ if(!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ ERROR, out of mem.\n");
-+ goto out_err_close;
-+ }
-+ meta_file->f_pos = 0;
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+ do {
-+ char *c;
-+ bytes = meta_file->f_op->read(meta_file, buf, PAGE_SIZE, &meta_file->f_pos);
-+ if(bytes == PAGE_SIZE) {
-+ /* trim a cut off filename and adjust f_pos to get it next time */
-+ for(c = (char*) buf+PAGE_SIZE;
-+ *c != '\n';
-+ c--, bytes--, meta_file->f_pos--);
-+ }
-+ entry = (char *) buf;
-+ while(entry < (char *) buf+bytes) {
-+
-+ char *old_path;
-+ char *dir_name;
-+ int old_len, new_len;
-+
-+ /* len without '\n'*/
-+ len = (int) (strchr(entry, '\n') - entry);
-+ switch (*entry) {
-+ case 'D':
-+ /* format: "D filename" */
-+ meta_list_add_d_entry(dentry,
-+ entry+2,
-+ len-2);
-+ break;
-+ case 'R':
-+ /* format: "R path/xy/dir newDir" */
-+ old_path = entry+2;
-+ dir_name = strchr(old_path, ' ') + 1;
-+ old_len = dir_name - old_path - 1;
-+ new_len = ((int) entry) + len - ((int ) dir_name);
-+ meta_list_add_r_entry(dentry,
-+ old_path,
-+ old_len,
-+ dir_name,
-+ new_len);
-+ break;
-+ default:
-+ /* unknown entry type detected */
-+ break;
-+ }
-+ entry += len+1;
-+ }
-+
-+ } while(meta_file->f_pos < meta_dentry->d_inode->i_size);
-+
-+ free_page((unsigned long) buf);
-+ set_fs(old_fs);
-+ fput(meta_file);
-+ }
-+ goto out_ok;
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out_err:
-+ mntput(meta_mnt);
-+ dput(meta_dentry);
-+ return -1;
-+ out_ok:
-+ return 1; /* check this!!! inode_info->wol_size; */
-+}
-+
-+/* cleanups up all lists and free's the mem by dentry */
-+int meta_put_lists(dentry_t *dentry)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk("mini_fo: meta_put_lists: invalid dentry passed.\n");
-+ return -1;
-+ }
-+ return __meta_put_lists(dentry->d_inode);
-+}
-+
-+/* cleanups up all lists and free's the mem by inode */
-+int __meta_put_lists(inode_t *inode)
-+{
-+ int err = 0;
-+ if(!inode || !itopd(inode)) {
-+ printk("mini_fo: __meta_put_lists: invalid inode passed.\n");
-+ return -1;
-+ }
-+ err = __meta_put_d_list(inode);
-+ err |= __meta_put_r_list(inode);
-+ return err;
-+}
-+
-+int meta_sync_lists(dentry_t *dentry)
-+{
-+ int err = 0;
-+ if(!dentry || !dentry->d_inode) {
-+ printk("mini_fo: meta_sync_lists: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ err = meta_sync_d_list(dentry, 0);
-+ err |= meta_sync_r_list(dentry, 1);
-+ return err;
-+}
-+
-+
-+/* remove all D entries from the renamed list and free the mem */
-+int __meta_put_d_list(inode_t *inode)
-+{
-+ struct list_head *tmp;
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: __meta_put_d_list: \
-+ invalid inode passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(inode);
-+
-+ /* nuke the DELETED-list */
-+ if(inode_info->deleted_list_size <= 0)
-+ return 0;
-+
-+ while(!list_empty(&inode_info->deleted_list)) {
-+ tmp = inode_info->deleted_list.next;
-+ list_del(tmp);
-+ del_entry = list_entry(tmp, struct deleted_entry, list);
-+ kfree(del_entry->name);
-+ kfree(del_entry);
-+ }
-+ inode_info->deleted_list_size = 0;
-+
-+ return 0;
-+}
-+
-+/* remove all R entries from the renamed list and free the mem */
-+int __meta_put_r_list(inode_t *inode)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: meta_put_r_list: invalid inode.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(inode);
-+
-+ /* nuke the RENAMED-list */
-+ if(inode_info->renamed_list_size <= 0)
-+ return 0;
-+
-+ while(!list_empty(&inode_info->renamed_list)) {
-+ tmp = inode_info->renamed_list.next;
-+ list_del(tmp);
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ kfree(ren_entry->new_name);
-+ kfree(ren_entry->old_name);
-+ kfree(ren_entry);
-+ }
-+ inode_info->renamed_list_size = 0;
-+
-+ return 0;
-+}
-+
-+int meta_add_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ int err = 0;
-+ err = meta_list_add_d_entry(dentry, name, len);
-+ err |= meta_write_d_entry(dentry,name,len);
-+ return err;
-+}
-+
-+/* add a D entry to the deleted list */
-+int meta_list_add_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_d_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->deleted_list_size < 0)
-+ return -1;
-+
-+ del_entry = (struct deleted_entry *)
-+ kmalloc(sizeof(struct deleted_entry), GFP_KERNEL);
-+ del_entry->name = (char*) kmalloc(len, GFP_KERNEL);
-+ if(!del_entry || !del_entry->name) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_d_entry: \
-+ out of mem.\n");
-+ kfree(del_entry->name);
-+ kfree(del_entry);
-+ return -ENOMEM;
-+ }
-+
-+ strncpy(del_entry->name, name, len);
-+ del_entry->len = len;
-+
-+ list_add(&del_entry->list, &inode_info->deleted_list);
-+ inode_info->deleted_list_size++;
-+ return 0;
-+}
-+
-+int meta_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len)
-+{
-+ int err = 0;
-+ err = meta_list_add_r_entry(dentry,
-+ old_name, old_len,
-+ new_name, new_len);
-+ err |= meta_write_r_entry(dentry,
-+ old_name, old_len,
-+ new_name, new_len);
-+ return err;
-+}
-+
-+/* add a R entry to the renamed list */
-+int meta_list_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len)
-+{
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_r_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->renamed_list_size < 0)
-+ return -1;
-+
-+ ren_entry = (struct renamed_entry *)
-+ kmalloc(sizeof(struct renamed_entry), GFP_KERNEL);
-+ ren_entry->old_name = (char*) kmalloc(old_len, GFP_KERNEL);
-+ ren_entry->new_name = (char*) kmalloc(new_len, GFP_KERNEL);
-+
-+ if(!ren_entry || !ren_entry->old_name || !ren_entry->new_name) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_r_entry: \
-+ out of mem.\n");
-+ kfree(ren_entry->new_name);
-+ kfree(ren_entry->old_name);
-+ kfree(ren_entry);
-+ return -ENOMEM;
-+ }
-+
-+ strncpy(ren_entry->old_name, old_name, old_len);
-+ ren_entry->old_len = old_len;
-+ strncpy(ren_entry->new_name, new_name, new_len);
-+ ren_entry->new_len = new_len;
-+
-+ list_add(&ren_entry->list, &inode_info->renamed_list);
-+ inode_info->renamed_list_size++;
-+ return 0;
-+}
-+
-+
-+int meta_remove_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ int err = 0;
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT
-+ "mini_fo: meta_remove_r_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+
-+ err = meta_list_remove_r_entry(dentry, name, len);
-+ err |= meta_sync_lists(dentry);
-+ return err;
-+}
-+
-+int meta_list_remove_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT
-+ "mini_fo: meta_list_remove_r_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ return __meta_list_remove_r_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_list_remove_r_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode))
-+ printk(KERN_CRIT
-+ "mini_fo: __meta_list_remove_r_entry: \
-+ invalid inode passed.\n");
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->renamed_list_size < 0)
-+ return -1;
-+ if(inode_info->renamed_list_size == 0)
-+ return 1;
-+
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ if(ren_entry->new_len != len)
-+ continue;
-+
-+ if(!strncmp(ren_entry->new_name, name, len)) {
-+ list_del(tmp);
-+ kfree(ren_entry->new_name);
-+ kfree(ren_entry->old_name);
-+ kfree(ren_entry);
-+ inode_info->renamed_list_size--;
-+ return 0;
-+ }
-+ }
-+ return 1;
-+}
-+
-+
-+/* append a single D entry to the meta file */
-+int meta_write_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ dentry_t *meta_dentry = 0;
-+ file_t *meta_file = 0;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err;
-+ struct vfsmount *meta_mnt = 0;
-+ char *buf;
-+
-+ err = 0;
-+
-+ if(itopd(dentry->d_inode)->deleted_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ if(dtopd(dentry)->state == UNMODIFIED) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry), strlen (META_FILENAME));
-+
-+ /* We need to create a META-file */
-+ if(!meta_dentry->d_inode) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry,
-+ S_IRUSR | S_IWUSR,
-+ NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry,
-+ S_IRUSR | S_IWUSR);
-+#endif
-+ }
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ ERROR opening meta file.\n");
-+ mntput(meta_mnt); /* $%& is this necessary? */
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* size: len for name, 1 for \n and 2 for "D " */
-+ buf = (char *) kmalloc(len+3, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ out of mem.\n");
-+ return -ENOMEM;
-+ }
-+
-+ buf[0] = 'D';
-+ buf[1] = ' ';
-+ strncpy(buf+2, name, len);
-+ buf[len+2] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf, len+3,
-+ &meta_file->f_pos);
-+ if(bytes != len+3) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ ERROR writing.\n");
-+ err = -1;
-+ }
-+ kfree(buf);
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+}
-+
-+/* append a single R entry to the meta file */
-+int meta_write_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len)
-+{
-+ dentry_t *meta_dentry = 0;
-+ file_t *meta_file = 0;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err, buf_len;
-+ struct vfsmount *meta_mnt = 0;
-+ char *buf;
-+
-+
-+ err = 0;
-+
-+ if(itopd(dentry->d_inode)->renamed_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* build the storage structure? */
-+ if(dtopd(dentry)->state == UNMODIFIED) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen (META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+ }
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+ ERROR opening meta file.\n");
-+ mntput(meta_mnt);
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* size: 2 for "R ", old_len+new_len for names, 1 blank+1 \n */
-+ buf_len = old_len + new_len + 4;
-+ buf = (char *) kmalloc(buf_len, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: out of mem.\n");
-+ return -ENOMEM;
-+ }
-+
-+ buf[0] = 'R';
-+ buf[1] = ' ';
-+ strncpy(buf + 2, old_name, old_len);
-+ buf[old_len + 2] = ' ';
-+ strncpy(buf + old_len + 3, new_name, new_len);
-+ buf[buf_len -1] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf, buf_len, &meta_file->f_pos);
-+ if(bytes != buf_len) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: ERROR writing.\n");
-+ err = -1;
-+ }
-+
-+ kfree(buf);
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+}
-+
-+/* sync D list to disk, append data if app_flag is 1 */
-+/* check the meta_mnt, which seems not to be used (properly) */
-+
-+int meta_sync_d_list(dentry_t *dentry, int app_flag)
-+{
-+ dentry_t *meta_dentry;
-+ file_t *meta_file;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err;
-+ struct vfsmount *meta_mnt;
-+ char *buf;
-+
-+ struct list_head *tmp;
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ err = 0;
-+ meta_file=0;
-+ meta_mnt=0;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ invalid inode passed.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->deleted_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* ok, there is something to sync */
-+
-+ /* build the storage structure? */
-+ if(!dtohd2(dentry) && !itohi2(dentry->d_inode)) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen(META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+ app_flag = 0;
-+ }
-+ /* need we truncate the meta file? */
-+ if(!app_flag) {
-+ struct iattr newattrs;
-+ newattrs.ia_size = 0;
-+ newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ down(&meta_dentry->d_inode->i_sem);
-+#endif
-+ err = notify_change(meta_dentry, &newattrs);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ up(&meta_dentry->d_inode->i_sem);
-+#endif
-+
-+ if(err || meta_dentry->d_inode->i_size != 0) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR truncating meta file.\n");
-+ goto out_err_close;
-+ }
-+ }
-+
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR opening meta file.\n");
-+ /* we don't mntget so we dont't mntput (for now)
-+ * mntput(meta_mnt);
-+ */
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* here we go... */
-+ list_for_each(tmp, &inode_info->deleted_list) {
-+ del_entry = list_entry(tmp, struct deleted_entry, list);
-+
-+ /* size: len for name, 1 for \n and 2 for "D " */
-+ buf = (char *) kmalloc(del_entry->len+3, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ out of mem.\n");
-+ return -ENOMEM;
-+ }
-+
-+ buf[0] = 'D';
-+ buf[1] = ' ';
-+ strncpy(buf+2, del_entry->name, del_entry->len);
-+ buf[del_entry->len+2] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf,
-+ del_entry->len+3,
-+ &meta_file->f_pos);
-+ if(bytes != del_entry->len+3) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR writing.\n");
-+ err |= -1;
-+ }
-+ kfree(buf);
-+ }
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+
-+}
-+
-+int meta_sync_r_list(dentry_t *dentry, int app_flag)
-+{
-+ dentry_t *meta_dentry;
-+ file_t *meta_file;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err, buf_len;
-+ struct vfsmount *meta_mnt;
-+ char *buf;
-+
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ err = 0;
-+ meta_file=0;
-+ meta_mnt=0;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ invalid dentry passed.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->deleted_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* ok, there is something to sync */
-+
-+ /* build the storage structure? */
-+ if(!dtohd2(dentry) && !itohi2(dentry->d_inode)) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen(META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+ app_flag = 0;
-+ }
-+ /* need we truncate the meta file? */
-+ if(!app_flag) {
-+ struct iattr newattrs;
-+ newattrs.ia_size = 0;
-+ newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ down(&meta_dentry->d_inode->i_sem);
-+#endif
-+ err = notify_change(meta_dentry, &newattrs);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ up(&meta_dentry->d_inode->i_sem);
-+#endif
-+ if(err || meta_dentry->d_inode->i_size != 0) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR truncating meta file.\n");
-+ goto out_err_close;
-+ }
-+ }
-+
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR opening meta file.\n");
-+ /* we don't mntget so we dont't mntput (for now)
-+ * mntput(meta_mnt);
-+ */
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* here we go... */
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ /* size:
-+ * 2 for "R ", old_len+new_len for names, 1 blank+1 \n */
-+ buf_len = ren_entry->old_len + ren_entry->new_len + 4;
-+ buf = (char *) kmalloc(buf_len, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ out of mem.\n");
-+ return -ENOMEM;
-+ }
-+ buf[0] = 'R';
-+ buf[1] = ' ';
-+ strncpy(buf + 2, ren_entry->old_name, ren_entry->old_len);
-+ buf[ren_entry->old_len + 2] = ' ';
-+ strncpy(buf + ren_entry->old_len + 3,
-+ ren_entry->new_name, ren_entry->new_len);
-+ buf[buf_len - 1] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf,
-+ buf_len, &meta_file->f_pos);
-+ if(bytes != buf_len) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR writing.\n");
-+ err |= -1;
-+ }
-+ kfree(buf);
-+ }
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+}
-+
-+int meta_check_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode)
-+ printk(KERN_CRIT "mini_fo: meta_check_d_dentry: \
-+ invalid dentry passed.\n");
-+ return __meta_check_d_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_check_d_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode))
-+ printk(KERN_CRIT "mini_fo: __meta_check_d_dentry: \
-+ invalid inode passed.\n");
-+
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->deleted_list_size <= 0)
-+ return 0;
-+
-+ list_for_each(tmp, &inode_info->deleted_list) {
-+ del_entry = list_entry(tmp, struct deleted_entry, list);
-+ if(del_entry->len != len)
-+ continue;
-+
-+ if(!strncmp(del_entry->name, name, len))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/*
-+ * check if file has been renamed and return path to orig. base dir.
-+ * Implements no error return values so far, what of course sucks.
-+ * String is null terminated.'
-+ */
-+char* meta_check_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry: \
-+ invalid dentry passed.\n");
-+ return NULL;
-+ }
-+ return __meta_check_r_entry(dentry->d_inode, name, len);
-+}
-+
-+char* __meta_check_r_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+ char *old_path;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry: \
-+ invalid inode passed.\n");
-+ return NULL;
-+ }
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->renamed_list_size <= 0)
-+ return NULL;
-+
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ if(ren_entry->new_len != len)
-+ continue;
-+
-+ if(!strncmp(ren_entry->new_name, name, len)) {
-+ old_path = (char *)
-+ kmalloc(ren_entry->old_len+1, GFP_KERNEL);
-+ strncpy(old_path,
-+ ren_entry->old_name,
-+ ren_entry->old_len);
-+ old_path[ren_entry->old_len]='\0';
-+ return old_path;
-+ }
-+ }
-+ return NULL;
-+}
-+
-+/*
-+ * This version only checks if entry exists and return:
-+ * 1 if exists,
-+ * 0 if not,
-+ * -1 if error.
-+ */
-+int meta_is_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry [2]: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ return __meta_is_r_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_is_r_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry [2]: \
-+ invalid inode passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->renamed_list_size <= 0)
-+ return -1;
-+
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ if(ren_entry->new_len != len)
-+ continue;
-+
-+ if(!strncmp(ren_entry->new_name, name, len))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
---- /dev/null
-+++ b/fs/mini_fo/mini_fo.h
-@@ -0,0 +1,510 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifndef __MINI_FO_H_
-+#define __MINI_FO_H_
-+
-+#ifdef __KERNEL__
-+
-+/* META stuff */
-+#define META_FILENAME "META_dAfFgHE39ktF3HD2sr"
-+
-+/* use xattrs? */
-+#define XATTR
-+
-+/* File attributes that when changed, result in a file beeing copied to storage */
-+#define COPY_FLAGS ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_SIZE
-+
-+/*
-+ * mini_fo filestates
-+ */
-+#define MODIFIED 1
-+#define UNMODIFIED 2
-+#define CREATED 3
-+#define DEL_REWRITTEN 4
-+#define DELETED 5
-+#define NON_EXISTANT 6
-+
-+/* fist file systems superblock magic */
-+# define MINI_FO_SUPER_MAGIC 0xf15f
-+
-+/*
-+ * STRUCTURES:
-+ */
-+
-+/* mini_fo inode data in memory */
-+struct mini_fo_inode_info {
-+ inode_t *wii_inode;
-+ inode_t *wii_inode2; /* pointer to storage inode */
-+
-+ /* META-data lists */
-+ /* deleted list, ex wol */
-+ struct list_head deleted_list;
-+ int deleted_list_size;
-+
-+ /* renamed list */
-+ struct list_head renamed_list;
-+ int renamed_list_size;
-+
-+ /* add other lists here ... */
-+};
-+
-+/* mini_fo dentry data in memory */
-+struct mini_fo_dentry_info {
-+ dentry_t *wdi_dentry;
-+ dentry_t *wdi_dentry2; /* pointer to storage dentry */
-+ unsigned int state; /* state of the mini_fo dentry */
-+};
-+
-+
-+/* mini_fo super-block data in memory */
-+struct mini_fo_sb_info {
-+ super_block_t *wsi_sb, *wsi_sb2; /* mk: might point to the same sb */
-+ struct vfsmount *hidden_mnt, *hidden_mnt2;
-+ dentry_t *base_dir_dentry;
-+ dentry_t *storage_dir_dentry;
-+ ;
-+};
-+
-+/* readdir_data, readdir helper struct */
-+struct readdir_data {
-+ struct list_head ndl_list; /* linked list head ptr */
-+ int ndl_size; /* list size */
-+ int sto_done; /* flag to show that the storage dir entries have
-+ * all been read an now follow base entries */
-+};
-+
-+/* file private data. */
-+struct mini_fo_file_info {
-+ struct file *wfi_file;
-+ struct file *wfi_file2; /* pointer to storage file */
-+ struct readdir_data rd;
-+};
-+
-+/* struct ndl_entry */
-+struct ndl_entry {
-+ struct list_head list;
-+ char *name;
-+ int len;
-+};
-+
-+/********************************
-+ * META-data structures
-+ ********************************/
-+
-+/* deleted entry */
-+struct deleted_entry {
-+ struct list_head list;
-+ char *name;
-+ int len;
-+};
-+
-+/* renamed entry */
-+struct renamed_entry {
-+ struct list_head list;
-+ char *old_name; /* old directory with full path */
-+ int old_len; /* length of above string */
-+ char *new_name; /* new directory name */
-+ int new_len; /* length of above string */
-+};
-+
-+/* attr_change entry */
-+struct attr_change_entry {
-+ struct list_head list;
-+ char *name;
-+ int len;
-+};
-+
-+/* link entry */
-+struct link_entry {
-+ struct list_head list;
-+ int links_moved;
-+ int inum_base;
-+ int inum_sto;
-+ char *weird_name;
-+ int weird_name_len;
-+};
-+
-+
-+/* Some other stuff required for mini_fo_filldir64, copied from
-+ * fs/readdir.c
-+ */
-+
-+#define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1))
-+#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
-+
-+
-+struct linux_dirent64 {
-+ u64 d_ino;
-+ s64 d_off;
-+ unsigned short d_reclen;
-+ unsigned char d_type;
-+ char d_name[0];
-+};
-+
-+
-+struct getdents_callback64 {
-+ struct linux_dirent64 * current_dir;
-+ struct linux_dirent64 * previous;
-+ int count;
-+ int error;
-+};
-+
-+struct linux_dirent {
-+ unsigned long d_ino;
-+ unsigned long d_off;
-+ unsigned short d_reclen;
-+ char d_name[1];
-+};
-+
-+struct getdents_callback {
-+ struct linux_dirent * current_dir;
-+ struct linux_dirent * previous;
-+ int count;
-+ int error;
-+};
-+
-+
-+/*
-+ * MACROS:
-+ */
-+
-+/* file TO private_data */
-+# define ftopd(file) ((struct mini_fo_file_info *)((file)->private_data))
-+# define __ftopd(file) ((file)->private_data)
-+/* file TO hidden_file */
-+# define ftohf(file) ((ftopd(file))->wfi_file)
-+# define ftohf2(file) ((ftopd(file))->wfi_file2)
-+
-+/* inode TO private_data */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+# define itopd(ino) ((struct mini_fo_inode_info *)(ino)->i_private)
-+# define __itopd(ino) ((ino)->i_private)
-+#else
-+# define itopd(ino) ((struct mini_fo_inode_info *)(ino)->u.generic_ip)
-+# define __itopd(ino) ((ino)->u.generic_ip)
-+#endif
-+/* inode TO hidden_inode */
-+# define itohi(ino) (itopd(ino)->wii_inode)
-+# define itohi2(ino) (itopd(ino)->wii_inode2)
-+
-+/* superblock TO private_data */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+# define stopd(super) ((struct mini_fo_sb_info *)(super)->s_fs_info)
-+# define __stopd(super) ((super)->s_fs_info)
-+#else
-+# define stopd(super) ((struct mini_fo_sb_info *)(super)->u.generic_sbp)
-+# define __stopd(super) ((super)->u.generic_sbp)
-+#endif
-+
-+/* unused? # define vfs2priv stopd */
-+/* superblock TO hidden_superblock */
-+
-+# define stohs(super) (stopd(super)->wsi_sb)
-+# define stohs2(super) (stopd(super)->wsi_sb2)
-+
-+/* dentry TO private_data */
-+# define dtopd(dentry) ((struct mini_fo_dentry_info *)(dentry)->d_fsdata)
-+# define __dtopd(dentry) ((dentry)->d_fsdata)
-+/* dentry TO hidden_dentry */
-+# define dtohd(dent) (dtopd(dent)->wdi_dentry)
-+# define dtohd2(dent) (dtopd(dent)->wdi_dentry2)
-+
-+/* dentry to state */
-+# define dtost(dent) (dtopd(dent)->state)
-+# define sbt(sb) ((sb)->s_type->name)
-+
-+#define IS_WRITE_FLAG(flag) (flag & (O_RDWR | O_WRONLY | O_APPEND))
-+#define IS_COPY_FLAG(flag) (flag & (COPY_FLAGS))
-+
-+/* macros to simplify non-SCA code */
-+# define MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages)
-+# define MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages)
-+# define FREE_PAGE_POINTERS(hidden_pages, num)
-+# define FREE_PAGEDATA_POINTERS(hidden_pages_data, num)
-+# define FOR_EACH_PAGE
-+# define CURRENT_HIDDEN_PAGE hidden_page
-+# define CURRENT_HIDDEN_PAGEDATA hidden_page_data
-+# define CURRENT_HIDDEN_PAGEINDEX page->index
-+
-+/*
-+ * EXTERNALS:
-+ */
-+extern struct file_operations mini_fo_main_fops;
-+extern struct file_operations mini_fo_dir_fops;
-+extern struct inode_operations mini_fo_main_iops;
-+extern struct inode_operations mini_fo_dir_iops;
-+extern struct inode_operations mini_fo_symlink_iops;
-+extern struct super_operations mini_fo_sops;
-+extern struct dentry_operations mini_fo_dops;
-+extern struct vm_operations_struct mini_fo_shared_vmops;
-+extern struct vm_operations_struct mini_fo_private_vmops;
-+extern struct address_space_operations mini_fo_aops;
-+
-+#if 0 /* unused by mini_fo */
-+extern int mini_fo_interpose(dentry_t *hidden_dentry, dentry_t *this_dentry, super_block_t *sb, int flag);
-+#if defined(FIST_FILTER_DATA) || defined(FIST_FILTER_SCA)
-+extern page_t *mini_fo_get1page(file_t *file, int index);
-+extern int mini_fo_fill_zeros(file_t *file, page_t *page, unsigned from);
-+# endif /* FIST_FILTER_DATA || FIST_FILTER_SCA */
-+
-+
-+# define mini_fo_hidden_dentry(d) __mini_fo_hidden_dentry(__FILE__,__FUNCTION__,__LINE__,(d))
-+# define mini_fo_hidden_sto_dentry(d) __mini_fo_hidden_sto_dentry(__FILE__,__FUNCTION__,__LINE__,(d))
-+
-+extern dentry_t *__mini_fo_hidden_dentry(char *file, char *func, int line, dentry_t *this_dentry);
-+extern dentry_t *__mini_fo_hidden_sto_dentry(char *file, char *func, int line, dentry_t *this_dentry);
-+
-+extern int mini_fo_read_file(const char *filename, void *buf, int len);
-+extern int mini_fo_write_file(const char *filename, void *buf, int len);
-+extern dentry_t *fist_lookup(dentry_t *dir, const char *name, vnode_t **out, uid_t uid, gid_t gid);
-+#endif /* unused by mini_fo */
-+
-+/* state transition functions */
-+extern int nondir_unmod_to_mod(dentry_t *dentry, int cp_flag);
-+extern int nondir_del_rew_to_del(dentry_t *dentry);
-+extern int nondir_creat_to_del(dentry_t *dentry);
-+extern int nondir_mod_to_del(dentry_t *dentry);
-+extern int nondir_unmod_to_del(dentry_t *dentry);
-+
-+extern int dir_unmod_to_mod(dentry_t *dentry);
-+
-+/* rename specials */
-+extern int rename_directory(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry);
-+extern int rename_nondir(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry);
-+
-+/* misc stuff */
-+extern int mini_fo_tri_interpose(dentry_t *hidden_dentry,
-+ dentry_t *hidden_sto_dentry,
-+ dentry_t *dentry,
-+ super_block_t *sb, int flag);
-+
-+extern int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
-+ dentry_t *src_dentry, struct vfsmount *src_mnt);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd);
-+
-+extern int create_sto_nod(dentry_t *dentry, int mode, dev_t dev);
-+extern int create_sto_reg_file(dentry_t *dentry, int mode, struct nameidata *nd);
-+#else
-+extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode);
-+
-+extern int create_sto_nod(dentry_t *dentry, int mode, int dev);
-+extern int create_sto_reg_file(dentry_t *dentry, int mode);
-+#endif
-+
-+extern int create_sto_dir(dentry_t *dentry, int mode);
-+
-+extern int exists_in_storage(dentry_t *dentry);
-+extern int is_mini_fo_existant(dentry_t *dentry);
-+extern int get_neg_sto_dentry(dentry_t *dentry);
-+extern int build_sto_structure(dentry_t *dir, dentry_t *dentry);
-+extern int get_mini_fo_bpath(dentry_t *dentry, char **bpath, int *bpath_len);
-+extern dentry_t *bpath_walk(super_block_t *sb, char *bpath);
-+extern int bpath_put(dentry_t *dentry);
-+
-+/* check_mini_fo types functions */
-+extern int check_mini_fo_dentry(dentry_t *dentry);
-+extern int check_mini_fo_file(file_t *file);
-+extern int check_mini_fo_inode(inode_t *inode);
-+
-+/* General meta functions, can be called from outside of meta.c */
-+extern int meta_build_lists(dentry_t *dentry);
-+extern int meta_put_lists(dentry_t *dentry);
-+extern int __meta_put_lists(inode_t *inode);
-+
-+extern int meta_add_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int meta_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len);
-+
-+extern int meta_remove_r_entry(dentry_t *dentry, const char *name, int len);
-+
-+extern int meta_check_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int __meta_check_d_entry(inode_t *inode, const char *name, int len);
-+
-+extern char* meta_check_r_entry(dentry_t *dentry, const char *name, int len);
-+extern char* __meta_check_r_entry(inode_t *inode, const char *name, int len);
-+extern int meta_is_r_entry(dentry_t *dentry, const char *name, int len);
-+extern int __meta_is_r_entry(inode_t *inode, const char *name, int len);
-+
-+/* Specific meta functions, should be called only inside meta.c */
-+extern int __meta_put_d_list(inode_t *inode);
-+extern int __meta_put_r_list(inode_t *inode);
-+
-+extern int meta_list_add_d_entry(dentry_t *dentry,
-+ const char *name, int len);
-+extern int meta_list_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len);
-+
-+extern int meta_list_remove_r_entry(dentry_t *dentry,
-+ const char *name, int len);
-+
-+extern int __meta_list_remove_r_entry(inode_t *inode,
-+ const char *name, int len);
-+
-+extern int meta_write_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int meta_write_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len);
-+
-+extern int meta_sync_lists(dentry_t *dentry);
-+extern int meta_sync_d_list(dentry_t *dentry, int app_flag);
-+extern int meta_sync_r_list(dentry_t *dentry, int app_flag);
-+
-+/* ndl stuff */
-+extern int ndl_add_entry(struct readdir_data *rd, const char *name, int len);
-+extern void ndl_put_list(struct readdir_data *rd);
-+extern int ndl_check_entry(struct readdir_data *rd,
-+ const char *name, int len);
-+
-+
-+# define copy_inode_size(dst, src) \
-+ dst->i_size = src->i_size; \
-+ dst->i_blocks = src->i_blocks;
-+
-+static inline void
-+fist_copy_attr_atime(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_atime = src->i_atime;
-+}
-+static inline void
-+fist_copy_attr_times(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_atime = src->i_atime;
-+ dest->i_mtime = src->i_mtime;
-+ dest->i_ctime = src->i_ctime;
-+}
-+static inline void
-+fist_copy_attr_timesizes(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_atime = src->i_atime;
-+ dest->i_mtime = src->i_mtime;
-+ dest->i_ctime = src->i_ctime;
-+ copy_inode_size(dest, src);
-+}
-+static inline void
-+fist_copy_attr_all(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_mode = src->i_mode;
-+ dest->i_nlink = src->i_nlink;
-+ dest->i_uid = src->i_uid;
-+ dest->i_gid = src->i_gid;
-+ dest->i_rdev = src->i_rdev;
-+ dest->i_atime = src->i_atime;
-+ dest->i_mtime = src->i_mtime;
-+ dest->i_ctime = src->i_ctime;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+ dest->i_blksize = src->i_blksize;
-+#endif
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,12)
-+ dest->i_blkbits = src->i_blkbits;
-+# endif /* linux 2.4.12 and newer */
-+ copy_inode_size(dest, src);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ dest->i_attr_flags = src->i_attr_flags;
-+#else
-+ dest->i_flags = src->i_flags;
-+#endif
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+/* copied from linux/fs.h */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+static inline void double_lock(struct dentry *d1, struct dentry *d2)
-+{
-+ struct mutex *m1 = &d1->d_inode->i_mutex;
-+ struct mutex *m2 = &d2->d_inode->i_mutex;
-+ if (m1 != m2) {
-+ if ((unsigned long) m1 < (unsigned long) m2) {
-+ struct mutex *tmp = m2;
-+ m2 = m1; m1 = tmp;
-+ }
-+ mutex_lock(m1);
-+ }
-+ mutex_lock(m2);
-+}
-+
-+static inline void double_unlock(struct dentry *d1, struct dentry *d2)
-+{
-+ struct mutex *m1 = &d1->d_inode->i_mutex;
-+ struct mutex *m2 = &d2->d_inode->i_mutex;
-+ mutex_unlock(m1);
-+ if (m1 != m2)
-+ mutex_unlock(m2);
-+ dput(d1);
-+ dput(d2);
-+}
-+
-+#else
-+static inline void double_down(struct semaphore *s1, struct semaphore *s2)
-+{
-+ if (s1 != s2) {
-+ if ((unsigned long) s1 < (unsigned long) s2) {
-+ struct semaphore *tmp = s2;
-+ s2 = s1; s1 = tmp;
-+ }
-+ down(s1);
-+ }
-+ down(s2);
-+}
-+
-+static inline void double_up(struct semaphore *s1, struct semaphore *s2)
-+{
-+ up(s1);
-+ if (s1 != s2)
-+ up(s2);
-+}
-+
-+static inline void double_lock(struct dentry *d1, struct dentry *d2)
-+{
-+ double_down(&d1->d_inode->i_sem, &d2->d_inode->i_sem);
-+}
-+
-+static inline void double_unlock(struct dentry *d1, struct dentry *d2)
-+{
-+ double_up(&d1->d_inode->i_sem,&d2->d_inode->i_sem);
-+ dput(d1);
-+ dput(d2);
-+}
-+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) */
-+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
-+#endif /* __KERNEL__ */
-+
-+/*
-+ * Definitions for user and kernel code
-+ */
-+
-+/* ioctls */
-+
-+#endif /* not __MINI_FO_H_ */
---- /dev/null
-+++ b/fs/mini_fo/mini_fo-merge
-@@ -0,0 +1,180 @@
-+#!/bin/bash
-+#
-+# Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.de>
-+# 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.
-+#
-+
-+BASE=
-+STO=
-+HELP=
-+DRYRUN=
-+VERBOSE=
-+TMP="/tmp/"
-+META_NAME="META_dAfFgHE39ktF3HD2sr"
-+SKIP_DEL_LIST="skip-delete-list.mini_fo-merge"
-+
-+COMMAND=
-+exec_command()
-+{
-+ if [ x$DRYRUN == "xset" ]; then
-+ echo " would run: $COMMAND"
-+ elif ! [ x$DRYRUN == "xset" ]; then
-+ if [ x$VERBOSE == "xset" ]; then
-+ echo " running: $COMMAND"
-+ fi
-+ eval $COMMAND
-+ fi
-+}
-+
-+usage()
-+{
-+cat <<EOF
-+
-+USAGE: $0 -b <base dir> -s <storage dir>
-+Version 0.1
-+
-+This script merges the contents of a mini_fo storage file system back
-+to the base file system.
-+
-+!!! Warning: This will modify the base filesystem and can destroy data
-+ if used wrongly.
-+
-+Options:
-+ -b <base dir>
-+ the directory of the base file system.
-+
-+ -s <storage dir>
-+ the directory of the storage file system.
-+
-+ -d dry run, will not change anything and print the commands that
-+ would be executed.
-+
-+ -t tmp dir for storing temporary file. default: $TMP
-+
-+ -v show what operations are performed.
-+
-+ -h displays this message.
-+
-+EOF
-+}
-+
-+# parse parameters
-+while getopts hdvt:b:s: OPTS
-+ do
-+ case $OPTS in
-+ h) HELP="set";;
-+ d) DRYRUN="set";;
-+ v) VERBOSE="set";;
-+ b) BASE="$OPTARG";;
-+ s) STO="$OPTARG";;
-+ t) TMP="$OPTARG";;
-+ ?) usage
-+ exit 1;;
-+ esac
-+done
-+
-+if [ "x$HELP" == "xset" ]; then
-+ usage
-+ exit -1
-+fi
-+
-+if ! [ -d "$BASE" ] || ! [ -d "$STO" ]; then
-+ echo -e "$0:\n Error, -s and/or -b argument missing. type $0 -h for help."
-+ exit -1;
-+fi
-+
-+# get full paths
-+pushd $STO; STO=`pwd`; popd
-+pushd $BASE; BASE=`pwd`; popd
-+TMP=${TMP%/}
-+
-+
-+cat<<EOF
-+###############################################################################
-+# mini_fo-merge
-+#
-+# base dir: $BASE
-+# storage dir: $STO
-+# meta filename: $META_NAME
-+# dry run: $DRYRUN
-+# verbose: $VERBOSE
-+# tmp files: $TMP
-+###############################################################################
-+
-+EOF
-+
-+rm $TMP/$SKIP_DEL_LIST
-+
-+# first process all renamed dirs
-+echo "Merging renamed directories..."
-+pushd $STO &> /dev/null
-+find . -name $META_NAME -type f -print0 | xargs -0 -e grep -e '^R ' | tr -s ':R' ' ' | while read ENTRY; do
-+ echo "entry: $ENTRY"
-+ META_FILE=`echo $ENTRY | cut -d ' ' -f 1`
-+ OLD_B_DIR=`echo $ENTRY | cut -d ' ' -f 2 | sed -e 's/\///'`
-+ NEW_NAME=`echo $ENTRY | cut -d ' ' -f 3`
-+ NEW_B_DIR=`echo $META_FILE | sed -e "s/$META_NAME/$NEW_NAME/" | sed -e 's/^\.\///'`
-+ echo "META_FILE: $META_FILE"
-+ echo "OLD_B_DIR: $OLD_B_DIR"
-+ echo "NEW_NAME: $NEW_NAME"
-+ echo "NEW_B_DIR: $NEW_B_DIR"
-+
-+ pushd $BASE &> /dev/null
-+ # remove an existing dir in storage
-+ COMMAND="rm -rf $NEW_B_DIR"; exec_command
-+ COMMAND="cp -R $OLD_B_DIR $NEW_B_DIR"; exec_command
-+ echo ""
-+ popd &> /dev/null
-+
-+ # remember this dir to exclude it from deleting later
-+ echo $NEW_B_DIR >> $TMP/$SKIP_DEL_LIST
-+done
-+
-+# delete all whiteouted files from base
-+echo -e "\nDeleting whiteout'ed files from base file system..."
-+find . -name $META_NAME -type f -print0 | xargs -0 -e grep -e '^D ' | sed -e 's/:D//' | while read ENTRY; do
-+ META_FILE=`echo $ENTRY | cut -d ' ' -f 1`
-+ DEL_NAME=`echo $ENTRY | cut -d ' ' -f 2`
-+ DEL_FILE=`echo $META_FILE | sed -e "s/$META_NAME/$DEL_NAME/" | sed -e 's/^\.\///'`
-+ grep -x $DEL_FILE $TMP/$SKIP_DEL_LIST &> /dev/null
-+ if [ $? -ne 0 ]; then
-+ pushd $BASE &> /dev/null
-+ COMMAND="rm -rf $DEL_FILE"; exec_command
-+ popd &> /dev/null
-+ else
-+ echo " excluding: $DEL_FILE as in skip-del-list."
-+ fi
-+done
-+
-+# create all dirs and update permissions
-+echo -e "\nSetting up directory structures in base file system..."
-+find . -type d | sed -e 's/^\.\///' | while read DIR; do
-+ PERMS=`stat -c %a $DIR`
-+ DIR_UID=`stat -c %u $DIR`
-+ DIR_GID=`stat -c %g $DIR`
-+ pushd $BASE &> /dev/null
-+ if ! [ -d $DIR ]; then
-+ COMMAND="mkdir -p $DIR"; exec_command
-+ fi
-+ COMMAND="chmod $PERMS $DIR"; exec_command
-+ COMMAND="chown $DIR_UID:$DIR_GID $DIR"; exec_command
-+ popd &> /dev/null
-+done
-+
-+# merge all non-directory files
-+echo -e "\nMerging all non-directory files...."
-+for i in b c p f l s; do
-+ find . -type $i | sed -e 's/^\.\///' | grep -v "$META_NAME" | while read FILE; do
-+ pushd $BASE #&> /dev/null
-+ COMMAND="cp -df $STO/$FILE $BASE/$FILE"; exec_command
-+ popd &> /dev/null
-+ done
-+done
-+popd &> /dev/null
-+
-+#rm $TMP/$SKIP_DEL_LIST
-+
-+echo "Done!"
---- /dev/null
-+++ b/fs/mini_fo/mini_fo-overlay
-@@ -0,0 +1,130 @@
-+#!/bin/bash
-+#
-+# Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.de>
-+# 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.
-+#
-+
-+HELP=
-+SUFF=
-+MNTP=
-+MNT_DIR="/mnt"
-+STO=
-+STO_DIR="/tmp"
-+BASE=
-+
-+usage()
-+{
-+cat <<EOF
-+
-+Usage: $0 [-s suffix] [-d sto_dir_dir] [-m mount point] base_dir
-+Version 0.1
-+
-+This script overlays the given base directory using the mini_fo file
-+system. If only the base directory base_dir is given, $0
-+will use a storage directory called "sto-<base_dir_name>" in $STO_DIR,
-+and mount point "mini_fo-<base_dir_dir>" in $MNT_DIR.
-+
-+Options:
-+ -s <suffix>
-+ add given suffix to storage directory and the mount
-+ point. This is usefull for overlaying one base directory
-+ several times and avoiding conflicts with storage directory
-+ names and mount points.
-+
-+ -d <sto_dir_dir>
-+ change the directory in which the storage directory will be
-+ created (default is currently "$STO_DIR".
-+
-+ -m <mount point>
-+ use an alternative directory to create the mini_fo
-+ mountpoint (default is currently "$MNT_DIR".
-+
-+ -h displays this message.
-+
-+EOF
-+exit 1;
-+}
-+
-+while getopts hm:s:d: OPTS
-+ do
-+ case $OPTS in
-+ s) SUFF="$OPTARG";;
-+ d) STO_DIR="$OPTARG";;
-+ m) MNT_DIR="$OPTARG";;
-+ h) HELP="set";;
-+ ?) usage
-+ exit 1;;
-+ esac
-+done
-+shift $(($OPTIND - 1))
-+
-+BASE="$1"
-+
-+if [ "x$HELP" == "xset" ]; then
-+ usage
-+ exit -1
-+fi
-+
-+# fix suffix
-+if [ "x$SUFF" != "x" ]; then
-+ SUFF="-$SUFF"
-+fi
-+
-+# kill trailing slashes
-+MNT_DIR=${MNT_DIR%/}
-+STO_DIR=${STO_DIR%/}
-+BASE=${BASE%/}
-+
-+
-+if ! [ -d "$BASE" ]; then
-+ echo "invalid base dir $BASE, run $0 -h for help."
-+ exit -1
-+fi
-+
-+# check opts
-+if ! [ -d "$MNT_DIR" ]; then
-+ echo "invalid mount dir $MNT_DIR, run $0 -h for help."
-+ exit -1
-+fi
-+
-+if ! [ -d "$STO_DIR" ]; then
-+ echo "invalid sto_dir_dir $STO_DIR, run $0 -h for help."
-+ exit -1
-+fi
-+
-+MNTP="$MNT_DIR/mini_fo-`basename $BASE`$SUFF"
-+STO="$STO_DIR/sto-`basename $BASE`$SUFF"
-+
-+# create the mount point if it doesn't exist
-+mkdir -p $MNTP
-+if [ $? -ne 0 ]; then
-+ echo "Error, failed to create mount point $MNTP"
-+fi
-+
-+mkdir -p $STO
-+if [ $? -ne 0 ]; then
-+ echo "Error, failed to create storage dir $STO"
-+fi
-+
-+# check if fs is already mounted
-+mount | grep mini_fo | grep $MNTP &> /dev/null
-+if [ $? -eq 0 ]; then
-+ echo "Error, existing mini_fo mount at $MNTP."
-+ exit -1
-+fi
-+
-+mount | grep mini_fo | grep $STO &> /dev/null
-+if [ $? -eq 0 ]; then
-+ echo "Error, $STO seems to be used already."
-+ exit -1
-+fi
-+
-+# mount
-+mount -t mini_fo -o base=$BASE,sto=$STO $BASE $MNTP
-+
-+if [ $? -ne 0 ]; then
-+ echo "Error, mounting failed, maybe no permisson to mount?"
-+fi
---- /dev/null
-+++ b/fs/mini_fo/mmap.c
-@@ -0,0 +1,637 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+#ifdef FIST_COUNT_WRITES
-+/* for counting writes in the middle vs. regular writes */
-+unsigned long count_writes = 0, count_writes_middle = 0;
-+#endif /* FIST_COUNT_WRITES */
-+
-+/* forward declaration of commit write and prepare write */
-+STATIC int mini_fo_commit_write(file_t *file, page_t *page, unsigned from, unsigned to);
-+STATIC int mini_fo_prepare_write(file_t *file, page_t *page, unsigned from, unsigned to);
-+
-+
-+/*
-+ * Function for handling creation of holes when lseek-ing past the
-+ * end of the file and then writing some data.
-+ */
-+int
-+mini_fo_fill_zeros(file_t* file, page_t *page, unsigned from)
-+{
-+ int err = 0;
-+ dentry_t *dentry = file->f_dentry;
-+ inode_t *inode = dentry->d_inode;
-+ page_t *tmp_page;
-+ int index;
-+
-+ print_entry_location();
-+
-+ for (index = inode->i_size >> PAGE_CACHE_SHIFT; index < page->index; index++) {
-+ tmp_page = mini_fo_get1page(file, index);
-+ if (IS_ERR(tmp_page)) {
-+ err = PTR_ERR(tmp_page);
-+ goto out;
-+ }
-+
-+ /*
-+ * zero out rest of the contents of the page between the appropriate
-+ * offsets.
-+ */
-+ memset((char*)page_address(tmp_page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, PAGE_CACHE_SIZE - (inode->i_size & ~PAGE_CACHE_MASK));
-+
-+ if (! (err = mini_fo_prepare_write(file, tmp_page, 0, PAGE_CACHE_SIZE)))
-+ err = mini_fo_commit_write(file, tmp_page, 0, PAGE_CACHE_SIZE);
-+
-+ page_cache_release(tmp_page);
-+ if (err < 0)
-+ goto out;
-+ if (current->need_resched)
-+ schedule();
-+ }
-+
-+ /* zero out appropriate parts of last page */
-+
-+ /*
-+ * if the encoding type is block, then adjust the 'from' (where the
-+ * zeroing will start) offset appropriately
-+ */
-+ from = from & (~(FIST_ENCODING_BLOCKSIZE - 1));
-+
-+ if ((from - (inode->i_size & ~PAGE_CACHE_MASK)) > 0) {
-+
-+ memset((char*)page_address(page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, from - (inode->i_size & ~PAGE_CACHE_MASK));
-+ if (! (err = mini_fo_prepare_write(file, page, 0, PAGE_CACHE_SIZE)))
-+ err = mini_fo_commit_write(file, page, 0, PAGE_CACHE_SIZE);
-+
-+ if (err < 0)
-+ goto out;
-+ if (current->need_resched)
-+ schedule();
-+ }
-+
-+ out:
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_writepage(page_t *page)
-+{
-+ int err = -EIO;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ page_t *hidden_page;
-+ char *kaddr, *hidden_kaddr;
-+
-+ print_entry_location();
-+
-+ inode = page->mapping->host;
-+ hidden_inode = itohi(inode);
-+
-+ /*
-+ * writepage is called when shared mmap'ed files need to write
-+ * their pages, while prepare/commit_write are called from the
-+ * non-paged write() interface. (However, in 2.3 the two interfaces
-+ * share the same cache, while in 2.2 they didn't.)
-+ *
-+ * So we pretty much have to duplicate much of what commit_write does.
-+ */
-+
-+ /* find lower page (returns a locked page) */
-+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+ if (!hidden_page)
-+ goto out;
-+
-+ /* get page address, and encode it */
-+ kaddr = (char *) kmap(page);
-+ hidden_kaddr = (char*) kmap(hidden_page);
-+ mini_fo_encode_block(kaddr, hidden_kaddr, PAGE_CACHE_SIZE, inode, inode->i_sb, page->index);
-+ /* if encode_block could fail, then return error */
-+ kunmap(page);
-+ kunmap(hidden_page);
-+
-+ /* call lower writepage (expects locked page) */
-+ err = hidden_inode->i_mapping->a_ops->writepage(hidden_page);
-+
-+ /*
-+ * update mtime and ctime of lower level file system
-+ * mini_fo' mtime and ctime are updated by generic_file_write
-+ */
-+ hidden_inode->i_mtime = hidden_inode->i_ctime = CURRENT_TIME;
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,1)
-+ UnlockPage(hidden_page); /* b/c grab_cache_page locked it */
-+# endif /* kernel older than 2.4.1 */
-+ page_cache_release(hidden_page); /* b/c grab_cache_page increased refcnt */
-+
-+ if (err)
-+ ClearPageUptodate(page);
-+ else
-+ SetPageUptodate(page);
-+ out:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,1)
-+ UnlockPage(page);
-+# endif /* kernel 2.4.1 and newer */
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+/*
-+ * get one page from cache or lower f/s, return error otherwise.
-+ * returns unlocked, up-to-date page (if ok), with increased refcnt.
-+ */
-+page_t *
-+mini_fo_get1page(file_t *file, int index)
-+{
-+ page_t *page;
-+ dentry_t *dentry;
-+ inode_t *inode;
-+ struct address_space *mapping;
-+ int err;
-+
-+ print_entry_location();
-+
-+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+ inode = dentry->d_inode;
-+ mapping = inode->i_mapping;
-+
-+ fist_dprint(8, "%s: read page index %d pid %d\n", __FUNCTION__, index, current->pid);
-+ if (index < 0) {
-+ printk("%s BUG: index=%d\n", __FUNCTION__, index);
-+ page = ERR_PTR(-EIO);
-+ goto out;
-+ }
-+ page = read_cache_page(mapping,
-+ index,
-+ (filler_t *) mapping->a_ops->readpage,
-+ (void *) file);
-+ if (IS_ERR(page))
-+ goto out;
-+ wait_on_page(page);
-+ if (!Page_Uptodate(page)) {
-+ lock_page(page);
-+ err = mapping->a_ops->readpage(file, page);
-+ if (err) {
-+ page = ERR_PTR(err);
-+ goto out;
-+ }
-+ wait_on_page(page);
-+ if (!Page_Uptodate(page)) {
-+ page = ERR_PTR(-EIO);
-+ goto out;
-+ }
-+ }
-+
-+ out:
-+ print_exit_pointer(page);
-+ return page;
-+}
-+
-+
-+/*
-+ * get one page from cache or lower f/s, return error otherwise.
-+ * similar to get1page, but doesn't guarantee that it will return
-+ * an unlocked page.
-+ */
-+page_t *
-+mini_fo_get1page_cached(file_t *file, int index)
-+{
-+ page_t *page;
-+ dentry_t *dentry;
-+ inode_t *inode;
-+ struct address_space *mapping;
-+ int err;
-+
-+ print_entry_location();
-+
-+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+ inode = dentry->d_inode;
-+ mapping = inode->i_mapping;
-+
-+ fist_dprint(8, "%s: read page index %d pid %d\n", __FUNCTION__, index, current->pid);
-+ if (index < 0) {
-+ printk("%s BUG: index=%d\n", __FUNCTION__, index);
-+ page = ERR_PTR(-EIO);
-+ goto out;
-+ }
-+ page = read_cache_page(mapping,
-+ index,
-+ (filler_t *) mapping->a_ops->readpage,
-+ (void *) file);
-+ if (IS_ERR(page))
-+ goto out;
-+
-+ out:
-+ print_exit_pointer(page);
-+ return page;
-+}
-+
-+
-+/*
-+ * readpage is called from generic_page_read and the fault handler.
-+ * If your file system uses generic_page_read for the read op, it
-+ * must implement readpage.
-+ *
-+ * Readpage expects a locked page, and must unlock it.
-+ */
-+STATIC int
-+mini_fo_do_readpage(file_t *file, page_t *page)
-+{
-+ int err = -EIO;
-+ dentry_t *dentry;
-+ file_t *hidden_file = NULL;
-+ dentry_t *hidden_dentry;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ char *page_data;
-+ page_t *hidden_page;
-+ char *hidden_page_data;
-+ int real_size;
-+
-+ print_entry_location();
-+
-+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+ if (ftopd(file) != NULL)
-+ hidden_file = ftohf(file);
-+ hidden_dentry = dtohd(dentry);
-+ inode = dentry->d_inode;
-+ hidden_inode = itohi(inode);
-+
-+ fist_dprint(7, "%s: requesting page %d from file %s\n", __FUNCTION__, page->index, dentry->d_name.name);
-+
-+ MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages);
-+ MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages);
-+ FOR_EACH_PAGE
-+ CURRENT_HIDDEN_PAGE = NULL;
-+
-+ /* find lower page (returns a locked page) */
-+ FOR_EACH_PAGE {
-+ fist_dprint(8, "%s: Current page index = %d\n", __FUNCTION__, CURRENT_HIDDEN_PAGEINDEX);
-+ CURRENT_HIDDEN_PAGE = read_cache_page(hidden_inode->i_mapping,
-+ CURRENT_HIDDEN_PAGEINDEX,
-+ (filler_t *) hidden_inode->i_mapping->a_ops->readpage,
-+ (void *) hidden_file);
-+ if (IS_ERR(CURRENT_HIDDEN_PAGE)) {
-+ err = PTR_ERR(CURRENT_HIDDEN_PAGE);
-+ CURRENT_HIDDEN_PAGE = NULL;
-+ goto out_release;
-+ }
-+ }
-+
-+ /*
-+ * wait for the page data to show up
-+ * (signaled by readpage as unlocking the page)
-+ */
-+ FOR_EACH_PAGE {
-+ wait_on_page(CURRENT_HIDDEN_PAGE);
-+ if (!Page_Uptodate(CURRENT_HIDDEN_PAGE)) {
-+ /*
-+ * call readpage() again if we returned from wait_on_page with a
-+ * page that's not up-to-date; that can happen when a partial
-+ * page has a few buffers which are ok, but not the whole
-+ * page.
-+ */
-+ lock_page(CURRENT_HIDDEN_PAGE);
-+ err = hidden_inode->i_mapping->a_ops->readpage(hidden_file,
-+ CURRENT_HIDDEN_PAGE);
-+ if (err) {
-+ CURRENT_HIDDEN_PAGE = NULL;
-+ goto out_release;
-+ }
-+ wait_on_page(CURRENT_HIDDEN_PAGE);
-+ if (!Page_Uptodate(CURRENT_HIDDEN_PAGE)) {
-+ err = -EIO;
-+ goto out_release;
-+ }
-+ }
-+ }
-+
-+ /* map pages, get their addresses */
-+ page_data = (char *) kmap(page);
-+ FOR_EACH_PAGE
-+ CURRENT_HIDDEN_PAGEDATA = (char *) kmap(CURRENT_HIDDEN_PAGE);
-+
-+ /* if decode_block could fail, then return error */
-+ err = 0;
-+ real_size = hidden_inode->i_size - (page->index << PAGE_CACHE_SHIFT);
-+ if (real_size <= 0)
-+ memset(page_data, 0, PAGE_CACHE_SIZE);
-+ else if (real_size < PAGE_CACHE_SIZE) {
-+ mini_fo_decode_block(hidden_page_data, page_data, real_size, inode, inode->i_sb, page->index);
-+ memset(page_data + real_size, 0, PAGE_CACHE_SIZE - real_size);
-+ } else
-+ mini_fo_decode_block(hidden_page_data, page_data, PAGE_CACHE_SIZE, inode, inode->i_sb, page->index);
-+
-+ FOR_EACH_PAGE
-+ kunmap(CURRENT_HIDDEN_PAGE);
-+ kunmap(page);
-+
-+ out_release:
-+ FOR_EACH_PAGE
-+ if (CURRENT_HIDDEN_PAGE)
-+ page_cache_release(CURRENT_HIDDEN_PAGE); /* undo read_cache_page */
-+
-+ FREE_PAGE_POINTERS(hidden_pages, num_hidden_pages);
-+ FREE_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages);
-+
-+ out:
-+ if (err == 0)
-+ SetPageUptodate(page);
-+ else
-+ ClearPageUptodate(page);
-+
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_readpage(file_t *file, page_t *page)
-+{
-+ int err;
-+ print_entry_location();
-+
-+ err = mini_fo_do_readpage(file, page);
-+
-+ /*
-+ * we have to unlock our page, b/c we _might_ have gotten a locked page.
-+ * but we no longer have to wakeup on our page here, b/c UnlockPage does
-+ * it
-+ */
-+ UnlockPage(page);
-+
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_prepare_write(file_t *file, page_t *page, unsigned from, unsigned to)
-+{
-+ int err = 0;
-+
-+ print_entry_location();
-+
-+ /*
-+ * we call kmap(page) only here, and do the kunmap
-+ * and the actual downcalls, including unlockpage and uncache
-+ * in commit_write.
-+ */
-+ kmap(page);
-+
-+ /* fast path for whole page writes */
-+ if (from == 0 && to == PAGE_CACHE_SIZE)
-+ goto out;
-+ /* read the page to "revalidate" our data */
-+ /* call the helper function which doesn't unlock the page */
-+ if (!Page_Uptodate(page))
-+ err = mini_fo_do_readpage(file, page);
-+
-+ out:
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_commit_write(file_t *file, page_t *page, unsigned from, unsigned to)
-+{
-+ int err = -ENOMEM;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ page_t *hidden_page;
-+ file_t *hidden_file = NULL;
-+ loff_t pos;
-+ unsigned bytes = to - from;
-+ unsigned hidden_from, hidden_to, hidden_bytes;
-+
-+ print_entry_location();
-+
-+ inode = page->mapping->host; /* CPW: Moved below print_entry_location */
-+ hidden_inode = itohi(inode);
-+
-+ ASSERT(file != NULL);
-+ /*
-+ * here we have a kmapped page, with data from the user copied
-+ * into it. we need to encode_block it, and then call the lower
-+ * commit_write. We also need to simulate same behavior of
-+ * generic_file_write, and call prepare_write on the lower f/s first.
-+ */
-+#ifdef FIST_COUNT_WRITES
-+ count_writes++;
-+# endif /* FIST_COUNT_WRITES */
-+
-+ /* this is append and/or extend -- we can't have holes so fill them in */
-+ if (page->index > (hidden_inode->i_size >> PAGE_CACHE_SHIFT)) {
-+ page_t *tmp_page;
-+ int index;
-+ for (index = hidden_inode->i_size >> PAGE_CACHE_SHIFT; index < page->index; index++) {
-+ tmp_page = mini_fo_get1page(file, index);
-+ if (IS_ERR(tmp_page)) {
-+ err = PTR_ERR(tmp_page);
-+ goto out;
-+ }
-+ /* zero out the contents of the page at the appropriate offsets */
-+ memset((char*)page_address(tmp_page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, PAGE_CACHE_SIZE - (inode->i_size & ~PAGE_CACHE_MASK));
-+ if (!(err = mini_fo_prepare_write(file, tmp_page, 0, PAGE_CACHE_SIZE)))
-+ err = mini_fo_commit_write(file, tmp_page, 0, PAGE_CACHE_SIZE);
-+ page_cache_release(tmp_page);
-+ if (err < 0)
-+ goto out;
-+ if (current->need_resched)
-+ schedule();
-+ }
-+ }
-+
-+ if (ftopd(file) != NULL)
-+ hidden_file = ftohf(file);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_inode->i_mutex);
-+#else
-+ down(&hidden_inode->i_sem);
-+#endif
-+ /* find lower page (returns a locked page) */
-+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+ if (!hidden_page)
-+ goto out;
-+
-+#if FIST_ENCODING_BLOCKSIZE > 1
-+# error encoding_blocksize greater than 1 is not yet supported
-+# endif /* FIST_ENCODING_BLOCKSIZE > 1 */
-+
-+ hidden_from = from & (~(FIST_ENCODING_BLOCKSIZE - 1));
-+ hidden_to = ((to + FIST_ENCODING_BLOCKSIZE - 1) & (~(FIST_ENCODING_BLOCKSIZE - 1)));
-+ if ((page->index << PAGE_CACHE_SHIFT) + to > hidden_inode->i_size) {
-+
-+ /*
-+ * if this call to commit_write had introduced holes and the code
-+ * for handling holes was invoked, then the beginning of this page
-+ * must be zeroed out
-+ * zero out bytes from 'size_of_file%pagesize' to 'from'.
-+ */
-+ if ((hidden_from - (inode->i_size & ~PAGE_CACHE_MASK)) > 0)
-+ memset((char*)page_address(page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, hidden_from - (inode->i_size & ~PAGE_CACHE_MASK));
-+
-+ }
-+ hidden_bytes = hidden_to - hidden_from;
-+
-+ /* call lower prepare_write */
-+ err = -EINVAL;
-+ if (hidden_inode->i_mapping &&
-+ hidden_inode->i_mapping->a_ops &&
-+ hidden_inode->i_mapping->a_ops->prepare_write)
-+ err = hidden_inode->i_mapping->a_ops->prepare_write(hidden_file,
-+ hidden_page,
-+ hidden_from,
-+ hidden_to);
-+ if (err)
-+ /* don't leave locked pages behind, esp. on an ENOSPC */
-+ goto out_unlock;
-+
-+ fist_dprint(8, "%s: encoding %d bytes\n", __FUNCTION__, hidden_bytes);
-+ mini_fo_encode_block((char *) page_address(page) + hidden_from, (char*) page_address(hidden_page) + hidden_from, hidden_bytes, inode, inode->i_sb, page->index);
-+ /* if encode_block could fail, then goto unlock and return error */
-+
-+ /* call lower commit_write */
-+ err = hidden_inode->i_mapping->a_ops->commit_write(hidden_file,
-+ hidden_page,
-+ hidden_from,
-+ hidden_to);
-+
-+ if (err < 0)
-+ goto out_unlock;
-+
-+ err = bytes; /* convert error to no. of bytes */
-+
-+ inode->i_blocks = hidden_inode->i_blocks;
-+ /* we may have to update i_size */
-+ pos = (page->index << PAGE_CACHE_SHIFT) + to;
-+ if (pos > inode->i_size)
-+ inode->i_size = pos;
-+
-+ /*
-+ * update mtime and ctime of lower level file system
-+ * mini_fo' mtime and ctime are updated by generic_file_write
-+ */
-+ hidden_inode->i_mtime = hidden_inode->i_ctime = CURRENT_TIME;
-+
-+ mark_inode_dirty_sync(inode);
-+
-+ out_unlock:
-+ UnlockPage(hidden_page);
-+ page_cache_release(hidden_page);
-+ kunmap(page); /* kmap was done in prepare_write */
-+ out:
-+ /* we must set our page as up-to-date */
-+ if (err < 0)
-+ ClearPageUptodate(page);
-+ else
-+ SetPageUptodate(page);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_inode->i_mutex);
-+#else
-+ up(&hidden_inode->i_sem);
-+#endif
-+ print_exit_status(err);
-+ return err; /* assume all is ok */
-+}
-+
-+
-+STATIC int
-+mini_fo_bmap(struct address_space *mapping, long block)
-+{
-+ int err = 0;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+
-+ print_entry_location();
-+
-+ inode = (inode_t *) mapping->host;
-+ hidden_inode = itohi(inode);
-+
-+ if (hidden_inode->i_mapping->a_ops->bmap)
-+ err = hidden_inode->i_mapping->a_ops->bmap(hidden_inode->i_mapping, block);
-+ print_exit_location();
-+ return err;
-+}
-+
-+
-+/*
-+ * This function is copied verbatim from mm/filemap.c.
-+ * XXX: It should be simply moved to some header file instead -- bug Al about it!
-+ */
-+static inline int sync_page(struct page *page)
-+{
-+ struct address_space *mapping = page->mapping;
-+
-+ if (mapping && mapping->a_ops && mapping->a_ops->sync_page)
-+ return mapping->a_ops->sync_page(page);
-+ return 0;
-+}
-+
-+
-+/*
-+ * XXX: we may not need this function if not FIST_FILTER_DATA.
-+ * FIXME: for FIST_FILTER_SCA, get all lower pages and sync them each.
-+ */
-+STATIC int
-+mini_fo_sync_page(page_t *page)
-+{
-+ int err = 0;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ page_t *hidden_page;
-+
-+ print_entry_location();
-+
-+ inode = page->mapping->host; /* CPW: Moved below print_entry_location */
-+ hidden_inode = itohi(inode);
-+
-+ /* find lower page (returns a locked page) */
-+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+ if (!hidden_page)
-+ goto out;
-+
-+ err = sync_page(hidden_page);
-+
-+ UnlockPage(hidden_page); /* b/c grab_cache_page locked it */
-+ page_cache_release(hidden_page); /* b/c grab_cache_page increased refcnt */
-+
-+ out:
-+ print_exit_status(err);
-+ return err;
-+}
---- /dev/null
-+++ b/fs/mini_fo/README
-@@ -0,0 +1,163 @@
-+README for the mini_fo overlay file system
-+=========================================
-+
-+
-+WHAT IS MINI_FO?
-+----------------
-+
-+mini_fo is a virtual kernel file system that can make read-only
-+file systems writable. This is done by redirecting modifying operations
-+to a writeable location called "storage directory", and leaving the
-+original data in the "base directory" untouched. When reading, the
-+file system merges the modifed and original data so that only the
-+newest versions will appear. This occurs transparently to the user,
-+who can access the data like on any other read-write file system.
-+
-+Base and storage directories may be located on the same or on
-+different partitions and may be of different file system types. While
-+the storage directory obviously needs to be writable, the base may or
-+may not be writable, what doesn't matter as it will no be modified
-+anyway.
-+
-+
-+WHAT IS GOOD FOR?
-+-----------------
-+
-+The primary purpose of the mini_fo file system is to allow easy
-+software updates to embedded systems, that often store their root
-+file system in a read-only flash file system, but there are many
-+more as for example sandboxing, or for allowing live-cds to
-+permanently store information.
-+
-+
-+BUILDING
-+--------
-+This should be simple. Adjust the Makefile to point to the correct
-+kernel headers you want to build the module for. Then:
-+
-+ # make
-+
-+should build "mini_fo.o" for a 2.4 kernel or "mini_fo.ko" for a 2.6
-+kernel.
-+
-+If you are building the module for you current kernel, you can install
-+the module (as root):
-+
-+ # make install
-+
-+or uninstall with
-+
-+ # make uninstall
-+
-+
-+USING THE FILE SYSTEM
-+--------------------
-+
-+the general mount syntax is:
-+
-+ mount -t mini_fo -o base=<base directory>,sto=<storage directory>\
-+ <base directory> <mount point>
-+
-+Example:
-+
-+You have mounted a cdrom to /mnt/cdrom and want to modifiy some files
-+on it:
-+
-+load the module (as root)
-+
-+ # insmod mini_fo.o for a 2.4 kernel or
-+
-+ # insmod mini_fo.ko for a 2.6 kernel
-+
-+
-+create a storage dir in tmp and a mountpoint for mini_fo:
-+
-+ # mkdir /tmp/sto
-+ # mkdir /mnt/mini_fo
-+
-+and mount the mini_fo file system:
-+
-+ # mount -t mini_fo -o base=/mnt/cdrom,sto=/tmp/sto /mnt/cdrom /mnt/mini_fo
-+
-+
-+Now the data stored on the cd can be accessed via the mini_fo
-+mountpoint just like any read-write file system, files can be modified
-+and deleted, new ones can be created and so on. When done unmount the
-+file system:
-+
-+ # unmount /mnt/mini_fo
-+
-+Note that if the file system is mounted again using the same storage
-+file system, of course it will appear in the modified state again. If
-+you remount it using an new empty storage directory, it will be
-+unmodified. Therefore by executing:
-+
-+ # cd /tmp/sto
-+ # rm -rf *
-+
-+you can nuke all the changes you made to the original file system. But
-+ remember NEVER do this while the mini_fo file system is mounted!
-+
-+
-+Alternatively you can use the mini_fo-overlay bash script, that
-+simplifies managing mini_fo mounts. See TOOLS Section.
-+
-+
-+TOOLS
-+-----
-+
-+mini_fo-merge (experimental):
-+
-+This is a bash script that will merge changes contained in the storage
-+directory back to the base directory. This allows mini_fo to function
-+as a cache file system by overlaying a slow (network, ...) file system
-+and using a fast (ramdisk, ...) as storage. When done, changes can be
-+merged back to the (slow) base with mini_fo-merge. See "mini_fo-merge
-+-h" for details.
-+
-+It can be usefull for merging changes back after a successfull test
-+(patches, software updates...)
-+
-+
-+mini_fo-overlay:
-+
-+This bash script simplifies managing one or more mini_fo mounts. For
-+overlaying a directory called "basedir1", you can just call:
-+
-+ # mini_fo-overlay basedir1
-+
-+This will mount mini_fo with "basedir1" as base, "/tmp/sto-basedir1/"
-+as storage to "/mnt/mini_fo-basedir1/". It has more options though,
-+type "mini_fo-overlay -h" for details.
-+
-+
-+DOCUMENTATION, REPORTING BUGS, GETTING HELP
-+-------------------------------------------
-+
-+Please visit the mini_fo project page at:
-+
-+http://www.denx.de/twiki/bin/view/Know/MiniFOHome
-+
-+
-+WARNINGS
-+--------
-+
-+Never modify the base or the storage directorys while the mini_fo
-+file system is mounted, or you might crash you system. Simply accessing
-+and reading should not cause any trouble.
-+
-+Exporting a mini_fo mount point via NFS has not been tested, and may
-+or may not work.
-+
-+Check the RELEASE_NOTES for details on bugs and features.
-+
-+
-+
-+Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+
-+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.
-+
-+
---- /dev/null
-+++ b/fs/mini_fo/RELEASE_NOTES
-@@ -0,0 +1,111 @@
-+Release: mini_fo-0.6.1 (v0-6-1)
-+Date: 21.09.2005
-+
-+
-+Changes:
-+--------
-+v0-6-1:
-+
-+- bugfixes (see ChangeLog)
-+
-+- two helper scripts "mini_fo_merge" and "mini_fo_overlay" (see
-+ README for details).
-+
-+v0-6-0:
-+
-+- Support for 2.4 and 2.6 (see Makefile)
-+
-+- Partial hard link support (creating works as expected, but already
-+ existing links in the base file system will be treated as if they
-+ were individual files).
-+
-+- Various bugfixes and cleanups.
-+
-+
-+v0-6-0-pre1:
-+
-+- This is mini_fo-0-6-0-pre1! This release is a complete rewrite of
-+ many vital mini_fo parts such as the old whiteout list code which
-+ has been replaced by the new META subsystem.
-+
-+- Light weight directory renaming implemented. This means if a
-+ directory is renamed via the mini_fo filesystem this will no longer
-+ result in a complete copy in storage, instead only one empty
-+ directory will be created. All base filed contained in the original
-+ directory stay there until modified.
-+
-+- Special files (creating, renaming, deleting etc.) now working.
-+
-+- Many bugfixes and cleanup, mini_fo is now a lot more stable.
-+
-+
-+v0-5-10:
-+
-+- Final release of the 0-5-* versions. Next will be a complete rewrite
-+ of many features. This release contains several bugfixes related to
-+ directory renaming.
-+
-+
-+v0-5-10-pre6:
-+
-+- Lots of cleanup and several bugfixes related to directory deleting
-+
-+- Directory renaming suddenly works, what is most likely due to the
-+ fact tha that "mv" is smart: if the classic rename doesn't work it
-+ will assume that source and target file are on different fs and will
-+ copy the directory and try to remove the source directory. Until
-+ directory removing wasn't implemented, it would fail to do this and
-+ rollback.
-+ So, directory renaming works for now, but it doesn't yet do what you
-+ would expect from a overlay fs, so use with care.
-+
-+
-+v0-5-10-pre5:
-+
-+- implemented directory deleting
-+- made parsing of mount options more stable
-+- New format of mount options! (See README)
-+- I can't reproduce the unknown panic with 2.4.25 anymore, so I'll
-+ happily assume it never existed!
-+
-+
-+Implemented features:
-+---------------------
-+
-+- creating hard links (see BUGS on already existing hard links)
-+- lightweight directory renaming
-+- renaming device files, pipes, sockets, etc.
-+- creating, renaming, deleting of special files
-+- deleting directorys
-+- general directory reading (simple "ls" )
-+- creating files in existing directorys
-+- creating directorys
-+- renaming files.
-+- reading and writing files (involves opening)
-+- appending to files (creates copy in storage)
-+- deleting files
-+- llseek works too, what allows editors to work
-+- persistency (a deleted file stay deleted over remounts)
-+- use of symbolic links
-+- creating of device files
-+
-+
-+Not (yet) implemented features:
-+-------------------------------
-+
-+- full hard link support.
-+
-+
-+
-+BUGS:
-+-----
-+
-+Hard links in the base file system will be treated as individual
-+files, not as links to one inode.
-+
-+The main problem with hard links isn't allowing to create them, but
-+their pure existence. If you modify a base hard link, the changes made
-+will only show up on this link, the other link will remain in the
-+original state. I hope to fix this someday. Please note that this does
-+not effect the special hard links '.' and '..', that are handled
-+seperately by the lower fs.
---- /dev/null
-+++ b/fs/mini_fo/state.c
-@@ -0,0 +1,620 @@
-+/*
-+ * Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+/* create the storage file, setup new states */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+int create_sto_reg_file(dentry_t *dentry, int mode, struct nameidata *nd)
-+#else
-+int create_sto_reg_file(dentry_t *dentry, int mode)
-+#endif
-+{
-+ int err = 0;
-+ inode_t *dir;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ if(exists_in_storage(dentry)) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: wrong type or state.\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR getting neg. sto dentry.\n");
-+ goto out;
-+ }
-+
-+ dir = dentry->d_parent->d_inode;
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* lock parent */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ mode, nd);
-+#else
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ mode);
-+#endif
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR creating sto file.\n");
-+ goto out_lock;
-+ }
-+
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR creating sto file [2].\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+
-+ /* interpose the new inode */
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == NON_EXISTANT) {
-+ dtost(dentry) = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == UNMODIFIED) {
-+ dtost(dentry) = MODIFIED;
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ }
-+ fist_copy_attr_timesizes(dentry->d_parent->d_inode,
-+ hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+/* create the sto dir, setup states */
-+int create_sto_dir(dentry_t *dentry, int mode)
-+{
-+ int err = 0;
-+ inode_t *dir;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ /* had to take the "!S_ISDIR(mode))" check out, because it failed */
-+ if(exists_in_storage(dentry)) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: wrong type or state.\\
-+n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ err = get_neg_sto_dentry(dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ dir = dentry->d_parent->d_inode;
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+ err = vfs_mkdir(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ mode);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR creating sto dir.\n");
-+ goto out_lock;
-+ }
-+
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR creating sto dir [2].\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+
-+ /* interpose the new inode */
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtopd(dentry)->state == NON_EXISTANT) {
-+ dtopd(dentry)->state = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtopd(dentry)->state == UNMODIFIED) {
-+ dtopd(dentry)->state = MODIFIED;
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR, invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ }
-+
-+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ /* initalize the wol list */
-+ itopd(dentry->d_inode)->deleted_list_size = -1;
-+ itopd(dentry->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(dentry);
-+
-+
-+ out_lock:
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+int create_sto_nod(dentry_t *dentry, int mode, dev_t dev)
-+#else
-+int create_sto_nod(dentry_t *dentry, int mode, int dev)
-+#endif
-+{
-+ int err = 0;
-+ inode_t *dir;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ if(exists_in_storage(dentry)) {
-+ err = -EEXIST;
-+ goto out;
-+ }
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_nod: ERROR getting neg. sto dentry.\n");
-+ goto out;
-+ }
-+
-+ dir = dentry->d_parent->d_inode;
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* lock parent */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+ err = vfs_mknod(hidden_sto_dir_dentry->d_inode, hidden_sto_dentry, mode, dev);
-+ if(err)
-+ goto out_lock;
-+
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: create_sto_nod: creating storage inode failed [1].\n");
-+ err = -EINVAL; /* return something indicating failure */
-+ goto out_lock;
-+ }
-+
-+ /* interpose the new inode */
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == NON_EXISTANT) {
-+ dtost(dentry) = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == UNMODIFIED) {
-+ dtost(dentry) = MODIFIED;
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: create_sto_nod: error, invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ }
-+
-+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+
-+/* unimplemented (and possibly not usefull):
-+
-+ nondir-del_to_del_rew
-+ nondir-non_exist_to_creat
-+
-+ dir-unmod_to_del
-+ dir-mod_to_del
-+ dir-creat_to_del
-+ dir-del_rew_to_del
-+ dir-del_to_del_rew
-+ dir-non_exist_to_creat
-+*/
-+
-+
-+/* bring a file of any type from state UNMODIFIED to MODIFIED */
-+int nondir_unmod_to_mod(dentry_t *dentry, int cp_flag)
-+{
-+ int err = 0;
-+ struct vfsmount *tgt_mnt;
-+ struct vfsmount *src_mnt;
-+ dentry_t *tgt_dentry;
-+ dentry_t *src_dentry;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if((dtost(dentry) != UNMODIFIED) ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR getting neg. sto dentry.\n");
-+ goto out;
-+ }
-+
-+ /* create sto file */
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* lock parent */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+ /* handle different types of nondirs */
-+ if(S_ISCHR(dentry->d_inode->i_mode) ||
-+ S_ISBLK(dentry->d_inode->i_mode)) {
-+ err = vfs_mknod(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dtohd(dentry)->d_inode->i_mode,
-+ dtohd(dentry)->d_inode->i_rdev);
-+ }
-+
-+ else if(S_ISREG(dentry->d_inode->i_mode)) {
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dtohd(dentry)->d_inode->i_mode, NULL);
-+#else
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dtohd(dentry)->d_inode->i_mode);
-+#endif
-+ }
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR creating sto file.\n");
-+ goto out_lock;
-+ }
-+
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR, invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+
-+ fist_copy_attr_timesizes(dentry->d_parent->d_inode,
-+ hidden_sto_dir_dentry->d_inode);
-+ dtost(dentry) = MODIFIED;
-+
-+ /* copy contents if regular file and cp_flag = 1 */
-+ if((cp_flag == 1) && S_ISREG(dentry->d_inode->i_mode)) {
-+
-+ /* unlock first */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ dput(hidden_sto_dir_dentry);
-+
-+ tgt_dentry = dtohd2(dentry);
-+ tgt_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ src_dentry = dtohd(dentry);
-+ src_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt;
-+
-+ err = mini_fo_cp_cont(tgt_dentry, tgt_mnt,
-+ src_dentry, src_mnt);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR copying contents.\n");
-+ }
-+ goto out;
-+ }
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+/* this function is currently identical to nondir_creat_to_del */
-+int nondir_del_rew_to_del(dentry_t *dentry)
-+{
-+ return nondir_creat_to_del(dentry);
-+}
-+
-+int nondir_creat_to_del(dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ inode_t *hidden_sto_dir_inode;
-+ dentry_t *hidden_sto_dir_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ /* for now this function serves for both state DEL_REWRITTEN and
-+ * CREATED */
-+ if(!(dtost(dentry) == CREATED || (dtost(dentry) == DEL_REWRITTEN)) ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_mod_to_del/del_rew_to_del: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ hidden_sto_dir_inode = itohi2(dentry->d_parent->d_inode);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* avoid destroying the hidden inode if the file is in use */
-+ dget(hidden_sto_dentry);
-+ err = vfs_unlink(hidden_sto_dir_inode, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+ dtost(dentry) = NON_EXISTANT;
-+
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+int nondir_mod_to_del(dentry_t *dentry)
-+{
-+ int err;
-+ dentry_t *hidden_sto_dentry;
-+ inode_t *hidden_sto_dir_inode;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) != MODIFIED ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_mod_to_del: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ hidden_sto_dir_inode = itohi2(dentry->d_parent->d_inode);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* avoid destroying the hidden inode if the file is in use */
-+ dget(hidden_sto_dentry);
-+ err = vfs_unlink(hidden_sto_dir_inode, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+ /* dput base dentry, this will relase the inode and free the
-+ * dentry, as we will never need it again. */
-+ dput(dtohd(dentry));
-+ dtohd(dentry) = NULL;
-+ dtost(dentry) = DELETED;
-+
-+ /* add deleted file to META-file */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+int nondir_unmod_to_del(dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) != UNMODIFIED ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_del: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* next we have to get a negative dentry for the storage file */
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if(err)
-+ goto out;
-+
-+ /* add deleted file to META lists */
-+ err = meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+
-+ if(err)
-+ goto out;
-+
-+ /* dput base dentry, this will relase the inode and free the
-+ * dentry, as we will never need it again. */
-+ dput(dtohd(dentry));
-+ dtohd(dentry) = NULL;
-+ dtost(dentry) = DELETED;
-+
-+ out:
-+ return err;
-+}
-+
-+/* bring a dir from state UNMODIFIED to MODIFIED */
-+int dir_unmod_to_mod(dentry_t *dentry)
-+{
-+ int err;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) != UNMODIFIED ||
-+ !S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: dir_unmod_to_mod: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* this creates our dir incl. sto. structure */
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: dir_unmod_to_mod: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ out:
-+ return err;
-+}
-+
---- /dev/null
-+++ b/fs/mini_fo/super.c
-@@ -0,0 +1,281 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+STATIC void
-+mini_fo_read_inode(inode_t *inode)
-+{
-+ static struct address_space_operations mini_fo_empty_aops;
-+
-+ __itopd(inode) = kmalloc(sizeof(struct mini_fo_inode_info), GFP_KERNEL);
-+ if (!itopd(inode)) {
-+ printk("<0>%s:%s:%d: No kernel memory!\n", __FILE__, __FUNCTION__, __LINE__);
-+ ASSERT(NULL);
-+ }
-+ itohi(inode) = NULL;
-+ itohi2(inode) = NULL;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ inode->i_version++;
-+#else
-+ inode->i_version = ++event; /* increment inode version */
-+#endif
-+ inode->i_op = &mini_fo_main_iops;
-+ inode->i_fop = &mini_fo_main_fops;
-+#if 0
-+ /*
-+ * XXX: To export a file system via NFS, it has to have the
-+ * FS_REQUIRES_DEV flag, so turn it on. But should we inherit it from
-+ * the lower file system, or can we allow our file system to be exported
-+ * even if the lower one cannot be natively exported.
-+ */
-+ inode->i_sb->s_type->fs_flags |= FS_REQUIRES_DEV;
-+ /*
-+ * OK, the above was a hack, which is now turned off because it may
-+ * cause a panic/oops on some systems. The correct way to export a
-+ * "nodev" filesystem is via using nfs-utils > 1.0 and the "fsid=" export
-+ * parameter, which requires 2.4.20 or later.
-+ */
-+#endif
-+ /* I don't think ->a_ops is ever allowed to be NULL */
-+ inode->i_mapping->a_ops = &mini_fo_empty_aops;
-+}
-+
-+
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+/*
-+ * No need to call write_inode() on the lower inode, as it
-+ * will have been marked 'dirty' anyway. But we might need
-+ * to write some of our own stuff to disk.
-+ */
-+STATIC void
-+mini_fo_write_inode(inode_t *inode, int sync)
-+{
-+ print_entry_location();
-+ print_exit_location();
-+}
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+
-+
-+STATIC void
-+mini_fo_put_inode(inode_t *inode)
-+{
-+ /*
-+ * This is really funky stuff:
-+ * Basically, if i_count == 1, iput will then decrement it and this inode will be destroyed.
-+ * It is currently holding a reference to the hidden inode.
-+ * Therefore, it needs to release that reference by calling iput on the hidden inode.
-+ * iput() _will_ do it for us (by calling our clear_inode), but _only_ if i_nlink == 0.
-+ * The problem is, NFS keeps i_nlink == 1 for silly_rename'd files.
-+ * So we must for our i_nlink to 0 here to trick iput() into calling our clear_inode.
-+ */
-+ if (atomic_read(&inode->i_count) == 1)
-+ inode->i_nlink = 0;
-+}
-+
-+
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+/*
-+ * we now define delete_inode, because there are two VFS paths that may
-+ * destroy an inode: one of them calls clear inode before doing everything
-+ * else that's needed, and the other is fine. This way we truncate the inode
-+ * size (and its pages) and then clear our own inode, which will do an iput
-+ * on our and the lower inode.
-+ */
-+STATIC void
-+mini_fo_delete_inode(inode_t *inode)
-+{
-+ print_entry_location();
-+
-+ fist_checkinode(inode, "mini_fo_delete_inode IN");
-+ inode->i_size = 0; /* every f/s seems to do that */
-+ clear_inode(inode);
-+
-+ print_exit_location();
-+}
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+
-+
-+/* final actions when unmounting a file system */
-+STATIC void
-+mini_fo_put_super(super_block_t *sb)
-+{
-+ if (stopd(sb)) {
-+ mntput(stopd(sb)->hidden_mnt);
-+ mntput(stopd(sb)->hidden_mnt2);
-+
-+ /* mk: no! dput(stopd(sb)->base_dir_dentry);
-+ dput(stopd(sb)->storage_dir_dentry); */
-+
-+ kfree(stopd(sb));
-+ __stopd(sb) = NULL;
-+ }
-+}
-+
-+
-+#ifdef NOT_NEEDED
-+/*
-+ * This is called in do_umount before put_super.
-+ * The superblock lock is not held yet.
-+ * We probably do not need to define this or call write_super
-+ * on the hidden_sb, because sync_supers() will get to hidden_sb
-+ * sooner or later. But it is also called from file_fsync()...
-+ */
-+STATIC void
-+mini_fo_write_super(super_block_t *sb)
-+{
-+ return;
-+}
-+#endif /* NOT_NEEDED */
-+
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_statfs(struct dentry *d, struct kstatfs *buf)
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_statfs(super_block_t *sb, struct kstatfs *buf)
-+#else
-+mini_fo_statfs(super_block_t *sb, struct statfs *buf)
-+#endif
-+{
-+ int err = 0;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ struct dentry *hidden_d;
-+
-+ hidden_d = dtohd(d);
-+ err = vfs_statfs(hidden_d, buf);
-+#else
-+ super_block_t *hidden_sb;
-+
-+ hidden_sb = stohs(sb);
-+ err = vfs_statfs(hidden_sb, buf);
-+#endif
-+
-+ return err;
-+}
-+
-+
-+/*
-+ * XXX: not implemented. This is not allowed yet.
-+ * Should we call this on the hidden_sb? Probably not.
-+ */
-+STATIC int
-+mini_fo_remount_fs(super_block_t *sb, int *flags, char *data)
-+{
-+ //printk(KERN_CRIT "mini_fo_remount_fs: WARNING, this function is umimplemented.\n");
-+ return -ENOSYS;
-+}
-+
-+
-+/*
-+ * Called by iput() when the inode reference count reached zero
-+ * and the inode is not hashed anywhere. Used to clear anything
-+ * that needs to be, before the inode is completely destroyed and put
-+ * on the inode free list.
-+ */
-+STATIC void
-+mini_fo_clear_inode(inode_t *inode)
-+{
-+ /*
-+ * Decrement a reference to a hidden_inode, which was incremented
-+ * by our read_inode when it was created initially.
-+ */
-+
-+ /* release the wol_list */
-+ if(S_ISDIR(inode->i_mode)) {
-+ __meta_put_lists(inode);
-+ }
-+
-+ /* mk: fan out fun */
-+ if(itohi(inode))
-+ iput(itohi(inode));
-+ if(itohi2(inode))
-+ iput(itohi2(inode));
-+
-+ // XXX: why this assertion fails?
-+ // because it doesn't like us
-+ // ASSERT((inode->i_state & I_DIRTY) == 0);
-+ kfree(itopd(inode));
-+ __itopd(inode) = NULL;
-+}
-+
-+
-+/*
-+ * Called in do_umount() if the MNT_FORCE flag was used and this
-+ * function is defined. See comment in linux/fs/super.c:do_umount().
-+ * Used only in nfs, to kill any pending RPC tasks, so that subsequent
-+ * code can actually succeed and won't leave tasks that need handling.
-+ *
-+ * PS. I wonder if this is somehow useful to undo damage that was
-+ * left in the kernel after a user level file server (such as amd)
-+ * dies.
-+ */
-+STATIC void
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_umount_begin(struct vfsmount *mnt, int flags)
-+{
-+ struct vfsmount *hidden_mnt;
-+
-+ hidden_mnt = stopd(mnt->mnt_sb)->hidden_mnt;
-+
-+ if (hidden_mnt->mnt_sb->s_op->umount_begin)
-+ hidden_mnt->mnt_sb->s_op->umount_begin(hidden_mnt, flags);
-+
-+}
-+#else
-+mini_fo_umount_begin(super_block_t *sb)
-+{
-+ super_block_t *hidden_sb;
-+
-+ hidden_sb = stohs(sb);
-+
-+ if (hidden_sb->s_op->umount_begin)
-+ hidden_sb->s_op->umount_begin(hidden_sb);
-+
-+}
-+#endif
-+
-+
-+struct super_operations mini_fo_sops =
-+{
-+ read_inode: mini_fo_read_inode,
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+ write_inode: mini_fo_write_inode,
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+ put_inode: mini_fo_put_inode,
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+ delete_inode: mini_fo_delete_inode,
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+ put_super: mini_fo_put_super,
-+ statfs: mini_fo_statfs,
-+ remount_fs: mini_fo_remount_fs,
-+ clear_inode: mini_fo_clear_inode,
-+ umount_begin: mini_fo_umount_begin,
-+};
+++ /dev/null
---- a/fs/mini_fo/main.c
-+++ b/fs/mini_fo/main.c
-@@ -79,6 +79,7 @@ mini_fo_tri_interpose(dentry_t *hidden_d
- * of the new inode's fields
- */
-
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
- /*
- * original: inode = iget(sb, hidden_inode->i_ino);
- */
-@@ -87,6 +88,13 @@ mini_fo_tri_interpose(dentry_t *hidden_d
- err = -EACCES; /* should be impossible??? */
- goto out;
- }
-+#else
-+ inode = mini_fo_iget(sb, iunique(sb, 25));
-+ if (IS_ERR(inode)) {
-+ err = PTR_ERR(inode);
-+ goto out;
-+ }
-+#endif
-
- /*
- * interpose the inode if not already interposed
-@@ -184,9 +192,9 @@ mini_fo_parse_options(super_block_t *sb,
- hidden_root = ERR_PTR(err);
- goto out;
- }
-- hidden_root = nd.dentry;
-- stopd(sb)->base_dir_dentry = nd.dentry;
-- stopd(sb)->hidden_mnt = nd.mnt;
-+ hidden_root = nd_get_dentry(&nd);
-+ stopd(sb)->base_dir_dentry = nd_get_dentry(&nd);
-+ stopd(sb)->hidden_mnt = nd_get_mnt(&nd);
-
- } else if(!strncmp("sto=", options, 4)) {
- /* parse the storage dir */
-@@ -204,9 +212,9 @@ mini_fo_parse_options(super_block_t *sb,
- hidden_root2 = ERR_PTR(err);
- goto out;
- }
-- hidden_root2 = nd2.dentry;
-- stopd(sb)->storage_dir_dentry = nd2.dentry;
-- stopd(sb)->hidden_mnt2 = nd2.mnt;
-+ hidden_root2 = nd_get_dentry(&nd2);
-+ stopd(sb)->storage_dir_dentry = nd_get_dentry(&nd2);
-+ stopd(sb)->hidden_mnt2 = nd_get_mnt(&nd2);
- stohs2(sb) = hidden_root2->d_sb;
-
- /* validate storage dir, this is done in
---- a/fs/mini_fo/mini_fo.h
-+++ b/fs/mini_fo/mini_fo.h
-@@ -302,6 +302,10 @@ extern int mini_fo_tri_interpose(dentry_
- extern int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
- dentry_t *src_dentry, struct vfsmount *src_mnt);
-
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+extern struct inode *mini_fo_iget(struct super_block *sb, unsigned long ino);
-+#endif
-+
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
- extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd);
-
-@@ -501,6 +505,29 @@ static inline void double_unlock(struct
- #endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
- #endif /* __KERNEL__ */
-
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+static inline dentry_t *nd_get_dentry(struct nameidata *nd)
-+{
-+ return (nd->path.dentry);
-+}
-+
-+static inline struct vfsmount *nd_get_mnt(struct nameidata *nd)
-+{
-+ return (nd->path.mnt);
-+}
-+#else
-+static inline dentry_t *nd_get_dentry(struct nameidata *nd)
-+{
-+ return (nd->dentry);
-+}
-+
-+static inline struct vfsmount *nd_get_mnt(struct nameidata *nd)
-+{
-+ return (nd->mnt);
-+}
-+#endif
-+
- /*
- * Definitions for user and kernel code
- */
---- a/fs/mini_fo/super.c
-+++ b/fs/mini_fo/super.c
-@@ -262,10 +262,31 @@ mini_fo_umount_begin(super_block_t *sb)
- }
- #endif
-
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+struct inode *
-+mini_fo_iget(struct super_block *sb, unsigned long ino)
-+{
-+ struct inode *inode;
-+
-+ inode = iget_locked(sb, ino);
-+ if (!inode)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (!(inode->i_state & I_NEW))
-+ return inode;
-+
-+ mini_fo_read_inode(inode);
-+
-+ unlock_new_inode(inode);
-+ return inode;
-+}
-+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25) */
-
- struct super_operations mini_fo_sops =
- {
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
- read_inode: mini_fo_read_inode,
-+#endif
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
- write_inode: mini_fo_write_inode,
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
---- a/fs/mini_fo/aux.c
-+++ b/fs/mini_fo/aux.c
-@@ -164,11 +164,11 @@ dentry_t *bpath_walk(super_block_t *sb,
- err = vfs_path_lookup(mnt->mnt_root, mnt, bpath+1, 0, &nd);
-
- /* validate */
-- if (err || !nd.dentry || !nd.dentry->d_inode) {
-+ if (err || !nd_get_dentry(&nd) || !nd_get_dentry(&nd)->d_inode) {
- printk(KERN_CRIT "mini_fo: bpath_walk: path_walk failed.\n");
- return NULL;
- }
-- return nd.dentry;
-+ return nd_get_dentry(&nd);
- }
-
-
+++ /dev/null
---- a/fs/mini_fo/meta.c
-+++ b/fs/mini_fo/meta.c
-@@ -442,6 +442,11 @@ int meta_write_d_entry(dentry_t *dentry,
- S_IRUSR | S_IWUSR);
- #endif
- }
-+
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
-@@ -535,6 +540,11 @@ int meta_write_r_entry(dentry_t *dentry,
- meta_dentry, S_IRUSR | S_IWUSR);
- #endif
- }
-+
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
-@@ -671,14 +681,16 @@ int meta_sync_d_list(dentry_t *dentry, i
- }
- }
-
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
- ERROR opening meta file.\n");
-- /* we don't mntget so we dont't mntput (for now)
-- * mntput(meta_mnt);
-- */
-+ mntput(meta_mnt);
- dput(meta_dentry);
- err = -1;
- goto out;
-@@ -811,14 +823,16 @@ int meta_sync_r_list(dentry_t *dentry, i
- }
- }
-
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
- ERROR opening meta file.\n");
-- /* we don't mntget so we dont't mntput (for now)
-- * mntput(meta_mnt);
-- */
-+ mntput(meta_mnt);
- dput(meta_dentry);
- err = -1;
- goto out;
+++ /dev/null
---- a/lib/kobject_uevent.c
-+++ b/lib/kobject_uevent.c
-@@ -27,7 +27,8 @@ u64 uevent_seqnum;
- char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH;
- static DEFINE_SPINLOCK(sequence_lock);
- #if defined(CONFIG_NET)
--static struct sock *uevent_sock;
-+struct sock *uevent_sock = NULL;
-+EXPORT_SYMBOL_GPL(uevent_sock);
- #endif
-
- /* the strings here must match the enum in include/linux/kobject.h */
-@@ -40,6 +41,18 @@ static const char *kobject_actions[] = {
- [KOBJ_OFFLINE] = "offline",
- };
-
-+u64 uevent_next_seqnum(void)
-+{
-+ u64 seq;
-+
-+ spin_lock(&sequence_lock);
-+ seq = ++uevent_seqnum;
-+ spin_unlock(&sequence_lock);
-+
-+ return seq;
-+}
-+EXPORT_SYMBOL_GPL(uevent_next_seqnum);
-+
- /**
- * kobject_action_type - translate action string to numeric type
- *
-@@ -192,9 +205,7 @@ int kobject_uevent_env(struct kobject *k
- kobj->state_remove_uevent_sent = 1;
-
- /* we will send an event, so request a new sequence number */
-- spin_lock(&sequence_lock);
-- seq = ++uevent_seqnum;
-- spin_unlock(&sequence_lock);
-+ seq = uevent_next_seqnum();
- retval = add_uevent_var(env, "SEQNUM=%llu", (unsigned long long)seq);
- if (retval)
- goto exit;
+++ /dev/null
---- a/sound/core/Kconfig
-+++ b/sound/core/Kconfig
-@@ -9,7 +9,7 @@ config SND_PCM
- depends on SND
-
- config SND_HWDEP
-- tristate
-+ tristate "Sound hardware support"
- depends on SND
-
- config SND_RAWMIDI
+++ /dev/null
---- a/scripts/unifdef.c
-+++ b/scripts/unifdef.c
-@@ -206,7 +206,7 @@ static void done(void);
- static void error(const char *);
- static int findsym(const char *);
- static void flushline(bool);
--static Linetype getline(void);
-+static Linetype get_line(void);
- static Linetype ifeval(const char **);
- static void ignoreoff(void);
- static void ignoreon(void);
-@@ -512,7 +512,7 @@ process(void)
-
- for (;;) {
- linenum++;
-- lineval = getline();
-+ lineval = get_line();
- trans_table[ifstate[depth]][lineval]();
- debug("process %s -> %s depth %d",
- linetype_name[lineval],
-@@ -526,7 +526,7 @@ process(void)
- * help from skipcomment().
- */
- static Linetype
--getline(void)
-+get_line(void)
- {
- const char *cp;
- int cursym;
+++ /dev/null
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -181,4 +181,8 @@ config LEDS_TRIGGER_HEARTBEAT
- load average.
- If unsure, say Y.
-
-+config LEDS_TRIGGER_MORSE
-+ tristate "LED Morse Trigger"
-+ depends on LEDS_TRIGGERS
-+
- endif # NEW_LEDS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -26,3 +26,4 @@ obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.
- 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_MORSE) += ledtrig-morse.o
+++ /dev/null
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -185,4 +185,11 @@ config LEDS_TRIGGER_MORSE
- tristate "LED Morse Trigger"
- depends on LEDS_TRIGGERS
-
-+config LEDS_TRIGGER_DEFAULT_ON
-+ tristate "LED Default ON Trigger"
-+ depends on LEDS_TRIGGERS
-+ help
-+ This allows LEDs to be initialised in the ON state.
-+ If unsure, say Y.
-+
- endif # NEW_LEDS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -27,3 +27,4 @@ obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledt
- obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK) += ledtrig-ide-disk.o
- obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) += ledtrig-heartbeat.o
- obj-$(CONFIG_LEDS_TRIGGER_MORSE) += ledtrig-morse.o
-+obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o
+++ /dev/null
---- a/drivers/rtc/rtc-ds1672.c
-+++ b/drivers/rtc/rtc-ds1672.c
-@@ -13,10 +13,10 @@
- #include <linux/i2c.h>
- #include <linux/rtc.h>
-
--#define DRV_VERSION "0.3"
-+#define DRV_VERSION "0.4"
-
--/* Addresses to scan: none. This chip cannot be detected. */
--static const unsigned short normal_i2c[] = { I2C_CLIENT_END };
-+/* Addresses to scan: 0x68 */
-+static const unsigned short normal_i2c[] = { 0x68, I2C_CLIENT_END };
-
- /* Insmod parameters */
- I2C_CLIENT_INSMOD;
+++ /dev/null
---- a/drivers/input/misc/Kconfig
-+++ b/drivers/input/misc/Kconfig
-@@ -197,4 +197,20 @@ config HP_SDC_RTC
- Say Y here if you want to support the built-in real time clock
- of the HP SDC controller.
-
-+config INPUT_GPIO_BUTTONS
-+ tristate "Polled GPIO buttons interface"
-+ depends on GENERIC_GPIO
-+ select INPUT_POLLDEV
-+ help
-+ This driver implements support for buttons connected
-+ to GPIO pins of various CPUs (and some other chips).
-+
-+ Say Y here if your device has buttons connected
-+ directly to such GPIO pins. Your board-specific
-+ setup logic must also provide a platform device,
-+ with configuration data saying which GPIOs are used.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called gpio-buttons.
-+
- endif
---- a/drivers/input/misc/Makefile
-+++ b/drivers/input/misc/Makefile
-@@ -19,3 +19,4 @@ obj-$(CONFIG_INPUT_YEALINK) += yealink.
- obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o
- obj-$(CONFIG_INPUT_UINPUT) += uinput.o
- obj-$(CONFIG_INPUT_APANEL) += apanel.o
-+obj-$(CONFIG_INPUT_GPIO_BUTTONS) += gpio_buttons.o
+++ /dev/null
---- a/drivers/char/Kconfig
-+++ b/drivers/char/Kconfig
-@@ -955,6 +955,13 @@ config CS5535_GPIO
-
- If compiled as a module, it will be called cs5535_gpio.
-
-+config GPIO_DEVICE
-+ tristate "GPIO device support"
-+ depends on GENERIC_GPIO
-+ help
-+ Say Y to enable Linux GPIO device support. This allows control of
-+ GPIO pins using a character device
-+
- config GPIO_VR41XX
- tristate "NEC VR4100 series General-purpose I/O Unit support"
- depends on CPU_VR41XX
---- a/drivers/char/Makefile
-+++ b/drivers/char/Makefile
-@@ -94,6 +94,7 @@ obj-$(CONFIG_SCx200_GPIO) += scx200_gpio
- obj-$(CONFIG_PC8736x_GPIO) += pc8736x_gpio.o
- obj-$(CONFIG_NSC_GPIO) += nsc_gpio.o
- obj-$(CONFIG_CS5535_GPIO) += cs5535_gpio.o
-+obj-$(CONFIG_GPIO_DEVICE) += gpio_dev.o
- obj-$(CONFIG_GPIO_VR41XX) += vr41xx_giu.o
- obj-$(CONFIG_GPIO_TB0219) += tb0219.o
- obj-$(CONFIG_TELCLOCK) += tlclk.o
+++ /dev/null
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -421,6 +421,7 @@ config FS_POSIX_ACL
-
- source "fs/xfs/Kconfig"
- source "fs/gfs2/Kconfig"
-+source "fs/yaffs2/Kconfig"
-
- config OCFS2_FS
- tristate "OCFS2 file system support"
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -121,3 +121,4 @@ obj-$(CONFIG_HPPFS) += hppfs/
- obj-$(CONFIG_DEBUG_FS) += debugfs/
- obj-$(CONFIG_OCFS2_FS) += ocfs2/
- obj-$(CONFIG_GFS2_FS) += gfs2/
-+obj-$(CONFIG_YAFFS_FS) += yaffs2/
+++ /dev/null
---- a/fs/yaffs2/yaffs_fs.c
-+++ b/fs/yaffs2/yaffs_fs.c
-@@ -181,7 +181,13 @@ static int yaffs_statfs(struct super_blo
- #else
- static int yaffs_statfs(struct super_block *sb, struct statfs *buf);
- #endif
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
-+static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino);
-+#else
- static void yaffs_read_inode(struct inode *inode);
-+#endif
-+
-
- static void yaffs_put_inode(struct inode *inode);
- static void yaffs_delete_inode(struct inode *);
-@@ -284,7 +290,9 @@ static struct file_operations yaffs_dir_
-
- static struct super_operations yaffs_super_ops = {
- .statfs = yaffs_statfs,
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25))
- .read_inode = yaffs_read_inode,
-+#endif
- .put_inode = yaffs_put_inode,
- .put_super = yaffs_put_super,
- .delete_inode = yaffs_delete_inode,
-@@ -844,11 +852,17 @@ struct inode *yaffs_get_inode(struct sup
- T(YAFFS_TRACE_OS,
- (KERN_DEBUG "yaffs_get_inode for object %d\n", obj->objectId));
-
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
-+ inode = yaffs_iget(sb, obj->objectId);
-+ if (IS_ERR(inode))
-+ return NULL;
-+#else
- inode = iget(sb, obj->objectId);
-
- /* NB Side effect: iget calls back to yaffs_read_inode(). */
- /* iget also increments the inode's i_count */
- /* NB You can't be holding grossLock or deadlock will happen! */
-+#endif
-
- return inode;
- }
-@@ -1427,6 +1441,39 @@ static int yaffs_sync_fs(struct super_bl
- }
-
-
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
-+static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino)
-+{
-+ yaffs_Object *obj;
-+ yaffs_Device *dev = yaffs_SuperToDevice(sb);
-+ struct inode *inode;
-+
-+ T(YAFFS_TRACE_OS,
-+ (KERN_DEBUG "yaffs_iget for %lu\n", ino));
-+
-+ inode = iget_locked(sb, ino);
-+ if (!inode)
-+ return ERR_PTR(-ENOMEM);
-+ if (!(inode->i_state & I_NEW))
-+ return inode;
-+
-+ /* NB This is called as a side effect of other functions, but
-+ * we had to release the lock to prevent deadlocks, so
-+ * need to lock again.
-+ */
-+
-+ yaffs_GrossLock(dev);
-+
-+ obj = yaffs_FindObjectByNumber(dev, inode->i_ino);
-+
-+ yaffs_FillInodeFromObject(inode, obj);
-+
-+ yaffs_GrossUnlock(dev);
-+
-+ unlock_new_inode(inode);
-+ return inode;
-+}
-+#else
- static void yaffs_read_inode(struct inode *inode)
- {
- /* NB This is called as a side effect of other functions, but
-@@ -1448,6 +1495,7 @@ static void yaffs_read_inode(struct inod
-
- yaffs_GrossUnlock(dev);
- }
-+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)) */
-
- static LIST_HEAD(yaffs_dev_list);
-
+++ /dev/null
---- a/drivers/net/phy/phy.c
-+++ b/drivers/net/phy/phy.c
-@@ -348,6 +348,50 @@ int phy_ethtool_gset(struct phy_device *
- }
- EXPORT_SYMBOL(phy_ethtool_gset);
-
-+int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr)
-+{
-+ u32 cmd;
-+ int tmp;
-+ struct ethtool_cmd ecmd = { ETHTOOL_GSET };
-+ struct ethtool_value edata = { ETHTOOL_GLINK };
-+
-+ if (get_user(cmd, (u32 *) useraddr))
-+ return -EFAULT;
-+
-+ switch (cmd) {
-+ case ETHTOOL_GSET:
-+ phy_ethtool_gset(phydev, &ecmd);
-+ if (copy_to_user(useraddr, &ecmd, sizeof(ecmd)))
-+ return -EFAULT;
-+ return 0;
-+
-+ case ETHTOOL_SSET:
-+ if (copy_from_user(&ecmd, useraddr, sizeof(ecmd)))
-+ return -EFAULT;
-+ return phy_ethtool_sset(phydev, &ecmd);
-+
-+ case ETHTOOL_NWAY_RST:
-+ /* if autoneg is off, it's an error */
-+ tmp = phy_read(phydev, MII_BMCR);
-+ if (tmp & BMCR_ANENABLE) {
-+ tmp |= (BMCR_ANRESTART);
-+ phy_write(phydev, MII_BMCR, tmp);
-+ return 0;
-+ }
-+ return -EINVAL;
-+
-+ case ETHTOOL_GLINK:
-+ edata.data = (phy_read(phydev,
-+ MII_BMSR) & BMSR_LSTATUS) ? 1 : 0;
-+ if (copy_to_user(useraddr, &edata, sizeof(edata)))
-+ return -EFAULT;
-+ return 0;
-+ }
-+
-+ return -EOPNOTSUPP;
-+}
-+EXPORT_SYMBOL(phy_ethtool_ioctl);
-+
- /**
- * phy_mii_ioctl - generic PHY MII ioctl interface
- * @phydev: the phy_device struct
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -399,6 +399,7 @@ void phy_start_machine(struct phy_device
- void phy_stop_machine(struct phy_device *phydev);
- int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd);
- int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd);
-+int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr);
- int phy_mii_ioctl(struct phy_device *phydev,
- struct mii_ioctl_data *mii_data, int cmd);
- int phy_start_interrupts(struct phy_device *phydev);
+++ /dev/null
---- a/Documentation/kernel-parameters.txt
-+++ b/Documentation/kernel-parameters.txt
-@@ -930,6 +930,8 @@ and is between 256 and 4096 characters.
-
- l2cr= [PPC]
-
-+ l3cr= [PPC]
-+
- lapic [X86-32,APIC] Enable the local APIC even if BIOS
- disabled it.
-
---- a/Documentation/powerpc/booting-without-of.txt
-+++ b/Documentation/powerpc/booting-without-of.txt
-@@ -59,12 +59,39 @@ Table of Contents
- p) Freescale Synchronous Serial Interface
- q) USB EHCI controllers
-
-- VII - Specifying interrupt information for devices
-+ VII - Marvell Discovery mv64[345]6x System Controller chips
-+ 1) The /system-controller node
-+ 2) Child nodes of /system-controller
-+ a) Marvell Discovery MDIO bus
-+ b) Marvell Discovery ethernet controller
-+ c) Marvell Discovery PHY nodes
-+ d) Marvell Discovery SDMA nodes
-+ e) Marvell Discovery BRG nodes
-+ f) Marvell Discovery CUNIT nodes
-+ g) Marvell Discovery MPSCROUTING nodes
-+ h) Marvell Discovery MPSCINTR nodes
-+ i) Marvell Discovery MPSC nodes
-+ j) Marvell Discovery Watch Dog Timer nodes
-+ k) Marvell Discovery I2C nodes
-+ l) Marvell Discovery PIC (Programmable Interrupt Controller) nodes
-+ m) Marvell Discovery MPP (Multipurpose Pins) multiplexing nodes
-+ n) Marvell Discovery GPP (General Purpose Pins) nodes
-+ o) Marvell Discovery PCI host bridge node
-+ p) Marvell Discovery CPU Error nodes
-+ q) Marvell Discovery SRAM Controller nodes
-+ r) Marvell Discovery PCI Error Handler nodes
-+ s) Marvell Discovery Memory Controller nodes
-+
-+ VIII - Specifying interrupt information for devices
- 1) interrupts property
- 2) interrupt-parent property
- 3) OpenPIC Interrupt Controllers
- 4) ISA Interrupt Controllers
-
-+ VIII - Specifying GPIO information for devices
-+ 1) gpios property
-+ 2) gpio-controller nodes
-+
- Appendix A - Sample SOC node for MPC8540
-
-
-@@ -1269,10 +1296,6 @@ platforms are moved over to use the flat
-
- Recommended properties:
-
-- - linux,network-index : This is the intended "index" of this
-- network device. This is used by the bootwrapper to interpret
-- MAC addresses passed by the firmware when no information other
-- than indices is available to associate an address with a device.
- - phy-connection-type : a string naming the controller/PHY interface type,
- i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id", "sgmii",
- "tbi", or "rtbi". This property is only really needed if the connection
-@@ -1622,8 +1645,7 @@ platforms are moved over to use the flat
- - device_type : should be "network", "hldc", "uart", "transparent"
- "bisync", "atm", or "serial".
- - compatible : could be "ucc_geth" or "fsl_atm" and so on.
-- - model : should be "UCC".
-- - device-id : the ucc number(1-8), corresponding to UCCx in UM.
-+ - cell-index : the ucc number(1-8), corresponding to UCCx in UM.
- - reg : Offset and length of the register set for the device
- - interrupts : <a b> where a is the interrupt number and b is a
- field that represents an encoding of the sense and level
-@@ -1667,10 +1689,6 @@ platforms are moved over to use the flat
- - phy-handle : The phandle for the PHY connected to this controller.
-
- Recommended properties:
-- - linux,network-index : This is the intended "index" of this
-- network device. This is used by the bootwrapper to interpret
-- MAC addresses passed by the firmware when no information other
-- than indices is available to associate an address with a device.
- - phy-connection-type : a string naming the controller/PHY interface type,
- i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id" (Internal
- Delay), "rgmii-txid" (delay on TX only), "rgmii-rxid" (delay on RX only),
-@@ -1680,8 +1698,7 @@ platforms are moved over to use the flat
- ucc@2000 {
- device_type = "network";
- compatible = "ucc_geth";
-- model = "UCC";
-- device-id = <1>;
-+ cell-index = <1>;
- reg = <2000 200>;
- interrupts = <a0 0>;
- interrupt-parent = <700>;
-@@ -1995,7 +2012,6 @@ platforms are moved over to use the flat
- interrupts = <20 8>;
- interrupt-parent = <&PIC>;
- phy-handle = <&PHY0>;
-- linux,network-index = <0>;
- fsl,cpm-command = <12000300>;
- };
-
-@@ -2217,12 +2233,6 @@ platforms are moved over to use the flat
- EMAC, that is the content of the current (bogus) "phy-port"
- property.
-
-- Recommended properties:
-- - linux,network-index : This is the intended "index" of this
-- network device. This is used by the bootwrapper to interpret
-- MAC addresses passed by the firmware when no information other
-- than indices is available to associate an address with a device.
--
- Optional properties:
- - phy-address : 1 cell, optional, MDIO address of the PHY. If absent,
- a search is performed.
-@@ -2246,7 +2256,6 @@ platforms are moved over to use the flat
- Example:
-
- EMAC0: ethernet@40000800 {
-- linux,network-index = <0>;
- device_type = "network";
- compatible = "ibm,emac-440gp", "ibm,emac";
- interrupt-parent = <&UIC1>;
-@@ -2817,9 +2826,528 @@ platforms are moved over to use the flat
- };
-
-
-- More devices will be defined as this spec matures.
-+VII - Marvell Discovery mv64[345]6x System Controller chips
-+===========================================================
-+
-+The Marvell mv64[345]60 series of system controller chips contain
-+many of the peripherals needed to implement a complete computer
-+system. In this section, we define device tree nodes to describe
-+the system controller chip itself and each of the peripherals
-+which it contains. Compatible string values for each node are
-+prefixed with the string "marvell,", for Marvell Technology Group Ltd.
-+
-+1) The /system-controller node
-+
-+ This node is used to represent the system-controller and must be
-+ present when the system uses a system contller chip. The top-level
-+ system-controller node contains information that is global to all
-+ devices within the system controller chip. The node name begins
-+ with "system-controller" followed by the unit address, which is
-+ the base address of the memory-mapped register set for the system
-+ controller chip.
-+
-+ Required properties:
-+
-+ - ranges : Describes the translation of system controller addresses
-+ for memory mapped registers.
-+ - clock-frequency: Contains the main clock frequency for the system
-+ controller chip.
-+ - reg : This property defines the address and size of the
-+ memory-mapped registers contained within the system controller
-+ chip. The address specified in the "reg" property should match
-+ the unit address of the system-controller node.
-+ - #address-cells : Address representation for system controller
-+ devices. This field represents the number of cells needed to
-+ represent the address of the memory-mapped registers of devices
-+ within the system controller chip.
-+ - #size-cells : Size representation for for the memory-mapped
-+ registers within the system controller chip.
-+ - #interrupt-cells : Defines the width of cells used to represent
-+ interrupts.
-+
-+ Optional properties:
-+
-+ - model : The specific model of the system controller chip. Such
-+ as, "mv64360", "mv64460", or "mv64560".
-+ - compatible : A string identifying the compatibility identifiers
-+ of the system controller chip.
-+
-+ The system-controller node contains child nodes for each system
-+ controller device that the platform uses. Nodes should not be created
-+ for devices which exist on the system controller chip but are not used
-+
-+ Example Marvell Discovery mv64360 system-controller node:
-+
-+ system-controller@f1000000 { /* Marvell Discovery mv64360 */
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ model = "mv64360"; /* Default */
-+ compatible = "marvell,mv64360";
-+ clock-frequency = <133333333>;
-+ reg = <0xf1000000 0x10000>;
-+ virtual-reg = <0xf1000000>;
-+ ranges = <0x88000000 0x88000000 0x1000000 /* PCI 0 I/O Space */
-+ 0x80000000 0x80000000 0x8000000 /* PCI 0 MEM Space */
-+ 0xa0000000 0xa0000000 0x4000000 /* User FLASH */
-+ 0x00000000 0xf1000000 0x0010000 /* Bridge's regs */
-+ 0xf2000000 0xf2000000 0x0040000>;/* Integrated SRAM */
-+
-+ [ child node definitions... ]
-+ }
-+
-+2) Child nodes of /system-controller
-+
-+ a) Marvell Discovery MDIO bus
-+
-+ The MDIO is a bus to which the PHY devices are connected. For each
-+ device that exists on this bus, a child node should be created. See
-+ the definition of the PHY node below for an example of how to define
-+ a PHY.
-+
-+ Required properties:
-+ - #address-cells : Should be <1>
-+ - #size-cells : Should be <0>
-+ - device_type : Should be "mdio"
-+ - compatible : Should be "marvell,mv64360-mdio"
-+
-+ Example:
-+
-+ mdio {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ device_type = "mdio";
-+ compatible = "marvell,mv64360-mdio";
-+
-+ ethernet-phy@0 {
-+ ......
-+ };
-+ };
-+
-+
-+ b) Marvell Discovery ethernet controller
-+
-+ The Discover ethernet controller is described with two levels
-+ of nodes. The first level describes an ethernet silicon block
-+ and the second level describes up to 3 ethernet nodes within
-+ that block. The reason for the multiple levels is that the
-+ registers for the node are interleaved within a single set
-+ of registers. The "ethernet-block" level describes the
-+ shared register set, and the "ethernet" nodes describe ethernet
-+ port-specific properties.
-+
-+ Ethernet block node
-+
-+ Required properties:
-+ - #address-cells : <1>
-+ - #size-cells : <0>
-+ - compatible : "marvell,mv64360-eth-block"
-+ - reg : Offset and length of the register set for this block
-+
-+ Example Discovery Ethernet block node:
-+ ethernet-block@2000 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ compatible = "marvell,mv64360-eth-block";
-+ reg = <0x2000 0x2000>;
-+ ethernet@0 {
-+ .......
-+ };
-+ };
-+
-+ Ethernet port node
-+
-+ Required properties:
-+ - device_type : Should be "network".
-+ - compatible : Should be "marvell,mv64360-eth".
-+ - reg : Should be <0>, <1>, or <2>, according to which registers
-+ within the silicon block the device uses.
-+ - interrupts : <a> where a is the interrupt number for the port.
-+ - interrupt-parent : the phandle for the interrupt controller
-+ that services interrupts for this device.
-+ - phy : the phandle for the PHY connected to this ethernet
-+ controller.
-+ - local-mac-address : 6 bytes, MAC address
-+
-+ Example Discovery Ethernet port node:
-+ ethernet@0 {
-+ device_type = "network";
-+ compatible = "marvell,mv64360-eth";
-+ reg = <0>;
-+ interrupts = <32>;
-+ interrupt-parent = <&PIC>;
-+ phy = <&PHY0>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ };
-+
-+
-+
-+ c) Marvell Discovery PHY nodes
-+
-+ Required properties:
-+ - device_type : Should be "ethernet-phy"
-+ - interrupts : <a> where a is the interrupt number for this phy.
-+ - interrupt-parent : the phandle for the interrupt controller that
-+ services interrupts for this device.
-+ - reg : The ID number for the phy, usually a small integer
-+
-+ Example Discovery PHY node:
-+ ethernet-phy@1 {
-+ device_type = "ethernet-phy";
-+ compatible = "broadcom,bcm5421";
-+ interrupts = <76>; /* GPP 12 */
-+ interrupt-parent = <&PIC>;
-+ reg = <1>;
-+ };
-+
-+
-+ d) Marvell Discovery SDMA nodes
-+
-+ Represent DMA hardware associated with the MPSC (multiprotocol
-+ serial controllers).
-+
-+ Required properties:
-+ - compatible : "marvell,mv64360-sdma"
-+ - reg : Offset and length of the register set for this device
-+ - interrupts : <a> where a is the interrupt number for the DMA
-+ device.
-+ - interrupt-parent : the phandle for the interrupt controller
-+ that services interrupts for this device.
-+
-+ Example Discovery SDMA node:
-+ sdma@4000 {
-+ compatible = "marvell,mv64360-sdma";
-+ reg = <0x4000 0xc18>;
-+ virtual-reg = <0xf1004000>;
-+ interrupts = <36>;
-+ interrupt-parent = <&PIC>;
-+ };
-+
-+
-+ e) Marvell Discovery BRG nodes
-+
-+ Represent baud rate generator hardware associated with the MPSC
-+ (multiprotocol serial controllers).
-+
-+ Required properties:
-+ - compatible : "marvell,mv64360-brg"
-+ - reg : Offset and length of the register set for this device
-+ - clock-src : A value from 0 to 15 which selects the clock
-+ source for the baud rate generator. This value corresponds
-+ to the CLKS value in the BRGx configuration register. See
-+ the mv64x60 User's Manual.
-+ - clock-frequence : The frequency (in Hz) of the baud rate
-+ generator's input clock.
-+ - current-speed : The current speed setting (presumably by
-+ firmware) of the baud rate generator.
-+
-+ Example Discovery BRG node:
-+ brg@b200 {
-+ compatible = "marvell,mv64360-brg";
-+ reg = <0xb200 0x8>;
-+ clock-src = <8>;
-+ clock-frequency = <133333333>;
-+ current-speed = <9600>;
-+ };
-+
-+
-+ f) Marvell Discovery CUNIT nodes
-+
-+ Represent the Serial Communications Unit device hardware.
-+
-+ Required properties:
-+ - reg : Offset and length of the register set for this device
-+
-+ Example Discovery CUNIT node:
-+ cunit@f200 {
-+ reg = <0xf200 0x200>;
-+ };
-+
-+
-+ g) Marvell Discovery MPSCROUTING nodes
-+
-+ Represent the Discovery's MPSC routing hardware
-+
-+ Required properties:
-+ - reg : Offset and length of the register set for this device
-+
-+ Example Discovery CUNIT node:
-+ mpscrouting@b500 {
-+ reg = <0xb400 0xc>;
-+ };
-+
-+
-+ h) Marvell Discovery MPSCINTR nodes
-+
-+ Represent the Discovery's MPSC DMA interrupt hardware registers
-+ (SDMA cause and mask registers).
-+
-+ Required properties:
-+ - reg : Offset and length of the register set for this device
-+
-+ Example Discovery MPSCINTR node:
-+ mpsintr@b800 {
-+ reg = <0xb800 0x100>;
-+ };
-+
-+
-+ i) Marvell Discovery MPSC nodes
-+
-+ Represent the Discovery's MPSC (Multiprotocol Serial Controller)
-+ serial port.
-+
-+ Required properties:
-+ - device_type : "serial"
-+ - compatible : "marvell,mv64360-mpsc"
-+ - reg : Offset and length of the register set for this device
-+ - sdma : the phandle for the SDMA node used by this port
-+ - brg : the phandle for the BRG node used by this port
-+ - cunit : the phandle for the CUNIT node used by this port
-+ - mpscrouting : the phandle for the MPSCROUTING node used by this port
-+ - mpscintr : the phandle for the MPSCINTR node used by this port
-+ - cell-index : the hardware index of this cell in the MPSC core
-+ - max_idle : value needed for MPSC CHR3 (Maximum Frame Length)
-+ register
-+ - interrupts : <a> where a is the interrupt number for the MPSC.
-+ - interrupt-parent : the phandle for the interrupt controller
-+ that services interrupts for this device.
-+
-+ Example Discovery MPSCINTR node:
-+ mpsc@8000 {
-+ device_type = "serial";
-+ compatible = "marvell,mv64360-mpsc";
-+ reg = <0x8000 0x38>;
-+ virtual-reg = <0xf1008000>;
-+ sdma = <&SDMA0>;
-+ brg = <&BRG0>;
-+ cunit = <&CUNIT>;
-+ mpscrouting = <&MPSCROUTING>;
-+ mpscintr = <&MPSCINTR>;
-+ cell-index = <0>;
-+ max_idle = <40>;
-+ interrupts = <40>;
-+ interrupt-parent = <&PIC>;
-+ };
-+
-
--VII - Specifying interrupt information for devices
-+ j) Marvell Discovery Watch Dog Timer nodes
-+
-+ Represent the Discovery's watchdog timer hardware
-+
-+ Required properties:
-+ - compatible : "marvell,mv64360-wdt"
-+ - reg : Offset and length of the register set for this device
-+
-+ Example Discovery Watch Dog Timer node:
-+ wdt@b410 {
-+ compatible = "marvell,mv64360-wdt";
-+ reg = <0xb410 0x8>;
-+ };
-+
-+
-+ k) Marvell Discovery I2C nodes
-+
-+ Represent the Discovery's I2C hardware
-+
-+ Required properties:
-+ - device_type : "i2c"
-+ - compatible : "marvell,mv64360-i2c"
-+ - reg : Offset and length of the register set for this device
-+ - interrupts : <a> where a is the interrupt number for the I2C.
-+ - interrupt-parent : the phandle for the interrupt controller
-+ that services interrupts for this device.
-+
-+ Example Discovery I2C node:
-+ compatible = "marvell,mv64360-i2c";
-+ reg = <0xc000 0x20>;
-+ virtual-reg = <0xf100c000>;
-+ interrupts = <37>;
-+ interrupt-parent = <&PIC>;
-+ };
-+
-+
-+ l) Marvell Discovery PIC (Programmable Interrupt Controller) nodes
-+
-+ Represent the Discovery's PIC hardware
-+
-+ Required properties:
-+ - #interrupt-cells : <1>
-+ - #address-cells : <0>
-+ - compatible : "marvell,mv64360-pic"
-+ - reg : Offset and length of the register set for this device
-+ - interrupt-controller
-+
-+ Example Discovery PIC node:
-+ pic {
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ compatible = "marvell,mv64360-pic";
-+ reg = <0x0 0x88>;
-+ interrupt-controller;
-+ };
-+
-+
-+ m) Marvell Discovery MPP (Multipurpose Pins) multiplexing nodes
-+
-+ Represent the Discovery's MPP hardware
-+
-+ Required properties:
-+ - compatible : "marvell,mv64360-mpp"
-+ - reg : Offset and length of the register set for this device
-+
-+ Example Discovery MPP node:
-+ mpp@f000 {
-+ compatible = "marvell,mv64360-mpp";
-+ reg = <0xf000 0x10>;
-+ };
-+
-+
-+ n) Marvell Discovery GPP (General Purpose Pins) nodes
-+
-+ Represent the Discovery's GPP hardware
-+
-+ Required properties:
-+ - compatible : "marvell,mv64360-gpp"
-+ - reg : Offset and length of the register set for this device
-+
-+ Example Discovery GPP node:
-+ gpp@f000 {
-+ compatible = "marvell,mv64360-gpp";
-+ reg = <0xf100 0x20>;
-+ };
-+
-+
-+ o) Marvell Discovery PCI host bridge node
-+
-+ Represents the Discovery's PCI host bridge device. The properties
-+ for this node conform to Rev 2.1 of the PCI Bus Binding to IEEE
-+ 1275-1994. A typical value for the compatible property is
-+ "marvell,mv64360-pci".
-+
-+ Example Discovery PCI host bridge node
-+ pci@80000000 {
-+ #address-cells = <3>;
-+ #size-cells = <2>;
-+ #interrupt-cells = <1>;
-+ device_type = "pci";
-+ compatible = "marvell,mv64360-pci";
-+ reg = <0xcf8 0x8>;
-+ ranges = <0x01000000 0x0 0x0
-+ 0x88000000 0x0 0x01000000
-+ 0x02000000 0x0 0x80000000
-+ 0x80000000 0x0 0x08000000>;
-+ bus-range = <0 255>;
-+ clock-frequency = <66000000>;
-+ interrupt-parent = <&PIC>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
-+ interrupt-map = <
-+ /* IDSEL 0x0a */
-+ 0x5000 0 0 1 &PIC 80
-+ 0x5000 0 0 2 &PIC 81
-+ 0x5000 0 0 3 &PIC 91
-+ 0x5000 0 0 4 &PIC 93
-+
-+ /* IDSEL 0x0b */
-+ 0x5800 0 0 1 &PIC 91
-+ 0x5800 0 0 2 &PIC 93
-+ 0x5800 0 0 3 &PIC 80
-+ 0x5800 0 0 4 &PIC 81
-+
-+ /* IDSEL 0x0c */
-+ 0x6000 0 0 1 &PIC 91
-+ 0x6000 0 0 2 &PIC 93
-+ 0x6000 0 0 3 &PIC 80
-+ 0x6000 0 0 4 &PIC 81
-+
-+ /* IDSEL 0x0d */
-+ 0x6800 0 0 1 &PIC 93
-+ 0x6800 0 0 2 &PIC 80
-+ 0x6800 0 0 3 &PIC 81
-+ 0x6800 0 0 4 &PIC 91
-+ >;
-+ };
-+
-+
-+ p) Marvell Discovery CPU Error nodes
-+
-+ Represent the Discovery's CPU error handler device.
-+
-+ Required properties:
-+ - compatible : "marvell,mv64360-cpu-error"
-+ - reg : Offset and length of the register set for this device
-+ - interrupts : the interrupt number for this device
-+ - interrupt-parent : the phandle for the interrupt controller
-+ that services interrupts for this device.
-+
-+ Example Discovery CPU Error node:
-+ cpu-error@0070 {
-+ compatible = "marvell,mv64360-cpu-error";
-+ reg = <0x70 0x10 0x128 0x28>;
-+ interrupts = <3>;
-+ interrupt-parent = <&PIC>;
-+ };
-+
-+
-+ q) Marvell Discovery SRAM Controller nodes
-+
-+ Represent the Discovery's SRAM controller device.
-+
-+ Required properties:
-+ - compatible : "marvell,mv64360-sram-ctrl"
-+ - reg : Offset and length of the register set for this device
-+ - interrupts : the interrupt number for this device
-+ - interrupt-parent : the phandle for the interrupt controller
-+ that services interrupts for this device.
-+
-+ Example Discovery SRAM Controller node:
-+ sram-ctrl@0380 {
-+ compatible = "marvell,mv64360-sram-ctrl";
-+ reg = <0x380 0x80>;
-+ interrupts = <13>;
-+ interrupt-parent = <&PIC>;
-+ };
-+
-+
-+ r) Marvell Discovery PCI Error Handler nodes
-+
-+ Represent the Discovery's PCI error handler device.
-+
-+ Required properties:
-+ - compatible : "marvell,mv64360-pci-error"
-+ - reg : Offset and length of the register set for this device
-+ - interrupts : the interrupt number for this device
-+ - interrupt-parent : the phandle for the interrupt controller
-+ that services interrupts for this device.
-+
-+ Example Discovery PCI Error Handler node:
-+ pci-error@1d40 {
-+ compatible = "marvell,mv64360-pci-error";
-+ reg = <0x1d40 0x40 0xc28 0x4>;
-+ interrupts = <12>;
-+ interrupt-parent = <&PIC>;
-+ };
-+
-+
-+ s) Marvell Discovery Memory Controller nodes
-+
-+ Represent the Discovery's memory controller device.
-+
-+ Required properties:
-+ - compatible : "marvell,mv64360-mem-ctrl"
-+ - reg : Offset and length of the register set for this device
-+ - interrupts : the interrupt number for this device
-+ - interrupt-parent : the phandle for the interrupt controller
-+ that services interrupts for this device.
-+
-+ Example Discovery Memory Controller node:
-+ mem-ctrl@1400 {
-+ compatible = "marvell,mv64360-mem-ctrl";
-+ reg = <0x1400 0x60>;
-+ interrupts = <17>;
-+ interrupt-parent = <&PIC>;
-+ };
-+
-+
-+VIII - Specifying interrupt information for devices
- ===================================================
-
- The device tree represents the busses and devices of a hardware
-@@ -2905,6 +3433,54 @@ encodings listed below:
- 2 = high to low edge sensitive type enabled
- 3 = low to high edge sensitive type enabled
-
-+VIII - Specifying GPIO information for devices
-+==============================================
-+
-+1) gpios property
-+-----------------
-+
-+Nodes that makes use of GPIOs should define them using `gpios' property,
-+format of which is: <&gpio-controller1-phandle gpio1-specifier
-+ &gpio-controller2-phandle gpio2-specifier
-+ 0 /* holes are permitted, means no GPIO 3 */
-+ &gpio-controller4-phandle gpio4-specifier
-+ ...>;
-+
-+Note that gpio-specifier length is controller dependent.
-+
-+gpio-specifier may encode: bank, pin position inside the bank,
-+whether pin is open-drain and whether pin is logically inverted.
-+
-+Example of the node using GPIOs:
-+
-+ node {
-+ gpios = <&qe_pio_e 18 0>;
-+ };
-+
-+In this example gpio-specifier is "18 0" and encodes GPIO pin number,
-+and empty GPIO flags as accepted by the "qe_pio_e" gpio-controller.
-+
-+2) gpio-controller nodes
-+------------------------
-+
-+Every GPIO controller node must have #gpio-cells property defined,
-+this information will be used to translate gpio-specifiers.
-+
-+Example of two SOC GPIO banks defined as gpio-controller nodes:
-+
-+ qe_pio_a: gpio-controller@1400 {
-+ #gpio-cells = <2>;
-+ compatible = "fsl,qe-pario-bank-a", "fsl,qe-pario-bank";
-+ reg = <0x1400 0x18>;
-+ gpio-controller;
-+ };
-+
-+ qe_pio_e: gpio-controller@1460 {
-+ #gpio-cells = <2>;
-+ compatible = "fsl,qe-pario-bank-e", "fsl,qe-pario-bank";
-+ reg = <0x1460 0x18>;
-+ gpio-controller;
-+ };
-
- Appendix A - Sample SOC node for MPC8540
- ========================================
---- /dev/null
-+++ b/Documentation/powerpc/phyp-assisted-dump.txt
-@@ -0,0 +1,127 @@
-+
-+ Hypervisor-Assisted Dump
-+ ------------------------
-+ November 2007
-+
-+The goal of hypervisor-assisted dump is to enable the dump of
-+a crashed system, and to do so from a fully-reset system, and
-+to minimize the total elapsed time until the system is back
-+in production use.
-+
-+As compared to kdump or other strategies, hypervisor-assisted
-+dump offers several strong, practical advantages:
-+
-+-- Unlike kdump, the system has been reset, and loaded
-+ with a fresh copy of the kernel. In particular,
-+ PCI and I/O devices have been reinitialized and are
-+ in a clean, consistent state.
-+-- As the dump is performed, the dumped memory becomes
-+ immediately available to the system for normal use.
-+-- After the dump is completed, no further reboots are
-+ required; the system will be fully usable, and running
-+ in it's normal, production mode on it normal kernel.
-+
-+The above can only be accomplished by coordination with,
-+and assistance from the hypervisor. The procedure is
-+as follows:
-+
-+-- When a system crashes, the hypervisor will save
-+ the low 256MB of RAM to a previously registered
-+ save region. It will also save system state, system
-+ registers, and hardware PTE's.
-+
-+-- After the low 256MB area has been saved, the
-+ hypervisor will reset PCI and other hardware state.
-+ It will *not* clear RAM. It will then launch the
-+ bootloader, as normal.
-+
-+-- The freshly booted kernel will notice that there
-+ is a new node (ibm,dump-kernel) in the device tree,
-+ indicating that there is crash data available from
-+ a previous boot. It will boot into only 256MB of RAM,
-+ reserving the rest of system memory.
-+
-+-- Userspace tools will parse /sys/kernel/release_region
-+ and read /proc/vmcore to obtain the contents of memory,
-+ which holds the previous crashed kernel. The userspace
-+ tools may copy this info to disk, or network, nas, san,
-+ iscsi, etc. as desired.
-+
-+ For Example: the values in /sys/kernel/release-region
-+ would look something like this (address-range pairs).
-+ CPU:0x177fee000-0x10000: HPTE:0x177ffe020-0x1000: /
-+ DUMP:0x177fff020-0x10000000, 0x10000000-0x16F1D370A
-+
-+-- As the userspace tools complete saving a portion of
-+ dump, they echo an offset and size to
-+ /sys/kernel/release_region to release the reserved
-+ memory back to general use.
-+
-+ An example of this is:
-+ "echo 0x40000000 0x10000000 > /sys/kernel/release_region"
-+ which will release 256MB at the 1GB boundary.
-+
-+Please note that the hypervisor-assisted dump feature
-+is only available on Power6-based systems with recent
-+firmware versions.
-+
-+Implementation details:
-+----------------------
-+
-+During boot, a check is made to see if firmware supports
-+this feature on this particular machine. If it does, then
-+we check to see if a active dump is waiting for us. If yes
-+then everything but 256 MB of RAM is reserved during early
-+boot. This area is released once we collect a dump from user
-+land scripts that are run. If there is dump data, then
-+the /sys/kernel/release_region file is created, and
-+the reserved memory is held.
-+
-+If there is no waiting dump data, then only the highest
-+256MB of the ram is reserved as a scratch area. This area
-+is *not* released: this region will be kept permanently
-+reserved, so that it can act as a receptacle for a copy
-+of the low 256MB in the case a crash does occur. See,
-+however, "open issues" below, as to whether
-+such a reserved region is really needed.
-+
-+Currently the dump will be copied from /proc/vmcore to a
-+a new file upon user intervention. The starting address
-+to be read and the range for each data point in provided
-+in /sys/kernel/release_region.
-+
-+The tools to examine the dump will be same as the ones
-+used for kdump.
-+
-+General notes:
-+--------------
-+Security: please note that there are potential security issues
-+with any sort of dump mechanism. In particular, plaintext
-+(unencrypted) data, and possibly passwords, may be present in
-+the dump data. Userspace tools must take adequate precautions to
-+preserve security.
-+
-+Open issues/ToDo:
-+------------
-+ o The various code paths that tell the hypervisor that a crash
-+ occurred, vs. it simply being a normal reboot, should be
-+ reviewed, and possibly clarified/fixed.
-+
-+ o Instead of using /sys/kernel, should there be a /sys/dump
-+ instead? There is a dump_subsys being created by the s390 code,
-+ perhaps the pseries code should use a similar layout as well.
-+
-+ o Is reserving a 256MB region really required? The goal of
-+ reserving a 256MB scratch area is to make sure that no
-+ important crash data is clobbered when the hypervisor
-+ save low mem to the scratch area. But, if one could assure
-+ that nothing important is located in some 256MB area, then
-+ it would not need to be reserved. Something that can be
-+ improved in subsequent versions.
-+
-+ o Still working the kdump team to integrate this with kdump,
-+ some work remains but this would not affect the current
-+ patches.
-+
-+ o Still need to write a shell script, to copy the dump away.
-+ Currently I am parsing it manually.
---- a/arch/powerpc/Kconfig
-+++ b/arch/powerpc/Kconfig
-@@ -49,6 +49,19 @@ config IRQ_PER_CPU
- bool
- default y
-
-+config STACKTRACE_SUPPORT
-+ bool
-+ default y
-+
-+config TRACE_IRQFLAGS_SUPPORT
-+ bool
-+ depends on PPC64
-+ default y
-+
-+config LOCKDEP_SUPPORT
-+ bool
-+ default y
-+
- config RWSEM_GENERIC_SPINLOCK
- bool
-
-@@ -81,6 +94,11 @@ config GENERIC_FIND_NEXT_BIT
- bool
- default y
-
-+config GENERIC_GPIO
-+ bool
-+ help
-+ Generic GPIO API support
-+
- config ARCH_NO_VIRT_TO_BUS
- def_bool PPC64
-
-@@ -91,6 +109,7 @@ config PPC
- select HAVE_OPROFILE
- select HAVE_KPROBES
- select HAVE_KRETPROBES
-+ select HAVE_LMB
-
- config EARLY_PRINTK
- bool
-@@ -210,15 +229,6 @@ source kernel/Kconfig.hz
- source kernel/Kconfig.preempt
- source "fs/Kconfig.binfmt"
-
--# We optimistically allocate largepages from the VM, so make the limit
--# large enough (16MB). This badly named config option is actually
--# max order + 1
--config FORCE_MAX_ZONEORDER
-- int
-- depends on PPC64
-- default "9" if PPC_64K_PAGES
-- default "13"
--
- config HUGETLB_PAGE_SIZE_VARIABLE
- bool
- depends on HUGETLB_PAGE
-@@ -307,6 +317,16 @@ config CRASH_DUMP
-
- Don't change this unless you know what you are doing.
-
-+config PHYP_DUMP
-+ bool "Hypervisor-assisted dump (EXPERIMENTAL)"
-+ depends on PPC_PSERIES && EXPERIMENTAL
-+ help
-+ Hypervisor-assisted dump is meant to be a kdump replacement
-+ offering robustness and speed not possible without system
-+ hypervisor assistence.
-+
-+ If unsure, say "N"
-+
- config PPCBUG_NVRAM
- bool "Enable reading PPCBUG NVRAM during boot" if PPLUS || LOPEC
- default y if PPC_PREP
-@@ -381,6 +401,26 @@ config PPC_64K_PAGES
- while on hardware with such support, it will be used to map
- normal application pages.
-
-+config FORCE_MAX_ZONEORDER
-+ int "Maximum zone order"
-+ default "9" if PPC_64K_PAGES
-+ default "13" if PPC64 && !PPC_64K_PAGES
-+ default "11"
-+ help
-+ The kernel memory allocator divides physically contiguous memory
-+ blocks into "zones", where each zone is a power of two number of
-+ pages. This option selects the largest power of two that the kernel
-+ keeps in the memory allocator. If you need to allocate very large
-+ blocks of physically contiguous memory, then you may need to
-+ increase this value.
-+
-+ This config option is actually maximum order plus one. For example,
-+ a value of 11 means that the largest free memory block is 2^10 pages.
-+
-+ The page size is not necessarily 4KB. For example, on 64-bit
-+ systems, 64KB pages can be enabled via CONFIG_PPC_64K_PAGES. Keep
-+ this in mind when choosing a value for this option.
-+
- config PPC_SUBPAGE_PROT
- bool "Support setting protections for 4k subpages"
- depends on PPC_64K_PAGES
-@@ -490,6 +530,14 @@ config FSL_PCI
- bool
- select PPC_INDIRECT_PCI
-
-+config 4xx_SOC
-+ bool
-+
-+config FSL_LBC
-+ bool
-+ help
-+ Freescale Localbus support
-+
- # Yes MCA RS/6000s exist but Linux-PPC does not currently support any
- config MCA
- bool
-@@ -663,22 +711,6 @@ config CONSISTENT_SIZE
- hex "Size of consistent memory pool" if CONSISTENT_SIZE_BOOL
- default "0x00200000" if NOT_COHERENT_CACHE
-
--config BOOT_LOAD_BOOL
-- bool "Set the boot link/load address"
-- depends on ADVANCED_OPTIONS && !PPC_MULTIPLATFORM
-- help
-- This option allows you to set the initial load address of the zImage
-- or zImage.initrd file. This can be useful if you are on a board
-- which has a small amount of memory.
--
-- Say N here unless you know what you are doing.
--
--config BOOT_LOAD
-- hex "Link/load address for booting" if BOOT_LOAD_BOOL
-- default "0x00400000" if 40x || 8xx || 8260
-- default "0x01000000" if 44x
-- default "0x00800000"
--
- config PIN_TLB
- bool "Pinned Kernel TLBs (860 ONLY)"
- depends on ADVANCED_OPTIONS && 8xx
---- a/arch/powerpc/Kconfig.debug
-+++ b/arch/powerpc/Kconfig.debug
-@@ -269,7 +269,7 @@ config PPC_EARLY_DEBUG_CPM_ADDR
- hex "CPM UART early debug transmit descriptor address"
- depends on PPC_EARLY_DEBUG_CPM
- default "0xfa202008" if PPC_EP88XC
-- default "0xf0000008" if CPM2
-+ default "0xf0001ff8" if CPM2
- default "0xff002008" if CPM1
- help
- This specifies the address of the transmit descriptor
---- a/arch/powerpc/Makefile
-+++ b/arch/powerpc/Makefile
-@@ -71,13 +71,11 @@ endif
-
- LDFLAGS_vmlinux := -Bstatic
-
--CPPFLAGS-$(CONFIG_PPC32) := -Iarch/$(ARCH)
--AFLAGS-$(CONFIG_PPC32) := -Iarch/$(ARCH)
- CFLAGS-$(CONFIG_PPC64) := -mminimal-toc -mtraceback=none -mcall-aixdesc
--CFLAGS-$(CONFIG_PPC32) := -Iarch/$(ARCH) -ffixed-r2 -mmultiple
--KBUILD_CPPFLAGS += $(CPPFLAGS-y)
--KBUILD_AFLAGS += $(AFLAGS-y)
--KBUILD_CFLAGS += -msoft-float -pipe $(CFLAGS-y)
-+CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 -mmultiple
-+KBUILD_CPPFLAGS += -Iarch/$(ARCH)
-+KBUILD_AFLAGS += -Iarch/$(ARCH)
-+KBUILD_CFLAGS += -msoft-float -pipe -Iarch/$(ARCH) $(CFLAGS-y)
- CPP = $(CC) -E $(KBUILD_CFLAGS)
-
- CHECKFLAGS += -m$(CONFIG_WORD_SIZE) -D__powerpc__ -D__powerpc$(CONFIG_WORD_SIZE)__
-@@ -164,7 +162,7 @@ boot := arch/$(ARCH)/boot
- $(BOOT_TARGETS): vmlinux
- $(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
-
--bootwrapper_install:
-+bootwrapper_install %.dtb:
- $(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
-
- define archhelp
---- a/arch/powerpc/boot/Makefile
-+++ b/arch/powerpc/boot/Makefile
-@@ -40,6 +40,7 @@ $(obj)/ebony.o: BOOTCFLAGS += -mcpu=405
- $(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=405
- $(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=405
- $(obj)/treeboot-walnut.o: BOOTCFLAGS += -mcpu=405
-+$(obj)/virtex405-head.o: BOOTCFLAGS += -mcpu=405
-
-
- zlib := inffast.c inflate.c inftrees.c
-@@ -64,7 +65,8 @@ src-plat := of.c cuboot-52xx.c cuboot-82
- cuboot-bamboo.c cuboot-mpc7448hpc2.c cuboot-taishan.c \
- fixed-head.S ep88xc.c ep405.c \
- cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \
-- cuboot-warp.c cuboot-85xx-cpm2.c
-+ cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c \
-+ virtex405-head.S
- src-boot := $(src-wlib) $(src-plat) empty.c
-
- src-boot := $(addprefix $(obj)/, $(src-boot))
-@@ -192,7 +194,7 @@ image-$(CONFIG_PPC_CHRP) += zImage.chrp
- image-$(CONFIG_PPC_EFIKA) += zImage.chrp
- image-$(CONFIG_PPC_PMAC) += zImage.pmac
- image-$(CONFIG_PPC_HOLLY) += zImage.holly
--image-$(CONFIG_PPC_PRPMC2800) += zImage.prpmc2800
-+image-$(CONFIG_PPC_PRPMC2800) += dtbImage.prpmc2800
- image-$(CONFIG_PPC_ISERIES) += zImage.iseries
- image-$(CONFIG_DEFAULT_UIMAGE) += uImage
-
-@@ -216,6 +218,7 @@ image-$(CONFIG_RAINIER) += cuImage.rai
- image-$(CONFIG_TAISHAN) += cuImage.taishan
- image-$(CONFIG_KATMAI) += cuImage.katmai
- image-$(CONFIG_WARP) += cuImage.warp
-+image-$(CONFIG_YOSEMITE) += cuImage.yosemite
-
- # Board ports in arch/powerpc/platform/8xx/Kconfig
- image-$(CONFIG_PPC_MPC86XADS) += cuImage.mpc866ads
-@@ -255,6 +258,7 @@ image-$(CONFIG_TQM8555) += cuImage.tqm
- image-$(CONFIG_TQM8560) += cuImage.tqm8560
- image-$(CONFIG_SBC8548) += cuImage.sbc8548
- image-$(CONFIG_SBC8560) += cuImage.sbc8560
-+image-$(CONFIG_KSI8560) += cuImage.ksi8560
-
- # Board ports in arch/powerpc/platform/embedded6xx/Kconfig
- image-$(CONFIG_STORCENTER) += cuImage.storcenter
-@@ -285,11 +289,11 @@ $(obj)/zImage.%: vmlinux $(wrapperbits)
- $(call if_changed,wrap,$*)
-
- # dtbImage% - a dtbImage is a zImage with an embedded device tree blob
--$(obj)/dtbImage.initrd.%: vmlinux $(wrapperbits) $(dtstree)/%.dts
-- $(call if_changed,wrap,$*,$(dtstree)/$*.dts,,$(obj)/ramdisk.image.gz)
-+$(obj)/dtbImage.initrd.%: vmlinux $(wrapperbits) $(obj)/%.dtb
-+ $(call if_changed,wrap,$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
-
--$(obj)/dtbImage.%: vmlinux $(wrapperbits) $(dtstree)/%.dts
-- $(call if_changed,wrap,$*,$(dtstree)/$*.dts)
-+$(obj)/dtbImage.%: vmlinux $(wrapperbits) $(obj)/%.dtb
-+ $(call if_changed,wrap,$*,,$(obj)/$*.dtb)
-
- # This cannot be in the root of $(src) as the zImage rule always adds a $(obj)
- # prefix
-@@ -302,14 +306,24 @@ $(obj)/zImage.iseries: vmlinux
- $(obj)/uImage: vmlinux $(wrapperbits)
- $(call if_changed,wrap,uboot)
-
--$(obj)/cuImage.%: vmlinux $(dtstree)/%.dts $(wrapperbits)
-- $(call if_changed,wrap,cuboot-$*,$(dtstree)/$*.dts)
-+$(obj)/cuImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
-+ $(call if_changed,wrap,cuboot-$*,,$(obj)/$*.dtb)
-
--$(obj)/treeImage.initrd.%: vmlinux $(dtstree)/%.dts $(wrapperbits)
-- $(call if_changed,wrap,treeboot-$*,$(dtstree)/$*.dts,,$(obj)/ramdisk.image.gz)
-+$(obj)/simpleImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits)
-+ $(call if_changed,wrap,simpleboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
-
--$(obj)/treeImage.%: vmlinux $(dtstree)/%.dts $(wrapperbits)
-- $(call if_changed,wrap,treeboot-$*,$(dtstree)/$*.dts)
-+$(obj)/simpleImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
-+ $(call if_changed,wrap,simpleboot-$*,,$(obj)/$*.dtb)
-+
-+$(obj)/treeImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits)
-+ $(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
-+
-+$(obj)/treeImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
-+ $(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb)
-+
-+# Rule to build device tree blobs
-+$(obj)/%.dtb: $(dtstree)/%.dts $(obj)/dtc
-+ $(obj)/dtc -O dtb -o $(obj)/$*.dtb -b 0 $(DTS_FLAGS) $(dtstree)/$*.dts
-
- # If there isn't a platform selected then just strip the vmlinux.
- ifeq (,$(image-y))
-@@ -326,7 +340,7 @@ install: $(CONFIGURE) $(addprefix $(obj)
-
- # anything not in $(targets)
- clean-files += $(image-) $(initrd-) zImage zImage.initrd cuImage.* treeImage.* \
-- otheros.bld
-+ otheros.bld *.dtb
-
- # clean up files cached by wrapper
- clean-kernel := vmlinux.strip vmlinux.bin
---- a/arch/powerpc/boot/bamboo.c
-+++ b/arch/powerpc/boot/bamboo.c
-@@ -33,7 +33,8 @@ static void bamboo_fixups(void)
- ibm440ep_fixup_clocks(sysclk, 11059200, 25000000);
- ibm4xx_sdram_fixup_memsize();
- ibm4xx_quiesce_eth((u32 *)0xef600e00, (u32 *)0xef600f00);
-- dt_fixup_mac_addresses(bamboo_mac0, bamboo_mac1);
-+ dt_fixup_mac_address_by_alias("ethernet0", bamboo_mac0);
-+ dt_fixup_mac_address_by_alias("ethernet1", bamboo_mac1);
- }
-
- void bamboo_init(void *mac0, void *mac1)
---- a/arch/powerpc/boot/cpm-serial.c
-+++ b/arch/powerpc/boot/cpm-serial.c
-@@ -11,6 +11,7 @@
- #include "types.h"
- #include "io.h"
- #include "ops.h"
-+#include "page.h"
-
- struct cpm_scc {
- u32 gsmrl;
-@@ -42,6 +43,22 @@ struct cpm_param {
- u16 tbase;
- u8 rfcr;
- u8 tfcr;
-+ u16 mrblr;
-+ u32 rstate;
-+ u8 res1[4];
-+ u16 rbptr;
-+ u8 res2[6];
-+ u32 tstate;
-+ u8 res3[4];
-+ u16 tbptr;
-+ u8 res4[6];
-+ u16 maxidl;
-+ u16 idlc;
-+ u16 brkln;
-+ u16 brkec;
-+ u16 brkcr;
-+ u16 rmask;
-+ u8 res5[4];
- };
-
- struct cpm_bd {
-@@ -54,10 +71,10 @@ static void *cpcr;
- static struct cpm_param *param;
- static struct cpm_smc *smc;
- static struct cpm_scc *scc;
--struct cpm_bd *tbdf, *rbdf;
-+static struct cpm_bd *tbdf, *rbdf;
- static u32 cpm_cmd;
--static u8 *muram_start;
--static u32 muram_offset;
-+static void *cbd_addr;
-+static u32 cbd_offset;
-
- static void (*do_cmd)(int op);
- static void (*enable_port)(void);
-@@ -119,20 +136,25 @@ static int cpm_serial_open(void)
-
- out_8(¶m->rfcr, 0x10);
- out_8(¶m->tfcr, 0x10);
-+ out_be16(¶m->mrblr, 1);
-+ out_be16(¶m->maxidl, 0);
-+ out_be16(¶m->brkec, 0);
-+ out_be16(¶m->brkln, 0);
-+ out_be16(¶m->brkcr, 0);
-
-- rbdf = (struct cpm_bd *)muram_start;
-- rbdf->addr = (u8 *)(rbdf + 2);
-+ rbdf = cbd_addr;
-+ rbdf->addr = (u8 *)rbdf - 1;
- rbdf->sc = 0xa000;
- rbdf->len = 1;
-
- tbdf = rbdf + 1;
-- tbdf->addr = (u8 *)(rbdf + 2) + 1;
-+ tbdf->addr = (u8 *)rbdf - 2;
- tbdf->sc = 0x2000;
- tbdf->len = 1;
-
- sync();
-- out_be16(¶m->rbase, muram_offset);
-- out_be16(¶m->tbase, muram_offset + sizeof(struct cpm_bd));
-+ out_be16(¶m->rbase, cbd_offset);
-+ out_be16(¶m->tbase, cbd_offset + sizeof(struct cpm_bd));
-
- do_cmd(CPM_CMD_INIT_RX_TX);
-
-@@ -175,10 +197,12 @@ static unsigned char cpm_serial_getc(voi
-
- int cpm_console_init(void *devp, struct serial_console_data *scdp)
- {
-- void *reg_virt[2];
-- int is_smc = 0, is_cpm2 = 0, n;
-- unsigned long reg_phys;
-+ void *vreg[2];
-+ u32 reg[2];
-+ int is_smc = 0, is_cpm2 = 0;
- void *parent, *muram;
-+ void *muram_addr;
-+ unsigned long muram_offset, muram_size;
-
- if (dt_is_compatible(devp, "fsl,cpm1-smc-uart")) {
- is_smc = 1;
-@@ -202,63 +226,64 @@ int cpm_console_init(void *devp, struct
- else
- do_cmd = cpm1_cmd;
-
-- n = getprop(devp, "fsl,cpm-command", &cpm_cmd, 4);
-- if (n < 4)
-+ if (getprop(devp, "fsl,cpm-command", &cpm_cmd, 4) < 4)
- return -1;
-
-- n = getprop(devp, "virtual-reg", reg_virt, sizeof(reg_virt));
-- if (n < (int)sizeof(reg_virt)) {
-- for (n = 0; n < 2; n++) {
-- if (!dt_xlate_reg(devp, n, ®_phys, NULL))
-- return -1;
--
-- reg_virt[n] = (void *)reg_phys;
-- }
-- }
-+ if (dt_get_virtual_reg(devp, vreg, 2) < 2)
-+ return -1;
-
- if (is_smc)
-- smc = reg_virt[0];
-+ smc = vreg[0];
- else
-- scc = reg_virt[0];
-+ scc = vreg[0];
-
-- param = reg_virt[1];
-+ param = vreg[1];
-
- parent = get_parent(devp);
- if (!parent)
- return -1;
-
-- n = getprop(parent, "virtual-reg", reg_virt, sizeof(reg_virt));
-- if (n < (int)sizeof(reg_virt)) {
-- if (!dt_xlate_reg(parent, 0, ®_phys, NULL))
-- return -1;
--
-- reg_virt[0] = (void *)reg_phys;
-- }
--
-- cpcr = reg_virt[0];
-+ if (dt_get_virtual_reg(parent, &cpcr, 1) < 1)
-+ return -1;
-
- muram = finddevice("/soc/cpm/muram/data");
- if (!muram)
- return -1;
-
- /* For bootwrapper-compatible device trees, we assume that the first
-- * entry has at least 18 bytes, and that #address-cells/#data-cells
-+ * entry has at least 128 bytes, and that #address-cells/#data-cells
- * is one for both parent and child.
- */
-
-- n = getprop(muram, "virtual-reg", reg_virt, sizeof(reg_virt));
-- if (n < (int)sizeof(reg_virt)) {
-- if (!dt_xlate_reg(muram, 0, ®_phys, NULL))
-- return -1;
-+ if (dt_get_virtual_reg(muram, &muram_addr, 1) < 1)
-+ return -1;
-+
-+ if (getprop(muram, "reg", reg, 8) < 8)
-+ return -1;
-+
-+ muram_offset = reg[0];
-+ muram_size = reg[1];
-+
-+ /* Store the buffer descriptors at the end of the first muram chunk.
-+ * For SMC ports on CPM2-based platforms, relocate the parameter RAM
-+ * just before the buffer descriptors.
-+ */
-+
-+ cbd_offset = muram_offset + muram_size - 2 * sizeof(struct cpm_bd);
-
-- reg_virt[0] = (void *)reg_phys;
-+ if (is_cpm2 && is_smc) {
-+ u16 *smc_base = (u16 *)param;
-+ u16 pram_offset;
-+
-+ pram_offset = cbd_offset - 64;
-+ pram_offset = _ALIGN_DOWN(pram_offset, 64);
-+
-+ disable_port();
-+ out_be16(smc_base, pram_offset);
-+ param = muram_addr - muram_offset + pram_offset;
- }
-
-- muram_start = reg_virt[0];
--
-- n = getprop(muram, "reg", &muram_offset, 4);
-- if (n < 4)
-- return -1;
-+ cbd_addr = muram_addr - muram_offset + cbd_offset;
-
- scdp->open = cpm_serial_open;
- scdp->putc = cpm_serial_putc;
---- a/arch/powerpc/boot/cuboot-pq2.c
-+++ b/arch/powerpc/boot/cuboot-pq2.c
-@@ -128,7 +128,7 @@ static void fixup_pci(void)
- u8 *soc_regs;
- int i, len;
- void *node, *parent_node;
-- u32 naddr, nsize, mem_log2;
-+ u32 naddr, nsize, mem_pow2, mem_mask;
-
- node = finddevice("/pci");
- if (!node || !dt_is_compatible(node, "fsl,pq2-pci"))
-@@ -141,7 +141,7 @@ static void fixup_pci(void)
-
- soc_regs = (u8 *)fsl_get_immr();
- if (!soc_regs)
-- goto err;
-+ goto unhandled;
-
- dt_get_reg_format(node, &naddr, &nsize);
- if (naddr != 3 || nsize != 2)
-@@ -153,7 +153,7 @@ static void fixup_pci(void)
-
- dt_get_reg_format(parent_node, &naddr, &nsize);
- if (naddr != 1 || nsize != 1)
-- goto err;
-+ goto unhandled;
-
- len = getprop(node, "ranges", pci_ranges_buf,
- sizeof(pci_ranges_buf));
-@@ -170,14 +170,20 @@ static void fixup_pci(void)
- }
-
- if (!mem || !mmio || !io)
-- goto err;
-+ goto unhandled;
-+ if (mem->size[1] != mmio->size[1])
-+ goto unhandled;
-+ if (mem->size[1] & (mem->size[1] - 1))
-+ goto unhandled;
-+ if (io->size[1] & (io->size[1] - 1))
-+ goto unhandled;
-
- if (mem->phys_addr + mem->size[1] == mmio->phys_addr)
- mem_base = mem;
- else if (mmio->phys_addr + mmio->size[1] == mem->phys_addr)
- mem_base = mmio;
- else
-- goto err;
-+ goto unhandled;
-
- out_be32(&pci_regs[1][0], mem_base->phys_addr | 1);
- out_be32(&pci_regs[2][0], ~(mem->size[1] + mmio->size[1] - 1));
-@@ -201,8 +207,9 @@ static void fixup_pci(void)
- out_le32(&pci_regs[0][58], 0);
- out_le32(&pci_regs[0][60], 0);
-
-- mem_log2 = 1 << (__ilog2_u32(bd.bi_memsize - 1) + 1);
-- out_le32(&pci_regs[0][62], 0xa0000000 | ~((1 << (mem_log2 - 12)) - 1));
-+ mem_pow2 = 1 << (__ilog2_u32(bd.bi_memsize - 1) + 1);
-+ mem_mask = ~(mem_pow2 - 1) >> 12;
-+ out_le32(&pci_regs[0][62], 0xa0000000 | mem_mask);
-
- /* If PCI is disabled, drive RST high to enable. */
- if (!(in_le32(&pci_regs[0][32]) & 1)) {
-@@ -228,7 +235,11 @@ static void fixup_pci(void)
- return;
-
- err:
-- printf("Bad PCI node\r\n");
-+ printf("Bad PCI node -- using existing firmware setup.\r\n");
-+ return;
-+
-+unhandled:
-+ printf("Unsupported PCI node -- using existing firmware setup.\r\n");
- }
-
- static void pq2_platform_fixups(void)
---- a/arch/powerpc/boot/cuboot-rainier.c
-+++ b/arch/powerpc/boot/cuboot-rainier.c
-@@ -42,7 +42,8 @@ static void rainier_fixups(void)
- ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
- ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
- ibm4xx_denali_fixup_memsize();
-- dt_fixup_mac_addresses(&bd.bi_enetaddr, &bd.bi_enet1addr);
-+ dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
-+ dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr);
- }
-
- void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
---- a/arch/powerpc/boot/cuboot-sequoia.c
-+++ b/arch/powerpc/boot/cuboot-sequoia.c
-@@ -42,7 +42,8 @@ static void sequoia_fixups(void)
- ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
- ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
- ibm4xx_denali_fixup_memsize();
-- dt_fixup_mac_addresses(&bd.bi_enetaddr, &bd.bi_enet1addr);
-+ dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
-+ dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr);
- }
-
- void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
---- a/arch/powerpc/boot/cuboot-taishan.c
-+++ b/arch/powerpc/boot/cuboot-taishan.c
-@@ -40,7 +40,8 @@ static void taishan_fixups(void)
-
- ibm4xx_sdram_fixup_memsize();
-
-- dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr);
-+ dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
-+ dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr);
-
- ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
- }
---- a/arch/powerpc/boot/cuboot-warp.c
-+++ b/arch/powerpc/boot/cuboot-warp.c
-@@ -24,7 +24,7 @@ static void warp_fixups(void)
- ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
- ibm4xx_sdram_fixup_memsize();
- ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
-- dt_fixup_mac_addresses(&bd.bi_enetaddr);
-+ dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
- }
-
-
---- /dev/null
-+++ b/arch/powerpc/boot/cuboot-yosemite.c
-@@ -0,0 +1,44 @@
-+/*
-+ * Old U-boot compatibility for Yosemite
-+ *
-+ * Author: Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ *
-+ * Copyright 2008 IBM Corporation
-+ *
-+ * This program is free software; you can 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 "ops.h"
-+#include "stdio.h"
-+#include "4xx.h"
-+#include "44x.h"
-+#include "cuboot.h"
-+
-+#define TARGET_4xx
-+#define TARGET_44x
-+#include "ppcboot.h"
-+
-+static bd_t bd;
-+
-+static void yosemite_fixups(void)
-+{
-+ unsigned long sysclk = 66666666;
-+
-+ ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
-+ ibm4xx_sdram_fixup_memsize();
-+ ibm4xx_quiesce_eth((u32 *)0xef600e00, (u32 *)0xef600f00);
-+ dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
-+ dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr);
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+ unsigned long r6, unsigned long r7)
-+{
-+ CUBOOT_INIT();
-+ platform_ops.fixups = yosemite_fixups;
-+ platform_ops.exit = ibm44x_dbcr_reset;
-+ fdt_init(_dtb_start);
-+ serial_console_init();
-+}
---- a/arch/powerpc/boot/devtree.c
-+++ b/arch/powerpc/boot/devtree.c
-@@ -350,3 +350,23 @@ int dt_is_compatible(void *node, const c
-
- return 0;
- }
-+
-+int dt_get_virtual_reg(void *node, void **addr, int nres)
-+{
-+ unsigned long xaddr;
-+ int n;
-+
-+ n = getprop(node, "virtual-reg", addr, nres * 4);
-+ if (n > 0)
-+ return n / 4;
-+
-+ for (n = 0; n < nres; n++) {
-+ if (!dt_xlate_reg(node, n, &xaddr, NULL))
-+ break;
-+
-+ addr[n] = (void *)xaddr;
-+ }
-+
-+ return n;
-+}
-+
---- a/arch/powerpc/boot/dts/bamboo.dts
-+++ b/arch/powerpc/boot/dts/bamboo.dts
-@@ -204,7 +204,6 @@
- };
-
- EMAC0: ethernet@ef600e00 {
-- linux,network-index = <0>;
- device_type = "network";
- compatible = "ibm,emac-440ep", "ibm,emac-440gp", "ibm,emac";
- interrupt-parent = <&UIC1>;
-@@ -225,7 +224,6 @@
- };
-
- EMAC1: ethernet@ef600f00 {
-- linux,network-index = <1>;
- device_type = "network";
- compatible = "ibm,emac-440ep", "ibm,emac-440gp", "ibm,emac";
- interrupt-parent = <&UIC1>;
---- /dev/null
-+++ b/arch/powerpc/boot/dts/canyonlands.dts
-@@ -0,0 +1,402 @@
-+/*
-+ * Device Tree Source for AMCC Canyonlands (460EX)
-+ *
-+ * Copyright 2008 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without
-+ * any warranty of any kind, whether express or implied.
-+ */
-+
-+/ {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ model = "amcc,canyonlands";
-+ compatible = "amcc,canyonlands";
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC0;
-+ ethernet1 = &EMAC1;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu@0 {
-+ device_type = "cpu";
-+ model = "PowerPC,460EX";
-+ reg = <0>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ timebase-frequency = <0>; /* Filled in by U-Boot */
-+ i-cache-line-size = <20>;
-+ d-cache-line-size = <20>;
-+ i-cache-size = <8000>;
-+ d-cache-size = <8000>;
-+ dcr-controller;
-+ dcr-access-method = "native";
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0 0>; /* Filled in by U-Boot */
-+ };
-+
-+ UIC0: interrupt-controller0 {
-+ compatible = "ibm,uic-460ex","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <0>;
-+ dcr-reg = <0c0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ };
-+
-+ UIC1: interrupt-controller1 {
-+ compatible = "ibm,uic-460ex","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <1>;
-+ dcr-reg = <0d0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <1e 4 1f 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ UIC2: interrupt-controller2 {
-+ compatible = "ibm,uic-460ex","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <2>;
-+ dcr-reg = <0e0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <a 4 b 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ UIC3: interrupt-controller3 {
-+ compatible = "ibm,uic-460ex","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <3>;
-+ dcr-reg = <0f0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <10 4 11 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ SDR0: sdr {
-+ compatible = "ibm,sdr-460ex";
-+ dcr-reg = <00e 002>;
-+ };
-+
-+ CPR0: cpr {
-+ compatible = "ibm,cpr-460ex";
-+ dcr-reg = <00c 002>;
-+ };
-+
-+ plb {
-+ compatible = "ibm,plb-460ex", "ibm,plb4";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ ranges;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+
-+ SDRAM0: sdram {
-+ compatible = "ibm,sdram-460ex", "ibm,sdram-405gp";
-+ dcr-reg = <010 2>;
-+ };
-+
-+ MAL0: mcmal {
-+ compatible = "ibm,mcmal-460ex", "ibm,mcmal2";
-+ dcr-reg = <180 62>;
-+ num-tx-chans = <2>;
-+ num-rx-chans = <10>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-parent = <&UIC2>;
-+ interrupts = < /*TXEOB*/ 6 4
-+ /*RXEOB*/ 7 4
-+ /*SERR*/ 3 4
-+ /*TXDE*/ 4 4
-+ /*RXDE*/ 5 4>;
-+ };
-+
-+ POB0: opb {
-+ compatible = "ibm,opb-460ex", "ibm,opb";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <b0000000 4 b0000000 50000000>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+
-+ EBC0: ebc {
-+ compatible = "ibm,ebc-460ex", "ibm,ebc";
-+ dcr-reg = <012 2>;
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ interrupts = <6 4>;
-+ interrupt-parent = <&UIC1>;
-+ };
-+
-+ UART0: serial@ef600300 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600300 8>;
-+ virtual-reg = <ef600300>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ current-speed = <0>; /* Filled in by U-Boot */
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <1 4>;
-+ };
-+
-+ UART1: serial@ef600400 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600400 8>;
-+ virtual-reg = <ef600400>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ current-speed = <0>; /* Filled in by U-Boot */
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <1 4>;
-+ };
-+
-+ UART2: serial@ef600500 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600500 8>;
-+ virtual-reg = <ef600500>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ current-speed = <0>; /* Filled in by U-Boot */
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <1d 4>;
-+ };
-+
-+ UART3: serial@ef600600 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600600 8>;
-+ virtual-reg = <ef600600>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ current-speed = <0>; /* Filled in by U-Boot */
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <1e 4>;
-+ };
-+
-+ IIC0: i2c@ef600700 {
-+ compatible = "ibm,iic-460ex", "ibm,iic";
-+ reg = <ef600700 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <2 4>;
-+ };
-+
-+ IIC1: i2c@ef600800 {
-+ compatible = "ibm,iic-460ex", "ibm,iic";
-+ reg = <ef600800 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <3 4>;
-+ };
-+
-+ ZMII0: emac-zmii@ef600d00 {
-+ compatible = "ibm,zmii-460ex", "ibm,zmii";
-+ reg = <ef600d00 c>;
-+ };
-+
-+ RGMII0: emac-rgmii@ef601500 {
-+ compatible = "ibm,rgmii-460ex", "ibm,rgmii";
-+ reg = <ef601500 8>;
-+ has-mdio;
-+ };
-+
-+ TAH0: emac-tah@ef601350 {
-+ compatible = "ibm,tah-460ex", "ibm,tah";
-+ reg = <ef601350 30>;
-+ };
-+
-+ TAH1: emac-tah@ef601450 {
-+ compatible = "ibm,tah-460ex", "ibm,tah";
-+ reg = <ef601450 30>;
-+ };
-+
-+ EMAC0: ethernet@ef600e00 {
-+ device_type = "network";
-+ compatible = "ibm,emac-460ex", "ibm,emac4";
-+ interrupt-parent = <&EMAC0>;
-+ interrupts = <0 1>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*Status*/ 0 &UIC2 10 4
-+ /*Wake*/ 1 &UIC2 14 4>;
-+ reg = <ef600e00 70>;
-+ local-mac-address = [000000000000]; /* Filled in by U-Boot */
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <0>;
-+ mal-rx-channel = <0>;
-+ cell-index = <0>;
-+ max-frame-size = <2328>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <00000000>;
-+ rgmii-device = <&RGMII0>;
-+ rgmii-channel = <0>;
-+ tah-device = <&TAH0>;
-+ tah-channel = <0>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
-+ };
-+
-+ EMAC1: ethernet@ef600f00 {
-+ device_type = "network";
-+ compatible = "ibm,emac-460ex", "ibm,emac4";
-+ interrupt-parent = <&EMAC1>;
-+ interrupts = <0 1>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*Status*/ 0 &UIC2 11 4
-+ /*Wake*/ 1 &UIC2 15 4>;
-+ reg = <ef600f00 70>;
-+ local-mac-address = [000000000000]; /* Filled in by U-Boot */
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <1>;
-+ mal-rx-channel = <8>;
-+ cell-index = <1>;
-+ max-frame-size = <2328>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <00000000>;
-+ rgmii-device = <&RGMII0>;
-+ rgmii-channel = <1>;
-+ tah-device = <&TAH1>;
-+ tah-channel = <1>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
-+ mdio-device = <&EMAC0>;
-+ };
-+ };
-+
-+ PCIX0: pci@c0ec00000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pcix-460ex", "ibm,plb-pcix";
-+ primary;
-+ large-inbound-windows;
-+ enable-msi-hole;
-+ reg = <c 0ec00000 8 /* Config space access */
-+ 0 0 0 /* no IACK cycles */
-+ c 0ed00000 4 /* Special cycles */
-+ c 0ec80000 100 /* Internal registers */
-+ c 0ec80100 fc>; /* Internal messaging registers */
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 0000000d 80000000 0 80000000
-+ 01000000 0 00000000 0000000c 08000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* This drives busses 0 to 0x3f */
-+ bus-range = <0 3f>;
-+
-+ /* All PCI interrupts are routed to ext IRQ 2 -> UIC1-0 */
-+ interrupt-map-mask = <0000 0 0 0>;
-+ interrupt-map = < 0000 0 0 0 &UIC1 0 8 >;
-+ };
-+
-+ PCIE0: pciex@d00000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pciex-460ex", "ibm,plb-pciex";
-+ primary;
-+ port = <0>; /* port number */
-+ reg = <d 00000000 20000000 /* Config space access */
-+ c 08010000 00001000>; /* Registers */
-+ dcr-reg = <100 020>;
-+ sdr-base = <300>;
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 0000000e 00000000 0 80000000
-+ 01000000 0 00000000 0000000f 80000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* This drives busses 40 to 0x7f */
-+ bus-range = <40 7f>;
-+
-+ /* Legacy interrupts (note the weird polarity, the bridge seems
-+ * to invert PCIe legacy interrupts).
-+ * We are de-swizzling here because the numbers are actually for
-+ * port of the root complex virtual P2P bridge. But I want
-+ * to avoid putting a node for it in the tree, so the numbers
-+ * below are basically de-swizzled numbers.
-+ * The real slot is on idsel 0, so the swizzling is 1:1
-+ */
-+ interrupt-map-mask = <0000 0 0 7>;
-+ interrupt-map = <
-+ 0000 0 0 1 &UIC3 c 4 /* swizzled int A */
-+ 0000 0 0 2 &UIC3 d 4 /* swizzled int B */
-+ 0000 0 0 3 &UIC3 e 4 /* swizzled int C */
-+ 0000 0 0 4 &UIC3 f 4 /* swizzled int D */>;
-+ };
-+
-+ PCIE1: pciex@d20000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pciex-460ex", "ibm,plb-pciex";
-+ primary;
-+ port = <1>; /* port number */
-+ reg = <d 20000000 20000000 /* Config space access */
-+ c 08011000 00001000>; /* Registers */
-+ dcr-reg = <120 020>;
-+ sdr-base = <340>;
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 0000000e 80000000 0 80000000
-+ 01000000 0 00000000 0000000f 80010000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* This drives busses 80 to 0xbf */
-+ bus-range = <80 bf>;
-+
-+ /* Legacy interrupts (note the weird polarity, the bridge seems
-+ * to invert PCIe legacy interrupts).
-+ * We are de-swizzling here because the numbers are actually for
-+ * port of the root complex virtual P2P bridge. But I want
-+ * to avoid putting a node for it in the tree, so the numbers
-+ * below are basically de-swizzled numbers.
-+ * The real slot is on idsel 0, so the swizzling is 1:1
-+ */
-+ interrupt-map-mask = <0000 0 0 7>;
-+ interrupt-map = <
-+ 0000 0 0 1 &UIC3 10 4 /* swizzled int A */
-+ 0000 0 0 2 &UIC3 11 4 /* swizzled int B */
-+ 0000 0 0 3 &UIC3 12 4 /* swizzled int C */
-+ 0000 0 0 4 &UIC3 13 4 /* swizzled int D */>;
-+ };
-+ };
-+};
---- a/arch/powerpc/boot/dts/ebony.dts
-+++ b/arch/powerpc/boot/dts/ebony.dts
-@@ -241,7 +241,6 @@
- };
-
- EMAC0: ethernet@40000800 {
-- linux,network-index = <0>;
- device_type = "network";
- compatible = "ibm,emac-440gp", "ibm,emac";
- interrupt-parent = <&UIC1>;
-@@ -261,7 +260,6 @@
- zmii-channel = <0>;
- };
- EMAC1: ethernet@40000900 {
-- linux,network-index = <1>;
- device_type = "network";
- compatible = "ibm,emac-440gp", "ibm,emac";
- interrupt-parent = <&UIC1>;
---- a/arch/powerpc/boot/dts/ep8248e.dts
-+++ b/arch/powerpc/boot/dts/ep8248e.dts
-@@ -121,8 +121,7 @@
-
- data@0 {
- compatible = "fsl,cpm-muram-data";
-- reg = <0 0x1100 0x1140
-- 0xec0 0x9800 0x800>;
-+ reg = <0 0x2000 0x9800 0x800>;
- };
- };
-
-@@ -138,7 +137,7 @@
- device_type = "serial";
- compatible = "fsl,mpc8248-smc-uart",
- "fsl,cpm2-smc-uart";
-- reg = <0x11a80 0x20 0x1100 0x40>;
-+ reg = <0x11a80 0x20 0x87fc 2>;
- interrupts = <4 8>;
- interrupt-parent = <&PIC>;
- fsl,cpm-brg = <7>;
---- a/arch/powerpc/boot/dts/ep88xc.dts
-+++ b/arch/powerpc/boot/dts/ep88xc.dts
-@@ -2,7 +2,7 @@
- * EP88xC Device Tree Source
- *
- * Copyright 2006 MontaVista Software, Inc.
-- * Copyright 2007 Freescale Semiconductor, Inc.
-+ * Copyright 2007,2008 Freescale Semiconductor, 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
-@@ -10,6 +10,7 @@
- * option) any later version.
- */
-
-+/dts-v1/;
-
- / {
- model = "EP88xC";
-@@ -23,44 +24,44 @@
-
- PowerPC,885@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <d#16>;
-- i-cache-line-size = <d#16>;
-- d-cache-size = <d#8192>;
-- i-cache-size = <d#8192>;
-+ reg = <0x0>;
-+ d-cache-line-size = <16>;
-+ i-cache-line-size = <16>;
-+ d-cache-size = <8192>;
-+ i-cache-size = <8192>;
- timebase-frequency = <0>;
- bus-frequency = <0>;
- clock-frequency = <0>;
-- interrupts = <f 2>; // decrementer interrupt
-+ interrupts = <15 2>; // decrementer interrupt
- interrupt-parent = <&PIC>;
- };
- };
-
- memory {
- device_type = "memory";
-- reg = <0 0>;
-+ reg = <0x0 0x0>;
- };
-
- localbus@fa200100 {
- compatible = "fsl,mpc885-localbus", "fsl,pq1-localbus";
- #address-cells = <2>;
- #size-cells = <1>;
-- reg = <fa200100 40>;
-+ reg = <0xfa200100 0x40>;
-
- ranges = <
-- 0 0 fc000000 04000000
-- 3 0 fa000000 01000000
-+ 0x0 0x0 0xfc000000 0x4000000
-+ 0x3 0x0 0xfa000000 0x1000000
- >;
-
- flash@0,2000000 {
- compatible = "cfi-flash";
-- reg = <0 2000000 2000000>;
-+ reg = <0x0 0x2000000 0x2000000>;
- bank-width = <4>;
- device-width = <2>;
- };
-
- board-control@3,400000 {
-- reg = <3 400000 10>;
-+ reg = <0x3 0x400000 0x10>;
- compatible = "fsl,ep88xc-bcsr";
- };
- };
-@@ -70,25 +71,25 @@
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
-- ranges = <0 fa200000 00004000>;
-+ ranges = <0x0 0xfa200000 0x4000>;
- bus-frequency = <0>;
-
- // Temporary -- will go away once kernel uses ranges for get_immrbase().
-- reg = <fa200000 4000>;
-+ reg = <0xfa200000 0x4000>;
-
- mdio@e00 {
- compatible = "fsl,mpc885-fec-mdio", "fsl,pq1-fec-mdio";
-- reg = <e00 188>;
-+ reg = <0xe00 0x188>;
- #address-cells = <1>;
- #size-cells = <0>;
-
- PHY0: ethernet-phy@0 {
-- reg = <0>;
-+ reg = <0x0>;
- device_type = "ethernet-phy";
- };
-
- PHY1: ethernet-phy@1 {
-- reg = <1>;
-+ reg = <0x1>;
- device_type = "ethernet-phy";
- };
- };
-@@ -97,7 +98,7 @@
- device_type = "network";
- compatible = "fsl,mpc885-fec-enet",
- "fsl,pq1-fec-enet";
-- reg = <e00 188>;
-+ reg = <0xe00 0x188>;
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <3 1>;
- interrupt-parent = <&PIC>;
-@@ -109,7 +110,7 @@
- device_type = "network";
- compatible = "fsl,mpc885-fec-enet",
- "fsl,pq1-fec-enet";
-- reg = <1e00 188>;
-+ reg = <0x1e00 0x188>;
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <7 1>;
- interrupt-parent = <&PIC>;
-@@ -120,7 +121,7 @@
- PIC: interrupt-controller@0 {
- interrupt-controller;
- #interrupt-cells = <2>;
-- reg = <0 24>;
-+ reg = <0x0 0x24>;
- compatible = "fsl,mpc885-pic", "fsl,pq1-pic";
- };
-
-@@ -130,29 +131,29 @@
- #size-cells = <2>;
- compatible = "fsl,pq-pcmcia";
- device_type = "pcmcia";
-- reg = <80 80>;
-+ reg = <0x80 0x80>;
- interrupt-parent = <&PIC>;
-- interrupts = <d 1>;
-+ interrupts = <13 1>;
- };
-
- cpm@9c0 {
- #address-cells = <1>;
- #size-cells = <1>;
- compatible = "fsl,mpc885-cpm", "fsl,cpm1";
-- command-proc = <9c0>;
-+ command-proc = <0x9c0>;
- interrupts = <0>; // cpm error interrupt
- interrupt-parent = <&CPM_PIC>;
-- reg = <9c0 40>;
-+ reg = <0x9c0 0x40>;
- ranges;
-
- muram@2000 {
- #address-cells = <1>;
- #size-cells = <1>;
-- ranges = <0 2000 2000>;
-+ ranges = <0x0 0x2000 0x2000>;
-
- data@0 {
- compatible = "fsl,cpm-muram-data";
-- reg = <0 1c00>;
-+ reg = <0x0 0x1c00>;
- };
- };
-
-@@ -160,7 +161,7 @@
- compatible = "fsl,mpc885-brg",
- "fsl,cpm1-brg",
- "fsl,cpm-brg";
-- reg = <9f0 10>;
-+ reg = <0x9f0 0x10>;
- };
-
- CPM_PIC: interrupt-controller@930 {
-@@ -168,7 +169,7 @@
- #interrupt-cells = <1>;
- interrupts = <5 2 0 2>;
- interrupt-parent = <&PIC>;
-- reg = <930 20>;
-+ reg = <0x930 0x20>;
- compatible = "fsl,mpc885-cpm-pic",
- "fsl,cpm1-pic";
- };
-@@ -178,11 +179,11 @@
- device_type = "serial";
- compatible = "fsl,mpc885-smc-uart",
- "fsl,cpm1-smc-uart";
-- reg = <a80 10 3e80 40>;
-+ reg = <0xa80 0x10 0x3e80 0x40>;
- interrupts = <4>;
- interrupt-parent = <&CPM_PIC>;
- fsl,cpm-brg = <1>;
-- fsl,cpm-command = <0090>;
-+ fsl,cpm-command = <0x90>;
- linux,planetcore-label = "SMC1";
- };
-
-@@ -191,11 +192,11 @@
- device_type = "serial";
- compatible = "fsl,mpc885-scc-uart",
- "fsl,cpm1-scc-uart";
-- reg = <a20 20 3d00 80>;
-- interrupts = <1d>;
-+ reg = <0xa20 0x20 0x3d00 0x80>;
-+ interrupts = <29>;
- interrupt-parent = <&CPM_PIC>;
- fsl,cpm-brg = <2>;
-- fsl,cpm-command = <0040>;
-+ fsl,cpm-command = <0x40>;
- linux,planetcore-label = "SCC2";
- };
-
-@@ -204,9 +205,9 @@
- #size-cells = <0>;
- compatible = "fsl,mpc885-usb",
- "fsl,cpm1-usb";
-- reg = <a00 18 1c00 80>;
-+ reg = <0xa00 0x18 0x1c00 0x80>;
- interrupt-parent = <&CPM_PIC>;
-- interrupts = <1e>;
-+ interrupts = <30>;
- fsl,cpm-command = <0000>;
- };
- };
---- /dev/null
-+++ b/arch/powerpc/boot/dts/glacier.dts
-@@ -0,0 +1,467 @@
-+/*
-+ * Device Tree Source for AMCC Glacier (460GT)
-+ *
-+ * Copyright 2008 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without
-+ * any warranty of any kind, whether express or implied.
-+ */
-+
-+/ {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ model = "amcc,glacier";
-+ compatible = "amcc,glacier", "amcc,canyonlands";
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC0;
-+ ethernet1 = &EMAC1;
-+ ethernet2 = &EMAC2;
-+ ethernet3 = &EMAC3;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu@0 {
-+ device_type = "cpu";
-+ model = "PowerPC,460GT";
-+ reg = <0>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ timebase-frequency = <0>; /* Filled in by U-Boot */
-+ i-cache-line-size = <20>;
-+ d-cache-line-size = <20>;
-+ i-cache-size = <8000>;
-+ d-cache-size = <8000>;
-+ dcr-controller;
-+ dcr-access-method = "native";
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0 0>; /* Filled in by U-Boot */
-+ };
-+
-+ UIC0: interrupt-controller0 {
-+ compatible = "ibm,uic-460gt","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <0>;
-+ dcr-reg = <0c0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ };
-+
-+ UIC1: interrupt-controller1 {
-+ compatible = "ibm,uic-460gt","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <1>;
-+ dcr-reg = <0d0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <1e 4 1f 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ UIC2: interrupt-controller2 {
-+ compatible = "ibm,uic-460gt","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <2>;
-+ dcr-reg = <0e0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <a 4 b 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ UIC3: interrupt-controller3 {
-+ compatible = "ibm,uic-460gt","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <3>;
-+ dcr-reg = <0f0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <10 4 11 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ SDR0: sdr {
-+ compatible = "ibm,sdr-460gt";
-+ dcr-reg = <00e 002>;
-+ };
-+
-+ CPR0: cpr {
-+ compatible = "ibm,cpr-460gt";
-+ dcr-reg = <00c 002>;
-+ };
-+
-+ plb {
-+ compatible = "ibm,plb-460gt", "ibm,plb4";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ ranges;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+
-+ SDRAM0: sdram {
-+ compatible = "ibm,sdram-460gt", "ibm,sdram-405gp";
-+ dcr-reg = <010 2>;
-+ };
-+
-+ MAL0: mcmal {
-+ compatible = "ibm,mcmal-460gt", "ibm,mcmal2";
-+ dcr-reg = <180 62>;
-+ num-tx-chans = <4>;
-+ num-rx-chans = <20>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-parent = <&UIC2>;
-+ interrupts = < /*TXEOB*/ 6 4
-+ /*RXEOB*/ 7 4
-+ /*SERR*/ 3 4
-+ /*TXDE*/ 4 4
-+ /*RXDE*/ 5 4>;
-+ desc-base-addr-high = <8>;
-+ };
-+
-+ POB0: opb {
-+ compatible = "ibm,opb-460gt", "ibm,opb";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <b0000000 4 b0000000 50000000>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+
-+ EBC0: ebc {
-+ compatible = "ibm,ebc-460gt", "ibm,ebc";
-+ dcr-reg = <012 2>;
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ interrupts = <6 4>;
-+ interrupt-parent = <&UIC1>;
-+ };
-+
-+ UART0: serial@ef600300 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600300 8>;
-+ virtual-reg = <ef600300>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ current-speed = <0>; /* Filled in by U-Boot */
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <1 4>;
-+ };
-+
-+ UART1: serial@ef600400 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600400 8>;
-+ virtual-reg = <ef600400>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ current-speed = <0>; /* Filled in by U-Boot */
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <1 4>;
-+ };
-+
-+ UART2: serial@ef600500 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600500 8>;
-+ virtual-reg = <ef600500>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ current-speed = <0>; /* Filled in by U-Boot */
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <1d 4>;
-+ };
-+
-+ UART3: serial@ef600600 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600600 8>;
-+ virtual-reg = <ef600600>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ current-speed = <0>; /* Filled in by U-Boot */
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <1e 4>;
-+ };
-+
-+ IIC0: i2c@ef600700 {
-+ compatible = "ibm,iic-460gt", "ibm,iic";
-+ reg = <ef600700 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <2 4>;
-+ };
-+
-+ IIC1: i2c@ef600800 {
-+ compatible = "ibm,iic-460gt", "ibm,iic";
-+ reg = <ef600800 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <3 4>;
-+ };
-+
-+ ZMII0: emac-zmii@ef600d00 {
-+ compatible = "ibm,zmii-460gt", "ibm,zmii";
-+ reg = <ef600d00 c>;
-+ };
-+
-+ RGMII0: emac-rgmii@ef601500 {
-+ compatible = "ibm,rgmii-460gt", "ibm,rgmii";
-+ reg = <ef601500 8>;
-+ has-mdio;
-+ };
-+
-+ RGMII1: emac-rgmii@ef601600 {
-+ compatible = "ibm,rgmii-460gt", "ibm,rgmii";
-+ reg = <ef601600 8>;
-+ has-mdio;
-+ };
-+
-+ TAH0: emac-tah@ef601350 {
-+ compatible = "ibm,tah-460gt", "ibm,tah";
-+ reg = <ef601350 30>;
-+ };
-+
-+ TAH1: emac-tah@ef601450 {
-+ compatible = "ibm,tah-460gt", "ibm,tah";
-+ reg = <ef601450 30>;
-+ };
-+
-+ EMAC0: ethernet@ef600e00 {
-+ device_type = "network";
-+ compatible = "ibm,emac-460gt", "ibm,emac4";
-+ interrupt-parent = <&EMAC0>;
-+ interrupts = <0 1>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*Status*/ 0 &UIC2 10 4
-+ /*Wake*/ 1 &UIC2 14 4>;
-+ reg = <ef600e00 70>;
-+ local-mac-address = [000000000000]; /* Filled in by U-Boot */
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <0>;
-+ mal-rx-channel = <0>;
-+ cell-index = <0>;
-+ max-frame-size = <2328>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <00000000>;
-+ rgmii-device = <&RGMII0>;
-+ rgmii-channel = <0>;
-+ tah-device = <&TAH0>;
-+ tah-channel = <0>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
-+ };
-+
-+ EMAC1: ethernet@ef600f00 {
-+ device_type = "network";
-+ compatible = "ibm,emac-460gt", "ibm,emac4";
-+ interrupt-parent = <&EMAC1>;
-+ interrupts = <0 1>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*Status*/ 0 &UIC2 11 4
-+ /*Wake*/ 1 &UIC2 15 4>;
-+ reg = <ef600f00 70>;
-+ local-mac-address = [000000000000]; /* Filled in by U-Boot */
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <1>;
-+ mal-rx-channel = <8>;
-+ cell-index = <1>;
-+ max-frame-size = <2328>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <00000000>;
-+ rgmii-device = <&RGMII0>;
-+ rgmii-channel = <1>;
-+ tah-device = <&TAH1>;
-+ tah-channel = <1>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
-+ mdio-device = <&EMAC0>;
-+ };
-+
-+ EMAC2: ethernet@ef601100 {
-+ device_type = "network";
-+ compatible = "ibm,emac-460gt", "ibm,emac4";
-+ interrupt-parent = <&EMAC2>;
-+ interrupts = <0 1>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*Status*/ 0 &UIC2 12 4
-+ /*Wake*/ 1 &UIC2 16 4>;
-+ reg = <ef601100 70>;
-+ local-mac-address = [000000000000]; /* Filled in by U-Boot */
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <2>;
-+ mal-rx-channel = <10>;
-+ cell-index = <2>;
-+ max-frame-size = <2328>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <00000000>;
-+ rgmii-device = <&RGMII1>;
-+ rgmii-channel = <0>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
-+ mdio-device = <&EMAC0>;
-+ };
-+
-+ EMAC3: ethernet@ef601200 {
-+ device_type = "network";
-+ compatible = "ibm,emac-460gt", "ibm,emac4";
-+ interrupt-parent = <&EMAC3>;
-+ interrupts = <0 1>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*Status*/ 0 &UIC2 13 4
-+ /*Wake*/ 1 &UIC2 17 4>;
-+ reg = <ef601200 70>;
-+ local-mac-address = [000000000000]; /* Filled in by U-Boot */
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <3>;
-+ mal-rx-channel = <18>;
-+ cell-index = <3>;
-+ max-frame-size = <2328>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <00000000>;
-+ rgmii-device = <&RGMII1>;
-+ rgmii-channel = <1>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
-+ mdio-device = <&EMAC0>;
-+ };
-+ };
-+
-+ PCIX0: pci@c0ec00000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pcix-460gt", "ibm,plb-pcix";
-+ primary;
-+ large-inbound-windows;
-+ enable-msi-hole;
-+ reg = <c 0ec00000 8 /* Config space access */
-+ 0 0 0 /* no IACK cycles */
-+ c 0ed00000 4 /* Special cycles */
-+ c 0ec80000 100 /* Internal registers */
-+ c 0ec80100 fc>; /* Internal messaging registers */
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 0000000d 80000000 0 80000000
-+ 01000000 0 00000000 0000000c 08000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* This drives busses 0 to 0x3f */
-+ bus-range = <0 3f>;
-+
-+ /* All PCI interrupts are routed to ext IRQ 2 -> UIC1-0 */
-+ interrupt-map-mask = <0000 0 0 0>;
-+ interrupt-map = < 0000 0 0 0 &UIC1 0 8 >;
-+ };
-+
-+ PCIE0: pciex@d00000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pciex-460ex", "ibm,plb-pciex";
-+ primary;
-+ port = <0>; /* port number */
-+ reg = <d 00000000 20000000 /* Config space access */
-+ c 08010000 00001000>; /* Registers */
-+ dcr-reg = <100 020>;
-+ sdr-base = <300>;
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 0000000e 00000000 0 80000000
-+ 01000000 0 00000000 0000000f 80000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* This drives busses 40 to 0x7f */
-+ bus-range = <40 7f>;
-+
-+ /* Legacy interrupts (note the weird polarity, the bridge seems
-+ * to invert PCIe legacy interrupts).
-+ * We are de-swizzling here because the numbers are actually for
-+ * port of the root complex virtual P2P bridge. But I want
-+ * to avoid putting a node for it in the tree, so the numbers
-+ * below are basically de-swizzled numbers.
-+ * The real slot is on idsel 0, so the swizzling is 1:1
-+ */
-+ interrupt-map-mask = <0000 0 0 7>;
-+ interrupt-map = <
-+ 0000 0 0 1 &UIC3 c 4 /* swizzled int A */
-+ 0000 0 0 2 &UIC3 d 4 /* swizzled int B */
-+ 0000 0 0 3 &UIC3 e 4 /* swizzled int C */
-+ 0000 0 0 4 &UIC3 f 4 /* swizzled int D */>;
-+ };
-+
-+ PCIE1: pciex@d20000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pciex-460ex", "ibm,plb-pciex";
-+ primary;
-+ port = <1>; /* port number */
-+ reg = <d 20000000 20000000 /* Config space access */
-+ c 08011000 00001000>; /* Registers */
-+ dcr-reg = <120 020>;
-+ sdr-base = <340>;
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 0000000e 80000000 0 80000000
-+ 01000000 0 00000000 0000000f 80010000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* This drives busses 80 to 0xbf */
-+ bus-range = <80 bf>;
-+
-+ /* Legacy interrupts (note the weird polarity, the bridge seems
-+ * to invert PCIe legacy interrupts).
-+ * We are de-swizzling here because the numbers are actually for
-+ * port of the root complex virtual P2P bridge. But I want
-+ * to avoid putting a node for it in the tree, so the numbers
-+ * below are basically de-swizzled numbers.
-+ * The real slot is on idsel 0, so the swizzling is 1:1
-+ */
-+ interrupt-map-mask = <0000 0 0 7>;
-+ interrupt-map = <
-+ 0000 0 0 1 &UIC3 10 4 /* swizzled int A */
-+ 0000 0 0 2 &UIC3 11 4 /* swizzled int B */
-+ 0000 0 0 3 &UIC3 12 4 /* swizzled int C */
-+ 0000 0 0 4 &UIC3 13 4 /* swizzled int D */>;
-+ };
-+ };
-+};
---- a/arch/powerpc/boot/dts/haleakala.dts
-+++ b/arch/powerpc/boot/dts/haleakala.dts
-@@ -12,7 +12,7 @@
- #address-cells = <1>;
- #size-cells = <1>;
- model = "amcc,haleakala";
-- compatible = "amcc,kilauea";
-+ compatible = "amcc,haleakala", "amcc,kilauea";
- dcr-parent = <&/cpus/cpu@0>;
-
- aliases {
-@@ -218,7 +218,7 @@
- mal-tx-channel = <0>;
- mal-rx-channel = <0>;
- cell-index = <0>;
-- max-frame-size = <5dc>;
-+ max-frame-size = <2328>;
- rx-fifo-size = <1000>;
- tx-fifo-size = <800>;
- phy-mode = "rgmii";
---- a/arch/powerpc/boot/dts/katmai.dts
-+++ b/arch/powerpc/boot/dts/katmai.dts
-@@ -212,7 +212,7 @@
- mal-tx-channel = <0>;
- mal-rx-channel = <0>;
- cell-index = <0>;
-- max-frame-size = <5dc>;
-+ max-frame-size = <2328>;
- rx-fifo-size = <1000>;
- tx-fifo-size = <800>;
- phy-mode = "gmii";
---- a/arch/powerpc/boot/dts/kilauea.dts
-+++ b/arch/powerpc/boot/dts/kilauea.dts
-@@ -219,7 +219,7 @@
- mal-tx-channel = <0>;
- mal-rx-channel = <0>;
- cell-index = <0>;
-- max-frame-size = <5dc>;
-+ max-frame-size = <2328>;
- rx-fifo-size = <1000>;
- tx-fifo-size = <800>;
- phy-mode = "rgmii";
-@@ -247,7 +247,7 @@
- mal-tx-channel = <1>;
- mal-rx-channel = <1>;
- cell-index = <1>;
-- max-frame-size = <5dc>;
-+ max-frame-size = <2328>;
- rx-fifo-size = <1000>;
- tx-fifo-size = <800>;
- phy-mode = "rgmii";
---- /dev/null
-+++ b/arch/powerpc/boot/dts/ksi8560.dts
-@@ -0,0 +1,267 @@
-+/*
-+ * Device Tree Source for Emerson KSI8560
-+ *
-+ * Author: Alexandr Smirnov <asmirnov@ru.mvista.com>
-+ *
-+ * Based on mpc8560ads.dts
-+ *
-+ * 2008 (c) MontaVista, Software, Inc. This file is licensed under
-+ * the terms of the GNU General Public License version 2. This program
-+ * is licensed "as is" without any warranty of any kind, whether express
-+ * or implied.
-+ *
-+ */
-+
-+/dts-v1/;
-+
-+/ {
-+ model = "KSI8560";
-+ compatible = "emerson,KSI8560";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ ethernet2 = &enet2;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,8560@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ d-cache-line-size = <32>;
-+ i-cache-line-size = <32>;
-+ d-cache-size = <0x8000>; /* L1, 32K */
-+ i-cache-size = <0x8000>; /* L1, 32K */
-+ timebase-frequency = <0>; /* From U-boot */
-+ bus-frequency = <0>; /* From U-boot */
-+ clock-frequency = <0>; /* From U-boot */
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0x00000000 0x10000000>; /* Fixed by bootwrapper */
-+ };
-+
-+ soc@fdf00000 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ device_type = "soc";
-+ ranges = <0x00000000 0xfdf00000 0x00100000>;
-+ bus-frequency = <0>; /* Fixed by bootwrapper */
-+
-+ memory-controller@2000 {
-+ compatible = "fsl,8540-memory-controller";
-+ reg = <0x2000 0x1000>;
-+ interrupt-parent = <&MPIC>;
-+ interrupts = <0x12 0x2>;
-+ };
-+
-+ l2-cache-controller@20000 {
-+ compatible = "fsl,8540-l2-cache-controller";
-+ reg = <0x20000 0x1000>;
-+ cache-line-size = <0x20>; /* 32 bytes */
-+ cache-size = <0x40000>; /* L2, 256K */
-+ interrupt-parent = <&MPIC>;
-+ interrupts = <0x10 0x2>;
-+ };
-+
-+ i2c@3000 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
-+ compatible = "fsl-i2c";
-+ reg = <0x3000 0x100>;
-+ interrupts = <0x2b 0x2>;
-+ interrupt-parent = <&MPIC>;
-+ dfsrr;
-+ };
-+
-+ mdio@24520 { /* For TSECs */
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ compatible = "fsl,gianfar-mdio";
-+ reg = <0x24520 0x20>;
-+
-+ PHY1: ethernet-phy@1 {
-+ interrupt-parent = <&MPIC>;
-+ reg = <0x1>;
-+ device_type = "ethernet-phy";
-+ };
-+
-+ PHY2: ethernet-phy@2 {
-+ interrupt-parent = <&MPIC>;
-+ reg = <0x2>;
-+ device_type = "ethernet-phy";
-+ };
-+ };
-+
-+ enet0: ethernet@24000 {
-+ device_type = "network";
-+ model = "TSEC";
-+ compatible = "gianfar";
-+ reg = <0x24000 0x1000>;
-+ /* Mac address filled in by bootwrapper */
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <0x1d 0x2 0x1e 0x2 0x22 0x2>;
-+ interrupt-parent = <&MPIC>;
-+ phy-handle = <&PHY1>;
-+ };
-+
-+ enet1: ethernet@25000 {
-+ device_type = "network";
-+ model = "TSEC";
-+ compatible = "gianfar";
-+ reg = <0x25000 0x1000>;
-+ /* Mac address filled in by bootwrapper */
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <0x23 0x2 0x24 0x2 0x28 0x2>;
-+ interrupt-parent = <&MPIC>;
-+ phy-handle = <&PHY2>;
-+ };
-+
-+ MPIC: pic@40000 {
-+ #address-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupt-controller;
-+ reg = <0x40000 0x40000>;
-+ device_type = "open-pic";
-+ };
-+
-+ cpm@919c0 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc8560-cpm", "fsl,cpm2";
-+ reg = <0x919c0 0x30>;
-+ ranges;
-+
-+ muram@80000 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <0x0 0x80000 0x10000>;
-+
-+ data@0 {
-+ compatible = "fsl,cpm-muram-data";
-+ reg = <0x0 0x4000 0x9000 0x2000>;
-+ };
-+ };
-+
-+ brg@919f0 {
-+ compatible = "fsl,mpc8560-brg",
-+ "fsl,cpm2-brg",
-+ "fsl,cpm-brg";
-+ reg = <0x919f0 0x10 0x915f0 0x10>;
-+ clock-frequency = <165000000>; /* 166MHz */
-+ };
-+
-+ CPMPIC: pic@90c00 {
-+ #address-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupt-controller;
-+ interrupts = <0x2e 0x2>;
-+ interrupt-parent = <&MPIC>;
-+ reg = <0x90c00 0x80>;
-+ compatible = "fsl,mpc8560-cpm-pic", "fsl,cpm2-pic";
-+ };
-+
-+ serial@91a00 {
-+ device_type = "serial";
-+ compatible = "fsl,mpc8560-scc-uart",
-+ "fsl,cpm2-scc-uart";
-+ reg = <0x91a00 0x20 0x88000 0x100>;
-+ fsl,cpm-brg = <1>;
-+ fsl,cpm-command = <0x800000>;
-+ current-speed = <0x1c200>;
-+ interrupts = <0x28 0x8>;
-+ interrupt-parent = <&CPMPIC>;
-+ };
-+
-+ serial@91a20 {
-+ device_type = "serial";
-+ compatible = "fsl,mpc8560-scc-uart",
-+ "fsl,cpm2-scc-uart";
-+ reg = <0x91a20 0x20 0x88100 0x100>;
-+ fsl,cpm-brg = <2>;
-+ fsl,cpm-command = <0x4a00000>;
-+ current-speed = <0x1c200>;
-+ interrupts = <0x29 0x8>;
-+ interrupt-parent = <&CPMPIC>;
-+ };
-+
-+ mdio@90d00 { /* For FCCs */
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ compatible = "fsl,cpm2-mdio-bitbang";
-+ reg = <0x90d00 0x14>;
-+ fsl,mdio-pin = <24>;
-+ fsl,mdc-pin = <25>;
-+
-+ PHY0: ethernet-phy@0 {
-+ interrupt-parent = <&MPIC>;
-+ reg = <0x0>;
-+ device_type = "ethernet-phy";
-+ };
-+ };
-+
-+ enet2: ethernet@91300 {
-+ device_type = "network";
-+ compatible = "fsl,mpc8560-fcc-enet",
-+ "fsl,cpm2-fcc-enet";
-+ reg = <0x91300 0x20 0x88400 0x100 0x91390 0x1>;
-+ /* Mac address filled in by bootwrapper */
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ fsl,cpm-command = <0x12000300>;
-+ interrupts = <0x20 0x8>;
-+ interrupt-parent = <&CPMPIC>;
-+ phy-handle = <&PHY0>;
-+ };
-+ };
-+ };
-+
-+ localbus@fdf05000 {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc8560-localbus";
-+ reg = <0xfdf05000 0x68>;
-+
-+ ranges = <0x0 0x0 0xe0000000 0x00800000
-+ 0x4 0x0 0xe8080000 0x00080000>;
-+
-+ flash@0,0 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "jedec-flash";
-+ reg = <0x0 0x0 0x800000>;
-+ bank-width = <0x2>;
-+
-+ partition@0 {
-+ label = "Primary Kernel";
-+ reg = <0x0 0x180000>;
-+ };
-+ partition@180000 {
-+ label = "Primary Filesystem";
-+ reg = <0x180000 0x580000>;
-+ };
-+ partition@700000 {
-+ label = "Monitor";
-+ reg = <0x300000 0x100000>;
-+ read-only;
-+ };
-+ };
-+
-+ cpld@4,0 {
-+ compatible = "emerson,KSI8560-cpld";
-+ reg = <0x4 0x0 0x80000>;
-+ };
-+ };
-+
-+
-+ chosen {
-+ linux,stdout-path = "/soc/cpm/serial@91a00";
-+ };
-+};
---- a/arch/powerpc/boot/dts/kuroboxHD.dts
-+++ b/arch/powerpc/boot/dts/kuroboxHD.dts
-@@ -7,6 +7,7 @@
- * Based on sandpoint.dts
- *
- * 2006 (c) G. Liakhovetski <g.liakhovetski@gmx.de>
-+ * Copyright 2008 Freescale Semiconductor, Inc.
- *
- * This file is licensed under
- * the terms of the GNU General Public License version 2. This program
-@@ -17,6 +18,8 @@ XXXX add flash parts, rtc, ??
-
- */
-
-+/dts-v1/;
-+
- / {
- model = "KuroboxHD";
- compatible = "linkstation";
-@@ -35,19 +38,19 @@ XXXX add flash parts, rtc, ??
-
- PowerPC,603e { /* Really 8241 */
- device_type = "cpu";
-- reg = <0>;
-- clock-frequency = <bebc200>; /* Fixed by bootloader */
-- timebase-frequency = <1743000>; /* Fixed by bootloader */
-+ reg = <0x0>;
-+ clock-frequency = <200000000>; /* Fixed by bootloader */
-+ timebase-frequency = <24391680>; /* Fixed by bootloader */
- bus-frequency = <0>; /* Fixed by bootloader */
- /* Following required by dtc but not used */
-- i-cache-size = <4000>;
-- d-cache-size = <4000>;
-+ i-cache-size = <0x4000>;
-+ d-cache-size = <0x4000>;
- };
- };
-
- memory {
- device_type = "memory";
-- reg = <00000000 04000000>;
-+ reg = <0x0 0x4000000>;
- };
-
- soc10x { /* AFAICT need to make soc for 8245's uarts to be defined */
-@@ -56,26 +59,26 @@ XXXX add flash parts, rtc, ??
- device_type = "soc";
- compatible = "mpc10x";
- store-gathering = <0>; /* 0 == off, !0 == on */
-- reg = <80000000 00100000>;
-- ranges = <80000000 80000000 70000000 /* pci mem space */
-- fc000000 fc000000 00100000 /* EUMB */
-- fe000000 fe000000 00c00000 /* pci i/o space */
-- fec00000 fec00000 00300000 /* pci cfg regs */
-- fef00000 fef00000 00100000>; /* pci iack */
-+ reg = <0x80000000 0x100000>;
-+ ranges = <0x80000000 0x80000000 0x70000000 /* pci mem space */
-+ 0xfc000000 0xfc000000 0x100000 /* EUMB */
-+ 0xfe000000 0xfe000000 0xc00000 /* pci i/o space */
-+ 0xfec00000 0xfec00000 0x300000 /* pci cfg regs */
-+ 0xfef00000 0xfef00000 0x100000>; /* pci iack */
-
- i2c@80003000 {
- #address-cells = <1>;
- #size-cells = <0>;
- cell-index = <0>;
- compatible = "fsl-i2c";
-- reg = <80003000 1000>;
-+ reg = <0x80003000 0x1000>;
- interrupts = <5 2>;
- interrupt-parent = <&mpic>;
-
- rtc@32 {
- device_type = "rtc";
- compatible = "ricoh,rs5c372a";
-- reg = <32>;
-+ reg = <0x32>;
- };
- };
-
-@@ -83,9 +86,9 @@ XXXX add flash parts, rtc, ??
- cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <80004500 8>;
-- clock-frequency = <5d08d88>;
-- current-speed = <2580>;
-+ reg = <0x80004500 0x8>;
-+ clock-frequency = <97553800>;
-+ current-speed = <9600>;
- interrupts = <9 0>;
- interrupt-parent = <&mpic>;
- };
-@@ -94,10 +97,10 @@ XXXX add flash parts, rtc, ??
- cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <80004600 8>;
-- clock-frequency = <5d08d88>;
-- current-speed = <e100>;
-- interrupts = <a 0>;
-+ reg = <0x80004600 0x8>;
-+ clock-frequency = <97553800>;
-+ current-speed = <57600>;
-+ interrupts = <10 0>;
- interrupt-parent = <&mpic>;
- };
-
-@@ -107,7 +110,7 @@ XXXX add flash parts, rtc, ??
- device_type = "open-pic";
- compatible = "chrp,open-pic";
- interrupt-controller;
-- reg = <80040000 40000>;
-+ reg = <0x80040000 0x40000>;
- };
-
- pci0: pci@fec00000 {
-@@ -116,29 +119,29 @@ XXXX add flash parts, rtc, ??
- #interrupt-cells = <1>;
- device_type = "pci";
- compatible = "mpc10x-pci";
-- reg = <fec00000 400000>;
-- ranges = <01000000 0 0 fe000000 0 00c00000
-- 02000000 0 80000000 80000000 0 70000000>;
-- bus-range = <0 ff>;
-- clock-frequency = <7f28155>;
-+ reg = <0xfec00000 0x400000>;
-+ ranges = <0x1000000 0x0 0x0 0xfe000000 0x0 0xc00000
-+ 0x2000000 0x0 0x80000000 0x80000000 0x0 0x70000000>;
-+ bus-range = <0 255>;
-+ clock-frequency = <133333333>;
- interrupt-parent = <&mpic>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
- /* IDSEL 11 - IRQ0 ETH */
-- 5800 0 0 1 &mpic 0 1
-- 5800 0 0 2 &mpic 1 1
-- 5800 0 0 3 &mpic 2 1
-- 5800 0 0 4 &mpic 3 1
-+ 0x5800 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x5800 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x5800 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x5800 0x0 0x0 0x4 &mpic 0x3 0x1
- /* IDSEL 12 - IRQ1 IDE0 */
-- 6000 0 0 1 &mpic 1 1
-- 6000 0 0 2 &mpic 2 1
-- 6000 0 0 3 &mpic 3 1
-- 6000 0 0 4 &mpic 0 1
-+ 0x6000 0x0 0x0 0x1 &mpic 0x1 0x1
-+ 0x6000 0x0 0x0 0x2 &mpic 0x2 0x1
-+ 0x6000 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x6000 0x0 0x0 0x4 &mpic 0x0 0x1
- /* IDSEL 14 - IRQ3 USB2.0 */
-- 7000 0 0 1 &mpic 3 1
-- 7000 0 0 2 &mpic 3 1
-- 7000 0 0 3 &mpic 3 1
-- 7000 0 0 4 &mpic 3 1
-+ 0x7000 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x7000 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x7000 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x7000 0x0 0x0 0x4 &mpic 0x3 0x1
- >;
- };
- };
---- a/arch/powerpc/boot/dts/kuroboxHG.dts
-+++ b/arch/powerpc/boot/dts/kuroboxHG.dts
-@@ -7,6 +7,7 @@
- * Based on sandpoint.dts
- *
- * 2006 (c) G. Liakhovetski <g.liakhovetski@gmx.de>
-+ * Copyright 2008 Freescale Semiconductor, Inc.
- *
- * This file is licensed under
- * the terms of the GNU General Public License version 2. This program
-@@ -17,6 +18,8 @@ XXXX add flash parts, rtc, ??
-
- */
-
-+/dts-v1/;
-+
- / {
- model = "KuroboxHG";
- compatible = "linkstation";
-@@ -35,19 +38,19 @@ XXXX add flash parts, rtc, ??
-
- PowerPC,603e { /* Really 8241 */
- device_type = "cpu";
-- reg = <0>;
-- clock-frequency = <fdad680>; /* Fixed by bootloader */
-- timebase-frequency = <1F04000>; /* Fixed by bootloader */
-+ reg = <0x0>;
-+ clock-frequency = <266000000>; /* Fixed by bootloader */
-+ timebase-frequency = <32522240>; /* Fixed by bootloader */
- bus-frequency = <0>; /* Fixed by bootloader */
- /* Following required by dtc but not used */
-- i-cache-size = <4000>;
-- d-cache-size = <4000>;
-+ i-cache-size = <0x4000>;
-+ d-cache-size = <0x4000>;
- };
- };
-
- memory {
- device_type = "memory";
-- reg = <00000000 08000000>;
-+ reg = <0x0 0x8000000>;
- };
-
- soc10x { /* AFAICT need to make soc for 8245's uarts to be defined */
-@@ -56,26 +59,26 @@ XXXX add flash parts, rtc, ??
- device_type = "soc";
- compatible = "mpc10x";
- store-gathering = <0>; /* 0 == off, !0 == on */
-- reg = <80000000 00100000>;
-- ranges = <80000000 80000000 70000000 /* pci mem space */
-- fc000000 fc000000 00100000 /* EUMB */
-- fe000000 fe000000 00c00000 /* pci i/o space */
-- fec00000 fec00000 00300000 /* pci cfg regs */
-- fef00000 fef00000 00100000>; /* pci iack */
-+ reg = <0x80000000 0x100000>;
-+ ranges = <0x80000000 0x80000000 0x70000000 /* pci mem space */
-+ 0xfc000000 0xfc000000 0x100000 /* EUMB */
-+ 0xfe000000 0xfe000000 0xc00000 /* pci i/o space */
-+ 0xfec00000 0xfec00000 0x300000 /* pci cfg regs */
-+ 0xfef00000 0xfef00000 0x100000>; /* pci iack */
-
- i2c@80003000 {
- #address-cells = <1>;
- #size-cells = <0>;
- cell-index = <0>;
- compatible = "fsl-i2c";
-- reg = <80003000 1000>;
-+ reg = <0x80003000 0x1000>;
- interrupts = <5 2>;
- interrupt-parent = <&mpic>;
-
- rtc@32 {
- device_type = "rtc";
- compatible = "ricoh,rs5c372a";
-- reg = <32>;
-+ reg = <0x32>;
- };
- };
-
-@@ -83,9 +86,9 @@ XXXX add flash parts, rtc, ??
- cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <80004500 8>;
-- clock-frequency = <7c044a8>;
-- current-speed = <2580>;
-+ reg = <0x80004500 0x8>;
-+ clock-frequency = <130041000>;
-+ current-speed = <9600>;
- interrupts = <9 0>;
- interrupt-parent = <&mpic>;
- };
-@@ -94,10 +97,10 @@ XXXX add flash parts, rtc, ??
- cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <80004600 8>;
-- clock-frequency = <7c044a8>;
-- current-speed = <e100>;
-- interrupts = <a 0>;
-+ reg = <0x80004600 0x8>;
-+ clock-frequency = <130041000>;
-+ current-speed = <57600>;
-+ interrupts = <10 0>;
- interrupt-parent = <&mpic>;
- };
-
-@@ -107,7 +110,7 @@ XXXX add flash parts, rtc, ??
- device_type = "open-pic";
- compatible = "chrp,open-pic";
- interrupt-controller;
-- reg = <80040000 40000>;
-+ reg = <0x80040000 0x40000>;
- };
-
- pci0: pci@fec00000 {
-@@ -116,29 +119,29 @@ XXXX add flash parts, rtc, ??
- #interrupt-cells = <1>;
- device_type = "pci";
- compatible = "mpc10x-pci";
-- reg = <fec00000 400000>;
-- ranges = <01000000 0 0 fe000000 0 00c00000
-- 02000000 0 80000000 80000000 0 70000000>;
-- bus-range = <0 ff>;
-- clock-frequency = <7f28155>;
-+ reg = <0xfec00000 0x400000>;
-+ ranges = <0x1000000 0x0 0x0 0xfe000000 0x0 0xc00000
-+ 0x2000000 0x0 0x80000000 0x80000000 0x0 0x70000000>;
-+ bus-range = <0 255>;
-+ clock-frequency = <133333333>;
- interrupt-parent = <&mpic>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
- /* IDSEL 11 - IRQ0 ETH */
-- 5800 0 0 1 &mpic 0 1
-- 5800 0 0 2 &mpic 1 1
-- 5800 0 0 3 &mpic 2 1
-- 5800 0 0 4 &mpic 3 1
-+ 0x5800 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x5800 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x5800 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x5800 0x0 0x0 0x4 &mpic 0x3 0x1
- /* IDSEL 12 - IRQ1 IDE0 */
-- 6000 0 0 1 &mpic 1 1
-- 6000 0 0 2 &mpic 2 1
-- 6000 0 0 3 &mpic 3 1
-- 6000 0 0 4 &mpic 0 1
-+ 0x6000 0x0 0x0 0x1 &mpic 0x1 0x1
-+ 0x6000 0x0 0x0 0x2 &mpic 0x2 0x1
-+ 0x6000 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x6000 0x0 0x0 0x4 &mpic 0x0 0x1
- /* IDSEL 14 - IRQ3 USB2.0 */
-- 7000 0 0 1 &mpic 3 1
-- 7000 0 0 2 &mpic 3 1
-- 7000 0 0 3 &mpic 3 1
-- 7000 0 0 4 &mpic 3 1
-+ 0x7000 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x7000 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x7000 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x7000 0x0 0x0 0x4 &mpic 0x3 0x1
- >;
- };
- };
---- a/arch/powerpc/boot/dts/makalu.dts
-+++ b/arch/powerpc/boot/dts/makalu.dts
-@@ -219,7 +219,7 @@
- mal-tx-channel = <0>;
- mal-rx-channel = <0>;
- cell-index = <0>;
-- max-frame-size = <5dc>;
-+ max-frame-size = <2328>;
- rx-fifo-size = <1000>;
- tx-fifo-size = <800>;
- phy-mode = "rgmii";
-@@ -247,7 +247,7 @@
- mal-tx-channel = <1>;
- mal-rx-channel = <1>;
- cell-index = <1>;
-- max-frame-size = <5dc>;
-+ max-frame-size = <2328>;
- rx-fifo-size = <1000>;
- tx-fifo-size = <800>;
- phy-mode = "rgmii";
---- a/arch/powerpc/boot/dts/mpc7448hpc2.dts
-+++ b/arch/powerpc/boot/dts/mpc7448hpc2.dts
-@@ -1,7 +1,7 @@
- /*
- * MPC7448HPC2 (Taiga) board Device Tree Source
- *
-- * Copyright 2006 Freescale Semiconductor Inc.
-+ * Copyright 2006, 2008 Freescale Semiconductor Inc.
- * 2006 Roy Zang <Roy Zang at freescale.com>.
- *
- * This program is free software; you can redistribute it and/or modify it
-@@ -10,6 +10,7 @@
- * option) any later version.
- */
-
-+/dts-v1/;
-
- / {
- model = "mpc7448hpc2";
-@@ -23,11 +24,11 @@
-
- PowerPC,7448@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <20>; // 32 bytes
-- i-cache-line-size = <20>; // 32 bytes
-- d-cache-size = <8000>; // L1, 32K bytes
-- i-cache-size = <8000>; // L1, 32K bytes
-+ reg = <0x0>;
-+ d-cache-line-size = <32>; // 32 bytes
-+ i-cache-line-size = <32>; // 32 bytes
-+ d-cache-size = <0x8000>; // L1, 32K bytes
-+ i-cache-size = <0x8000>; // L1, 32K bytes
- timebase-frequency = <0>; // 33 MHz, from uboot
- clock-frequency = <0>; // From U-Boot
- bus-frequency = <0>; // From U-Boot
-@@ -36,7 +37,7 @@
-
- memory {
- device_type = "memory";
-- reg = <00000000 20000000 // DDR2 512M at 0
-+ reg = <0x0 0x20000000 // DDR2 512M at 0
- >;
- };
-
-@@ -44,14 +45,14 @@
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "tsi-bridge";
-- ranges = <00000000 c0000000 00010000>;
-- reg = <c0000000 00010000>;
-+ ranges = <0x0 0xc0000000 0x10000>;
-+ reg = <0xc0000000 0x10000>;
- bus-frequency = <0>;
-
- i2c@7000 {
- interrupt-parent = <&mpic>;
-- interrupts = <E 0>;
-- reg = <7000 400>;
-+ interrupts = <14 0>;
-+ reg = <0x7000 0x400>;
- device_type = "i2c";
- compatible = "tsi108-i2c";
- };
-@@ -59,20 +60,20 @@
- MDIO: mdio@6000 {
- device_type = "mdio";
- compatible = "tsi108-mdio";
-- reg = <6000 50>;
-+ reg = <0x6000 0x50>;
- #address-cells = <1>;
- #size-cells = <0>;
-
- phy8: ethernet-phy@8 {
- interrupt-parent = <&mpic>;
- interrupts = <2 1>;
-- reg = <8>;
-+ reg = <0x8>;
- };
-
- phy9: ethernet-phy@9 {
- interrupt-parent = <&mpic>;
- interrupts = <2 1>;
-- reg = <9>;
-+ reg = <0x9>;
- };
-
- };
-@@ -82,9 +83,9 @@
- #size-cells = <0>;
- device_type = "network";
- compatible = "tsi108-ethernet";
-- reg = <6000 200>;
-+ reg = <0x6000 0x200>;
- address = [ 00 06 D2 00 00 01 ];
-- interrupts = <10 2>;
-+ interrupts = <16 2>;
- interrupt-parent = <&mpic>;
- mdio-handle = <&MDIO>;
- phy-handle = <&phy8>;
-@@ -96,9 +97,9 @@
- #size-cells = <0>;
- device_type = "network";
- compatible = "tsi108-ethernet";
-- reg = <6400 200>;
-+ reg = <0x6400 0x200>;
- address = [ 00 06 D2 00 00 02 ];
-- interrupts = <11 2>;
-+ interrupts = <17 2>;
- interrupt-parent = <&mpic>;
- mdio-handle = <&MDIO>;
- phy-handle = <&phy9>;
-@@ -107,18 +108,18 @@
- serial@7808 {
- device_type = "serial";
- compatible = "ns16550";
-- reg = <7808 200>;
-- clock-frequency = <3f6b5a00>;
-- interrupts = <c 0>;
-+ reg = <0x7808 0x200>;
-+ clock-frequency = <1064000000>;
-+ interrupts = <12 0>;
- interrupt-parent = <&mpic>;
- };
-
- serial@7c08 {
- device_type = "serial";
- compatible = "ns16550";
-- reg = <7c08 200>;
-- clock-frequency = <3f6b5a00>;
-- interrupts = <d 0>;
-+ reg = <0x7c08 0x200>;
-+ clock-frequency = <1064000000>;
-+ interrupts = <13 0>;
- interrupt-parent = <&mpic>;
- };
-
-@@ -127,7 +128,7 @@
- interrupt-controller;
- #address-cells = <0>;
- #interrupt-cells = <2>;
-- reg = <7400 400>;
-+ reg = <0x7400 0x400>;
- compatible = "chrp,open-pic";
- device_type = "open-pic";
- big-endian;
-@@ -138,39 +139,39 @@
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <1000 1000>;
-+ reg = <0x1000 0x1000>;
- bus-range = <0 0>;
-- ranges = <02000000 0 e0000000 e0000000 0 1A000000
-- 01000000 0 00000000 fa000000 0 00010000>;
-- clock-frequency = <7f28154>;
-+ ranges = <0x2000000 0x0 0xe0000000 0xe0000000 0x0 0x1a000000
-+ 0x1000000 0x0 0x0 0xfa000000 0x0 0x10000>;
-+ clock-frequency = <133333332>;
- interrupt-parent = <&mpic>;
-- interrupts = <17 2>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupts = <23 2>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
-
- /* IDSEL 0x11 */
-- 0800 0 0 1 &RT0 24 0
-- 0800 0 0 2 &RT0 25 0
-- 0800 0 0 3 &RT0 26 0
-- 0800 0 0 4 &RT0 27 0
-+ 0x800 0x0 0x0 0x1 &RT0 0x24 0x0
-+ 0x800 0x0 0x0 0x2 &RT0 0x25 0x0
-+ 0x800 0x0 0x0 0x3 &RT0 0x26 0x0
-+ 0x800 0x0 0x0 0x4 &RT0 0x27 0x0
-
- /* IDSEL 0x12 */
-- 1000 0 0 1 &RT0 25 0
-- 1000 0 0 2 &RT0 26 0
-- 1000 0 0 3 &RT0 27 0
-- 1000 0 0 4 &RT0 24 0
-+ 0x1000 0x0 0x0 0x1 &RT0 0x25 0x0
-+ 0x1000 0x0 0x0 0x2 &RT0 0x26 0x0
-+ 0x1000 0x0 0x0 0x3 &RT0 0x27 0x0
-+ 0x1000 0x0 0x0 0x4 &RT0 0x24 0x0
-
- /* IDSEL 0x13 */
-- 1800 0 0 1 &RT0 26 0
-- 1800 0 0 2 &RT0 27 0
-- 1800 0 0 3 &RT0 24 0
-- 1800 0 0 4 &RT0 25 0
-+ 0x1800 0x0 0x0 0x1 &RT0 0x26 0x0
-+ 0x1800 0x0 0x0 0x2 &RT0 0x27 0x0
-+ 0x1800 0x0 0x0 0x3 &RT0 0x24 0x0
-+ 0x1800 0x0 0x0 0x4 &RT0 0x25 0x0
-
- /* IDSEL 0x14 */
-- 2000 0 0 1 &RT0 27 0
-- 2000 0 0 2 &RT0 24 0
-- 2000 0 0 3 &RT0 25 0
-- 2000 0 0 4 &RT0 26 0
-+ 0x2000 0x0 0x0 0x1 &RT0 0x27 0x0
-+ 0x2000 0x0 0x0 0x2 &RT0 0x24 0x0
-+ 0x2000 0x0 0x0 0x3 &RT0 0x25 0x0
-+ 0x2000 0x0 0x0 0x4 &RT0 0x26 0x0
- >;
-
- RT0: router@1180 {
-@@ -180,7 +181,7 @@
- #address-cells = <0>;
- #interrupt-cells = <2>;
- big-endian;
-- interrupts = <17 2>;
-+ interrupts = <23 2>;
- interrupt-parent = <&mpic>;
- };
- };
---- a/arch/powerpc/boot/dts/mpc8272ads.dts
-+++ b/arch/powerpc/boot/dts/mpc8272ads.dts
-@@ -1,7 +1,7 @@
- /*
- * MPC8272 ADS Device Tree Source
- *
-- * Copyright 2005 Freescale Semiconductor Inc.
-+ * Copyright 2005,2008 Freescale Semiconductor 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
-@@ -9,6 +9,8 @@
- * option) any later version.
- */
-
-+/dts-v1/;
-+
- / {
- model = "MPC8272ADS";
- compatible = "fsl,mpc8272ads";
-@@ -21,11 +23,11 @@
-
- PowerPC,8272@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <d#32>;
-- i-cache-line-size = <d#32>;
-- d-cache-size = <d#16384>;
-- i-cache-size = <d#16384>;
-+ reg = <0x0>;
-+ d-cache-line-size = <32>;
-+ i-cache-line-size = <32>;
-+ d-cache-size = <16384>;
-+ i-cache-size = <16384>;
- timebase-frequency = <0>;
- bus-frequency = <0>;
- clock-frequency = <0>;
-@@ -34,7 +36,7 @@
-
- memory {
- device_type = "memory";
-- reg = <0 0>;
-+ reg = <0x0 0x0>;
- };
-
- localbus@f0010100 {
-@@ -42,21 +44,21 @@
- "fsl,pq2-localbus";
- #address-cells = <2>;
- #size-cells = <1>;
-- reg = <f0010100 40>;
-+ reg = <0xf0010100 0x40>;
-
-- ranges = <0 0 fe000000 02000000
-- 1 0 f4500000 00008000
-- 3 0 f8200000 00008000>;
-+ ranges = <0x0 0x0 0xfe000000 0x2000000
-+ 0x1 0x0 0xf4500000 0x8000
-+ 0x3 0x0 0xf8200000 0x8000>;
-
- flash@0,0 {
- compatible = "jedec-flash";
-- reg = <0 0 2000000>;
-+ reg = <0x0 0x0 0x2000000>;
- bank-width = <4>;
- device-width = <1>;
- };
-
- board-control@1,0 {
-- reg = <1 0 20>;
-+ reg = <0x1 0x0 0x20>;
- compatible = "fsl,mpc8272ads-bcsr";
- };
-
-@@ -65,46 +67,46 @@
- "fsl,pq2ads-pci-pic";
- #interrupt-cells = <1>;
- interrupt-controller;
-- reg = <3 0 8>;
-+ reg = <0x3 0x0 0x8>;
- interrupt-parent = <&PIC>;
-- interrupts = <14 8>;
-+ interrupts = <20 8>;
- };
- };
-
-
- pci@f0010800 {
- device_type = "pci";
-- reg = <f0010800 10c f00101ac 8 f00101c4 8>;
-+ reg = <0xf0010800 0x10c 0xf00101ac 0x8 0xf00101c4 0x8>;
- compatible = "fsl,mpc8272-pci", "fsl,pq2-pci";
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- clock-frequency = <d#66666666>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ clock-frequency = <66666666>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
- /* IDSEL 0x16 */
-- b000 0 0 1 &PCI_PIC 0
-- b000 0 0 2 &PCI_PIC 1
-- b000 0 0 3 &PCI_PIC 2
-- b000 0 0 4 &PCI_PIC 3
-+ 0xb000 0x0 0x0 0x1 &PCI_PIC 0
-+ 0xb000 0x0 0x0 0x2 &PCI_PIC 1
-+ 0xb000 0x0 0x0 0x3 &PCI_PIC 2
-+ 0xb000 0x0 0x0 0x4 &PCI_PIC 3
-
- /* IDSEL 0x17 */
-- b800 0 0 1 &PCI_PIC 4
-- b800 0 0 2 &PCI_PIC 5
-- b800 0 0 3 &PCI_PIC 6
-- b800 0 0 4 &PCI_PIC 7
-+ 0xb800 0x0 0x0 0x1 &PCI_PIC 4
-+ 0xb800 0x0 0x0 0x2 &PCI_PIC 5
-+ 0xb800 0x0 0x0 0x3 &PCI_PIC 6
-+ 0xb800 0x0 0x0 0x4 &PCI_PIC 7
-
- /* IDSEL 0x18 */
-- c000 0 0 1 &PCI_PIC 8
-- c000 0 0 2 &PCI_PIC 9
-- c000 0 0 3 &PCI_PIC a
-- c000 0 0 4 &PCI_PIC b>;
-+ 0xc000 0x0 0x0 0x1 &PCI_PIC 8
-+ 0xc000 0x0 0x0 0x2 &PCI_PIC 9
-+ 0xc000 0x0 0x0 0x3 &PCI_PIC 10
-+ 0xc000 0x0 0x0 0x4 &PCI_PIC 11>;
-
- interrupt-parent = <&PIC>;
-- interrupts = <12 8>;
-- ranges = <42000000 0 80000000 80000000 0 20000000
-- 02000000 0 a0000000 a0000000 0 20000000
-- 01000000 0 00000000 f6000000 0 02000000>;
-+ interrupts = <18 8>;
-+ ranges = <0x42000000 0x0 0x80000000 0x80000000 0x0 0x20000000
-+ 0x2000000 0x0 0xa0000000 0xa0000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xf6000000 0x0 0x2000000>;
- };
-
- soc@f0000000 {
-@@ -112,26 +114,26 @@
- #size-cells = <1>;
- device_type = "soc";
- compatible = "fsl,mpc8272", "fsl,pq2-soc";
-- ranges = <00000000 f0000000 00053000>;
-+ ranges = <0x0 0xf0000000 0x53000>;
-
- // Temporary -- will go away once kernel uses ranges for get_immrbase().
-- reg = <f0000000 00053000>;
-+ reg = <0xf0000000 0x53000>;
-
- cpm@119c0 {
- #address-cells = <1>;
- #size-cells = <1>;
- compatible = "fsl,mpc8272-cpm", "fsl,cpm2";
-- reg = <119c0 30>;
-+ reg = <0x119c0 0x30>;
- ranges;
-
- muram@0 {
- #address-cells = <1>;
- #size-cells = <1>;
-- ranges = <0 0 10000>;
-+ ranges = <0x0 0x0 0x10000>;
-
- data@0 {
- compatible = "fsl,cpm-muram-data";
-- reg = <0 2000 9800 800>;
-+ reg = <0x0 0x2000 0x9800 0x800>;
- };
- };
-
-@@ -139,29 +141,29 @@
- compatible = "fsl,mpc8272-brg",
- "fsl,cpm2-brg",
- "fsl,cpm-brg";
-- reg = <119f0 10 115f0 10>;
-+ reg = <0x119f0 0x10 0x115f0 0x10>;
- };
-
- serial@11a00 {
- device_type = "serial";
- compatible = "fsl,mpc8272-scc-uart",
- "fsl,cpm2-scc-uart";
-- reg = <11a00 20 8000 100>;
-- interrupts = <28 8>;
-+ reg = <0x11a00 0x20 0x8000 0x100>;
-+ interrupts = <40 8>;
- interrupt-parent = <&PIC>;
- fsl,cpm-brg = <1>;
-- fsl,cpm-command = <00800000>;
-+ fsl,cpm-command = <0x800000>;
- };
-
- serial@11a60 {
- device_type = "serial";
- compatible = "fsl,mpc8272-scc-uart",
- "fsl,cpm2-scc-uart";
-- reg = <11a60 20 8300 100>;
-- interrupts = <2b 8>;
-+ reg = <0x11a60 0x20 0x8300 0x100>;
-+ interrupts = <43 8>;
- interrupt-parent = <&PIC>;
- fsl,cpm-brg = <4>;
-- fsl,cpm-command = <0ce00000>;
-+ fsl,cpm-command = <0xce00000>;
- };
-
- mdio@10d40 {
-@@ -169,23 +171,23 @@
- compatible = "fsl,mpc8272ads-mdio-bitbang",
- "fsl,mpc8272-mdio-bitbang",
- "fsl,cpm2-mdio-bitbang";
-- reg = <10d40 14>;
-+ reg = <0x10d40 0x14>;
- #address-cells = <1>;
- #size-cells = <0>;
-- fsl,mdio-pin = <12>;
-- fsl,mdc-pin = <13>;
-+ fsl,mdio-pin = <18>;
-+ fsl,mdc-pin = <19>;
-
- PHY0: ethernet-phy@0 {
- interrupt-parent = <&PIC>;
-- interrupts = <17 8>;
-- reg = <0>;
-+ interrupts = <23 8>;
-+ reg = <0x0>;
- device_type = "ethernet-phy";
- };
-
- PHY1: ethernet-phy@1 {
- interrupt-parent = <&PIC>;
-- interrupts = <17 8>;
-- reg = <3>;
-+ interrupts = <23 8>;
-+ reg = <0x3>;
- device_type = "ethernet-phy";
- };
- };
-@@ -194,33 +196,33 @@
- device_type = "network";
- compatible = "fsl,mpc8272-fcc-enet",
- "fsl,cpm2-fcc-enet";
-- reg = <11300 20 8400 100 11390 1>;
-+ reg = <0x11300 0x20 0x8400 0x100 0x11390 0x1>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <20 8>;
-+ interrupts = <32 8>;
- interrupt-parent = <&PIC>;
- phy-handle = <&PHY0>;
- linux,network-index = <0>;
-- fsl,cpm-command = <12000300>;
-+ fsl,cpm-command = <0x12000300>;
- };
-
- ethernet@11320 {
- device_type = "network";
- compatible = "fsl,mpc8272-fcc-enet",
- "fsl,cpm2-fcc-enet";
-- reg = <11320 20 8500 100 113b0 1>;
-+ reg = <0x11320 0x20 0x8500 0x100 0x113b0 0x1>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <21 8>;
-+ interrupts = <33 8>;
- interrupt-parent = <&PIC>;
- phy-handle = <&PHY1>;
- linux,network-index = <1>;
-- fsl,cpm-command = <16200300>;
-+ fsl,cpm-command = <0x16200300>;
- };
- };
-
- PIC: interrupt-controller@10c00 {
- #interrupt-cells = <2>;
- interrupt-controller;
-- reg = <10c00 80>;
-+ reg = <0x10c00 0x80>;
- compatible = "fsl,mpc8272-pic", "fsl,cpm2-pic";
- };
-
-@@ -232,14 +234,14 @@
- "fsl,talitos-sec2",
- "fsl,talitos",
- "talitos";
-- reg = <30000 10000>;
-- interrupts = <b 8>;
-+ reg = <0x30000 0x10000>;
-+ interrupts = <11 8>;
- interrupt-parent = <&PIC>;
- num-channels = <4>;
-- channel-fifo-len = <18>;
-- exec-units-mask = <0000007e>;
-+ channel-fifo-len = <24>;
-+ exec-units-mask = <0x7e>;
- /* desc mask is for rev1.x, we need runtime fixup for >=2.x */
-- descriptor-types-mask = <01010ebf>;
-+ descriptor-types-mask = <0x1010ebf>;
- };
- };
-
---- a/arch/powerpc/boot/dts/mpc832x_mds.dts
-+++ b/arch/powerpc/boot/dts/mpc832x_mds.dts
-@@ -255,9 +255,7 @@
- enet0: ucc@2200 {
- device_type = "network";
- compatible = "ucc_geth";
-- model = "UCC";
- cell-index = <3>;
-- device-id = <3>;
- reg = <0x2200 0x200>;
- interrupts = <34>;
- interrupt-parent = <&qeic>;
-@@ -271,9 +269,7 @@
- enet1: ucc@3200 {
- device_type = "network";
- compatible = "ucc_geth";
-- model = "UCC";
- cell-index = <4>;
-- device-id = <4>;
- reg = <0x3200 0x200>;
- interrupts = <35>;
- interrupt-parent = <&qeic>;
-@@ -287,8 +283,7 @@
- ucc@2400 {
- device_type = "serial";
- compatible = "ucc_uart";
-- model = "UCC";
-- device-id = <5>; /* The UCC number, 1-7*/
-+ cell-index = <5>; /* The UCC number, 1-7*/
- port-number = <0>; /* Which ttyQEx device */
- soft-uart; /* We need Soft-UART */
- reg = <0x2400 0x200>;
---- a/arch/powerpc/boot/dts/mpc832x_rdb.dts
-+++ b/arch/powerpc/boot/dts/mpc832x_rdb.dts
-@@ -208,9 +208,7 @@
- enet0: ucc@3000 {
- device_type = "network";
- compatible = "ucc_geth";
-- model = "UCC";
- cell-index = <2>;
-- device-id = <2>;
- reg = <0x3000 0x200>;
- interrupts = <33>;
- interrupt-parent = <&qeic>;
-@@ -224,9 +222,7 @@
- enet1: ucc@2200 {
- device_type = "network";
- compatible = "ucc_geth";
-- model = "UCC";
- cell-index = <3>;
-- device-id = <3>;
- reg = <0x2200 0x200>;
- interrupts = <34>;
- interrupt-parent = <&qeic>;
---- a/arch/powerpc/boot/dts/mpc836x_mds.dts
-+++ b/arch/powerpc/boot/dts/mpc836x_mds.dts
-@@ -257,9 +257,7 @@
- enet0: ucc@2000 {
- device_type = "network";
- compatible = "ucc_geth";
-- model = "UCC";
- cell-index = <1>;
-- device-id = <1>;
- reg = <0x2000 0x200>;
- interrupts = <32>;
- interrupt-parent = <&qeic>;
-@@ -274,9 +272,7 @@
- enet1: ucc@3000 {
- device_type = "network";
- compatible = "ucc_geth";
-- model = "UCC";
- cell-index = <2>;
-- device-id = <2>;
- reg = <0x3000 0x200>;
- interrupts = <33>;
- interrupt-parent = <&qeic>;
---- a/arch/powerpc/boot/dts/mpc8540ads.dts
-+++ b/arch/powerpc/boot/dts/mpc8540ads.dts
-@@ -1,7 +1,7 @@
- /*
- * MPC8540 ADS Device Tree Source
- *
-- * Copyright 2006 Freescale Semiconductor Inc.
-+ * Copyright 2006, 2008 Freescale Semiconductor 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
-@@ -9,6 +9,7 @@
- * option) any later version.
- */
-
-+/dts-v1/;
-
- / {
- model = "MPC8540ADS";
-@@ -31,11 +32,11 @@
-
- PowerPC,8540@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <20>; // 32 bytes
-- i-cache-line-size = <20>; // 32 bytes
-- d-cache-size = <8000>; // L1, 32K
-- i-cache-size = <8000>; // L1, 32K
-+ reg = <0x0>;
-+ d-cache-line-size = <32>; // 32 bytes
-+ i-cache-line-size = <32>; // 32 bytes
-+ d-cache-size = <0x8000>; // L1, 32K
-+ i-cache-size = <0x8000>; // L1, 32K
- timebase-frequency = <0>; // 33 MHz, from uboot
- bus-frequency = <0>; // 166 MHz
- clock-frequency = <0>; // 825 MHz, from uboot
-@@ -44,31 +45,31 @@
-
- memory {
- device_type = "memory";
-- reg = <00000000 08000000>; // 128M at 0x0
-+ reg = <0x0 0x8000000>; // 128M at 0x0
- };
-
- soc8540@e0000000 {
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
-- ranges = <0 e0000000 00100000>;
-- reg = <e0000000 00100000>; // CCSRBAR 1M
-+ ranges = <0x0 0xe0000000 0x100000>;
-+ reg = <0xe0000000 0x100000>; // CCSRBAR 1M
- bus-frequency = <0>;
-
- memory-controller@2000 {
- compatible = "fsl,8540-memory-controller";
-- reg = <2000 1000>;
-+ reg = <0x2000 0x1000>;
- interrupt-parent = <&mpic>;
-- interrupts = <12 2>;
-+ interrupts = <18 2>;
- };
-
- l2-cache-controller@20000 {
- compatible = "fsl,8540-l2-cache-controller";
-- reg = <20000 1000>;
-- cache-line-size = <20>; // 32 bytes
-- cache-size = <40000>; // L2, 256K
-+ reg = <0x20000 0x1000>;
-+ cache-line-size = <32>; // 32 bytes
-+ cache-size = <0x40000>; // L2, 256K
- interrupt-parent = <&mpic>;
-- interrupts = <10 2>;
-+ interrupts = <16 2>;
- };
-
- i2c@3000 {
-@@ -76,8 +77,8 @@
- #size-cells = <0>;
- cell-index = <0>;
- compatible = "fsl-i2c";
-- reg = <3000 100>;
-- interrupts = <2b 2>;
-+ reg = <0x3000 0x100>;
-+ interrupts = <43 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
- };
-@@ -86,24 +87,24 @@
- #address-cells = <1>;
- #size-cells = <0>;
- compatible = "fsl,gianfar-mdio";
-- reg = <24520 20>;
-+ reg = <0x24520 0x20>;
-
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-- reg = <0>;
-+ reg = <0x0>;
- device_type = "ethernet-phy";
- };
- phy1: ethernet-phy@1 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-- reg = <1>;
-+ reg = <0x1>;
- device_type = "ethernet-phy";
- };
- phy3: ethernet-phy@3 {
- interrupt-parent = <&mpic>;
- interrupts = <7 1>;
-- reg = <3>;
-+ reg = <0x3>;
- device_type = "ethernet-phy";
- };
- };
-@@ -113,9 +114,9 @@
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-- reg = <24000 1000>;
-+ reg = <0x24000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1d 2 1e 2 22 2>;
-+ interrupts = <29 2 30 2 34 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy0>;
- };
-@@ -125,9 +126,9 @@
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-- reg = <25000 1000>;
-+ reg = <0x25000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <23 2 24 2 28 2>;
-+ interrupts = <35 2 36 2 40 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy1>;
- };
-@@ -137,9 +138,9 @@
- device_type = "network";
- model = "FEC";
- compatible = "gianfar";
-- reg = <26000 1000>;
-+ reg = <0x26000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <29 2>;
-+ interrupts = <41 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy3>;
- };
-@@ -148,9 +149,9 @@
- cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4500 100>; // reg base, size
-+ reg = <0x4500 0x100>; // reg base, size
- clock-frequency = <0>; // should we fill in in uboot?
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
-@@ -158,9 +159,9 @@
- cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4600 100>; // reg base, size
-+ reg = <0x4600 0x100>; // reg base, size
- clock-frequency = <0>; // should we fill in in uboot?
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
- mpic: pic@40000 {
-@@ -168,7 +169,7 @@
- interrupt-controller;
- #address-cells = <0>;
- #interrupt-cells = <2>;
-- reg = <40000 40000>;
-+ reg = <0x40000 0x40000>;
- compatible = "chrp,open-pic";
- device_type = "open-pic";
- big-endian;
-@@ -177,90 +178,90 @@
-
- pci0: pci@e0008000 {
- cell-index = <0>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
-
- /* IDSEL 0x02 */
-- 1000 0 0 1 &mpic 1 1
-- 1000 0 0 2 &mpic 2 1
-- 1000 0 0 3 &mpic 3 1
-- 1000 0 0 4 &mpic 4 1
-+ 0x1000 0x0 0x0 0x1 &mpic 0x1 0x1
-+ 0x1000 0x0 0x0 0x2 &mpic 0x2 0x1
-+ 0x1000 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x1000 0x0 0x0 0x4 &mpic 0x4 0x1
-
- /* IDSEL 0x03 */
-- 1800 0 0 1 &mpic 4 1
-- 1800 0 0 2 &mpic 1 1
-- 1800 0 0 3 &mpic 2 1
-- 1800 0 0 4 &mpic 3 1
-+ 0x1800 0x0 0x0 0x1 &mpic 0x4 0x1
-+ 0x1800 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x1800 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x1800 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x04 */
-- 2000 0 0 1 &mpic 3 1
-- 2000 0 0 2 &mpic 4 1
-- 2000 0 0 3 &mpic 1 1
-- 2000 0 0 4 &mpic 2 1
-+ 0x2000 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x2000 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x2000 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x2000 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 0x05 */
-- 2800 0 0 1 &mpic 2 1
-- 2800 0 0 2 &mpic 3 1
-- 2800 0 0 3 &mpic 4 1
-- 2800 0 0 4 &mpic 1 1
-+ 0x2800 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x2800 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x2800 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x2800 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x0c */
-- 6000 0 0 1 &mpic 1 1
-- 6000 0 0 2 &mpic 2 1
-- 6000 0 0 3 &mpic 3 1
-- 6000 0 0 4 &mpic 4 1
-+ 0x6000 0x0 0x0 0x1 &mpic 0x1 0x1
-+ 0x6000 0x0 0x0 0x2 &mpic 0x2 0x1
-+ 0x6000 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x6000 0x0 0x0 0x4 &mpic 0x4 0x1
-
- /* IDSEL 0x0d */
-- 6800 0 0 1 &mpic 4 1
-- 6800 0 0 2 &mpic 1 1
-- 6800 0 0 3 &mpic 2 1
-- 6800 0 0 4 &mpic 3 1
-+ 0x6800 0x0 0x0 0x1 &mpic 0x4 0x1
-+ 0x6800 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x6800 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x6800 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x0e */
-- 7000 0 0 1 &mpic 3 1
-- 7000 0 0 2 &mpic 4 1
-- 7000 0 0 3 &mpic 1 1
-- 7000 0 0 4 &mpic 2 1
-+ 0x7000 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x7000 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x7000 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x7000 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 0x0f */
-- 7800 0 0 1 &mpic 2 1
-- 7800 0 0 2 &mpic 3 1
-- 7800 0 0 3 &mpic 4 1
-- 7800 0 0 4 &mpic 1 1
-+ 0x7800 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x7800 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x7800 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x7800 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x12 */
-- 9000 0 0 1 &mpic 1 1
-- 9000 0 0 2 &mpic 2 1
-- 9000 0 0 3 &mpic 3 1
-- 9000 0 0 4 &mpic 4 1
-+ 0x9000 0x0 0x0 0x1 &mpic 0x1 0x1
-+ 0x9000 0x0 0x0 0x2 &mpic 0x2 0x1
-+ 0x9000 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x9000 0x0 0x0 0x4 &mpic 0x4 0x1
-
- /* IDSEL 0x13 */
-- 9800 0 0 1 &mpic 4 1
-- 9800 0 0 2 &mpic 1 1
-- 9800 0 0 3 &mpic 2 1
-- 9800 0 0 4 &mpic 3 1
-+ 0x9800 0x0 0x0 0x1 &mpic 0x4 0x1
-+ 0x9800 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x9800 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x9800 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x14 */
-- a000 0 0 1 &mpic 3 1
-- a000 0 0 2 &mpic 4 1
-- a000 0 0 3 &mpic 1 1
-- a000 0 0 4 &mpic 2 1
-+ 0xa000 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0xa000 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0xa000 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0xa000 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 0x15 */
-- a800 0 0 1 &mpic 2 1
-- a800 0 0 2 &mpic 3 1
-- a800 0 0 3 &mpic 4 1
-- a800 0 0 4 &mpic 1 1>;
-+ 0xa800 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0xa800 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0xa800 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0xa800 0x0 0x0 0x4 &mpic 0x1 0x1>;
- interrupt-parent = <&mpic>;
-- interrupts = <18 2>;
-+ interrupts = <24 2>;
- bus-range = <0 0>;
-- ranges = <02000000 0 80000000 80000000 0 20000000
-- 01000000 0 00000000 e2000000 0 00100000>;
-- clock-frequency = <3f940aa>;
-+ ranges = <0x2000000 0x0 0x80000000 0x80000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xe2000000 0x0 0x100000>;
-+ clock-frequency = <66666666>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e0008000 1000>;
-+ reg = <0xe0008000 0x1000>;
- compatible = "fsl,mpc8540-pcix", "fsl,mpc8540-pci";
- device_type = "pci";
- };
---- a/arch/powerpc/boot/dts/mpc8541cds.dts
-+++ b/arch/powerpc/boot/dts/mpc8541cds.dts
-@@ -1,7 +1,7 @@
- /*
- * MPC8541 CDS Device Tree Source
- *
-- * Copyright 2006 Freescale Semiconductor Inc.
-+ * Copyright 2006, 2008 Freescale Semiconductor 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
-@@ -9,6 +9,7 @@
- * option) any later version.
- */
-
-+/dts-v1/;
-
- / {
- model = "MPC8541CDS";
-@@ -31,11 +32,11 @@
-
- PowerPC,8541@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <20>; // 32 bytes
-- i-cache-line-size = <20>; // 32 bytes
-- d-cache-size = <8000>; // L1, 32K
-- i-cache-size = <8000>; // L1, 32K
-+ reg = <0x0>;
-+ d-cache-line-size = <32>; // 32 bytes
-+ i-cache-line-size = <32>; // 32 bytes
-+ d-cache-size = <0x8000>; // L1, 32K
-+ i-cache-size = <0x8000>; // L1, 32K
- timebase-frequency = <0>; // 33 MHz, from uboot
- bus-frequency = <0>; // 166 MHz
- clock-frequency = <0>; // 825 MHz, from uboot
-@@ -44,31 +45,31 @@
-
- memory {
- device_type = "memory";
-- reg = <00000000 08000000>; // 128M at 0x0
-+ reg = <0x0 0x8000000>; // 128M at 0x0
- };
-
- soc8541@e0000000 {
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
-- ranges = <0 e0000000 00100000>;
-- reg = <e0000000 00001000>; // CCSRBAR 1M
-+ ranges = <0x0 0xe0000000 0x100000>;
-+ reg = <0xe0000000 0x1000>; // CCSRBAR 1M
- bus-frequency = <0>;
-
- memory-controller@2000 {
- compatible = "fsl,8541-memory-controller";
-- reg = <2000 1000>;
-+ reg = <0x2000 0x1000>;
- interrupt-parent = <&mpic>;
-- interrupts = <12 2>;
-+ interrupts = <18 2>;
- };
-
- l2-cache-controller@20000 {
- compatible = "fsl,8541-l2-cache-controller";
-- reg = <20000 1000>;
-- cache-line-size = <20>; // 32 bytes
-- cache-size = <40000>; // L2, 256K
-+ reg = <0x20000 0x1000>;
-+ cache-line-size = <32>; // 32 bytes
-+ cache-size = <0x40000>; // L2, 256K
- interrupt-parent = <&mpic>;
-- interrupts = <10 2>;
-+ interrupts = <16 2>;
- };
-
- i2c@3000 {
-@@ -76,8 +77,8 @@
- #size-cells = <0>;
- cell-index = <0>;
- compatible = "fsl-i2c";
-- reg = <3000 100>;
-- interrupts = <2b 2>;
-+ reg = <0x3000 0x100>;
-+ interrupts = <43 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
- };
-@@ -86,18 +87,18 @@
- #address-cells = <1>;
- #size-cells = <0>;
- compatible = "fsl,gianfar-mdio";
-- reg = <24520 20>;
-+ reg = <0x24520 0x20>;
-
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-- reg = <0>;
-+ reg = <0x0>;
- device_type = "ethernet-phy";
- };
- phy1: ethernet-phy@1 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-- reg = <1>;
-+ reg = <0x1>;
- device_type = "ethernet-phy";
- };
- };
-@@ -107,9 +108,9 @@
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-- reg = <24000 1000>;
-+ reg = <0x24000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1d 2 1e 2 22 2>;
-+ interrupts = <29 2 30 2 34 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy0>;
- };
-@@ -119,9 +120,9 @@
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-- reg = <25000 1000>;
-+ reg = <0x25000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <23 2 24 2 28 2>;
-+ interrupts = <35 2 36 2 40 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy1>;
- };
-@@ -130,9 +131,9 @@
- cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4500 100>; // reg base, size
-+ reg = <0x4500 0x100>; // reg base, size
- clock-frequency = <0>; // should we fill in in uboot?
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
-@@ -140,9 +141,9 @@
- cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4600 100>; // reg base, size
-+ reg = <0x4600 0x100>; // reg base, size
- clock-frequency = <0>; // should we fill in in uboot?
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
-@@ -151,7 +152,7 @@
- interrupt-controller;
- #address-cells = <0>;
- #interrupt-cells = <2>;
-- reg = <40000 40000>;
-+ reg = <0x40000 0x40000>;
- compatible = "chrp,open-pic";
- device_type = "open-pic";
- big-endian;
-@@ -161,17 +162,17 @@
- #address-cells = <1>;
- #size-cells = <1>;
- compatible = "fsl,mpc8541-cpm", "fsl,cpm2";
-- reg = <919c0 30>;
-+ reg = <0x919c0 0x30>;
- ranges;
-
- muram@80000 {
- #address-cells = <1>;
- #size-cells = <1>;
-- ranges = <0 80000 10000>;
-+ ranges = <0x0 0x80000 0x10000>;
-
- data@0 {
- compatible = "fsl,cpm-muram-data";
-- reg = <0 2000 9000 1000>;
-+ reg = <0x0 0x2000 0x9000 0x1000>;
- };
- };
-
-@@ -179,16 +180,16 @@
- compatible = "fsl,mpc8541-brg",
- "fsl,cpm2-brg",
- "fsl,cpm-brg";
-- reg = <919f0 10 915f0 10>;
-+ reg = <0x919f0 0x10 0x915f0 0x10>;
- };
-
- cpmpic: pic@90c00 {
- interrupt-controller;
- #address-cells = <0>;
- #interrupt-cells = <2>;
-- interrupts = <2e 2>;
-+ interrupts = <46 2>;
- interrupt-parent = <&mpic>;
-- reg = <90c00 80>;
-+ reg = <0x90c00 0x80>;
- compatible = "fsl,mpc8541-cpm-pic", "fsl,cpm2-pic";
- };
- };
-@@ -196,68 +197,68 @@
-
- pci0: pci@e0008000 {
- cell-index = <0>;
-- interrupt-map-mask = <1f800 0 0 7>;
-+ interrupt-map-mask = <0x1f800 0x0 0x0 0x7>;
- interrupt-map = <
-
- /* IDSEL 0x10 */
-- 08000 0 0 1 &mpic 0 1
-- 08000 0 0 2 &mpic 1 1
-- 08000 0 0 3 &mpic 2 1
-- 08000 0 0 4 &mpic 3 1
-+ 0x8000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x8000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x8000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x8000 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x11 */
-- 08800 0 0 1 &mpic 0 1
-- 08800 0 0 2 &mpic 1 1
-- 08800 0 0 3 &mpic 2 1
-- 08800 0 0 4 &mpic 3 1
-+ 0x8800 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x8800 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x8800 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x8800 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x12 (Slot 1) */
-- 09000 0 0 1 &mpic 0 1
-- 09000 0 0 2 &mpic 1 1
-- 09000 0 0 3 &mpic 2 1
-- 09000 0 0 4 &mpic 3 1
-+ 0x9000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x9000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x9000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x9000 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x13 (Slot 2) */
-- 09800 0 0 1 &mpic 1 1
-- 09800 0 0 2 &mpic 2 1
-- 09800 0 0 3 &mpic 3 1
-- 09800 0 0 4 &mpic 0 1
-+ 0x9800 0x0 0x0 0x1 &mpic 0x1 0x1
-+ 0x9800 0x0 0x0 0x2 &mpic 0x2 0x1
-+ 0x9800 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x9800 0x0 0x0 0x4 &mpic 0x0 0x1
-
- /* IDSEL 0x14 (Slot 3) */
-- 0a000 0 0 1 &mpic 2 1
-- 0a000 0 0 2 &mpic 3 1
-- 0a000 0 0 3 &mpic 0 1
-- 0a000 0 0 4 &mpic 1 1
-+ 0xa000 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0xa000 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0xa000 0x0 0x0 0x3 &mpic 0x0 0x1
-+ 0xa000 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x15 (Slot 4) */
-- 0a800 0 0 1 &mpic 3 1
-- 0a800 0 0 2 &mpic 0 1
-- 0a800 0 0 3 &mpic 1 1
-- 0a800 0 0 4 &mpic 2 1
-+ 0xa800 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0xa800 0x0 0x0 0x2 &mpic 0x0 0x1
-+ 0xa800 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0xa800 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* Bus 1 (Tundra Bridge) */
- /* IDSEL 0x12 (ISA bridge) */
-- 19000 0 0 1 &mpic 0 1
-- 19000 0 0 2 &mpic 1 1
-- 19000 0 0 3 &mpic 2 1
-- 19000 0 0 4 &mpic 3 1>;
-+ 0x19000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x19000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x19000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x19000 0x0 0x0 0x4 &mpic 0x3 0x1>;
- interrupt-parent = <&mpic>;
-- interrupts = <18 2>;
-+ interrupts = <24 2>;
- bus-range = <0 0>;
-- ranges = <02000000 0 80000000 80000000 0 20000000
-- 01000000 0 00000000 e2000000 0 00100000>;
-- clock-frequency = <3f940aa>;
-+ ranges = <0x2000000 0x0 0x80000000 0x80000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xe2000000 0x0 0x100000>;
-+ clock-frequency = <66666666>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e0008000 1000>;
-+ reg = <0xe0008000 0x1000>;
- compatible = "fsl,mpc8540-pci";
- device_type = "pci";
-
- i8259@19000 {
- interrupt-controller;
- device_type = "interrupt-controller";
-- reg = <19000 0 0 0 1>;
-+ reg = <0x19000 0x0 0x0 0x0 0x1>;
- #address-cells = <0>;
- #interrupt-cells = <2>;
- compatible = "chrp,iic";
-@@ -268,24 +269,24 @@
-
- pci1: pci@e0009000 {
- cell-index = <1>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
-
- /* IDSEL 0x15 */
-- a800 0 0 1 &mpic b 1
-- a800 0 0 2 &mpic b 1
-- a800 0 0 3 &mpic b 1
-- a800 0 0 4 &mpic b 1>;
-+ 0xa800 0x0 0x0 0x1 &mpic 0xb 0x1
-+ 0xa800 0x0 0x0 0x2 &mpic 0xb 0x1
-+ 0xa800 0x0 0x0 0x3 &mpic 0xb 0x1
-+ 0xa800 0x0 0x0 0x4 &mpic 0xb 0x1>;
- interrupt-parent = <&mpic>;
-- interrupts = <19 2>;
-+ interrupts = <25 2>;
- bus-range = <0 0>;
-- ranges = <02000000 0 a0000000 a0000000 0 20000000
-- 01000000 0 00000000 e3000000 0 00100000>;
-- clock-frequency = <3f940aa>;
-+ ranges = <0x2000000 0x0 0xa0000000 0xa0000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xe3000000 0x0 0x100000>;
-+ clock-frequency = <66666666>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e0009000 1000>;
-+ reg = <0xe0009000 0x1000>;
- compatible = "fsl,mpc8540-pci";
- device_type = "pci";
- };
---- a/arch/powerpc/boot/dts/mpc8544ds.dts
-+++ b/arch/powerpc/boot/dts/mpc8544ds.dts
-@@ -1,7 +1,7 @@
- /*
- * MPC8544 DS Device Tree Source
- *
-- * Copyright 2007 Freescale Semiconductor Inc.
-+ * Copyright 2007, 2008 Freescale Semiconductor 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
-@@ -9,6 +9,7 @@
- * option) any later version.
- */
-
-+/dts-v1/;
- / {
- model = "MPC8544DS";
- compatible = "MPC8544DS", "MPC85xxDS";
-@@ -27,17 +28,16 @@
- };
-
- cpus {
-- #cpus = <1>;
- #address-cells = <1>;
- #size-cells = <0>;
-
- PowerPC,8544@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <20>; // 32 bytes
-- i-cache-line-size = <20>; // 32 bytes
-- d-cache-size = <8000>; // L1, 32K
-- i-cache-size = <8000>; // L1, 32K
-+ reg = <0x0>;
-+ d-cache-line-size = <32>; // 32 bytes
-+ i-cache-line-size = <32>; // 32 bytes
-+ d-cache-size = <0x8000>; // L1, 32K
-+ i-cache-size = <0x8000>; // L1, 32K
- timebase-frequency = <0>;
- bus-frequency = <0>;
- clock-frequency = <0>;
-@@ -46,7 +46,7 @@
-
- memory {
- device_type = "memory";
-- reg = <00000000 00000000>; // Filled by U-Boot
-+ reg = <0x0 0x0>; // Filled by U-Boot
- };
-
- soc8544@e0000000 {
-@@ -54,24 +54,24 @@
- #size-cells = <1>;
- device_type = "soc";
-
-- ranges = <00000000 e0000000 00100000>;
-- reg = <e0000000 00001000>; // CCSRBAR 1M
-+ ranges = <0x0 0xe0000000 0x100000>;
-+ reg = <0xe0000000 0x1000>; // CCSRBAR 1M
- bus-frequency = <0>; // Filled out by uboot.
-
- memory-controller@2000 {
- compatible = "fsl,8544-memory-controller";
-- reg = <2000 1000>;
-+ reg = <0x2000 0x1000>;
- interrupt-parent = <&mpic>;
-- interrupts = <12 2>;
-+ interrupts = <18 2>;
- };
-
- l2-cache-controller@20000 {
- compatible = "fsl,8544-l2-cache-controller";
-- reg = <20000 1000>;
-- cache-line-size = <20>; // 32 bytes
-- cache-size = <40000>; // L2, 256K
-+ reg = <0x20000 0x1000>;
-+ cache-line-size = <32>; // 32 bytes
-+ cache-size = <0x40000>; // L2, 256K
- interrupt-parent = <&mpic>;
-- interrupts = <10 2>;
-+ interrupts = <16 2>;
- };
-
- i2c@3000 {
-@@ -79,8 +79,8 @@
- #size-cells = <0>;
- cell-index = <0>;
- compatible = "fsl-i2c";
-- reg = <3000 100>;
-- interrupts = <2b 2>;
-+ reg = <0x3000 0x100>;
-+ interrupts = <43 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
- };
-@@ -90,8 +90,8 @@
- #size-cells = <0>;
- cell-index = <1>;
- compatible = "fsl-i2c";
-- reg = <3100 100>;
-- interrupts = <2b 2>;
-+ reg = <0x3100 0x100>;
-+ interrupts = <43 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
- };
-@@ -100,30 +100,71 @@
- #address-cells = <1>;
- #size-cells = <0>;
- compatible = "fsl,gianfar-mdio";
-- reg = <24520 20>;
-+ reg = <0x24520 0x20>;
-
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
-- interrupts = <a 1>;
-- reg = <0>;
-+ interrupts = <10 1>;
-+ reg = <0x0>;
- device_type = "ethernet-phy";
- };
- phy1: ethernet-phy@1 {
- interrupt-parent = <&mpic>;
-- interrupts = <a 1>;
-- reg = <1>;
-+ interrupts = <10 1>;
-+ reg = <0x1>;
- device_type = "ethernet-phy";
- };
- };
-
-+ dma@21300 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc8544-dma", "fsl,eloplus-dma";
-+ reg = <0x21300 0x4>;
-+ ranges = <0x0 0x21100 0x200>;
-+ cell-index = <0>;
-+ dma-channel@0 {
-+ compatible = "fsl,mpc8544-dma-channel",
-+ "fsl,eloplus-dma-channel";
-+ reg = <0x0 0x80>;
-+ cell-index = <0>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <20 2>;
-+ };
-+ dma-channel@80 {
-+ compatible = "fsl,mpc8544-dma-channel",
-+ "fsl,eloplus-dma-channel";
-+ reg = <0x80 0x80>;
-+ cell-index = <1>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <21 2>;
-+ };
-+ dma-channel@100 {
-+ compatible = "fsl,mpc8544-dma-channel",
-+ "fsl,eloplus-dma-channel";
-+ reg = <0x100 0x80>;
-+ cell-index = <2>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <22 2>;
-+ };
-+ dma-channel@180 {
-+ compatible = "fsl,mpc8544-dma-channel",
-+ "fsl,eloplus-dma-channel";
-+ reg = <0x180 0x80>;
-+ cell-index = <3>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <23 2>;
-+ };
-+ };
-+
- enet0: ethernet@24000 {
- cell-index = <0>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-- reg = <24000 1000>;
-+ reg = <0x24000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1d 2 1e 2 22 2>;
-+ interrupts = <29 2 30 2 34 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy0>;
- phy-connection-type = "rgmii-id";
-@@ -134,9 +175,9 @@
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-- reg = <26000 1000>;
-+ reg = <0x26000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1f 2 20 2 21 2>;
-+ interrupts = <31 2 32 2 33 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy1>;
- phy-connection-type = "rgmii-id";
-@@ -146,9 +187,9 @@
- cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4500 100>;
-+ reg = <0x4500 0x100>;
- clock-frequency = <0>;
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
-@@ -156,15 +197,15 @@
- cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4600 100>;
-+ reg = <0x4600 0x100>;
- clock-frequency = <0>;
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
- global-utilities@e0000 { //global utilities block
- compatible = "fsl,mpc8548-guts";
-- reg = <e0000 1000>;
-+ reg = <0xe0000 0x1000>;
- fsl,has-rstcr;
- };
-
-@@ -173,7 +214,7 @@
- interrupt-controller;
- #address-cells = <0>;
- #interrupt-cells = <2>;
-- reg = <40000 40000>;
-+ reg = <0x40000 0x40000>;
- compatible = "chrp,open-pic";
- device_type = "open-pic";
- big-endian;
-@@ -184,32 +225,32 @@
- cell-index = <0>;
- compatible = "fsl,mpc8540-pci";
- device_type = "pci";
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
-
- /* IDSEL 0x11 J17 Slot 1 */
-- 8800 0 0 1 &mpic 2 1
-- 8800 0 0 2 &mpic 3 1
-- 8800 0 0 3 &mpic 4 1
-- 8800 0 0 4 &mpic 1 1
-+ 0x8800 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x8800 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x8800 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x8800 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x12 J16 Slot 2 */
-
-- 9000 0 0 1 &mpic 3 1
-- 9000 0 0 2 &mpic 4 1
-- 9000 0 0 3 &mpic 2 1
-- 9000 0 0 4 &mpic 1 1>;
-+ 0x9000 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x9000 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x9000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x9000 0x0 0x0 0x4 &mpic 0x1 0x1>;
-
- interrupt-parent = <&mpic>;
-- interrupts = <18 2>;
-- bus-range = <0 ff>;
-- ranges = <02000000 0 c0000000 c0000000 0 20000000
-- 01000000 0 00000000 e1000000 0 00010000>;
-- clock-frequency = <3f940aa>;
-+ interrupts = <24 2>;
-+ bus-range = <0 255>;
-+ ranges = <0x2000000 0x0 0xc0000000 0xc0000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xe1000000 0x0 0x10000>;
-+ clock-frequency = <66666666>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e0008000 1000>;
-+ reg = <0xe0008000 0x1000>;
- };
-
- pci1: pcie@e0009000 {
-@@ -219,33 +260,33 @@
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e0009000 1000>;
-- bus-range = <0 ff>;
-- ranges = <02000000 0 80000000 80000000 0 20000000
-- 01000000 0 00000000 e1010000 0 00010000>;
-- clock-frequency = <1fca055>;
-+ reg = <0xe0009000 0x1000>;
-+ bus-range = <0 255>;
-+ ranges = <0x2000000 0x0 0x80000000 0x80000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xe1010000 0x0 0x10000>;
-+ clock-frequency = <33333333>;
- interrupt-parent = <&mpic>;
-- interrupts = <1a 2>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupts = <26 2>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
- /* IDSEL 0x0 */
-- 0000 0 0 1 &mpic 4 1
-- 0000 0 0 2 &mpic 5 1
-- 0000 0 0 3 &mpic 6 1
-- 0000 0 0 4 &mpic 7 1
-+ 0000 0x0 0x0 0x1 &mpic 0x4 0x1
-+ 0000 0x0 0x0 0x2 &mpic 0x5 0x1
-+ 0000 0x0 0x0 0x3 &mpic 0x6 0x1
-+ 0000 0x0 0x0 0x4 &mpic 0x7 0x1
- >;
- pcie@0 {
-- reg = <0 0 0 0 0>;
-+ reg = <0x0 0x0 0x0 0x0 0x0>;
- #size-cells = <2>;
- #address-cells = <3>;
- device_type = "pci";
-- ranges = <02000000 0 80000000
-- 02000000 0 80000000
-- 0 20000000
--
-- 01000000 0 00000000
-- 01000000 0 00000000
-- 0 00010000>;
-+ ranges = <0x2000000 0x0 0x80000000
-+ 0x2000000 0x0 0x80000000
-+ 0x0 0x20000000
-+
-+ 0x1000000 0x0 0x0
-+ 0x1000000 0x0 0x0
-+ 0x0 0x10000>;
- };
- };
-
-@@ -256,33 +297,33 @@
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e000a000 1000>;
-- bus-range = <0 ff>;
-- ranges = <02000000 0 a0000000 a0000000 0 10000000
-- 01000000 0 00000000 e1020000 0 00010000>;
-- clock-frequency = <1fca055>;
-+ reg = <0xe000a000 0x1000>;
-+ bus-range = <0 255>;
-+ ranges = <0x2000000 0x0 0xa0000000 0xa0000000 0x0 0x10000000
-+ 0x1000000 0x0 0x0 0xe1020000 0x0 0x10000>;
-+ clock-frequency = <33333333>;
- interrupt-parent = <&mpic>;
-- interrupts = <19 2>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupts = <25 2>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
- /* IDSEL 0x0 */
-- 0000 0 0 1 &mpic 0 1
-- 0000 0 0 2 &mpic 1 1
-- 0000 0 0 3 &mpic 2 1
-- 0000 0 0 4 &mpic 3 1
-+ 0000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0000 0x0 0x0 0x4 &mpic 0x3 0x1
- >;
- pcie@0 {
-- reg = <0 0 0 0 0>;
-+ reg = <0x0 0x0 0x0 0x0 0x0>;
- #size-cells = <2>;
- #address-cells = <3>;
- device_type = "pci";
-- ranges = <02000000 0 a0000000
-- 02000000 0 a0000000
-- 0 10000000
--
-- 01000000 0 00000000
-- 01000000 0 00000000
-- 0 00010000>;
-+ ranges = <0x2000000 0x0 0xa0000000
-+ 0x2000000 0x0 0xa0000000
-+ 0x0 0x10000000
-+
-+ 0x1000000 0x0 0x0
-+ 0x1000000 0x0 0x0
-+ 0x0 0x10000>;
- };
- };
-
-@@ -293,72 +334,72 @@
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e000b000 1000>;
-- bus-range = <0 ff>;
-- ranges = <02000000 0 b0000000 b0000000 0 00100000
-- 01000000 0 00000000 b0100000 0 00100000>;
-- clock-frequency = <1fca055>;
-+ reg = <0xe000b000 0x1000>;
-+ bus-range = <0 255>;
-+ ranges = <0x2000000 0x0 0xb0000000 0xb0000000 0x0 0x100000
-+ 0x1000000 0x0 0x0 0xb0100000 0x0 0x100000>;
-+ clock-frequency = <33333333>;
- interrupt-parent = <&mpic>;
-- interrupts = <1b 2>;
-- interrupt-map-mask = <ff00 0 0 1>;
-+ interrupts = <27 2>;
-+ interrupt-map-mask = <0xff00 0x0 0x0 0x1>;
- interrupt-map = <
- // IDSEL 0x1c USB
-- e000 0 0 1 &i8259 c 2
-- e100 0 0 2 &i8259 9 2
-- e200 0 0 3 &i8259 a 2
-- e300 0 0 4 &i8259 b 2
-+ 0xe000 0x0 0x0 0x1 &i8259 0xc 0x2
-+ 0xe100 0x0 0x0 0x2 &i8259 0x9 0x2
-+ 0xe200 0x0 0x0 0x3 &i8259 0xa 0x2
-+ 0xe300 0x0 0x0 0x4 &i8259 0xb 0x2
-
- // IDSEL 0x1d Audio
-- e800 0 0 1 &i8259 6 2
-+ 0xe800 0x0 0x0 0x1 &i8259 0x6 0x2
-
- // IDSEL 0x1e Legacy
-- f000 0 0 1 &i8259 7 2
-- f100 0 0 1 &i8259 7 2
-+ 0xf000 0x0 0x0 0x1 &i8259 0x7 0x2
-+ 0xf100 0x0 0x0 0x1 &i8259 0x7 0x2
-
- // IDSEL 0x1f IDE/SATA
-- f800 0 0 1 &i8259 e 2
-- f900 0 0 1 &i8259 5 2
-+ 0xf800 0x0 0x0 0x1 &i8259 0xe 0x2
-+ 0xf900 0x0 0x0 0x1 &i8259 0x5 0x2
- >;
-
- pcie@0 {
-- reg = <0 0 0 0 0>;
-+ reg = <0x0 0x0 0x0 0x0 0x0>;
- #size-cells = <2>;
- #address-cells = <3>;
- device_type = "pci";
-- ranges = <02000000 0 b0000000
-- 02000000 0 b0000000
-- 0 00100000
--
-- 01000000 0 00000000
-- 01000000 0 00000000
-- 0 00100000>;
-+ ranges = <0x2000000 0x0 0xb0000000
-+ 0x2000000 0x0 0xb0000000
-+ 0x0 0x100000
-+
-+ 0x1000000 0x0 0x0
-+ 0x1000000 0x0 0x0
-+ 0x0 0x100000>;
-
- uli1575@0 {
-- reg = <0 0 0 0 0>;
-+ reg = <0x0 0x0 0x0 0x0 0x0>;
- #size-cells = <2>;
- #address-cells = <3>;
-- ranges = <02000000 0 b0000000
-- 02000000 0 b0000000
-- 0 00100000
--
-- 01000000 0 00000000
-- 01000000 0 00000000
-- 0 00100000>;
-+ ranges = <0x2000000 0x0 0xb0000000
-+ 0x2000000 0x0 0xb0000000
-+ 0x0 0x100000
-+
-+ 0x1000000 0x0 0x0
-+ 0x1000000 0x0 0x0
-+ 0x0 0x100000>;
- isa@1e {
- device_type = "isa";
- #interrupt-cells = <2>;
- #size-cells = <1>;
- #address-cells = <2>;
-- reg = <f000 0 0 0 0>;
-- ranges = <1 0
-- 01000000 0 0
-- 00001000>;
-+ reg = <0xf000 0x0 0x0 0x0 0x0>;
-+ ranges = <0x1 0x0
-+ 0x1000000 0x0 0x0
-+ 0x1000>;
- interrupt-parent = <&i8259>;
-
- i8259: interrupt-controller@20 {
-- reg = <1 20 2
-- 1 a0 2
-- 1 4d0 2>;
-+ reg = <0x1 0x20 0x2
-+ 0x1 0xa0 0x2
-+ 0x1 0x4d0 0x2>;
- interrupt-controller;
- device_type = "interrupt-controller";
- #address-cells = <0>;
-@@ -371,28 +412,28 @@
- i8042@60 {
- #size-cells = <0>;
- #address-cells = <1>;
-- reg = <1 60 1 1 64 1>;
-- interrupts = <1 3 c 3>;
-+ reg = <0x1 0x60 0x1 0x1 0x64 0x1>;
-+ interrupts = <1 3 12 3>;
- interrupt-parent = <&i8259>;
-
- keyboard@0 {
-- reg = <0>;
-+ reg = <0x0>;
- compatible = "pnpPNP,303";
- };
-
- mouse@1 {
-- reg = <1>;
-+ reg = <0x1>;
- compatible = "pnpPNP,f03";
- };
- };
-
- rtc@70 {
- compatible = "pnpPNP,b00";
-- reg = <1 70 2>;
-+ reg = <0x1 0x70 0x2>;
- };
-
- gpio@400 {
-- reg = <1 400 80>;
-+ reg = <0x1 0x400 0x80>;
- };
- };
- };
---- a/arch/powerpc/boot/dts/mpc8548cds.dts
-+++ b/arch/powerpc/boot/dts/mpc8548cds.dts
-@@ -1,7 +1,7 @@
- /*
- * MPC8548 CDS Device Tree Source
- *
-- * Copyright 2006 Freescale Semiconductor Inc.
-+ * Copyright 2006, 2008 Freescale Semiconductor 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
-@@ -9,6 +9,7 @@
- * option) any later version.
- */
-
-+/dts-v1/;
-
- / {
- model = "MPC8548CDS";
-@@ -36,11 +37,11 @@
-
- PowerPC,8548@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <20>; // 32 bytes
-- i-cache-line-size = <20>; // 32 bytes
-- d-cache-size = <8000>; // L1, 32K
-- i-cache-size = <8000>; // L1, 32K
-+ reg = <0x0>;
-+ d-cache-line-size = <32>; // 32 bytes
-+ i-cache-line-size = <32>; // 32 bytes
-+ d-cache-size = <0x8000>; // L1, 32K
-+ i-cache-size = <0x8000>; // L1, 32K
- timebase-frequency = <0>; // 33 MHz, from uboot
- bus-frequency = <0>; // 166 MHz
- clock-frequency = <0>; // 825 MHz, from uboot
-@@ -49,31 +50,31 @@
-
- memory {
- device_type = "memory";
-- reg = <00000000 08000000>; // 128M at 0x0
-+ reg = <0x0 0x8000000>; // 128M at 0x0
- };
-
- soc8548@e0000000 {
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
-- ranges = <00000000 e0000000 00100000>;
-- reg = <e0000000 00001000>; // CCSRBAR
-+ ranges = <0x0 0xe0000000 0x100000>;
-+ reg = <0xe0000000 0x1000>; // CCSRBAR
- bus-frequency = <0>;
-
- memory-controller@2000 {
- compatible = "fsl,8548-memory-controller";
-- reg = <2000 1000>;
-+ reg = <0x2000 0x1000>;
- interrupt-parent = <&mpic>;
-- interrupts = <12 2>;
-+ interrupts = <18 2>;
- };
-
- l2-cache-controller@20000 {
- compatible = "fsl,8548-l2-cache-controller";
-- reg = <20000 1000>;
-- cache-line-size = <20>; // 32 bytes
-- cache-size = <80000>; // L2, 512K
-+ reg = <0x20000 0x1000>;
-+ cache-line-size = <32>; // 32 bytes
-+ cache-size = <0x80000>; // L2, 512K
- interrupt-parent = <&mpic>;
-- interrupts = <10 2>;
-+ interrupts = <16 2>;
- };
-
- i2c@3000 {
-@@ -81,8 +82,8 @@
- #size-cells = <0>;
- cell-index = <0>;
- compatible = "fsl-i2c";
-- reg = <3000 100>;
-- interrupts = <2b 2>;
-+ reg = <0x3000 0x100>;
-+ interrupts = <43 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
- };
-@@ -92,8 +93,8 @@
- #size-cells = <0>;
- cell-index = <1>;
- compatible = "fsl-i2c";
-- reg = <3100 100>;
-- interrupts = <2b 2>;
-+ reg = <0x3100 0x100>;
-+ interrupts = <43 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
- };
-@@ -102,30 +103,30 @@
- #address-cells = <1>;
- #size-cells = <0>;
- compatible = "fsl,gianfar-mdio";
-- reg = <24520 20>;
-+ reg = <0x24520 0x20>;
-
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-- reg = <0>;
-+ reg = <0x0>;
- device_type = "ethernet-phy";
- };
- phy1: ethernet-phy@1 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-- reg = <1>;
-+ reg = <0x1>;
- device_type = "ethernet-phy";
- };
- phy2: ethernet-phy@2 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-- reg = <2>;
-+ reg = <0x2>;
- device_type = "ethernet-phy";
- };
- phy3: ethernet-phy@3 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-- reg = <3>;
-+ reg = <0x3>;
- device_type = "ethernet-phy";
- };
- };
-@@ -135,9 +136,9 @@
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-- reg = <24000 1000>;
-+ reg = <0x24000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1d 2 1e 2 22 2>;
-+ interrupts = <29 2 30 2 34 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy0>;
- };
-@@ -147,9 +148,9 @@
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-- reg = <25000 1000>;
-+ reg = <0x25000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <23 2 24 2 28 2>;
-+ interrupts = <35 2 36 2 40 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy1>;
- };
-@@ -160,9 +161,9 @@
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-- reg = <26000 1000>;
-+ reg = <0x26000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1f 2 20 2 21 2>;
-+ interrupts = <31 2 32 2 33 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy2>;
- };
-@@ -172,9 +173,9 @@
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-- reg = <27000 1000>;
-+ reg = <0x27000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <25 2 26 2 27 2>;
-+ interrupts = <37 2 38 2 39 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy3>;
- };
-@@ -184,9 +185,9 @@
- cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4500 100>; // reg base, size
-+ reg = <0x4500 0x100>; // reg base, size
- clock-frequency = <0>; // should we fill in in uboot?
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
-@@ -194,15 +195,15 @@
- cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4600 100>; // reg base, size
-+ reg = <0x4600 0x100>; // reg base, size
- clock-frequency = <0>; // should we fill in in uboot?
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
- global-utilities@e0000 { //global utilities reg
- compatible = "fsl,mpc8548-guts";
-- reg = <e0000 1000>;
-+ reg = <0xe0000 0x1000>;
- fsl,has-rstcr;
- };
-
-@@ -211,7 +212,7 @@
- interrupt-controller;
- #address-cells = <0>;
- #interrupt-cells = <2>;
-- reg = <40000 40000>;
-+ reg = <0x40000 0x40000>;
- compatible = "chrp,open-pic";
- device_type = "open-pic";
- big-endian;
-@@ -220,139 +221,139 @@
-
- pci0: pci@e0008000 {
- cell-index = <0>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
- /* IDSEL 0x4 (PCIX Slot 2) */
-- 02000 0 0 1 &mpic 0 1
-- 02000 0 0 2 &mpic 1 1
-- 02000 0 0 3 &mpic 2 1
-- 02000 0 0 4 &mpic 3 1
-+ 0x2000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x2000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x2000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x2000 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x5 (PCIX Slot 3) */
-- 02800 0 0 1 &mpic 1 1
-- 02800 0 0 2 &mpic 2 1
-- 02800 0 0 3 &mpic 3 1
-- 02800 0 0 4 &mpic 0 1
-+ 0x2800 0x0 0x0 0x1 &mpic 0x1 0x1
-+ 0x2800 0x0 0x0 0x2 &mpic 0x2 0x1
-+ 0x2800 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x2800 0x0 0x0 0x4 &mpic 0x0 0x1
-
- /* IDSEL 0x6 (PCIX Slot 4) */
-- 03000 0 0 1 &mpic 2 1
-- 03000 0 0 2 &mpic 3 1
-- 03000 0 0 3 &mpic 0 1
-- 03000 0 0 4 &mpic 1 1
-+ 0x3000 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x3000 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x3000 0x0 0x0 0x3 &mpic 0x0 0x1
-+ 0x3000 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x8 (PCIX Slot 5) */
-- 04000 0 0 1 &mpic 0 1
-- 04000 0 0 2 &mpic 1 1
-- 04000 0 0 3 &mpic 2 1
-- 04000 0 0 4 &mpic 3 1
-+ 0x4000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x4000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x4000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x4000 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0xC (Tsi310 bridge) */
-- 06000 0 0 1 &mpic 0 1
-- 06000 0 0 2 &mpic 1 1
-- 06000 0 0 3 &mpic 2 1
-- 06000 0 0 4 &mpic 3 1
-+ 0x6000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x6000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x6000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x6000 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x14 (Slot 2) */
-- 0a000 0 0 1 &mpic 0 1
-- 0a000 0 0 2 &mpic 1 1
-- 0a000 0 0 3 &mpic 2 1
-- 0a000 0 0 4 &mpic 3 1
-+ 0xa000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0xa000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0xa000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0xa000 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x15 (Slot 3) */
-- 0a800 0 0 1 &mpic 1 1
-- 0a800 0 0 2 &mpic 2 1
-- 0a800 0 0 3 &mpic 3 1
-- 0a800 0 0 4 &mpic 0 1
-+ 0xa800 0x0 0x0 0x1 &mpic 0x1 0x1
-+ 0xa800 0x0 0x0 0x2 &mpic 0x2 0x1
-+ 0xa800 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0xa800 0x0 0x0 0x4 &mpic 0x0 0x1
-
- /* IDSEL 0x16 (Slot 4) */
-- 0b000 0 0 1 &mpic 2 1
-- 0b000 0 0 2 &mpic 3 1
-- 0b000 0 0 3 &mpic 0 1
-- 0b000 0 0 4 &mpic 1 1
-+ 0xb000 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0xb000 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0xb000 0x0 0x0 0x3 &mpic 0x0 0x1
-+ 0xb000 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x18 (Slot 5) */
-- 0c000 0 0 1 &mpic 0 1
-- 0c000 0 0 2 &mpic 1 1
-- 0c000 0 0 3 &mpic 2 1
-- 0c000 0 0 4 &mpic 3 1
-+ 0xc000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0xc000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0xc000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0xc000 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x1C (Tsi310 bridge PCI primary) */
-- 0E000 0 0 1 &mpic 0 1
-- 0E000 0 0 2 &mpic 1 1
-- 0E000 0 0 3 &mpic 2 1
-- 0E000 0 0 4 &mpic 3 1>;
-+ 0xe000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0xe000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0xe000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0xe000 0x0 0x0 0x4 &mpic 0x3 0x1>;
-
- interrupt-parent = <&mpic>;
-- interrupts = <18 2>;
-+ interrupts = <24 2>;
- bus-range = <0 0>;
-- ranges = <02000000 0 80000000 80000000 0 10000000
-- 01000000 0 00000000 e2000000 0 00800000>;
-- clock-frequency = <3f940aa>;
-+ ranges = <0x2000000 0x0 0x80000000 0x80000000 0x0 0x10000000
-+ 0x1000000 0x0 0x0 0xe2000000 0x0 0x800000>;
-+ clock-frequency = <66666666>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e0008000 1000>;
-+ reg = <0xe0008000 0x1000>;
- compatible = "fsl,mpc8540-pcix", "fsl,mpc8540-pci";
- device_type = "pci";
-
- pci_bridge@1c {
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
-
- /* IDSEL 0x00 (PrPMC Site) */
-- 0000 0 0 1 &mpic 0 1
-- 0000 0 0 2 &mpic 1 1
-- 0000 0 0 3 &mpic 2 1
-- 0000 0 0 4 &mpic 3 1
-+ 0000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0000 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x04 (VIA chip) */
-- 2000 0 0 1 &mpic 0 1
-- 2000 0 0 2 &mpic 1 1
-- 2000 0 0 3 &mpic 2 1
-- 2000 0 0 4 &mpic 3 1
-+ 0x2000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x2000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x2000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x2000 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x05 (8139) */
-- 2800 0 0 1 &mpic 1 1
-+ 0x2800 0x0 0x0 0x1 &mpic 0x1 0x1
-
- /* IDSEL 0x06 (Slot 6) */
-- 3000 0 0 1 &mpic 2 1
-- 3000 0 0 2 &mpic 3 1
-- 3000 0 0 3 &mpic 0 1
-- 3000 0 0 4 &mpic 1 1
-+ 0x3000 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x3000 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x3000 0x0 0x0 0x3 &mpic 0x0 0x1
-+ 0x3000 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDESL 0x07 (Slot 7) */
-- 3800 0 0 1 &mpic 3 1
-- 3800 0 0 2 &mpic 0 1
-- 3800 0 0 3 &mpic 1 1
-- 3800 0 0 4 &mpic 2 1>;
-+ 0x3800 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x3800 0x0 0x0 0x2 &mpic 0x0 0x1
-+ 0x3800 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x3800 0x0 0x0 0x4 &mpic 0x2 0x1>;
-
-- reg = <e000 0 0 0 0>;
-+ reg = <0xe000 0x0 0x0 0x0 0x0>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- ranges = <02000000 0 80000000
-- 02000000 0 80000000
-- 0 20000000
-- 01000000 0 00000000
-- 01000000 0 00000000
-- 0 00080000>;
-- clock-frequency = <1fca055>;
-+ ranges = <0x2000000 0x0 0x80000000
-+ 0x2000000 0x0 0x80000000
-+ 0x0 0x20000000
-+ 0x1000000 0x0 0x0
-+ 0x1000000 0x0 0x0
-+ 0x0 0x80000>;
-+ clock-frequency = <33333333>;
-
- isa@4 {
- device_type = "isa";
- #interrupt-cells = <2>;
- #size-cells = <1>;
- #address-cells = <2>;
-- reg = <2000 0 0 0 0>;
-- ranges = <1 0 01000000 0 0 00001000>;
-+ reg = <0x2000 0x0 0x0 0x0 0x0>;
-+ ranges = <0x1 0x0 0x1000000 0x0 0x0 0x1000>;
- interrupt-parent = <&i8259>;
-
- i8259: interrupt-controller@20 {
- interrupt-controller;
- device_type = "interrupt-controller";
-- reg = <1 20 2
-- 1 a0 2
-- 1 4d0 2>;
-+ reg = <0x1 0x20 0x2
-+ 0x1 0xa0 0x2
-+ 0x1 0x4d0 0x2>;
- #address-cells = <0>;
- #interrupt-cells = <2>;
- compatible = "chrp,iic";
-@@ -362,7 +363,7 @@
-
- rtc@70 {
- compatible = "pnpPNP,b00";
-- reg = <1 70 2>;
-+ reg = <0x1 0x70 0x2>;
- };
- };
- };
-@@ -370,64 +371,64 @@
-
- pci1: pci@e0009000 {
- cell-index = <1>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
-
- /* IDSEL 0x15 */
-- a800 0 0 1 &mpic b 1
-- a800 0 0 2 &mpic 1 1
-- a800 0 0 3 &mpic 2 1
-- a800 0 0 4 &mpic 3 1>;
-+ 0xa800 0x0 0x0 0x1 &mpic 0xb 0x1
-+ 0xa800 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0xa800 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0xa800 0x0 0x0 0x4 &mpic 0x3 0x1>;
-
- interrupt-parent = <&mpic>;
-- interrupts = <19 2>;
-+ interrupts = <25 2>;
- bus-range = <0 0>;
-- ranges = <02000000 0 90000000 90000000 0 10000000
-- 01000000 0 00000000 e2800000 0 00800000>;
-- clock-frequency = <3f940aa>;
-+ ranges = <0x2000000 0x0 0x90000000 0x90000000 0x0 0x10000000
-+ 0x1000000 0x0 0x0 0xe2800000 0x0 0x800000>;
-+ clock-frequency = <66666666>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e0009000 1000>;
-+ reg = <0xe0009000 0x1000>;
- compatible = "fsl,mpc8540-pci";
- device_type = "pci";
- };
-
- pci2: pcie@e000a000 {
- cell-index = <2>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
-
- /* IDSEL 0x0 (PEX) */
-- 00000 0 0 1 &mpic 0 1
-- 00000 0 0 2 &mpic 1 1
-- 00000 0 0 3 &mpic 2 1
-- 00000 0 0 4 &mpic 3 1>;
-+ 00000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 00000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 00000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 00000 0x0 0x0 0x4 &mpic 0x3 0x1>;
-
- interrupt-parent = <&mpic>;
-- interrupts = <1a 2>;
-- bus-range = <0 ff>;
-- ranges = <02000000 0 a0000000 a0000000 0 20000000
-- 01000000 0 00000000 e3000000 0 08000000>;
-- clock-frequency = <1fca055>;
-+ interrupts = <26 2>;
-+ bus-range = <0 255>;
-+ ranges = <0x2000000 0x0 0xa0000000 0xa0000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xe3000000 0x0 0x8000000>;
-+ clock-frequency = <33333333>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e000a000 1000>;
-+ reg = <0xe000a000 0x1000>;
- compatible = "fsl,mpc8548-pcie";
- device_type = "pci";
- pcie@0 {
-- reg = <0 0 0 0 0>;
-+ reg = <0x0 0x0 0x0 0x0 0x0>;
- #size-cells = <2>;
- #address-cells = <3>;
- device_type = "pci";
-- ranges = <02000000 0 a0000000
-- 02000000 0 a0000000
-- 0 20000000
--
-- 01000000 0 00000000
-- 01000000 0 00000000
-- 0 08000000>;
-+ ranges = <0x2000000 0x0 0xa0000000
-+ 0x2000000 0x0 0xa0000000
-+ 0x0 0x20000000
-+
-+ 0x1000000 0x0 0x0
-+ 0x1000000 0x0 0x0
-+ 0x0 0x8000000>;
- };
- };
- };
---- a/arch/powerpc/boot/dts/mpc8555cds.dts
-+++ b/arch/powerpc/boot/dts/mpc8555cds.dts
-@@ -1,7 +1,7 @@
- /*
- * MPC8555 CDS Device Tree Source
- *
-- * Copyright 2006 Freescale Semiconductor Inc.
-+ * Copyright 2006, 2008 Freescale Semiconductor 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
-@@ -9,6 +9,7 @@
- * option) any later version.
- */
-
-+/dts-v1/;
-
- / {
- model = "MPC8555CDS";
-@@ -31,11 +32,11 @@
-
- PowerPC,8555@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <20>; // 32 bytes
-- i-cache-line-size = <20>; // 32 bytes
-- d-cache-size = <8000>; // L1, 32K
-- i-cache-size = <8000>; // L1, 32K
-+ reg = <0x0>;
-+ d-cache-line-size = <32>; // 32 bytes
-+ i-cache-line-size = <32>; // 32 bytes
-+ d-cache-size = <0x8000>; // L1, 32K
-+ i-cache-size = <0x8000>; // L1, 32K
- timebase-frequency = <0>; // 33 MHz, from uboot
- bus-frequency = <0>; // 166 MHz
- clock-frequency = <0>; // 825 MHz, from uboot
-@@ -44,31 +45,31 @@
-
- memory {
- device_type = "memory";
-- reg = <00000000 08000000>; // 128M at 0x0
-+ reg = <0x0 0x8000000>; // 128M at 0x0
- };
-
- soc8555@e0000000 {
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
-- ranges = <0 e0000000 00100000>;
-- reg = <e0000000 00001000>; // CCSRBAR 1M
-+ ranges = <0x0 0xe0000000 0x100000>;
-+ reg = <0xe0000000 0x1000>; // CCSRBAR 1M
- bus-frequency = <0>;
-
- memory-controller@2000 {
- compatible = "fsl,8555-memory-controller";
-- reg = <2000 1000>;
-+ reg = <0x2000 0x1000>;
- interrupt-parent = <&mpic>;
-- interrupts = <12 2>;
-+ interrupts = <18 2>;
- };
-
- l2-cache-controller@20000 {
- compatible = "fsl,8555-l2-cache-controller";
-- reg = <20000 1000>;
-- cache-line-size = <20>; // 32 bytes
-- cache-size = <40000>; // L2, 256K
-+ reg = <0x20000 0x1000>;
-+ cache-line-size = <32>; // 32 bytes
-+ cache-size = <0x40000>; // L2, 256K
- interrupt-parent = <&mpic>;
-- interrupts = <10 2>;
-+ interrupts = <16 2>;
- };
-
- i2c@3000 {
-@@ -76,8 +77,8 @@
- #size-cells = <0>;
- cell-index = <0>;
- compatible = "fsl-i2c";
-- reg = <3000 100>;
-- interrupts = <2b 2>;
-+ reg = <0x3000 0x100>;
-+ interrupts = <43 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
- };
-@@ -86,18 +87,18 @@
- #address-cells = <1>;
- #size-cells = <0>;
- compatible = "fsl,gianfar-mdio";
-- reg = <24520 20>;
-+ reg = <0x24520 0x20>;
-
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-- reg = <0>;
-+ reg = <0x0>;
- device_type = "ethernet-phy";
- };
- phy1: ethernet-phy@1 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-- reg = <1>;
-+ reg = <0x1>;
- device_type = "ethernet-phy";
- };
- };
-@@ -107,9 +108,9 @@
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-- reg = <24000 1000>;
-+ reg = <0x24000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1d 2 1e 2 22 2>;
-+ interrupts = <29 2 30 2 34 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy0>;
- };
-@@ -119,9 +120,9 @@
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-- reg = <25000 1000>;
-+ reg = <0x25000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <23 2 24 2 28 2>;
-+ interrupts = <35 2 36 2 40 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy1>;
- };
-@@ -130,9 +131,9 @@
- cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4500 100>; // reg base, size
-+ reg = <0x4500 0x100>; // reg base, size
- clock-frequency = <0>; // should we fill in in uboot?
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
-@@ -140,9 +141,9 @@
- cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4600 100>; // reg base, size
-+ reg = <0x4600 0x100>; // reg base, size
- clock-frequency = <0>; // should we fill in in uboot?
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
-@@ -151,7 +152,7 @@
- interrupt-controller;
- #address-cells = <0>;
- #interrupt-cells = <2>;
-- reg = <40000 40000>;
-+ reg = <0x40000 0x40000>;
- compatible = "chrp,open-pic";
- device_type = "open-pic";
- big-endian;
-@@ -161,17 +162,17 @@
- #address-cells = <1>;
- #size-cells = <1>;
- compatible = "fsl,mpc8555-cpm", "fsl,cpm2";
-- reg = <919c0 30>;
-+ reg = <0x919c0 0x30>;
- ranges;
-
- muram@80000 {
- #address-cells = <1>;
- #size-cells = <1>;
-- ranges = <0 80000 10000>;
-+ ranges = <0x0 0x80000 0x10000>;
-
- data@0 {
- compatible = "fsl,cpm-muram-data";
-- reg = <0 2000 9000 1000>;
-+ reg = <0x0 0x2000 0x9000 0x1000>;
- };
- };
-
-@@ -179,16 +180,16 @@
- compatible = "fsl,mpc8555-brg",
- "fsl,cpm2-brg",
- "fsl,cpm-brg";
-- reg = <919f0 10 915f0 10>;
-+ reg = <0x919f0 0x10 0x915f0 0x10>;
- };
-
- cpmpic: pic@90c00 {
- interrupt-controller;
- #address-cells = <0>;
- #interrupt-cells = <2>;
-- interrupts = <2e 2>;
-+ interrupts = <46 2>;
- interrupt-parent = <&mpic>;
-- reg = <90c00 80>;
-+ reg = <0x90c00 0x80>;
- compatible = "fsl,mpc8555-cpm-pic", "fsl,cpm2-pic";
- };
- };
-@@ -196,68 +197,68 @@
-
- pci0: pci@e0008000 {
- cell-index = <0>;
-- interrupt-map-mask = <1f800 0 0 7>;
-+ interrupt-map-mask = <0x1f800 0x0 0x0 0x7>;
- interrupt-map = <
-
- /* IDSEL 0x10 */
-- 08000 0 0 1 &mpic 0 1
-- 08000 0 0 2 &mpic 1 1
-- 08000 0 0 3 &mpic 2 1
-- 08000 0 0 4 &mpic 3 1
-+ 0x8000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x8000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x8000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x8000 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x11 */
-- 08800 0 0 1 &mpic 0 1
-- 08800 0 0 2 &mpic 1 1
-- 08800 0 0 3 &mpic 2 1
-- 08800 0 0 4 &mpic 3 1
-+ 0x8800 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x8800 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x8800 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x8800 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x12 (Slot 1) */
-- 09000 0 0 1 &mpic 0 1
-- 09000 0 0 2 &mpic 1 1
-- 09000 0 0 3 &mpic 2 1
-- 09000 0 0 4 &mpic 3 1
-+ 0x9000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x9000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x9000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x9000 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x13 (Slot 2) */
-- 09800 0 0 1 &mpic 1 1
-- 09800 0 0 2 &mpic 2 1
-- 09800 0 0 3 &mpic 3 1
-- 09800 0 0 4 &mpic 0 1
-+ 0x9800 0x0 0x0 0x1 &mpic 0x1 0x1
-+ 0x9800 0x0 0x0 0x2 &mpic 0x2 0x1
-+ 0x9800 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x9800 0x0 0x0 0x4 &mpic 0x0 0x1
-
- /* IDSEL 0x14 (Slot 3) */
-- 0a000 0 0 1 &mpic 2 1
-- 0a000 0 0 2 &mpic 3 1
-- 0a000 0 0 3 &mpic 0 1
-- 0a000 0 0 4 &mpic 1 1
-+ 0xa000 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0xa000 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0xa000 0x0 0x0 0x3 &mpic 0x0 0x1
-+ 0xa000 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x15 (Slot 4) */
-- 0a800 0 0 1 &mpic 3 1
-- 0a800 0 0 2 &mpic 0 1
-- 0a800 0 0 3 &mpic 1 1
-- 0a800 0 0 4 &mpic 2 1
-+ 0xa800 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0xa800 0x0 0x0 0x2 &mpic 0x0 0x1
-+ 0xa800 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0xa800 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* Bus 1 (Tundra Bridge) */
- /* IDSEL 0x12 (ISA bridge) */
-- 19000 0 0 1 &mpic 0 1
-- 19000 0 0 2 &mpic 1 1
-- 19000 0 0 3 &mpic 2 1
-- 19000 0 0 4 &mpic 3 1>;
-+ 0x19000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0x19000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x19000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x19000 0x0 0x0 0x4 &mpic 0x3 0x1>;
- interrupt-parent = <&mpic>;
-- interrupts = <18 2>;
-+ interrupts = <24 2>;
- bus-range = <0 0>;
-- ranges = <02000000 0 80000000 80000000 0 20000000
-- 01000000 0 00000000 e2000000 0 00100000>;
-- clock-frequency = <3f940aa>;
-+ ranges = <0x2000000 0x0 0x80000000 0x80000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xe2000000 0x0 0x100000>;
-+ clock-frequency = <66666666>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e0008000 1000>;
-+ reg = <0xe0008000 0x1000>;
- compatible = "fsl,mpc8540-pci";
- device_type = "pci";
-
- i8259@19000 {
- interrupt-controller;
- device_type = "interrupt-controller";
-- reg = <19000 0 0 0 1>;
-+ reg = <0x19000 0x0 0x0 0x0 0x1>;
- #address-cells = <0>;
- #interrupt-cells = <2>;
- compatible = "chrp,iic";
-@@ -268,24 +269,24 @@
-
- pci1: pci@e0009000 {
- cell-index = <1>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
-
- /* IDSEL 0x15 */
-- a800 0 0 1 &mpic b 1
-- a800 0 0 2 &mpic b 1
-- a800 0 0 3 &mpic b 1
-- a800 0 0 4 &mpic b 1>;
-+ 0xa800 0x0 0x0 0x1 &mpic 0xb 0x1
-+ 0xa800 0x0 0x0 0x2 &mpic 0xb 0x1
-+ 0xa800 0x0 0x0 0x3 &mpic 0xb 0x1
-+ 0xa800 0x0 0x0 0x4 &mpic 0xb 0x1>;
- interrupt-parent = <&mpic>;
-- interrupts = <19 2>;
-+ interrupts = <25 2>;
- bus-range = <0 0>;
-- ranges = <02000000 0 a0000000 a0000000 0 20000000
-- 01000000 0 00000000 e3000000 0 00100000>;
-- clock-frequency = <3f940aa>;
-+ ranges = <0x2000000 0x0 0xa0000000 0xa0000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xe3000000 0x0 0x100000>;
-+ clock-frequency = <66666666>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e0009000 1000>;
-+ reg = <0xe0009000 0x1000>;
- compatible = "fsl,mpc8540-pci";
- device_type = "pci";
- };
---- a/arch/powerpc/boot/dts/mpc8560ads.dts
-+++ b/arch/powerpc/boot/dts/mpc8560ads.dts
-@@ -1,7 +1,7 @@
- /*
- * MPC8560 ADS Device Tree Source
- *
-- * Copyright 2006 Freescale Semiconductor Inc.
-+ * Copyright 2006, 2008 Freescale Semiconductor 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
-@@ -9,6 +9,7 @@
- * option) any later version.
- */
-
-+/dts-v1/;
-
- / {
- model = "MPC8560ADS";
-@@ -32,74 +33,74 @@
-
- PowerPC,8560@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <20>; // 32 bytes
-- i-cache-line-size = <20>; // 32 bytes
-- d-cache-size = <8000>; // L1, 32K
-- i-cache-size = <8000>; // L1, 32K
-- timebase-frequency = <04ead9a0>;
-- bus-frequency = <13ab6680>;
-- clock-frequency = <312c8040>;
-+ reg = <0x0>;
-+ d-cache-line-size = <32>; // 32 bytes
-+ i-cache-line-size = <32>; // 32 bytes
-+ d-cache-size = <0x8000>; // L1, 32K
-+ i-cache-size = <0x8000>; // L1, 32K
-+ timebase-frequency = <82500000>;
-+ bus-frequency = <330000000>;
-+ clock-frequency = <825000000>;
- };
- };
-
- memory {
- device_type = "memory";
-- reg = <00000000 10000000>;
-+ reg = <0x0 0x10000000>;
- };
-
- soc8560@e0000000 {
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
-- ranges = <0 e0000000 00100000>;
-- reg = <e0000000 00000200>;
-- bus-frequency = <13ab6680>;
-+ ranges = <0x0 0xe0000000 0x100000>;
-+ reg = <0xe0000000 0x200>;
-+ bus-frequency = <330000000>;
-
- memory-controller@2000 {
- compatible = "fsl,8540-memory-controller";
-- reg = <2000 1000>;
-+ reg = <0x2000 0x1000>;
- interrupt-parent = <&mpic>;
-- interrupts = <12 2>;
-+ interrupts = <18 2>;
- };
-
- l2-cache-controller@20000 {
- compatible = "fsl,8540-l2-cache-controller";
-- reg = <20000 1000>;
-- cache-line-size = <20>; // 32 bytes
-- cache-size = <40000>; // L2, 256K
-+ reg = <0x20000 0x1000>;
-+ cache-line-size = <32>; // 32 bytes
-+ cache-size = <0x40000>; // L2, 256K
- interrupt-parent = <&mpic>;
-- interrupts = <10 2>;
-+ interrupts = <16 2>;
- };
-
- mdio@24520 {
- #address-cells = <1>;
- #size-cells = <0>;
- compatible = "fsl,gianfar-mdio";
-- reg = <24520 20>;
-+ reg = <0x24520 0x20>;
-
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-- reg = <0>;
-+ reg = <0x0>;
- device_type = "ethernet-phy";
- };
- phy1: ethernet-phy@1 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-- reg = <1>;
-+ reg = <0x1>;
- device_type = "ethernet-phy";
- };
- phy2: ethernet-phy@2 {
- interrupt-parent = <&mpic>;
- interrupts = <7 1>;
-- reg = <2>;
-+ reg = <0x2>;
- device_type = "ethernet-phy";
- };
- phy3: ethernet-phy@3 {
- interrupt-parent = <&mpic>;
- interrupts = <7 1>;
-- reg = <3>;
-+ reg = <0x3>;
- device_type = "ethernet-phy";
- };
- };
-@@ -109,9 +110,9 @@
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-- reg = <24000 1000>;
-+ reg = <0x24000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1d 2 1e 2 22 2>;
-+ interrupts = <29 2 30 2 34 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy0>;
- };
-@@ -121,9 +122,9 @@
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-- reg = <25000 1000>;
-+ reg = <0x25000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <23 2 24 2 28 2>;
-+ interrupts = <35 2 36 2 40 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy1>;
- };
-@@ -132,7 +133,7 @@
- interrupt-controller;
- #address-cells = <0>;
- #interrupt-cells = <2>;
-- reg = <40000 40000>;
-+ reg = <0x40000 0x40000>;
- device_type = "open-pic";
- };
-
-@@ -140,17 +141,17 @@
- #address-cells = <1>;
- #size-cells = <1>;
- compatible = "fsl,mpc8560-cpm", "fsl,cpm2";
-- reg = <919c0 30>;
-+ reg = <0x919c0 0x30>;
- ranges;
-
- muram@80000 {
- #address-cells = <1>;
- #size-cells = <1>;
-- ranges = <0 80000 10000>;
-+ ranges = <0x0 0x80000 0x10000>;
-
- data@0 {
- compatible = "fsl,cpm-muram-data";
-- reg = <0 4000 9000 2000>;
-+ reg = <0x0 0x4000 0x9000 0x2000>;
- };
- };
-
-@@ -158,17 +159,17 @@
- compatible = "fsl,mpc8560-brg",
- "fsl,cpm2-brg",
- "fsl,cpm-brg";
-- reg = <919f0 10 915f0 10>;
-- clock-frequency = <d#165000000>;
-+ reg = <0x919f0 0x10 0x915f0 0x10>;
-+ clock-frequency = <165000000>;
- };
-
- cpmpic: pic@90c00 {
- interrupt-controller;
- #address-cells = <0>;
- #interrupt-cells = <2>;
-- interrupts = <2e 2>;
-+ interrupts = <46 2>;
- interrupt-parent = <&mpic>;
-- reg = <90c00 80>;
-+ reg = <0x90c00 0x80>;
- compatible = "fsl,mpc8560-cpm-pic", "fsl,cpm2-pic";
- };
-
-@@ -176,11 +177,11 @@
- device_type = "serial";
- compatible = "fsl,mpc8560-scc-uart",
- "fsl,cpm2-scc-uart";
-- reg = <91a00 20 88000 100>;
-+ reg = <0x91a00 0x20 0x88000 0x100>;
- fsl,cpm-brg = <1>;
-- fsl,cpm-command = <00800000>;
-- current-speed = <1c200>;
-- interrupts = <28 8>;
-+ fsl,cpm-command = <0x800000>;
-+ current-speed = <115200>;
-+ interrupts = <40 8>;
- interrupt-parent = <&cpmpic>;
- };
-
-@@ -188,11 +189,11 @@
- device_type = "serial";
- compatible = "fsl,mpc8560-scc-uart",
- "fsl,cpm2-scc-uart";
-- reg = <91a20 20 88100 100>;
-+ reg = <0x91a20 0x20 0x88100 0x100>;
- fsl,cpm-brg = <2>;
-- fsl,cpm-command = <04a00000>;
-- current-speed = <1c200>;
-- interrupts = <29 8>;
-+ fsl,cpm-command = <0x4a00000>;
-+ current-speed = <115200>;
-+ interrupts = <41 8>;
- interrupt-parent = <&cpmpic>;
- };
-
-@@ -200,10 +201,10 @@
- device_type = "network";
- compatible = "fsl,mpc8560-fcc-enet",
- "fsl,cpm2-fcc-enet";
-- reg = <91320 20 88500 100 913b0 1>;
-+ reg = <0x91320 0x20 0x88500 0x100 0x913b0 0x1>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- fsl,cpm-command = <16200300>;
-- interrupts = <21 8>;
-+ fsl,cpm-command = <0x16200300>;
-+ interrupts = <33 8>;
- interrupt-parent = <&cpmpic>;
- phy-handle = <&phy2>;
- };
-@@ -212,10 +213,10 @@
- device_type = "network";
- compatible = "fsl,mpc8560-fcc-enet",
- "fsl,cpm2-fcc-enet";
-- reg = <91340 20 88600 100 913d0 1>;
-+ reg = <0x91340 0x20 0x88600 0x100 0x913d0 0x1>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- fsl,cpm-command = <1a400300>;
-- interrupts = <22 8>;
-+ fsl,cpm-command = <0x1a400300>;
-+ interrupts = <34 8>;
- interrupt-parent = <&cpmpic>;
- phy-handle = <&phy3>;
- };
-@@ -229,87 +230,87 @@
- #address-cells = <3>;
- compatible = "fsl,mpc8540-pcix", "fsl,mpc8540-pci";
- device_type = "pci";
-- reg = <e0008000 1000>;
-- clock-frequency = <3f940aa>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ reg = <0xe0008000 0x1000>;
-+ clock-frequency = <66666666>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
-
- /* IDSEL 0x2 */
-- 1000 0 0 1 &mpic 1 1
-- 1000 0 0 2 &mpic 2 1
-- 1000 0 0 3 &mpic 3 1
-- 1000 0 0 4 &mpic 4 1
-+ 0x1000 0x0 0x0 0x1 &mpic 0x1 0x1
-+ 0x1000 0x0 0x0 0x2 &mpic 0x2 0x1
-+ 0x1000 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x1000 0x0 0x0 0x4 &mpic 0x4 0x1
-
- /* IDSEL 0x3 */
-- 1800 0 0 1 &mpic 4 1
-- 1800 0 0 2 &mpic 1 1
-- 1800 0 0 3 &mpic 2 1
-- 1800 0 0 4 &mpic 3 1
-+ 0x1800 0x0 0x0 0x1 &mpic 0x4 0x1
-+ 0x1800 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x1800 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x1800 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 0x4 */
-- 2000 0 0 1 &mpic 3 1
-- 2000 0 0 2 &mpic 4 1
-- 2000 0 0 3 &mpic 1 1
-- 2000 0 0 4 &mpic 2 1
-+ 0x2000 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x2000 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x2000 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x2000 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 0x5 */
-- 2800 0 0 1 &mpic 2 1
-- 2800 0 0 2 &mpic 3 1
-- 2800 0 0 3 &mpic 4 1
-- 2800 0 0 4 &mpic 1 1
-+ 0x2800 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x2800 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x2800 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x2800 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 12 */
-- 6000 0 0 1 &mpic 1 1
-- 6000 0 0 2 &mpic 2 1
-- 6000 0 0 3 &mpic 3 1
-- 6000 0 0 4 &mpic 4 1
-+ 0x6000 0x0 0x0 0x1 &mpic 0x1 0x1
-+ 0x6000 0x0 0x0 0x2 &mpic 0x2 0x1
-+ 0x6000 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x6000 0x0 0x0 0x4 &mpic 0x4 0x1
-
- /* IDSEL 13 */
-- 6800 0 0 1 &mpic 4 1
-- 6800 0 0 2 &mpic 1 1
-- 6800 0 0 3 &mpic 2 1
-- 6800 0 0 4 &mpic 3 1
-+ 0x6800 0x0 0x0 0x1 &mpic 0x4 0x1
-+ 0x6800 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x6800 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x6800 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 14*/
-- 7000 0 0 1 &mpic 3 1
-- 7000 0 0 2 &mpic 4 1
-- 7000 0 0 3 &mpic 1 1
-- 7000 0 0 4 &mpic 2 1
-+ 0x7000 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x7000 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x7000 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x7000 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 15 */
-- 7800 0 0 1 &mpic 2 1
-- 7800 0 0 2 &mpic 3 1
-- 7800 0 0 3 &mpic 4 1
-- 7800 0 0 4 &mpic 1 1
-+ 0x7800 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x7800 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x7800 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x7800 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 18 */
-- 9000 0 0 1 &mpic 1 1
-- 9000 0 0 2 &mpic 2 1
-- 9000 0 0 3 &mpic 3 1
-- 9000 0 0 4 &mpic 4 1
-+ 0x9000 0x0 0x0 0x1 &mpic 0x1 0x1
-+ 0x9000 0x0 0x0 0x2 &mpic 0x2 0x1
-+ 0x9000 0x0 0x0 0x3 &mpic 0x3 0x1
-+ 0x9000 0x0 0x0 0x4 &mpic 0x4 0x1
-
- /* IDSEL 19 */
-- 9800 0 0 1 &mpic 4 1
-- 9800 0 0 2 &mpic 1 1
-- 9800 0 0 3 &mpic 2 1
-- 9800 0 0 4 &mpic 3 1
-+ 0x9800 0x0 0x0 0x1 &mpic 0x4 0x1
-+ 0x9800 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0x9800 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0x9800 0x0 0x0 0x4 &mpic 0x3 0x1
-
- /* IDSEL 20 */
-- a000 0 0 1 &mpic 3 1
-- a000 0 0 2 &mpic 4 1
-- a000 0 0 3 &mpic 1 1
-- a000 0 0 4 &mpic 2 1
-+ 0xa000 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0xa000 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0xa000 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0xa000 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 21 */
-- a800 0 0 1 &mpic 2 1
-- a800 0 0 2 &mpic 3 1
-- a800 0 0 3 &mpic 4 1
-- a800 0 0 4 &mpic 1 1>;
-+ 0xa800 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0xa800 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0xa800 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0xa800 0x0 0x0 0x4 &mpic 0x1 0x1>;
-
- interrupt-parent = <&mpic>;
-- interrupts = <18 2>;
-+ interrupts = <24 2>;
- bus-range = <0 0>;
-- ranges = <02000000 0 80000000 80000000 0 20000000
-- 01000000 0 00000000 e2000000 0 01000000>;
-+ ranges = <0x2000000 0x0 0x80000000 0x80000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xe2000000 0x0 0x1000000>;
- };
- };
---- a/arch/powerpc/boot/dts/mpc8568mds.dts
-+++ b/arch/powerpc/boot/dts/mpc8568mds.dts
-@@ -1,7 +1,7 @@
- /*
- * MPC8568E MDS Device Tree Source
- *
-- * Copyright 2007 Freescale Semiconductor Inc.
-+ * Copyright 2007, 2008 Freescale Semiconductor 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
-@@ -9,10 +9,7 @@
- * option) any later version.
- */
-
--
--/*
--/memreserve/ 00000000 1000000;
--*/
-+/dts-v1/;
-
- / {
- model = "MPC8568EMDS";
-@@ -37,11 +34,11 @@
-
- PowerPC,8568@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <20>; // 32 bytes
-- i-cache-line-size = <20>; // 32 bytes
-- d-cache-size = <8000>; // L1, 32K
-- i-cache-size = <8000>; // L1, 32K
-+ reg = <0x0>;
-+ d-cache-line-size = <32>; // 32 bytes
-+ i-cache-line-size = <32>; // 32 bytes
-+ d-cache-size = <0x8000>; // L1, 32K
-+ i-cache-size = <0x8000>; // L1, 32K
- timebase-frequency = <0>;
- bus-frequency = <0>;
- clock-frequency = <0>;
-@@ -50,36 +47,36 @@
-
- memory {
- device_type = "memory";
-- reg = <00000000 10000000>;
-+ reg = <0x0 0x10000000>;
- };
-
- bcsr@f8000000 {
- device_type = "board-control";
-- reg = <f8000000 8000>;
-+ reg = <0xf8000000 0x8000>;
- };
-
- soc8568@e0000000 {
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
-- ranges = <0 e0000000 00100000>;
-- reg = <e0000000 00001000>;
-+ ranges = <0x0 0xe0000000 0x100000>;
-+ reg = <0xe0000000 0x1000>;
- bus-frequency = <0>;
-
- memory-controller@2000 {
- compatible = "fsl,8568-memory-controller";
-- reg = <2000 1000>;
-+ reg = <0x2000 0x1000>;
- interrupt-parent = <&mpic>;
-- interrupts = <12 2>;
-+ interrupts = <18 2>;
- };
-
- l2-cache-controller@20000 {
- compatible = "fsl,8568-l2-cache-controller";
-- reg = <20000 1000>;
-- cache-line-size = <20>; // 32 bytes
-- cache-size = <80000>; // L2, 512K
-+ reg = <0x20000 0x1000>;
-+ cache-line-size = <32>; // 32 bytes
-+ cache-size = <0x80000>; // L2, 512K
- interrupt-parent = <&mpic>;
-- interrupts = <10 2>;
-+ interrupts = <16 2>;
- };
-
- i2c@3000 {
-@@ -87,14 +84,14 @@
- #size-cells = <0>;
- cell-index = <0>;
- compatible = "fsl-i2c";
-- reg = <3000 100>;
-- interrupts = <2b 2>;
-+ reg = <0x3000 0x100>;
-+ interrupts = <43 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
-
- rtc@68 {
- compatible = "dallas,ds1374";
-- reg = <68>;
-+ reg = <0x68>;
- };
- };
-
-@@ -103,8 +100,8 @@
- #size-cells = <0>;
- cell-index = <1>;
- compatible = "fsl-i2c";
-- reg = <3100 100>;
-- interrupts = <2b 2>;
-+ reg = <0x3100 0x100>;
-+ interrupts = <43 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
- };
-@@ -113,30 +110,30 @@
- #address-cells = <1>;
- #size-cells = <0>;
- compatible = "fsl,gianfar-mdio";
-- reg = <24520 20>;
-+ reg = <0x24520 0x20>;
-
- phy0: ethernet-phy@7 {
- interrupt-parent = <&mpic>;
- interrupts = <1 1>;
-- reg = <7>;
-+ reg = <0x7>;
- device_type = "ethernet-phy";
- };
- phy1: ethernet-phy@1 {
- interrupt-parent = <&mpic>;
- interrupts = <2 1>;
-- reg = <1>;
-+ reg = <0x1>;
- device_type = "ethernet-phy";
- };
- phy2: ethernet-phy@2 {
- interrupt-parent = <&mpic>;
- interrupts = <1 1>;
-- reg = <2>;
-+ reg = <0x2>;
- device_type = "ethernet-phy";
- };
- phy3: ethernet-phy@3 {
- interrupt-parent = <&mpic>;
- interrupts = <2 1>;
-- reg = <3>;
-+ reg = <0x3>;
- device_type = "ethernet-phy";
- };
- };
-@@ -146,9 +143,9 @@
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-- reg = <24000 1000>;
-+ reg = <0x24000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1d 2 1e 2 22 2>;
-+ interrupts = <29 2 30 2 34 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy2>;
- };
-@@ -158,9 +155,9 @@
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-- reg = <25000 1000>;
-+ reg = <0x25000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <23 2 24 2 28 2>;
-+ interrupts = <35 2 36 2 40 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy3>;
- };
-@@ -169,15 +166,15 @@
- cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4500 100>;
-+ reg = <0x4500 0x100>;
- clock-frequency = <0>;
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
- global-utilities@e0000 { //global utilities block
- compatible = "fsl,mpc8548-guts";
-- reg = <e0000 1000>;
-+ reg = <0xe0000 0x1000>;
- fsl,has-rstcr;
- };
-
-@@ -185,9 +182,9 @@
- cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4600 100>;
-+ reg = <0x4600 0x100>;
- clock-frequency = <0>;
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
-@@ -195,13 +192,13 @@
- device_type = "crypto";
- model = "SEC2";
- compatible = "talitos";
-- reg = <30000 f000>;
-- interrupts = <2d 2>;
-+ reg = <0x30000 0xf000>;
-+ interrupts = <45 2>;
- interrupt-parent = <&mpic>;
- num-channels = <4>;
-- channel-fifo-len = <18>;
-- exec-units-mask = <000000fe>;
-- descriptor-types-mask = <012b0ebf>;
-+ channel-fifo-len = <24>;
-+ exec-units-mask = <0xfe>;
-+ descriptor-types-mask = <0x12b0ebf>;
- };
-
- mpic: pic@40000 {
-@@ -209,73 +206,73 @@
- interrupt-controller;
- #address-cells = <0>;
- #interrupt-cells = <2>;
-- reg = <40000 40000>;
-+ reg = <0x40000 0x40000>;
- compatible = "chrp,open-pic";
- device_type = "open-pic";
- big-endian;
- };
-
- par_io@e0100 {
-- reg = <e0100 100>;
-+ reg = <0xe0100 0x100>;
- device_type = "par_io";
- num-ports = <7>;
-
- pio1: ucc_pin@01 {
- pio-map = <
- /* port pin dir open_drain assignment has_irq */
-- 4 0a 1 0 2 0 /* TxD0 */
-- 4 09 1 0 2 0 /* TxD1 */
-- 4 08 1 0 2 0 /* TxD2 */
-- 4 07 1 0 2 0 /* TxD3 */
-- 4 17 1 0 2 0 /* TxD4 */
-- 4 16 1 0 2 0 /* TxD5 */
-- 4 15 1 0 2 0 /* TxD6 */
-- 4 14 1 0 2 0 /* TxD7 */
-- 4 0f 2 0 2 0 /* RxD0 */
-- 4 0e 2 0 2 0 /* RxD1 */
-- 4 0d 2 0 2 0 /* RxD2 */
-- 4 0c 2 0 2 0 /* RxD3 */
-- 4 1d 2 0 2 0 /* RxD4 */
-- 4 1c 2 0 2 0 /* RxD5 */
-- 4 1b 2 0 2 0 /* RxD6 */
-- 4 1a 2 0 2 0 /* RxD7 */
-- 4 0b 1 0 2 0 /* TX_EN */
-- 4 18 1 0 2 0 /* TX_ER */
-- 4 10 2 0 2 0 /* RX_DV */
-- 4 1e 2 0 2 0 /* RX_ER */
-- 4 11 2 0 2 0 /* RX_CLK */
-- 4 13 1 0 2 0 /* GTX_CLK */
-- 1 1f 2 0 3 0>; /* GTX125 */
-+ 0x4 0xa 0x1 0x0 0x2 0x0 /* TxD0 */
-+ 0x4 0x9 0x1 0x0 0x2 0x0 /* TxD1 */
-+ 0x4 0x8 0x1 0x0 0x2 0x0 /* TxD2 */
-+ 0x4 0x7 0x1 0x0 0x2 0x0 /* TxD3 */
-+ 0x4 0x17 0x1 0x0 0x2 0x0 /* TxD4 */
-+ 0x4 0x16 0x1 0x0 0x2 0x0 /* TxD5 */
-+ 0x4 0x15 0x1 0x0 0x2 0x0 /* TxD6 */
-+ 0x4 0x14 0x1 0x0 0x2 0x0 /* TxD7 */
-+ 0x4 0xf 0x2 0x0 0x2 0x0 /* RxD0 */
-+ 0x4 0xe 0x2 0x0 0x2 0x0 /* RxD1 */
-+ 0x4 0xd 0x2 0x0 0x2 0x0 /* RxD2 */
-+ 0x4 0xc 0x2 0x0 0x2 0x0 /* RxD3 */
-+ 0x4 0x1d 0x2 0x0 0x2 0x0 /* RxD4 */
-+ 0x4 0x1c 0x2 0x0 0x2 0x0 /* RxD5 */
-+ 0x4 0x1b 0x2 0x0 0x2 0x0 /* RxD6 */
-+ 0x4 0x1a 0x2 0x0 0x2 0x0 /* RxD7 */
-+ 0x4 0xb 0x1 0x0 0x2 0x0 /* TX_EN */
-+ 0x4 0x18 0x1 0x0 0x2 0x0 /* TX_ER */
-+ 0x4 0x10 0x2 0x0 0x2 0x0 /* RX_DV */
-+ 0x4 0x1e 0x2 0x0 0x2 0x0 /* RX_ER */
-+ 0x4 0x11 0x2 0x0 0x2 0x0 /* RX_CLK */
-+ 0x4 0x13 0x1 0x0 0x2 0x0 /* GTX_CLK */
-+ 0x1 0x1f 0x2 0x0 0x3 0x0>; /* GTX125 */
- };
-
- pio2: ucc_pin@02 {
- pio-map = <
- /* port pin dir open_drain assignment has_irq */
-- 5 0a 1 0 2 0 /* TxD0 */
-- 5 09 1 0 2 0 /* TxD1 */
-- 5 08 1 0 2 0 /* TxD2 */
-- 5 07 1 0 2 0 /* TxD3 */
-- 5 17 1 0 2 0 /* TxD4 */
-- 5 16 1 0 2 0 /* TxD5 */
-- 5 15 1 0 2 0 /* TxD6 */
-- 5 14 1 0 2 0 /* TxD7 */
-- 5 0f 2 0 2 0 /* RxD0 */
-- 5 0e 2 0 2 0 /* RxD1 */
-- 5 0d 2 0 2 0 /* RxD2 */
-- 5 0c 2 0 2 0 /* RxD3 */
-- 5 1d 2 0 2 0 /* RxD4 */
-- 5 1c 2 0 2 0 /* RxD5 */
-- 5 1b 2 0 2 0 /* RxD6 */
-- 5 1a 2 0 2 0 /* RxD7 */
-- 5 0b 1 0 2 0 /* TX_EN */
-- 5 18 1 0 2 0 /* TX_ER */
-- 5 10 2 0 2 0 /* RX_DV */
-- 5 1e 2 0 2 0 /* RX_ER */
-- 5 11 2 0 2 0 /* RX_CLK */
-- 5 13 1 0 2 0 /* GTX_CLK */
-- 1 1f 2 0 3 0 /* GTX125 */
-- 4 06 3 0 2 0 /* MDIO */
-- 4 05 1 0 2 0>; /* MDC */
-+ 0x5 0xa 0x1 0x0 0x2 0x0 /* TxD0 */
-+ 0x5 0x9 0x1 0x0 0x2 0x0 /* TxD1 */
-+ 0x5 0x8 0x1 0x0 0x2 0x0 /* TxD2 */
-+ 0x5 0x7 0x1 0x0 0x2 0x0 /* TxD3 */
-+ 0x5 0x17 0x1 0x0 0x2 0x0 /* TxD4 */
-+ 0x5 0x16 0x1 0x0 0x2 0x0 /* TxD5 */
-+ 0x5 0x15 0x1 0x0 0x2 0x0 /* TxD6 */
-+ 0x5 0x14 0x1 0x0 0x2 0x0 /* TxD7 */
-+ 0x5 0xf 0x2 0x0 0x2 0x0 /* RxD0 */
-+ 0x5 0xe 0x2 0x0 0x2 0x0 /* RxD1 */
-+ 0x5 0xd 0x2 0x0 0x2 0x0 /* RxD2 */
-+ 0x5 0xc 0x2 0x0 0x2 0x0 /* RxD3 */
-+ 0x5 0x1d 0x2 0x0 0x2 0x0 /* RxD4 */
-+ 0x5 0x1c 0x2 0x0 0x2 0x0 /* RxD5 */
-+ 0x5 0x1b 0x2 0x0 0x2 0x0 /* RxD6 */
-+ 0x5 0x1a 0x2 0x0 0x2 0x0 /* RxD7 */
-+ 0x5 0xb 0x1 0x0 0x2 0x0 /* TX_EN */
-+ 0x5 0x18 0x1 0x0 0x2 0x0 /* TX_ER */
-+ 0x5 0x10 0x2 0x0 0x2 0x0 /* RX_DV */
-+ 0x5 0x1e 0x2 0x0 0x2 0x0 /* RX_ER */
-+ 0x5 0x11 0x2 0x0 0x2 0x0 /* RX_CLK */
-+ 0x5 0x13 0x1 0x0 0x2 0x0 /* GTX_CLK */
-+ 0x1 0x1f 0x2 0x0 0x3 0x0 /* GTX125 */
-+ 0x4 0x6 0x3 0x0 0x2 0x0 /* MDIO */
-+ 0x4 0x5 0x1 0x0 0x2 0x0>; /* MDC */
- };
- };
- };
-@@ -285,28 +282,28 @@
- #size-cells = <1>;
- device_type = "qe";
- compatible = "fsl,qe";
-- ranges = <0 e0080000 00040000>;
-- reg = <e0080000 480>;
-+ ranges = <0x0 0xe0080000 0x40000>;
-+ reg = <0xe0080000 0x480>;
- brg-frequency = <0>;
-- bus-frequency = <179A7B00>;
-+ bus-frequency = <396000000>;
-
- muram@10000 {
- #address-cells = <1>;
- #size-cells = <1>;
- compatible = "fsl,qe-muram", "fsl,cpm-muram";
-- ranges = <0 00010000 0000c000>;
-+ ranges = <0x0 0x10000 0x10000>;
-
- data-only@0 {
- compatible = "fsl,qe-muram-data",
- "fsl,cpm-muram-data";
-- reg = <0 c000>;
-+ reg = <0x0 0x10000>;
- };
- };
-
- spi@4c0 {
- cell-index = <0>;
- compatible = "fsl,spi";
-- reg = <4c0 40>;
-+ reg = <0x4c0 0x40>;
- interrupts = <2>;
- interrupt-parent = <&qeic>;
- mode = "cpu";
-@@ -315,7 +312,7 @@
- spi@500 {
- cell-index = <1>;
- compatible = "fsl,spi";
-- reg = <500 40>;
-+ reg = <0x500 0x40>;
- interrupts = <1>;
- interrupt-parent = <&qeic>;
- mode = "cpu";
-@@ -324,11 +321,9 @@
- enet2: ucc@2000 {
- device_type = "network";
- compatible = "ucc_geth";
-- model = "UCC";
- cell-index = <1>;
-- device-id = <1>;
-- reg = <2000 200>;
-- interrupts = <20>;
-+ reg = <0x2000 0x200>;
-+ interrupts = <32>;
- interrupt-parent = <&qeic>;
- local-mac-address = [ 00 00 00 00 00 00 ];
- rx-clock-name = "none";
-@@ -341,11 +336,9 @@
- enet3: ucc@3000 {
- device_type = "network";
- compatible = "ucc_geth";
-- model = "UCC";
- cell-index = <2>;
-- device-id = <2>;
-- reg = <3000 200>;
-- interrupts = <21>;
-+ reg = <0x3000 0x200>;
-+ interrupts = <33>;
- interrupt-parent = <&qeic>;
- local-mac-address = [ 00 00 00 00 00 00 ];
- rx-clock-name = "none";
-@@ -358,7 +351,7 @@
- mdio@2120 {
- #address-cells = <1>;
- #size-cells = <0>;
-- reg = <2120 18>;
-+ reg = <0x2120 0x18>;
- compatible = "fsl,ucc-mdio";
-
- /* These are the same PHYs as on
-@@ -366,25 +359,25 @@
- qe_phy0: ethernet-phy@07 {
- interrupt-parent = <&mpic>;
- interrupts = <1 1>;
-- reg = <7>;
-+ reg = <0x7>;
- device_type = "ethernet-phy";
- };
- qe_phy1: ethernet-phy@01 {
- interrupt-parent = <&mpic>;
- interrupts = <2 1>;
-- reg = <1>;
-+ reg = <0x1>;
- device_type = "ethernet-phy";
- };
- qe_phy2: ethernet-phy@02 {
- interrupt-parent = <&mpic>;
- interrupts = <1 1>;
-- reg = <2>;
-+ reg = <0x2>;
- device_type = "ethernet-phy";
- };
- qe_phy3: ethernet-phy@03 {
- interrupt-parent = <&mpic>;
- interrupts = <2 1>;
-- reg = <3>;
-+ reg = <0x3>;
- device_type = "ethernet-phy";
- };
- };
-@@ -394,9 +387,9 @@
- compatible = "fsl,qe-ic";
- #address-cells = <0>;
- #interrupt-cells = <1>;
-- reg = <80 80>;
-+ reg = <0x80 0x80>;
- big-endian;
-- interrupts = <2e 2 2e 2>; //high:30 low:30
-+ interrupts = <46 2 46 2>; //high:30 low:30
- interrupt-parent = <&mpic>;
- };
-
-@@ -404,30 +397,30 @@
-
- pci0: pci@e0008000 {
- cell-index = <0>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
- /* IDSEL 0x12 AD18 */
-- 9000 0 0 1 &mpic 5 1
-- 9000 0 0 2 &mpic 6 1
-- 9000 0 0 3 &mpic 7 1
-- 9000 0 0 4 &mpic 4 1
-+ 0x9000 0x0 0x0 0x1 &mpic 0x5 0x1
-+ 0x9000 0x0 0x0 0x2 &mpic 0x6 0x1
-+ 0x9000 0x0 0x0 0x3 &mpic 0x7 0x1
-+ 0x9000 0x0 0x0 0x4 &mpic 0x4 0x1
-
- /* IDSEL 0x13 AD19 */
-- 9800 0 0 1 &mpic 6 1
-- 9800 0 0 2 &mpic 7 1
-- 9800 0 0 3 &mpic 4 1
-- 9800 0 0 4 &mpic 5 1>;
-+ 0x9800 0x0 0x0 0x1 &mpic 0x6 0x1
-+ 0x9800 0x0 0x0 0x2 &mpic 0x7 0x1
-+ 0x9800 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x9800 0x0 0x0 0x4 &mpic 0x5 0x1>;
-
- interrupt-parent = <&mpic>;
-- interrupts = <18 2>;
-- bus-range = <0 ff>;
-- ranges = <02000000 0 80000000 80000000 0 20000000
-- 01000000 0 00000000 e2000000 0 00800000>;
-- clock-frequency = <3f940aa>;
-+ interrupts = <24 2>;
-+ bus-range = <0 255>;
-+ ranges = <0x2000000 0x0 0x80000000 0x80000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xe2000000 0x0 0x800000>;
-+ clock-frequency = <66666666>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e0008000 1000>;
-+ reg = <0xe0008000 0x1000>;
- compatible = "fsl,mpc8540-pci";
- device_type = "pci";
- };
-@@ -435,39 +428,39 @@
- /* PCI Express */
- pci1: pcie@e000a000 {
- cell-index = <2>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
-
- /* IDSEL 0x0 (PEX) */
-- 00000 0 0 1 &mpic 0 1
-- 00000 0 0 2 &mpic 1 1
-- 00000 0 0 3 &mpic 2 1
-- 00000 0 0 4 &mpic 3 1>;
-+ 00000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 00000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 00000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 00000 0x0 0x0 0x4 &mpic 0x3 0x1>;
-
- interrupt-parent = <&mpic>;
-- interrupts = <1a 2>;
-- bus-range = <0 ff>;
-- ranges = <02000000 0 a0000000 a0000000 0 10000000
-- 01000000 0 00000000 e2800000 0 00800000>;
-- clock-frequency = <1fca055>;
-+ interrupts = <26 2>;
-+ bus-range = <0 255>;
-+ ranges = <0x2000000 0x0 0xa0000000 0xa0000000 0x0 0x10000000
-+ 0x1000000 0x0 0x0 0xe2800000 0x0 0x800000>;
-+ clock-frequency = <33333333>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <e000a000 1000>;
-+ reg = <0xe000a000 0x1000>;
- compatible = "fsl,mpc8548-pcie";
- device_type = "pci";
- pcie@0 {
-- reg = <0 0 0 0 0>;
-+ reg = <0x0 0x0 0x0 0x0 0x0>;
- #size-cells = <2>;
- #address-cells = <3>;
- device_type = "pci";
-- ranges = <02000000 0 a0000000
-- 02000000 0 a0000000
-- 0 10000000
--
-- 01000000 0 00000000
-- 01000000 0 00000000
-- 0 00800000>;
-+ ranges = <0x2000000 0x0 0xa0000000
-+ 0x2000000 0x0 0xa0000000
-+ 0x0 0x10000000
-+
-+ 0x1000000 0x0 0x0
-+ 0x1000000 0x0 0x0
-+ 0x0 0x800000>;
- };
- };
- };
---- a/arch/powerpc/boot/dts/mpc8572ds.dts
-+++ b/arch/powerpc/boot/dts/mpc8572ds.dts
-@@ -1,7 +1,7 @@
- /*
- * MPC8572 DS Device Tree Source
- *
-- * Copyright 2007 Freescale Semiconductor Inc.
-+ * Copyright 2007, 2008 Freescale Semiconductor 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
-@@ -9,6 +9,7 @@
- * option) any later version.
- */
-
-+/dts-v1/;
- / {
- model = "fsl,MPC8572DS";
- compatible = "fsl,MPC8572DS";
-@@ -33,11 +34,11 @@
-
- PowerPC,8572@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <20>; // 32 bytes
-- i-cache-line-size = <20>; // 32 bytes
-- d-cache-size = <8000>; // L1, 32K
-- i-cache-size = <8000>; // L1, 32K
-+ reg = <0x0>;
-+ d-cache-line-size = <32>; // 32 bytes
-+ i-cache-line-size = <32>; // 32 bytes
-+ d-cache-size = <0x8000>; // L1, 32K
-+ i-cache-size = <0x8000>; // L1, 32K
- timebase-frequency = <0>;
- bus-frequency = <0>;
- clock-frequency = <0>;
-@@ -45,11 +46,11 @@
-
- PowerPC,8572@1 {
- device_type = "cpu";
-- reg = <1>;
-- d-cache-line-size = <20>; // 32 bytes
-- i-cache-line-size = <20>; // 32 bytes
-- d-cache-size = <8000>; // L1, 32K
-- i-cache-size = <8000>; // L1, 32K
-+ reg = <0x1>;
-+ d-cache-line-size = <32>; // 32 bytes
-+ i-cache-line-size = <32>; // 32 bytes
-+ d-cache-size = <0x8000>; // L1, 32K
-+ i-cache-size = <0x8000>; // L1, 32K
- timebase-frequency = <0>;
- bus-frequency = <0>;
- clock-frequency = <0>;
-@@ -58,38 +59,38 @@
-
- memory {
- device_type = "memory";
-- reg = <00000000 00000000>; // Filled by U-Boot
-+ reg = <0x0 0x0>; // Filled by U-Boot
- };
-
- soc8572@ffe00000 {
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
-- ranges = <00000000 ffe00000 00100000>;
-- reg = <ffe00000 00001000>; // CCSRBAR & soc regs, remove once parse code for immrbase fixed
-+ ranges = <0x0 0xffe00000 0x100000>;
-+ reg = <0xffe00000 0x1000>; // CCSRBAR & soc regs, remove once parse code for immrbase fixed
- bus-frequency = <0>; // Filled out by uboot.
-
- memory-controller@2000 {
- compatible = "fsl,mpc8572-memory-controller";
-- reg = <2000 1000>;
-+ reg = <0x2000 0x1000>;
- interrupt-parent = <&mpic>;
-- interrupts = <12 2>;
-+ interrupts = <18 2>;
- };
-
- memory-controller@6000 {
- compatible = "fsl,mpc8572-memory-controller";
-- reg = <6000 1000>;
-+ reg = <0x6000 0x1000>;
- interrupt-parent = <&mpic>;
-- interrupts = <12 2>;
-+ interrupts = <18 2>;
- };
-
- l2-cache-controller@20000 {
- compatible = "fsl,mpc8572-l2-cache-controller";
-- reg = <20000 1000>;
-- cache-line-size = <20>; // 32 bytes
-- cache-size = <80000>; // L2, 512K
-+ reg = <0x20000 0x1000>;
-+ cache-line-size = <32>; // 32 bytes
-+ cache-size = <0x80000>; // L2, 512K
- interrupt-parent = <&mpic>;
-- interrupts = <10 2>;
-+ interrupts = <16 2>;
- };
-
- i2c@3000 {
-@@ -97,8 +98,8 @@
- #size-cells = <0>;
- cell-index = <0>;
- compatible = "fsl-i2c";
-- reg = <3000 100>;
-- interrupts = <2b 2>;
-+ reg = <0x3000 0x100>;
-+ interrupts = <43 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
- };
-@@ -108,8 +109,8 @@
- #size-cells = <0>;
- cell-index = <1>;
- compatible = "fsl-i2c";
-- reg = <3100 100>;
-- interrupts = <2b 2>;
-+ reg = <0x3100 0x100>;
-+ interrupts = <43 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
- };
-@@ -118,27 +119,27 @@
- #address-cells = <1>;
- #size-cells = <0>;
- compatible = "fsl,gianfar-mdio";
-- reg = <24520 20>;
-+ reg = <0x24520 0x20>;
-
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
-- interrupts = <a 1>;
-- reg = <0>;
-+ interrupts = <10 1>;
-+ reg = <0x0>;
- };
- phy1: ethernet-phy@1 {
- interrupt-parent = <&mpic>;
-- interrupts = <a 1>;
-- reg = <1>;
-+ interrupts = <10 1>;
-+ reg = <0x1>;
- };
- phy2: ethernet-phy@2 {
- interrupt-parent = <&mpic>;
-- interrupts = <a 1>;
-- reg = <2>;
-+ interrupts = <10 1>;
-+ reg = <0x2>;
- };
- phy3: ethernet-phy@3 {
- interrupt-parent = <&mpic>;
-- interrupts = <a 1>;
-- reg = <3>;
-+ interrupts = <10 1>;
-+ reg = <0x3>;
- };
- };
-
-@@ -147,9 +148,9 @@
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-- reg = <24000 1000>;
-+ reg = <0x24000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1d 2 1e 2 22 2>;
-+ interrupts = <29 2 30 2 34 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy0>;
- phy-connection-type = "rgmii-id";
-@@ -160,9 +161,9 @@
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-- reg = <25000 1000>;
-+ reg = <0x25000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <23 2 24 2 28 2>;
-+ interrupts = <35 2 36 2 40 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy1>;
- phy-connection-type = "rgmii-id";
-@@ -173,9 +174,9 @@
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-- reg = <26000 1000>;
-+ reg = <0x26000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1f 2 20 2 21 2>;
-+ interrupts = <31 2 32 2 33 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy2>;
- phy-connection-type = "rgmii-id";
-@@ -186,9 +187,9 @@
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-- reg = <27000 1000>;
-+ reg = <0x27000 0x1000>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <25 2 26 2 27 2>;
-+ interrupts = <37 2 38 2 39 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy3>;
- phy-connection-type = "rgmii-id";
-@@ -198,9 +199,9 @@
- cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4500 100>;
-+ reg = <0x4500 0x100>;
- clock-frequency = <0>;
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
-@@ -208,15 +209,15 @@
- cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
-- reg = <4600 100>;
-+ reg = <0x4600 0x100>;
- clock-frequency = <0>;
-- interrupts = <2a 2>;
-+ interrupts = <42 2>;
- interrupt-parent = <&mpic>;
- };
-
- global-utilities@e0000 { //global utilities block
- compatible = "fsl,mpc8572-guts";
-- reg = <e0000 1000>;
-+ reg = <0xe0000 0x1000>;
- fsl,has-rstcr;
- };
-
-@@ -225,7 +226,7 @@
- interrupt-controller;
- #address-cells = <0>;
- #interrupt-cells = <2>;
-- reg = <40000 40000>;
-+ reg = <0x40000 0x40000>;
- compatible = "chrp,open-pic";
- device_type = "open-pic";
- big-endian;
-@@ -239,167 +240,167 @@
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <ffe08000 1000>;
-- bus-range = <0 ff>;
-- ranges = <02000000 0 80000000 80000000 0 20000000
-- 01000000 0 00000000 ffc00000 0 00010000>;
-- clock-frequency = <1fca055>;
-+ reg = <0xffe08000 0x1000>;
-+ bus-range = <0 255>;
-+ ranges = <0x2000000 0x0 0x80000000 0x80000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xffc00000 0x0 0x10000>;
-+ clock-frequency = <33333333>;
- interrupt-parent = <&mpic>;
-- interrupts = <18 2>;
-- interrupt-map-mask = <ff00 0 0 7>;
-+ interrupts = <24 2>;
-+ interrupt-map-mask = <0xff00 0x0 0x0 0x7>;
- interrupt-map = <
- /* IDSEL 0x11 func 0 - PCI slot 1 */
-- 8800 0 0 1 &mpic 2 1
-- 8800 0 0 2 &mpic 3 1
-- 8800 0 0 3 &mpic 4 1
-- 8800 0 0 4 &mpic 1 1
-+ 0x8800 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x8800 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x8800 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x8800 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x11 func 1 - PCI slot 1 */
-- 8900 0 0 1 &mpic 2 1
-- 8900 0 0 2 &mpic 3 1
-- 8900 0 0 3 &mpic 4 1
-- 8900 0 0 4 &mpic 1 1
-+ 0x8900 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x8900 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x8900 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x8900 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x11 func 2 - PCI slot 1 */
-- 8a00 0 0 1 &mpic 2 1
-- 8a00 0 0 2 &mpic 3 1
-- 8a00 0 0 3 &mpic 4 1
-- 8a00 0 0 4 &mpic 1 1
-+ 0x8a00 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x8a00 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x8a00 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x8a00 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x11 func 3 - PCI slot 1 */
-- 8b00 0 0 1 &mpic 2 1
-- 8b00 0 0 2 &mpic 3 1
-- 8b00 0 0 3 &mpic 4 1
-- 8b00 0 0 4 &mpic 1 1
-+ 0x8b00 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x8b00 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x8b00 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x8b00 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x11 func 4 - PCI slot 1 */
-- 8c00 0 0 1 &mpic 2 1
-- 8c00 0 0 2 &mpic 3 1
-- 8c00 0 0 3 &mpic 4 1
-- 8c00 0 0 4 &mpic 1 1
-+ 0x8c00 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x8c00 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x8c00 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x8c00 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x11 func 5 - PCI slot 1 */
-- 8d00 0 0 1 &mpic 2 1
-- 8d00 0 0 2 &mpic 3 1
-- 8d00 0 0 3 &mpic 4 1
-- 8d00 0 0 4 &mpic 1 1
-+ 0x8d00 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x8d00 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x8d00 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x8d00 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x11 func 6 - PCI slot 1 */
-- 8e00 0 0 1 &mpic 2 1
-- 8e00 0 0 2 &mpic 3 1
-- 8e00 0 0 3 &mpic 4 1
-- 8e00 0 0 4 &mpic 1 1
-+ 0x8e00 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x8e00 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x8e00 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x8e00 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x11 func 7 - PCI slot 1 */
-- 8f00 0 0 1 &mpic 2 1
-- 8f00 0 0 2 &mpic 3 1
-- 8f00 0 0 3 &mpic 4 1
-- 8f00 0 0 4 &mpic 1 1
-+ 0x8f00 0x0 0x0 0x1 &mpic 0x2 0x1
-+ 0x8f00 0x0 0x0 0x2 &mpic 0x3 0x1
-+ 0x8f00 0x0 0x0 0x3 &mpic 0x4 0x1
-+ 0x8f00 0x0 0x0 0x4 &mpic 0x1 0x1
-
- /* IDSEL 0x12 func 0 - PCI slot 2 */
-- 9000 0 0 1 &mpic 3 1
-- 9000 0 0 2 &mpic 4 1
-- 9000 0 0 3 &mpic 1 1
-- 9000 0 0 4 &mpic 2 1
-+ 0x9000 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x9000 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x9000 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x9000 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 0x12 func 1 - PCI slot 2 */
-- 9100 0 0 1 &mpic 3 1
-- 9100 0 0 2 &mpic 4 1
-- 9100 0 0 3 &mpic 1 1
-- 9100 0 0 4 &mpic 2 1
-+ 0x9100 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x9100 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x9100 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x9100 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 0x12 func 2 - PCI slot 2 */
-- 9200 0 0 1 &mpic 3 1
-- 9200 0 0 2 &mpic 4 1
-- 9200 0 0 3 &mpic 1 1
-- 9200 0 0 4 &mpic 2 1
-+ 0x9200 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x9200 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x9200 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x9200 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 0x12 func 3 - PCI slot 2 */
-- 9300 0 0 1 &mpic 3 1
-- 9300 0 0 2 &mpic 4 1
-- 9300 0 0 3 &mpic 1 1
-- 9300 0 0 4 &mpic 2 1
-+ 0x9300 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x9300 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x9300 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x9300 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 0x12 func 4 - PCI slot 2 */
-- 9400 0 0 1 &mpic 3 1
-- 9400 0 0 2 &mpic 4 1
-- 9400 0 0 3 &mpic 1 1
-- 9400 0 0 4 &mpic 2 1
-+ 0x9400 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x9400 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x9400 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x9400 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 0x12 func 5 - PCI slot 2 */
-- 9500 0 0 1 &mpic 3 1
-- 9500 0 0 2 &mpic 4 1
-- 9500 0 0 3 &mpic 1 1
-- 9500 0 0 4 &mpic 2 1
-+ 0x9500 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x9500 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x9500 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x9500 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 0x12 func 6 - PCI slot 2 */
-- 9600 0 0 1 &mpic 3 1
-- 9600 0 0 2 &mpic 4 1
-- 9600 0 0 3 &mpic 1 1
-- 9600 0 0 4 &mpic 2 1
-+ 0x9600 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x9600 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x9600 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x9600 0x0 0x0 0x4 &mpic 0x2 0x1
-
- /* IDSEL 0x12 func 7 - PCI slot 2 */
-- 9700 0 0 1 &mpic 3 1
-- 9700 0 0 2 &mpic 4 1
-- 9700 0 0 3 &mpic 1 1
-- 9700 0 0 4 &mpic 2 1
-+ 0x9700 0x0 0x0 0x1 &mpic 0x3 0x1
-+ 0x9700 0x0 0x0 0x2 &mpic 0x4 0x1
-+ 0x9700 0x0 0x0 0x3 &mpic 0x1 0x1
-+ 0x9700 0x0 0x0 0x4 &mpic 0x2 0x1
-
- // IDSEL 0x1c USB
-- e000 0 0 1 &i8259 c 2
-- e100 0 0 2 &i8259 9 2
-- e200 0 0 3 &i8259 a 2
-- e300 0 0 4 &i8259 b 2
-+ 0xe000 0x0 0x0 0x1 &i8259 0xc 0x2
-+ 0xe100 0x0 0x0 0x2 &i8259 0x9 0x2
-+ 0xe200 0x0 0x0 0x3 &i8259 0xa 0x2
-+ 0xe300 0x0 0x0 0x4 &i8259 0xb 0x2
-
- // IDSEL 0x1d Audio
-- e800 0 0 1 &i8259 6 2
-+ 0xe800 0x0 0x0 0x1 &i8259 0x6 0x2
-
- // IDSEL 0x1e Legacy
-- f000 0 0 1 &i8259 7 2
-- f100 0 0 1 &i8259 7 2
-+ 0xf000 0x0 0x0 0x1 &i8259 0x7 0x2
-+ 0xf100 0x0 0x0 0x1 &i8259 0x7 0x2
-
- // IDSEL 0x1f IDE/SATA
-- f800 0 0 1 &i8259 e 2
-- f900 0 0 1 &i8259 5 2
-+ 0xf800 0x0 0x0 0x1 &i8259 0xe 0x2
-+ 0xf900 0x0 0x0 0x1 &i8259 0x5 0x2
-
- >;
-
- pcie@0 {
-- reg = <0 0 0 0 0>;
-+ reg = <0x0 0x0 0x0 0x0 0x0>;
- #size-cells = <2>;
- #address-cells = <3>;
- device_type = "pci";
-- ranges = <02000000 0 80000000
-- 02000000 0 80000000
-- 0 20000000
--
-- 01000000 0 00000000
-- 01000000 0 00000000
-- 0 00100000>;
-+ ranges = <0x2000000 0x0 0x80000000
-+ 0x2000000 0x0 0x80000000
-+ 0x0 0x20000000
-+
-+ 0x1000000 0x0 0x0
-+ 0x1000000 0x0 0x0
-+ 0x0 0x100000>;
- uli1575@0 {
-- reg = <0 0 0 0 0>;
-+ reg = <0x0 0x0 0x0 0x0 0x0>;
- #size-cells = <2>;
- #address-cells = <3>;
-- ranges = <02000000 0 80000000
-- 02000000 0 80000000
-- 0 20000000
--
-- 01000000 0 00000000
-- 01000000 0 00000000
-- 0 00100000>;
-+ ranges = <0x2000000 0x0 0x80000000
-+ 0x2000000 0x0 0x80000000
-+ 0x0 0x20000000
-+
-+ 0x1000000 0x0 0x0
-+ 0x1000000 0x0 0x0
-+ 0x0 0x100000>;
- isa@1e {
- device_type = "isa";
- #interrupt-cells = <2>;
- #size-cells = <1>;
- #address-cells = <2>;
-- reg = <f000 0 0 0 0>;
-- ranges = <1 0 01000000 0 0
-- 00001000>;
-+ reg = <0xf000 0x0 0x0 0x0 0x0>;
-+ ranges = <0x1 0x0 0x1000000 0x0 0x0
-+ 0x1000>;
- interrupt-parent = <&i8259>;
-
- i8259: interrupt-controller@20 {
-- reg = <1 20 2
-- 1 a0 2
-- 1 4d0 2>;
-+ reg = <0x1 0x20 0x2
-+ 0x1 0xa0 0x2
-+ 0x1 0x4d0 0x2>;
- interrupt-controller;
- device_type = "interrupt-controller";
- #address-cells = <0>;
-@@ -412,29 +413,29 @@
- i8042@60 {
- #size-cells = <0>;
- #address-cells = <1>;
-- reg = <1 60 1 1 64 1>;
-- interrupts = <1 3 c 3>;
-+ reg = <0x1 0x60 0x1 0x1 0x64 0x1>;
-+ interrupts = <1 3 12 3>;
- interrupt-parent =
- <&i8259>;
-
- keyboard@0 {
-- reg = <0>;
-+ reg = <0x0>;
- compatible = "pnpPNP,303";
- };
-
- mouse@1 {
-- reg = <1>;
-+ reg = <0x1>;
- compatible = "pnpPNP,f03";
- };
- };
-
- rtc@70 {
- compatible = "pnpPNP,b00";
-- reg = <1 70 2>;
-+ reg = <0x1 0x70 0x2>;
- };
-
- gpio@400 {
-- reg = <1 400 80>;
-+ reg = <0x1 0x400 0x80>;
- };
- };
- };
-@@ -449,33 +450,33 @@
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <ffe09000 1000>;
-- bus-range = <0 ff>;
-- ranges = <02000000 0 a0000000 a0000000 0 20000000
-- 01000000 0 00000000 ffc10000 0 00010000>;
-- clock-frequency = <1fca055>;
-+ reg = <0xffe09000 0x1000>;
-+ bus-range = <0 255>;
-+ ranges = <0x2000000 0x0 0xa0000000 0xa0000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xffc10000 0x0 0x10000>;
-+ clock-frequency = <33333333>;
- interrupt-parent = <&mpic>;
-- interrupts = <1a 2>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupts = <26 2>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
- /* IDSEL 0x0 */
-- 0000 0 0 1 &mpic 4 1
-- 0000 0 0 2 &mpic 5 1
-- 0000 0 0 3 &mpic 6 1
-- 0000 0 0 4 &mpic 7 1
-+ 0000 0x0 0x0 0x1 &mpic 0x4 0x1
-+ 0000 0x0 0x0 0x2 &mpic 0x5 0x1
-+ 0000 0x0 0x0 0x3 &mpic 0x6 0x1
-+ 0000 0x0 0x0 0x4 &mpic 0x7 0x1
- >;
- pcie@0 {
-- reg = <0 0 0 0 0>;
-+ reg = <0x0 0x0 0x0 0x0 0x0>;
- #size-cells = <2>;
- #address-cells = <3>;
- device_type = "pci";
-- ranges = <02000000 0 a0000000
-- 02000000 0 a0000000
-- 0 20000000
--
-- 01000000 0 00000000
-- 01000000 0 00000000
-- 0 00100000>;
-+ ranges = <0x2000000 0x0 0xa0000000
-+ 0x2000000 0x0 0xa0000000
-+ 0x0 0x20000000
-+
-+ 0x1000000 0x0 0x0
-+ 0x1000000 0x0 0x0
-+ 0x0 0x100000>;
- };
- };
-
-@@ -486,33 +487,33 @@
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- reg = <ffe0a000 1000>;
-- bus-range = <0 ff>;
-- ranges = <02000000 0 c0000000 c0000000 0 20000000
-- 01000000 0 00000000 ffc20000 0 00010000>;
-- clock-frequency = <1fca055>;
-+ reg = <0xffe0a000 0x1000>;
-+ bus-range = <0 255>;
-+ ranges = <0x2000000 0x0 0xc0000000 0xc0000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xffc20000 0x0 0x10000>;
-+ clock-frequency = <33333333>;
- interrupt-parent = <&mpic>;
-- interrupts = <1b 2>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ interrupts = <27 2>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
- /* IDSEL 0x0 */
-- 0000 0 0 1 &mpic 0 1
-- 0000 0 0 2 &mpic 1 1
-- 0000 0 0 3 &mpic 2 1
-- 0000 0 0 4 &mpic 3 1
-+ 0000 0x0 0x0 0x1 &mpic 0x0 0x1
-+ 0000 0x0 0x0 0x2 &mpic 0x1 0x1
-+ 0000 0x0 0x0 0x3 &mpic 0x2 0x1
-+ 0000 0x0 0x0 0x4 &mpic 0x3 0x1
- >;
- pcie@0 {
-- reg = <0 0 0 0 0>;
-+ reg = <0x0 0x0 0x0 0x0 0x0>;
- #size-cells = <2>;
- #address-cells = <3>;
- device_type = "pci";
-- ranges = <02000000 0 c0000000
-- 02000000 0 c0000000
-- 0 20000000
--
-- 01000000 0 00000000
-- 01000000 0 00000000
-- 0 00100000>;
-+ ranges = <0x2000000 0x0 0xc0000000
-+ 0x2000000 0x0 0xc0000000
-+ 0x0 0x20000000
-+
-+ 0x1000000 0x0 0x0
-+ 0x1000000 0x0 0x0
-+ 0x0 0x100000>;
- };
- };
- };
---- a/arch/powerpc/boot/dts/mpc8641_hpcn.dts
-+++ b/arch/powerpc/boot/dts/mpc8641_hpcn.dts
-@@ -13,7 +13,7 @@
-
- / {
- model = "MPC8641HPCN";
-- compatible = "mpc86xx";
-+ compatible = "fsl,mpc8641hpcn";
- #address-cells = <1>;
- #size-cells = <1>;
-
---- a/arch/powerpc/boot/dts/mpc866ads.dts
-+++ b/arch/powerpc/boot/dts/mpc866ads.dts
-@@ -2,6 +2,7 @@
- * MPC866 ADS Device Tree Source
- *
- * Copyright 2006 MontaVista Software, Inc.
-+ * Copyright 2008 Freescale Semiconductor, 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
-@@ -9,6 +10,7 @@
- * option) any later version.
- */
-
-+/dts-v1/;
-
- / {
- model = "MPC866ADS";
-@@ -22,37 +24,37 @@
-
- PowerPC,866@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <10>; // 16 bytes
-- i-cache-line-size = <10>; // 16 bytes
-- d-cache-size = <2000>; // L1, 8K
-- i-cache-size = <4000>; // L1, 16K
-+ reg = <0x0>;
-+ d-cache-line-size = <16>; // 16 bytes
-+ i-cache-line-size = <16>; // 16 bytes
-+ d-cache-size = <0x2000>; // L1, 8K
-+ i-cache-size = <0x4000>; // L1, 16K
- timebase-frequency = <0>;
- bus-frequency = <0>;
- clock-frequency = <0>;
-- interrupts = <f 2>; // decrementer interrupt
-+ interrupts = <15 2>; // decrementer interrupt
- interrupt-parent = <&PIC>;
- };
- };
-
- memory {
- device_type = "memory";
-- reg = <00000000 800000>;
-+ reg = <0x0 0x800000>;
- };
-
- localbus@ff000100 {
- compatible = "fsl,mpc866-localbus", "fsl,pq1-localbus";
- #address-cells = <2>;
- #size-cells = <1>;
-- reg = <ff000100 40>;
-+ reg = <0xff000100 0x40>;
-
- ranges = <
-- 1 0 ff080000 00008000
-- 5 0 ff0a0000 00008000
-+ 0x1 0x0 0xff080000 0x8000
-+ 0x5 0x0 0xff0a0000 0x8000
- >;
-
- board-control@1,0 {
-- reg = <1 0 20 5 300 4>;
-+ reg = <0x1 0x0 0x20 0x5 0x300 0x4>;
- compatible = "fsl,mpc866ads-bcsr";
- };
- };
-@@ -61,17 +63,17 @@
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
-- ranges = <0 ff000000 00100000>;
-- reg = <ff000000 00000200>;
-+ ranges = <0x0 0xff000000 0x100000>;
-+ reg = <0xff000000 0x200>;
- bus-frequency = <0>;
-
- mdio@e00 {
- compatible = "fsl,mpc866-fec-mdio", "fsl,pq1-fec-mdio";
-- reg = <e00 188>;
-+ reg = <0xe00 0x188>;
- #address-cells = <1>;
- #size-cells = <0>;
- PHY: ethernet-phy@f {
-- reg = <f>;
-+ reg = <0xf>;
- device_type = "ethernet-phy";
- };
- };
-@@ -80,7 +82,7 @@
- device_type = "network";
- compatible = "fsl,mpc866-fec-enet",
- "fsl,pq1-fec-enet";
-- reg = <e00 188>;
-+ reg = <0xe00 0x188>;
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <3 1>;
- interrupt-parent = <&PIC>;
-@@ -91,7 +93,7 @@
- PIC: pic@0 {
- interrupt-controller;
- #interrupt-cells = <2>;
-- reg = <0 24>;
-+ reg = <0x0 0x24>;
- compatible = "fsl,mpc866-pic", "fsl,pq1-pic";
- };
-
-@@ -100,7 +102,7 @@
- #size-cells = <1>;
- compatible = "fsl,mpc866-cpm", "fsl,cpm1";
- ranges;
-- reg = <9c0 40>;
-+ reg = <0x9c0 0x40>;
- brg-frequency = <0>;
- interrupts = <0 2>; // cpm error interrupt
- interrupt-parent = <&CPM_PIC>;
-@@ -108,11 +110,11 @@
- muram@2000 {
- #address-cells = <1>;
- #size-cells = <1>;
-- ranges = <0 2000 2000>;
-+ ranges = <0x0 0x2000 0x2000>;
-
- data@0 {
- compatible = "fsl,cpm-muram-data";
-- reg = <0 1c00>;
-+ reg = <0x0 0x1c00>;
- };
- };
-
-@@ -120,7 +122,7 @@
- compatible = "fsl,mpc866-brg",
- "fsl,cpm1-brg",
- "fsl,cpm-brg";
-- reg = <9f0 10>;
-+ reg = <0x9f0 0x10>;
- clock-frequency = <0>;
- };
-
-@@ -130,7 +132,7 @@
- #interrupt-cells = <1>;
- interrupts = <5 2 0 2>;
- interrupt-parent = <&PIC>;
-- reg = <930 20>;
-+ reg = <0x930 0x20>;
- compatible = "fsl,mpc866-cpm-pic",
- "fsl,cpm1-pic";
- };
-@@ -140,31 +142,31 @@
- device_type = "serial";
- compatible = "fsl,mpc866-smc-uart",
- "fsl,cpm1-smc-uart";
-- reg = <a80 10 3e80 40>;
-+ reg = <0xa80 0x10 0x3e80 0x40>;
- interrupts = <4>;
- interrupt-parent = <&CPM_PIC>;
- fsl,cpm-brg = <1>;
-- fsl,cpm-command = <0090>;
-+ fsl,cpm-command = <0x90>;
- };
-
- serial@a90 {
- device_type = "serial";
- compatible = "fsl,mpc866-smc-uart",
- "fsl,cpm1-smc-uart";
-- reg = <a90 10 3f80 40>;
-+ reg = <0xa90 0x10 0x3f80 0x40>;
- interrupts = <3>;
- interrupt-parent = <&CPM_PIC>;
- fsl,cpm-brg = <2>;
-- fsl,cpm-command = <00d0>;
-+ fsl,cpm-command = <0xd0>;
- };
-
- ethernet@a00 {
- device_type = "network";
- compatible = "fsl,mpc866-scc-enet",
- "fsl,cpm1-scc-enet";
-- reg = <a00 18 3c00 100>;
-+ reg = <0xa00 0x18 0x3c00 0x100>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1e>;
-+ interrupts = <30>;
- interrupt-parent = <&CPM_PIC>;
- fsl,cpm-command = <0000>;
- linux,network-index = <1>;
---- a/arch/powerpc/boot/dts/mpc885ads.dts
-+++ b/arch/powerpc/boot/dts/mpc885ads.dts
-@@ -2,7 +2,7 @@
- * MPC885 ADS Device Tree Source
- *
- * Copyright 2006 MontaVista Software, Inc.
-- * Copyright 2007 Freescale Semiconductor, Inc.
-+ * Copyright 2007,2008 Freescale Semiconductor, 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
-@@ -10,6 +10,7 @@
- * option) any later version.
- */
-
-+/dts-v1/;
-
- / {
- model = "MPC885ADS";
-@@ -23,45 +24,45 @@
-
- PowerPC,885@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <d#16>;
-- i-cache-line-size = <d#16>;
-- d-cache-size = <d#8192>;
-- i-cache-size = <d#8192>;
-+ reg = <0x0>;
-+ d-cache-line-size = <16>;
-+ i-cache-line-size = <16>;
-+ d-cache-size = <8192>;
-+ i-cache-size = <8192>;
- timebase-frequency = <0>;
- bus-frequency = <0>;
- clock-frequency = <0>;
-- interrupts = <f 2>; // decrementer interrupt
-+ interrupts = <15 2>; // decrementer interrupt
- interrupt-parent = <&PIC>;
- };
- };
-
- memory {
- device_type = "memory";
-- reg = <0 0>;
-+ reg = <0x0 0x0>;
- };
-
- localbus@ff000100 {
- compatible = "fsl,mpc885-localbus", "fsl,pq1-localbus";
- #address-cells = <2>;
- #size-cells = <1>;
-- reg = <ff000100 40>;
-+ reg = <0xff000100 0x40>;
-
- ranges = <
-- 0 0 fe000000 00800000
-- 1 0 ff080000 00008000
-- 5 0 ff0a0000 00008000
-+ 0x0 0x0 0xfe000000 0x800000
-+ 0x1 0x0 0xff080000 0x8000
-+ 0x5 0x0 0xff0a0000 0x8000
- >;
-
- flash@0,0 {
- compatible = "jedec-flash";
-- reg = <0 0 800000>;
-+ reg = <0x0 0x0 0x800000>;
- bank-width = <4>;
- device-width = <1>;
- };
-
- board-control@1,0 {
-- reg = <1 0 20 5 300 4>;
-+ reg = <0x1 0x0 0x20 0x5 0x300 0x4>;
- compatible = "fsl,mpc885ads-bcsr";
- };
- };
-@@ -71,30 +72,30 @@
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
-- ranges = <0 ff000000 00004000>;
-+ ranges = <0x0 0xff000000 0x4000>;
- bus-frequency = <0>;
-
- // Temporary -- will go away once kernel uses ranges for get_immrbase().
-- reg = <ff000000 4000>;
-+ reg = <0xff000000 0x4000>;
-
- mdio@e00 {
- compatible = "fsl,mpc885-fec-mdio", "fsl,pq1-fec-mdio";
-- reg = <e00 188>;
-+ reg = <0xe00 0x188>;
- #address-cells = <1>;
- #size-cells = <0>;
-
- PHY0: ethernet-phy@0 {
-- reg = <0>;
-+ reg = <0x0>;
- device_type = "ethernet-phy";
- };
-
- PHY1: ethernet-phy@1 {
-- reg = <1>;
-+ reg = <0x1>;
- device_type = "ethernet-phy";
- };
-
- PHY2: ethernet-phy@2 {
-- reg = <2>;
-+ reg = <0x2>;
- device_type = "ethernet-phy";
- };
- };
-@@ -103,7 +104,7 @@
- device_type = "network";
- compatible = "fsl,mpc885-fec-enet",
- "fsl,pq1-fec-enet";
-- reg = <e00 188>;
-+ reg = <0xe00 0x188>;
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <3 1>;
- interrupt-parent = <&PIC>;
-@@ -115,7 +116,7 @@
- device_type = "network";
- compatible = "fsl,mpc885-fec-enet",
- "fsl,pq1-fec-enet";
-- reg = <1e00 188>;
-+ reg = <0x1e00 0x188>;
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <7 1>;
- interrupt-parent = <&PIC>;
-@@ -126,7 +127,7 @@
- PIC: interrupt-controller@0 {
- interrupt-controller;
- #interrupt-cells = <2>;
-- reg = <0 24>;
-+ reg = <0x0 0x24>;
- compatible = "fsl,mpc885-pic", "fsl,pq1-pic";
- };
-
-@@ -136,29 +137,29 @@
- #size-cells = <2>;
- compatible = "fsl,pq-pcmcia";
- device_type = "pcmcia";
-- reg = <80 80>;
-+ reg = <0x80 0x80>;
- interrupt-parent = <&PIC>;
-- interrupts = <d 1>;
-+ interrupts = <13 1>;
- };
-
- cpm@9c0 {
- #address-cells = <1>;
- #size-cells = <1>;
- compatible = "fsl,mpc885-cpm", "fsl,cpm1";
-- command-proc = <9c0>;
-+ command-proc = <0x9c0>;
- interrupts = <0>; // cpm error interrupt
- interrupt-parent = <&CPM_PIC>;
-- reg = <9c0 40>;
-+ reg = <0x9c0 0x40>;
- ranges;
-
- muram@2000 {
- #address-cells = <1>;
- #size-cells = <1>;
-- ranges = <0 2000 2000>;
-+ ranges = <0x0 0x2000 0x2000>;
-
- data@0 {
- compatible = "fsl,cpm-muram-data";
-- reg = <0 1c00>;
-+ reg = <0x0 0x1c00>;
- };
- };
-
-@@ -167,7 +168,7 @@
- "fsl,cpm1-brg",
- "fsl,cpm-brg";
- clock-frequency = <0>;
-- reg = <9f0 10>;
-+ reg = <0x9f0 0x10>;
- };
-
- CPM_PIC: interrupt-controller@930 {
-@@ -175,7 +176,7 @@
- #interrupt-cells = <1>;
- interrupts = <5 2 0 2>;
- interrupt-parent = <&PIC>;
-- reg = <930 20>;
-+ reg = <0x930 0x20>;
- compatible = "fsl,mpc885-cpm-pic",
- "fsl,cpm1-pic";
- };
-@@ -184,34 +185,34 @@
- device_type = "serial";
- compatible = "fsl,mpc885-smc-uart",
- "fsl,cpm1-smc-uart";
-- reg = <a80 10 3e80 40>;
-+ reg = <0xa80 0x10 0x3e80 0x40>;
- interrupts = <4>;
- interrupt-parent = <&CPM_PIC>;
- fsl,cpm-brg = <1>;
-- fsl,cpm-command = <0090>;
-+ fsl,cpm-command = <0x90>;
- };
-
- serial@a90 {
- device_type = "serial";
- compatible = "fsl,mpc885-smc-uart",
- "fsl,cpm1-smc-uart";
-- reg = <a90 10 3f80 40>;
-+ reg = <0xa90 0x10 0x3f80 0x40>;
- interrupts = <3>;
- interrupt-parent = <&CPM_PIC>;
- fsl,cpm-brg = <2>;
-- fsl,cpm-command = <00d0>;
-+ fsl,cpm-command = <0xd0>;
- };
-
- ethernet@a40 {
- device_type = "network";
- compatible = "fsl,mpc885-scc-enet",
- "fsl,cpm1-scc-enet";
-- reg = <a40 18 3e00 100>;
-+ reg = <0xa40 0x18 0x3e00 0x100>;
- local-mac-address = [ 00 00 00 00 00 00 ];
-- interrupts = <1c>;
-+ interrupts = <28>;
- interrupt-parent = <&CPM_PIC>;
- phy-handle = <&PHY2>;
-- fsl,cpm-command = <0080>;
-+ fsl,cpm-command = <0x80>;
- linux,network-index = <2>;
- };
- };
---- a/arch/powerpc/boot/dts/pq2fads.dts
-+++ b/arch/powerpc/boot/dts/pq2fads.dts
-@@ -1,7 +1,7 @@
- /*
- * Device Tree for the PQ2FADS-ZU board with an MPC8280 chip.
- *
-- * Copyright 2007 Freescale Semiconductor Inc.
-+ * Copyright 2007,2008 Freescale Semiconductor 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
-@@ -9,6 +9,8 @@
- * option) any later version.
- */
-
-+/dts-v1/;
-+
- / {
- model = "pq2fads";
- compatible = "fsl,pq2fads";
-@@ -21,11 +23,11 @@
-
- cpu@0 {
- device_type = "cpu";
-- reg = <0>;
-- d-cache-line-size = <d#32>;
-- i-cache-line-size = <d#32>;
-- d-cache-size = <d#16384>;
-- i-cache-size = <d#16384>;
-+ reg = <0x0>;
-+ d-cache-line-size = <32>;
-+ i-cache-line-size = <32>;
-+ d-cache-size = <16384>;
-+ i-cache-size = <16384>;
- timebase-frequency = <0>;
- clock-frequency = <0>;
- };
-@@ -33,7 +35,7 @@
-
- memory {
- device_type = "memory";
-- reg = <0 0>;
-+ reg = <0x0 0x0>;
- };
-
- localbus@f0010100 {
-@@ -41,67 +43,67 @@
- "fsl,pq2-localbus";
- #address-cells = <2>;
- #size-cells = <1>;
-- reg = <f0010100 60>;
-+ reg = <0xf0010100 0x60>;
-
-- ranges = <0 0 fe000000 00800000
-- 1 0 f4500000 00008000
-- 8 0 f8200000 00008000>;
-+ ranges = <0x0 0x0 0xfe000000 0x800000
-+ 0x1 0x0 0xf4500000 0x8000
-+ 0x8 0x0 0xf8200000 0x8000>;
-
- flash@0,0 {
- compatible = "jedec-flash";
-- reg = <0 0 800000>;
-+ reg = <0x0 0x0 0x800000>;
- bank-width = <4>;
- device-width = <1>;
- };
-
- bcsr@1,0 {
-- reg = <1 0 20>;
-+ reg = <0x1 0x0 0x20>;
- compatible = "fsl,pq2fads-bcsr";
- };
-
- PCI_PIC: pic@8,0 {
- #interrupt-cells = <1>;
- interrupt-controller;
-- reg = <8 0 8>;
-+ reg = <0x8 0x0 0x8>;
- compatible = "fsl,pq2ads-pci-pic";
- interrupt-parent = <&PIC>;
-- interrupts = <18 8>;
-+ interrupts = <24 8>;
- };
- };
-
- pci@f0010800 {
- device_type = "pci";
-- reg = <f0010800 10c f00101ac 8 f00101c4 8>;
-+ reg = <0xf0010800 0x10c 0xf00101ac 0x8 0xf00101c4 0x8>;
- compatible = "fsl,mpc8280-pci", "fsl,pq2-pci";
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
-- clock-frequency = <d#66000000>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ clock-frequency = <66000000>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
- /* IDSEL 0x16 */
-- b000 0 0 1 &PCI_PIC 0
-- b000 0 0 2 &PCI_PIC 1
-- b000 0 0 3 &PCI_PIC 2
-- b000 0 0 4 &PCI_PIC 3
-+ 0xb000 0x0 0x0 0x1 &PCI_PIC 0
-+ 0xb000 0x0 0x0 0x2 &PCI_PIC 1
-+ 0xb000 0x0 0x0 0x3 &PCI_PIC 2
-+ 0xb000 0x0 0x0 0x4 &PCI_PIC 3
-
- /* IDSEL 0x17 */
-- b800 0 0 1 &PCI_PIC 4
-- b800 0 0 2 &PCI_PIC 5
-- b800 0 0 3 &PCI_PIC 6
-- b800 0 0 4 &PCI_PIC 7
-+ 0xb800 0x0 0x0 0x1 &PCI_PIC 4
-+ 0xb800 0x0 0x0 0x2 &PCI_PIC 5
-+ 0xb800 0x0 0x0 0x3 &PCI_PIC 6
-+ 0xb800 0x0 0x0 0x4 &PCI_PIC 7
-
- /* IDSEL 0x18 */
-- c000 0 0 1 &PCI_PIC 8
-- c000 0 0 2 &PCI_PIC 9
-- c000 0 0 3 &PCI_PIC a
-- c000 0 0 4 &PCI_PIC b>;
-+ 0xc000 0x0 0x0 0x1 &PCI_PIC 8
-+ 0xc000 0x0 0x0 0x2 &PCI_PIC 9
-+ 0xc000 0x0 0x0 0x3 &PCI_PIC 10
-+ 0xc000 0x0 0x0 0x4 &PCI_PIC 11>;
-
- interrupt-parent = <&PIC>;
-- interrupts = <12 8>;
-- ranges = <42000000 0 80000000 80000000 0 20000000
-- 02000000 0 a0000000 a0000000 0 20000000
-- 01000000 0 00000000 f6000000 0 02000000>;
-+ interrupts = <18 8>;
-+ ranges = <0x42000000 0x0 0x80000000 0x80000000 0x0 0x20000000
-+ 0x2000000 0x0 0xa0000000 0xa0000000 0x0 0x20000000
-+ 0x1000000 0x0 0x0 0xf6000000 0x0 0x2000000>;
- };
-
- soc@f0000000 {
-@@ -109,27 +111,27 @@
- #size-cells = <1>;
- device_type = "soc";
- compatible = "fsl,mpc8280", "fsl,pq2-soc";
-- ranges = <00000000 f0000000 00053000>;
-+ ranges = <0x0 0xf0000000 0x53000>;
-
- // Temporary -- will go away once kernel uses ranges for get_immrbase().
-- reg = <f0000000 00053000>;
-+ reg = <0xf0000000 0x53000>;
-
- cpm@119c0 {
- #address-cells = <1>;
- #size-cells = <1>;
- #interrupt-cells = <2>;
- compatible = "fsl,mpc8280-cpm", "fsl,cpm2";
-- reg = <119c0 30>;
-+ reg = <0x119c0 0x30>;
- ranges;
-
- muram@0 {
- #address-cells = <1>;
- #size-cells = <1>;
-- ranges = <0 0 10000>;
-+ ranges = <0x0 0x0 0x10000>;
-
- data@0 {
- compatible = "fsl,cpm-muram-data";
-- reg = <0 2000 9800 800>;
-+ reg = <0x0 0x2000 0x9800 0x800>;
- };
- };
-
-@@ -137,53 +139,53 @@
- compatible = "fsl,mpc8280-brg",
- "fsl,cpm2-brg",
- "fsl,cpm-brg";
-- reg = <119f0 10 115f0 10>;
-+ reg = <0x119f0 0x10 0x115f0 0x10>;
- };
-
- serial@11a00 {
- device_type = "serial";
- compatible = "fsl,mpc8280-scc-uart",
- "fsl,cpm2-scc-uart";
-- reg = <11a00 20 8000 100>;
-- interrupts = <28 8>;
-+ reg = <0x11a00 0x20 0x8000 0x100>;
-+ interrupts = <40 8>;
- interrupt-parent = <&PIC>;
- fsl,cpm-brg = <1>;
-- fsl,cpm-command = <00800000>;
-+ fsl,cpm-command = <0x800000>;
- };
-
- serial@11a20 {
- device_type = "serial";
- compatible = "fsl,mpc8280-scc-uart",
- "fsl,cpm2-scc-uart";
-- reg = <11a20 20 8100 100>;
-- interrupts = <29 8>;
-+ reg = <0x11a20 0x20 0x8100 0x100>;
-+ interrupts = <41 8>;
- interrupt-parent = <&PIC>;
- fsl,cpm-brg = <2>;
-- fsl,cpm-command = <04a00000>;
-+ fsl,cpm-command = <0x4a00000>;
- };
-
- ethernet@11320 {
- device_type = "network";
- compatible = "fsl,mpc8280-fcc-enet",
- "fsl,cpm2-fcc-enet";
-- reg = <11320 20 8500 100 113b0 1>;
-- interrupts = <21 8>;
-+ reg = <0x11320 0x20 0x8500 0x100 0x113b0 0x1>;
-+ interrupts = <33 8>;
- interrupt-parent = <&PIC>;
- phy-handle = <&PHY0>;
- linux,network-index = <0>;
-- fsl,cpm-command = <16200300>;
-+ fsl,cpm-command = <0x16200300>;
- };
-
- ethernet@11340 {
- device_type = "network";
- compatible = "fsl,mpc8280-fcc-enet",
- "fsl,cpm2-fcc-enet";
-- reg = <11340 20 8600 100 113d0 1>;
-- interrupts = <22 8>;
-+ reg = <0x11340 0x20 0x8600 0x100 0x113d0 0x1>;
-+ interrupts = <34 8>;
- interrupt-parent = <&PIC>;
- phy-handle = <&PHY1>;
- linux,network-index = <1>;
-- fsl,cpm-command = <1a400300>;
-+ fsl,cpm-command = <0x1a400300>;
- local-mac-address = [00 e0 0c 00 79 01];
- };
-
-@@ -194,21 +196,21 @@
- "fsl,cpm2-mdio-bitbang";
- #address-cells = <1>;
- #size-cells = <0>;
-- reg = <10d40 14>;
-+ reg = <0x10d40 0x14>;
- fsl,mdio-pin = <9>;
-- fsl,mdc-pin = <a>;
-+ fsl,mdc-pin = <10>;
-
- PHY0: ethernet-phy@0 {
- interrupt-parent = <&PIC>;
-- interrupts = <19 2>;
-- reg = <0>;
-+ interrupts = <25 2>;
-+ reg = <0x0>;
- device_type = "ethernet-phy";
- };
-
- PHY1: ethernet-phy@1 {
- interrupt-parent = <&PIC>;
-- interrupts = <19 2>;
-- reg = <3>;
-+ interrupts = <25 2>;
-+ reg = <0x3>;
- device_type = "ethernet-phy";
- };
- };
-@@ -218,17 +220,17 @@
- #size-cells = <0>;
- compatible = "fsl,mpc8280-usb",
- "fsl,cpm2-usb";
-- reg = <11b60 18 8b00 100>;
-+ reg = <0x11b60 0x18 0x8b00 0x100>;
- interrupt-parent = <&PIC>;
-- interrupts = <b 8>;
-- fsl,cpm-command = <2e600000>;
-+ interrupts = <11 8>;
-+ fsl,cpm-command = <0x2e600000>;
- };
- };
-
- PIC: interrupt-controller@10c00 {
- #interrupt-cells = <2>;
- interrupt-controller;
-- reg = <10c00 80>;
-+ reg = <0x10c00 0x80>;
- compatible = "fsl,mpc8280-pic", "fsl,cpm2-pic";
- };
-
---- a/arch/powerpc/boot/dts/prpmc2800.dts
-+++ b/arch/powerpc/boot/dts/prpmc2800.dts
-@@ -11,6 +11,8 @@
- * if it can determine the exact PrPMC type.
- */
-
-+/dts-v1/;
-+
- / {
- #address-cells = <1>;
- #size-cells = <1>;
-@@ -25,46 +27,46 @@
- PowerPC,7447 {
- device_type = "cpu";
- reg = <0>;
-- clock-frequency = <2bb0b140>; /* Default (733 MHz) */
-- bus-frequency = <7f28155>; /* 133.333333 MHz */
-- timebase-frequency = <1fca055>; /* 33.333333 MHz */
-- i-cache-line-size = <20>;
-- d-cache-line-size = <20>;
-- i-cache-size = <8000>;
-- d-cache-size = <8000>;
-+ clock-frequency = <733333333>; /* Default */
-+ bus-frequency = <133333333>;
-+ timebase-frequency = <33333333>;
-+ i-cache-line-size = <32>;
-+ d-cache-line-size = <32>;
-+ i-cache-size = <32768>;
-+ d-cache-size = <32768>;
- };
- };
-
- memory {
- device_type = "memory";
-- reg = <00000000 20000000>; /* Default (512MB) */
-+ reg = <0x0 0x20000000>; /* Default (512MB) */
- };
-
-- mv64x60@f1000000 { /* Marvell Discovery */
-+ system-controller@f1000000 { /* Marvell Discovery mv64360 */
- #address-cells = <1>;
- #size-cells = <1>;
- model = "mv64360"; /* Default */
-- compatible = "marvell,mv64x60";
-- clock-frequency = <7f28155>; /* 133.333333 MHz */
-- reg = <f1000000 00010000>;
-- virtual-reg = <f1000000>;
-- ranges = <88000000 88000000 01000000 /* PCI 0 I/O Space */
-- 80000000 80000000 08000000 /* PCI 0 MEM Space */
-- a0000000 a0000000 04000000 /* User FLASH */
-- 00000000 f1000000 00010000 /* Bridge's regs */
-- f2000000 f2000000 00040000>; /* Integrated SRAM */
-+ compatible = "marvell,mv64360";
-+ clock-frequency = <133333333>;
-+ reg = <0xf1000000 0x10000>;
-+ virtual-reg = <0xf1000000>;
-+ ranges = <0x88000000 0x88000000 0x1000000 /* PCI 0 I/O Space */
-+ 0x80000000 0x80000000 0x8000000 /* PCI 0 MEM Space */
-+ 0xa0000000 0xa0000000 0x4000000 /* User FLASH */
-+ 0x00000000 0xf1000000 0x0010000 /* Bridge's regs */
-+ 0xf2000000 0xf2000000 0x0040000>;/* Integrated SRAM */
-
- flash@a0000000 {
- device_type = "rom";
- compatible = "direct-mapped";
-- reg = <a0000000 4000000>; /* Default (64MB) */
-+ reg = <0xa0000000 0x4000000>; /* Default (64MB) */
- probe-type = "CFI";
- bank-width = <4>;
-- partitions = <00000000 00100000 /* RO */
-- 00100000 00040001 /* RW */
-- 00140000 00400000 /* RO */
-- 00540000 039c0000 /* RO */
-- 03f00000 00100000>; /* RO */
-+ partitions = <0x00000000 0x00100000 /* RO */
-+ 0x00100000 0x00040001 /* RW */
-+ 0x00140000 0x00400000 /* RO */
-+ 0x00540000 0x039c0000 /* RO */
-+ 0x03f00000 0x00100000>; /* RO */
- partition-names = "FW Image A", "FW Config Data", "Kernel Image", "Filesystem", "FW Image B";
- };
-
-@@ -72,171 +74,153 @@
- #address-cells = <1>;
- #size-cells = <0>;
- device_type = "mdio";
-- compatible = "marvell,mv64x60-mdio";
-- ethernet-phy@1 {
-+ compatible = "marvell,mv64360-mdio";
-+ PHY0: ethernet-phy@1 {
- device_type = "ethernet-phy";
- compatible = "broadcom,bcm5421";
-- interrupts = <4c>; /* GPP 12 */
-- interrupt-parent = <&/mv64x60/pic>;
-+ interrupts = <76>; /* GPP 12 */
-+ interrupt-parent = <&PIC>;
- reg = <1>;
- };
-- ethernet-phy@3 {
-+ PHY1: ethernet-phy@3 {
- device_type = "ethernet-phy";
- compatible = "broadcom,bcm5421";
-- interrupts = <4c>; /* GPP 12 */
-- interrupt-parent = <&/mv64x60/pic>;
-+ interrupts = <76>; /* GPP 12 */
-+ interrupt-parent = <&PIC>;
- reg = <3>;
- };
- };
-
-- ethernet@2000 {
-- reg = <2000 2000>;
-- eth0 {
-+ ethernet-group@2000 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ compatible = "marvell,mv64360-eth-group";
-+ reg = <0x2000 0x2000>;
-+ ethernet@0 {
- device_type = "network";
-- compatible = "marvell,mv64x60-eth";
-- block-index = <0>;
-- interrupts = <20>;
-- interrupt-parent = <&/mv64x60/pic>;
-- phy = <&/mv64x60/mdio/ethernet-phy@1>;
-+ compatible = "marvell,mv64360-eth";
-+ reg = <0>;
-+ interrupts = <32>;
-+ interrupt-parent = <&PIC>;
-+ phy = <&PHY0>;
- local-mac-address = [ 00 00 00 00 00 00 ];
- };
-- eth1 {
-+ ethernet@1 {
- device_type = "network";
-- compatible = "marvell,mv64x60-eth";
-- block-index = <1>;
-- interrupts = <21>;
-- interrupt-parent = <&/mv64x60/pic>;
-- phy = <&/mv64x60/mdio/ethernet-phy@3>;
-+ compatible = "marvell,mv64360-eth";
-+ reg = <1>;
-+ interrupts = <33>;
-+ interrupt-parent = <&PIC>;
-+ phy = <&PHY1>;
- local-mac-address = [ 00 00 00 00 00 00 ];
- };
- };
-
-- sdma@4000 {
-- device_type = "dma";
-- compatible = "marvell,mv64x60-sdma";
-- reg = <4000 c18>;
-- virtual-reg = <f1004000>;
-- interrupt-base = <0>;
-- interrupts = <24>;
-- interrupt-parent = <&/mv64x60/pic>;
-- };
--
-- sdma@6000 {
-- device_type = "dma";
-- compatible = "marvell,mv64x60-sdma";
-- reg = <6000 c18>;
-- virtual-reg = <f1006000>;
-- interrupt-base = <0>;
-- interrupts = <26>;
-- interrupt-parent = <&/mv64x60/pic>;
-- };
--
-- brg@b200 {
-- compatible = "marvell,mv64x60-brg";
-- reg = <b200 8>;
-+ SDMA0: sdma@4000 {
-+ compatible = "marvell,mv64360-sdma";
-+ reg = <0x4000 0xc18>;
-+ virtual-reg = <0xf1004000>;
-+ interrupts = <36>;
-+ interrupt-parent = <&PIC>;
-+ };
-+
-+ SDMA1: sdma@6000 {
-+ compatible = "marvell,mv64360-sdma";
-+ reg = <0x6000 0xc18>;
-+ virtual-reg = <0xf1006000>;
-+ interrupts = <38>;
-+ interrupt-parent = <&PIC>;
-+ };
-+
-+ BRG0: brg@b200 {
-+ compatible = "marvell,mv64360-brg";
-+ reg = <0xb200 0x8>;
- clock-src = <8>;
-- clock-frequency = <7ed6b40>;
-- current-speed = <2580>;
-- bcr = <0>;
-+ clock-frequency = <133333333>;
-+ current-speed = <9600>;
- };
-
-- brg@b208 {
-- compatible = "marvell,mv64x60-brg";
-- reg = <b208 8>;
-+ BRG1: brg@b208 {
-+ compatible = "marvell,mv64360-brg";
-+ reg = <0xb208 0x8>;
- clock-src = <8>;
-- clock-frequency = <7ed6b40>;
-- current-speed = <2580>;
-- bcr = <0>;
-+ clock-frequency = <133333333>;
-+ current-speed = <9600>;
- };
-
-- cunit@f200 {
-- reg = <f200 200>;
-+ CUNIT: cunit@f200 {
-+ reg = <0xf200 0x200>;
- };
-
-- mpscrouting@b400 {
-- reg = <b400 c>;
-+ MPSCROUTING: mpscrouting@b400 {
-+ reg = <0xb400 0xc>;
- };
-
-- mpscintr@b800 {
-- reg = <b800 100>;
-- virtual-reg = <f100b800>;
-+ MPSCINTR: mpscintr@b800 {
-+ reg = <0xb800 0x100>;
-+ virtual-reg = <0xf100b800>;
- };
-
-- mpsc@8000 {
-+ MPSC0: mpsc@8000 {
- device_type = "serial";
-- compatible = "marvell,mpsc";
-- reg = <8000 38>;
-- virtual-reg = <f1008000>;
-- sdma = <&/mv64x60/sdma@4000>;
-- brg = <&/mv64x60/brg@b200>;
-- cunit = <&/mv64x60/cunit@f200>;
-- mpscrouting = <&/mv64x60/mpscrouting@b400>;
-- mpscintr = <&/mv64x60/mpscintr@b800>;
-- block-index = <0>;
-- max_idle = <28>;
-- chr_1 = <0>;
-- chr_2 = <0>;
-- chr_10 = <3>;
-- mpcr = <0>;
-- interrupts = <28>;
-- interrupt-parent = <&/mv64x60/pic>;
-+ compatible = "marvell,mv64360-mpsc";
-+ reg = <0x8000 0x38>;
-+ virtual-reg = <0xf1008000>;
-+ sdma = <&SDMA0>;
-+ brg = <&BRG0>;
-+ cunit = <&CUNIT>;
-+ mpscrouting = <&MPSCROUTING>;
-+ mpscintr = <&MPSCINTR>;
-+ cell-index = <0>;
-+ interrupts = <40>;
-+ interrupt-parent = <&PIC>;
- };
-
-- mpsc@9000 {
-+ MPSC1: mpsc@9000 {
- device_type = "serial";
-- compatible = "marvell,mpsc";
-- reg = <9000 38>;
-- virtual-reg = <f1009000>;
-- sdma = <&/mv64x60/sdma@6000>;
-- brg = <&/mv64x60/brg@b208>;
-- cunit = <&/mv64x60/cunit@f200>;
-- mpscrouting = <&/mv64x60/mpscrouting@b400>;
-- mpscintr = <&/mv64x60/mpscintr@b800>;
-- block-index = <1>;
-- max_idle = <28>;
-- chr_1 = <0>;
-- chr_2 = <0>;
-- chr_10 = <3>;
-- mpcr = <0>;
-- interrupts = <2a>;
-- interrupt-parent = <&/mv64x60/pic>;
-+ compatible = "marvell,mv64360-mpsc";
-+ reg = <0x9000 0x38>;
-+ virtual-reg = <0xf1009000>;
-+ sdma = <&SDMA1>;
-+ brg = <&BRG1>;
-+ cunit = <&CUNIT>;
-+ mpscrouting = <&MPSCROUTING>;
-+ mpscintr = <&MPSCINTR>;
-+ cell-index = <1>;
-+ interrupts = <42>;
-+ interrupt-parent = <&PIC>;
- };
-
- wdt@b410 { /* watchdog timer */
-- compatible = "marvell,mv64x60-wdt";
-- reg = <b410 8>;
-- timeout = <a>; /* wdt timeout in seconds */
-+ compatible = "marvell,mv64360-wdt";
-+ reg = <0xb410 0x8>;
- };
-
- i2c@c000 {
- device_type = "i2c";
-- compatible = "marvell,mv64x60-i2c";
-- reg = <c000 20>;
-- virtual-reg = <f100c000>;
-- freq_m = <8>;
-- freq_n = <3>;
-- timeout = <3e8>; /* 1000 = 1 second */
-- retries = <1>;
-- interrupts = <25>;
-- interrupt-parent = <&/mv64x60/pic>;
-+ compatible = "marvell,mv64360-i2c";
-+ reg = <0xc000 0x20>;
-+ virtual-reg = <0xf100c000>;
-+ interrupts = <37>;
-+ interrupt-parent = <&PIC>;
- };
-
-- pic {
-+ PIC: pic {
- #interrupt-cells = <1>;
- #address-cells = <0>;
-- compatible = "marvell,mv64x60-pic";
-- reg = <0000 88>;
-+ compatible = "marvell,mv64360-pic";
-+ reg = <0x0 0x88>;
- interrupt-controller;
- };
-
- mpp@f000 {
-- compatible = "marvell,mv64x60-mpp";
-- reg = <f000 10>;
-+ compatible = "marvell,mv64360-mpp";
-+ reg = <0xf000 0x10>;
- };
-
- gpp@f100 {
-- compatible = "marvell,mv64x60-gpp";
-- reg = <f100 20>;
-+ compatible = "marvell,mv64360-gpp";
-+ reg = <0xf100 0x20>;
- };
-
- pci@80000000 {
-@@ -244,73 +228,75 @@
- #size-cells = <2>;
- #interrupt-cells = <1>;
- device_type = "pci";
-- compatible = "marvell,mv64x60-pci";
-- reg = <0cf8 8>;
-- ranges = <01000000 0 0 88000000 0 01000000
-- 02000000 0 80000000 80000000 0 08000000>;
-- bus-range = <0 ff>;
-- clock-frequency = <3EF1480>;
-- interrupt-pci-iack = <0c34>;
-- interrupt-parent = <&/mv64x60/pic>;
-- interrupt-map-mask = <f800 0 0 7>;
-+ compatible = "marvell,mv64360-pci";
-+ reg = <0xcf8 0x8>;
-+ ranges = <0x01000000 0x0 0x0
-+ 0x88000000 0x0 0x01000000
-+ 0x02000000 0x0 0x80000000
-+ 0x80000000 0x0 0x08000000>;
-+ bus-range = <0 255>;
-+ clock-frequency = <66000000>;
-+ interrupt-pci-iack = <0xc34>;
-+ interrupt-parent = <&PIC>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
- interrupt-map = <
- /* IDSEL 0x0a */
-- 5000 0 0 1 &/mv64x60/pic 50
-- 5000 0 0 2 &/mv64x60/pic 51
-- 5000 0 0 3 &/mv64x60/pic 5b
-- 5000 0 0 4 &/mv64x60/pic 5d
-+ 0x5000 0 0 1 &PIC 80
-+ 0x5000 0 0 2 &PIC 81
-+ 0x5000 0 0 3 &PIC 91
-+ 0x5000 0 0 4 &PIC 93
-
- /* IDSEL 0x0b */
-- 5800 0 0 1 &/mv64x60/pic 5b
-- 5800 0 0 2 &/mv64x60/pic 5d
-- 5800 0 0 3 &/mv64x60/pic 50
-- 5800 0 0 4 &/mv64x60/pic 51
-+ 0x5800 0 0 1 &PIC 91
-+ 0x5800 0 0 2 &PIC 93
-+ 0x5800 0 0 3 &PIC 80
-+ 0x5800 0 0 4 &PIC 81
-
- /* IDSEL 0x0c */
-- 6000 0 0 1 &/mv64x60/pic 5b
-- 6000 0 0 2 &/mv64x60/pic 5d
-- 6000 0 0 3 &/mv64x60/pic 50
-- 6000 0 0 4 &/mv64x60/pic 51
-+ 0x6000 0 0 1 &PIC 91
-+ 0x6000 0 0 2 &PIC 93
-+ 0x6000 0 0 3 &PIC 80
-+ 0x6000 0 0 4 &PIC 81
-
- /* IDSEL 0x0d */
-- 6800 0 0 1 &/mv64x60/pic 5d
-- 6800 0 0 2 &/mv64x60/pic 50
-- 6800 0 0 3 &/mv64x60/pic 51
-- 6800 0 0 4 &/mv64x60/pic 5b
-+ 0x6800 0 0 1 &PIC 93
-+ 0x6800 0 0 2 &PIC 80
-+ 0x6800 0 0 3 &PIC 81
-+ 0x6800 0 0 4 &PIC 91
- >;
- };
-
- cpu-error@0070 {
-- compatible = "marvell,mv64x60-cpu-error";
-- reg = <0070 10 0128 28>;
-- interrupts = <03>;
-- interrupt-parent = <&/mv64x60/pic>;
-+ compatible = "marvell,mv64360-cpu-error";
-+ reg = <0x70 0x10 0x128 0x28>;
-+ interrupts = <3>;
-+ interrupt-parent = <&PIC>;
- };
-
- sram-ctrl@0380 {
-- compatible = "marvell,mv64x60-sram-ctrl";
-- reg = <0380 80>;
-- interrupts = <0d>;
-- interrupt-parent = <&/mv64x60/pic>;
-+ compatible = "marvell,mv64360-sram-ctrl";
-+ reg = <0x380 0x80>;
-+ interrupts = <13>;
-+ interrupt-parent = <&PIC>;
- };
-
- pci-error@1d40 {
-- compatible = "marvell,mv64x60-pci-error";
-- reg = <1d40 40 0c28 4>;
-- interrupts = <0c>;
-- interrupt-parent = <&/mv64x60/pic>;
-+ compatible = "marvell,mv64360-pci-error";
-+ reg = <0x1d40 0x40 0xc28 0x4>;
-+ interrupts = <12>;
-+ interrupt-parent = <&PIC>;
- };
-
- mem-ctrl@1400 {
-- compatible = "marvell,mv64x60-mem-ctrl";
-- reg = <1400 60>;
-- interrupts = <11>;
-- interrupt-parent = <&/mv64x60/pic>;
-+ compatible = "marvell,mv64360-mem-ctrl";
-+ reg = <0x1400 0x60>;
-+ interrupts = <17>;
-+ interrupt-parent = <&PIC>;
- };
- };
-
- chosen {
- bootargs = "ip=on";
-- linux,stdout-path = "/mv64x60@f1000000/mpsc@8000";
-+ linux,stdout-path = &MPSC0;
- };
- };
---- a/arch/powerpc/boot/dts/rainier.dts
-+++ b/arch/powerpc/boot/dts/rainier.dts
-@@ -254,7 +254,6 @@
- };
-
- EMAC0: ethernet@ef600e00 {
-- linux,network-index = <0>;
- device_type = "network";
- compatible = "ibm,emac-440grx", "ibm,emac-440epx", "ibm,emac4";
- interrupt-parent = <&EMAC0>;
-@@ -270,7 +269,7 @@
- mal-tx-channel = <0>;
- mal-rx-channel = <0>;
- cell-index = <0>;
-- max-frame-size = <5dc>;
-+ max-frame-size = <2328>;
- rx-fifo-size = <1000>;
- tx-fifo-size = <800>;
- phy-mode = "rgmii";
-@@ -284,7 +283,6 @@
- };
-
- EMAC1: ethernet@ef600f00 {
-- linux,network-index = <1>;
- device_type = "network";
- compatible = "ibm,emac-440grx", "ibm,emac-440epx", "ibm,emac4";
- interrupt-parent = <&EMAC1>;
-@@ -300,7 +298,7 @@
- mal-tx-channel = <1>;
- mal-rx-channel = <1>;
- cell-index = <1>;
-- max-frame-size = <5dc>;
-+ max-frame-size = <2328>;
- rx-fifo-size = <1000>;
- tx-fifo-size = <800>;
- phy-mode = "rgmii";
---- /dev/null
-+++ b/arch/powerpc/boot/dts/sbc8641d.dts
-@@ -0,0 +1,352 @@
-+/*
-+ * SBC8641D Device Tree Source
-+ *
-+ * Copyright 2008 Wind River Systems Inc.
-+ *
-+ * Paul Gortmaker (see MAINTAINERS for contact information)
-+ *
-+ * Based largely on the mpc8641_hpcn.dts by Freescale Semiconductor 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.
-+ */
-+
-+/dts-v1/;
-+
-+/ {
-+ model = "SBC8641D";
-+ compatible = "wind,sbc8641";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ ethernet2 = &enet2;
-+ ethernet3 = &enet3;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ pci1 = &pci1;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,8641@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ d-cache-line-size = <32>;
-+ i-cache-line-size = <32>;
-+ d-cache-size = <32768>; // L1
-+ i-cache-size = <32768>; // L1
-+ timebase-frequency = <0>; // From uboot
-+ bus-frequency = <0>; // From uboot
-+ clock-frequency = <0>; // From uboot
-+ };
-+ PowerPC,8641@1 {
-+ device_type = "cpu";
-+ reg = <1>;
-+ d-cache-line-size = <32>;
-+ i-cache-line-size = <32>;
-+ d-cache-size = <32768>;
-+ i-cache-size = <32768>;
-+ timebase-frequency = <0>; // From uboot
-+ bus-frequency = <0>; // From uboot
-+ clock-frequency = <0>; // From uboot
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0x00000000 0x20000000>; // 512M at 0x0
-+ };
-+
-+ localbus@f8005000 {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc8641-localbus", "simple-bus";
-+ reg = <0xf8005000 0x1000>;
-+ interrupts = <19 2>;
-+ interrupt-parent = <&mpic>;
-+
-+ ranges = <0 0 0xff000000 0x01000000 // 16MB Boot flash
-+ 1 0 0xf0000000 0x00010000 // 64KB EEPROM
-+ 2 0 0xf1000000 0x00100000 // EPLD (1MB)
-+ 3 0 0xe0000000 0x04000000 // 64MB LB SDRAM (CS3)
-+ 4 0 0xe4000000 0x04000000 // 64MB LB SDRAM (CS4)
-+ 6 0 0xf4000000 0x00100000 // LCD display (1MB)
-+ 7 0 0xe8000000 0x04000000>; // 64MB OneNAND
-+
-+ flash@0,0 {
-+ compatible = "cfi-flash";
-+ reg = <0 0 0x01000000>;
-+ bank-width = <2>;
-+ device-width = <2>;
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ partition@0 {
-+ label = "dtb";
-+ reg = <0x00000000 0x00100000>;
-+ read-only;
-+ };
-+ partition@300000 {
-+ label = "kernel";
-+ reg = <0x00100000 0x00400000>;
-+ read-only;
-+ };
-+ partition@400000 {
-+ label = "fs";
-+ reg = <0x00500000 0x00a00000>;
-+ };
-+ partition@700000 {
-+ label = "firmware";
-+ reg = <0x00f00000 0x00100000>;
-+ read-only;
-+ };
-+ };
-+
-+ epld@2,0 {
-+ compatible = "wrs,epld-localbus";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ reg = <2 0 0x100000>;
-+ ranges = <0 0 5 0 1 // User switches
-+ 1 0 5 1 1 // Board ID/Rev
-+ 3 0 5 3 1>; // LEDs
-+ };
-+ };
-+
-+ soc@f8000000 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ device_type = "soc";
-+ compatible = "simple-bus";
-+ ranges = <0x00000000 0xf8000000 0x00100000>;
-+ reg = <0xf8000000 0x00001000>; // CCSRBAR
-+ bus-frequency = <0>;
-+
-+ i2c@3000 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
-+ compatible = "fsl-i2c";
-+ reg = <0x3000 0x100>;
-+ interrupts = <43 2>;
-+ interrupt-parent = <&mpic>;
-+ dfsrr;
-+ };
-+
-+ i2c@3100 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <1>;
-+ compatible = "fsl-i2c";
-+ reg = <0x3100 0x100>;
-+ interrupts = <43 2>;
-+ interrupt-parent = <&mpic>;
-+ dfsrr;
-+ };
-+
-+ mdio@24520 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ compatible = "fsl,gianfar-mdio";
-+ reg = <0x24520 0x20>;
-+
-+ phy0: ethernet-phy@1f {
-+ interrupt-parent = <&mpic>;
-+ interrupts = <10 1>;
-+ reg = <0x1f>;
-+ device_type = "ethernet-phy";
-+ };
-+ phy1: ethernet-phy@0 {
-+ interrupt-parent = <&mpic>;
-+ interrupts = <10 1>;
-+ reg = <0>;
-+ device_type = "ethernet-phy";
-+ };
-+ phy2: ethernet-phy@1 {
-+ interrupt-parent = <&mpic>;
-+ interrupts = <10 1>;
-+ reg = <1>;
-+ device_type = "ethernet-phy";
-+ };
-+ phy3: ethernet-phy@2 {
-+ interrupt-parent = <&mpic>;
-+ interrupts = <10 1>;
-+ reg = <2>;
-+ device_type = "ethernet-phy";
-+ };
-+ };
-+
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
-+ device_type = "network";
-+ model = "TSEC";
-+ compatible = "gianfar";
-+ reg = <0x24000 0x1000>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <29 2 30 2 34 2>;
-+ interrupt-parent = <&mpic>;
-+ phy-handle = <&phy0>;
-+ phy-connection-type = "rgmii-id";
-+ };
-+
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
-+ device_type = "network";
-+ model = "TSEC";
-+ compatible = "gianfar";
-+ reg = <0x25000 0x1000>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <35 2 36 2 40 2>;
-+ interrupt-parent = <&mpic>;
-+ phy-handle = <&phy1>;
-+ phy-connection-type = "rgmii-id";
-+ };
-+
-+ enet2: ethernet@26000 {
-+ cell-index = <2>;
-+ device_type = "network";
-+ model = "TSEC";
-+ compatible = "gianfar";
-+ reg = <0x26000 0x1000>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <31 2 32 2 33 2>;
-+ interrupt-parent = <&mpic>;
-+ phy-handle = <&phy2>;
-+ phy-connection-type = "rgmii-id";
-+ };
-+
-+ enet3: ethernet@27000 {
-+ cell-index = <3>;
-+ device_type = "network";
-+ model = "TSEC";
-+ compatible = "gianfar";
-+ reg = <0x27000 0x1000>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <37 2 38 2 39 2>;
-+ interrupt-parent = <&mpic>;
-+ phy-handle = <&phy3>;
-+ phy-connection-type = "rgmii-id";
-+ };
-+
-+ serial0: serial@4500 {
-+ cell-index = <0>;
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <0x4500 0x100>;
-+ clock-frequency = <0>;
-+ interrupts = <42 2>;
-+ interrupt-parent = <&mpic>;
-+ };
-+
-+ serial1: serial@4600 {
-+ cell-index = <1>;
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <0x4600 0x100>;
-+ clock-frequency = <0>;
-+ interrupts = <28 2>;
-+ interrupt-parent = <&mpic>;
-+ };
-+
-+ mpic: pic@40000 {
-+ clock-frequency = <0>;
-+ interrupt-controller;
-+ #address-cells = <0>;
-+ #interrupt-cells = <2>;
-+ reg = <0x40000 0x40000>;
-+ compatible = "chrp,open-pic";
-+ device_type = "open-pic";
-+ big-endian;
-+ };
-+
-+ global-utilities@e0000 {
-+ compatible = "fsl,mpc8641-guts";
-+ reg = <0xe0000 0x1000>;
-+ fsl,has-rstcr;
-+ };
-+ };
-+
-+ pci0: pcie@f8008000 {
-+ cell-index = <0>;
-+ compatible = "fsl,mpc8641-pcie";
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ reg = <0xf8008000 0x1000>;
-+ bus-range = <0x0 0xff>;
-+ ranges = <0x02000000 0x0 0x80000000 0x80000000 0x0 0x20000000
-+ 0x01000000 0x0 0x00000000 0xe2000000 0x0 0x00100000>;
-+ clock-frequency = <33333333>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <24 2>;
-+ interrupt-map-mask = <0xff00 0 0 7>;
-+ interrupt-map = <
-+ /* IDSEL 0x0 */
-+ 0x0000 0 0 1 &mpic 0 1
-+ 0x0000 0 0 2 &mpic 1 1
-+ 0x0000 0 0 3 &mpic 2 1
-+ 0x0000 0 0 4 &mpic 3 1
-+ >;
-+
-+ pcie@0 {
-+ reg = <0 0 0 0 0>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ device_type = "pci";
-+ ranges = <0x02000000 0x0 0x80000000
-+ 0x02000000 0x0 0x80000000
-+ 0x0 0x20000000
-+
-+ 0x01000000 0x0 0x00000000
-+ 0x01000000 0x0 0x00000000
-+ 0x0 0x00100000>;
-+ };
-+
-+ };
-+
-+ pci1: pcie@f8009000 {
-+ cell-index = <1>;
-+ compatible = "fsl,mpc8641-pcie";
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ reg = <0xf8009000 0x1000>;
-+ bus-range = <0 0xff>;
-+ ranges = <0x02000000 0x0 0xa0000000 0xa0000000 0x0 0x20000000
-+ 0x01000000 0x0 0x00000000 0xe3000000 0x0 0x00100000>;
-+ clock-frequency = <33333333>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <25 2>;
-+ interrupt-map-mask = <0xf800 0 0 7>;
-+ interrupt-map = <
-+ /* IDSEL 0x0 */
-+ 0x0000 0 0 1 &mpic 4 1
-+ 0x0000 0 0 2 &mpic 5 1
-+ 0x0000 0 0 3 &mpic 6 1
-+ 0x0000 0 0 4 &mpic 7 1
-+ >;
-+
-+ pcie@0 {
-+ reg = <0 0 0 0 0>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ device_type = "pci";
-+ ranges = <0x02000000 0x0 0xa0000000
-+ 0x02000000 0x0 0xa0000000
-+ 0x0 0x20000000
-+
-+ 0x01000000 0x0 0x00000000
-+ 0x01000000 0x0 0x00000000
-+ 0x0 0x00100000>;
-+ };
-+ };
-+};
---- a/arch/powerpc/boot/dts/sequoia.dts
-+++ b/arch/powerpc/boot/dts/sequoia.dts
-@@ -269,7 +269,6 @@
- };
-
- EMAC0: ethernet@ef600e00 {
-- linux,network-index = <0>;
- device_type = "network";
- compatible = "ibm,emac-440epx", "ibm,emac4";
- interrupt-parent = <&EMAC0>;
-@@ -285,7 +284,7 @@
- mal-tx-channel = <0>;
- mal-rx-channel = <0>;
- cell-index = <0>;
-- max-frame-size = <5dc>;
-+ max-frame-size = <2328>;
- rx-fifo-size = <1000>;
- tx-fifo-size = <800>;
- phy-mode = "rgmii";
-@@ -299,7 +298,6 @@
- };
-
- EMAC1: ethernet@ef600f00 {
-- linux,network-index = <1>;
- device_type = "network";
- compatible = "ibm,emac-440epx", "ibm,emac4";
- interrupt-parent = <&EMAC1>;
-@@ -315,7 +313,7 @@
- mal-tx-channel = <1>;
- mal-rx-channel = <1>;
- cell-index = <1>;
-- max-frame-size = <5dc>;
-+ max-frame-size = <2328>;
- rx-fifo-size = <1000>;
- tx-fifo-size = <800>;
- phy-mode = "rgmii";
---- a/arch/powerpc/boot/dts/taishan.dts
-+++ b/arch/powerpc/boot/dts/taishan.dts
-@@ -104,6 +104,16 @@
- // FIXME: anything else?
- };
-
-+ L2C0: l2c {
-+ compatible = "ibm,l2-cache-440gx", "ibm,l2-cache";
-+ dcr-reg = <20 8 /* Internal SRAM DCR's */
-+ 30 8>; /* L2 cache DCR's */
-+ cache-line-size = <20>; /* 32 bytes */
-+ cache-size = <40000>; /* L2, 256K */
-+ interrupt-parent = <&UIC2>;
-+ interrupts = <17 1>;
-+ };
-+
- plb {
- compatible = "ibm,plb-440gx", "ibm,plb4";
- #address-cells = <2>;
-@@ -232,10 +242,18 @@
- reg = <40000790 8>;
- };
-
-+ TAH0: emac-tah@40000b50 {
-+ compatible = "ibm,tah-440gx", "ibm,tah";
-+ reg = <40000b50 30>;
-+ };
-+
-+ TAH1: emac-tah@40000d50 {
-+ compatible = "ibm,tah-440gx", "ibm,tah";
-+ reg = <40000d50 30>;
-+ };
-
- EMAC0: ethernet@40000800 {
- unused = <1>;
-- linux,network-index = <2>;
- device_type = "network";
- compatible = "ibm,emac-440gx", "ibm,emac4";
- interrupt-parent = <&UIC1>;
-@@ -256,7 +274,6 @@
- };
- EMAC1: ethernet@40000900 {
- unused = <1>;
-- linux,network-index = <3>;
- device_type = "network";
- compatible = "ibm,emac-440gx", "ibm,emac4";
- interrupt-parent = <&UIC1>;
-@@ -277,7 +294,6 @@
- };
-
- EMAC2: ethernet@40000c00 {
-- linux,network-index = <0>;
- device_type = "network";
- compatible = "ibm,emac-440gx", "ibm,emac4";
- interrupt-parent = <&UIC2>;
-@@ -288,7 +304,7 @@
- mal-tx-channel = <2>;
- mal-rx-channel = <2>;
- cell-index = <2>;
-- max-frame-size = <5dc>;
-+ max-frame-size = <2328>;
- rx-fifo-size = <1000>;
- tx-fifo-size = <800>;
- phy-mode = "rgmii";
-@@ -297,10 +313,11 @@
- rgmii-channel = <0>;
- zmii-device = <&ZMII0>;
- zmii-channel = <2>;
-+ tah-device = <&TAH0>;
-+ tah-channel = <0>;
- };
-
- EMAC3: ethernet@40000e00 {
-- linux,network-index = <1>;
- device_type = "network";
- compatible = "ibm,emac-440gx", "ibm,emac4";
- interrupt-parent = <&UIC2>;
-@@ -311,7 +328,7 @@
- mal-tx-channel = <3>;
- mal-rx-channel = <3>;
- cell-index = <3>;
-- max-frame-size = <5dc>;
-+ max-frame-size = <2328>;
- rx-fifo-size = <1000>;
- tx-fifo-size = <800>;
- phy-mode = "rgmii";
-@@ -320,6 +337,8 @@
- rgmii-channel = <1>;
- zmii-device = <&ZMII0>;
- zmii-channel = <3>;
-+ tah-device = <&TAH1>;
-+ tah-channel = <0>;
- };
-
-
---- a/arch/powerpc/boot/dts/walnut.dts
-+++ b/arch/powerpc/boot/dts/walnut.dts
-@@ -125,7 +125,6 @@
- };
-
- EMAC: ethernet@ef600800 {
-- linux,network-index = <0>;
- device_type = "network";
- compatible = "ibm,emac-405gp", "ibm,emac";
- interrupt-parent = <&UIC0>;
---- a/arch/powerpc/boot/dts/warp.dts
-+++ b/arch/powerpc/boot/dts/warp.dts
-@@ -204,7 +204,6 @@
- };
-
- EMAC0: ethernet@ef600e00 {
-- linux,network-index = <0>;
- device_type = "network";
- compatible = "ibm,emac-440ep", "ibm,emac-440gp", "ibm,emac";
- interrupt-parent = <&UIC1>;
---- /dev/null
-+++ b/arch/powerpc/boot/dts/yosemite.dts
-@@ -0,0 +1,304 @@
-+/*
-+ * Device Tree Source for AMCC Yosemite
-+ *
-+ * Copyright 2008 IBM Corp.
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without
-+ * any warranty of any kind, whether express or implied.
-+ */
-+
-+/ {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ model = "amcc,yosemite";
-+ compatible = "amcc,yosemite","amcc,bamboo";
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC0;
-+ ethernet1 = &EMAC1;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ serial2 = &UART2;
-+ serial3 = &UART3;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu@0 {
-+ device_type = "cpu";
-+ model = "PowerPC,440EP";
-+ reg = <0>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ timebase-frequency = <0>; /* Filled in by zImage */
-+ i-cache-line-size = <20>;
-+ d-cache-line-size = <20>;
-+ i-cache-size = <8000>;
-+ d-cache-size = <8000>;
-+ dcr-controller;
-+ dcr-access-method = "native";
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0 0>; /* Filled in by zImage */
-+ };
-+
-+ UIC0: interrupt-controller0 {
-+ compatible = "ibm,uic-440ep","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <0>;
-+ dcr-reg = <0c0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ };
-+
-+ UIC1: interrupt-controller1 {
-+ compatible = "ibm,uic-440ep","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <1>;
-+ dcr-reg = <0d0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <1e 4 1f 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ SDR0: sdr {
-+ compatible = "ibm,sdr-440ep";
-+ dcr-reg = <00e 002>;
-+ };
-+
-+ CPR0: cpr {
-+ compatible = "ibm,cpr-440ep";
-+ dcr-reg = <00c 002>;
-+ };
-+
-+ plb {
-+ compatible = "ibm,plb-440ep", "ibm,plb-440gp", "ibm,plb4";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ ranges;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+
-+ SDRAM0: sdram {
-+ compatible = "ibm,sdram-440ep", "ibm,sdram-405gp";
-+ dcr-reg = <010 2>;
-+ };
-+
-+ DMA0: dma {
-+ compatible = "ibm,dma-440ep", "ibm,dma-440gp";
-+ dcr-reg = <100 027>;
-+ };
-+
-+ MAL0: mcmal {
-+ compatible = "ibm,mcmal-440ep", "ibm,mcmal-440gp", "ibm,mcmal";
-+ dcr-reg = <180 62>;
-+ num-tx-chans = <4>;
-+ num-rx-chans = <2>;
-+ interrupt-parent = <&MAL0>;
-+ interrupts = <0 1 2 3 4>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
-+ /*RXEOB*/ 1 &UIC0 b 4
-+ /*SERR*/ 2 &UIC1 0 4
-+ /*TXDE*/ 3 &UIC1 1 4
-+ /*RXDE*/ 4 &UIC1 2 4>;
-+ };
-+
-+ POB0: opb {
-+ compatible = "ibm,opb-440ep", "ibm,opb-440gp", "ibm,opb";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ /* Bamboo is oddball in the 44x world and doesn't use the ERPN
-+ * bits.
-+ */
-+ ranges = <00000000 0 00000000 80000000
-+ 80000000 0 80000000 80000000>;
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <7 4>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+
-+ EBC0: ebc {
-+ compatible = "ibm,ebc-440ep", "ibm,ebc-440gp", "ibm,ebc";
-+ dcr-reg = <012 2>;
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ interrupts = <5 1>;
-+ interrupt-parent = <&UIC1>;
-+ };
-+
-+ UART0: serial@ef600300 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600300 8>;
-+ virtual-reg = <ef600300>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ current-speed = <1c200>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <0 4>;
-+ };
-+
-+ UART1: serial@ef600400 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600400 8>;
-+ virtual-reg = <ef600400>;
-+ clock-frequency = <0>;
-+ current-speed = <0>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <1 4>;
-+ };
-+
-+ UART2: serial@ef600500 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600500 8>;
-+ virtual-reg = <ef600500>;
-+ clock-frequency = <0>;
-+ current-speed = <0>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <3 4>;
-+ status = "disabled";
-+ };
-+
-+ UART3: serial@ef600600 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600600 8>;
-+ virtual-reg = <ef600600>;
-+ clock-frequency = <0>;
-+ current-speed = <0>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <4 4>;
-+ status = "disabled";
-+ };
-+
-+ IIC0: i2c@ef600700 {
-+ compatible = "ibm,iic-440ep", "ibm,iic-440gp", "ibm,iic";
-+ reg = <ef600700 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <2 4>;
-+ };
-+
-+ IIC1: i2c@ef600800 {
-+ compatible = "ibm,iic-440ep", "ibm,iic-440gp", "ibm,iic";
-+ reg = <ef600800 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <7 4>;
-+ };
-+
-+ spi@ef600900 {
-+ compatible = "amcc,spi-440ep";
-+ reg = <ef600900 6>;
-+ interrupts = <8 4>;
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ ZMII0: emac-zmii@ef600d00 {
-+ compatible = "ibm,zmii-440ep", "ibm,zmii-440gp", "ibm,zmii";
-+ reg = <ef600d00 c>;
-+ };
-+
-+ EMAC0: ethernet@ef600e00 {
-+ device_type = "network";
-+ compatible = "ibm,emac-440ep", "ibm,emac-440gp", "ibm,emac";
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <1c 4 1d 4>;
-+ reg = <ef600e00 70>;
-+ local-mac-address = [000000000000];
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <0 1>;
-+ mal-rx-channel = <0>;
-+ cell-index = <0>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rmii";
-+ phy-map = <00000000>;
-+ zmii-device = <&ZMII0>;
-+ zmii-channel = <0>;
-+ };
-+
-+ EMAC1: ethernet@ef600f00 {
-+ device_type = "network";
-+ compatible = "ibm,emac-440ep", "ibm,emac-440gp", "ibm,emac";
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <1e 4 1f 4>;
-+ reg = <ef600f00 70>;
-+ local-mac-address = [000000000000];
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <2 3>;
-+ mal-rx-channel = <1>;
-+ cell-index = <1>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rmii";
-+ phy-map = <00000000>;
-+ zmii-device = <&ZMII0>;
-+ zmii-channel = <1>;
-+ };
-+
-+ usb@ef601000 {
-+ compatible = "ohci-be";
-+ reg = <ef601000 80>;
-+ interrupts = <8 4 9 4>;
-+ interrupt-parent = < &UIC1 >;
-+ };
-+ };
-+
-+ PCI0: pci@ec000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb440ep-pci", "ibm,plb-pci";
-+ primary;
-+ reg = <0 eec00000 8 /* Config space access */
-+ 0 eed00000 4 /* IACK */
-+ 0 eed00000 4 /* Special cycle */
-+ 0 ef400000 40>; /* Internal registers */
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed. Chip supports a second
-+ * IO range but we don't use it for now
-+ */
-+ ranges = <02000000 0 a0000000 0 a0000000 0 20000000
-+ 01000000 0 00000000 0 e8000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* Bamboo has all 4 IRQ pins tied together per slot */
-+ interrupt-map-mask = <f800 0 0 0>;
-+ interrupt-map = <
-+ /* IDSEL 1 */
-+ 0800 0 0 0 &UIC0 1c 8
-+
-+ /* IDSEL 2 */
-+ 1000 0 0 0 &UIC0 1b 8
-+
-+ /* IDSEL 3 */
-+ 1800 0 0 0 &UIC0 1a 8
-+
-+ /* IDSEL 4 */
-+ 2000 0 0 0 &UIC0 19 8
-+ >;
-+ };
-+ };
-+
-+ chosen {
-+ linux,stdout-path = "/plb/opb/serial@ef600300";
-+ };
-+};
---- a/arch/powerpc/boot/ebony.c
-+++ b/arch/powerpc/boot/ebony.c
-@@ -75,7 +75,8 @@ static void ebony_fixups(void)
-
- ibm440gp_fixup_clocks(sysclk, 6 * 1843200);
- ibm4xx_sdram_fixup_memsize();
-- dt_fixup_mac_addresses(ebony_mac0, ebony_mac1);
-+ dt_fixup_mac_address_by_alias("ethernet0", ebony_mac0);
-+ dt_fixup_mac_address_by_alias("ethernet1", ebony_mac1);
- ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
- ebony_flashsel_fixup();
- }
---- a/arch/powerpc/boot/libfdt-wrapper.c
-+++ b/arch/powerpc/boot/libfdt-wrapper.c
-@@ -35,7 +35,7 @@
- #define check_err(err) \
- ({ \
- if (BAD_ERROR(err) || ((err < 0) && DEBUG)) \
-- printf("%s():%d %s\n\r", __FUNCTION__, __LINE__, \
-+ printf("%s():%d %s\n\r", __func__, __LINE__, \
- fdt_strerror(err)); \
- if (BAD_ERROR(err)) \
- exit(); \
---- a/arch/powerpc/boot/mpc52xx-psc.c
-+++ b/arch/powerpc/boot/mpc52xx-psc.c
-@@ -51,14 +51,9 @@ static unsigned char psc_getc(void)
-
- int mpc5200_psc_console_init(void *devp, struct serial_console_data *scdp)
- {
-- int n;
--
- /* Get the base address of the psc registers */
-- n = getprop(devp, "virtual-reg", &psc, sizeof(psc));
-- if (n != sizeof(psc)) {
-- if (!dt_xlate_reg(devp, 0, (void *)&psc, NULL))
-- return -1;
-- }
-+ if (dt_get_virtual_reg(devp, &psc, 1) < 1)
-+ return -1;
-
- scdp->open = psc_open;
- scdp->putc = psc_putc;
---- a/arch/powerpc/boot/mpsc.c
-+++ b/arch/powerpc/boot/mpsc.c
-@@ -141,7 +141,7 @@ int mpsc_console_init(void *devp, struct
- if (mpscintr_base == NULL)
- goto err_out;
-
-- n = getprop(devp, "block-index", &v, sizeof(v));
-+ n = getprop(devp, "cell-index", &v, sizeof(v));
- if (n != sizeof(v))
- goto err_out;
- reg_set = (int)v;
---- a/arch/powerpc/boot/mv64x60.c
-+++ b/arch/powerpc/boot/mv64x60.c
-@@ -535,7 +535,7 @@ u8 *mv64x60_get_bridge_pbase(void)
- u32 v[2];
- void *devp;
-
-- devp = finddevice("/mv64x60");
-+ devp = find_node_by_compatible(NULL, "marvell,mv64360");
- if (devp == NULL)
- goto err_out;
- if (getprop(devp, "reg", v, sizeof(v)) != sizeof(v))
-@@ -553,7 +553,7 @@ u8 *mv64x60_get_bridge_base(void)
- u32 v;
- void *devp;
-
-- devp = finddevice("/mv64x60");
-+ devp = find_node_by_compatible(NULL, "marvell,mv64360");
- if (devp == NULL)
- goto err_out;
- if (getprop(devp, "virtual-reg", &v, sizeof(v)) != sizeof(v))
---- a/arch/powerpc/boot/mv64x60_i2c.c
-+++ b/arch/powerpc/boot/mv64x60_i2c.c
-@@ -185,7 +185,7 @@ int mv64x60_i2c_open(void)
- u32 v;
- void *devp;
-
-- devp = finddevice("/mv64x60/i2c");
-+ devp = find_node_by_compatible(NULL, "marvell,mv64360-i2c");
- if (devp == NULL)
- goto err_out;
- if (getprop(devp, "virtual-reg", &v, sizeof(v)) != sizeof(v))
---- a/arch/powerpc/boot/ns16550.c
-+++ b/arch/powerpc/boot/ns16550.c
-@@ -55,15 +55,9 @@ static u8 ns16550_tstc(void)
- int ns16550_console_init(void *devp, struct serial_console_data *scdp)
- {
- int n;
-- unsigned long reg_phys;
-
-- n = getprop(devp, "virtual-reg", ®_base, sizeof(reg_base));
-- if (n != sizeof(reg_base)) {
-- if (!dt_xlate_reg(devp, 0, ®_phys, NULL))
-- return -1;
--
-- reg_base = (void *)reg_phys;
-- }
-+ if (dt_get_virtual_reg(devp, (void **)®_base, 1) < 1)
-+ return -1;
-
- n = getprop(devp, "reg-shift", ®_shift, sizeof(reg_shift));
- if (n != sizeof(reg_shift))
---- a/arch/powerpc/boot/ops.h
-+++ b/arch/powerpc/boot/ops.h
-@@ -95,6 +95,7 @@ int dt_xlate_reg(void *node, int res, un
- int dt_xlate_addr(void *node, u32 *buf, int buflen, unsigned long *xlated_addr);
- int dt_is_compatible(void *node, const char *compat);
- void dt_get_reg_format(void *node, u32 *naddr, u32 *nsize);
-+int dt_get_virtual_reg(void *node, void **addr, int nres);
-
- static inline void *finddevice(const char *name)
- {
---- a/arch/powerpc/boot/prpmc2800.c
-+++ b/arch/powerpc/boot/prpmc2800.c
-@@ -344,20 +344,20 @@ static void prpmc2800_bridge_setup(u32 m
- acc_bits);
-
- /* Get the cpu -> pci i/o & mem mappings from the device tree */
-- devp = finddevice("/mv64x60/pci@80000000");
-+ devp = find_node_by_compatible(NULL, "marvell,mv64360-pci");
- if (devp == NULL)
-- fatal("Error: Missing /mv64x60/pci@80000000"
-+ fatal("Error: Missing marvell,mv64360-pci"
- " device tree node\n\r");
-
- rc = getprop(devp, "ranges", v, sizeof(v));
- if (rc != sizeof(v))
-- fatal("Error: Can't find /mv64x60/pci@80000000/ranges"
-+ fatal("Error: Can't find marvell,mv64360-pci ranges"
- " property\n\r");
-
- /* Get the cpu -> pci i/o & mem mappings from the device tree */
-- devp = finddevice("/mv64x60");
-+ devp = find_node_by_compatible(NULL, "marvell,mv64360");
- if (devp == NULL)
-- fatal("Error: Missing /mv64x60 device tree node\n\r");
-+ fatal("Error: Missing marvell,mv64360 device tree node\n\r");
-
- enables = in_le32((u32 *)(bridge_base + MV64x60_CPU_BAR_ENABLE));
- enables |= 0x0007fe00; /* Disable all cpu->pci windows */
-@@ -429,9 +429,9 @@ static void prpmc2800_fixups(void)
- setprop(devp, "model", model, l);
-
- /* Set /cpus/PowerPC,7447/clock-frequency */
-- devp = finddevice("/cpus/PowerPC,7447");
-+ devp = find_node_by_prop_value_str(NULL, "device_type", "cpu");
- if (devp == NULL)
-- fatal("Error: Missing proper /cpus device tree node\n\r");
-+ fatal("Error: Missing proper cpu device tree node\n\r");
- v[0] = bip->core_speed;
- setprop(devp, "clock-frequency", &v[0], sizeof(v[0]));
-
-@@ -443,16 +443,17 @@ static void prpmc2800_fixups(void)
- v[1] = bip->mem_size;
- setprop(devp, "reg", v, sizeof(v));
-
-- /* Update /mv64x60/model, if this is a mv64362 */
-+ /* Update model, if this is a mv64362 */
- if (bip->bridge_type == BRIDGE_TYPE_MV64362) {
-- devp = finddevice("/mv64x60");
-+ devp = find_node_by_compatible(NULL, "marvell,mv64360");
- if (devp == NULL)
-- fatal("Error: Missing /mv64x60 device tree node\n\r");
-+ fatal("Error: Missing marvell,mv64360"
-+ " device tree node\n\r");
- setprop(devp, "model", "mv64362", strlen("mv64362") + 1);
- }
-
- /* Set User FLASH size */
-- devp = finddevice("/mv64x60/flash@a0000000");
-+ devp = find_node_by_compatible(NULL, "direct-mapped");
- if (devp == NULL)
- fatal("Error: Missing User FLASH device tree node\n\r");
- rc = getprop(devp, "reg", v, sizeof(v));
---- a/arch/powerpc/boot/ps3-head.S
-+++ b/arch/powerpc/boot/ps3-head.S
-@@ -27,8 +27,9 @@
- /*
- * __system_reset_overlay - The PS3 first stage entry.
- *
-- * The bootwraper build script copies the 0x100 bytes at symbol
-- * __system_reset_overlay to offset 0x100 of the rom image.
-+ * The bootwraper build script copies the 512 bytes at symbol
-+ * __system_reset_overlay to offset 0x100 of the rom image. This symbol
-+ * must occupy 512 or less bytes.
- *
- * The PS3 has a single processor with two threads.
- */
-@@ -47,8 +48,6 @@ __system_reset_overlay:
-
- mfspr r3, 0x88
- cntlzw. r3, r3
-- li r4, 0
-- li r5, 0
- beq 1f
-
- /* Secondary goes to __secondary_hold in kernel. */
-@@ -57,8 +56,14 @@ __system_reset_overlay:
- mtctr r4
- bctr
-
-- /* Primary delays then goes to _zimage_start in wrapper. */
- 1:
-+ /* Save the value at addr zero for a null pointer write check later. */
-+
-+ li r4, 0
-+ lwz r3, 0(r4)
-+
-+ /* Primary delays then goes to _zimage_start in wrapper. */
-+
- or 31, 31, 31 /* db16cyc */
- or 31, 31, 31 /* db16cyc */
-
-@@ -67,16 +72,18 @@ __system_reset_overlay:
- mtctr r4
- bctr
-
-+ . = __system_reset_overlay + 512
-+
- /*
- * __system_reset_kernel - Place holder for the kernel reset vector.
- *
-- * The bootwrapper build script copies 0x100 bytes from offset 0x100
-+ * The bootwrapper build script copies 512 bytes from offset 0x100
- * of the rom image to the symbol __system_reset_kernel. At runtime
-- * the bootwrapper program copies the 0x100 bytes at __system_reset_kernel
-- * to ram address 0x100. This symbol must occupy 0x100 bytes.
-+ * the bootwrapper program copies the 512 bytes at __system_reset_kernel
-+ * to ram address 0x100. This symbol must occupy 512 bytes.
- */
-
- .globl __system_reset_kernel
- __system_reset_kernel:
-
-- . = __system_reset_kernel + 0x100
-+ . = __system_reset_kernel + 512
---- a/arch/powerpc/boot/ps3.c
-+++ b/arch/powerpc/boot/ps3.c
-@@ -27,10 +27,10 @@
- #include "page.h"
- #include "ops.h"
-
--extern s64 lv1_panic(u64 in_1);
--extern s64 lv1_get_logical_partition_id(u64 *out_1);
--extern s64 lv1_get_logical_ppe_id(u64 *out_1);
--extern s64 lv1_get_repository_node_value(u64 in_1, u64 in_2, u64 in_3,
-+extern int lv1_panic(u64 in_1);
-+extern int lv1_get_logical_partition_id(u64 *out_1);
-+extern int lv1_get_logical_ppe_id(u64 *out_1);
-+extern int lv1_get_repository_node_value(u64 in_1, u64 in_2, u64 in_3,
- u64 in_4, u64 in_5, u64 *out_1, u64 *out_2);
-
- #ifdef DEBUG
-@@ -46,6 +46,7 @@ BSS_STACK(4096);
- * edit the command line passed to vmlinux (by setting /chosen/bootargs).
- * The buffer is put in it's own section so that tools may locate it easier.
- */
-+
- static char cmdline[COMMAND_LINE_SIZE]
- __attribute__((__section__("__builtin_cmdline")));
-
-@@ -75,7 +76,7 @@ static void ps3_exit(void)
-
- static int ps3_repository_read_rm_size(u64 *rm_size)
- {
-- s64 result;
-+ int result;
- u64 lpar_id;
- u64 ppe_id;
- u64 v2;
-@@ -114,16 +115,17 @@ void ps3_copy_vectors(void)
- {
- extern char __system_reset_kernel[];
-
-- memcpy((void *)0x100, __system_reset_kernel, 0x100);
-- flush_cache((void *)0x100, 0x100);
-+ memcpy((void *)0x100, __system_reset_kernel, 512);
-+ flush_cache((void *)0x100, 512);
- }
-
--void platform_init(void)
-+void platform_init(unsigned long null_check)
- {
- const u32 heapsize = 0x1000000 - (u32)_end; /* 16MiB */
- void *chosen;
- unsigned long ft_addr;
- u64 rm_size;
-+ unsigned long val;
-
- console_ops.write = ps3_console_write;
- platform_ops.exit = ps3_exit;
-@@ -151,6 +153,11 @@ void platform_init(void)
-
- printf(" flat tree at 0x%lx\n\r", ft_addr);
-
-+ val = *(unsigned long *)0;
-+
-+ if (val != null_check)
-+ printf("null check failed: %lx != %lx\n\r", val, null_check);
-+
- ((kernel_entry_t)0)(ft_addr, 0, NULL);
-
- ps3_exit();
---- a/arch/powerpc/boot/serial.c
-+++ b/arch/powerpc/boot/serial.c
-@@ -119,7 +119,7 @@ int serial_console_init(void)
-
- if (dt_is_compatible(devp, "ns16550"))
- rc = ns16550_console_init(devp, &serial_cd);
-- else if (dt_is_compatible(devp, "marvell,mpsc"))
-+ else if (dt_is_compatible(devp, "marvell,mv64360-mpsc"))
- rc = mpsc_console_init(devp, &serial_cd);
- else if (dt_is_compatible(devp, "fsl,cpm1-scc-uart") ||
- dt_is_compatible(devp, "fsl,cpm1-smc-uart") ||
---- /dev/null
-+++ b/arch/powerpc/boot/simpleboot.c
-@@ -0,0 +1,84 @@
-+/*
-+ * The simple platform -- for booting when firmware doesn't supply a device
-+ * tree or any platform configuration information.
-+ * All data is extracted from an embedded device tree
-+ * blob.
-+ *
-+ * Authors: Scott Wood <scottwood@freescale.com>
-+ * Grant Likely <grant.likely@secretlab.ca>
-+ *
-+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ * Copyright (c) 2008 Secret Lab Technologies 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 "ops.h"
-+#include "types.h"
-+#include "io.h"
-+#include "stdio.h"
-+#include "libfdt/libfdt.h"
-+
-+BSS_STACK(4*1024);
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+ unsigned long r6, unsigned long r7)
-+{
-+ const u32 *na, *ns, *reg, *timebase;
-+ u64 memsize64;
-+ int node, size, i;
-+
-+ /* Make sure FDT blob is sane */
-+ if (fdt_check_header(_dtb_start) != 0)
-+ fatal("Invalid device tree blob\n");
-+
-+ /* Find the #address-cells and #size-cells properties */
-+ node = fdt_path_offset(_dtb_start, "/");
-+ if (node < 0)
-+ fatal("Cannot find root node\n");
-+ na = fdt_getprop(_dtb_start, node, "#address-cells", &size);
-+ if (!na || (size != 4))
-+ fatal("Cannot find #address-cells property");
-+ ns = fdt_getprop(_dtb_start, node, "#size-cells", &size);
-+ if (!ns || (size != 4))
-+ fatal("Cannot find #size-cells property");
-+
-+ /* Find the memory range */
-+ node = fdt_node_offset_by_prop_value(_dtb_start, -1, "device_type",
-+ "memory", sizeof("memory"));
-+ if (node < 0)
-+ fatal("Cannot find memory node\n");
-+ reg = fdt_getprop(_dtb_start, node, "reg", &size);
-+ if (size < (*na+*ns) * sizeof(u32))
-+ fatal("cannot get memory range\n");
-+
-+ /* Only interested in memory based at 0 */
-+ for (i = 0; i < *na; i++)
-+ if (*reg++ != 0)
-+ fatal("Memory range is not based at address 0\n");
-+
-+ /* get the memsize and trucate it to under 4G on 32 bit machines */
-+ memsize64 = 0;
-+ for (i = 0; i < *ns; i++)
-+ memsize64 = (memsize64 << 32) | *reg++;
-+ if (sizeof(void *) == 4 && memsize64 >= 0x100000000ULL)
-+ memsize64 = 0xffffffff;
-+
-+ /* finally, setup the timebase */
-+ node = fdt_node_offset_by_prop_value(_dtb_start, -1, "device_type",
-+ "cpu", sizeof("cpu"));
-+ if (!node)
-+ fatal("Cannot find cpu node\n");
-+ timebase = fdt_getprop(_dtb_start, node, "timebase-frequency", &size);
-+ if (timebase && (size == 4))
-+ timebase_period_ns = 1000000000 / *timebase;
-+
-+ /* Now we have the memory size; initialize the heap */
-+ simple_alloc_init(_end, memsize64 - (unsigned long)_end, 32, 64);
-+
-+ /* prepare the device tree and find the console */
-+ fdt_init(_dtb_start);
-+ serial_console_init();
-+}
---- a/arch/powerpc/boot/treeboot-walnut.c
-+++ b/arch/powerpc/boot/treeboot-walnut.c
-@@ -68,7 +68,7 @@ static void walnut_fixups(void)
- ibm4xx_quiesce_eth((u32 *)0xef600800, NULL);
- ibm4xx_fixup_ebc_ranges("/plb/ebc");
- walnut_flashsel_fixup();
-- dt_fixup_mac_addresses((u8 *) WALNUT_OPENBIOS_MAC_OFF);
-+ dt_fixup_mac_address_by_alias("ethernet0", (u8 *) WALNUT_OPENBIOS_MAC_OFF);
- }
-
- void platform_init(void)
---- /dev/null
-+++ b/arch/powerpc/boot/virtex405-head.S
-@@ -0,0 +1,30 @@
-+#include "ppc_asm.h"
-+
-+ .text
-+ .global _zimage_start
-+_zimage_start:
-+
-+ /* PPC errata 213: needed by Virtex-4 FX */
-+ mfccr0 0
-+ oris 0,0,0x50000000@h
-+ mtccr0 0
-+
-+ /*
-+ * Invalidate the data cache if the data cache is turned off.
-+ * - The 405 core does not invalidate the data cache on power-up
-+ * or reset but does turn off the data cache. We cannot assume
-+ * that the cache contents are valid.
-+ * - If the data cache is turned on this must have been done by
-+ * a bootloader and we assume that the cache contents are
-+ * valid.
-+ */
-+ mfdccr r9
-+ cmplwi r9,0
-+ bne 2f
-+ lis r9,0
-+ li r8,256
-+ mtctr r8
-+1: dccci r0,r9
-+ addi r9,r9,0x20
-+ bdnz 1b
-+2: b _zimage_start_lib
---- a/arch/powerpc/boot/wrapper
-+++ b/arch/powerpc/boot/wrapper
-@@ -174,7 +174,7 @@ cuboot*)
- *-mpc83*)
- platformo=$object/cuboot-83xx.o
- ;;
-- *-tqm8541|*-mpc8560*|*-tqm8560|*-tqm8555)
-+ *-tqm8541|*-mpc8560*|*-tqm8560|*-tqm8555|*-ksi8560*)
- platformo=$object/cuboot-85xx-cpm2.o
- ;;
- *-mpc85*|*-tqm8540|*-sbc85*)
-@@ -199,6 +199,10 @@ adder875-redboot)
- platformo="$object/fixed-head.o $object/redboot-8xx.o"
- binary=y
- ;;
-+simpleboot-virtex405-*)
-+ platformo="$object/virtex405-head.o $object/simpleboot.o"
-+ binary=y
-+ ;;
- esac
-
- vmz="$tmpdir/`basename \"$kernel\"`.$ext"
-@@ -226,10 +230,13 @@ if [ -n "$version" ]; then
- uboot_version="-n Linux-$version"
- fi
-
-+# physical offset of kernel image
-+membase=`${CROSS}objdump -p "$kernel" | grep -m 1 LOAD | awk '{print $7}'`
-+
- case "$platform" in
- uboot)
- rm -f "$ofile"
-- mkimage -A ppc -O linux -T kernel -C gzip -a 00000000 -e 00000000 \
-+ mkimage -A ppc -O linux -T kernel -C gzip -a $membase -e $membase \
- $uboot_version -d "$vmz" "$ofile"
- if [ -z "$cacheit" ]; then
- rm -f "$vmz"
-@@ -298,15 +305,16 @@ treeboot*)
- exit 0
- ;;
- ps3)
-- # The ps3's loader supports loading gzipped binary images from flash
-- # rom to addr zero. The loader enters the image at addr 0x100. A
-- # bootwrapper overlay is use to arrange for the kernel to be loaded
-- # to addr zero and to have a suitable bootwrapper entry at 0x100.
-- # To construct the rom image, 0x100 bytes from offset 0x100 in the
-- # kernel is copied to the bootwrapper symbol __system_reset_kernel.
-- # The 0x100 bytes at the bootwrapper symbol __system_reset_overlay is
-- # then copied to offset 0x100. At runtime the bootwrapper program
-- # copies the 0x100 bytes at __system_reset_kernel to addr 0x100.
-+ # The ps3's loader supports loading a gzipped binary image from flash
-+ # rom to ram addr zero. The loader then enters the system reset
-+ # vector at addr 0x100. A bootwrapper overlay is used to arrange for
-+ # a binary image of the kernel to be at addr zero, and yet have a
-+ # suitable bootwrapper entry at 0x100. To construct the final rom
-+ # image 512 bytes from offset 0x100 is copied to the bootwrapper
-+ # place holder at symbol __system_reset_kernel. The 512 bytes of the
-+ # bootwrapper entry code at symbol __system_reset_overlay is then
-+ # copied to offset 0x100. At runtime the bootwrapper program copies
-+ # the data at __system_reset_kernel back to addr 0x100.
-
- system_reset_overlay=0x`${CROSS}nm "$ofile" \
- | grep ' __system_reset_overlay$' \
-@@ -317,7 +325,7 @@ ps3)
- | cut -d' ' -f1`
- system_reset_kernel=`printf "%d" $system_reset_kernel`
- overlay_dest="256"
-- overlay_size="256"
-+ overlay_size="512"
-
- ${CROSS}objcopy -O binary "$ofile" "$ofile.bin"
-
---- /dev/null
-+++ b/arch/powerpc/configs/40x/ep405_defconfig
-@@ -0,0 +1,968 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc2
-+# Fri Feb 15 21:50:09 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+CONFIG_40x=y
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_KALLSYMS_EXTRA_PASS=y
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_PREEMPT_RCU is not set
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_EP405=y
-+# CONFIG_KILAUEA is not set
-+# CONFIG_MAKALU is not set
-+# CONFIG_WALNUT is not set
-+# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
-+CONFIG_405GP=y
-+CONFIG_IBM405_ERR77=y
-+CONFIG_IBM405_ERR51=y
-+# CONFIG_IPIC is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_RCU_TRACE=y
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+CONFIG_MTD_OF_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=m
-+CONFIG_MTD_BLOCK=m
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+CONFIG_THERMAL=y
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_EHCI_HCD is not set
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
-+CONFIG_USB_OHCI_HCD_PCI=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/40x/kilauea_defconfig
-@@ -0,0 +1,839 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc2
-+# Fri Feb 15 21:51:43 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+CONFIG_40x=y
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_KALLSYMS_EXTRA_PASS=y
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_PREEMPT_RCU is not set
-+CONFIG_PPC4xx_PCI_EXPRESS=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_EP405 is not set
-+CONFIG_KILAUEA=y
-+# CONFIG_MAKALU is not set
-+# CONFIG_WALNUT is not set
-+# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
-+CONFIG_405EX=y
-+# CONFIG_IPIC is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_RCU_TRACE=y
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+CONFIG_MTD_OF_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=m
-+CONFIG_MTD_BLOCK=m
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+# CONFIG_MISC_DEVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=256
-+CONFIG_IBM_NEW_EMAC_TXB=256
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+CONFIG_THERMAL=y
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/40x/makalu_defconfig
-@@ -0,0 +1,839 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc2
-+# Fri Feb 15 21:52:30 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+CONFIG_40x=y
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_KALLSYMS_EXTRA_PASS=y
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_PREEMPT_RCU is not set
-+CONFIG_PPC4xx_PCI_EXPRESS=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_EP405 is not set
-+# CONFIG_KILAUEA is not set
-+CONFIG_MAKALU=y
-+# CONFIG_WALNUT is not set
-+# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
-+CONFIG_405EX=y
-+# CONFIG_IPIC is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_RCU_TRACE=y
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+CONFIG_MTD_OF_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=m
-+CONFIG_MTD_BLOCK=m
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+# CONFIG_MISC_DEVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=256
-+CONFIG_IBM_NEW_EMAC_TXB=256
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+CONFIG_THERMAL=y
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/40x/walnut_defconfig
-@@ -0,0 +1,887 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc2
-+# Fri Feb 15 21:54:12 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+CONFIG_40x=y
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_KALLSYMS_EXTRA_PASS=y
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_PREEMPT_RCU is not set
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_EP405 is not set
-+# CONFIG_KILAUEA is not set
-+# CONFIG_MAKALU is not set
-+CONFIG_WALNUT=y
-+# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
-+CONFIG_405GP=y
-+CONFIG_IBM405_ERR77=y
-+CONFIG_IBM405_ERR51=y
-+# CONFIG_IPIC is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_OF_RTC=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_RCU_TRACE=y
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+# CONFIG_PCI_LEGACY is not set
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+CONFIG_MTD_OF_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=m
-+CONFIG_MTD_BLOCK=m
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+CONFIG_THERMAL=y
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/44x/bamboo_defconfig
-@@ -0,0 +1,815 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc2
-+# Fri Feb 15 21:36:39 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_PREEMPT_RCU is not set
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_BAMBOO=y
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
-+# CONFIG_WARP is not set
-+CONFIG_440EP=y
-+CONFIG_IBM440EP_ERR42=y
-+# CONFIG_IPIC is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_RCU_TRACE=y
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE=""
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+CONFIG_THERMAL=y
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_KGDB is not set
-+# CONFIG_XMON is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/44x/canyonlands_defconfig
-@@ -0,0 +1,721 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc1
-+# Thu Feb 21 14:29:28 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+# CONFIG_LOGBUFFER is not set
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_PREEMPT_RCU is not set
-+CONFIG_PPC4xx_PCI_EXPRESS=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
-+# CONFIG_WARP is not set
-+CONFIG_CANYONLANDS=y
-+CONFIG_460EX=y
-+# CONFIG_IPIC is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_RCU_TRACE=y
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE=""
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+# CONFIG_MISC_DEVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=256
-+CONFIG_IBM_NEW_EMAC_TXB=256
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+CONFIG_IBM_NEW_EMAC_TAH=y
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_KGDB is not set
-+# CONFIG_XMON is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+# CONFIG_CRYPTO is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/44x/ebony_defconfig
-@@ -0,0 +1,898 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc2
-+# Fri Feb 15 21:50:44 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_KALLSYMS_EXTRA_PASS=y
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_PREEMPT_RCU is not set
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+CONFIG_EBONY=y
-+# CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
-+# CONFIG_WARP is not set
-+CONFIG_440GP=y
-+# CONFIG_IPIC is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_OF_RTC=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_RCU_TRACE=y
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_PARTS is not set
-+CONFIG_MTD_OF_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+CONFIG_THERMAL=y
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+# CONFIG_CRYPTO_HW is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/44x/katmai_defconfig
-@@ -0,0 +1,790 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:17:43 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_PPC4xx_PCI_EXPRESS=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+CONFIG_KATMAI=y
-+# CONFIG_RAINIER is not set
-+CONFIG_440SPe=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE=""
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="katmai.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_MACINTOSH_DRIVERS=y
-+# CONFIG_MAC_EMUMOUSEBTN is not set
-+# CONFIG_WINDFARM is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_KPROBES is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_KGDB is not set
-+# CONFIG_XMON is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/44x/rainier_defconfig
-@@ -0,0 +1,899 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc2
-+# Fri Feb 15 21:53:10 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_PREEMPT_RCU is not set
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+CONFIG_RAINIER=y
-+# CONFIG_WARP is not set
-+CONFIG_440GRX=y
-+# CONFIG_IPIC is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_RCU_TRACE=y
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE=""
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+CONFIG_MTD_OF_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+# CONFIG_MTD_BLKDEVS is not set
-+# CONFIG_MTD_BLOCK is not set
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_MACINTOSH_DRIVERS=y
-+# CONFIG_MAC_EMUMOUSEBTN is not set
-+# CONFIG_WINDFARM is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_NET_ETHERNET is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+CONFIG_THERMAL=y
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_KGDB is not set
-+# CONFIG_XMON is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+CONFIG_PPC_EARLY_DEBUG=y
-+# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
-+# CONFIG_PPC_EARLY_DEBUG_G5 is not set
-+# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
-+# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
-+# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
-+# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
-+# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
-+# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
-+CONFIG_PPC_EARLY_DEBUG_44x=y
-+# CONFIG_PPC_EARLY_DEBUG_40x is not set
-+# CONFIG_PPC_EARLY_DEBUG_CPM is not set
-+CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
-+CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x1
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/44x/sequoia_defconfig
-@@ -0,0 +1,916 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc2
-+# Fri Feb 15 21:53:46 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_PREEMPT_RCU is not set
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+CONFIG_SEQUOIA=y
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
-+# CONFIG_WARP is not set
-+CONFIG_440EPX=y
-+# CONFIG_IPIC is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_RCU_TRACE=y
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE=""
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+CONFIG_MTD_OF_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+# CONFIG_MTD_BLKDEVS is not set
-+# CONFIG_MTD_BLOCK is not set
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+CONFIG_THERMAL=y
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_KGDB is not set
-+# CONFIG_XMON is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+CONFIG_PPC_EARLY_DEBUG=y
-+# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
-+# CONFIG_PPC_EARLY_DEBUG_G5 is not set
-+# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
-+# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
-+# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
-+# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
-+# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
-+# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
-+CONFIG_PPC_EARLY_DEBUG_44x=y
-+# CONFIG_PPC_EARLY_DEBUG_40x is not set
-+# CONFIG_PPC_EARLY_DEBUG_CPM is not set
-+CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
-+CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x1
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/44x/taishan_defconfig
-@@ -0,0 +1,815 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc2
-+# Fri Feb 15 21:40:44 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_PREEMPT_RCU is not set
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+CONFIG_TAISHAN=y
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
-+# CONFIG_WARP is not set
-+CONFIG_440GX=y
-+# CONFIG_IPIC is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_RCU_TRACE=y
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE=""
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_MACINTOSH_DRIVERS=y
-+# CONFIG_MAC_EMUMOUSEBTN is not set
-+# CONFIG_WINDFARM is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+CONFIG_IBM_NEW_EMAC_TAH=y
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+CONFIG_THERMAL=y
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_KGDB is not set
-+# CONFIG_XMON is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/44x/warp_defconfig
-@@ -0,0 +1,1110 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc2
-+# Fri Feb 15 21:54:43 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION="-pika"
-+# CONFIG_LOCALVERSION_AUTO is not set
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+# CONFIG_HOTPLUG is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_PREEMPT_RCU is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
-+CONFIG_WARP=y
-+CONFIG_440EP=y
-+CONFIG_IBM440EP_ERR42=y
-+# CONFIG_IPIC is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+# CONFIG_HZ_250 is not set
-+# CONFIG_HZ_300 is not set
-+CONFIG_HZ_1000=y
-+CONFIG_HZ=1000
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_RCU_TRACE=y
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="ip=on"
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+# CONFIG_IP_PNP_BOOTP is not set
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IP_VS is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+CONFIG_NETFILTER=y
-+# CONFIG_NETFILTER_DEBUG is not set
-+CONFIG_NETFILTER_ADVANCED=y
-+
-+#
-+# Core Netfilter Configuration
-+#
-+# CONFIG_NETFILTER_NETLINK_QUEUE is not set
-+# CONFIG_NETFILTER_NETLINK_LOG is not set
-+# CONFIG_NF_CONNTRACK is not set
-+# CONFIG_NETFILTER_XTABLES is not set
-+
-+#
-+# IP: Netfilter Configuration
-+#
-+# CONFIG_IP_NF_QUEUE is not set
-+# CONFIG_IP_NF_IPTABLES is not set
-+# CONFIG_IP_NF_ARPTABLES is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+CONFIG_VLAN_8021Q=y
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+# CONFIG_STANDALONE is not set
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_PARTS is not set
-+CONFIG_MTD_OF_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+CONFIG_MTD_OOPS=m
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+CONFIG_MTD_NAND=y
-+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
-+CONFIG_MTD_NAND_ECC_SMC=y
-+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-+CONFIG_MTD_NAND_IDS=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+# CONFIG_MTD_NAND_NANDSIM is not set
-+# CONFIG_MTD_NAND_PLATFORM is not set
-+# CONFIG_MTD_ALAUDA is not set
-+# CONFIG_MTD_NAND_FSL_ELBC is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=4096
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+# CONFIG_CHR_DEV_SG is not set
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+CONFIG_SCSI_SPI_ATTRS=y
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+# CONFIG_SCSI_LOWLEVEL is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+# CONFIG_I2C_CHARDEV is not set
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_MPC is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+CONFIG_SENSORS_EEPROM=y
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+CONFIG_THERMAL=y
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+# CONFIG_USB_ARCH_HAS_EHCI is not set
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+# CONFIG_USB_DEVICEFS is not set
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_GADGET is not set
-+CONFIG_MMC=m
-+# CONFIG_MMC_DEBUG is not set
-+# CONFIG_MMC_UNSAFE_RESUME is not set
-+
-+#
-+# MMC/SD Card Drivers
-+#
-+CONFIG_MMC_BLOCK=m
-+CONFIG_MMC_BLOCK_BOUNCE=y
-+# CONFIG_SDIO_UART is not set
-+
-+#
-+# MMC/SD Host Controller Drivers
-+#
-+# CONFIG_MMC_WBSD is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+# CONFIG_TMPFS is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+CONFIG_NLS_CODEPAGE_850=y
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+CONFIG_NLS_ASCII=y
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+CONFIG_NLS_ISO8859_15=y
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_CRC_CCITT=y
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+# CONFIG_SCHED_DEBUG is not set
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_SLAB is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+CONFIG_BDI_SWITCH=y
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/83xx/mpc8313_rdb_defconfig
-@@ -0,0 +1,1395 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Fri Apr 11 11:10:09 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_FSL_EMB_PERFMON is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC83xx=y
-+CONFIG_MPC831x_RDB=y
-+# CONFIG_MPC832x_MDS is not set
-+# CONFIG_MPC832x_RDB is not set
-+# CONFIG_MPC834x_MDS is not set
-+# CONFIG_MPC834x_ITX is not set
-+# CONFIG_MPC836x_MDS is not set
-+# CONFIG_MPC837x_MDS is not set
-+# CONFIG_MPC837x_RDB is not set
-+# CONFIG_SBC834x is not set
-+CONFIG_PPC_MPC831x=y
-+CONFIG_IPIC=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_FORCE_MAX_ZONEORDER=11
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_PARTS is not set
-+CONFIG_MTD_OF_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_DATAFLASH is not set
-+# CONFIG_MTD_M25P80 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+CONFIG_MTD_NAND=y
-+CONFIG_MTD_NAND_VERIFY_WRITE=y
-+# CONFIG_MTD_NAND_ECC_SMC is not set
-+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-+CONFIG_MTD_NAND_IDS=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+# CONFIG_MTD_NAND_CAFE is not set
-+# CONFIG_MTD_NAND_NANDSIM is not set
-+# CONFIG_MTD_NAND_PLATFORM is not set
-+# CONFIG_MTD_ALAUDA is not set
-+CONFIG_MTD_NAND_FSL_ELBC=y
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+# CONFIG_BLK_DEV_SD is not set
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+CONFIG_SCSI_SPI_ATTRS=y
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_MVSAS is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+# CONFIG_ATA is not set
-+CONFIG_MD=y
-+CONFIG_BLK_DEV_MD=y
-+CONFIG_MD_LINEAR=y
-+CONFIG_MD_RAID0=y
-+CONFIG_MD_RAID1=y
-+# CONFIG_MD_RAID10 is not set
-+# CONFIG_MD_RAID456 is not set
-+# CONFIG_MD_MULTIPATH is not set
-+# CONFIG_MD_FAULTY is not set
-+# CONFIG_BLK_DEV_DM is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+CONFIG_CICADA_PHY=y
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_ENC28J60 is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+CONFIG_NET_PCI=y
-+# CONFIG_PCNET32 is not set
-+# CONFIG_AMD8111_ETH is not set
-+# CONFIG_ADAPTEC_STARFIRE is not set
-+# CONFIG_B44 is not set
-+# CONFIG_FORCEDETH is not set
-+# CONFIG_EEPRO100 is not set
-+CONFIG_E100=y
-+# CONFIG_FEALNX is not set
-+# CONFIG_NATSEMI is not set
-+# CONFIG_NE2K_PCI is not set
-+# CONFIG_8139CP is not set
-+# CONFIG_8139TOO is not set
-+# CONFIG_R6040 is not set
-+# CONFIG_SIS900 is not set
-+# CONFIG_EPIC100 is not set
-+# CONFIG_SUNDANCE is not set
-+# CONFIG_TLAN is not set
-+# CONFIG_VIA_RHINE is not set
-+# CONFIG_SC92031 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+CONFIG_SPI=y
-+# CONFIG_SPI_DEBUG is not set
-+CONFIG_SPI_MASTER=y
-+
-+#
-+# SPI Master Controller Drivers
-+#
-+CONFIG_SPI_BITBANG=y
-+CONFIG_SPI_MPC83xx=y
-+
-+#
-+# SPI Protocol Masters
-+#
-+# CONFIG_SPI_AT25 is not set
-+# CONFIG_SPI_SPIDEV is not set
-+# CONFIG_SPI_TLE62X0 is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM70 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+
-+#
-+# USB Input Devices
-+#
-+# CONFIG_USB_HID is not set
-+
-+#
-+# USB HID Boot Protocol drivers
-+#
-+# CONFIG_USB_KBD is not set
-+# CONFIG_USB_MOUSE is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+CONFIG_USB_EHCI_HCD=y
-+CONFIG_USB_EHCI_ROOT_HUB_TT=y
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+CONFIG_USB_EHCI_FSL=y
-+CONFIG_USB_EHCI_HCD_PPC_OF=y
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
-+CONFIG_USB_OHCI_HCD_PCI=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+CONFIG_USB_UHCI_HCD=y
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+CONFIG_USB_GADGET=y
-+# CONFIG_USB_GADGET_DEBUG is not set
-+# CONFIG_USB_GADGET_DEBUG_FILES is not set
-+CONFIG_USB_GADGET_SELECTED=y
-+# CONFIG_USB_GADGET_AMD5536UDC is not set
-+# CONFIG_USB_GADGET_ATMEL_USBA is not set
-+# CONFIG_USB_GADGET_FSL_USB2 is not set
-+CONFIG_USB_GADGET_NET2280=y
-+CONFIG_USB_NET2280=y
-+# CONFIG_USB_GADGET_PXA2XX is not set
-+# CONFIG_USB_GADGET_M66592 is not set
-+# CONFIG_USB_GADGET_GOKU is not set
-+# CONFIG_USB_GADGET_LH7A40X is not set
-+# CONFIG_USB_GADGET_OMAP is not set
-+# CONFIG_USB_GADGET_S3C2410 is not set
-+# CONFIG_USB_GADGET_AT91 is not set
-+# CONFIG_USB_GADGET_DUMMY_HCD is not set
-+CONFIG_USB_GADGET_DUALSPEED=y
-+# CONFIG_USB_ZERO is not set
-+CONFIG_USB_ETH=y
-+CONFIG_USB_ETH_RNDIS=y
-+# CONFIG_USB_GADGETFS is not set
-+# CONFIG_USB_FILE_STORAGE is not set
-+# CONFIG_USB_G_SERIAL is not set
-+# CONFIG_USB_MIDI_GADGET is not set
-+# CONFIG_USB_G_PRINTER is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+CONFIG_RTC_INTF_DEV_UIE_EMUL=y
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+CONFIG_RTC_DRV_DS1307=y
-+# CONFIG_RTC_DRV_DS1374 is not set
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+# CONFIG_RTC_DRV_MAX6902 is not set
-+# CONFIG_RTC_DRV_R9701 is not set
-+# CONFIG_RTC_DRV_RS5C348 is not set
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/83xx/mpc8315_rdb_defconfig
-@@ -0,0 +1,1451 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:15 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_FSL_EMB_PERFMON is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC83xx=y
-+CONFIG_MPC831x_RDB=y
-+# CONFIG_MPC832x_MDS is not set
-+# CONFIG_MPC832x_RDB is not set
-+# CONFIG_MPC834x_MDS is not set
-+# CONFIG_MPC834x_ITX is not set
-+# CONFIG_MPC836x_MDS is not set
-+# CONFIG_MPC837x_MDS is not set
-+# CONFIG_MPC837x_RDB is not set
-+# CONFIG_SBC834x is not set
-+CONFIG_PPC_MPC831x=y
-+CONFIG_IPIC=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_PARTS is not set
-+# CONFIG_MTD_OF_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_DATAFLASH is not set
-+# CONFIG_MTD_M25P80 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+CONFIG_MTD_NAND=y
-+CONFIG_MTD_NAND_VERIFY_WRITE=y
-+# CONFIG_MTD_NAND_ECC_SMC is not set
-+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-+CONFIG_MTD_NAND_IDS=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+# CONFIG_MTD_NAND_CAFE is not set
-+# CONFIG_MTD_NAND_NANDSIM is not set
-+# CONFIG_MTD_NAND_PLATFORM is not set
-+# CONFIG_MTD_ALAUDA is not set
-+# CONFIG_MTD_NAND_FSL_ELBC is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+# CONFIG_BLK_DEV_SD is not set
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+CONFIG_SCSI_SPI_ATTRS=y
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_MVSAS is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_IPR is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+CONFIG_ATA=y
-+# CONFIG_ATA_NONSTANDARD is not set
-+# CONFIG_SATA_AHCI is not set
-+# CONFIG_SATA_SVW is not set
-+# CONFIG_ATA_PIIX is not set
-+# CONFIG_SATA_MV is not set
-+# CONFIG_SATA_NV is not set
-+# CONFIG_PDC_ADMA is not set
-+# CONFIG_SATA_QSTOR is not set
-+# CONFIG_SATA_PROMISE is not set
-+# CONFIG_SATA_SX4 is not set
-+# CONFIG_SATA_SIL is not set
-+# CONFIG_SATA_SIL24 is not set
-+# CONFIG_SATA_SIS is not set
-+# CONFIG_SATA_ULI is not set
-+# CONFIG_SATA_VIA is not set
-+# CONFIG_SATA_VITESSE is not set
-+# CONFIG_SATA_INIC162X is not set
-+CONFIG_SATA_FSL=y
-+# CONFIG_PATA_ALI is not set
-+# CONFIG_PATA_AMD is not set
-+# CONFIG_PATA_ARTOP is not set
-+# CONFIG_PATA_ATIIXP is not set
-+# CONFIG_PATA_CMD640_PCI is not set
-+# CONFIG_PATA_CMD64X is not set
-+# CONFIG_PATA_CS5520 is not set
-+# CONFIG_PATA_CS5530 is not set
-+# CONFIG_PATA_CYPRESS is not set
-+# CONFIG_PATA_EFAR is not set
-+# CONFIG_ATA_GENERIC is not set
-+# CONFIG_PATA_HPT366 is not set
-+# CONFIG_PATA_HPT37X is not set
-+# CONFIG_PATA_HPT3X2N is not set
-+# CONFIG_PATA_HPT3X3 is not set
-+# CONFIG_PATA_IT821X is not set
-+# CONFIG_PATA_IT8213 is not set
-+# CONFIG_PATA_JMICRON is not set
-+# CONFIG_PATA_TRIFLEX is not set
-+# CONFIG_PATA_MARVELL is not set
-+# CONFIG_PATA_MPIIX is not set
-+# CONFIG_PATA_OLDPIIX is not set
-+# CONFIG_PATA_NETCELL is not set
-+# CONFIG_PATA_NINJA32 is not set
-+# CONFIG_PATA_NS87410 is not set
-+# CONFIG_PATA_NS87415 is not set
-+# CONFIG_PATA_OPTI is not set
-+# CONFIG_PATA_OPTIDMA is not set
-+# CONFIG_PATA_PDC_OLD is not set
-+# CONFIG_PATA_RADISYS is not set
-+# CONFIG_PATA_RZ1000 is not set
-+# CONFIG_PATA_SC1200 is not set
-+# CONFIG_PATA_SERVERWORKS is not set
-+# CONFIG_PATA_PDC2027X is not set
-+# CONFIG_PATA_SIL680 is not set
-+# CONFIG_PATA_SIS is not set
-+# CONFIG_PATA_VIA is not set
-+# CONFIG_PATA_WINBOND is not set
-+# CONFIG_PATA_PLATFORM is not set
-+CONFIG_MD=y
-+CONFIG_BLK_DEV_MD=y
-+CONFIG_MD_LINEAR=y
-+CONFIG_MD_RAID0=y
-+CONFIG_MD_RAID1=y
-+# CONFIG_MD_RAID10 is not set
-+# CONFIG_MD_RAID456 is not set
-+# CONFIG_MD_MULTIPATH is not set
-+# CONFIG_MD_FAULTY is not set
-+# CONFIG_BLK_DEV_DM is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_ENC28J60 is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+CONFIG_NET_PCI=y
-+# CONFIG_PCNET32 is not set
-+# CONFIG_AMD8111_ETH is not set
-+# CONFIG_ADAPTEC_STARFIRE is not set
-+# CONFIG_B44 is not set
-+# CONFIG_FORCEDETH is not set
-+# CONFIG_EEPRO100 is not set
-+CONFIG_E100=y
-+# CONFIG_FEALNX is not set
-+# CONFIG_NATSEMI is not set
-+# CONFIG_NE2K_PCI is not set
-+# CONFIG_8139CP is not set
-+# CONFIG_8139TOO is not set
-+# CONFIG_R6040 is not set
-+# CONFIG_SIS900 is not set
-+# CONFIG_EPIC100 is not set
-+# CONFIG_SUNDANCE is not set
-+# CONFIG_TLAN is not set
-+# CONFIG_VIA_RHINE is not set
-+# CONFIG_SC92031 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+CONFIG_SPI=y
-+# CONFIG_SPI_DEBUG is not set
-+CONFIG_SPI_MASTER=y
-+
-+#
-+# SPI Master Controller Drivers
-+#
-+CONFIG_SPI_BITBANG=y
-+CONFIG_SPI_MPC83xx=y
-+
-+#
-+# SPI Protocol Masters
-+#
-+# CONFIG_SPI_AT25 is not set
-+# CONFIG_SPI_SPIDEV is not set
-+# CONFIG_SPI_TLE62X0 is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM70 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+
-+#
-+# USB Input Devices
-+#
-+# CONFIG_USB_HID is not set
-+
-+#
-+# USB HID Boot Protocol drivers
-+#
-+# CONFIG_USB_KBD is not set
-+# CONFIG_USB_MOUSE is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+CONFIG_USB_EHCI_HCD=y
-+CONFIG_USB_EHCI_ROOT_HUB_TT=y
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+CONFIG_USB_EHCI_FSL=y
-+CONFIG_USB_EHCI_HCD_PPC_OF=y
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
-+CONFIG_USB_OHCI_HCD_PCI=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+CONFIG_USB_UHCI_HCD=y
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+CONFIG_USB_GADGET=y
-+# CONFIG_USB_GADGET_DEBUG is not set
-+# CONFIG_USB_GADGET_DEBUG_FILES is not set
-+CONFIG_USB_GADGET_SELECTED=y
-+# CONFIG_USB_GADGET_AMD5536UDC is not set
-+# CONFIG_USB_GADGET_ATMEL_USBA is not set
-+# CONFIG_USB_GADGET_FSL_USB2 is not set
-+CONFIG_USB_GADGET_NET2280=y
-+CONFIG_USB_NET2280=y
-+# CONFIG_USB_GADGET_PXA2XX is not set
-+# CONFIG_USB_GADGET_M66592 is not set
-+# CONFIG_USB_GADGET_GOKU is not set
-+# CONFIG_USB_GADGET_LH7A40X is not set
-+# CONFIG_USB_GADGET_OMAP is not set
-+# CONFIG_USB_GADGET_S3C2410 is not set
-+# CONFIG_USB_GADGET_AT91 is not set
-+# CONFIG_USB_GADGET_DUMMY_HCD is not set
-+CONFIG_USB_GADGET_DUALSPEED=y
-+# CONFIG_USB_ZERO is not set
-+CONFIG_USB_ETH=y
-+CONFIG_USB_ETH_RNDIS=y
-+# CONFIG_USB_GADGETFS is not set
-+# CONFIG_USB_FILE_STORAGE is not set
-+# CONFIG_USB_G_SERIAL is not set
-+# CONFIG_USB_MIDI_GADGET is not set
-+# CONFIG_USB_G_PRINTER is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+CONFIG_RTC_INTF_DEV_UIE_EMUL=y
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+CONFIG_RTC_DRV_DS1307=y
-+# CONFIG_RTC_DRV_DS1374 is not set
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+# CONFIG_RTC_DRV_MAX6902 is not set
-+# CONFIG_RTC_DRV_R9701 is not set
-+# CONFIG_RTC_DRV_RS5C348 is not set
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/83xx/mpc832x_mds_defconfig
-@@ -0,0 +1,1081 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc7
-+# Mon Mar 31 11:36:51 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_FSL_EMB_PERFMON is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC83xx=y
-+# CONFIG_MPC831x_RDB is not set
-+CONFIG_MPC832x_MDS=y
-+# CONFIG_MPC832x_RDB is not set
-+# CONFIG_MPC834x_MDS is not set
-+# CONFIG_MPC834x_ITX is not set
-+# CONFIG_MPC836x_MDS is not set
-+# CONFIG_MPC837x_MDS is not set
-+# CONFIG_MPC837x_RDB is not set
-+# CONFIG_SBC834x is not set
-+CONFIG_PPC_MPC832x=y
-+CONFIG_IPIC=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_QUICC_ENGINE=y
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+# CONFIG_BLK_DEV_SD is not set
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+# CONFIG_CHR_DEV_SG is not set
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_MVSAS is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+CONFIG_DAVICOM_PHY=y
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_GIANFAR is not set
-+CONFIG_UCC_GETH=y
-+# CONFIG_UGETH_NAPI is not set
-+# CONFIG_UGETH_MAGIC_PACKET is not set
-+# CONFIG_UGETH_FILTERING is not set
-+# CONFIG_UGETH_TX_ON_DEMAND is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+# CONFIG_SERIAL_QE is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+# CONFIG_RTC_DRV_DS1307 is not set
-+CONFIG_RTC_DRV_DS1374=y
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+CONFIG_UCC_FAST=y
-+CONFIG_UCC=y
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/83xx/mpc832x_rdb_defconfig
-@@ -0,0 +1,1233 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:16 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_FSL_EMB_PERFMON is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC83xx=y
-+# CONFIG_MPC831x_RDB is not set
-+# CONFIG_MPC832x_MDS is not set
-+CONFIG_MPC832x_RDB=y
-+# CONFIG_MPC834x_MDS is not set
-+# CONFIG_MPC834x_ITX is not set
-+# CONFIG_MPC836x_MDS is not set
-+# CONFIG_MPC837x_MDS is not set
-+# CONFIG_MPC837x_RDB is not set
-+# CONFIG_SBC834x is not set
-+CONFIG_PPC_MPC832x=y
-+CONFIG_IPIC=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_QUICC_ENGINE=y
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+# CONFIG_CHR_DEV_SG is not set
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_MVSAS is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+CONFIG_ICPLUS_PHY=y
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_ENC28J60 is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+CONFIG_E1000=y
-+# CONFIG_E1000_NAPI is not set
-+# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_GIANFAR is not set
-+CONFIG_UCC_GETH=y
-+CONFIG_UGETH_NAPI=y
-+# CONFIG_UGETH_MAGIC_PACKET is not set
-+# CONFIG_UGETH_FILTERING is not set
-+# CONFIG_UGETH_TX_ON_DEMAND is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+# CONFIG_SERIAL_QE is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+CONFIG_SPI=y
-+CONFIG_SPI_MASTER=y
-+
-+#
-+# SPI Master Controller Drivers
-+#
-+CONFIG_SPI_BITBANG=y
-+CONFIG_SPI_MPC83xx=y
-+
-+#
-+# SPI Protocol Masters
-+#
-+# CONFIG_SPI_AT25 is not set
-+# CONFIG_SPI_SPIDEV is not set
-+# CONFIG_SPI_TLE62X0 is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM70 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+
-+#
-+# USB Input Devices
-+#
-+# CONFIG_USB_HID is not set
-+
-+#
-+# USB HID Boot Protocol drivers
-+#
-+# CONFIG_USB_KBD is not set
-+# CONFIG_USB_MOUSE is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+CONFIG_USB_EHCI_HCD=y
-+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+# CONFIG_USB_EHCI_FSL is not set
-+CONFIG_USB_EHCI_HCD_PPC_OF=y
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
-+CONFIG_USB_OHCI_HCD_PCI=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+# CONFIG_USB_GADGET is not set
-+CONFIG_MMC=y
-+# CONFIG_MMC_DEBUG is not set
-+# CONFIG_MMC_UNSAFE_RESUME is not set
-+
-+#
-+# MMC/SD Card Drivers
-+#
-+CONFIG_MMC_BLOCK=y
-+CONFIG_MMC_BLOCK_BOUNCE=y
-+# CONFIG_SDIO_UART is not set
-+
-+#
-+# MMC/SD Host Controller Drivers
-+#
-+# CONFIG_MMC_SDHCI is not set
-+# CONFIG_MMC_WBSD is not set
-+# CONFIG_MMC_TIFM_SD is not set
-+CONFIG_MMC_SPI=y
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+CONFIG_LDM_PARTITION=y
-+# CONFIG_LDM_DEBUG is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+CONFIG_NLS_CODEPAGE_932=y
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+CONFIG_NLS_ISO8859_8=y
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+# CONFIG_NLS_UTF8 is not set
-+# CONFIG_DLM is not set
-+CONFIG_UCC_FAST=y
-+CONFIG_UCC=y
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+CONFIG_CRC_ITU_T=y
-+CONFIG_CRC32=y
-+CONFIG_CRC7=y
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/83xx/mpc834x_itx_defconfig
-@@ -0,0 +1,1295 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:17 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_FSL_EMB_PERFMON is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC83xx=y
-+# CONFIG_MPC831x_RDB is not set
-+# CONFIG_MPC832x_MDS is not set
-+# CONFIG_MPC832x_RDB is not set
-+# CONFIG_MPC834x_MDS is not set
-+CONFIG_MPC834x_ITX=y
-+# CONFIG_MPC836x_MDS is not set
-+# CONFIG_MPC837x_MDS is not set
-+# CONFIG_MPC837x_RDB is not set
-+# CONFIG_SBC834x is not set
-+CONFIG_PPC_MPC834x=y
-+CONFIG_IPIC=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+# CONFIG_MTD_PARTITIONS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+# CONFIG_MTD_BLKDEVS is not set
-+# CONFIG_MTD_BLOCK is not set
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+CONFIG_MTD_PHYSMAP=y
-+CONFIG_MTD_PHYSMAP_START=0xfe000000
-+CONFIG_MTD_PHYSMAP_LEN=0x1000000
-+CONFIG_MTD_PHYSMAP_BANKWIDTH=2
-+# CONFIG_MTD_PHYSMAP_OF is not set
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_DATAFLASH is not set
-+# CONFIG_MTD_M25P80 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+CONFIG_IDE=y
-+CONFIG_IDE_MAX_HWIFS=4
-+# CONFIG_BLK_DEV_IDE is not set
-+# CONFIG_BLK_DEV_HD_ONLY is not set
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+CONFIG_SCSI_SPI_ATTRS=y
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_MVSAS is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_IPR is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+CONFIG_ATA=y
-+# CONFIG_ATA_NONSTANDARD is not set
-+# CONFIG_SATA_AHCI is not set
-+# CONFIG_SATA_SVW is not set
-+# CONFIG_ATA_PIIX is not set
-+# CONFIG_SATA_MV is not set
-+# CONFIG_SATA_NV is not set
-+# CONFIG_PDC_ADMA is not set
-+# CONFIG_SATA_QSTOR is not set
-+# CONFIG_SATA_PROMISE is not set
-+# CONFIG_SATA_SX4 is not set
-+CONFIG_SATA_SIL=y
-+# CONFIG_SATA_SIL24 is not set
-+# CONFIG_SATA_SIS is not set
-+# CONFIG_SATA_ULI is not set
-+# CONFIG_SATA_VIA is not set
-+# CONFIG_SATA_VITESSE is not set
-+# CONFIG_SATA_INIC162X is not set
-+# CONFIG_SATA_FSL is not set
-+# CONFIG_PATA_ALI is not set
-+# CONFIG_PATA_AMD is not set
-+# CONFIG_PATA_ARTOP is not set
-+# CONFIG_PATA_ATIIXP is not set
-+# CONFIG_PATA_CMD640_PCI is not set
-+# CONFIG_PATA_CMD64X is not set
-+# CONFIG_PATA_CS5520 is not set
-+# CONFIG_PATA_CS5530 is not set
-+# CONFIG_PATA_CYPRESS is not set
-+# CONFIG_PATA_EFAR is not set
-+# CONFIG_ATA_GENERIC is not set
-+# CONFIG_PATA_HPT366 is not set
-+# CONFIG_PATA_HPT37X is not set
-+# CONFIG_PATA_HPT3X2N is not set
-+# CONFIG_PATA_HPT3X3 is not set
-+# CONFIG_PATA_IT821X is not set
-+# CONFIG_PATA_IT8213 is not set
-+# CONFIG_PATA_JMICRON is not set
-+# CONFIG_PATA_TRIFLEX is not set
-+# CONFIG_PATA_MARVELL is not set
-+# CONFIG_PATA_MPIIX is not set
-+# CONFIG_PATA_OLDPIIX is not set
-+# CONFIG_PATA_NETCELL is not set
-+# CONFIG_PATA_NINJA32 is not set
-+# CONFIG_PATA_NS87410 is not set
-+# CONFIG_PATA_NS87415 is not set
-+# CONFIG_PATA_OPTI is not set
-+# CONFIG_PATA_OPTIDMA is not set
-+# CONFIG_PATA_PDC_OLD is not set
-+# CONFIG_PATA_RADISYS is not set
-+# CONFIG_PATA_RZ1000 is not set
-+# CONFIG_PATA_SC1200 is not set
-+# CONFIG_PATA_SERVERWORKS is not set
-+# CONFIG_PATA_PDC2027X is not set
-+# CONFIG_PATA_SIL680 is not set
-+# CONFIG_PATA_SIS is not set
-+# CONFIG_PATA_VIA is not set
-+# CONFIG_PATA_WINBOND is not set
-+CONFIG_PATA_PLATFORM=y
-+CONFIG_PATA_OF_PLATFORM=y
-+CONFIG_MD=y
-+CONFIG_BLK_DEV_MD=y
-+CONFIG_MD_LINEAR=y
-+CONFIG_MD_RAID0=y
-+CONFIG_MD_RAID1=y
-+# CONFIG_MD_RAID10 is not set
-+# CONFIG_MD_RAID456 is not set
-+# CONFIG_MD_MULTIPATH is not set
-+# CONFIG_MD_FAULTY is not set
-+# CONFIG_BLK_DEV_DM is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+CONFIG_CICADA_PHY=y
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+# CONFIG_NET_ETHERNET is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+CONFIG_SENSORS_PCF8574=y
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+CONFIG_SPI=y
-+CONFIG_SPI_MASTER=y
-+
-+#
-+# SPI Master Controller Drivers
-+#
-+CONFIG_SPI_BITBANG=y
-+CONFIG_SPI_MPC83xx=y
-+
-+#
-+# SPI Protocol Masters
-+#
-+# CONFIG_SPI_AT25 is not set
-+# CONFIG_SPI_SPIDEV is not set
-+# CONFIG_SPI_TLE62X0 is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+CONFIG_USB_EHCI_HCD=y
-+CONFIG_USB_EHCI_ROOT_HUB_TT=y
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+CONFIG_USB_EHCI_FSL=y
-+CONFIG_USB_EHCI_HCD_PPC_OF=y
-+# CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_OHCI_HCD is not set
-+CONFIG_USB_UHCI_HCD=y
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+CONFIG_RTC_INTF_DEV_UIE_EMUL=y
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+CONFIG_RTC_DRV_DS1307=y
-+# CONFIG_RTC_DRV_DS1374 is not set
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+# CONFIG_RTC_DRV_MAX6902 is not set
-+# CONFIG_RTC_DRV_R9701 is not set
-+# CONFIG_RTC_DRV_RS5C348 is not set
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+CONFIG_MAC_PARTITION=y
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+# CONFIG_NLS_CODEPAGE_437 is not set
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+# CONFIG_NLS_ISO8859_1 is not set
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+# CONFIG_NLS_UTF8 is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/83xx/mpc834x_itxgp_defconfig
-@@ -0,0 +1,1222 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:18 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_FSL_EMB_PERFMON is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC83xx=y
-+# CONFIG_MPC831x_RDB is not set
-+# CONFIG_MPC832x_MDS is not set
-+# CONFIG_MPC832x_RDB is not set
-+# CONFIG_MPC834x_MDS is not set
-+CONFIG_MPC834x_ITX=y
-+# CONFIG_MPC836x_MDS is not set
-+# CONFIG_MPC837x_MDS is not set
-+# CONFIG_MPC837x_RDB is not set
-+# CONFIG_SBC834x is not set
-+CONFIG_PPC_MPC834x=y
-+CONFIG_IPIC=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+# CONFIG_MTD_PARTITIONS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+# CONFIG_MTD_BLKDEVS is not set
-+# CONFIG_MTD_BLOCK is not set
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+CONFIG_MTD_PHYSMAP=y
-+CONFIG_MTD_PHYSMAP_START=0xfe000000
-+CONFIG_MTD_PHYSMAP_LEN=0x800000
-+CONFIG_MTD_PHYSMAP_BANKWIDTH=2
-+# CONFIG_MTD_PHYSMAP_OF is not set
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_DATAFLASH is not set
-+# CONFIG_MTD_M25P80 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+CONFIG_SCSI_SPI_ATTRS=y
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_MVSAS is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+CONFIG_CICADA_PHY=y
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+# CONFIG_NET_ETHERNET is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+CONFIG_SENSORS_PCF8574=y
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+CONFIG_SPI=y
-+CONFIG_SPI_MASTER=y
-+
-+#
-+# SPI Master Controller Drivers
-+#
-+CONFIG_SPI_BITBANG=y
-+CONFIG_SPI_MPC83xx=y
-+
-+#
-+# SPI Protocol Masters
-+#
-+# CONFIG_SPI_AT25 is not set
-+# CONFIG_SPI_SPIDEV is not set
-+# CONFIG_SPI_TLE62X0 is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+# CONFIG_USB_DEVICEFS is not set
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+CONFIG_USB_EHCI_HCD=y
-+CONFIG_USB_EHCI_ROOT_HUB_TT=y
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+CONFIG_USB_EHCI_FSL=y
-+CONFIG_USB_EHCI_HCD_PPC_OF=y
-+# CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_OHCI_HCD is not set
-+CONFIG_USB_UHCI_HCD=y
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+CONFIG_RTC_INTF_DEV_UIE_EMUL=y
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+CONFIG_RTC_DRV_DS1307=y
-+# CONFIG_RTC_DRV_DS1374 is not set
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+# CONFIG_RTC_DRV_MAX6902 is not set
-+# CONFIG_RTC_DRV_R9701 is not set
-+# CONFIG_RTC_DRV_RS5C348 is not set
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+CONFIG_MAC_PARTITION=y
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+# CONFIG_NLS_CODEPAGE_437 is not set
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+# CONFIG_NLS_ISO8859_1 is not set
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+# CONFIG_NLS_UTF8 is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/83xx/mpc834x_mds_defconfig
-@@ -0,0 +1,1021 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc7
-+# Mon Mar 31 11:36:56 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_FSL_EMB_PERFMON is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC83xx=y
-+# CONFIG_MPC831x_RDB is not set
-+# CONFIG_MPC832x_MDS is not set
-+# CONFIG_MPC832x_RDB is not set
-+CONFIG_MPC834x_MDS=y
-+# CONFIG_MPC834x_ITX is not set
-+# CONFIG_MPC836x_MDS is not set
-+# CONFIG_MPC837x_MDS is not set
-+# CONFIG_MPC837x_RDB is not set
-+# CONFIG_SBC834x is not set
-+CONFIG_PPC_MPC834x=y
-+CONFIG_IPIC=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=m
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=y
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+CONFIG_NET_PCI=y
-+# CONFIG_PCNET32 is not set
-+# CONFIG_AMD8111_ETH is not set
-+# CONFIG_ADAPTEC_STARFIRE is not set
-+# CONFIG_B44 is not set
-+# CONFIG_FORCEDETH is not set
-+# CONFIG_EEPRO100 is not set
-+CONFIG_E100=y
-+# CONFIG_FEALNX is not set
-+# CONFIG_NATSEMI is not set
-+# CONFIG_NE2K_PCI is not set
-+# CONFIG_8139CP is not set
-+# CONFIG_8139TOO is not set
-+# CONFIG_R6040 is not set
-+# CONFIG_SIS900 is not set
-+# CONFIG_EPIC100 is not set
-+# CONFIG_SUNDANCE is not set
-+# CONFIG_TLAN is not set
-+# CONFIG_VIA_RHINE is not set
-+# CONFIG_SC92031 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+# CONFIG_GFAR_NAPI is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+# CONFIG_RTC_DRV_DS1307 is not set
-+CONFIG_RTC_DRV_DS1374=y
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/83xx/mpc836x_mds_defconfig
-@@ -0,0 +1,1079 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc7
-+# Mon Mar 31 11:36:57 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_FSL_EMB_PERFMON is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC83xx=y
-+# CONFIG_MPC831x_RDB is not set
-+# CONFIG_MPC832x_MDS is not set
-+# CONFIG_MPC832x_RDB is not set
-+# CONFIG_MPC834x_MDS is not set
-+# CONFIG_MPC834x_ITX is not set
-+CONFIG_MPC836x_MDS=y
-+# CONFIG_MPC837x_MDS is not set
-+# CONFIG_MPC837x_RDB is not set
-+# CONFIG_SBC834x is not set
-+CONFIG_IPIC=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_QUICC_ENGINE=y
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+# CONFIG_BLK_DEV_SD is not set
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+# CONFIG_CHR_DEV_SG is not set
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_MVSAS is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=y
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_GIANFAR is not set
-+CONFIG_UCC_GETH=y
-+# CONFIG_UGETH_NAPI is not set
-+# CONFIG_UGETH_MAGIC_PACKET is not set
-+# CONFIG_UGETH_FILTERING is not set
-+# CONFIG_UGETH_TX_ON_DEMAND is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+# CONFIG_SERIAL_QE is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+# CONFIG_RTC_DRV_DS1307 is not set
-+CONFIG_RTC_DRV_DS1374=y
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+CONFIG_UCC_FAST=y
-+CONFIG_UCC=y
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/83xx/mpc837x_mds_defconfig
-@@ -0,0 +1,899 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:23 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_FSL_EMB_PERFMON is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC83xx=y
-+# CONFIG_MPC831x_RDB is not set
-+# CONFIG_MPC832x_MDS is not set
-+# CONFIG_MPC832x_RDB is not set
-+# CONFIG_MPC834x_MDS is not set
-+# CONFIG_MPC834x_ITX is not set
-+# CONFIG_MPC836x_MDS is not set
-+CONFIG_MPC837x_MDS=y
-+# CONFIG_MPC837x_RDB is not set
-+# CONFIG_SBC834x is not set
-+CONFIG_PPC_MPC837x=y
-+CONFIG_IPIC=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=m
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_SCSI_DEBUG is not set
-+CONFIG_ATA=y
-+# CONFIG_ATA_NONSTANDARD is not set
-+# CONFIG_SATA_MV is not set
-+CONFIG_SATA_FSL=y
-+# CONFIG_PATA_PLATFORM is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=y
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_E1000E_ENABLED is not set
-+CONFIG_GIANFAR=y
-+# CONFIG_GFAR_NAPI is not set
-+CONFIG_NETDEV_10000=y
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+# CONFIG_USB_ARCH_HAS_OHCI is not set
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/83xx/mpc837x_rdb_defconfig
-@@ -0,0 +1,930 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:24 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_FSL_EMB_PERFMON is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC83xx=y
-+# CONFIG_MPC831x_RDB is not set
-+# CONFIG_MPC832x_MDS is not set
-+# CONFIG_MPC832x_RDB is not set
-+# CONFIG_MPC834x_MDS is not set
-+# CONFIG_MPC834x_ITX is not set
-+# CONFIG_MPC836x_MDS is not set
-+# CONFIG_MPC837x_MDS is not set
-+CONFIG_MPC837x_RDB=y
-+# CONFIG_SBC834x is not set
-+CONFIG_PPC_MPC837x=y
-+CONFIG_IPIC=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_SCSI_DEBUG is not set
-+CONFIG_ATA=y
-+# CONFIG_ATA_NONSTANDARD is not set
-+# CONFIG_SATA_MV is not set
-+CONFIG_SATA_FSL=y
-+# CONFIG_PATA_PLATFORM is not set
-+CONFIG_MD=y
-+CONFIG_BLK_DEV_MD=y
-+# CONFIG_MD_LINEAR is not set
-+# CONFIG_MD_RAID0 is not set
-+CONFIG_MD_RAID1=y
-+# CONFIG_MD_RAID10 is not set
-+CONFIG_MD_RAID456=y
-+CONFIG_MD_RAID5_RESHAPE=y
-+# CONFIG_MD_MULTIPATH is not set
-+# CONFIG_MD_FAULTY is not set
-+# CONFIG_BLK_DEV_DM is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=y
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_E1000E_ENABLED is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_NETDEV_10000 is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+# CONFIG_USB_ARCH_HAS_OHCI is not set
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+# CONFIG_USB_DEVICEFS is not set
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+CONFIG_USB_EHCI_HCD=y
-+CONFIG_USB_EHCI_ROOT_HUB_TT=y
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+CONFIG_USB_EHCI_FSL=y
-+CONFIG_USB_EHCI_HCD_PPC_OF=y
-+# CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+# CONFIG_ENABLE_MUST_CHECK is not set
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_XOR_BLOCKS=y
-+CONFIG_ASYNC_CORE=y
-+CONFIG_ASYNC_MEMCPY=y
-+CONFIG_ASYNC_XOR=y
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/83xx/sbc834x_defconfig
-@@ -0,0 +1,828 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:38 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_FSL_EMB_PERFMON is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC83xx=y
-+# CONFIG_MPC831x_RDB is not set
-+# CONFIG_MPC832x_MDS is not set
-+# CONFIG_MPC832x_RDB is not set
-+# CONFIG_MPC834x_MDS is not set
-+# CONFIG_MPC834x_ITX is not set
-+# CONFIG_MPC836x_MDS is not set
-+# CONFIG_MPC837x_MDS is not set
-+# CONFIG_MPC837x_RDB is not set
-+CONFIG_SBC834x=y
-+CONFIG_PPC_MPC834x=y
-+CONFIG_IPIC=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=m
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+CONFIG_BROADCOM_PHY=y
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_E1000E_ENABLED is not set
-+CONFIG_GIANFAR=y
-+# CONFIG_GFAR_NAPI is not set
-+# CONFIG_NETDEV_10000 is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+# CONFIG_EXT2_FS is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+# CONFIG_CRYPTO_HW is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/ksi8560_defconfig
-@@ -0,0 +1,899 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24
-+# Mon Feb 11 16:25:19 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_PREEMPT_RCU is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+# CONFIG_MPC8560_ADS is not set
-+# CONFIG_MPC85xx_CDS is not set
-+# CONFIG_MPC85xx_MDS is not set
-+# CONFIG_MPC85xx_DS is not set
-+CONFIG_KSI8560=y
-+# CONFIG_STX_GP3 is not set
-+# CONFIG_TQM8540 is not set
-+# CONFIG_TQM8541 is not set
-+# CONFIG_TQM8555 is not set
-+# CONFIG_TQM8560 is not set
-+# CONFIG_SBC8548 is not set
-+# CONFIG_SBC8560 is not set
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_CPM2=y
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_CPM=y
-+
-+#
-+# Kernel options
-+#
-+CONFIG_HIGHMEM=y
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_RCU_TRACE=y
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=y
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+# CONFIG_PROC_DEVICETREE is not set
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+# CONFIG_SECCOMP is not set
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_CONCAT=y
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
-+CONFIG_IDE=y
-+CONFIG_IDE_MAX_HWIFS=4
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+# CONFIG_BLK_DEV_IDEDISK is not set
-+# CONFIG_IDEDISK_MULTI_MODE is not set
-+# CONFIG_BLK_DEV_IDECD is not set
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+CONFIG_IDE_PROC_FS=y
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+# CONFIG_BLK_DEV_PLATFORM is not set
-+# CONFIG_BLK_DEV_IDEDMA is not set
-+CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=y
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+CONFIG_MDIO_BITBANG=y
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+CONFIG_FS_ENET=y
-+# CONFIG_FS_ENET_HAS_SCC is not set
-+CONFIG_FS_ENET_HAS_FCC=y
-+CONFIG_FS_ENET_MDIO_FCC=y
-+CONFIG_NETDEV_1000=y
-+# CONFIG_E1000E_ENABLED is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+CONFIG_NETDEV_10000=y
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_CPM=y
-+CONFIG_SERIAL_CPM_CONSOLE=y
-+CONFIG_SERIAL_CPM_SCC1=y
-+# CONFIG_SERIAL_CPM_SCC2 is not set
-+# CONFIG_SERIAL_CPM_SCC3 is not set
-+# CONFIG_SERIAL_CPM_SCC4 is not set
-+# CONFIG_SERIAL_CPM_SMC1 is not set
-+# CONFIG_SERIAL_CPM_SMC2 is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=y
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+# CONFIG_USB_ARCH_HAS_HCD is not set
-+# CONFIG_USB_ARCH_HAS_OHCI is not set
-+# CONFIG_USB_ARCH_HAS_EHCI is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+# CONFIG_JBD_DEBUG is not set
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+CONFIG_DEBUG_MUTEXES=y
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_HIGHMEM is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_KGDB_CONSOLE is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/mpc8540_ads_defconfig
-@@ -0,0 +1,796 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:25 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+CONFIG_MPC8540_ADS=y
-+# CONFIG_MPC8560_ADS is not set
-+# CONFIG_MPC85xx_CDS is not set
-+# CONFIG_MPC85xx_MDS is not set
-+# CONFIG_MPC85xx_DS is not set
-+# CONFIG_STX_GP3 is not set
-+# CONFIG_TQM8540 is not set
-+# CONFIG_TQM8541 is not set
-+# CONFIG_TQM8555 is not set
-+# CONFIG_TQM8560 is not set
-+# CONFIG_SBC8548 is not set
-+# CONFIG_SBC8560 is not set
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=y
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+# CONFIG_SECCOMP is not set
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=y
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_E1000E_ENABLED is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+CONFIG_NETDEV_10000=y
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=y
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+# CONFIG_USB_ARCH_HAS_HCD is not set
-+# CONFIG_USB_ARCH_HAS_OHCI is not set
-+# CONFIG_USB_ARCH_HAS_EHCI is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+CONFIG_DEBUG_MUTEXES=y
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/mpc8544_ds_defconfig
-@@ -0,0 +1,1564 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc7
-+# Mon Mar 31 11:37:03 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_BSD_PROCESS_ACCT=y
-+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-+# CONFIG_TASKSTATS is not set
-+CONFIG_AUDIT=y
-+# CONFIG_AUDITSYSCALL is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_KALLSYMS_EXTRA_PASS=y
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+CONFIG_MODVERSIONS=y
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_DEFAULT_AS is not set
-+# CONFIG_DEFAULT_DEADLINE is not set
-+CONFIG_DEFAULT_CFQ=y
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="cfq"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+# CONFIG_MPC8560_ADS is not set
-+# CONFIG_MPC85xx_CDS is not set
-+# CONFIG_MPC85xx_MDS is not set
-+CONFIG_MPC85xx_DS=y
-+# CONFIG_KSI8560 is not set
-+# CONFIG_STX_GP3 is not set
-+# CONFIG_TQM8540 is not set
-+# CONFIG_TQM8541 is not set
-+# CONFIG_TQM8555 is not set
-+# CONFIG_TQM8560 is not set
-+# CONFIG_SBC8548 is not set
-+# CONFIG_SBC8560 is not set
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+CONFIG_PPC_I8259=y
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+CONFIG_FSL_ULI1575=y
-+
-+#
-+# Kernel options
-+#
-+CONFIG_HIGHMEM=y
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=m
-+CONFIG_FORCE_MAX_ZONEORDER=11
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_FSL_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=y
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+CONFIG_NET_KEY=m
-+# CONFIG_NET_KEY_MIGRATE is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+CONFIG_IP_ADVANCED_ROUTER=y
-+CONFIG_ASK_IP_FIB_HASH=y
-+# CONFIG_IP_FIB_TRIE is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_MULTIPLE_TABLES=y
-+CONFIG_IP_ROUTE_MULTIPATH=y
-+CONFIG_IP_ROUTE_VERBOSE=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+CONFIG_IP_PNP_RARP=y
-+CONFIG_NET_IPIP=y
-+CONFIG_NET_IPGRE=y
-+CONFIG_NET_IPGRE_BROADCAST=y
-+CONFIG_IP_MROUTE=y
-+CONFIG_IP_PIMSM_V1=y
-+CONFIG_IP_PIMSM_V2=y
-+CONFIG_ARPD=y
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+CONFIG_INET_TUNNEL=y
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+CONFIG_IPV6=y
-+# CONFIG_IPV6_PRIVACY is not set
-+# CONFIG_IPV6_ROUTER_PREF is not set
-+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-+# CONFIG_INET6_AH is not set
-+# CONFIG_INET6_ESP is not set
-+# CONFIG_INET6_IPCOMP is not set
-+# CONFIG_IPV6_MIP6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET6_XFRM_MODE_TUNNEL=y
-+CONFIG_INET6_XFRM_MODE_BEET=y
-+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-+CONFIG_IPV6_SIT=y
-+# CONFIG_IPV6_TUNNEL is not set
-+# CONFIG_IPV6_MULTIPLE_TABLES is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+CONFIG_IP_SCTP=m
-+# CONFIG_SCTP_DBG_MSG is not set
-+# CONFIG_SCTP_DBG_OBJCNT is not set
-+# CONFIG_SCTP_HMAC_NONE is not set
-+# CONFIG_SCTP_HMAC_SHA1 is not set
-+CONFIG_SCTP_HMAC_MD5=y
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+CONFIG_FIB_RULES=y
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+CONFIG_BLK_DEV_NBD=y
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=131072
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+CONFIG_CHR_DEV_ST=y
-+# CONFIG_CHR_DEV_OSST is not set
-+CONFIG_BLK_DEV_SR=y
-+# CONFIG_BLK_DEV_SR_VENDOR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+CONFIG_SCSI_MULTI_LUN=y
-+# CONFIG_SCSI_CONSTANTS is not set
-+CONFIG_SCSI_LOGGING=y
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_MVSAS is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_IPR is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+CONFIG_ATA=y
-+# CONFIG_ATA_NONSTANDARD is not set
-+CONFIG_SATA_AHCI=y
-+# CONFIG_SATA_SVW is not set
-+# CONFIG_ATA_PIIX is not set
-+# CONFIG_SATA_MV is not set
-+# CONFIG_SATA_NV is not set
-+# CONFIG_PDC_ADMA is not set
-+# CONFIG_SATA_QSTOR is not set
-+# CONFIG_SATA_PROMISE is not set
-+# CONFIG_SATA_SX4 is not set
-+# CONFIG_SATA_SIL is not set
-+# CONFIG_SATA_SIL24 is not set
-+# CONFIG_SATA_SIS is not set
-+# CONFIG_SATA_ULI is not set
-+# CONFIG_SATA_VIA is not set
-+# CONFIG_SATA_VITESSE is not set
-+# CONFIG_SATA_INIC162X is not set
-+# CONFIG_SATA_FSL is not set
-+CONFIG_PATA_ALI=y
-+# CONFIG_PATA_AMD is not set
-+# CONFIG_PATA_ARTOP is not set
-+# CONFIG_PATA_ATIIXP is not set
-+# CONFIG_PATA_CMD640_PCI is not set
-+# CONFIG_PATA_CMD64X is not set
-+# CONFIG_PATA_CS5520 is not set
-+# CONFIG_PATA_CS5530 is not set
-+# CONFIG_PATA_CYPRESS is not set
-+# CONFIG_PATA_EFAR is not set
-+# CONFIG_ATA_GENERIC is not set
-+# CONFIG_PATA_HPT366 is not set
-+# CONFIG_PATA_HPT37X is not set
-+# CONFIG_PATA_HPT3X2N is not set
-+# CONFIG_PATA_HPT3X3 is not set
-+# CONFIG_PATA_IT821X is not set
-+# CONFIG_PATA_IT8213 is not set
-+# CONFIG_PATA_JMICRON is not set
-+# CONFIG_PATA_TRIFLEX is not set
-+# CONFIG_PATA_MARVELL is not set
-+# CONFIG_PATA_MPIIX is not set
-+# CONFIG_PATA_OLDPIIX is not set
-+# CONFIG_PATA_NETCELL is not set
-+# CONFIG_PATA_NINJA32 is not set
-+# CONFIG_PATA_NS87410 is not set
-+# CONFIG_PATA_NS87415 is not set
-+# CONFIG_PATA_OPTI is not set
-+# CONFIG_PATA_OPTIDMA is not set
-+# CONFIG_PATA_PDC_OLD is not set
-+# CONFIG_PATA_RADISYS is not set
-+# CONFIG_PATA_RZ1000 is not set
-+# CONFIG_PATA_SC1200 is not set
-+# CONFIG_PATA_SERVERWORKS is not set
-+# CONFIG_PATA_PDC2027X is not set
-+# CONFIG_PATA_SIL680 is not set
-+# CONFIG_PATA_SIS is not set
-+# CONFIG_PATA_VIA is not set
-+# CONFIG_PATA_WINBOND is not set
-+# CONFIG_PATA_PLATFORM is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+CONFIG_DUMMY=y
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+CONFIG_VITESSE_PHY=y
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+CONFIG_SERIO_I8042=y
-+CONFIG_SERIO_SERPORT=y
-+# CONFIG_SERIO_PCIPS2 is not set
-+CONFIG_SERIO_LIBPS2=y
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_VT_HW_CONSOLE_BINDING is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=2
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-+CONFIG_SERIAL_8250_EXTENDED=y
-+CONFIG_SERIAL_8250_MANY_PORTS=y
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+CONFIG_SERIAL_8250_DETECT_IRQ=y
-+CONFIG_SERIAL_8250_RSA=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+CONFIG_NVRAM=y
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+# CONFIG_I2C_CHARDEV is not set
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+CONFIG_SENSORS_EEPROM=y
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+CONFIG_DVB_CORE=m
-+# CONFIG_DVB_CORE_ATTACH is not set
-+CONFIG_DVB_CAPTURE_DRIVERS=y
-+
-+#
-+# Supported SAA7146 based PCI Adapters
-+#
-+# CONFIG_TTPCI_EEPROM is not set
-+# CONFIG_DVB_BUDGET_CORE is not set
-+
-+#
-+# Supported USB Adapters
-+#
-+# CONFIG_DVB_USB is not set
-+# CONFIG_DVB_TTUSB_BUDGET is not set
-+# CONFIG_DVB_TTUSB_DEC is not set
-+# CONFIG_DVB_CINERGYT2 is not set
-+
-+#
-+# Supported FlexCopII (B2C2) Adapters
-+#
-+# CONFIG_DVB_B2C2_FLEXCOP is not set
-+
-+#
-+# Supported BT878 Adapters
-+#
-+
-+#
-+# Supported Pluto2 Adapters
-+#
-+# CONFIG_DVB_PLUTO2 is not set
-+
-+#
-+# Supported DVB Frontends
-+#
-+
-+#
-+# Customise DVB Frontends
-+#
-+# CONFIG_DVB_FE_CUSTOMISE is not set
-+
-+#
-+# DVB-S (satellite) frontends
-+#
-+# CONFIG_DVB_STV0299 is not set
-+# CONFIG_DVB_CX24110 is not set
-+# CONFIG_DVB_CX24123 is not set
-+# CONFIG_DVB_TDA8083 is not set
-+# CONFIG_DVB_MT312 is not set
-+# CONFIG_DVB_VES1X93 is not set
-+# CONFIG_DVB_S5H1420 is not set
-+# CONFIG_DVB_TDA10086 is not set
-+
-+#
-+# DVB-T (terrestrial) frontends
-+#
-+# CONFIG_DVB_SP8870 is not set
-+# CONFIG_DVB_SP887X is not set
-+# CONFIG_DVB_CX22700 is not set
-+# CONFIG_DVB_CX22702 is not set
-+# CONFIG_DVB_L64781 is not set
-+# CONFIG_DVB_TDA1004X is not set
-+# CONFIG_DVB_NXT6000 is not set
-+# CONFIG_DVB_MT352 is not set
-+# CONFIG_DVB_ZL10353 is not set
-+# CONFIG_DVB_DIB3000MB is not set
-+# CONFIG_DVB_DIB3000MC is not set
-+# CONFIG_DVB_DIB7000M is not set
-+# CONFIG_DVB_DIB7000P is not set
-+
-+#
-+# DVB-C (cable) frontends
-+#
-+# CONFIG_DVB_VES1820 is not set
-+# CONFIG_DVB_TDA10021 is not set
-+# CONFIG_DVB_TDA10023 is not set
-+# CONFIG_DVB_STV0297 is not set
-+
-+#
-+# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
-+#
-+# CONFIG_DVB_NXT200X is not set
-+# CONFIG_DVB_OR51211 is not set
-+# CONFIG_DVB_OR51132 is not set
-+# CONFIG_DVB_BCM3510 is not set
-+# CONFIG_DVB_LGDT330X is not set
-+# CONFIG_DVB_S5H1409 is not set
-+
-+#
-+# Tuners/PLL support
-+#
-+# CONFIG_DVB_PLL is not set
-+# CONFIG_DVB_TDA826X is not set
-+# CONFIG_DVB_TDA827X is not set
-+# CONFIG_DVB_TDA18271 is not set
-+# CONFIG_DVB_TUNER_QT1010 is not set
-+# CONFIG_DVB_TUNER_MT2060 is not set
-+# CONFIG_DVB_TUNER_MT2266 is not set
-+# CONFIG_DVB_TUNER_MT2131 is not set
-+# CONFIG_DVB_TUNER_DIB0070 is not set
-+# CONFIG_DVB_TUNER_XC5000 is not set
-+
-+#
-+# Miscellaneous devices
-+#
-+# CONFIG_DVB_LNBP21 is not set
-+# CONFIG_DVB_ISL6421 is not set
-+# CONFIG_DVB_TUA6100 is not set
-+CONFIG_DAB=y
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=y
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Console display driver support
-+#
-+CONFIG_VGA_CONSOLE=y
-+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-+CONFIG_DUMMY_CONSOLE=y
-+
-+#
-+# Sound
-+#
-+CONFIG_SOUND=y
-+
-+#
-+# Advanced Linux Sound Architecture
-+#
-+CONFIG_SND=y
-+CONFIG_SND_TIMER=y
-+CONFIG_SND_PCM=y
-+# CONFIG_SND_SEQUENCER is not set
-+# CONFIG_SND_MIXER_OSS is not set
-+# CONFIG_SND_PCM_OSS is not set
-+# CONFIG_SND_DYNAMIC_MINORS is not set
-+CONFIG_SND_SUPPORT_OLD_API=y
-+CONFIG_SND_VERBOSE_PROCFS=y
-+# CONFIG_SND_VERBOSE_PRINTK is not set
-+# CONFIG_SND_DEBUG is not set
-+
-+#
-+# Generic devices
-+#
-+CONFIG_SND_AC97_CODEC=y
-+# CONFIG_SND_DUMMY is not set
-+# CONFIG_SND_MTPAV is not set
-+# CONFIG_SND_SERIAL_U16550 is not set
-+# CONFIG_SND_MPU401 is not set
-+
-+#
-+# PCI devices
-+#
-+# CONFIG_SND_AD1889 is not set
-+# CONFIG_SND_ALS300 is not set
-+# CONFIG_SND_ALS4000 is not set
-+# CONFIG_SND_ALI5451 is not set
-+# CONFIG_SND_ATIIXP is not set
-+# CONFIG_SND_ATIIXP_MODEM is not set
-+# CONFIG_SND_AU8810 is not set
-+# CONFIG_SND_AU8820 is not set
-+# CONFIG_SND_AU8830 is not set
-+# CONFIG_SND_AZT3328 is not set
-+# CONFIG_SND_BT87X is not set
-+# CONFIG_SND_CA0106 is not set
-+# CONFIG_SND_CMIPCI is not set
-+# CONFIG_SND_OXYGEN is not set
-+# CONFIG_SND_CS4281 is not set
-+# CONFIG_SND_CS46XX is not set
-+# CONFIG_SND_CS5530 is not set
-+# CONFIG_SND_DARLA20 is not set
-+# CONFIG_SND_GINA20 is not set
-+# CONFIG_SND_LAYLA20 is not set
-+# CONFIG_SND_DARLA24 is not set
-+# CONFIG_SND_GINA24 is not set
-+# CONFIG_SND_LAYLA24 is not set
-+# CONFIG_SND_MONA is not set
-+# CONFIG_SND_MIA is not set
-+# CONFIG_SND_ECHO3G is not set
-+# CONFIG_SND_INDIGO is not set
-+# CONFIG_SND_INDIGOIO is not set
-+# CONFIG_SND_INDIGODJ is not set
-+# CONFIG_SND_EMU10K1 is not set
-+# CONFIG_SND_EMU10K1X is not set
-+# CONFIG_SND_ENS1370 is not set
-+# CONFIG_SND_ENS1371 is not set
-+# CONFIG_SND_ES1938 is not set
-+# CONFIG_SND_ES1968 is not set
-+# CONFIG_SND_FM801 is not set
-+# CONFIG_SND_HDA_INTEL is not set
-+# CONFIG_SND_HDSP is not set
-+# CONFIG_SND_HDSPM is not set
-+# CONFIG_SND_HIFIER is not set
-+# CONFIG_SND_ICE1712 is not set
-+# CONFIG_SND_ICE1724 is not set
-+CONFIG_SND_INTEL8X0=y
-+# CONFIG_SND_INTEL8X0M is not set
-+# CONFIG_SND_KORG1212 is not set
-+# CONFIG_SND_MAESTRO3 is not set
-+# CONFIG_SND_MIXART is not set
-+# CONFIG_SND_NM256 is not set
-+# CONFIG_SND_PCXHR is not set
-+# CONFIG_SND_RIPTIDE is not set
-+# CONFIG_SND_RME32 is not set
-+# CONFIG_SND_RME96 is not set
-+# CONFIG_SND_RME9652 is not set
-+# CONFIG_SND_SONICVIBES is not set
-+# CONFIG_SND_TRIDENT is not set
-+# CONFIG_SND_VIA82XX is not set
-+# CONFIG_SND_VIA82XX_MODEM is not set
-+# CONFIG_SND_VIRTUOSO is not set
-+# CONFIG_SND_VX222 is not set
-+# CONFIG_SND_YMFPCI is not set
-+# CONFIG_SND_AC97_POWER_SAVE is not set
-+
-+#
-+# ALSA PowerMac devices
-+#
-+
-+#
-+# ALSA PowerPC devices
-+#
-+
-+#
-+# USB devices
-+#
-+# CONFIG_SND_USB_AUDIO is not set
-+# CONFIG_SND_USB_USX2Y is not set
-+# CONFIG_SND_USB_CAIAQ is not set
-+
-+#
-+# System on Chip audio support
-+#
-+# CONFIG_SND_SOC is not set
-+
-+#
-+# SoC Audio support for SuperH
-+#
-+
-+#
-+# ALSA SoC audio for Freescale SOCs
-+#
-+
-+#
-+# Open Sound System
-+#
-+# CONFIG_SOUND_PRIME is not set
-+CONFIG_AC97_BUS=y
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+
-+#
-+# USB Input Devices
-+#
-+CONFIG_USB_HID=y
-+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-+# CONFIG_HID_FF is not set
-+# CONFIG_USB_HIDDEV is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+CONFIG_USB_EHCI_HCD=y
-+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+# CONFIG_USB_EHCI_FSL is not set
-+CONFIG_USB_EHCI_HCD_PPC_OF=y
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
-+CONFIG_USB_OHCI_HCD_PCI=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+# CONFIG_RTC_DRV_DS1307 is not set
-+# CONFIG_RTC_DRV_DS1374 is not set
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+CONFIG_RTC_DRV_CMOS=y
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+CONFIG_DMADEVICES=y
-+
-+#
-+# DMA Devices
-+#
-+CONFIG_FSL_DMA=y
-+# CONFIG_FSL_DMA_SELFTEST is not set
-+CONFIG_DMA_ENGINE=y
-+
-+#
-+# DMA Clients
-+#
-+# CONFIG_NET_DMA is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+CONFIG_ISO9660_FS=m
-+CONFIG_JOLIET=y
-+CONFIG_ZISOFS=y
-+CONFIG_UDF_FS=m
-+CONFIG_UDF_NLS=y
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=m
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+CONFIG_NTFS_FS=y
-+# CONFIG_NTFS_DEBUG is not set
-+# CONFIG_NTFS_RW is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+CONFIG_ADFS_FS=m
-+# CONFIG_ADFS_FS_RW is not set
-+CONFIG_AFFS_FS=m
-+CONFIG_HFS_FS=m
-+CONFIG_HFSPLUS_FS=m
-+CONFIG_BEFS_FS=m
-+# CONFIG_BEFS_DEBUG is not set
-+CONFIG_BFS_FS=m
-+CONFIG_EFS_FS=m
-+CONFIG_CRAMFS=y
-+CONFIG_VXFS_FS=m
-+# CONFIG_MINIX_FS is not set
-+CONFIG_HPFS_FS=m
-+CONFIG_QNX4FS_FS=m
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_SYSV_FS=m
-+CONFIG_UFS_FS=m
-+# CONFIG_UFS_FS_WRITE is not set
-+# CONFIG_UFS_DEBUG is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+CONFIG_NFSD=y
-+# CONFIG_NFSD_V3 is not set
-+CONFIG_NFSD_TCP=y
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_EXPORTFS=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+CONFIG_MAC_PARTITION=y
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+# CONFIG_NLS_CODEPAGE_437 is not set
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+# CONFIG_NLS_ISO8859_1 is not set
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=m
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+CONFIG_LIBCRC32C=m
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_HIGHMEM is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_HASH=y
-+CONFIG_CRYPTO_MANAGER=y
-+CONFIG_CRYPTO_HMAC=y
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=m
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/mpc8560_ads_defconfig
-@@ -0,0 +1,885 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:27 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+CONFIG_MPC8560_ADS=y
-+# CONFIG_MPC85xx_CDS is not set
-+# CONFIG_MPC85xx_MDS is not set
-+# CONFIG_MPC85xx_DS is not set
-+# CONFIG_STX_GP3 is not set
-+# CONFIG_TQM8540 is not set
-+# CONFIG_TQM8541 is not set
-+# CONFIG_TQM8555 is not set
-+# CONFIG_TQM8560 is not set
-+# CONFIG_SBC8548 is not set
-+# CONFIG_SBC8560 is not set
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_CPM2=y
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_CPM=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=y
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+# CONFIG_PROC_DEVICETREE is not set
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+# CONFIG_SECCOMP is not set
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_FSL_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+CONFIG_PCI_DEBUG=y
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=y
-+CONFIG_DAVICOM_PHY=y
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_FS_ENET=y
-+# CONFIG_FS_ENET_HAS_SCC is not set
-+CONFIG_FS_ENET_HAS_FCC=y
-+# CONFIG_FS_ENET_MDIO_FCC is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+CONFIG_E1000=y
-+CONFIG_E1000_NAPI=y
-+# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_CPM=y
-+CONFIG_SERIAL_CPM_CONSOLE=y
-+CONFIG_SERIAL_CPM_SCC1=y
-+CONFIG_SERIAL_CPM_SCC2=y
-+# CONFIG_SERIAL_CPM_SCC3 is not set
-+# CONFIG_SERIAL_CPM_SCC4 is not set
-+# CONFIG_SERIAL_CPM_SMC1 is not set
-+# CONFIG_SERIAL_CPM_SMC2 is not set
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=y
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+CONFIG_DEBUG_MUTEXES=y
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_KGDB_CONSOLE is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/mpc8568mds_defconfig
-@@ -0,0 +1,1117 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc7
-+# Mon Mar 31 11:37:05 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+# CONFIG_MPC8560_ADS is not set
-+# CONFIG_MPC85xx_CDS is not set
-+CONFIG_MPC85xx_MDS=y
-+# CONFIG_MPC85xx_DS is not set
-+# CONFIG_STX_GP3 is not set
-+# CONFIG_TQM8540 is not set
-+# CONFIG_TQM8541 is not set
-+# CONFIG_TQM8555 is not set
-+# CONFIG_TQM8560 is not set
-+# CONFIG_SBC8548 is not set
-+# CONFIG_SBC8560 is not set
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_QUICC_ENGINE=y
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_FSL_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+# CONFIG_BLK_DEV_SD is not set
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+# CONFIG_CHR_DEV_SG is not set
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_MVSAS is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=y
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_UCC_GETH is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+# CONFIG_SERIAL_QE is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+# CONFIG_BOOKE_WDT is not set
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+# CONFIG_RTC_DRV_DS1307 is not set
-+CONFIG_RTC_DRV_DS1374=y
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_XMON is not set
-+# CONFIG_BDI_SWITCH is not set
-+CONFIG_PPC_EARLY_DEBUG=y
-+# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
-+# CONFIG_PPC_EARLY_DEBUG_G5 is not set
-+# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
-+# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
-+# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
-+# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
-+# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
-+# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
-+# CONFIG_PPC_EARLY_DEBUG_44x is not set
-+# CONFIG_PPC_EARLY_DEBUG_40x is not set
-+# CONFIG_PPC_EARLY_DEBUG_CPM is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/mpc8572_ds_defconfig
-@@ -0,0 +1,1549 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc7
-+# Mon Mar 31 11:37:06 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_BSD_PROCESS_ACCT=y
-+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-+# CONFIG_TASKSTATS is not set
-+CONFIG_AUDIT=y
-+# CONFIG_AUDITSYSCALL is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_KALLSYMS_EXTRA_PASS=y
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+CONFIG_MODVERSIONS=y
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_DEFAULT_AS is not set
-+# CONFIG_DEFAULT_DEADLINE is not set
-+CONFIG_DEFAULT_CFQ=y
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="cfq"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+# CONFIG_MPC8560_ADS is not set
-+# CONFIG_MPC85xx_CDS is not set
-+# CONFIG_MPC85xx_MDS is not set
-+CONFIG_MPC85xx_DS=y
-+# CONFIG_STX_GP3 is not set
-+# CONFIG_TQM8540 is not set
-+# CONFIG_TQM8541 is not set
-+# CONFIG_TQM8555 is not set
-+# CONFIG_TQM8560 is not set
-+# CONFIG_SBC8548 is not set
-+# CONFIG_SBC8560 is not set
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+CONFIG_PPC_I8259=y
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+CONFIG_FSL_ULI1575=y
-+
-+#
-+# Kernel options
-+#
-+CONFIG_HIGHMEM=y
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=m
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_FSL_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=y
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+CONFIG_NET_KEY=m
-+# CONFIG_NET_KEY_MIGRATE is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+CONFIG_IP_ADVANCED_ROUTER=y
-+CONFIG_ASK_IP_FIB_HASH=y
-+# CONFIG_IP_FIB_TRIE is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_MULTIPLE_TABLES=y
-+CONFIG_IP_ROUTE_MULTIPATH=y
-+CONFIG_IP_ROUTE_VERBOSE=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+CONFIG_IP_PNP_RARP=y
-+CONFIG_NET_IPIP=y
-+CONFIG_NET_IPGRE=y
-+CONFIG_NET_IPGRE_BROADCAST=y
-+CONFIG_IP_MROUTE=y
-+CONFIG_IP_PIMSM_V1=y
-+CONFIG_IP_PIMSM_V2=y
-+CONFIG_ARPD=y
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+CONFIG_INET_TUNNEL=y
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+CONFIG_IPV6=y
-+# CONFIG_IPV6_PRIVACY is not set
-+# CONFIG_IPV6_ROUTER_PREF is not set
-+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-+# CONFIG_INET6_AH is not set
-+# CONFIG_INET6_ESP is not set
-+# CONFIG_INET6_IPCOMP is not set
-+# CONFIG_IPV6_MIP6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET6_XFRM_MODE_TUNNEL=y
-+CONFIG_INET6_XFRM_MODE_BEET=y
-+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-+CONFIG_IPV6_SIT=y
-+# CONFIG_IPV6_TUNNEL is not set
-+# CONFIG_IPV6_MULTIPLE_TABLES is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+CONFIG_IP_SCTP=m
-+# CONFIG_SCTP_DBG_MSG is not set
-+# CONFIG_SCTP_DBG_OBJCNT is not set
-+# CONFIG_SCTP_HMAC_NONE is not set
-+# CONFIG_SCTP_HMAC_SHA1 is not set
-+CONFIG_SCTP_HMAC_MD5=y
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+CONFIG_FIB_RULES=y
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+CONFIG_BLK_DEV_NBD=y
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=131072
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+CONFIG_CHR_DEV_ST=y
-+# CONFIG_CHR_DEV_OSST is not set
-+CONFIG_BLK_DEV_SR=y
-+# CONFIG_BLK_DEV_SR_VENDOR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+CONFIG_SCSI_MULTI_LUN=y
-+# CONFIG_SCSI_CONSTANTS is not set
-+CONFIG_SCSI_LOGGING=y
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_MVSAS is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_IPR is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+CONFIG_ATA=y
-+# CONFIG_ATA_NONSTANDARD is not set
-+CONFIG_SATA_AHCI=y
-+# CONFIG_SATA_SVW is not set
-+# CONFIG_ATA_PIIX is not set
-+# CONFIG_SATA_MV is not set
-+# CONFIG_SATA_NV is not set
-+# CONFIG_PDC_ADMA is not set
-+# CONFIG_SATA_QSTOR is not set
-+# CONFIG_SATA_PROMISE is not set
-+# CONFIG_SATA_SX4 is not set
-+# CONFIG_SATA_SIL is not set
-+# CONFIG_SATA_SIL24 is not set
-+# CONFIG_SATA_SIS is not set
-+# CONFIG_SATA_ULI is not set
-+# CONFIG_SATA_VIA is not set
-+# CONFIG_SATA_VITESSE is not set
-+# CONFIG_SATA_INIC162X is not set
-+# CONFIG_SATA_FSL is not set
-+CONFIG_PATA_ALI=y
-+# CONFIG_PATA_AMD is not set
-+# CONFIG_PATA_ARTOP is not set
-+# CONFIG_PATA_ATIIXP is not set
-+# CONFIG_PATA_CMD640_PCI is not set
-+# CONFIG_PATA_CMD64X is not set
-+# CONFIG_PATA_CS5520 is not set
-+# CONFIG_PATA_CS5530 is not set
-+# CONFIG_PATA_CYPRESS is not set
-+# CONFIG_PATA_EFAR is not set
-+# CONFIG_ATA_GENERIC is not set
-+# CONFIG_PATA_HPT366 is not set
-+# CONFIG_PATA_HPT37X is not set
-+# CONFIG_PATA_HPT3X2N is not set
-+# CONFIG_PATA_HPT3X3 is not set
-+# CONFIG_PATA_IT821X is not set
-+# CONFIG_PATA_IT8213 is not set
-+# CONFIG_PATA_JMICRON is not set
-+# CONFIG_PATA_TRIFLEX is not set
-+# CONFIG_PATA_MARVELL is not set
-+# CONFIG_PATA_MPIIX is not set
-+# CONFIG_PATA_OLDPIIX is not set
-+# CONFIG_PATA_NETCELL is not set
-+# CONFIG_PATA_NINJA32 is not set
-+# CONFIG_PATA_NS87410 is not set
-+# CONFIG_PATA_NS87415 is not set
-+# CONFIG_PATA_OPTI is not set
-+# CONFIG_PATA_OPTIDMA is not set
-+# CONFIG_PATA_PDC_OLD is not set
-+# CONFIG_PATA_RADISYS is not set
-+# CONFIG_PATA_RZ1000 is not set
-+# CONFIG_PATA_SC1200 is not set
-+# CONFIG_PATA_SERVERWORKS is not set
-+# CONFIG_PATA_PDC2027X is not set
-+# CONFIG_PATA_SIL680 is not set
-+# CONFIG_PATA_SIS is not set
-+# CONFIG_PATA_VIA is not set
-+# CONFIG_PATA_WINBOND is not set
-+# CONFIG_PATA_PLATFORM is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+CONFIG_DUMMY=y
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+CONFIG_VITESSE_PHY=y
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+CONFIG_SERIO_I8042=y
-+CONFIG_SERIO_SERPORT=y
-+# CONFIG_SERIO_PCIPS2 is not set
-+CONFIG_SERIO_LIBPS2=y
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_VT_HW_CONSOLE_BINDING is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=2
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-+CONFIG_SERIAL_8250_EXTENDED=y
-+CONFIG_SERIAL_8250_MANY_PORTS=y
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+CONFIG_SERIAL_8250_DETECT_IRQ=y
-+CONFIG_SERIAL_8250_RSA=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+CONFIG_NVRAM=y
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+# CONFIG_I2C_CHARDEV is not set
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+CONFIG_SENSORS_EEPROM=y
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+CONFIG_DVB_CORE=m
-+# CONFIG_DVB_CORE_ATTACH is not set
-+CONFIG_DVB_CAPTURE_DRIVERS=y
-+
-+#
-+# Supported SAA7146 based PCI Adapters
-+#
-+# CONFIG_TTPCI_EEPROM is not set
-+# CONFIG_DVB_BUDGET_CORE is not set
-+
-+#
-+# Supported USB Adapters
-+#
-+# CONFIG_DVB_USB is not set
-+# CONFIG_DVB_TTUSB_BUDGET is not set
-+# CONFIG_DVB_TTUSB_DEC is not set
-+# CONFIG_DVB_CINERGYT2 is not set
-+
-+#
-+# Supported FlexCopII (B2C2) Adapters
-+#
-+# CONFIG_DVB_B2C2_FLEXCOP is not set
-+
-+#
-+# Supported BT878 Adapters
-+#
-+
-+#
-+# Supported Pluto2 Adapters
-+#
-+# CONFIG_DVB_PLUTO2 is not set
-+
-+#
-+# Supported DVB Frontends
-+#
-+
-+#
-+# Customise DVB Frontends
-+#
-+# CONFIG_DVB_FE_CUSTOMISE is not set
-+
-+#
-+# DVB-S (satellite) frontends
-+#
-+# CONFIG_DVB_STV0299 is not set
-+# CONFIG_DVB_CX24110 is not set
-+# CONFIG_DVB_CX24123 is not set
-+# CONFIG_DVB_TDA8083 is not set
-+# CONFIG_DVB_MT312 is not set
-+# CONFIG_DVB_VES1X93 is not set
-+# CONFIG_DVB_S5H1420 is not set
-+# CONFIG_DVB_TDA10086 is not set
-+
-+#
-+# DVB-T (terrestrial) frontends
-+#
-+# CONFIG_DVB_SP8870 is not set
-+# CONFIG_DVB_SP887X is not set
-+# CONFIG_DVB_CX22700 is not set
-+# CONFIG_DVB_CX22702 is not set
-+# CONFIG_DVB_L64781 is not set
-+# CONFIG_DVB_TDA1004X is not set
-+# CONFIG_DVB_NXT6000 is not set
-+# CONFIG_DVB_MT352 is not set
-+# CONFIG_DVB_ZL10353 is not set
-+# CONFIG_DVB_DIB3000MB is not set
-+# CONFIG_DVB_DIB3000MC is not set
-+# CONFIG_DVB_DIB7000M is not set
-+# CONFIG_DVB_DIB7000P is not set
-+
-+#
-+# DVB-C (cable) frontends
-+#
-+# CONFIG_DVB_VES1820 is not set
-+# CONFIG_DVB_TDA10021 is not set
-+# CONFIG_DVB_TDA10023 is not set
-+# CONFIG_DVB_STV0297 is not set
-+
-+#
-+# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
-+#
-+# CONFIG_DVB_NXT200X is not set
-+# CONFIG_DVB_OR51211 is not set
-+# CONFIG_DVB_OR51132 is not set
-+# CONFIG_DVB_BCM3510 is not set
-+# CONFIG_DVB_LGDT330X is not set
-+# CONFIG_DVB_S5H1409 is not set
-+
-+#
-+# Tuners/PLL support
-+#
-+# CONFIG_DVB_PLL is not set
-+# CONFIG_DVB_TDA826X is not set
-+# CONFIG_DVB_TDA827X is not set
-+# CONFIG_DVB_TDA18271 is not set
-+# CONFIG_DVB_TUNER_QT1010 is not set
-+# CONFIG_DVB_TUNER_MT2060 is not set
-+# CONFIG_DVB_TUNER_MT2266 is not set
-+# CONFIG_DVB_TUNER_MT2131 is not set
-+# CONFIG_DVB_TUNER_DIB0070 is not set
-+# CONFIG_DVB_TUNER_XC5000 is not set
-+
-+#
-+# Miscellaneous devices
-+#
-+# CONFIG_DVB_LNBP21 is not set
-+# CONFIG_DVB_ISL6421 is not set
-+# CONFIG_DVB_TUA6100 is not set
-+CONFIG_DAB=y
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=y
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Console display driver support
-+#
-+CONFIG_VGA_CONSOLE=y
-+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-+CONFIG_DUMMY_CONSOLE=y
-+
-+#
-+# Sound
-+#
-+CONFIG_SOUND=y
-+
-+#
-+# Advanced Linux Sound Architecture
-+#
-+CONFIG_SND=y
-+CONFIG_SND_TIMER=y
-+CONFIG_SND_PCM=y
-+# CONFIG_SND_SEQUENCER is not set
-+# CONFIG_SND_MIXER_OSS is not set
-+# CONFIG_SND_PCM_OSS is not set
-+# CONFIG_SND_DYNAMIC_MINORS is not set
-+CONFIG_SND_SUPPORT_OLD_API=y
-+CONFIG_SND_VERBOSE_PROCFS=y
-+# CONFIG_SND_VERBOSE_PRINTK is not set
-+# CONFIG_SND_DEBUG is not set
-+
-+#
-+# Generic devices
-+#
-+CONFIG_SND_AC97_CODEC=y
-+# CONFIG_SND_DUMMY is not set
-+# CONFIG_SND_MTPAV is not set
-+# CONFIG_SND_SERIAL_U16550 is not set
-+# CONFIG_SND_MPU401 is not set
-+
-+#
-+# PCI devices
-+#
-+# CONFIG_SND_AD1889 is not set
-+# CONFIG_SND_ALS300 is not set
-+# CONFIG_SND_ALS4000 is not set
-+# CONFIG_SND_ALI5451 is not set
-+# CONFIG_SND_ATIIXP is not set
-+# CONFIG_SND_ATIIXP_MODEM is not set
-+# CONFIG_SND_AU8810 is not set
-+# CONFIG_SND_AU8820 is not set
-+# CONFIG_SND_AU8830 is not set
-+# CONFIG_SND_AZT3328 is not set
-+# CONFIG_SND_BT87X is not set
-+# CONFIG_SND_CA0106 is not set
-+# CONFIG_SND_CMIPCI is not set
-+# CONFIG_SND_OXYGEN is not set
-+# CONFIG_SND_CS4281 is not set
-+# CONFIG_SND_CS46XX is not set
-+# CONFIG_SND_CS5530 is not set
-+# CONFIG_SND_DARLA20 is not set
-+# CONFIG_SND_GINA20 is not set
-+# CONFIG_SND_LAYLA20 is not set
-+# CONFIG_SND_DARLA24 is not set
-+# CONFIG_SND_GINA24 is not set
-+# CONFIG_SND_LAYLA24 is not set
-+# CONFIG_SND_MONA is not set
-+# CONFIG_SND_MIA is not set
-+# CONFIG_SND_ECHO3G is not set
-+# CONFIG_SND_INDIGO is not set
-+# CONFIG_SND_INDIGOIO is not set
-+# CONFIG_SND_INDIGODJ is not set
-+# CONFIG_SND_EMU10K1 is not set
-+# CONFIG_SND_EMU10K1X is not set
-+# CONFIG_SND_ENS1370 is not set
-+# CONFIG_SND_ENS1371 is not set
-+# CONFIG_SND_ES1938 is not set
-+# CONFIG_SND_ES1968 is not set
-+# CONFIG_SND_FM801 is not set
-+# CONFIG_SND_HDA_INTEL is not set
-+# CONFIG_SND_HDSP is not set
-+# CONFIG_SND_HDSPM is not set
-+# CONFIG_SND_HIFIER is not set
-+# CONFIG_SND_ICE1712 is not set
-+# CONFIG_SND_ICE1724 is not set
-+CONFIG_SND_INTEL8X0=y
-+# CONFIG_SND_INTEL8X0M is not set
-+# CONFIG_SND_KORG1212 is not set
-+# CONFIG_SND_MAESTRO3 is not set
-+# CONFIG_SND_MIXART is not set
-+# CONFIG_SND_NM256 is not set
-+# CONFIG_SND_PCXHR is not set
-+# CONFIG_SND_RIPTIDE is not set
-+# CONFIG_SND_RME32 is not set
-+# CONFIG_SND_RME96 is not set
-+# CONFIG_SND_RME9652 is not set
-+# CONFIG_SND_SONICVIBES is not set
-+# CONFIG_SND_TRIDENT is not set
-+# CONFIG_SND_VIA82XX is not set
-+# CONFIG_SND_VIA82XX_MODEM is not set
-+# CONFIG_SND_VIRTUOSO is not set
-+# CONFIG_SND_VX222 is not set
-+# CONFIG_SND_YMFPCI is not set
-+# CONFIG_SND_AC97_POWER_SAVE is not set
-+
-+#
-+# ALSA PowerMac devices
-+#
-+
-+#
-+# ALSA PowerPC devices
-+#
-+
-+#
-+# USB devices
-+#
-+# CONFIG_SND_USB_AUDIO is not set
-+# CONFIG_SND_USB_USX2Y is not set
-+# CONFIG_SND_USB_CAIAQ is not set
-+
-+#
-+# System on Chip audio support
-+#
-+# CONFIG_SND_SOC is not set
-+
-+#
-+# SoC Audio support for SuperH
-+#
-+
-+#
-+# ALSA SoC audio for Freescale SOCs
-+#
-+
-+#
-+# Open Sound System
-+#
-+# CONFIG_SOUND_PRIME is not set
-+CONFIG_AC97_BUS=y
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+
-+#
-+# USB Input Devices
-+#
-+CONFIG_USB_HID=y
-+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-+# CONFIG_HID_FF is not set
-+# CONFIG_USB_HIDDEV is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+CONFIG_USB_EHCI_HCD=y
-+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+# CONFIG_USB_EHCI_FSL is not set
-+CONFIG_USB_EHCI_HCD_PPC_OF=y
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
-+CONFIG_USB_OHCI_HCD_PCI=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+# CONFIG_RTC_DRV_DS1307 is not set
-+# CONFIG_RTC_DRV_DS1374 is not set
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+CONFIG_RTC_DRV_CMOS=y
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+CONFIG_ISO9660_FS=m
-+CONFIG_JOLIET=y
-+CONFIG_ZISOFS=y
-+CONFIG_UDF_FS=m
-+CONFIG_UDF_NLS=y
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=m
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+CONFIG_NTFS_FS=y
-+# CONFIG_NTFS_DEBUG is not set
-+# CONFIG_NTFS_RW is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+CONFIG_ADFS_FS=m
-+# CONFIG_ADFS_FS_RW is not set
-+CONFIG_AFFS_FS=m
-+CONFIG_HFS_FS=m
-+CONFIG_HFSPLUS_FS=m
-+CONFIG_BEFS_FS=m
-+# CONFIG_BEFS_DEBUG is not set
-+CONFIG_BFS_FS=m
-+CONFIG_EFS_FS=m
-+CONFIG_CRAMFS=y
-+CONFIG_VXFS_FS=m
-+# CONFIG_MINIX_FS is not set
-+CONFIG_HPFS_FS=m
-+CONFIG_QNX4FS_FS=m
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_SYSV_FS=m
-+CONFIG_UFS_FS=m
-+# CONFIG_UFS_FS_WRITE is not set
-+# CONFIG_UFS_DEBUG is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+CONFIG_NFSD=y
-+# CONFIG_NFSD_V3 is not set
-+CONFIG_NFSD_TCP=y
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_EXPORTFS=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+CONFIG_MAC_PARTITION=y
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+# CONFIG_NLS_CODEPAGE_437 is not set
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+# CONFIG_NLS_ISO8859_1 is not set
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=m
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+CONFIG_LIBCRC32C=m
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_HIGHMEM is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_HASH=y
-+CONFIG_CRYPTO_MANAGER=y
-+CONFIG_CRYPTO_HMAC=y
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=m
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/mpc85xx_cds_defconfig
-@@ -0,0 +1,935 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:30 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+# CONFIG_MPC8560_ADS is not set
-+CONFIG_MPC85xx_CDS=y
-+# CONFIG_MPC85xx_MDS is not set
-+# CONFIG_MPC85xx_DS is not set
-+# CONFIG_STX_GP3 is not set
-+# CONFIG_TQM8540 is not set
-+# CONFIG_TQM8541 is not set
-+# CONFIG_TQM8555 is not set
-+# CONFIG_TQM8560 is not set
-+# CONFIG_SBC8548 is not set
-+# CONFIG_SBC8560 is not set
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+CONFIG_PPC_I8259=y
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=y
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+# CONFIG_SECCOMP is not set
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_FSL_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=y
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+CONFIG_IDE=y
-+CONFIG_IDE_MAX_HWIFS=4
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+# CONFIG_BLK_DEV_IDEDISK is not set
-+# CONFIG_IDEDISK_MULTI_MODE is not set
-+# CONFIG_BLK_DEV_IDECD is not set
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+CONFIG_IDE_PROC_FS=y
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+# CONFIG_BLK_DEV_PLATFORM is not set
-+CONFIG_BLK_DEV_IDEDMA_SFF=y
-+
-+#
-+# PCI IDE chipsets support
-+#
-+CONFIG_BLK_DEV_IDEPCI=y
-+CONFIG_IDEPCI_PCIBUS_ORDER=y
-+# CONFIG_BLK_DEV_OFFBOARD is not set
-+CONFIG_BLK_DEV_GENERIC=y
-+# CONFIG_BLK_DEV_OPTI621 is not set
-+CONFIG_BLK_DEV_IDEDMA_PCI=y
-+# CONFIG_BLK_DEV_AEC62XX is not set
-+# CONFIG_BLK_DEV_ALI15X3 is not set
-+# CONFIG_BLK_DEV_AMD74XX is not set
-+# CONFIG_BLK_DEV_CMD64X is not set
-+# CONFIG_BLK_DEV_TRIFLEX is not set
-+# CONFIG_BLK_DEV_CY82C693 is not set
-+# CONFIG_BLK_DEV_CS5520 is not set
-+# CONFIG_BLK_DEV_CS5530 is not set
-+# CONFIG_BLK_DEV_HPT34X is not set
-+# CONFIG_BLK_DEV_HPT366 is not set
-+# CONFIG_BLK_DEV_JMICRON is not set
-+# CONFIG_BLK_DEV_SC1200 is not set
-+# CONFIG_BLK_DEV_PIIX is not set
-+# CONFIG_BLK_DEV_IT8213 is not set
-+# CONFIG_BLK_DEV_IT821X is not set
-+# CONFIG_BLK_DEV_NS87415 is not set
-+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-+# CONFIG_BLK_DEV_SVWKS is not set
-+# CONFIG_BLK_DEV_SIIMAGE is not set
-+# CONFIG_BLK_DEV_SL82C105 is not set
-+# CONFIG_BLK_DEV_SLC90E66 is not set
-+# CONFIG_BLK_DEV_TRM290 is not set
-+CONFIG_BLK_DEV_VIA82CXXX=y
-+# CONFIG_BLK_DEV_TC86C001 is not set
-+CONFIG_BLK_DEV_IDEDMA=y
-+CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+CONFIG_E1000=y
-+CONFIG_E1000_NAPI=y
-+# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=y
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+CONFIG_DEBUG_MUTEXES=y
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/sbc8548_defconfig
-@@ -0,0 +1,812 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:39 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+# CONFIG_MPC8560_ADS is not set
-+# CONFIG_MPC85xx_CDS is not set
-+# CONFIG_MPC85xx_MDS is not set
-+# CONFIG_MPC85xx_DS is not set
-+# CONFIG_STX_GP3 is not set
-+# CONFIG_TQM8540 is not set
-+# CONFIG_TQM8541 is not set
-+# CONFIG_TQM8555 is not set
-+# CONFIG_TQM8560 is not set
-+CONFIG_SBC8548=y
-+# CONFIG_SBC8560 is not set
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=y
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+# CONFIG_SECCOMP is not set
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_FSL_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=y
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=4096
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+CONFIG_BROADCOM_PHY=y
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=y
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_HID_SUPPORT is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+# CONFIG_EXT2_FS is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/sbc8560_defconfig
-@@ -0,0 +1,830 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:39 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+# CONFIG_MPC8560_ADS is not set
-+# CONFIG_MPC85xx_CDS is not set
-+# CONFIG_MPC85xx_MDS is not set
-+# CONFIG_MPC85xx_DS is not set
-+# CONFIG_STX_GP3 is not set
-+# CONFIG_TQM8540 is not set
-+# CONFIG_TQM8541 is not set
-+# CONFIG_TQM8555 is not set
-+# CONFIG_TQM8560 is not set
-+# CONFIG_SBC8548 is not set
-+CONFIG_SBC8560=y
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=y
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+# CONFIG_SECCOMP is not set
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=y
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+CONFIG_BROADCOM_PHY=y
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_E1000E_ENABLED is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+CONFIG_NETDEV_10000=y
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_NR_UARTS=2
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=y
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+# CONFIG_USB_ARCH_HAS_HCD is not set
-+# CONFIG_USB_ARCH_HAS_OHCI is not set
-+# CONFIG_USB_ARCH_HAS_EHCI is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+CONFIG_RTC_DRV_M48T59=y
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+# CONFIG_EXT2_FS is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_SLAB is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+CONFIG_DEBUG_MUTEXES=y
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+CONFIG_PPC_EARLY_DEBUG=y
-+# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
-+# CONFIG_PPC_EARLY_DEBUG_G5 is not set
-+# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
-+# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
-+# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
-+# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
-+# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
-+# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
-+# CONFIG_PPC_EARLY_DEBUG_44x is not set
-+# CONFIG_PPC_EARLY_DEBUG_40x is not set
-+# CONFIG_PPC_EARLY_DEBUG_CPM is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/stx_gp3_defconfig
-@@ -0,0 +1,1253 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:42 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+# CONFIG_MODULE_UNLOAD is not set
-+CONFIG_MODVERSIONS=y
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_DEFAULT_AS is not set
-+# CONFIG_DEFAULT_DEADLINE is not set
-+CONFIG_DEFAULT_CFQ=y
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="cfq"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+# CONFIG_MPC8560_ADS is not set
-+# CONFIG_MPC85xx_CDS is not set
-+# CONFIG_MPC85xx_MDS is not set
-+# CONFIG_MPC85xx_DS is not set
-+CONFIG_STX_GP3=y
-+# CONFIG_TQM8540 is not set
-+# CONFIG_TQM8541 is not set
-+# CONFIG_TQM8555 is not set
-+# CONFIG_TQM8560 is not set
-+# CONFIG_SBC8548 is not set
-+# CONFIG_SBC8560 is not set
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_CPM2=y
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_CPM=y
-+
-+#
-+# Kernel options
-+#
-+CONFIG_HIGHMEM=y
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=m
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_FSL_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+# CONFIG_IP_PNP_DHCP is not set
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IP_VS is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+CONFIG_NETFILTER=y
-+# CONFIG_NETFILTER_DEBUG is not set
-+CONFIG_NETFILTER_ADVANCED=y
-+
-+#
-+# Core Netfilter Configuration
-+#
-+# CONFIG_NETFILTER_NETLINK_QUEUE is not set
-+# CONFIG_NETFILTER_NETLINK_LOG is not set
-+# CONFIG_NF_CONNTRACK is not set
-+CONFIG_NETFILTER_XTABLES=m
-+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
-+# CONFIG_NETFILTER_XT_TARGET_MARK is not set
-+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
-+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
-+# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
-+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
-+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
-+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
-+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
-+# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
-+# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
-+# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
-+# CONFIG_NETFILTER_XT_MATCH_MAC is not set
-+# CONFIG_NETFILTER_XT_MATCH_MARK is not set
-+# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
-+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
-+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
-+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
-+# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
-+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
-+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
-+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
-+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
-+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
-+# CONFIG_NETFILTER_XT_MATCH_TIME is not set
-+# CONFIG_NETFILTER_XT_MATCH_U32 is not set
-+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
-+
-+#
-+# IP: Netfilter Configuration
-+#
-+# CONFIG_IP_NF_QUEUE is not set
-+CONFIG_IP_NF_IPTABLES=m
-+# CONFIG_IP_NF_MATCH_RECENT is not set
-+# CONFIG_IP_NF_MATCH_ECN is not set
-+# CONFIG_IP_NF_MATCH_AH is not set
-+# CONFIG_IP_NF_MATCH_TTL is not set
-+# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
-+CONFIG_IP_NF_FILTER=m
-+# CONFIG_IP_NF_TARGET_REJECT is not set
-+# CONFIG_IP_NF_TARGET_LOG is not set
-+# CONFIG_IP_NF_TARGET_ULOG is not set
-+# CONFIG_IP_NF_MANGLE is not set
-+# CONFIG_IP_NF_RAW is not set
-+# CONFIG_IP_NF_ARPTABLES is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+CONFIG_NET_PKTGEN=y
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+CONFIG_PARPORT=m
-+CONFIG_PARPORT_PC=m
-+# CONFIG_PARPORT_PC_FIFO is not set
-+# CONFIG_PARPORT_PC_SUPERIO is not set
-+# CONFIG_PARPORT_GSC is not set
-+# CONFIG_PARPORT_AX88796 is not set
-+# CONFIG_PARPORT_1284 is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_PARIDE is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=m
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+CONFIG_BLK_DEV_NBD=m
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+CONFIG_IDE=y
-+CONFIG_IDE_MAX_HWIFS=4
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_BLK_DEV_IDEDISK=y
-+# CONFIG_IDEDISK_MULTI_MODE is not set
-+CONFIG_BLK_DEV_IDECD=m
-+CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_BLK_DEV_IDESCSI is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+CONFIG_IDE_PROC_FS=y
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+# CONFIG_BLK_DEV_PLATFORM is not set
-+
-+#
-+# PCI IDE chipsets support
-+#
-+# CONFIG_BLK_DEV_GENERIC is not set
-+# CONFIG_BLK_DEV_OPTI621 is not set
-+# CONFIG_BLK_DEV_AEC62XX is not set
-+# CONFIG_BLK_DEV_ALI15X3 is not set
-+# CONFIG_BLK_DEV_AMD74XX is not set
-+# CONFIG_BLK_DEV_CMD64X is not set
-+# CONFIG_BLK_DEV_TRIFLEX is not set
-+# CONFIG_BLK_DEV_CY82C693 is not set
-+# CONFIG_BLK_DEV_CS5520 is not set
-+# CONFIG_BLK_DEV_CS5530 is not set
-+# CONFIG_BLK_DEV_HPT34X is not set
-+# CONFIG_BLK_DEV_HPT366 is not set
-+# CONFIG_BLK_DEV_JMICRON is not set
-+# CONFIG_BLK_DEV_SC1200 is not set
-+# CONFIG_BLK_DEV_PIIX is not set
-+# CONFIG_BLK_DEV_IT8213 is not set
-+# CONFIG_BLK_DEV_IT821X is not set
-+# CONFIG_BLK_DEV_NS87415 is not set
-+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-+# CONFIG_BLK_DEV_SVWKS is not set
-+# CONFIG_BLK_DEV_SIIMAGE is not set
-+# CONFIG_BLK_DEV_SL82C105 is not set
-+# CONFIG_BLK_DEV_SLC90E66 is not set
-+# CONFIG_BLK_DEV_TRM290 is not set
-+# CONFIG_BLK_DEV_VIA82CXXX is not set
-+# CONFIG_BLK_DEV_TC86C001 is not set
-+# CONFIG_BLK_DEV_IDEDMA is not set
-+CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=m
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=m
-+CONFIG_CHR_DEV_ST=m
-+# CONFIG_CHR_DEV_OSST is not set
-+CONFIG_BLK_DEV_SR=m
-+# CONFIG_BLK_DEV_SR_VENDOR is not set
-+CONFIG_CHR_DEV_SG=m
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+CONFIG_SCSI_MULTI_LUN=y
-+CONFIG_SCSI_CONSTANTS=y
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_PPA is not set
-+# CONFIG_SCSI_IMM is not set
-+# CONFIG_SCSI_MVSAS is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=y
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+# CONFIG_NET_POCKET is not set
-+# CONFIG_FS_ENET is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PLIP is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1280
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=1024
-+CONFIG_INPUT_JOYDEV=m
-+CONFIG_INPUT_EVDEV=m
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+CONFIG_KEYBOARD_ATKBD=y
-+# CONFIG_KEYBOARD_SUNKBD is not set
-+# CONFIG_KEYBOARD_LKKBD is not set
-+# CONFIG_KEYBOARD_XTKBD is not set
-+# CONFIG_KEYBOARD_NEWTON is not set
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+CONFIG_INPUT_MOUSE=y
-+CONFIG_MOUSE_PS2=y
-+CONFIG_MOUSE_PS2_ALPS=y
-+CONFIG_MOUSE_PS2_LOGIPS2PP=y
-+CONFIG_MOUSE_PS2_SYNAPTICS=y
-+CONFIG_MOUSE_PS2_LIFEBOOK=y
-+CONFIG_MOUSE_PS2_TRACKPOINT=y
-+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
-+# CONFIG_MOUSE_SERIAL is not set
-+# CONFIG_MOUSE_APPLETOUCH is not set
-+# CONFIG_MOUSE_VSXXXAA is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+CONFIG_SERIO_I8042=y
-+CONFIG_SERIO_SERPORT=y
-+# CONFIG_SERIO_PARKBD is not set
-+# CONFIG_SERIO_PCIPS2 is not set
-+CONFIG_SERIO_LIBPS2=y
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_CPM=y
-+CONFIG_SERIAL_CPM_CONSOLE=y
-+# CONFIG_SERIAL_CPM_SCC1 is not set
-+CONFIG_SERIAL_CPM_SCC2=y
-+# CONFIG_SERIAL_CPM_SCC3 is not set
-+# CONFIG_SERIAL_CPM_SCC4 is not set
-+# CONFIG_SERIAL_CPM_SMC1 is not set
-+# CONFIG_SERIAL_CPM_SMC2 is not set
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+CONFIG_PRINTER=m
-+# CONFIG_LP_CONSOLE is not set
-+# CONFIG_PPDEV is not set
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=m
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=m
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=m
-+
-+#
-+# I2C Algorithms
-+#
-+CONFIG_I2C_ALGOBIT=m
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+# CONFIG_I2C_MPC is not set
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+CONFIG_AGP=m
-+CONFIG_DRM=m
-+# CONFIG_DRM_TDFX is not set
-+# CONFIG_DRM_R128 is not set
-+# CONFIG_DRM_RADEON is not set
-+# CONFIG_DRM_MGA is not set
-+# CONFIG_DRM_SIS is not set
-+# CONFIG_DRM_VIA is not set
-+# CONFIG_DRM_SAVAGE is not set
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+CONFIG_SOUND=m
-+
-+#
-+# Advanced Linux Sound Architecture
-+#
-+# CONFIG_SND is not set
-+
-+#
-+# Open Sound System
-+#
-+# CONFIG_SOUND_PRIME is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+# CONFIG_AUXDISPLAY is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_AUTOFS_FS=m
-+CONFIG_AUTOFS4_FS=y
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+CONFIG_ISO9660_FS=m
-+# CONFIG_JOLIET is not set
-+# CONFIG_ZISOFS is not set
-+CONFIG_UDF_FS=m
-+CONFIG_UDF_NLS=y
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=m
-+CONFIG_MSDOS_FS=m
-+CONFIG_VFAT_FS=m
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+# CONFIG_PROC_KCORE is not set
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_CRAMFS=m
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+CONFIG_SMB_FS=m
-+# CONFIG_SMB_NLS_DEFAULT is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+# CONFIG_NLS_CODEPAGE_437 is not set
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+# CONFIG_NLS_ISO8859_1 is not set
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+# CONFIG_NLS_UTF8 is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_CRC_CCITT=y
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=m
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_HIGHMEM is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_KGDB_CONSOLE is not set
-+CONFIG_BDI_SWITCH=y
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/tqm8540_defconfig
-@@ -0,0 +1,1097 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:43 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+# CONFIG_HOTPLUG is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+# CONFIG_MPC8560_ADS is not set
-+# CONFIG_MPC85xx_CDS is not set
-+# CONFIG_MPC85xx_MDS is not set
-+# CONFIG_MPC85xx_DS is not set
-+# CONFIG_STX_GP3 is not set
-+CONFIG_TQM8540=y
-+# CONFIG_TQM8541 is not set
-+# CONFIG_TQM8555 is not set
-+# CONFIG_TQM8560 is not set
-+# CONFIG_SBC8548 is not set
-+# CONFIG_SBC8560 is not set
-+CONFIG_TQM85xx=y
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+# CONFIG_PROC_DEVICETREE is not set
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_FSL_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_CONCAT=y
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+# CONFIG_MTD_OF_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+# CONFIG_MTD_PHYSMAP_OF is not set
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+CONFIG_IDE=y
-+CONFIG_IDE_MAX_HWIFS=4
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_BLK_DEV_IDEDISK=y
-+# CONFIG_IDEDISK_MULTI_MODE is not set
-+# CONFIG_BLK_DEV_IDECD is not set
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+CONFIG_IDE_PROC_FS=y
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+# CONFIG_BLK_DEV_PLATFORM is not set
-+CONFIG_BLK_DEV_IDEDMA_SFF=y
-+
-+#
-+# PCI IDE chipsets support
-+#
-+CONFIG_BLK_DEV_IDEPCI=y
-+CONFIG_IDEPCI_PCIBUS_ORDER=y
-+# CONFIG_BLK_DEV_OFFBOARD is not set
-+CONFIG_BLK_DEV_GENERIC=y
-+# CONFIG_BLK_DEV_OPTI621 is not set
-+CONFIG_BLK_DEV_IDEDMA_PCI=y
-+# CONFIG_BLK_DEV_AEC62XX is not set
-+# CONFIG_BLK_DEV_ALI15X3 is not set
-+# CONFIG_BLK_DEV_AMD74XX is not set
-+# CONFIG_BLK_DEV_CMD64X is not set
-+# CONFIG_BLK_DEV_TRIFLEX is not set
-+# CONFIG_BLK_DEV_CY82C693 is not set
-+# CONFIG_BLK_DEV_CS5520 is not set
-+# CONFIG_BLK_DEV_CS5530 is not set
-+# CONFIG_BLK_DEV_HPT34X is not set
-+# CONFIG_BLK_DEV_HPT366 is not set
-+# CONFIG_BLK_DEV_JMICRON is not set
-+# CONFIG_BLK_DEV_SC1200 is not set
-+# CONFIG_BLK_DEV_PIIX is not set
-+# CONFIG_BLK_DEV_IT8213 is not set
-+# CONFIG_BLK_DEV_IT821X is not set
-+# CONFIG_BLK_DEV_NS87415 is not set
-+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-+# CONFIG_BLK_DEV_SVWKS is not set
-+# CONFIG_BLK_DEV_SIIMAGE is not set
-+# CONFIG_BLK_DEV_SL82C105 is not set
-+# CONFIG_BLK_DEV_SLC90E66 is not set
-+# CONFIG_BLK_DEV_TRM290 is not set
-+CONFIG_BLK_DEV_VIA82CXXX=y
-+# CONFIG_BLK_DEV_TC86C001 is not set
-+CONFIG_BLK_DEV_IDEDMA=y
-+CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+CONFIG_NET_PCI=y
-+# CONFIG_PCNET32 is not set
-+# CONFIG_AMD8111_ETH is not set
-+# CONFIG_ADAPTEC_STARFIRE is not set
-+# CONFIG_B44 is not set
-+# CONFIG_FORCEDETH is not set
-+# CONFIG_EEPRO100 is not set
-+CONFIG_E100=y
-+# CONFIG_FEALNX is not set
-+# CONFIG_NATSEMI is not set
-+# CONFIG_NE2K_PCI is not set
-+# CONFIG_8139CP is not set
-+# CONFIG_8139TOO is not set
-+# CONFIG_R6040 is not set
-+# CONFIG_SIS900 is not set
-+# CONFIG_EPIC100 is not set
-+# CONFIG_SUNDANCE is not set
-+# CONFIG_TLAN is not set
-+# CONFIG_VIA_RHINE is not set
-+# CONFIG_SC92031 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+CONFIG_SENSORS_LM75=y
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+CONFIG_HWMON_DEBUG_CHIP=y
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/tqm8541_defconfig
-@@ -0,0 +1,1109 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:44 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+# CONFIG_HOTPLUG is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+# CONFIG_MPC8560_ADS is not set
-+# CONFIG_MPC85xx_CDS is not set
-+# CONFIG_MPC85xx_MDS is not set
-+# CONFIG_MPC85xx_DS is not set
-+# CONFIG_STX_GP3 is not set
-+# CONFIG_TQM8540 is not set
-+CONFIG_TQM8541=y
-+# CONFIG_TQM8555 is not set
-+# CONFIG_TQM8560 is not set
-+# CONFIG_SBC8548 is not set
-+# CONFIG_SBC8560 is not set
-+CONFIG_TQM85xx=y
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_CPM2=y
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_CPM=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+# CONFIG_PROC_DEVICETREE is not set
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_FSL_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_CONCAT=y
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+# CONFIG_MTD_OF_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+# CONFIG_MTD_PHYSMAP_OF is not set
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+CONFIG_IDE=y
-+CONFIG_IDE_MAX_HWIFS=4
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_BLK_DEV_IDEDISK=y
-+# CONFIG_IDEDISK_MULTI_MODE is not set
-+# CONFIG_BLK_DEV_IDECD is not set
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+CONFIG_IDE_PROC_FS=y
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+# CONFIG_BLK_DEV_PLATFORM is not set
-+CONFIG_BLK_DEV_IDEDMA_SFF=y
-+
-+#
-+# PCI IDE chipsets support
-+#
-+CONFIG_BLK_DEV_IDEPCI=y
-+CONFIG_IDEPCI_PCIBUS_ORDER=y
-+# CONFIG_BLK_DEV_OFFBOARD is not set
-+CONFIG_BLK_DEV_GENERIC=y
-+# CONFIG_BLK_DEV_OPTI621 is not set
-+CONFIG_BLK_DEV_IDEDMA_PCI=y
-+# CONFIG_BLK_DEV_AEC62XX is not set
-+# CONFIG_BLK_DEV_ALI15X3 is not set
-+# CONFIG_BLK_DEV_AMD74XX is not set
-+# CONFIG_BLK_DEV_CMD64X is not set
-+# CONFIG_BLK_DEV_TRIFLEX is not set
-+# CONFIG_BLK_DEV_CY82C693 is not set
-+# CONFIG_BLK_DEV_CS5520 is not set
-+# CONFIG_BLK_DEV_CS5530 is not set
-+# CONFIG_BLK_DEV_HPT34X is not set
-+# CONFIG_BLK_DEV_HPT366 is not set
-+# CONFIG_BLK_DEV_JMICRON is not set
-+# CONFIG_BLK_DEV_SC1200 is not set
-+# CONFIG_BLK_DEV_PIIX is not set
-+# CONFIG_BLK_DEV_IT8213 is not set
-+# CONFIG_BLK_DEV_IT821X is not set
-+# CONFIG_BLK_DEV_NS87415 is not set
-+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-+# CONFIG_BLK_DEV_SVWKS is not set
-+# CONFIG_BLK_DEV_SIIMAGE is not set
-+# CONFIG_BLK_DEV_SL82C105 is not set
-+# CONFIG_BLK_DEV_SLC90E66 is not set
-+# CONFIG_BLK_DEV_TRM290 is not set
-+CONFIG_BLK_DEV_VIA82CXXX=y
-+# CONFIG_BLK_DEV_TC86C001 is not set
-+CONFIG_BLK_DEV_IDEDMA=y
-+CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+CONFIG_NET_PCI=y
-+# CONFIG_PCNET32 is not set
-+# CONFIG_AMD8111_ETH is not set
-+# CONFIG_ADAPTEC_STARFIRE is not set
-+# CONFIG_B44 is not set
-+# CONFIG_FORCEDETH is not set
-+# CONFIG_EEPRO100 is not set
-+CONFIG_E100=y
-+# CONFIG_FEALNX is not set
-+# CONFIG_NATSEMI is not set
-+# CONFIG_NE2K_PCI is not set
-+# CONFIG_8139CP is not set
-+# CONFIG_8139TOO is not set
-+# CONFIG_R6040 is not set
-+# CONFIG_SIS900 is not set
-+# CONFIG_EPIC100 is not set
-+# CONFIG_SUNDANCE is not set
-+# CONFIG_TLAN is not set
-+# CONFIG_VIA_RHINE is not set
-+# CONFIG_SC92031 is not set
-+# CONFIG_FS_ENET is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_CPM=y
-+CONFIG_SERIAL_CPM_CONSOLE=y
-+CONFIG_SERIAL_CPM_SCC1=y
-+# CONFIG_SERIAL_CPM_SCC2 is not set
-+# CONFIG_SERIAL_CPM_SCC3 is not set
-+# CONFIG_SERIAL_CPM_SCC4 is not set
-+# CONFIG_SERIAL_CPM_SMC1 is not set
-+# CONFIG_SERIAL_CPM_SMC2 is not set
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+CONFIG_SENSORS_LM75=y
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+CONFIG_HWMON_DEBUG_CHIP=y
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_KGDB_CONSOLE is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/tqm8555_defconfig
-@@ -0,0 +1,1109 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:44 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+# CONFIG_HOTPLUG is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+# CONFIG_MPC8560_ADS is not set
-+# CONFIG_MPC85xx_CDS is not set
-+# CONFIG_MPC85xx_MDS is not set
-+# CONFIG_MPC85xx_DS is not set
-+# CONFIG_STX_GP3 is not set
-+# CONFIG_TQM8540 is not set
-+# CONFIG_TQM8541 is not set
-+CONFIG_TQM8555=y
-+# CONFIG_TQM8560 is not set
-+# CONFIG_SBC8548 is not set
-+# CONFIG_SBC8560 is not set
-+CONFIG_TQM85xx=y
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_CPM2=y
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_CPM=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+# CONFIG_PROC_DEVICETREE is not set
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_FSL_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_CONCAT=y
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+# CONFIG_MTD_OF_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+# CONFIG_MTD_PHYSMAP_OF is not set
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+CONFIG_IDE=y
-+CONFIG_IDE_MAX_HWIFS=4
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_BLK_DEV_IDEDISK=y
-+# CONFIG_IDEDISK_MULTI_MODE is not set
-+# CONFIG_BLK_DEV_IDECD is not set
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+CONFIG_IDE_PROC_FS=y
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+# CONFIG_BLK_DEV_PLATFORM is not set
-+CONFIG_BLK_DEV_IDEDMA_SFF=y
-+
-+#
-+# PCI IDE chipsets support
-+#
-+CONFIG_BLK_DEV_IDEPCI=y
-+CONFIG_IDEPCI_PCIBUS_ORDER=y
-+# CONFIG_BLK_DEV_OFFBOARD is not set
-+CONFIG_BLK_DEV_GENERIC=y
-+# CONFIG_BLK_DEV_OPTI621 is not set
-+CONFIG_BLK_DEV_IDEDMA_PCI=y
-+# CONFIG_BLK_DEV_AEC62XX is not set
-+# CONFIG_BLK_DEV_ALI15X3 is not set
-+# CONFIG_BLK_DEV_AMD74XX is not set
-+# CONFIG_BLK_DEV_CMD64X is not set
-+# CONFIG_BLK_DEV_TRIFLEX is not set
-+# CONFIG_BLK_DEV_CY82C693 is not set
-+# CONFIG_BLK_DEV_CS5520 is not set
-+# CONFIG_BLK_DEV_CS5530 is not set
-+# CONFIG_BLK_DEV_HPT34X is not set
-+# CONFIG_BLK_DEV_HPT366 is not set
-+# CONFIG_BLK_DEV_JMICRON is not set
-+# CONFIG_BLK_DEV_SC1200 is not set
-+# CONFIG_BLK_DEV_PIIX is not set
-+# CONFIG_BLK_DEV_IT8213 is not set
-+# CONFIG_BLK_DEV_IT821X is not set
-+# CONFIG_BLK_DEV_NS87415 is not set
-+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-+# CONFIG_BLK_DEV_SVWKS is not set
-+# CONFIG_BLK_DEV_SIIMAGE is not set
-+# CONFIG_BLK_DEV_SL82C105 is not set
-+# CONFIG_BLK_DEV_SLC90E66 is not set
-+# CONFIG_BLK_DEV_TRM290 is not set
-+CONFIG_BLK_DEV_VIA82CXXX=y
-+# CONFIG_BLK_DEV_TC86C001 is not set
-+CONFIG_BLK_DEV_IDEDMA=y
-+CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+CONFIG_NET_PCI=y
-+# CONFIG_PCNET32 is not set
-+# CONFIG_AMD8111_ETH is not set
-+# CONFIG_ADAPTEC_STARFIRE is not set
-+# CONFIG_B44 is not set
-+# CONFIG_FORCEDETH is not set
-+# CONFIG_EEPRO100 is not set
-+CONFIG_E100=y
-+# CONFIG_FEALNX is not set
-+# CONFIG_NATSEMI is not set
-+# CONFIG_NE2K_PCI is not set
-+# CONFIG_8139CP is not set
-+# CONFIG_8139TOO is not set
-+# CONFIG_R6040 is not set
-+# CONFIG_SIS900 is not set
-+# CONFIG_EPIC100 is not set
-+# CONFIG_SUNDANCE is not set
-+# CONFIG_TLAN is not set
-+# CONFIG_VIA_RHINE is not set
-+# CONFIG_SC92031 is not set
-+# CONFIG_FS_ENET is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_CPM=y
-+CONFIG_SERIAL_CPM_CONSOLE=y
-+CONFIG_SERIAL_CPM_SCC1=y
-+# CONFIG_SERIAL_CPM_SCC2 is not set
-+# CONFIG_SERIAL_CPM_SCC3 is not set
-+# CONFIG_SERIAL_CPM_SCC4 is not set
-+# CONFIG_SERIAL_CPM_SMC1 is not set
-+# CONFIG_SERIAL_CPM_SMC2 is not set
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+CONFIG_SENSORS_LM75=y
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+CONFIG_HWMON_DEBUG_CHIP=y
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_KGDB_CONSOLE is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/85xx/tqm8560_defconfig
-@@ -0,0 +1,1109 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Mon Mar 24 08:48:45 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+CONFIG_PPC_85xx=y
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_E500=y
-+CONFIG_BOOKE=y
-+CONFIG_FSL_BOOKE=y
-+CONFIG_FSL_EMB_PERFMON=y
-+# CONFIG_PHYS_64BIT is not set
-+CONFIG_SPE=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+# CONFIG_HOTPLUG is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_MPC85xx=y
-+# CONFIG_MPC8540_ADS is not set
-+# CONFIG_MPC8560_ADS is not set
-+# CONFIG_MPC85xx_CDS is not set
-+# CONFIG_MPC85xx_MDS is not set
-+# CONFIG_MPC85xx_DS is not set
-+# CONFIG_STX_GP3 is not set
-+# CONFIG_TQM8540 is not set
-+# CONFIG_TQM8541 is not set
-+# CONFIG_TQM8555 is not set
-+CONFIG_TQM8560=y
-+# CONFIG_SBC8548 is not set
-+# CONFIG_SBC8560 is not set
-+CONFIG_TQM85xx=y
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_CPM2=y
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_CPM=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_MATH_EMULATION=y
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+# CONFIG_PROC_DEVICETREE is not set
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_FSL_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_CONCAT=y
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+# CONFIG_MTD_OF_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+# CONFIG_MTD_PHYSMAP_OF is not set
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+CONFIG_IDE=y
-+CONFIG_IDE_MAX_HWIFS=4
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_BLK_DEV_IDEDISK=y
-+# CONFIG_IDEDISK_MULTI_MODE is not set
-+# CONFIG_BLK_DEV_IDECD is not set
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+CONFIG_IDE_PROC_FS=y
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+# CONFIG_BLK_DEV_PLATFORM is not set
-+CONFIG_BLK_DEV_IDEDMA_SFF=y
-+
-+#
-+# PCI IDE chipsets support
-+#
-+CONFIG_BLK_DEV_IDEPCI=y
-+CONFIG_IDEPCI_PCIBUS_ORDER=y
-+# CONFIG_BLK_DEV_OFFBOARD is not set
-+CONFIG_BLK_DEV_GENERIC=y
-+# CONFIG_BLK_DEV_OPTI621 is not set
-+CONFIG_BLK_DEV_IDEDMA_PCI=y
-+# CONFIG_BLK_DEV_AEC62XX is not set
-+# CONFIG_BLK_DEV_ALI15X3 is not set
-+# CONFIG_BLK_DEV_AMD74XX is not set
-+# CONFIG_BLK_DEV_CMD64X is not set
-+# CONFIG_BLK_DEV_TRIFLEX is not set
-+# CONFIG_BLK_DEV_CY82C693 is not set
-+# CONFIG_BLK_DEV_CS5520 is not set
-+# CONFIG_BLK_DEV_CS5530 is not set
-+# CONFIG_BLK_DEV_HPT34X is not set
-+# CONFIG_BLK_DEV_HPT366 is not set
-+# CONFIG_BLK_DEV_JMICRON is not set
-+# CONFIG_BLK_DEV_SC1200 is not set
-+# CONFIG_BLK_DEV_PIIX is not set
-+# CONFIG_BLK_DEV_IT8213 is not set
-+# CONFIG_BLK_DEV_IT821X is not set
-+# CONFIG_BLK_DEV_NS87415 is not set
-+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-+# CONFIG_BLK_DEV_SVWKS is not set
-+# CONFIG_BLK_DEV_SIIMAGE is not set
-+# CONFIG_BLK_DEV_SL82C105 is not set
-+# CONFIG_BLK_DEV_SLC90E66 is not set
-+# CONFIG_BLK_DEV_TRM290 is not set
-+CONFIG_BLK_DEV_VIA82CXXX=y
-+# CONFIG_BLK_DEV_TC86C001 is not set
-+CONFIG_BLK_DEV_IDEDMA=y
-+CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+CONFIG_NET_PCI=y
-+# CONFIG_PCNET32 is not set
-+# CONFIG_AMD8111_ETH is not set
-+# CONFIG_ADAPTEC_STARFIRE is not set
-+# CONFIG_B44 is not set
-+# CONFIG_FORCEDETH is not set
-+# CONFIG_EEPRO100 is not set
-+CONFIG_E100=y
-+# CONFIG_FEALNX is not set
-+# CONFIG_NATSEMI is not set
-+# CONFIG_NE2K_PCI is not set
-+# CONFIG_8139CP is not set
-+# CONFIG_8139TOO is not set
-+# CONFIG_R6040 is not set
-+# CONFIG_SIS900 is not set
-+# CONFIG_EPIC100 is not set
-+# CONFIG_SUNDANCE is not set
-+# CONFIG_TLAN is not set
-+# CONFIG_VIA_RHINE is not set
-+# CONFIG_SC92031 is not set
-+# CONFIG_FS_ENET is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+CONFIG_GFAR_NAPI=y
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_CPM=y
-+CONFIG_SERIAL_CPM_CONSOLE=y
-+CONFIG_SERIAL_CPM_SCC1=y
-+# CONFIG_SERIAL_CPM_SCC2 is not set
-+# CONFIG_SERIAL_CPM_SCC3 is not set
-+# CONFIG_SERIAL_CPM_SCC4 is not set
-+# CONFIG_SERIAL_CPM_SMC1 is not set
-+# CONFIG_SERIAL_CPM_SMC2 is not set
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+CONFIG_SENSORS_LM75=y
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+CONFIG_HWMON_DEBUG_CHIP=y
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+# CONFIG_MSDOS_PARTITION is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_KGDB_CONSOLE is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/bamboo_defconfig
-+++ /dev/null
-@@ -1,815 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc2
--# Fri Feb 15 21:36:39 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--CONFIG_44x=y
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--CONFIG_4xx=y
--CONFIG_BOOKE=y
--CONFIG_PTE_64BIT=y
--CONFIG_PHYS_64BIT=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_NOT_COHERENT_CACHE=y
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--CONFIG_PPC_DCR_NATIVE=y
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_PPC_DCR=y
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_ALL is not set
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--CONFIG_LBD=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--# CONFIG_PREEMPT_RCU is not set
--# CONFIG_PPC4xx_PCI_EXPRESS is not set
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_BAMBOO=y
--# CONFIG_EBONY is not set
--# CONFIG_SEQUOIA is not set
--# CONFIG_TAISHAN is not set
--# CONFIG_KATMAI is not set
--# CONFIG_RAINIER is not set
--# CONFIG_WARP is not set
--CONFIG_440EP=y
--CONFIG_IBM440EP_ERR42=y
--# CONFIG_IPIC is not set
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_RCU_TRACE=y
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_MATH_EMULATION is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--CONFIG_RESOURCES_64BIT=y
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--CONFIG_CMDLINE_BOOL=y
--CONFIG_CMDLINE=""
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_CONSISTENT_START=0xff100000
--CONFIG_CONSISTENT_SIZE=0x00200000
--CONFIG_BOOT_LOAD=0x01000000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--# CONFIG_IP_MULTICAST is not set
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--CONFIG_CONNECTOR=y
--CONFIG_PROC_EVENTS=y
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--# CONFIG_BLK_DEV_LOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=35000
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--# CONFIG_XILINX_SYSACE is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--# CONFIG_PHYLIB is not set
--CONFIG_NET_ETHERNET=y
--# CONFIG_MII is not set
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--CONFIG_IBM_NEW_EMAC=y
--CONFIG_IBM_NEW_EMAC_RXB=128
--CONFIG_IBM_NEW_EMAC_TXB=64
--CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
--CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
--CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
--# CONFIG_IBM_NEW_EMAC_DEBUG is not set
--CONFIG_IBM_NEW_EMAC_ZMII=y
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--# CONFIG_SERIAL_8250_PCI is not set
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--CONFIG_SERIAL_8250_EXTENDED=y
--# CONFIG_SERIAL_8250_MANY_PORTS is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--# CONFIG_SERIAL_8250_DETECT_IRQ is not set
--# CONFIG_SERIAL_8250_RSA is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--CONFIG_SERIAL_OF_PLATFORM=y
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--CONFIG_THERMAL=y
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_MAGIC_SYSRQ=y
--# CONFIG_UNUSED_SYMBOLS is not set
--CONFIG_DEBUG_FS=y
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--CONFIG_DEBUGGER=y
--# CONFIG_KGDB is not set
--# CONFIG_XMON is not set
--# CONFIG_VIRQ_DEBUG is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=y
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=y
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/chrp32_defconfig
-+++ b/arch/powerpc/configs/chrp32_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
- # Linux kernel version: 2.6.25-rc6
--# Thu Mar 20 10:33:36 2008
-+# Thu Mar 27 13:55:37 2008
- #
- # CONFIG_PPC64 is not set
-
-@@ -74,8 +74,6 @@ CONFIG_IKCONFIG_PROC=y
- CONFIG_LOG_BUF_SHIFT=15
- # CONFIG_CGROUPS is not set
- # CONFIG_GROUP_SCHED is not set
--# CONFIG_USER_SCHED is not set
--# CONFIG_CGROUP_SCHED is not set
- CONFIG_SYSFS_DEPRECATED=y
- CONFIG_SYSFS_DEPRECATED_V2=y
- # CONFIG_RELAY is not set
-@@ -243,7 +241,7 @@ CONFIG_PCI_SYSCALL=y
- # CONFIG_PCIEPORTBUS is not set
- CONFIG_ARCH_SUPPORTS_MSI=y
- # CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_LEGACY is not set
- # CONFIG_PCI_DEBUG is not set
- # CONFIG_PCCARD is not set
- # CONFIG_HOTPLUG_PCI is not set
-@@ -1328,6 +1326,7 @@ CONFIG_PLIST=y
- CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
- CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-
- #
- # Kernel hacking
---- a/arch/powerpc/configs/ebony_defconfig
-+++ /dev/null
-@@ -1,898 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc2
--# Fri Feb 15 21:50:44 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--CONFIG_44x=y
--# CONFIG_E200 is not set
--CONFIG_4xx=y
--CONFIG_BOOKE=y
--CONFIG_PTE_64BIT=y
--CONFIG_PHYS_64BIT=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_NOT_COHERENT_CACHE=y
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--CONFIG_PPC_DCR_NATIVE=y
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_PPC_DCR=y
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--CONFIG_KALLSYMS_ALL=y
--CONFIG_KALLSYMS_EXTRA_PASS=y
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--CONFIG_LBD=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--# CONFIG_PREEMPT_RCU is not set
--# CONFIG_PPC4xx_PCI_EXPRESS is not set
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--# CONFIG_BAMBOO is not set
--CONFIG_EBONY=y
--# CONFIG_SEQUOIA is not set
--# CONFIG_TAISHAN is not set
--# CONFIG_KATMAI is not set
--# CONFIG_RAINIER is not set
--# CONFIG_WARP is not set
--CONFIG_440GP=y
--# CONFIG_IPIC is not set
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--CONFIG_OF_RTC=y
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_RCU_TRACE=y
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--CONFIG_RESOURCES_64BIT=y
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_CONSISTENT_START=0xff100000
--CONFIG_CONSISTENT_SIZE=0x00200000
--CONFIG_BOOT_LOAD=0x01000000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--# CONFIG_IP_MULTICAST is not set
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--CONFIG_CONNECTOR=y
--CONFIG_PROC_EVENTS=y
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--# CONFIG_MTD_CMDLINE_PARTS is not set
--CONFIG_MTD_OF_PARTS=y
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--CONFIG_MTD_BLKDEVS=y
--CONFIG_MTD_BLOCK=y
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--CONFIG_MTD_JEDECPROBE=y
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--CONFIG_MTD_PHYSMAP_OF=y
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--# CONFIG_BLK_DEV_LOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=35000
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--# CONFIG_XILINX_SYSACE is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--# CONFIG_PHYLIB is not set
--CONFIG_NET_ETHERNET=y
--# CONFIG_MII is not set
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--CONFIG_IBM_NEW_EMAC=y
--CONFIG_IBM_NEW_EMAC_RXB=128
--CONFIG_IBM_NEW_EMAC_TXB=64
--CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
--CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
--CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
--# CONFIG_IBM_NEW_EMAC_DEBUG is not set
--CONFIG_IBM_NEW_EMAC_ZMII=y
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--# CONFIG_SERIAL_8250_PCI is not set
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--CONFIG_SERIAL_8250_EXTENDED=y
--# CONFIG_SERIAL_8250_MANY_PORTS is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--# CONFIG_SERIAL_8250_DETECT_IRQ is not set
--# CONFIG_SERIAL_8250_RSA is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--CONFIG_SERIAL_OF_PLATFORM=y
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--CONFIG_THERMAL=y
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--# CONFIG_DAB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--# CONFIG_VIDEO_OUTPUT_CONTROL is not set
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_JFFS2_FS=y
--CONFIG_JFFS2_FS_DEBUG=0
--CONFIG_JFFS2_FS_WRITEBUFFER=y
--# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
--# CONFIG_JFFS2_SUMMARY is not set
--# CONFIG_JFFS2_FS_XATTR is not set
--# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
--CONFIG_JFFS2_ZLIB=y
--# CONFIG_JFFS2_LZO is not set
--CONFIG_JFFS2_RTIME=y
--# CONFIG_JFFS2_RUBIN is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_ZLIB_DEFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_MAGIC_SYSRQ=y
--# CONFIG_UNUSED_SYMBOLS is not set
--CONFIG_DEBUG_FS=y
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--CONFIG_DEBUG_BUGVERBOSE=y
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_VIRQ_DEBUG is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=y
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=y
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--# CONFIG_CRYPTO_HW is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/ep405_defconfig
-+++ /dev/null
-@@ -1,968 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc2
--# Fri Feb 15 21:50:09 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--CONFIG_40x=y
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_4xx=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_NOT_COHERENT_CACHE=y
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--CONFIG_PPC_DCR_NATIVE=y
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_PPC_DCR=y
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--CONFIG_KALLSYMS_ALL=y
--CONFIG_KALLSYMS_EXTRA_PASS=y
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--CONFIG_LBD=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--# CONFIG_PREEMPT_RCU is not set
--# CONFIG_PPC4xx_PCI_EXPRESS is not set
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_EP405=y
--# CONFIG_KILAUEA is not set
--# CONFIG_MAKALU is not set
--# CONFIG_WALNUT is not set
--# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
--CONFIG_405GP=y
--CONFIG_IBM405_ERR77=y
--CONFIG_IBM405_ERR51=y
--# CONFIG_IPIC is not set
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_RCU_TRACE=y
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_MATH_EMULATION is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_CONSISTENT_START=0xff100000
--CONFIG_CONSISTENT_SIZE=0x00200000
--CONFIG_BOOT_LOAD=0x00400000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--# CONFIG_IP_MULTICAST is not set
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--CONFIG_CONNECTOR=y
--CONFIG_PROC_EVENTS=y
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--CONFIG_MTD_CMDLINE_PARTS=y
--CONFIG_MTD_OF_PARTS=y
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--CONFIG_MTD_BLKDEVS=m
--CONFIG_MTD_BLOCK=m
--# CONFIG_MTD_BLOCK_RO is not set
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--CONFIG_MTD_JEDECPROBE=y
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--CONFIG_MTD_PHYSMAP_OF=y
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--# CONFIG_BLK_DEV_LOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--# CONFIG_BLK_DEV_UB is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=35000
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--# CONFIG_XILINX_SYSACE is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--# CONFIG_PHYLIB is not set
--CONFIG_NET_ETHERNET=y
--# CONFIG_MII is not set
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--CONFIG_IBM_NEW_EMAC=y
--CONFIG_IBM_NEW_EMAC_RXB=128
--CONFIG_IBM_NEW_EMAC_TXB=64
--CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
--CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
--CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
--# CONFIG_IBM_NEW_EMAC_DEBUG is not set
--CONFIG_IBM_NEW_EMAC_ZMII=y
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--
--#
--# USB Network Adapters
--#
--# CONFIG_USB_CATC is not set
--# CONFIG_USB_KAWETH is not set
--# CONFIG_USB_PEGASUS is not set
--# CONFIG_USB_RTL8150 is not set
--# CONFIG_USB_USBNET is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--CONFIG_SERIAL_8250_EXTENDED=y
--# CONFIG_SERIAL_8250_MANY_PORTS is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--# CONFIG_SERIAL_8250_DETECT_IRQ is not set
--# CONFIG_SERIAL_8250_RSA is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--CONFIG_SERIAL_OF_PLATFORM=y
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--CONFIG_THERMAL=y
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--# CONFIG_DAB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--CONFIG_USB=y
--# CONFIG_USB_DEBUG is not set
--# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
--
--#
--# Miscellaneous USB options
--#
--CONFIG_USB_DEVICEFS=y
--CONFIG_USB_DEVICE_CLASS=y
--# CONFIG_USB_DYNAMIC_MINORS is not set
--# CONFIG_USB_OTG is not set
--
--#
--# USB Host Controller Drivers
--#
--# CONFIG_USB_EHCI_HCD is not set
--# CONFIG_USB_ISP116X_HCD is not set
--CONFIG_USB_OHCI_HCD=y
--CONFIG_USB_OHCI_HCD_PPC_OF=y
--CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
--CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
--CONFIG_USB_OHCI_HCD_PCI=y
--CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
--CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
--CONFIG_USB_OHCI_LITTLE_ENDIAN=y
--# CONFIG_USB_UHCI_HCD is not set
--# CONFIG_USB_SL811_HCD is not set
--# CONFIG_USB_R8A66597_HCD is not set
--
--#
--# USB Device Class drivers
--#
--# CONFIG_USB_ACM is not set
--# CONFIG_USB_PRINTER is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--
--#
--# may also be needed; see USB_STORAGE Help for more information
--#
--# CONFIG_USB_LIBUSUAL is not set
--
--#
--# USB Imaging devices
--#
--# CONFIG_USB_MDC800 is not set
--CONFIG_USB_MON=y
--
--#
--# USB port drivers
--#
--# CONFIG_USB_SERIAL is not set
--
--#
--# USB Miscellaneous drivers
--#
--# CONFIG_USB_EMI62 is not set
--# CONFIG_USB_EMI26 is not set
--# CONFIG_USB_ADUTUX is not set
--# CONFIG_USB_AUERSWALD is not set
--# CONFIG_USB_RIO500 is not set
--# CONFIG_USB_LEGOTOWER is not set
--# CONFIG_USB_LCD is not set
--# CONFIG_USB_BERRY_CHARGE is not set
--# CONFIG_USB_LED is not set
--# CONFIG_USB_CYPRESS_CY7C63 is not set
--# CONFIG_USB_CYTHERM is not set
--# CONFIG_USB_PHIDGET is not set
--# CONFIG_USB_IDMOUSE is not set
--# CONFIG_USB_FTDI_ELAN is not set
--# CONFIG_USB_APPLEDISPLAY is not set
--# CONFIG_USB_LD is not set
--# CONFIG_USB_TRANCEVIBRATOR is not set
--# CONFIG_USB_IOWARRIOR is not set
--# CONFIG_USB_TEST is not set
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_JFFS2_FS is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_MAGIC_SYSRQ=y
--# CONFIG_UNUSED_SYMBOLS is not set
--CONFIG_DEBUG_FS=y
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--CONFIG_DEBUG_BUGVERBOSE=y
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_VIRQ_DEBUG is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=y
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=y
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/g5_defconfig
-+++ b/arch/powerpc/configs/g5_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
- # Linux kernel version: 2.6.25-rc6
--# Thu Mar 20 10:36:41 2008
-+# Thu Mar 27 13:55:43 2008
- #
- CONFIG_PPC64=y
-
-@@ -77,8 +77,6 @@ CONFIG_IKCONFIG_PROC=y
- CONFIG_LOG_BUF_SHIFT=17
- # CONFIG_CGROUPS is not set
- # CONFIG_GROUP_SCHED is not set
--# CONFIG_USER_SCHED is not set
--# CONFIG_CGROUP_SCHED is not set
- CONFIG_SYSFS_DEPRECATED=y
- CONFIG_SYSFS_DEPRECATED_V2=y
- # CONFIG_RELAY is not set
-@@ -276,7 +274,7 @@ CONFIG_PCI_SYSCALL=y
- # CONFIG_PCIEPORTBUS is not set
- CONFIG_ARCH_SUPPORTS_MSI=y
- CONFIG_PCI_MSI=y
--CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_LEGACY is not set
- # CONFIG_PCI_DEBUG is not set
- # CONFIG_PCCARD is not set
- # CONFIG_HOTPLUG_PCI is not set
-@@ -1596,6 +1594,7 @@ CONFIG_PLIST=y
- CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
- CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-
- #
- # Kernel hacking
---- a/arch/powerpc/configs/iseries_defconfig
-+++ b/arch/powerpc/configs/iseries_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
- # Linux kernel version: 2.6.25-rc6
--# Thu Mar 20 10:43:46 2008
-+# Thu Mar 27 13:55:45 2008
- #
- CONFIG_PPC64=y
-
-@@ -77,8 +77,6 @@ CONFIG_IKCONFIG_PROC=y
- CONFIG_LOG_BUF_SHIFT=17
- # CONFIG_CGROUPS is not set
- # CONFIG_GROUP_SCHED is not set
--# CONFIG_USER_SCHED is not set
--# CONFIG_CGROUP_SCHED is not set
- CONFIG_SYSFS_DEPRECATED=y
- CONFIG_SYSFS_DEPRECATED_V2=y
- # CONFIG_RELAY is not set
-@@ -261,7 +259,7 @@ CONFIG_PCI_SYSCALL=y
- # CONFIG_PCIEPORTBUS is not set
- CONFIG_ARCH_SUPPORTS_MSI=y
- # CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_LEGACY is not set
- # CONFIG_PCI_DEBUG is not set
- # CONFIG_PCCARD is not set
- # CONFIG_HOTPLUG_PCI is not set
-@@ -1065,6 +1063,7 @@ CONFIG_PLIST=y
- CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
- CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-
- #
- # Kernel hacking
---- a/arch/powerpc/configs/katmai_defconfig
-+++ /dev/null
-@@ -1,790 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc6
--# Mon Dec 24 11:17:43 2007
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--CONFIG_44x=y
--# CONFIG_E200 is not set
--CONFIG_4xx=y
--CONFIG_BOOKE=y
--CONFIG_PTE_64BIT=y
--CONFIG_PHYS_64BIT=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_NOT_COHERENT_CACHE=y
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--CONFIG_PPC_DCR_NATIVE=y
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_PPC_DCR=y
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_USER_NS is not set
--# CONFIG_PID_NS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_FAIR_GROUP_SCHED=y
--CONFIG_FAIR_USER_SCHED=y
--# CONFIG_FAIR_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_ALL is not set
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--CONFIG_LBD=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_PPC4xx_PCI_EXPRESS=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC52xx is not set
--# CONFIG_PPC_MPC5200 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--# CONFIG_BAMBOO is not set
--# CONFIG_EBONY is not set
--# CONFIG_SEQUOIA is not set
--# CONFIG_TAISHAN is not set
--CONFIG_KATMAI=y
--# CONFIG_RAINIER is not set
--CONFIG_440SPe=y
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_CPM2 is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_MATH_EMULATION is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--CONFIG_RESOURCES_64BIT=y
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--CONFIG_CMDLINE_BOOL=y
--CONFIG_CMDLINE=""
--CONFIG_SECCOMP=y
--CONFIG_WANT_DEVICE_TREE=y
--CONFIG_DEVICE_TREE="katmai.dts"
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_CONSISTENT_START=0xff100000
--CONFIG_CONSISTENT_SIZE=0x00200000
--CONFIG_BOOT_LOAD=0x01000000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--# CONFIG_IP_MULTICAST is not set
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--CONFIG_CONNECTOR=y
--CONFIG_PROC_EVENTS=y
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--# CONFIG_BLK_DEV_LOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=35000
--CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--# CONFIG_XILINX_SYSACE is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--CONFIG_MACINTOSH_DRIVERS=y
--# CONFIG_MAC_EMUMOUSEBTN is not set
--# CONFIG_WINDFARM is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_IP1000 is not set
--# CONFIG_ARCNET is not set
--# CONFIG_PHYLIB is not set
--CONFIG_NET_ETHERNET=y
--# CONFIG_MII is not set
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--CONFIG_IBM_NEW_EMAC=y
--CONFIG_IBM_NEW_EMAC_RXB=128
--CONFIG_IBM_NEW_EMAC_TXB=64
--CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
--CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
--CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
--# CONFIG_IBM_NEW_EMAC_DEBUG is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--CONFIG_IBM_NEW_EMAC_EMAC4=y
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_SHAPER is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--# CONFIG_SERIAL_8250_PCI is not set
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--CONFIG_SERIAL_8250_EXTENDED=y
--# CONFIG_SERIAL_8250_MANY_PORTS is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--# CONFIG_SERIAL_8250_DETECT_IRQ is not set
--# CONFIG_SERIAL_8250_RSA is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--CONFIG_SERIAL_OF_PLATFORM=y
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--
--#
--# USB Gadget Support
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_ROMFS_FS is not set
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--CONFIG_DNOTIFY=y
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--# CONFIG_UCC_SLOW is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--CONFIG_INSTRUMENTATION=y
--# CONFIG_PROFILING is not set
--# CONFIG_KPROBES is not set
--# CONFIG_MARKERS is not set
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_MAGIC_SYSRQ=y
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--CONFIG_FORCED_INLINING=y
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--CONFIG_DEBUGGER=y
--# CONFIG_KGDB is not set
--# CONFIG_XMON is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=y
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=y
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/kilauea_defconfig
-+++ /dev/null
-@@ -1,839 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc2
--# Fri Feb 15 21:51:43 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--CONFIG_40x=y
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_4xx=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_NOT_COHERENT_CACHE=y
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--CONFIG_PPC_DCR_NATIVE=y
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_PPC_DCR=y
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--CONFIG_KALLSYMS_ALL=y
--CONFIG_KALLSYMS_EXTRA_PASS=y
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--CONFIG_LBD=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--# CONFIG_PREEMPT_RCU is not set
--CONFIG_PPC4xx_PCI_EXPRESS=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--# CONFIG_EP405 is not set
--CONFIG_KILAUEA=y
--# CONFIG_MAKALU is not set
--# CONFIG_WALNUT is not set
--# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
--CONFIG_405EX=y
--# CONFIG_IPIC is not set
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_RCU_TRACE=y
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_MATH_EMULATION is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_CONSISTENT_START=0xff100000
--CONFIG_CONSISTENT_SIZE=0x00200000
--CONFIG_BOOT_LOAD=0x00400000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--# CONFIG_IP_MULTICAST is not set
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--CONFIG_CONNECTOR=y
--CONFIG_PROC_EVENTS=y
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--CONFIG_MTD_CMDLINE_PARTS=y
--CONFIG_MTD_OF_PARTS=y
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--CONFIG_MTD_BLKDEVS=m
--CONFIG_MTD_BLOCK=m
--# CONFIG_MTD_BLOCK_RO is not set
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--CONFIG_MTD_JEDECPROBE=y
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--CONFIG_MTD_PHYSMAP_OF=y
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--# CONFIG_BLK_DEV_LOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=35000
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--# CONFIG_XILINX_SYSACE is not set
--# CONFIG_MISC_DEVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--# CONFIG_PHYLIB is not set
--CONFIG_NET_ETHERNET=y
--# CONFIG_MII is not set
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--CONFIG_IBM_NEW_EMAC=y
--CONFIG_IBM_NEW_EMAC_RXB=256
--CONFIG_IBM_NEW_EMAC_TXB=256
--CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
--CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
--CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
--# CONFIG_IBM_NEW_EMAC_DEBUG is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--CONFIG_IBM_NEW_EMAC_RGMII=y
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--CONFIG_IBM_NEW_EMAC_EMAC4=y
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--# CONFIG_NETDEV_1000 is not set
--# CONFIG_NETDEV_10000 is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--CONFIG_SERIAL_8250_EXTENDED=y
--# CONFIG_SERIAL_8250_MANY_PORTS is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--# CONFIG_SERIAL_8250_DETECT_IRQ is not set
--# CONFIG_SERIAL_8250_RSA is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--CONFIG_SERIAL_OF_PLATFORM=y
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--CONFIG_THERMAL=y
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--# CONFIG_DAB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--# CONFIG_VIDEO_OUTPUT_CONTROL is not set
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--# CONFIG_USB_SUPPORT is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_JFFS2_FS is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_MAGIC_SYSRQ=y
--# CONFIG_UNUSED_SYMBOLS is not set
--CONFIG_DEBUG_FS=y
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--CONFIG_DEBUG_BUGVERBOSE=y
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_VIRQ_DEBUG is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=y
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=y
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/makalu_defconfig
-+++ /dev/null
-@@ -1,839 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc2
--# Fri Feb 15 21:52:30 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--CONFIG_40x=y
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_4xx=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_NOT_COHERENT_CACHE=y
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--CONFIG_PPC_DCR_NATIVE=y
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_PPC_DCR=y
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--CONFIG_KALLSYMS_ALL=y
--CONFIG_KALLSYMS_EXTRA_PASS=y
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--CONFIG_LBD=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--# CONFIG_PREEMPT_RCU is not set
--CONFIG_PPC4xx_PCI_EXPRESS=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--# CONFIG_EP405 is not set
--# CONFIG_KILAUEA is not set
--CONFIG_MAKALU=y
--# CONFIG_WALNUT is not set
--# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
--CONFIG_405EX=y
--# CONFIG_IPIC is not set
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_RCU_TRACE=y
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_MATH_EMULATION is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_CONSISTENT_START=0xff100000
--CONFIG_CONSISTENT_SIZE=0x00200000
--CONFIG_BOOT_LOAD=0x00400000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--# CONFIG_IP_MULTICAST is not set
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--CONFIG_CONNECTOR=y
--CONFIG_PROC_EVENTS=y
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--CONFIG_MTD_CMDLINE_PARTS=y
--CONFIG_MTD_OF_PARTS=y
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--CONFIG_MTD_BLKDEVS=m
--CONFIG_MTD_BLOCK=m
--# CONFIG_MTD_BLOCK_RO is not set
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--CONFIG_MTD_JEDECPROBE=y
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--CONFIG_MTD_PHYSMAP_OF=y
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--# CONFIG_BLK_DEV_LOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=35000
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--# CONFIG_XILINX_SYSACE is not set
--# CONFIG_MISC_DEVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--# CONFIG_PHYLIB is not set
--CONFIG_NET_ETHERNET=y
--# CONFIG_MII is not set
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--CONFIG_IBM_NEW_EMAC=y
--CONFIG_IBM_NEW_EMAC_RXB=256
--CONFIG_IBM_NEW_EMAC_TXB=256
--CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
--CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
--CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
--# CONFIG_IBM_NEW_EMAC_DEBUG is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--CONFIG_IBM_NEW_EMAC_RGMII=y
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--CONFIG_IBM_NEW_EMAC_EMAC4=y
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--# CONFIG_NETDEV_1000 is not set
--# CONFIG_NETDEV_10000 is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--CONFIG_SERIAL_8250_EXTENDED=y
--# CONFIG_SERIAL_8250_MANY_PORTS is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--# CONFIG_SERIAL_8250_DETECT_IRQ is not set
--# CONFIG_SERIAL_8250_RSA is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--CONFIG_SERIAL_OF_PLATFORM=y
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--CONFIG_THERMAL=y
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--# CONFIG_DAB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--# CONFIG_VIDEO_OUTPUT_CONTROL is not set
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--# CONFIG_USB_SUPPORT is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_JFFS2_FS is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_MAGIC_SYSRQ=y
--# CONFIG_UNUSED_SYMBOLS is not set
--CONFIG_DEBUG_FS=y
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--CONFIG_DEBUG_BUGVERBOSE=y
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_VIRQ_DEBUG is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=y
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=y
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/maple_defconfig
-+++ b/arch/powerpc/configs/maple_defconfig
-@@ -333,7 +333,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
- CONFIG_STANDALONE=y
- CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
-+CONFIG_FW_LOADER=y
- # CONFIG_DEBUG_DRIVER is not set
- # CONFIG_DEBUG_DEVRES is not set
- # CONFIG_SYS_HYPERVISOR is not set
-@@ -374,6 +374,7 @@ CONFIG_BLK_DEV_IDEDISK=y
- CONFIG_BLK_DEV_IDECD=y
- # CONFIG_BLK_DEV_IDETAPE is not set
- # CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_BLK_DEV_IDESCSI is not set
- CONFIG_IDE_TASK_IOCTL=y
- CONFIG_IDE_PROC_FS=y
-
-@@ -427,10 +428,129 @@ CONFIG_IDE_ARCH_OBSOLETE_INIT=y
- # SCSI device support
- #
- # CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
- # CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
-+# CONFIG_SCSI_PROC_FS is not set
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+CONFIG_SCSI_IPR=y
-+CONFIG_SCSI_IPR_TRACE=y
-+CONFIG_SCSI_IPR_DUMP=y
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+CONFIG_ATA=y
-+CONFIG_ATA_NONSTANDARD=y
-+# CONFIG_SATA_AHCI is not set
-+# CONFIG_SATA_SVW is not set
-+# CONFIG_ATA_PIIX is not set
-+# CONFIG_SATA_MV is not set
-+# CONFIG_SATA_NV is not set
-+# CONFIG_PDC_ADMA is not set
-+# CONFIG_SATA_QSTOR is not set
-+# CONFIG_SATA_PROMISE is not set
-+# CONFIG_SATA_SX4 is not set
-+# CONFIG_SATA_SIL is not set
-+# CONFIG_SATA_SIL24 is not set
-+# CONFIG_SATA_SIS is not set
-+# CONFIG_SATA_ULI is not set
-+# CONFIG_SATA_VIA is not set
-+# CONFIG_SATA_VITESSE is not set
-+# CONFIG_SATA_INIC162X is not set
-+# CONFIG_PATA_ALI is not set
-+# CONFIG_PATA_AMD is not set
-+# CONFIG_PATA_ARTOP is not set
-+# CONFIG_PATA_ATIIXP is not set
-+# CONFIG_PATA_CMD640_PCI is not set
-+# CONFIG_PATA_CMD64X is not set
-+# CONFIG_PATA_CS5520 is not set
-+# CONFIG_PATA_CS5530 is not set
-+# CONFIG_PATA_CYPRESS is not set
-+# CONFIG_PATA_EFAR is not set
-+# CONFIG_ATA_GENERIC is not set
-+# CONFIG_PATA_HPT366 is not set
-+# CONFIG_PATA_HPT37X is not set
-+# CONFIG_PATA_HPT3X2N is not set
-+# CONFIG_PATA_HPT3X3 is not set
-+# CONFIG_PATA_IT821X is not set
-+# CONFIG_PATA_IT8213 is not set
-+# CONFIG_PATA_JMICRON is not set
-+# CONFIG_PATA_TRIFLEX is not set
-+# CONFIG_PATA_MARVELL is not set
-+# CONFIG_PATA_MPIIX is not set
-+# CONFIG_PATA_OLDPIIX is not set
-+# CONFIG_PATA_NETCELL is not set
-+# CONFIG_PATA_NS87410 is not set
-+# CONFIG_PATA_NS87415 is not set
-+# CONFIG_PATA_OPTI is not set
-+# CONFIG_PATA_OPTIDMA is not set
-+# CONFIG_PATA_PDC_OLD is not set
-+# CONFIG_PATA_RADISYS is not set
-+# CONFIG_PATA_RZ1000 is not set
-+# CONFIG_PATA_SC1200 is not set
-+# CONFIG_PATA_SERVERWORKS is not set
-+# CONFIG_PATA_PDC2027X is not set
-+# CONFIG_PATA_SIL680 is not set
-+# CONFIG_PATA_SIS is not set
-+# CONFIG_PATA_VIA is not set
-+# CONFIG_PATA_WINBOND is not set
- # CONFIG_MD is not set
- # CONFIG_FUSION is not set
-
-@@ -536,6 +656,7 @@ CONFIG_USB_PEGASUS=y
- # CONFIG_HIPPI is not set
- # CONFIG_PPP is not set
- # CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
- # CONFIG_SHAPER is not set
- # CONFIG_NETCONSOLE is not set
- # CONFIG_NETPOLL is not set
-@@ -783,12 +904,14 @@ CONFIG_USB_UHCI_HCD=y
- #
- # may also be needed; see USB_STORAGE Help for more information
- #
-+# CONFIG_USB_STORAGE is not set
- # CONFIG_USB_LIBUSUAL is not set
-
- #
- # USB Imaging devices
- #
- # CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
- CONFIG_USB_MON=y
-
- #
---- a/arch/powerpc/configs/mpc8313_rdb_defconfig
-+++ /dev/null
-@@ -1,1393 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:14 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_FSL_EMB_PERFMON is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MULTIPLATFORM is not set
--# CONFIG_PPC_82xx is not set
--CONFIG_PPC_83xx=y
--# CONFIG_PPC_86xx is not set
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC83xx=y
--CONFIG_MPC831x_RDB=y
--# CONFIG_MPC832x_MDS is not set
--# CONFIG_MPC832x_RDB is not set
--# CONFIG_MPC834x_MDS is not set
--# CONFIG_MPC834x_ITX is not set
--# CONFIG_MPC836x_MDS is not set
--# CONFIG_MPC837x_MDS is not set
--# CONFIG_MPC837x_RDB is not set
--# CONFIG_SBC834x is not set
--CONFIG_PPC_MPC831x=y
--CONFIG_IPIC=y
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--# CONFIG_MTD_CMDLINE_PARTS is not set
--# CONFIG_MTD_OF_PARTS is not set
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--CONFIG_MTD_BLKDEVS=y
--CONFIG_MTD_BLOCK=y
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--# CONFIG_MTD_JEDECPROBE is not set
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--CONFIG_MTD_PHYSMAP_OF=y
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_DATAFLASH is not set
--# CONFIG_MTD_M25P80 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--CONFIG_MTD_NAND=y
--CONFIG_MTD_NAND_VERIFY_WRITE=y
--# CONFIG_MTD_NAND_ECC_SMC is not set
--# CONFIG_MTD_NAND_MUSEUM_IDS is not set
--CONFIG_MTD_NAND_IDS=y
--# CONFIG_MTD_NAND_DISKONCHIP is not set
--# CONFIG_MTD_NAND_CAFE is not set
--# CONFIG_MTD_NAND_NANDSIM is not set
--# CONFIG_MTD_NAND_PLATFORM is not set
--# CONFIG_MTD_ALAUDA is not set
--# CONFIG_MTD_NAND_FSL_ELBC is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--# CONFIG_BLK_DEV_UB is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--# CONFIG_BLK_DEV_SD is not set
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--CONFIG_CHR_DEV_SG=y
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--CONFIG_SCSI_SPI_ATTRS=y
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_MVSAS is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--# CONFIG_ATA is not set
--CONFIG_MD=y
--CONFIG_BLK_DEV_MD=y
--CONFIG_MD_LINEAR=y
--CONFIG_MD_RAID0=y
--CONFIG_MD_RAID1=y
--# CONFIG_MD_RAID10 is not set
--# CONFIG_MD_RAID456 is not set
--# CONFIG_MD_MULTIPATH is not set
--# CONFIG_MD_FAULTY is not set
--# CONFIG_BLK_DEV_DM is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--CONFIG_CICADA_PHY=y
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_ENC28J60 is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--CONFIG_NET_PCI=y
--# CONFIG_PCNET32 is not set
--# CONFIG_AMD8111_ETH is not set
--# CONFIG_ADAPTEC_STARFIRE is not set
--# CONFIG_B44 is not set
--# CONFIG_FORCEDETH is not set
--# CONFIG_EEPRO100 is not set
--CONFIG_E100=y
--# CONFIG_FEALNX is not set
--# CONFIG_NATSEMI is not set
--# CONFIG_NE2K_PCI is not set
--# CONFIG_8139CP is not set
--# CONFIG_8139TOO is not set
--# CONFIG_R6040 is not set
--# CONFIG_SIS900 is not set
--# CONFIG_EPIC100 is not set
--# CONFIG_SUNDANCE is not set
--# CONFIG_TLAN is not set
--# CONFIG_VIA_RHINE is not set
--# CONFIG_SC92031 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--
--#
--# USB Network Adapters
--#
--# CONFIG_USB_CATC is not set
--# CONFIG_USB_KAWETH is not set
--# CONFIG_USB_PEGASUS is not set
--# CONFIG_USB_RTL8150 is not set
--# CONFIG_USB_USBNET is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_TINY_USB is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--CONFIG_SPI=y
--# CONFIG_SPI_DEBUG is not set
--CONFIG_SPI_MASTER=y
--
--#
--# SPI Master Controller Drivers
--#
--CONFIG_SPI_BITBANG=y
--CONFIG_SPI_MPC83xx=y
--
--#
--# SPI Protocol Masters
--#
--# CONFIG_SPI_AT25 is not set
--# CONFIG_SPI_SPIDEV is not set
--# CONFIG_SPI_TLE62X0 is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--# CONFIG_SENSORS_LM70 is not set
--# CONFIG_SENSORS_LM75 is not set
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_83xx_WDT=y
--
--#
--# PCI-based Watchdog Cards
--#
--# CONFIG_PCIPCWATCHDOG is not set
--# CONFIG_WDTPCI is not set
--
--#
--# USB-based Watchdog Cards
--#
--# CONFIG_USBPCWATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--# CONFIG_USB_DABUSB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--
--#
--# USB Input Devices
--#
--# CONFIG_USB_HID is not set
--
--#
--# USB HID Boot Protocol drivers
--#
--# CONFIG_USB_KBD is not set
--# CONFIG_USB_MOUSE is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--CONFIG_USB=y
--# CONFIG_USB_DEBUG is not set
--# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
--
--#
--# Miscellaneous USB options
--#
--CONFIG_USB_DEVICEFS=y
--CONFIG_USB_DEVICE_CLASS=y
--# CONFIG_USB_DYNAMIC_MINORS is not set
--# CONFIG_USB_OTG is not set
--
--#
--# USB Host Controller Drivers
--#
--CONFIG_USB_EHCI_HCD=y
--CONFIG_USB_EHCI_ROOT_HUB_TT=y
--# CONFIG_USB_EHCI_TT_NEWSCHED is not set
--CONFIG_USB_EHCI_FSL=y
--CONFIG_USB_EHCI_HCD_PPC_OF=y
--# CONFIG_USB_ISP116X_HCD is not set
--CONFIG_USB_OHCI_HCD=y
--CONFIG_USB_OHCI_HCD_PPC_OF=y
--CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
--# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
--CONFIG_USB_OHCI_HCD_PCI=y
--CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
--CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
--CONFIG_USB_OHCI_LITTLE_ENDIAN=y
--CONFIG_USB_UHCI_HCD=y
--# CONFIG_USB_SL811_HCD is not set
--# CONFIG_USB_R8A66597_HCD is not set
--
--#
--# USB Device Class drivers
--#
--# CONFIG_USB_ACM is not set
--# CONFIG_USB_PRINTER is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--
--#
--# may also be needed; see USB_STORAGE Help for more information
--#
--CONFIG_USB_STORAGE=y
--# CONFIG_USB_STORAGE_DEBUG is not set
--# CONFIG_USB_STORAGE_DATAFAB is not set
--# CONFIG_USB_STORAGE_FREECOM is not set
--# CONFIG_USB_STORAGE_ISD200 is not set
--# CONFIG_USB_STORAGE_DPCM is not set
--# CONFIG_USB_STORAGE_USBAT is not set
--# CONFIG_USB_STORAGE_SDDR09 is not set
--# CONFIG_USB_STORAGE_SDDR55 is not set
--# CONFIG_USB_STORAGE_JUMPSHOT is not set
--# CONFIG_USB_STORAGE_ALAUDA is not set
--# CONFIG_USB_STORAGE_KARMA is not set
--# CONFIG_USB_LIBUSUAL is not set
--
--#
--# USB Imaging devices
--#
--# CONFIG_USB_MDC800 is not set
--# CONFIG_USB_MICROTEK is not set
--CONFIG_USB_MON=y
--
--#
--# USB port drivers
--#
--# CONFIG_USB_SERIAL is not set
--
--#
--# USB Miscellaneous drivers
--#
--# CONFIG_USB_EMI62 is not set
--# CONFIG_USB_EMI26 is not set
--# CONFIG_USB_ADUTUX is not set
--# CONFIG_USB_AUERSWALD is not set
--# CONFIG_USB_RIO500 is not set
--# CONFIG_USB_LEGOTOWER is not set
--# CONFIG_USB_LCD is not set
--# CONFIG_USB_BERRY_CHARGE is not set
--# CONFIG_USB_LED is not set
--# CONFIG_USB_CYPRESS_CY7C63 is not set
--# CONFIG_USB_CYTHERM is not set
--# CONFIG_USB_PHIDGET is not set
--# CONFIG_USB_IDMOUSE is not set
--# CONFIG_USB_FTDI_ELAN is not set
--# CONFIG_USB_APPLEDISPLAY is not set
--# CONFIG_USB_SISUSBVGA is not set
--# CONFIG_USB_LD is not set
--# CONFIG_USB_TRANCEVIBRATOR is not set
--# CONFIG_USB_IOWARRIOR is not set
--# CONFIG_USB_TEST is not set
--CONFIG_USB_GADGET=y
--# CONFIG_USB_GADGET_DEBUG is not set
--# CONFIG_USB_GADGET_DEBUG_FILES is not set
--CONFIG_USB_GADGET_SELECTED=y
--# CONFIG_USB_GADGET_AMD5536UDC is not set
--# CONFIG_USB_GADGET_ATMEL_USBA is not set
--# CONFIG_USB_GADGET_FSL_USB2 is not set
--CONFIG_USB_GADGET_NET2280=y
--CONFIG_USB_NET2280=y
--# CONFIG_USB_GADGET_PXA2XX is not set
--# CONFIG_USB_GADGET_M66592 is not set
--# CONFIG_USB_GADGET_GOKU is not set
--# CONFIG_USB_GADGET_LH7A40X is not set
--# CONFIG_USB_GADGET_OMAP is not set
--# CONFIG_USB_GADGET_S3C2410 is not set
--# CONFIG_USB_GADGET_AT91 is not set
--# CONFIG_USB_GADGET_DUMMY_HCD is not set
--CONFIG_USB_GADGET_DUALSPEED=y
--# CONFIG_USB_ZERO is not set
--CONFIG_USB_ETH=y
--CONFIG_USB_ETH_RNDIS=y
--# CONFIG_USB_GADGETFS is not set
--# CONFIG_USB_FILE_STORAGE is not set
--# CONFIG_USB_G_SERIAL is not set
--# CONFIG_USB_MIDI_GADGET is not set
--# CONFIG_USB_G_PRINTER is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--CONFIG_RTC_LIB=y
--CONFIG_RTC_CLASS=y
--CONFIG_RTC_HCTOSYS=y
--CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
--# CONFIG_RTC_DEBUG is not set
--
--#
--# RTC interfaces
--#
--CONFIG_RTC_INTF_SYSFS=y
--CONFIG_RTC_INTF_PROC=y
--CONFIG_RTC_INTF_DEV=y
--CONFIG_RTC_INTF_DEV_UIE_EMUL=y
--# CONFIG_RTC_DRV_TEST is not set
--
--#
--# I2C RTC drivers
--#
--CONFIG_RTC_DRV_DS1307=y
--# CONFIG_RTC_DRV_DS1374 is not set
--# CONFIG_RTC_DRV_DS1672 is not set
--# CONFIG_RTC_DRV_MAX6900 is not set
--# CONFIG_RTC_DRV_RS5C372 is not set
--# CONFIG_RTC_DRV_ISL1208 is not set
--# CONFIG_RTC_DRV_X1205 is not set
--# CONFIG_RTC_DRV_PCF8563 is not set
--# CONFIG_RTC_DRV_PCF8583 is not set
--# CONFIG_RTC_DRV_M41T80 is not set
--# CONFIG_RTC_DRV_S35390A is not set
--
--#
--# SPI RTC drivers
--#
--# CONFIG_RTC_DRV_MAX6902 is not set
--# CONFIG_RTC_DRV_R9701 is not set
--# CONFIG_RTC_DRV_RS5C348 is not set
--
--#
--# Platform RTC drivers
--#
--# CONFIG_RTC_DRV_CMOS is not set
--# CONFIG_RTC_DRV_DS1511 is not set
--# CONFIG_RTC_DRV_DS1553 is not set
--# CONFIG_RTC_DRV_DS1742 is not set
--# CONFIG_RTC_DRV_STK17TA8 is not set
--# CONFIG_RTC_DRV_M48T86 is not set
--# CONFIG_RTC_DRV_M48T59 is not set
--# CONFIG_RTC_DRV_V3020 is not set
--
--#
--# on-CPU RTC drivers
--#
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_JFFS2_FS=y
--CONFIG_JFFS2_FS_DEBUG=0
--CONFIG_JFFS2_FS_WRITEBUFFER=y
--# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
--# CONFIG_JFFS2_SUMMARY is not set
--# CONFIG_JFFS2_FS_XATTR is not set
--# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
--CONFIG_JFFS2_ZLIB=y
--# CONFIG_JFFS2_LZO is not set
--CONFIG_JFFS2_RTIME=y
--# CONFIG_JFFS2_RUBIN is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_BSD_DISKLABEL is not set
--# CONFIG_MINIX_SUBPARTITION is not set
--# CONFIG_SOLARIS_X86_PARTITION is not set
--# CONFIG_UNIXWARE_DISKLABEL is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_ZLIB_DEFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/mpc8315_rdb_defconfig
-+++ /dev/null
-@@ -1,1451 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:15 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_FSL_EMB_PERFMON is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MULTIPLATFORM is not set
--# CONFIG_PPC_82xx is not set
--CONFIG_PPC_83xx=y
--# CONFIG_PPC_86xx is not set
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC83xx=y
--CONFIG_MPC831x_RDB=y
--# CONFIG_MPC832x_MDS is not set
--# CONFIG_MPC832x_RDB is not set
--# CONFIG_MPC834x_MDS is not set
--# CONFIG_MPC834x_ITX is not set
--# CONFIG_MPC836x_MDS is not set
--# CONFIG_MPC837x_MDS is not set
--# CONFIG_MPC837x_RDB is not set
--# CONFIG_SBC834x is not set
--CONFIG_PPC_MPC831x=y
--CONFIG_IPIC=y
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--# CONFIG_MTD_CMDLINE_PARTS is not set
--# CONFIG_MTD_OF_PARTS is not set
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--CONFIG_MTD_BLKDEVS=y
--CONFIG_MTD_BLOCK=y
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--# CONFIG_MTD_JEDECPROBE is not set
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--CONFIG_MTD_PHYSMAP_OF=y
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_DATAFLASH is not set
--# CONFIG_MTD_M25P80 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--CONFIG_MTD_NAND=y
--CONFIG_MTD_NAND_VERIFY_WRITE=y
--# CONFIG_MTD_NAND_ECC_SMC is not set
--# CONFIG_MTD_NAND_MUSEUM_IDS is not set
--CONFIG_MTD_NAND_IDS=y
--# CONFIG_MTD_NAND_DISKONCHIP is not set
--# CONFIG_MTD_NAND_CAFE is not set
--# CONFIG_MTD_NAND_NANDSIM is not set
--# CONFIG_MTD_NAND_PLATFORM is not set
--# CONFIG_MTD_ALAUDA is not set
--# CONFIG_MTD_NAND_FSL_ELBC is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--# CONFIG_BLK_DEV_UB is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--# CONFIG_BLK_DEV_SD is not set
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--CONFIG_CHR_DEV_SG=y
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--CONFIG_SCSI_SPI_ATTRS=y
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_MVSAS is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_IPR is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--CONFIG_ATA=y
--# CONFIG_ATA_NONSTANDARD is not set
--# CONFIG_SATA_AHCI is not set
--# CONFIG_SATA_SVW is not set
--# CONFIG_ATA_PIIX is not set
--# CONFIG_SATA_MV is not set
--# CONFIG_SATA_NV is not set
--# CONFIG_PDC_ADMA is not set
--# CONFIG_SATA_QSTOR is not set
--# CONFIG_SATA_PROMISE is not set
--# CONFIG_SATA_SX4 is not set
--# CONFIG_SATA_SIL is not set
--# CONFIG_SATA_SIL24 is not set
--# CONFIG_SATA_SIS is not set
--# CONFIG_SATA_ULI is not set
--# CONFIG_SATA_VIA is not set
--# CONFIG_SATA_VITESSE is not set
--# CONFIG_SATA_INIC162X is not set
--CONFIG_SATA_FSL=y
--# CONFIG_PATA_ALI is not set
--# CONFIG_PATA_AMD is not set
--# CONFIG_PATA_ARTOP is not set
--# CONFIG_PATA_ATIIXP is not set
--# CONFIG_PATA_CMD640_PCI is not set
--# CONFIG_PATA_CMD64X is not set
--# CONFIG_PATA_CS5520 is not set
--# CONFIG_PATA_CS5530 is not set
--# CONFIG_PATA_CYPRESS is not set
--# CONFIG_PATA_EFAR is not set
--# CONFIG_ATA_GENERIC is not set
--# CONFIG_PATA_HPT366 is not set
--# CONFIG_PATA_HPT37X is not set
--# CONFIG_PATA_HPT3X2N is not set
--# CONFIG_PATA_HPT3X3 is not set
--# CONFIG_PATA_IT821X is not set
--# CONFIG_PATA_IT8213 is not set
--# CONFIG_PATA_JMICRON is not set
--# CONFIG_PATA_TRIFLEX is not set
--# CONFIG_PATA_MARVELL is not set
--# CONFIG_PATA_MPIIX is not set
--# CONFIG_PATA_OLDPIIX is not set
--# CONFIG_PATA_NETCELL is not set
--# CONFIG_PATA_NINJA32 is not set
--# CONFIG_PATA_NS87410 is not set
--# CONFIG_PATA_NS87415 is not set
--# CONFIG_PATA_OPTI is not set
--# CONFIG_PATA_OPTIDMA is not set
--# CONFIG_PATA_PDC_OLD is not set
--# CONFIG_PATA_RADISYS is not set
--# CONFIG_PATA_RZ1000 is not set
--# CONFIG_PATA_SC1200 is not set
--# CONFIG_PATA_SERVERWORKS is not set
--# CONFIG_PATA_PDC2027X is not set
--# CONFIG_PATA_SIL680 is not set
--# CONFIG_PATA_SIS is not set
--# CONFIG_PATA_VIA is not set
--# CONFIG_PATA_WINBOND is not set
--# CONFIG_PATA_PLATFORM is not set
--CONFIG_MD=y
--CONFIG_BLK_DEV_MD=y
--CONFIG_MD_LINEAR=y
--CONFIG_MD_RAID0=y
--CONFIG_MD_RAID1=y
--# CONFIG_MD_RAID10 is not set
--# CONFIG_MD_RAID456 is not set
--# CONFIG_MD_MULTIPATH is not set
--# CONFIG_MD_FAULTY is not set
--# CONFIG_BLK_DEV_DM is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_ENC28J60 is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--CONFIG_NET_PCI=y
--# CONFIG_PCNET32 is not set
--# CONFIG_AMD8111_ETH is not set
--# CONFIG_ADAPTEC_STARFIRE is not set
--# CONFIG_B44 is not set
--# CONFIG_FORCEDETH is not set
--# CONFIG_EEPRO100 is not set
--CONFIG_E100=y
--# CONFIG_FEALNX is not set
--# CONFIG_NATSEMI is not set
--# CONFIG_NE2K_PCI is not set
--# CONFIG_8139CP is not set
--# CONFIG_8139TOO is not set
--# CONFIG_R6040 is not set
--# CONFIG_SIS900 is not set
--# CONFIG_EPIC100 is not set
--# CONFIG_SUNDANCE is not set
--# CONFIG_TLAN is not set
--# CONFIG_VIA_RHINE is not set
--# CONFIG_SC92031 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--
--#
--# USB Network Adapters
--#
--# CONFIG_USB_CATC is not set
--# CONFIG_USB_KAWETH is not set
--# CONFIG_USB_PEGASUS is not set
--# CONFIG_USB_RTL8150 is not set
--# CONFIG_USB_USBNET is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_TINY_USB is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--CONFIG_SPI=y
--# CONFIG_SPI_DEBUG is not set
--CONFIG_SPI_MASTER=y
--
--#
--# SPI Master Controller Drivers
--#
--CONFIG_SPI_BITBANG=y
--CONFIG_SPI_MPC83xx=y
--
--#
--# SPI Protocol Masters
--#
--# CONFIG_SPI_AT25 is not set
--# CONFIG_SPI_SPIDEV is not set
--# CONFIG_SPI_TLE62X0 is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--# CONFIG_SENSORS_LM70 is not set
--# CONFIG_SENSORS_LM75 is not set
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_83xx_WDT=y
--
--#
--# PCI-based Watchdog Cards
--#
--# CONFIG_PCIPCWATCHDOG is not set
--# CONFIG_WDTPCI is not set
--
--#
--# USB-based Watchdog Cards
--#
--# CONFIG_USBPCWATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--# CONFIG_USB_DABUSB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--
--#
--# USB Input Devices
--#
--# CONFIG_USB_HID is not set
--
--#
--# USB HID Boot Protocol drivers
--#
--# CONFIG_USB_KBD is not set
--# CONFIG_USB_MOUSE is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--CONFIG_USB=y
--# CONFIG_USB_DEBUG is not set
--# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
--
--#
--# Miscellaneous USB options
--#
--CONFIG_USB_DEVICEFS=y
--CONFIG_USB_DEVICE_CLASS=y
--# CONFIG_USB_DYNAMIC_MINORS is not set
--# CONFIG_USB_OTG is not set
--
--#
--# USB Host Controller Drivers
--#
--CONFIG_USB_EHCI_HCD=y
--CONFIG_USB_EHCI_ROOT_HUB_TT=y
--# CONFIG_USB_EHCI_TT_NEWSCHED is not set
--CONFIG_USB_EHCI_FSL=y
--CONFIG_USB_EHCI_HCD_PPC_OF=y
--# CONFIG_USB_ISP116X_HCD is not set
--CONFIG_USB_OHCI_HCD=y
--CONFIG_USB_OHCI_HCD_PPC_OF=y
--CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
--# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
--CONFIG_USB_OHCI_HCD_PCI=y
--CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
--CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
--CONFIG_USB_OHCI_LITTLE_ENDIAN=y
--CONFIG_USB_UHCI_HCD=y
--# CONFIG_USB_SL811_HCD is not set
--# CONFIG_USB_R8A66597_HCD is not set
--
--#
--# USB Device Class drivers
--#
--# CONFIG_USB_ACM is not set
--# CONFIG_USB_PRINTER is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--
--#
--# may also be needed; see USB_STORAGE Help for more information
--#
--CONFIG_USB_STORAGE=y
--# CONFIG_USB_STORAGE_DEBUG is not set
--# CONFIG_USB_STORAGE_DATAFAB is not set
--# CONFIG_USB_STORAGE_FREECOM is not set
--# CONFIG_USB_STORAGE_ISD200 is not set
--# CONFIG_USB_STORAGE_DPCM is not set
--# CONFIG_USB_STORAGE_USBAT is not set
--# CONFIG_USB_STORAGE_SDDR09 is not set
--# CONFIG_USB_STORAGE_SDDR55 is not set
--# CONFIG_USB_STORAGE_JUMPSHOT is not set
--# CONFIG_USB_STORAGE_ALAUDA is not set
--# CONFIG_USB_STORAGE_KARMA is not set
--# CONFIG_USB_LIBUSUAL is not set
--
--#
--# USB Imaging devices
--#
--# CONFIG_USB_MDC800 is not set
--# CONFIG_USB_MICROTEK is not set
--CONFIG_USB_MON=y
--
--#
--# USB port drivers
--#
--# CONFIG_USB_SERIAL is not set
--
--#
--# USB Miscellaneous drivers
--#
--# CONFIG_USB_EMI62 is not set
--# CONFIG_USB_EMI26 is not set
--# CONFIG_USB_ADUTUX is not set
--# CONFIG_USB_AUERSWALD is not set
--# CONFIG_USB_RIO500 is not set
--# CONFIG_USB_LEGOTOWER is not set
--# CONFIG_USB_LCD is not set
--# CONFIG_USB_BERRY_CHARGE is not set
--# CONFIG_USB_LED is not set
--# CONFIG_USB_CYPRESS_CY7C63 is not set
--# CONFIG_USB_CYTHERM is not set
--# CONFIG_USB_PHIDGET is not set
--# CONFIG_USB_IDMOUSE is not set
--# CONFIG_USB_FTDI_ELAN is not set
--# CONFIG_USB_APPLEDISPLAY is not set
--# CONFIG_USB_SISUSBVGA is not set
--# CONFIG_USB_LD is not set
--# CONFIG_USB_TRANCEVIBRATOR is not set
--# CONFIG_USB_IOWARRIOR is not set
--# CONFIG_USB_TEST is not set
--CONFIG_USB_GADGET=y
--# CONFIG_USB_GADGET_DEBUG is not set
--# CONFIG_USB_GADGET_DEBUG_FILES is not set
--CONFIG_USB_GADGET_SELECTED=y
--# CONFIG_USB_GADGET_AMD5536UDC is not set
--# CONFIG_USB_GADGET_ATMEL_USBA is not set
--# CONFIG_USB_GADGET_FSL_USB2 is not set
--CONFIG_USB_GADGET_NET2280=y
--CONFIG_USB_NET2280=y
--# CONFIG_USB_GADGET_PXA2XX is not set
--# CONFIG_USB_GADGET_M66592 is not set
--# CONFIG_USB_GADGET_GOKU is not set
--# CONFIG_USB_GADGET_LH7A40X is not set
--# CONFIG_USB_GADGET_OMAP is not set
--# CONFIG_USB_GADGET_S3C2410 is not set
--# CONFIG_USB_GADGET_AT91 is not set
--# CONFIG_USB_GADGET_DUMMY_HCD is not set
--CONFIG_USB_GADGET_DUALSPEED=y
--# CONFIG_USB_ZERO is not set
--CONFIG_USB_ETH=y
--CONFIG_USB_ETH_RNDIS=y
--# CONFIG_USB_GADGETFS is not set
--# CONFIG_USB_FILE_STORAGE is not set
--# CONFIG_USB_G_SERIAL is not set
--# CONFIG_USB_MIDI_GADGET is not set
--# CONFIG_USB_G_PRINTER is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--CONFIG_RTC_LIB=y
--CONFIG_RTC_CLASS=y
--CONFIG_RTC_HCTOSYS=y
--CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
--# CONFIG_RTC_DEBUG is not set
--
--#
--# RTC interfaces
--#
--CONFIG_RTC_INTF_SYSFS=y
--CONFIG_RTC_INTF_PROC=y
--CONFIG_RTC_INTF_DEV=y
--CONFIG_RTC_INTF_DEV_UIE_EMUL=y
--# CONFIG_RTC_DRV_TEST is not set
--
--#
--# I2C RTC drivers
--#
--CONFIG_RTC_DRV_DS1307=y
--# CONFIG_RTC_DRV_DS1374 is not set
--# CONFIG_RTC_DRV_DS1672 is not set
--# CONFIG_RTC_DRV_MAX6900 is not set
--# CONFIG_RTC_DRV_RS5C372 is not set
--# CONFIG_RTC_DRV_ISL1208 is not set
--# CONFIG_RTC_DRV_X1205 is not set
--# CONFIG_RTC_DRV_PCF8563 is not set
--# CONFIG_RTC_DRV_PCF8583 is not set
--# CONFIG_RTC_DRV_M41T80 is not set
--# CONFIG_RTC_DRV_S35390A is not set
--
--#
--# SPI RTC drivers
--#
--# CONFIG_RTC_DRV_MAX6902 is not set
--# CONFIG_RTC_DRV_R9701 is not set
--# CONFIG_RTC_DRV_RS5C348 is not set
--
--#
--# Platform RTC drivers
--#
--# CONFIG_RTC_DRV_CMOS is not set
--# CONFIG_RTC_DRV_DS1511 is not set
--# CONFIG_RTC_DRV_DS1553 is not set
--# CONFIG_RTC_DRV_DS1742 is not set
--# CONFIG_RTC_DRV_STK17TA8 is not set
--# CONFIG_RTC_DRV_M48T86 is not set
--# CONFIG_RTC_DRV_M48T59 is not set
--# CONFIG_RTC_DRV_V3020 is not set
--
--#
--# on-CPU RTC drivers
--#
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_JFFS2_FS=y
--CONFIG_JFFS2_FS_DEBUG=0
--CONFIG_JFFS2_FS_WRITEBUFFER=y
--# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
--# CONFIG_JFFS2_SUMMARY is not set
--# CONFIG_JFFS2_FS_XATTR is not set
--# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
--CONFIG_JFFS2_ZLIB=y
--# CONFIG_JFFS2_LZO is not set
--CONFIG_JFFS2_RTIME=y
--# CONFIG_JFFS2_RUBIN is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_BSD_DISKLABEL is not set
--# CONFIG_MINIX_SUBPARTITION is not set
--# CONFIG_SOLARIS_X86_PARTITION is not set
--# CONFIG_UNIXWARE_DISKLABEL is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_ZLIB_DEFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/mpc832x_mds_defconfig
-+++ /dev/null
-@@ -1,1081 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc7
--# Mon Mar 31 11:36:51 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_FSL_EMB_PERFMON is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MULTIPLATFORM is not set
--# CONFIG_PPC_82xx is not set
--CONFIG_PPC_83xx=y
--# CONFIG_PPC_86xx is not set
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC83xx=y
--# CONFIG_MPC831x_RDB is not set
--CONFIG_MPC832x_MDS=y
--# CONFIG_MPC832x_RDB is not set
--# CONFIG_MPC834x_MDS is not set
--# CONFIG_MPC834x_ITX is not set
--# CONFIG_MPC836x_MDS is not set
--# CONFIG_MPC837x_MDS is not set
--# CONFIG_MPC837x_RDB is not set
--# CONFIG_SBC834x is not set
--CONFIG_PPC_MPC832x=y
--CONFIG_IPIC=y
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--CONFIG_QUICC_ENGINE=y
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--# CONFIG_BLK_DEV_SD is not set
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--# CONFIG_CHR_DEV_SG is not set
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--# CONFIG_SCSI_SPI_ATTRS is not set
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_MVSAS is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--CONFIG_DAVICOM_PHY=y
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_GIANFAR is not set
--CONFIG_UCC_GETH=y
--# CONFIG_UGETH_NAPI is not set
--# CONFIG_UGETH_MAGIC_PACKET is not set
--# CONFIG_UGETH_FILTERING is not set
--# CONFIG_UGETH_TX_ON_DEMAND is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--# CONFIG_SERIAL_QE is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--# CONFIG_SENSORS_LM75 is not set
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_83xx_WDT=y
--
--#
--# PCI-based Watchdog Cards
--#
--# CONFIG_PCIPCWATCHDOG is not set
--# CONFIG_WDTPCI is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--CONFIG_RTC_LIB=y
--CONFIG_RTC_CLASS=y
--CONFIG_RTC_HCTOSYS=y
--CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
--# CONFIG_RTC_DEBUG is not set
--
--#
--# RTC interfaces
--#
--CONFIG_RTC_INTF_SYSFS=y
--CONFIG_RTC_INTF_PROC=y
--CONFIG_RTC_INTF_DEV=y
--# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
--# CONFIG_RTC_DRV_TEST is not set
--
--#
--# I2C RTC drivers
--#
--# CONFIG_RTC_DRV_DS1307 is not set
--CONFIG_RTC_DRV_DS1374=y
--# CONFIG_RTC_DRV_DS1672 is not set
--# CONFIG_RTC_DRV_MAX6900 is not set
--# CONFIG_RTC_DRV_RS5C372 is not set
--# CONFIG_RTC_DRV_ISL1208 is not set
--# CONFIG_RTC_DRV_X1205 is not set
--# CONFIG_RTC_DRV_PCF8563 is not set
--# CONFIG_RTC_DRV_PCF8583 is not set
--# CONFIG_RTC_DRV_M41T80 is not set
--# CONFIG_RTC_DRV_S35390A is not set
--
--#
--# SPI RTC drivers
--#
--
--#
--# Platform RTC drivers
--#
--# CONFIG_RTC_DRV_CMOS is not set
--# CONFIG_RTC_DRV_DS1511 is not set
--# CONFIG_RTC_DRV_DS1553 is not set
--# CONFIG_RTC_DRV_DS1742 is not set
--# CONFIG_RTC_DRV_STK17TA8 is not set
--# CONFIG_RTC_DRV_M48T86 is not set
--# CONFIG_RTC_DRV_M48T59 is not set
--# CONFIG_RTC_DRV_V3020 is not set
--
--#
--# on-CPU RTC drivers
--#
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--# CONFIG_MSDOS_PARTITION is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--CONFIG_UCC_FAST=y
--CONFIG_UCC=y
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
--CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/mpc832x_rdb_defconfig
-+++ /dev/null
-@@ -1,1233 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:16 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_FSL_EMB_PERFMON is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MULTIPLATFORM is not set
--# CONFIG_PPC_82xx is not set
--CONFIG_PPC_83xx=y
--# CONFIG_PPC_86xx is not set
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC83xx=y
--# CONFIG_MPC831x_RDB is not set
--# CONFIG_MPC832x_MDS is not set
--CONFIG_MPC832x_RDB=y
--# CONFIG_MPC834x_MDS is not set
--# CONFIG_MPC834x_ITX is not set
--# CONFIG_MPC836x_MDS is not set
--# CONFIG_MPC837x_MDS is not set
--# CONFIG_MPC837x_RDB is not set
--# CONFIG_SBC834x is not set
--CONFIG_PPC_MPC832x=y
--CONFIG_IPIC=y
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--CONFIG_QUICC_ENGINE=y
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--# CONFIG_BLK_DEV_UB is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--CONFIG_BLK_DEV_SD=y
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--# CONFIG_CHR_DEV_SG is not set
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--# CONFIG_SCSI_SPI_ATTRS is not set
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_MVSAS is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--CONFIG_ICPLUS_PHY=y
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_ENC28J60 is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--CONFIG_E1000=y
--# CONFIG_E1000_NAPI is not set
--# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_GIANFAR is not set
--CONFIG_UCC_GETH=y
--CONFIG_UGETH_NAPI=y
--# CONFIG_UGETH_MAGIC_PACKET is not set
--# CONFIG_UGETH_FILTERING is not set
--# CONFIG_UGETH_TX_ON_DEMAND is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--
--#
--# USB Network Adapters
--#
--# CONFIG_USB_CATC is not set
--# CONFIG_USB_KAWETH is not set
--# CONFIG_USB_PEGASUS is not set
--# CONFIG_USB_RTL8150 is not set
--# CONFIG_USB_USBNET is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--# CONFIG_SERIAL_QE is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_TINY_USB is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--CONFIG_SPI=y
--CONFIG_SPI_MASTER=y
--
--#
--# SPI Master Controller Drivers
--#
--CONFIG_SPI_BITBANG=y
--CONFIG_SPI_MPC83xx=y
--
--#
--# SPI Protocol Masters
--#
--# CONFIG_SPI_AT25 is not set
--# CONFIG_SPI_SPIDEV is not set
--# CONFIG_SPI_TLE62X0 is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--# CONFIG_SENSORS_LM70 is not set
--# CONFIG_SENSORS_LM75 is not set
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_83xx_WDT=y
--
--#
--# PCI-based Watchdog Cards
--#
--# CONFIG_PCIPCWATCHDOG is not set
--# CONFIG_WDTPCI is not set
--
--#
--# USB-based Watchdog Cards
--#
--# CONFIG_USBPCWATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--# CONFIG_USB_DABUSB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--
--#
--# USB Input Devices
--#
--# CONFIG_USB_HID is not set
--
--#
--# USB HID Boot Protocol drivers
--#
--# CONFIG_USB_KBD is not set
--# CONFIG_USB_MOUSE is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--CONFIG_USB=y
--# CONFIG_USB_DEBUG is not set
--# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
--
--#
--# Miscellaneous USB options
--#
--CONFIG_USB_DEVICEFS=y
--CONFIG_USB_DEVICE_CLASS=y
--# CONFIG_USB_DYNAMIC_MINORS is not set
--# CONFIG_USB_OTG is not set
--
--#
--# USB Host Controller Drivers
--#
--CONFIG_USB_EHCI_HCD=y
--# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
--# CONFIG_USB_EHCI_TT_NEWSCHED is not set
--# CONFIG_USB_EHCI_FSL is not set
--CONFIG_USB_EHCI_HCD_PPC_OF=y
--# CONFIG_USB_ISP116X_HCD is not set
--CONFIG_USB_OHCI_HCD=y
--CONFIG_USB_OHCI_HCD_PPC_OF=y
--CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
--# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
--CONFIG_USB_OHCI_HCD_PCI=y
--CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
--CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
--CONFIG_USB_OHCI_LITTLE_ENDIAN=y
--# CONFIG_USB_UHCI_HCD is not set
--# CONFIG_USB_SL811_HCD is not set
--# CONFIG_USB_R8A66597_HCD is not set
--
--#
--# USB Device Class drivers
--#
--# CONFIG_USB_ACM is not set
--# CONFIG_USB_PRINTER is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--
--#
--# may also be needed; see USB_STORAGE Help for more information
--#
--CONFIG_USB_STORAGE=y
--# CONFIG_USB_STORAGE_DEBUG is not set
--# CONFIG_USB_STORAGE_DATAFAB is not set
--# CONFIG_USB_STORAGE_FREECOM is not set
--# CONFIG_USB_STORAGE_ISD200 is not set
--# CONFIG_USB_STORAGE_DPCM is not set
--# CONFIG_USB_STORAGE_USBAT is not set
--# CONFIG_USB_STORAGE_SDDR09 is not set
--# CONFIG_USB_STORAGE_SDDR55 is not set
--# CONFIG_USB_STORAGE_JUMPSHOT is not set
--# CONFIG_USB_STORAGE_ALAUDA is not set
--# CONFIG_USB_STORAGE_KARMA is not set
--# CONFIG_USB_LIBUSUAL is not set
--
--#
--# USB Imaging devices
--#
--# CONFIG_USB_MDC800 is not set
--# CONFIG_USB_MICROTEK is not set
--CONFIG_USB_MON=y
--
--#
--# USB port drivers
--#
--# CONFIG_USB_SERIAL is not set
--
--#
--# USB Miscellaneous drivers
--#
--# CONFIG_USB_EMI62 is not set
--# CONFIG_USB_EMI26 is not set
--# CONFIG_USB_ADUTUX is not set
--# CONFIG_USB_AUERSWALD is not set
--# CONFIG_USB_RIO500 is not set
--# CONFIG_USB_LEGOTOWER is not set
--# CONFIG_USB_LCD is not set
--# CONFIG_USB_BERRY_CHARGE is not set
--# CONFIG_USB_LED is not set
--# CONFIG_USB_CYPRESS_CY7C63 is not set
--# CONFIG_USB_CYTHERM is not set
--# CONFIG_USB_PHIDGET is not set
--# CONFIG_USB_IDMOUSE is not set
--# CONFIG_USB_FTDI_ELAN is not set
--# CONFIG_USB_APPLEDISPLAY is not set
--# CONFIG_USB_SISUSBVGA is not set
--# CONFIG_USB_LD is not set
--# CONFIG_USB_TRANCEVIBRATOR is not set
--# CONFIG_USB_IOWARRIOR is not set
--# CONFIG_USB_TEST is not set
--# CONFIG_USB_GADGET is not set
--CONFIG_MMC=y
--# CONFIG_MMC_DEBUG is not set
--# CONFIG_MMC_UNSAFE_RESUME is not set
--
--#
--# MMC/SD Card Drivers
--#
--CONFIG_MMC_BLOCK=y
--CONFIG_MMC_BLOCK_BOUNCE=y
--# CONFIG_SDIO_UART is not set
--
--#
--# MMC/SD Host Controller Drivers
--#
--# CONFIG_MMC_SDHCI is not set
--# CONFIG_MMC_WBSD is not set
--# CONFIG_MMC_TIFM_SD is not set
--CONFIG_MMC_SPI=y
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--CONFIG_FAT_FS=y
--CONFIG_MSDOS_FS=y
--CONFIG_VFAT_FS=y
--CONFIG_FAT_DEFAULT_CODEPAGE=437
--CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_BSD_DISKLABEL is not set
--# CONFIG_MINIX_SUBPARTITION is not set
--# CONFIG_SOLARIS_X86_PARTITION is not set
--# CONFIG_UNIXWARE_DISKLABEL is not set
--CONFIG_LDM_PARTITION=y
--# CONFIG_LDM_DEBUG is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--CONFIG_NLS=y
--CONFIG_NLS_DEFAULT="iso8859-1"
--CONFIG_NLS_CODEPAGE_437=y
--# CONFIG_NLS_CODEPAGE_737 is not set
--# CONFIG_NLS_CODEPAGE_775 is not set
--# CONFIG_NLS_CODEPAGE_850 is not set
--# CONFIG_NLS_CODEPAGE_852 is not set
--# CONFIG_NLS_CODEPAGE_855 is not set
--# CONFIG_NLS_CODEPAGE_857 is not set
--# CONFIG_NLS_CODEPAGE_860 is not set
--# CONFIG_NLS_CODEPAGE_861 is not set
--# CONFIG_NLS_CODEPAGE_862 is not set
--# CONFIG_NLS_CODEPAGE_863 is not set
--# CONFIG_NLS_CODEPAGE_864 is not set
--# CONFIG_NLS_CODEPAGE_865 is not set
--# CONFIG_NLS_CODEPAGE_866 is not set
--# CONFIG_NLS_CODEPAGE_869 is not set
--# CONFIG_NLS_CODEPAGE_936 is not set
--# CONFIG_NLS_CODEPAGE_950 is not set
--CONFIG_NLS_CODEPAGE_932=y
--# CONFIG_NLS_CODEPAGE_949 is not set
--# CONFIG_NLS_CODEPAGE_874 is not set
--CONFIG_NLS_ISO8859_8=y
--# CONFIG_NLS_CODEPAGE_1250 is not set
--# CONFIG_NLS_CODEPAGE_1251 is not set
--# CONFIG_NLS_ASCII is not set
--CONFIG_NLS_ISO8859_1=y
--# CONFIG_NLS_ISO8859_2 is not set
--# CONFIG_NLS_ISO8859_3 is not set
--# CONFIG_NLS_ISO8859_4 is not set
--# CONFIG_NLS_ISO8859_5 is not set
--# CONFIG_NLS_ISO8859_6 is not set
--# CONFIG_NLS_ISO8859_7 is not set
--# CONFIG_NLS_ISO8859_9 is not set
--# CONFIG_NLS_ISO8859_13 is not set
--# CONFIG_NLS_ISO8859_14 is not set
--# CONFIG_NLS_ISO8859_15 is not set
--# CONFIG_NLS_KOI8_R is not set
--# CONFIG_NLS_KOI8_U is not set
--# CONFIG_NLS_UTF8 is not set
--# CONFIG_DLM is not set
--CONFIG_UCC_FAST=y
--CONFIG_UCC=y
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--CONFIG_CRC_ITU_T=y
--CONFIG_CRC32=y
--CONFIG_CRC7=y
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
--CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/mpc834x_itx_defconfig
-+++ /dev/null
-@@ -1,1295 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:17 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_FSL_EMB_PERFMON is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MULTIPLATFORM is not set
--# CONFIG_PPC_82xx is not set
--CONFIG_PPC_83xx=y
--# CONFIG_PPC_86xx is not set
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC83xx=y
--# CONFIG_MPC831x_RDB is not set
--# CONFIG_MPC832x_MDS is not set
--# CONFIG_MPC832x_RDB is not set
--# CONFIG_MPC834x_MDS is not set
--CONFIG_MPC834x_ITX=y
--# CONFIG_MPC836x_MDS is not set
--# CONFIG_MPC837x_MDS is not set
--# CONFIG_MPC837x_RDB is not set
--# CONFIG_SBC834x is not set
--CONFIG_PPC_MPC834x=y
--CONFIG_IPIC=y
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--# CONFIG_MTD_PARTITIONS is not set
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--# CONFIG_MTD_BLKDEVS is not set
--# CONFIG_MTD_BLOCK is not set
--# CONFIG_MTD_BLOCK_RO is not set
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--# CONFIG_MTD_JEDECPROBE is not set
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--CONFIG_MTD_PHYSMAP=y
--CONFIG_MTD_PHYSMAP_START=0xfe000000
--CONFIG_MTD_PHYSMAP_LEN=0x1000000
--CONFIG_MTD_PHYSMAP_BANKWIDTH=2
--# CONFIG_MTD_PHYSMAP_OF is not set
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_DATAFLASH is not set
--# CONFIG_MTD_M25P80 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--# CONFIG_BLK_DEV_UB is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--CONFIG_IDE=y
--CONFIG_IDE_MAX_HWIFS=4
--# CONFIG_BLK_DEV_IDE is not set
--# CONFIG_BLK_DEV_HD_ONLY is not set
--# CONFIG_BLK_DEV_HD is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--CONFIG_BLK_DEV_SD=y
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--CONFIG_CHR_DEV_SG=y
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--CONFIG_SCSI_SPI_ATTRS=y
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_MVSAS is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_IPR is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--CONFIG_ATA=y
--# CONFIG_ATA_NONSTANDARD is not set
--# CONFIG_SATA_AHCI is not set
--# CONFIG_SATA_SVW is not set
--# CONFIG_ATA_PIIX is not set
--# CONFIG_SATA_MV is not set
--# CONFIG_SATA_NV is not set
--# CONFIG_PDC_ADMA is not set
--# CONFIG_SATA_QSTOR is not set
--# CONFIG_SATA_PROMISE is not set
--# CONFIG_SATA_SX4 is not set
--CONFIG_SATA_SIL=y
--# CONFIG_SATA_SIL24 is not set
--# CONFIG_SATA_SIS is not set
--# CONFIG_SATA_ULI is not set
--# CONFIG_SATA_VIA is not set
--# CONFIG_SATA_VITESSE is not set
--# CONFIG_SATA_INIC162X is not set
--# CONFIG_SATA_FSL is not set
--# CONFIG_PATA_ALI is not set
--# CONFIG_PATA_AMD is not set
--# CONFIG_PATA_ARTOP is not set
--# CONFIG_PATA_ATIIXP is not set
--# CONFIG_PATA_CMD640_PCI is not set
--# CONFIG_PATA_CMD64X is not set
--# CONFIG_PATA_CS5520 is not set
--# CONFIG_PATA_CS5530 is not set
--# CONFIG_PATA_CYPRESS is not set
--# CONFIG_PATA_EFAR is not set
--# CONFIG_ATA_GENERIC is not set
--# CONFIG_PATA_HPT366 is not set
--# CONFIG_PATA_HPT37X is not set
--# CONFIG_PATA_HPT3X2N is not set
--# CONFIG_PATA_HPT3X3 is not set
--# CONFIG_PATA_IT821X is not set
--# CONFIG_PATA_IT8213 is not set
--# CONFIG_PATA_JMICRON is not set
--# CONFIG_PATA_TRIFLEX is not set
--# CONFIG_PATA_MARVELL is not set
--# CONFIG_PATA_MPIIX is not set
--# CONFIG_PATA_OLDPIIX is not set
--# CONFIG_PATA_NETCELL is not set
--# CONFIG_PATA_NINJA32 is not set
--# CONFIG_PATA_NS87410 is not set
--# CONFIG_PATA_NS87415 is not set
--# CONFIG_PATA_OPTI is not set
--# CONFIG_PATA_OPTIDMA is not set
--# CONFIG_PATA_PDC_OLD is not set
--# CONFIG_PATA_RADISYS is not set
--# CONFIG_PATA_RZ1000 is not set
--# CONFIG_PATA_SC1200 is not set
--# CONFIG_PATA_SERVERWORKS is not set
--# CONFIG_PATA_PDC2027X is not set
--# CONFIG_PATA_SIL680 is not set
--# CONFIG_PATA_SIS is not set
--# CONFIG_PATA_VIA is not set
--# CONFIG_PATA_WINBOND is not set
--CONFIG_PATA_PLATFORM=y
--CONFIG_PATA_OF_PLATFORM=y
--CONFIG_MD=y
--CONFIG_BLK_DEV_MD=y
--CONFIG_MD_LINEAR=y
--CONFIG_MD_RAID0=y
--CONFIG_MD_RAID1=y
--# CONFIG_MD_RAID10 is not set
--# CONFIG_MD_RAID456 is not set
--# CONFIG_MD_MULTIPATH is not set
--# CONFIG_MD_FAULTY is not set
--# CONFIG_BLK_DEV_DM is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--CONFIG_CICADA_PHY=y
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--# CONFIG_NET_ETHERNET is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--
--#
--# USB Network Adapters
--#
--# CONFIG_USB_CATC is not set
--# CONFIG_USB_KAWETH is not set
--# CONFIG_USB_PEGASUS is not set
--# CONFIG_USB_RTL8150 is not set
--# CONFIG_USB_USBNET is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--# CONFIG_SERIAL_8250_PCI is not set
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_TINY_USB is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--CONFIG_SENSORS_PCF8574=y
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--CONFIG_SPI=y
--CONFIG_SPI_MASTER=y
--
--#
--# SPI Master Controller Drivers
--#
--CONFIG_SPI_BITBANG=y
--CONFIG_SPI_MPC83xx=y
--
--#
--# SPI Protocol Masters
--#
--# CONFIG_SPI_AT25 is not set
--# CONFIG_SPI_SPIDEV is not set
--# CONFIG_SPI_TLE62X0 is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--# CONFIG_THERMAL is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_83xx_WDT=y
--
--#
--# PCI-based Watchdog Cards
--#
--# CONFIG_PCIPCWATCHDOG is not set
--# CONFIG_WDTPCI is not set
--
--#
--# USB-based Watchdog Cards
--#
--# CONFIG_USBPCWATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--# CONFIG_USB_DABUSB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--CONFIG_USB=y
--# CONFIG_USB_DEBUG is not set
--# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
--
--#
--# Miscellaneous USB options
--#
--CONFIG_USB_DEVICEFS=y
--CONFIG_USB_DEVICE_CLASS=y
--# CONFIG_USB_DYNAMIC_MINORS is not set
--# CONFIG_USB_OTG is not set
--
--#
--# USB Host Controller Drivers
--#
--CONFIG_USB_EHCI_HCD=y
--CONFIG_USB_EHCI_ROOT_HUB_TT=y
--# CONFIG_USB_EHCI_TT_NEWSCHED is not set
--CONFIG_USB_EHCI_FSL=y
--CONFIG_USB_EHCI_HCD_PPC_OF=y
--# CONFIG_USB_ISP116X_HCD is not set
--# CONFIG_USB_OHCI_HCD is not set
--CONFIG_USB_UHCI_HCD=y
--# CONFIG_USB_SL811_HCD is not set
--# CONFIG_USB_R8A66597_HCD is not set
--
--#
--# USB Device Class drivers
--#
--# CONFIG_USB_ACM is not set
--# CONFIG_USB_PRINTER is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--
--#
--# may also be needed; see USB_STORAGE Help for more information
--#
--CONFIG_USB_STORAGE=y
--# CONFIG_USB_STORAGE_DEBUG is not set
--# CONFIG_USB_STORAGE_DATAFAB is not set
--# CONFIG_USB_STORAGE_FREECOM is not set
--# CONFIG_USB_STORAGE_ISD200 is not set
--# CONFIG_USB_STORAGE_DPCM is not set
--# CONFIG_USB_STORAGE_USBAT is not set
--# CONFIG_USB_STORAGE_SDDR09 is not set
--# CONFIG_USB_STORAGE_SDDR55 is not set
--# CONFIG_USB_STORAGE_JUMPSHOT is not set
--# CONFIG_USB_STORAGE_ALAUDA is not set
--# CONFIG_USB_STORAGE_KARMA is not set
--# CONFIG_USB_LIBUSUAL is not set
--
--#
--# USB Imaging devices
--#
--# CONFIG_USB_MDC800 is not set
--# CONFIG_USB_MICROTEK is not set
--CONFIG_USB_MON=y
--
--#
--# USB port drivers
--#
--# CONFIG_USB_SERIAL is not set
--
--#
--# USB Miscellaneous drivers
--#
--# CONFIG_USB_EMI62 is not set
--# CONFIG_USB_EMI26 is not set
--# CONFIG_USB_ADUTUX is not set
--# CONFIG_USB_AUERSWALD is not set
--# CONFIG_USB_RIO500 is not set
--# CONFIG_USB_LEGOTOWER is not set
--# CONFIG_USB_LCD is not set
--# CONFIG_USB_BERRY_CHARGE is not set
--# CONFIG_USB_LED is not set
--# CONFIG_USB_CYPRESS_CY7C63 is not set
--# CONFIG_USB_CYTHERM is not set
--# CONFIG_USB_PHIDGET is not set
--# CONFIG_USB_IDMOUSE is not set
--# CONFIG_USB_FTDI_ELAN is not set
--# CONFIG_USB_APPLEDISPLAY is not set
--# CONFIG_USB_SISUSBVGA is not set
--# CONFIG_USB_LD is not set
--# CONFIG_USB_TRANCEVIBRATOR is not set
--# CONFIG_USB_IOWARRIOR is not set
--# CONFIG_USB_TEST is not set
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--CONFIG_RTC_LIB=y
--CONFIG_RTC_CLASS=y
--CONFIG_RTC_HCTOSYS=y
--CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
--# CONFIG_RTC_DEBUG is not set
--
--#
--# RTC interfaces
--#
--CONFIG_RTC_INTF_SYSFS=y
--CONFIG_RTC_INTF_PROC=y
--CONFIG_RTC_INTF_DEV=y
--CONFIG_RTC_INTF_DEV_UIE_EMUL=y
--# CONFIG_RTC_DRV_TEST is not set
--
--#
--# I2C RTC drivers
--#
--CONFIG_RTC_DRV_DS1307=y
--# CONFIG_RTC_DRV_DS1374 is not set
--# CONFIG_RTC_DRV_DS1672 is not set
--# CONFIG_RTC_DRV_MAX6900 is not set
--# CONFIG_RTC_DRV_RS5C372 is not set
--# CONFIG_RTC_DRV_ISL1208 is not set
--# CONFIG_RTC_DRV_X1205 is not set
--# CONFIG_RTC_DRV_PCF8563 is not set
--# CONFIG_RTC_DRV_PCF8583 is not set
--# CONFIG_RTC_DRV_M41T80 is not set
--# CONFIG_RTC_DRV_S35390A is not set
--
--#
--# SPI RTC drivers
--#
--# CONFIG_RTC_DRV_MAX6902 is not set
--# CONFIG_RTC_DRV_R9701 is not set
--# CONFIG_RTC_DRV_RS5C348 is not set
--
--#
--# Platform RTC drivers
--#
--# CONFIG_RTC_DRV_CMOS is not set
--# CONFIG_RTC_DRV_DS1511 is not set
--# CONFIG_RTC_DRV_DS1553 is not set
--# CONFIG_RTC_DRV_DS1742 is not set
--# CONFIG_RTC_DRV_STK17TA8 is not set
--# CONFIG_RTC_DRV_M48T86 is not set
--# CONFIG_RTC_DRV_M48T59 is not set
--# CONFIG_RTC_DRV_V3020 is not set
--
--#
--# on-CPU RTC drivers
--#
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--CONFIG_FAT_FS=y
--CONFIG_MSDOS_FS=y
--CONFIG_VFAT_FS=y
--CONFIG_FAT_DEFAULT_CODEPAGE=437
--CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_JFFS2_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--CONFIG_MAC_PARTITION=y
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_BSD_DISKLABEL is not set
--# CONFIG_MINIX_SUBPARTITION is not set
--# CONFIG_SOLARIS_X86_PARTITION is not set
--# CONFIG_UNIXWARE_DISKLABEL is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--CONFIG_NLS=y
--CONFIG_NLS_DEFAULT="iso8859-1"
--# CONFIG_NLS_CODEPAGE_437 is not set
--# CONFIG_NLS_CODEPAGE_737 is not set
--# CONFIG_NLS_CODEPAGE_775 is not set
--# CONFIG_NLS_CODEPAGE_850 is not set
--# CONFIG_NLS_CODEPAGE_852 is not set
--# CONFIG_NLS_CODEPAGE_855 is not set
--# CONFIG_NLS_CODEPAGE_857 is not set
--# CONFIG_NLS_CODEPAGE_860 is not set
--# CONFIG_NLS_CODEPAGE_861 is not set
--# CONFIG_NLS_CODEPAGE_862 is not set
--# CONFIG_NLS_CODEPAGE_863 is not set
--# CONFIG_NLS_CODEPAGE_864 is not set
--# CONFIG_NLS_CODEPAGE_865 is not set
--# CONFIG_NLS_CODEPAGE_866 is not set
--# CONFIG_NLS_CODEPAGE_869 is not set
--# CONFIG_NLS_CODEPAGE_936 is not set
--# CONFIG_NLS_CODEPAGE_950 is not set
--# CONFIG_NLS_CODEPAGE_932 is not set
--# CONFIG_NLS_CODEPAGE_949 is not set
--# CONFIG_NLS_CODEPAGE_874 is not set
--# CONFIG_NLS_ISO8859_8 is not set
--# CONFIG_NLS_CODEPAGE_1250 is not set
--# CONFIG_NLS_CODEPAGE_1251 is not set
--# CONFIG_NLS_ASCII is not set
--# CONFIG_NLS_ISO8859_1 is not set
--# CONFIG_NLS_ISO8859_2 is not set
--# CONFIG_NLS_ISO8859_3 is not set
--# CONFIG_NLS_ISO8859_4 is not set
--# CONFIG_NLS_ISO8859_5 is not set
--# CONFIG_NLS_ISO8859_6 is not set
--# CONFIG_NLS_ISO8859_7 is not set
--# CONFIG_NLS_ISO8859_9 is not set
--# CONFIG_NLS_ISO8859_13 is not set
--# CONFIG_NLS_ISO8859_14 is not set
--# CONFIG_NLS_ISO8859_15 is not set
--# CONFIG_NLS_KOI8_R is not set
--# CONFIG_NLS_KOI8_U is not set
--# CONFIG_NLS_UTF8 is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/mpc834x_itxgp_defconfig
-+++ /dev/null
-@@ -1,1222 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:18 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_FSL_EMB_PERFMON is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MULTIPLATFORM is not set
--# CONFIG_PPC_82xx is not set
--CONFIG_PPC_83xx=y
--# CONFIG_PPC_86xx is not set
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC83xx=y
--# CONFIG_MPC831x_RDB is not set
--# CONFIG_MPC832x_MDS is not set
--# CONFIG_MPC832x_RDB is not set
--# CONFIG_MPC834x_MDS is not set
--CONFIG_MPC834x_ITX=y
--# CONFIG_MPC836x_MDS is not set
--# CONFIG_MPC837x_MDS is not set
--# CONFIG_MPC837x_RDB is not set
--# CONFIG_SBC834x is not set
--CONFIG_PPC_MPC834x=y
--CONFIG_IPIC=y
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--# CONFIG_MTD_PARTITIONS is not set
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--# CONFIG_MTD_BLKDEVS is not set
--# CONFIG_MTD_BLOCK is not set
--# CONFIG_MTD_BLOCK_RO is not set
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--# CONFIG_MTD_JEDECPROBE is not set
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--CONFIG_MTD_PHYSMAP=y
--CONFIG_MTD_PHYSMAP_START=0xfe000000
--CONFIG_MTD_PHYSMAP_LEN=0x800000
--CONFIG_MTD_PHYSMAP_BANKWIDTH=2
--# CONFIG_MTD_PHYSMAP_OF is not set
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_DATAFLASH is not set
--# CONFIG_MTD_M25P80 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--# CONFIG_BLK_DEV_UB is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--CONFIG_BLK_DEV_SD=y
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--CONFIG_CHR_DEV_SG=y
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--CONFIG_SCSI_SPI_ATTRS=y
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_MVSAS is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--CONFIG_CICADA_PHY=y
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--# CONFIG_NET_ETHERNET is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--
--#
--# USB Network Adapters
--#
--# CONFIG_USB_CATC is not set
--# CONFIG_USB_KAWETH is not set
--# CONFIG_USB_PEGASUS is not set
--# CONFIG_USB_RTL8150 is not set
--# CONFIG_USB_USBNET is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--# CONFIG_SERIAL_8250_PCI is not set
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_TINY_USB is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--CONFIG_SENSORS_PCF8574=y
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--CONFIG_SPI=y
--CONFIG_SPI_MASTER=y
--
--#
--# SPI Master Controller Drivers
--#
--CONFIG_SPI_BITBANG=y
--CONFIG_SPI_MPC83xx=y
--
--#
--# SPI Protocol Masters
--#
--# CONFIG_SPI_AT25 is not set
--# CONFIG_SPI_SPIDEV is not set
--# CONFIG_SPI_TLE62X0 is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--# CONFIG_THERMAL is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_83xx_WDT=y
--
--#
--# PCI-based Watchdog Cards
--#
--# CONFIG_PCIPCWATCHDOG is not set
--# CONFIG_WDTPCI is not set
--
--#
--# USB-based Watchdog Cards
--#
--# CONFIG_USBPCWATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--# CONFIG_USB_DABUSB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--CONFIG_USB=y
--# CONFIG_USB_DEBUG is not set
--# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
--
--#
--# Miscellaneous USB options
--#
--# CONFIG_USB_DEVICEFS is not set
--CONFIG_USB_DEVICE_CLASS=y
--# CONFIG_USB_DYNAMIC_MINORS is not set
--# CONFIG_USB_OTG is not set
--
--#
--# USB Host Controller Drivers
--#
--CONFIG_USB_EHCI_HCD=y
--CONFIG_USB_EHCI_ROOT_HUB_TT=y
--# CONFIG_USB_EHCI_TT_NEWSCHED is not set
--CONFIG_USB_EHCI_FSL=y
--CONFIG_USB_EHCI_HCD_PPC_OF=y
--# CONFIG_USB_ISP116X_HCD is not set
--# CONFIG_USB_OHCI_HCD is not set
--CONFIG_USB_UHCI_HCD=y
--# CONFIG_USB_SL811_HCD is not set
--# CONFIG_USB_R8A66597_HCD is not set
--
--#
--# USB Device Class drivers
--#
--# CONFIG_USB_ACM is not set
--# CONFIG_USB_PRINTER is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--
--#
--# may also be needed; see USB_STORAGE Help for more information
--#
--CONFIG_USB_STORAGE=y
--# CONFIG_USB_STORAGE_DEBUG is not set
--# CONFIG_USB_STORAGE_DATAFAB is not set
--# CONFIG_USB_STORAGE_FREECOM is not set
--# CONFIG_USB_STORAGE_ISD200 is not set
--# CONFIG_USB_STORAGE_DPCM is not set
--# CONFIG_USB_STORAGE_USBAT is not set
--# CONFIG_USB_STORAGE_SDDR09 is not set
--# CONFIG_USB_STORAGE_SDDR55 is not set
--# CONFIG_USB_STORAGE_JUMPSHOT is not set
--# CONFIG_USB_STORAGE_ALAUDA is not set
--# CONFIG_USB_STORAGE_KARMA is not set
--# CONFIG_USB_LIBUSUAL is not set
--
--#
--# USB Imaging devices
--#
--# CONFIG_USB_MDC800 is not set
--# CONFIG_USB_MICROTEK is not set
--CONFIG_USB_MON=y
--
--#
--# USB port drivers
--#
--# CONFIG_USB_SERIAL is not set
--
--#
--# USB Miscellaneous drivers
--#
--# CONFIG_USB_EMI62 is not set
--# CONFIG_USB_EMI26 is not set
--# CONFIG_USB_ADUTUX is not set
--# CONFIG_USB_AUERSWALD is not set
--# CONFIG_USB_RIO500 is not set
--# CONFIG_USB_LEGOTOWER is not set
--# CONFIG_USB_LCD is not set
--# CONFIG_USB_BERRY_CHARGE is not set
--# CONFIG_USB_LED is not set
--# CONFIG_USB_CYPRESS_CY7C63 is not set
--# CONFIG_USB_CYTHERM is not set
--# CONFIG_USB_PHIDGET is not set
--# CONFIG_USB_IDMOUSE is not set
--# CONFIG_USB_FTDI_ELAN is not set
--# CONFIG_USB_APPLEDISPLAY is not set
--# CONFIG_USB_SISUSBVGA is not set
--# CONFIG_USB_LD is not set
--# CONFIG_USB_TRANCEVIBRATOR is not set
--# CONFIG_USB_IOWARRIOR is not set
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--CONFIG_RTC_LIB=y
--CONFIG_RTC_CLASS=y
--CONFIG_RTC_HCTOSYS=y
--CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
--# CONFIG_RTC_DEBUG is not set
--
--#
--# RTC interfaces
--#
--CONFIG_RTC_INTF_SYSFS=y
--CONFIG_RTC_INTF_PROC=y
--CONFIG_RTC_INTF_DEV=y
--CONFIG_RTC_INTF_DEV_UIE_EMUL=y
--# CONFIG_RTC_DRV_TEST is not set
--
--#
--# I2C RTC drivers
--#
--CONFIG_RTC_DRV_DS1307=y
--# CONFIG_RTC_DRV_DS1374 is not set
--# CONFIG_RTC_DRV_DS1672 is not set
--# CONFIG_RTC_DRV_MAX6900 is not set
--# CONFIG_RTC_DRV_RS5C372 is not set
--# CONFIG_RTC_DRV_ISL1208 is not set
--# CONFIG_RTC_DRV_X1205 is not set
--# CONFIG_RTC_DRV_PCF8563 is not set
--# CONFIG_RTC_DRV_PCF8583 is not set
--# CONFIG_RTC_DRV_M41T80 is not set
--# CONFIG_RTC_DRV_S35390A is not set
--
--#
--# SPI RTC drivers
--#
--# CONFIG_RTC_DRV_MAX6902 is not set
--# CONFIG_RTC_DRV_R9701 is not set
--# CONFIG_RTC_DRV_RS5C348 is not set
--
--#
--# Platform RTC drivers
--#
--# CONFIG_RTC_DRV_CMOS is not set
--# CONFIG_RTC_DRV_DS1511 is not set
--# CONFIG_RTC_DRV_DS1553 is not set
--# CONFIG_RTC_DRV_DS1742 is not set
--# CONFIG_RTC_DRV_STK17TA8 is not set
--# CONFIG_RTC_DRV_M48T86 is not set
--# CONFIG_RTC_DRV_M48T59 is not set
--# CONFIG_RTC_DRV_V3020 is not set
--
--#
--# on-CPU RTC drivers
--#
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--CONFIG_FAT_FS=y
--CONFIG_MSDOS_FS=y
--CONFIG_VFAT_FS=y
--CONFIG_FAT_DEFAULT_CODEPAGE=437
--CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_JFFS2_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--CONFIG_MAC_PARTITION=y
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_BSD_DISKLABEL is not set
--# CONFIG_MINIX_SUBPARTITION is not set
--# CONFIG_SOLARIS_X86_PARTITION is not set
--# CONFIG_UNIXWARE_DISKLABEL is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--CONFIG_NLS=y
--CONFIG_NLS_DEFAULT="iso8859-1"
--# CONFIG_NLS_CODEPAGE_437 is not set
--# CONFIG_NLS_CODEPAGE_737 is not set
--# CONFIG_NLS_CODEPAGE_775 is not set
--# CONFIG_NLS_CODEPAGE_850 is not set
--# CONFIG_NLS_CODEPAGE_852 is not set
--# CONFIG_NLS_CODEPAGE_855 is not set
--# CONFIG_NLS_CODEPAGE_857 is not set
--# CONFIG_NLS_CODEPAGE_860 is not set
--# CONFIG_NLS_CODEPAGE_861 is not set
--# CONFIG_NLS_CODEPAGE_862 is not set
--# CONFIG_NLS_CODEPAGE_863 is not set
--# CONFIG_NLS_CODEPAGE_864 is not set
--# CONFIG_NLS_CODEPAGE_865 is not set
--# CONFIG_NLS_CODEPAGE_866 is not set
--# CONFIG_NLS_CODEPAGE_869 is not set
--# CONFIG_NLS_CODEPAGE_936 is not set
--# CONFIG_NLS_CODEPAGE_950 is not set
--# CONFIG_NLS_CODEPAGE_932 is not set
--# CONFIG_NLS_CODEPAGE_949 is not set
--# CONFIG_NLS_CODEPAGE_874 is not set
--# CONFIG_NLS_ISO8859_8 is not set
--# CONFIG_NLS_CODEPAGE_1250 is not set
--# CONFIG_NLS_CODEPAGE_1251 is not set
--# CONFIG_NLS_ASCII is not set
--# CONFIG_NLS_ISO8859_1 is not set
--# CONFIG_NLS_ISO8859_2 is not set
--# CONFIG_NLS_ISO8859_3 is not set
--# CONFIG_NLS_ISO8859_4 is not set
--# CONFIG_NLS_ISO8859_5 is not set
--# CONFIG_NLS_ISO8859_6 is not set
--# CONFIG_NLS_ISO8859_7 is not set
--# CONFIG_NLS_ISO8859_9 is not set
--# CONFIG_NLS_ISO8859_13 is not set
--# CONFIG_NLS_ISO8859_14 is not set
--# CONFIG_NLS_ISO8859_15 is not set
--# CONFIG_NLS_KOI8_R is not set
--# CONFIG_NLS_KOI8_U is not set
--# CONFIG_NLS_UTF8 is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/mpc834x_mds_defconfig
-+++ /dev/null
-@@ -1,1021 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc7
--# Mon Mar 31 11:36:56 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_FSL_EMB_PERFMON is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MULTIPLATFORM is not set
--# CONFIG_PPC_82xx is not set
--CONFIG_PPC_83xx=y
--# CONFIG_PPC_86xx is not set
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC83xx=y
--# CONFIG_MPC831x_RDB is not set
--# CONFIG_MPC832x_MDS is not set
--# CONFIG_MPC832x_RDB is not set
--CONFIG_MPC834x_MDS=y
--# CONFIG_MPC834x_ITX is not set
--# CONFIG_MPC836x_MDS is not set
--# CONFIG_MPC837x_MDS is not set
--# CONFIG_MPC837x_RDB is not set
--# CONFIG_SBC834x is not set
--CONFIG_PPC_MPC834x=y
--CONFIG_IPIC=y
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--CONFIG_XFRM_USER=m
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--CONFIG_MARVELL_PHY=y
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--CONFIG_NET_PCI=y
--# CONFIG_PCNET32 is not set
--# CONFIG_AMD8111_ETH is not set
--# CONFIG_ADAPTEC_STARFIRE is not set
--# CONFIG_B44 is not set
--# CONFIG_FORCEDETH is not set
--# CONFIG_EEPRO100 is not set
--CONFIG_E100=y
--# CONFIG_FEALNX is not set
--# CONFIG_NATSEMI is not set
--# CONFIG_NE2K_PCI is not set
--# CONFIG_8139CP is not set
--# CONFIG_8139TOO is not set
--# CONFIG_R6040 is not set
--# CONFIG_SIS900 is not set
--# CONFIG_EPIC100 is not set
--# CONFIG_SUNDANCE is not set
--# CONFIG_TLAN is not set
--# CONFIG_VIA_RHINE is not set
--# CONFIG_SC92031 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--# CONFIG_GFAR_NAPI is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--# CONFIG_SENSORS_LM75 is not set
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_83xx_WDT=y
--
--#
--# PCI-based Watchdog Cards
--#
--# CONFIG_PCIPCWATCHDOG is not set
--# CONFIG_WDTPCI is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--CONFIG_RTC_LIB=y
--CONFIG_RTC_CLASS=y
--CONFIG_RTC_HCTOSYS=y
--CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
--# CONFIG_RTC_DEBUG is not set
--
--#
--# RTC interfaces
--#
--CONFIG_RTC_INTF_SYSFS=y
--CONFIG_RTC_INTF_PROC=y
--CONFIG_RTC_INTF_DEV=y
--# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
--# CONFIG_RTC_DRV_TEST is not set
--
--#
--# I2C RTC drivers
--#
--# CONFIG_RTC_DRV_DS1307 is not set
--CONFIG_RTC_DRV_DS1374=y
--# CONFIG_RTC_DRV_DS1672 is not set
--# CONFIG_RTC_DRV_MAX6900 is not set
--# CONFIG_RTC_DRV_RS5C372 is not set
--# CONFIG_RTC_DRV_ISL1208 is not set
--# CONFIG_RTC_DRV_X1205 is not set
--# CONFIG_RTC_DRV_PCF8563 is not set
--# CONFIG_RTC_DRV_PCF8583 is not set
--# CONFIG_RTC_DRV_M41T80 is not set
--# CONFIG_RTC_DRV_S35390A is not set
--
--#
--# SPI RTC drivers
--#
--
--#
--# Platform RTC drivers
--#
--# CONFIG_RTC_DRV_CMOS is not set
--# CONFIG_RTC_DRV_DS1511 is not set
--# CONFIG_RTC_DRV_DS1553 is not set
--# CONFIG_RTC_DRV_DS1742 is not set
--# CONFIG_RTC_DRV_STK17TA8 is not set
--# CONFIG_RTC_DRV_M48T86 is not set
--# CONFIG_RTC_DRV_M48T59 is not set
--# CONFIG_RTC_DRV_V3020 is not set
--
--#
--# on-CPU RTC drivers
--#
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--# CONFIG_MSDOS_PARTITION is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/mpc836x_mds_defconfig
-+++ /dev/null
-@@ -1,1079 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc7
--# Mon Mar 31 11:36:57 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_FSL_EMB_PERFMON is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MULTIPLATFORM is not set
--# CONFIG_PPC_82xx is not set
--CONFIG_PPC_83xx=y
--# CONFIG_PPC_86xx is not set
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC83xx=y
--# CONFIG_MPC831x_RDB is not set
--# CONFIG_MPC832x_MDS is not set
--# CONFIG_MPC832x_RDB is not set
--# CONFIG_MPC834x_MDS is not set
--# CONFIG_MPC834x_ITX is not set
--CONFIG_MPC836x_MDS=y
--# CONFIG_MPC837x_MDS is not set
--# CONFIG_MPC837x_RDB is not set
--# CONFIG_SBC834x is not set
--CONFIG_IPIC=y
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--CONFIG_QUICC_ENGINE=y
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--# CONFIG_BLK_DEV_SD is not set
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--# CONFIG_CHR_DEV_SG is not set
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--# CONFIG_SCSI_SPI_ATTRS is not set
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_MVSAS is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--CONFIG_MARVELL_PHY=y
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_GIANFAR is not set
--CONFIG_UCC_GETH=y
--# CONFIG_UGETH_NAPI is not set
--# CONFIG_UGETH_MAGIC_PACKET is not set
--# CONFIG_UGETH_FILTERING is not set
--# CONFIG_UGETH_TX_ON_DEMAND is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--# CONFIG_SERIAL_QE is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--# CONFIG_SENSORS_LM75 is not set
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_83xx_WDT=y
--
--#
--# PCI-based Watchdog Cards
--#
--# CONFIG_PCIPCWATCHDOG is not set
--# CONFIG_WDTPCI is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--CONFIG_RTC_LIB=y
--CONFIG_RTC_CLASS=y
--CONFIG_RTC_HCTOSYS=y
--CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
--# CONFIG_RTC_DEBUG is not set
--
--#
--# RTC interfaces
--#
--CONFIG_RTC_INTF_SYSFS=y
--CONFIG_RTC_INTF_PROC=y
--CONFIG_RTC_INTF_DEV=y
--# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
--# CONFIG_RTC_DRV_TEST is not set
--
--#
--# I2C RTC drivers
--#
--# CONFIG_RTC_DRV_DS1307 is not set
--CONFIG_RTC_DRV_DS1374=y
--# CONFIG_RTC_DRV_DS1672 is not set
--# CONFIG_RTC_DRV_MAX6900 is not set
--# CONFIG_RTC_DRV_RS5C372 is not set
--# CONFIG_RTC_DRV_ISL1208 is not set
--# CONFIG_RTC_DRV_X1205 is not set
--# CONFIG_RTC_DRV_PCF8563 is not set
--# CONFIG_RTC_DRV_PCF8583 is not set
--# CONFIG_RTC_DRV_M41T80 is not set
--# CONFIG_RTC_DRV_S35390A is not set
--
--#
--# SPI RTC drivers
--#
--
--#
--# Platform RTC drivers
--#
--# CONFIG_RTC_DRV_CMOS is not set
--# CONFIG_RTC_DRV_DS1511 is not set
--# CONFIG_RTC_DRV_DS1553 is not set
--# CONFIG_RTC_DRV_DS1742 is not set
--# CONFIG_RTC_DRV_STK17TA8 is not set
--# CONFIG_RTC_DRV_M48T86 is not set
--# CONFIG_RTC_DRV_M48T59 is not set
--# CONFIG_RTC_DRV_V3020 is not set
--
--#
--# on-CPU RTC drivers
--#
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--# CONFIG_MSDOS_PARTITION is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--CONFIG_UCC_FAST=y
--CONFIG_UCC=y
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
--CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/mpc837x_mds_defconfig
-+++ /dev/null
-@@ -1,899 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:23 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_FSL_EMB_PERFMON is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLAB=y
--# CONFIG_SLUB is not set
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MULTIPLATFORM is not set
--# CONFIG_PPC_82xx is not set
--CONFIG_PPC_83xx=y
--# CONFIG_PPC_86xx is not set
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC83xx=y
--# CONFIG_MPC831x_RDB is not set
--# CONFIG_MPC832x_MDS is not set
--# CONFIG_MPC832x_RDB is not set
--# CONFIG_MPC834x_MDS is not set
--# CONFIG_MPC834x_ITX is not set
--# CONFIG_MPC836x_MDS is not set
--CONFIG_MPC837x_MDS=y
--# CONFIG_MPC837x_RDB is not set
--# CONFIG_SBC834x is not set
--CONFIG_PPC_MPC837x=y
--CONFIG_IPIC=y
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--# CONFIG_PCI is not set
--# CONFIG_PCI_DOMAINS is not set
--# CONFIG_PCI_SYSCALL is not set
--# CONFIG_ARCH_SUPPORTS_MSI is not set
--# CONFIG_PCCARD is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--CONFIG_XFRM_USER=m
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--CONFIG_BLK_DEV_SD=y
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--CONFIG_CHR_DEV_SG=y
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--# CONFIG_SCSI_SPI_ATTRS is not set
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_SCSI_DEBUG is not set
--CONFIG_ATA=y
--# CONFIG_ATA_NONSTANDARD is not set
--# CONFIG_SATA_MV is not set
--CONFIG_SATA_FSL=y
--# CONFIG_PATA_PLATFORM is not set
--# CONFIG_MD is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--CONFIG_MARVELL_PHY=y
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_E1000E_ENABLED is not set
--CONFIG_GIANFAR=y
--# CONFIG_GFAR_NAPI is not set
--CONFIG_NETDEV_10000=y
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
--# CONFIG_R3964 is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--# CONFIG_SENSORS_LM75 is not set
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_83xx_WDT=y
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--# CONFIG_USB_ARCH_HAS_OHCI is not set
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_BSD_DISKLABEL is not set
--# CONFIG_MINIX_SUBPARTITION is not set
--# CONFIG_SOLARIS_X86_PARTITION is not set
--# CONFIG_UNIXWARE_DISKLABEL is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/mpc837x_rdb_defconfig
-+++ /dev/null
-@@ -1,930 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:24 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_FSL_EMB_PERFMON is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLAB=y
--# CONFIG_SLUB is not set
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MULTIPLATFORM is not set
--# CONFIG_PPC_82xx is not set
--CONFIG_PPC_83xx=y
--# CONFIG_PPC_86xx is not set
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC83xx=y
--# CONFIG_MPC831x_RDB is not set
--# CONFIG_MPC832x_MDS is not set
--# CONFIG_MPC832x_RDB is not set
--# CONFIG_MPC834x_MDS is not set
--# CONFIG_MPC834x_ITX is not set
--# CONFIG_MPC836x_MDS is not set
--# CONFIG_MPC837x_MDS is not set
--CONFIG_MPC837x_RDB=y
--# CONFIG_SBC834x is not set
--CONFIG_PPC_MPC837x=y
--CONFIG_IPIC=y
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--# CONFIG_PCI is not set
--# CONFIG_PCI_DOMAINS is not set
--# CONFIG_PCI_SYSCALL is not set
--# CONFIG_ARCH_SUPPORTS_MSI is not set
--# CONFIG_PCCARD is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--CONFIG_BLK_DEV_SD=y
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--CONFIG_CHR_DEV_SG=y
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--# CONFIG_SCSI_SPI_ATTRS is not set
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_SCSI_DEBUG is not set
--CONFIG_ATA=y
--# CONFIG_ATA_NONSTANDARD is not set
--# CONFIG_SATA_MV is not set
--CONFIG_SATA_FSL=y
--# CONFIG_PATA_PLATFORM is not set
--CONFIG_MD=y
--CONFIG_BLK_DEV_MD=y
--# CONFIG_MD_LINEAR is not set
--# CONFIG_MD_RAID0 is not set
--CONFIG_MD_RAID1=y
--# CONFIG_MD_RAID10 is not set
--CONFIG_MD_RAID456=y
--CONFIG_MD_RAID5_RESHAPE=y
--# CONFIG_MD_MULTIPATH is not set
--# CONFIG_MD_FAULTY is not set
--# CONFIG_BLK_DEV_DM is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--CONFIG_MARVELL_PHY=y
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_E1000E_ENABLED is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_NETDEV_10000 is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
--# CONFIG_R3964 is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--# CONFIG_SENSORS_LM75 is not set
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_83xx_WDT=y
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--# CONFIG_USB_ARCH_HAS_OHCI is not set
--CONFIG_USB_ARCH_HAS_EHCI=y
--CONFIG_USB=y
--# CONFIG_USB_DEBUG is not set
--# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
--
--#
--# Miscellaneous USB options
--#
--# CONFIG_USB_DEVICEFS is not set
--CONFIG_USB_DEVICE_CLASS=y
--# CONFIG_USB_DYNAMIC_MINORS is not set
--# CONFIG_USB_OTG is not set
--
--#
--# USB Host Controller Drivers
--#
--CONFIG_USB_EHCI_HCD=y
--CONFIG_USB_EHCI_ROOT_HUB_TT=y
--# CONFIG_USB_EHCI_TT_NEWSCHED is not set
--CONFIG_USB_EHCI_FSL=y
--CONFIG_USB_EHCI_HCD_PPC_OF=y
--# CONFIG_USB_ISP116X_HCD is not set
--# CONFIG_USB_SL811_HCD is not set
--# CONFIG_USB_R8A66597_HCD is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_BSD_DISKLABEL is not set
--# CONFIG_MINIX_SUBPARTITION is not set
--# CONFIG_SOLARIS_X86_PARTITION is not set
--# CONFIG_UNIXWARE_DISKLABEL is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--# CONFIG_ENABLE_MUST_CHECK is not set
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_XOR_BLOCKS=y
--CONFIG_ASYNC_CORE=y
--CONFIG_ASYNC_MEMCPY=y
--CONFIG_ASYNC_XOR=y
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/mpc83xx_defconfig
-+++ b/arch/powerpc/configs/mpc83xx_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:25 2008
-+# Linux kernel version: 2.6.25-rc9
-+# Tue Apr 15 18:07:36 2008
- #
- # CONFIG_PPC64 is not set
-
-@@ -201,6 +201,7 @@ CONFIG_PREEMPT_NONE=y
- # CONFIG_PREEMPT is not set
- CONFIG_BINFMT_ELF=y
- # CONFIG_BINFMT_MISC is not set
-+CONFIG_FORCE_MAX_ZONEORDER=11
- CONFIG_MATH_EMULATION=y
- # CONFIG_IOMMU_HELPER is not set
- CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-@@ -353,7 +354,90 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
- # CONFIG_FW_LOADER is not set
- # CONFIG_SYS_HYPERVISOR is not set
- # CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_PARTS is not set
-+CONFIG_MTD_OF_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+CONFIG_MTD_NAND=y
-+CONFIG_MTD_NAND_VERIFY_WRITE=y
-+# CONFIG_MTD_NAND_ECC_SMC is not set
-+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-+CONFIG_MTD_NAND_IDS=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+# CONFIG_MTD_NAND_NANDSIM is not set
-+# CONFIG_MTD_NAND_PLATFORM is not set
-+# CONFIG_MTD_ALAUDA is not set
-+CONFIG_MTD_NAND_FSL_ELBC=y
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
- CONFIG_OF_DEVICE=y
- # CONFIG_PARPORT is not set
- CONFIG_BLK_DEV=y
-@@ -362,6 +446,7 @@ CONFIG_BLK_DEV=y
- CONFIG_BLK_DEV_LOOP=y
- # CONFIG_BLK_DEV_CRYPTOLOOP is not set
- # CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_UB is not set
- CONFIG_BLK_DEV_RAM=y
- CONFIG_BLK_DEV_RAM_COUNT=16
- CONFIG_BLK_DEV_RAM_SIZE=32768
-@@ -469,6 +554,15 @@ CONFIG_NETDEV_10000=y
- #
- # CONFIG_WLAN_PRE80211 is not set
- # CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
- # CONFIG_WAN is not set
- # CONFIG_PPP is not set
- # CONFIG_SLIP is not set
-@@ -563,6 +657,7 @@ CONFIG_I2C_MPC=y
- # CONFIG_I2C_SIMTEC is not set
- # CONFIG_I2C_TAOS_EVM is not set
- # CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-
- #
- # Miscellaneous I2C Chip support
-@@ -648,6 +743,11 @@ CONFIG_WATCHDOG=y
- CONFIG_83xx_WDT=y
-
- #
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+
-+#
- # Sonics Silicon Backplane
- #
- CONFIG_SSB_POSSIBLE=y
-@@ -664,6 +764,7 @@ CONFIG_SSB_POSSIBLE=y
- # CONFIG_VIDEO_DEV is not set
- # CONFIG_DVB_CORE is not set
- CONFIG_DAB=y
-+# CONFIG_USB_DABUSB is not set
-
- #
- # Graphics support
-@@ -686,6 +787,14 @@ CONFIG_HID_SUPPORT=y
- CONFIG_HID=y
- # CONFIG_HID_DEBUG is not set
- # CONFIG_HIDRAW is not set
-+
-+#
-+# USB Input Devices
-+#
-+CONFIG_USB_HID=y
-+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-+# CONFIG_HID_FF is not set
-+# CONFIG_USB_HIDDEV is not set
- CONFIG_USB_SUPPORT=y
- CONFIG_USB_ARCH_HAS_HCD=y
- # CONFIG_USB_ARCH_HAS_OHCI is not set
-@@ -715,8 +824,55 @@ CONFIG_USB_EHCI_HCD_PPC_OF=y
- # CONFIG_USB_R8A66597_HCD is not set
-
- #
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
- # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
- #
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+# CONFIG_USB_STORAGE is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
- # CONFIG_USB_GADGET is not set
- # CONFIG_MMC is not set
- # CONFIG_MEMSTICK is not set
-@@ -792,6 +948,7 @@ CONFIG_TMPFS=y
- # CONFIG_BEFS_FS is not set
- # CONFIG_BFS_FS is not set
- # CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
- # CONFIG_CRAMFS is not set
- # CONFIG_VXFS_FS is not set
- # CONFIG_MINIX_FS is not set
-@@ -862,6 +1019,7 @@ CONFIG_PLIST=y
- CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
- CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-
- #
- # Kernel hacking
---- a/arch/powerpc/configs/mpc8540_ads_defconfig
-+++ /dev/null
-@@ -1,796 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:25 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_ALL is not set
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--# CONFIG_MODULES is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--CONFIG_MPC8540_ADS=y
--# CONFIG_MPC8560_ADS is not set
--# CONFIG_MPC85xx_CDS is not set
--# CONFIG_MPC85xx_MDS is not set
--# CONFIG_MPC85xx_DS is not set
--# CONFIG_STX_GP3 is not set
--# CONFIG_TQM8540 is not set
--# CONFIG_TQM8541 is not set
--# CONFIG_TQM8555 is not set
--# CONFIG_TQM8560 is not set
--# CONFIG_SBC8548 is not set
--# CONFIG_SBC8560 is not set
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_CPM2 is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--CONFIG_BINFMT_MISC=y
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--# CONFIG_SECCOMP is not set
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_FSL_SOC=y
--# CONFIG_PCI is not set
--# CONFIG_PCI_DOMAINS is not set
--# CONFIG_PCI_SYSCALL is not set
--# CONFIG_ARCH_SUPPORTS_MSI is not set
--# CONFIG_PCCARD is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--CONFIG_XFRM_USER=y
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_E1000E_ENABLED is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--CONFIG_NETDEV_10000=y
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
--# CONFIG_R3964 is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=y
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--# CONFIG_USB_ARCH_HAS_HCD is not set
--# CONFIG_USB_ARCH_HAS_OHCI is not set
--# CONFIG_USB_ARCH_HAS_EHCI is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--# CONFIG_NFS_V3 is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--# CONFIG_MSDOS_PARTITION is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--CONFIG_DEBUG_MUTEXES=y
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--# CONFIG_CRYPTO_SEQIV is not set
--# CONFIG_CRYPTO_MANAGER is not set
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--# CONFIG_CRYPTO_MD5 is not set
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--# CONFIG_CRYPTO_CBC is not set
--# CONFIG_CRYPTO_PCBC is not set
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--# CONFIG_CRYPTO_DES is not set
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/mpc8544_ds_defconfig
-+++ /dev/null
-@@ -1,1549 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc7
--# Mon Mar 31 11:37:03 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--CONFIG_BSD_PROCESS_ACCT=y
--# CONFIG_BSD_PROCESS_ACCT_V3 is not set
--# CONFIG_TASKSTATS is not set
--CONFIG_AUDIT=y
--# CONFIG_AUDITSYSCALL is not set
--CONFIG_IKCONFIG=y
--CONFIG_IKCONFIG_PROC=y
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--CONFIG_KALLSYMS_ALL=y
--CONFIG_KALLSYMS_EXTRA_PASS=y
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--CONFIG_MODULE_FORCE_UNLOAD=y
--CONFIG_MODVERSIONS=y
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--CONFIG_LBD=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--# CONFIG_DEFAULT_AS is not set
--# CONFIG_DEFAULT_DEADLINE is not set
--CONFIG_DEFAULT_CFQ=y
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="cfq"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--# CONFIG_MPC8540_ADS is not set
--# CONFIG_MPC8560_ADS is not set
--# CONFIG_MPC85xx_CDS is not set
--# CONFIG_MPC85xx_MDS is not set
--CONFIG_MPC85xx_DS=y
--# CONFIG_STX_GP3 is not set
--# CONFIG_TQM8540 is not set
--# CONFIG_TQM8541 is not set
--# CONFIG_TQM8555 is not set
--# CONFIG_TQM8560 is not set
--# CONFIG_SBC8548 is not set
--# CONFIG_SBC8560 is not set
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--CONFIG_PPC_I8259=y
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_CPM2 is not set
--CONFIG_FSL_ULI1575=y
--
--#
--# Kernel options
--#
--CONFIG_HIGHMEM=y
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--CONFIG_BINFMT_MISC=m
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_FSL_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--CONFIG_XFRM_USER=y
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--CONFIG_NET_KEY=m
--# CONFIG_NET_KEY_MIGRATE is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--CONFIG_IP_ADVANCED_ROUTER=y
--CONFIG_ASK_IP_FIB_HASH=y
--# CONFIG_IP_FIB_TRIE is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_MULTIPLE_TABLES=y
--CONFIG_IP_ROUTE_MULTIPATH=y
--CONFIG_IP_ROUTE_VERBOSE=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--CONFIG_IP_PNP_RARP=y
--CONFIG_NET_IPIP=y
--CONFIG_NET_IPGRE=y
--CONFIG_NET_IPGRE_BROADCAST=y
--CONFIG_IP_MROUTE=y
--CONFIG_IP_PIMSM_V1=y
--CONFIG_IP_PIMSM_V2=y
--CONFIG_ARPD=y
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--CONFIG_INET_TUNNEL=y
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--CONFIG_IPV6=y
--# CONFIG_IPV6_PRIVACY is not set
--# CONFIG_IPV6_ROUTER_PREF is not set
--# CONFIG_IPV6_OPTIMISTIC_DAD is not set
--# CONFIG_INET6_AH is not set
--# CONFIG_INET6_ESP is not set
--# CONFIG_INET6_IPCOMP is not set
--# CONFIG_IPV6_MIP6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--CONFIG_INET6_XFRM_MODE_TRANSPORT=y
--CONFIG_INET6_XFRM_MODE_TUNNEL=y
--CONFIG_INET6_XFRM_MODE_BEET=y
--# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
--CONFIG_IPV6_SIT=y
--# CONFIG_IPV6_TUNNEL is not set
--# CONFIG_IPV6_MULTIPLE_TABLES is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--CONFIG_IP_SCTP=m
--# CONFIG_SCTP_DBG_MSG is not set
--# CONFIG_SCTP_DBG_OBJCNT is not set
--# CONFIG_SCTP_HMAC_NONE is not set
--# CONFIG_SCTP_HMAC_SHA1 is not set
--CONFIG_SCTP_HMAC_MD5=y
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--CONFIG_FIB_RULES=y
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--CONFIG_BLK_DEV_NBD=y
--# CONFIG_BLK_DEV_SX8 is not set
--# CONFIG_BLK_DEV_UB is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=131072
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--CONFIG_BLK_DEV_SD=y
--CONFIG_CHR_DEV_ST=y
--# CONFIG_CHR_DEV_OSST is not set
--CONFIG_BLK_DEV_SR=y
--# CONFIG_BLK_DEV_SR_VENDOR is not set
--CONFIG_CHR_DEV_SG=y
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--CONFIG_SCSI_MULTI_LUN=y
--# CONFIG_SCSI_CONSTANTS is not set
--CONFIG_SCSI_LOGGING=y
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--# CONFIG_SCSI_SPI_ATTRS is not set
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_MVSAS is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_IPR is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--CONFIG_ATA=y
--# CONFIG_ATA_NONSTANDARD is not set
--CONFIG_SATA_AHCI=y
--# CONFIG_SATA_SVW is not set
--# CONFIG_ATA_PIIX is not set
--# CONFIG_SATA_MV is not set
--# CONFIG_SATA_NV is not set
--# CONFIG_PDC_ADMA is not set
--# CONFIG_SATA_QSTOR is not set
--# CONFIG_SATA_PROMISE is not set
--# CONFIG_SATA_SX4 is not set
--# CONFIG_SATA_SIL is not set
--# CONFIG_SATA_SIL24 is not set
--# CONFIG_SATA_SIS is not set
--# CONFIG_SATA_ULI is not set
--# CONFIG_SATA_VIA is not set
--# CONFIG_SATA_VITESSE is not set
--# CONFIG_SATA_INIC162X is not set
--# CONFIG_SATA_FSL is not set
--CONFIG_PATA_ALI=y
--# CONFIG_PATA_AMD is not set
--# CONFIG_PATA_ARTOP is not set
--# CONFIG_PATA_ATIIXP is not set
--# CONFIG_PATA_CMD640_PCI is not set
--# CONFIG_PATA_CMD64X is not set
--# CONFIG_PATA_CS5520 is not set
--# CONFIG_PATA_CS5530 is not set
--# CONFIG_PATA_CYPRESS is not set
--# CONFIG_PATA_EFAR is not set
--# CONFIG_ATA_GENERIC is not set
--# CONFIG_PATA_HPT366 is not set
--# CONFIG_PATA_HPT37X is not set
--# CONFIG_PATA_HPT3X2N is not set
--# CONFIG_PATA_HPT3X3 is not set
--# CONFIG_PATA_IT821X is not set
--# CONFIG_PATA_IT8213 is not set
--# CONFIG_PATA_JMICRON is not set
--# CONFIG_PATA_TRIFLEX is not set
--# CONFIG_PATA_MARVELL is not set
--# CONFIG_PATA_MPIIX is not set
--# CONFIG_PATA_OLDPIIX is not set
--# CONFIG_PATA_NETCELL is not set
--# CONFIG_PATA_NINJA32 is not set
--# CONFIG_PATA_NS87410 is not set
--# CONFIG_PATA_NS87415 is not set
--# CONFIG_PATA_OPTI is not set
--# CONFIG_PATA_OPTIDMA is not set
--# CONFIG_PATA_PDC_OLD is not set
--# CONFIG_PATA_RADISYS is not set
--# CONFIG_PATA_RZ1000 is not set
--# CONFIG_PATA_SC1200 is not set
--# CONFIG_PATA_SERVERWORKS is not set
--# CONFIG_PATA_PDC2027X is not set
--# CONFIG_PATA_SIL680 is not set
--# CONFIG_PATA_SIS is not set
--# CONFIG_PATA_VIA is not set
--# CONFIG_PATA_WINBOND is not set
--# CONFIG_PATA_PLATFORM is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--CONFIG_DUMMY=y
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--CONFIG_VITESSE_PHY=y
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--
--#
--# USB Network Adapters
--#
--# CONFIG_USB_CATC is not set
--# CONFIG_USB_KAWETH is not set
--# CONFIG_USB_PEGASUS is not set
--# CONFIG_USB_RTL8150 is not set
--# CONFIG_USB_USBNET is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--CONFIG_SERIO=y
--CONFIG_SERIO_I8042=y
--CONFIG_SERIO_SERPORT=y
--# CONFIG_SERIO_PCIPS2 is not set
--CONFIG_SERIO_LIBPS2=y
--# CONFIG_SERIO_RAW is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--CONFIG_VT=y
--CONFIG_VT_CONSOLE=y
--CONFIG_HW_CONSOLE=y
--# CONFIG_VT_HW_CONSOLE_BINDING is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=2
--CONFIG_SERIAL_8250_RUNTIME_UARTS=2
--CONFIG_SERIAL_8250_EXTENDED=y
--CONFIG_SERIAL_8250_MANY_PORTS=y
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--CONFIG_SERIAL_8250_DETECT_IRQ=y
--CONFIG_SERIAL_8250_RSA=y
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--CONFIG_NVRAM=y
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--# CONFIG_I2C_CHARDEV is not set
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_TINY_USB is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--CONFIG_SENSORS_EEPROM=y
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--CONFIG_DVB_CORE=m
--# CONFIG_DVB_CORE_ATTACH is not set
--CONFIG_DVB_CAPTURE_DRIVERS=y
--
--#
--# Supported SAA7146 based PCI Adapters
--#
--# CONFIG_TTPCI_EEPROM is not set
--# CONFIG_DVB_BUDGET_CORE is not set
--
--#
--# Supported USB Adapters
--#
--# CONFIG_DVB_USB is not set
--# CONFIG_DVB_TTUSB_BUDGET is not set
--# CONFIG_DVB_TTUSB_DEC is not set
--# CONFIG_DVB_CINERGYT2 is not set
--
--#
--# Supported FlexCopII (B2C2) Adapters
--#
--# CONFIG_DVB_B2C2_FLEXCOP is not set
--
--#
--# Supported BT878 Adapters
--#
--
--#
--# Supported Pluto2 Adapters
--#
--# CONFIG_DVB_PLUTO2 is not set
--
--#
--# Supported DVB Frontends
--#
--
--#
--# Customise DVB Frontends
--#
--# CONFIG_DVB_FE_CUSTOMISE is not set
--
--#
--# DVB-S (satellite) frontends
--#
--# CONFIG_DVB_STV0299 is not set
--# CONFIG_DVB_CX24110 is not set
--# CONFIG_DVB_CX24123 is not set
--# CONFIG_DVB_TDA8083 is not set
--# CONFIG_DVB_MT312 is not set
--# CONFIG_DVB_VES1X93 is not set
--# CONFIG_DVB_S5H1420 is not set
--# CONFIG_DVB_TDA10086 is not set
--
--#
--# DVB-T (terrestrial) frontends
--#
--# CONFIG_DVB_SP8870 is not set
--# CONFIG_DVB_SP887X is not set
--# CONFIG_DVB_CX22700 is not set
--# CONFIG_DVB_CX22702 is not set
--# CONFIG_DVB_L64781 is not set
--# CONFIG_DVB_TDA1004X is not set
--# CONFIG_DVB_NXT6000 is not set
--# CONFIG_DVB_MT352 is not set
--# CONFIG_DVB_ZL10353 is not set
--# CONFIG_DVB_DIB3000MB is not set
--# CONFIG_DVB_DIB3000MC is not set
--# CONFIG_DVB_DIB7000M is not set
--# CONFIG_DVB_DIB7000P is not set
--
--#
--# DVB-C (cable) frontends
--#
--# CONFIG_DVB_VES1820 is not set
--# CONFIG_DVB_TDA10021 is not set
--# CONFIG_DVB_TDA10023 is not set
--# CONFIG_DVB_STV0297 is not set
--
--#
--# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
--#
--# CONFIG_DVB_NXT200X is not set
--# CONFIG_DVB_OR51211 is not set
--# CONFIG_DVB_OR51132 is not set
--# CONFIG_DVB_BCM3510 is not set
--# CONFIG_DVB_LGDT330X is not set
--# CONFIG_DVB_S5H1409 is not set
--
--#
--# Tuners/PLL support
--#
--# CONFIG_DVB_PLL is not set
--# CONFIG_DVB_TDA826X is not set
--# CONFIG_DVB_TDA827X is not set
--# CONFIG_DVB_TDA18271 is not set
--# CONFIG_DVB_TUNER_QT1010 is not set
--# CONFIG_DVB_TUNER_MT2060 is not set
--# CONFIG_DVB_TUNER_MT2266 is not set
--# CONFIG_DVB_TUNER_MT2131 is not set
--# CONFIG_DVB_TUNER_DIB0070 is not set
--# CONFIG_DVB_TUNER_XC5000 is not set
--
--#
--# Miscellaneous devices
--#
--# CONFIG_DVB_LNBP21 is not set
--# CONFIG_DVB_ISL6421 is not set
--# CONFIG_DVB_TUA6100 is not set
--CONFIG_DAB=y
--# CONFIG_USB_DABUSB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=y
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Console display driver support
--#
--CONFIG_VGA_CONSOLE=y
--# CONFIG_VGACON_SOFT_SCROLLBACK is not set
--CONFIG_DUMMY_CONSOLE=y
--
--#
--# Sound
--#
--CONFIG_SOUND=y
--
--#
--# Advanced Linux Sound Architecture
--#
--CONFIG_SND=y
--CONFIG_SND_TIMER=y
--CONFIG_SND_PCM=y
--# CONFIG_SND_SEQUENCER is not set
--# CONFIG_SND_MIXER_OSS is not set
--# CONFIG_SND_PCM_OSS is not set
--# CONFIG_SND_DYNAMIC_MINORS is not set
--CONFIG_SND_SUPPORT_OLD_API=y
--CONFIG_SND_VERBOSE_PROCFS=y
--# CONFIG_SND_VERBOSE_PRINTK is not set
--# CONFIG_SND_DEBUG is not set
--
--#
--# Generic devices
--#
--CONFIG_SND_AC97_CODEC=y
--# CONFIG_SND_DUMMY is not set
--# CONFIG_SND_MTPAV is not set
--# CONFIG_SND_SERIAL_U16550 is not set
--# CONFIG_SND_MPU401 is not set
--
--#
--# PCI devices
--#
--# CONFIG_SND_AD1889 is not set
--# CONFIG_SND_ALS300 is not set
--# CONFIG_SND_ALS4000 is not set
--# CONFIG_SND_ALI5451 is not set
--# CONFIG_SND_ATIIXP is not set
--# CONFIG_SND_ATIIXP_MODEM is not set
--# CONFIG_SND_AU8810 is not set
--# CONFIG_SND_AU8820 is not set
--# CONFIG_SND_AU8830 is not set
--# CONFIG_SND_AZT3328 is not set
--# CONFIG_SND_BT87X is not set
--# CONFIG_SND_CA0106 is not set
--# CONFIG_SND_CMIPCI is not set
--# CONFIG_SND_OXYGEN is not set
--# CONFIG_SND_CS4281 is not set
--# CONFIG_SND_CS46XX is not set
--# CONFIG_SND_CS5530 is not set
--# CONFIG_SND_DARLA20 is not set
--# CONFIG_SND_GINA20 is not set
--# CONFIG_SND_LAYLA20 is not set
--# CONFIG_SND_DARLA24 is not set
--# CONFIG_SND_GINA24 is not set
--# CONFIG_SND_LAYLA24 is not set
--# CONFIG_SND_MONA is not set
--# CONFIG_SND_MIA is not set
--# CONFIG_SND_ECHO3G is not set
--# CONFIG_SND_INDIGO is not set
--# CONFIG_SND_INDIGOIO is not set
--# CONFIG_SND_INDIGODJ is not set
--# CONFIG_SND_EMU10K1 is not set
--# CONFIG_SND_EMU10K1X is not set
--# CONFIG_SND_ENS1370 is not set
--# CONFIG_SND_ENS1371 is not set
--# CONFIG_SND_ES1938 is not set
--# CONFIG_SND_ES1968 is not set
--# CONFIG_SND_FM801 is not set
--# CONFIG_SND_HDA_INTEL is not set
--# CONFIG_SND_HDSP is not set
--# CONFIG_SND_HDSPM is not set
--# CONFIG_SND_HIFIER is not set
--# CONFIG_SND_ICE1712 is not set
--# CONFIG_SND_ICE1724 is not set
--CONFIG_SND_INTEL8X0=y
--# CONFIG_SND_INTEL8X0M is not set
--# CONFIG_SND_KORG1212 is not set
--# CONFIG_SND_MAESTRO3 is not set
--# CONFIG_SND_MIXART is not set
--# CONFIG_SND_NM256 is not set
--# CONFIG_SND_PCXHR is not set
--# CONFIG_SND_RIPTIDE is not set
--# CONFIG_SND_RME32 is not set
--# CONFIG_SND_RME96 is not set
--# CONFIG_SND_RME9652 is not set
--# CONFIG_SND_SONICVIBES is not set
--# CONFIG_SND_TRIDENT is not set
--# CONFIG_SND_VIA82XX is not set
--# CONFIG_SND_VIA82XX_MODEM is not set
--# CONFIG_SND_VIRTUOSO is not set
--# CONFIG_SND_VX222 is not set
--# CONFIG_SND_YMFPCI is not set
--# CONFIG_SND_AC97_POWER_SAVE is not set
--
--#
--# ALSA PowerMac devices
--#
--
--#
--# ALSA PowerPC devices
--#
--
--#
--# USB devices
--#
--# CONFIG_SND_USB_AUDIO is not set
--# CONFIG_SND_USB_USX2Y is not set
--# CONFIG_SND_USB_CAIAQ is not set
--
--#
--# System on Chip audio support
--#
--# CONFIG_SND_SOC is not set
--
--#
--# SoC Audio support for SuperH
--#
--
--#
--# ALSA SoC audio for Freescale SOCs
--#
--
--#
--# Open Sound System
--#
--# CONFIG_SOUND_PRIME is not set
--CONFIG_AC97_BUS=y
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--
--#
--# USB Input Devices
--#
--CONFIG_USB_HID=y
--# CONFIG_USB_HIDINPUT_POWERBOOK is not set
--# CONFIG_HID_FF is not set
--# CONFIG_USB_HIDDEV is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--CONFIG_USB=y
--# CONFIG_USB_DEBUG is not set
--# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
--
--#
--# Miscellaneous USB options
--#
--CONFIG_USB_DEVICEFS=y
--CONFIG_USB_DEVICE_CLASS=y
--# CONFIG_USB_DYNAMIC_MINORS is not set
--# CONFIG_USB_OTG is not set
--
--#
--# USB Host Controller Drivers
--#
--CONFIG_USB_EHCI_HCD=y
--# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
--# CONFIG_USB_EHCI_TT_NEWSCHED is not set
--# CONFIG_USB_EHCI_FSL is not set
--CONFIG_USB_EHCI_HCD_PPC_OF=y
--# CONFIG_USB_ISP116X_HCD is not set
--CONFIG_USB_OHCI_HCD=y
--CONFIG_USB_OHCI_HCD_PPC_OF=y
--CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
--CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
--CONFIG_USB_OHCI_HCD_PCI=y
--CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
--CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
--CONFIG_USB_OHCI_LITTLE_ENDIAN=y
--# CONFIG_USB_UHCI_HCD is not set
--# CONFIG_USB_SL811_HCD is not set
--# CONFIG_USB_R8A66597_HCD is not set
--
--#
--# USB Device Class drivers
--#
--# CONFIG_USB_ACM is not set
--# CONFIG_USB_PRINTER is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--
--#
--# may also be needed; see USB_STORAGE Help for more information
--#
--CONFIG_USB_STORAGE=y
--# CONFIG_USB_STORAGE_DEBUG is not set
--# CONFIG_USB_STORAGE_DATAFAB is not set
--# CONFIG_USB_STORAGE_FREECOM is not set
--# CONFIG_USB_STORAGE_ISD200 is not set
--# CONFIG_USB_STORAGE_DPCM is not set
--# CONFIG_USB_STORAGE_USBAT is not set
--# CONFIG_USB_STORAGE_SDDR09 is not set
--# CONFIG_USB_STORAGE_SDDR55 is not set
--# CONFIG_USB_STORAGE_JUMPSHOT is not set
--# CONFIG_USB_STORAGE_ALAUDA is not set
--# CONFIG_USB_STORAGE_KARMA is not set
--# CONFIG_USB_LIBUSUAL is not set
--
--#
--# USB Imaging devices
--#
--# CONFIG_USB_MDC800 is not set
--# CONFIG_USB_MICROTEK is not set
--CONFIG_USB_MON=y
--
--#
--# USB port drivers
--#
--# CONFIG_USB_SERIAL is not set
--
--#
--# USB Miscellaneous drivers
--#
--# CONFIG_USB_EMI62 is not set
--# CONFIG_USB_EMI26 is not set
--# CONFIG_USB_ADUTUX is not set
--# CONFIG_USB_AUERSWALD is not set
--# CONFIG_USB_RIO500 is not set
--# CONFIG_USB_LEGOTOWER is not set
--# CONFIG_USB_LCD is not set
--# CONFIG_USB_BERRY_CHARGE is not set
--# CONFIG_USB_LED is not set
--# CONFIG_USB_CYPRESS_CY7C63 is not set
--# CONFIG_USB_CYTHERM is not set
--# CONFIG_USB_PHIDGET is not set
--# CONFIG_USB_IDMOUSE is not set
--# CONFIG_USB_FTDI_ELAN is not set
--# CONFIG_USB_APPLEDISPLAY is not set
--# CONFIG_USB_SISUSBVGA is not set
--# CONFIG_USB_LD is not set
--# CONFIG_USB_TRANCEVIBRATOR is not set
--# CONFIG_USB_IOWARRIOR is not set
--# CONFIG_USB_TEST is not set
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--CONFIG_RTC_LIB=y
--CONFIG_RTC_CLASS=y
--CONFIG_RTC_HCTOSYS=y
--CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
--# CONFIG_RTC_DEBUG is not set
--
--#
--# RTC interfaces
--#
--CONFIG_RTC_INTF_SYSFS=y
--CONFIG_RTC_INTF_PROC=y
--CONFIG_RTC_INTF_DEV=y
--# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
--# CONFIG_RTC_DRV_TEST is not set
--
--#
--# I2C RTC drivers
--#
--# CONFIG_RTC_DRV_DS1307 is not set
--# CONFIG_RTC_DRV_DS1374 is not set
--# CONFIG_RTC_DRV_DS1672 is not set
--# CONFIG_RTC_DRV_MAX6900 is not set
--# CONFIG_RTC_DRV_RS5C372 is not set
--# CONFIG_RTC_DRV_ISL1208 is not set
--# CONFIG_RTC_DRV_X1205 is not set
--# CONFIG_RTC_DRV_PCF8563 is not set
--# CONFIG_RTC_DRV_PCF8583 is not set
--# CONFIG_RTC_DRV_M41T80 is not set
--# CONFIG_RTC_DRV_S35390A is not set
--
--#
--# SPI RTC drivers
--#
--
--#
--# Platform RTC drivers
--#
--CONFIG_RTC_DRV_CMOS=y
--# CONFIG_RTC_DRV_DS1511 is not set
--# CONFIG_RTC_DRV_DS1553 is not set
--# CONFIG_RTC_DRV_DS1742 is not set
--# CONFIG_RTC_DRV_STK17TA8 is not set
--# CONFIG_RTC_DRV_M48T86 is not set
--# CONFIG_RTC_DRV_M48T59 is not set
--# CONFIG_RTC_DRV_V3020 is not set
--
--#
--# on-CPU RTC drivers
--#
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--CONFIG_ISO9660_FS=m
--CONFIG_JOLIET=y
--CONFIG_ZISOFS=y
--CONFIG_UDF_FS=m
--CONFIG_UDF_NLS=y
--
--#
--# DOS/FAT/NT Filesystems
--#
--CONFIG_FAT_FS=y
--CONFIG_MSDOS_FS=m
--CONFIG_VFAT_FS=y
--CONFIG_FAT_DEFAULT_CODEPAGE=437
--CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
--CONFIG_NTFS_FS=y
--# CONFIG_NTFS_DEBUG is not set
--# CONFIG_NTFS_RW is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--CONFIG_ADFS_FS=m
--# CONFIG_ADFS_FS_RW is not set
--CONFIG_AFFS_FS=m
--CONFIG_HFS_FS=m
--CONFIG_HFSPLUS_FS=m
--CONFIG_BEFS_FS=m
--# CONFIG_BEFS_DEBUG is not set
--CONFIG_BFS_FS=m
--CONFIG_EFS_FS=m
--CONFIG_CRAMFS=y
--CONFIG_VXFS_FS=m
--# CONFIG_MINIX_FS is not set
--CONFIG_HPFS_FS=m
--CONFIG_QNX4FS_FS=m
--# CONFIG_ROMFS_FS is not set
--CONFIG_SYSV_FS=m
--CONFIG_UFS_FS=m
--# CONFIG_UFS_FS_WRITE is not set
--# CONFIG_UFS_DEBUG is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--CONFIG_NFSD=y
--# CONFIG_NFSD_V3 is not set
--CONFIG_NFSD_TCP=y
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_EXPORTFS=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--CONFIG_MAC_PARTITION=y
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_BSD_DISKLABEL is not set
--# CONFIG_MINIX_SUBPARTITION is not set
--# CONFIG_SOLARIS_X86_PARTITION is not set
--# CONFIG_UNIXWARE_DISKLABEL is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--CONFIG_NLS=y
--CONFIG_NLS_DEFAULT="iso8859-1"
--# CONFIG_NLS_CODEPAGE_437 is not set
--# CONFIG_NLS_CODEPAGE_737 is not set
--# CONFIG_NLS_CODEPAGE_775 is not set
--# CONFIG_NLS_CODEPAGE_850 is not set
--# CONFIG_NLS_CODEPAGE_852 is not set
--# CONFIG_NLS_CODEPAGE_855 is not set
--# CONFIG_NLS_CODEPAGE_857 is not set
--# CONFIG_NLS_CODEPAGE_860 is not set
--# CONFIG_NLS_CODEPAGE_861 is not set
--# CONFIG_NLS_CODEPAGE_862 is not set
--# CONFIG_NLS_CODEPAGE_863 is not set
--# CONFIG_NLS_CODEPAGE_864 is not set
--# CONFIG_NLS_CODEPAGE_865 is not set
--# CONFIG_NLS_CODEPAGE_866 is not set
--# CONFIG_NLS_CODEPAGE_869 is not set
--# CONFIG_NLS_CODEPAGE_936 is not set
--# CONFIG_NLS_CODEPAGE_950 is not set
--# CONFIG_NLS_CODEPAGE_932 is not set
--# CONFIG_NLS_CODEPAGE_949 is not set
--# CONFIG_NLS_CODEPAGE_874 is not set
--# CONFIG_NLS_ISO8859_8 is not set
--# CONFIG_NLS_CODEPAGE_1250 is not set
--# CONFIG_NLS_CODEPAGE_1251 is not set
--# CONFIG_NLS_ASCII is not set
--# CONFIG_NLS_ISO8859_1 is not set
--# CONFIG_NLS_ISO8859_2 is not set
--# CONFIG_NLS_ISO8859_3 is not set
--# CONFIG_NLS_ISO8859_4 is not set
--# CONFIG_NLS_ISO8859_5 is not set
--# CONFIG_NLS_ISO8859_6 is not set
--# CONFIG_NLS_ISO8859_7 is not set
--# CONFIG_NLS_ISO8859_9 is not set
--# CONFIG_NLS_ISO8859_13 is not set
--# CONFIG_NLS_ISO8859_14 is not set
--# CONFIG_NLS_ISO8859_15 is not set
--# CONFIG_NLS_KOI8_R is not set
--# CONFIG_NLS_KOI8_U is not set
--CONFIG_NLS_UTF8=m
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--CONFIG_LIBCRC32C=m
--CONFIG_ZLIB_INFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_HIGHMEM is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--CONFIG_DEBUG_INFO=y
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_HASH=y
--CONFIG_CRYPTO_MANAGER=y
--CONFIG_CRYPTO_HMAC=y
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--CONFIG_CRYPTO_SHA1=m
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/mpc8560_ads_defconfig
-+++ /dev/null
-@@ -1,885 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:27 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_ALL is not set
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--# CONFIG_MODULES is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--# CONFIG_MPC8540_ADS is not set
--CONFIG_MPC8560_ADS=y
--# CONFIG_MPC85xx_CDS is not set
--# CONFIG_MPC85xx_MDS is not set
--# CONFIG_MPC85xx_DS is not set
--# CONFIG_STX_GP3 is not set
--# CONFIG_TQM8540 is not set
--# CONFIG_TQM8541 is not set
--# CONFIG_TQM8555 is not set
--# CONFIG_TQM8560 is not set
--# CONFIG_SBC8548 is not set
--# CONFIG_SBC8560 is not set
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--CONFIG_CPM2=y
--CONFIG_PPC_CPM_NEW_BINDING=y
--# CONFIG_FSL_ULI1575 is not set
--CONFIG_CPM=y
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--CONFIG_BINFMT_MISC=y
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--# CONFIG_PROC_DEVICETREE is not set
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--# CONFIG_SECCOMP is not set
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_FSL_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--CONFIG_PCI_DEBUG=y
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--CONFIG_MARVELL_PHY=y
--CONFIG_DAVICOM_PHY=y
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_FS_ENET=y
--# CONFIG_FS_ENET_HAS_SCC is not set
--CONFIG_FS_ENET_HAS_FCC=y
--# CONFIG_FS_ENET_MDIO_FCC is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--CONFIG_E1000=y
--CONFIG_E1000_NAPI=y
--# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--# CONFIG_SERIAL_8250 is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--CONFIG_SERIAL_CPM=y
--CONFIG_SERIAL_CPM_CONSOLE=y
--CONFIG_SERIAL_CPM_SCC1=y
--CONFIG_SERIAL_CPM_SCC2=y
--# CONFIG_SERIAL_CPM_SCC3 is not set
--# CONFIG_SERIAL_CPM_SCC4 is not set
--# CONFIG_SERIAL_CPM_SMC1 is not set
--# CONFIG_SERIAL_CPM_SMC2 is not set
--# CONFIG_SERIAL_JSM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=y
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--# CONFIG_NFS_V3 is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--# CONFIG_MSDOS_PARTITION is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--CONFIG_DEBUG_MUTEXES=y
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_KGDB_CONSOLE is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--# CONFIG_CRYPTO_SEQIV is not set
--# CONFIG_CRYPTO_MANAGER is not set
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--# CONFIG_CRYPTO_MD5 is not set
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--# CONFIG_CRYPTO_CBC is not set
--# CONFIG_CRYPTO_PCBC is not set
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--# CONFIG_CRYPTO_DES is not set
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
--CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/mpc8568mds_defconfig
-+++ /dev/null
-@@ -1,1117 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc7
--# Mon Mar 31 11:37:05 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--# CONFIG_MPC8540_ADS is not set
--# CONFIG_MPC8560_ADS is not set
--# CONFIG_MPC85xx_CDS is not set
--CONFIG_MPC85xx_MDS=y
--# CONFIG_MPC85xx_DS is not set
--# CONFIG_STX_GP3 is not set
--# CONFIG_TQM8540 is not set
--# CONFIG_TQM8541 is not set
--# CONFIG_TQM8555 is not set
--# CONFIG_TQM8560 is not set
--# CONFIG_SBC8548 is not set
--# CONFIG_SBC8560 is not set
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--CONFIG_QUICC_ENGINE=y
--# CONFIG_CPM2 is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_FSL_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--# CONFIG_BLK_DEV_SD is not set
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--# CONFIG_CHR_DEV_SG is not set
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--# CONFIG_SCSI_SPI_ATTRS is not set
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_MVSAS is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--CONFIG_MARVELL_PHY=y
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_UCC_GETH is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--# CONFIG_SERIAL_QE is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--# CONFIG_SENSORS_LM75 is not set
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--# CONFIG_BOOKE_WDT is not set
--
--#
--# PCI-based Watchdog Cards
--#
--# CONFIG_PCIPCWATCHDOG is not set
--# CONFIG_WDTPCI is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--CONFIG_RTC_LIB=y
--CONFIG_RTC_CLASS=y
--CONFIG_RTC_HCTOSYS=y
--CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
--# CONFIG_RTC_DEBUG is not set
--
--#
--# RTC interfaces
--#
--CONFIG_RTC_INTF_SYSFS=y
--CONFIG_RTC_INTF_PROC=y
--CONFIG_RTC_INTF_DEV=y
--# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
--# CONFIG_RTC_DRV_TEST is not set
--
--#
--# I2C RTC drivers
--#
--# CONFIG_RTC_DRV_DS1307 is not set
--CONFIG_RTC_DRV_DS1374=y
--# CONFIG_RTC_DRV_DS1672 is not set
--# CONFIG_RTC_DRV_MAX6900 is not set
--# CONFIG_RTC_DRV_RS5C372 is not set
--# CONFIG_RTC_DRV_ISL1208 is not set
--# CONFIG_RTC_DRV_X1205 is not set
--# CONFIG_RTC_DRV_PCF8563 is not set
--# CONFIG_RTC_DRV_PCF8583 is not set
--# CONFIG_RTC_DRV_M41T80 is not set
--# CONFIG_RTC_DRV_S35390A is not set
--
--#
--# SPI RTC drivers
--#
--
--#
--# Platform RTC drivers
--#
--# CONFIG_RTC_DRV_CMOS is not set
--# CONFIG_RTC_DRV_DS1511 is not set
--# CONFIG_RTC_DRV_DS1553 is not set
--# CONFIG_RTC_DRV_DS1742 is not set
--# CONFIG_RTC_DRV_STK17TA8 is not set
--# CONFIG_RTC_DRV_M48T86 is not set
--# CONFIG_RTC_DRV_M48T59 is not set
--# CONFIG_RTC_DRV_V3020 is not set
--
--#
--# on-CPU RTC drivers
--#
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--# CONFIG_MSDOS_PARTITION is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--CONFIG_DEBUGGER=y
--# CONFIG_XMON is not set
--# CONFIG_BDI_SWITCH is not set
--CONFIG_PPC_EARLY_DEBUG=y
--# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
--# CONFIG_PPC_EARLY_DEBUG_G5 is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
--# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
--# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
--# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
--# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
--# CONFIG_PPC_EARLY_DEBUG_44x is not set
--# CONFIG_PPC_EARLY_DEBUG_40x is not set
--# CONFIG_PPC_EARLY_DEBUG_CPM is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
--CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/mpc8572_ds_defconfig
-+++ /dev/null
-@@ -1,1549 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc7
--# Mon Mar 31 11:37:06 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--CONFIG_BSD_PROCESS_ACCT=y
--# CONFIG_BSD_PROCESS_ACCT_V3 is not set
--# CONFIG_TASKSTATS is not set
--CONFIG_AUDIT=y
--# CONFIG_AUDITSYSCALL is not set
--CONFIG_IKCONFIG=y
--CONFIG_IKCONFIG_PROC=y
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--CONFIG_KALLSYMS_ALL=y
--CONFIG_KALLSYMS_EXTRA_PASS=y
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--CONFIG_MODULE_FORCE_UNLOAD=y
--CONFIG_MODVERSIONS=y
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--CONFIG_LBD=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--# CONFIG_DEFAULT_AS is not set
--# CONFIG_DEFAULT_DEADLINE is not set
--CONFIG_DEFAULT_CFQ=y
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="cfq"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--# CONFIG_MPC8540_ADS is not set
--# CONFIG_MPC8560_ADS is not set
--# CONFIG_MPC85xx_CDS is not set
--# CONFIG_MPC85xx_MDS is not set
--CONFIG_MPC85xx_DS=y
--# CONFIG_STX_GP3 is not set
--# CONFIG_TQM8540 is not set
--# CONFIG_TQM8541 is not set
--# CONFIG_TQM8555 is not set
--# CONFIG_TQM8560 is not set
--# CONFIG_SBC8548 is not set
--# CONFIG_SBC8560 is not set
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--CONFIG_PPC_I8259=y
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_CPM2 is not set
--CONFIG_FSL_ULI1575=y
--
--#
--# Kernel options
--#
--CONFIG_HIGHMEM=y
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--CONFIG_BINFMT_MISC=m
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_FSL_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--CONFIG_XFRM_USER=y
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--CONFIG_NET_KEY=m
--# CONFIG_NET_KEY_MIGRATE is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--CONFIG_IP_ADVANCED_ROUTER=y
--CONFIG_ASK_IP_FIB_HASH=y
--# CONFIG_IP_FIB_TRIE is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_MULTIPLE_TABLES=y
--CONFIG_IP_ROUTE_MULTIPATH=y
--CONFIG_IP_ROUTE_VERBOSE=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--CONFIG_IP_PNP_RARP=y
--CONFIG_NET_IPIP=y
--CONFIG_NET_IPGRE=y
--CONFIG_NET_IPGRE_BROADCAST=y
--CONFIG_IP_MROUTE=y
--CONFIG_IP_PIMSM_V1=y
--CONFIG_IP_PIMSM_V2=y
--CONFIG_ARPD=y
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--CONFIG_INET_TUNNEL=y
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--CONFIG_IPV6=y
--# CONFIG_IPV6_PRIVACY is not set
--# CONFIG_IPV6_ROUTER_PREF is not set
--# CONFIG_IPV6_OPTIMISTIC_DAD is not set
--# CONFIG_INET6_AH is not set
--# CONFIG_INET6_ESP is not set
--# CONFIG_INET6_IPCOMP is not set
--# CONFIG_IPV6_MIP6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--CONFIG_INET6_XFRM_MODE_TRANSPORT=y
--CONFIG_INET6_XFRM_MODE_TUNNEL=y
--CONFIG_INET6_XFRM_MODE_BEET=y
--# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
--CONFIG_IPV6_SIT=y
--# CONFIG_IPV6_TUNNEL is not set
--# CONFIG_IPV6_MULTIPLE_TABLES is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--CONFIG_IP_SCTP=m
--# CONFIG_SCTP_DBG_MSG is not set
--# CONFIG_SCTP_DBG_OBJCNT is not set
--# CONFIG_SCTP_HMAC_NONE is not set
--# CONFIG_SCTP_HMAC_SHA1 is not set
--CONFIG_SCTP_HMAC_MD5=y
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--CONFIG_FIB_RULES=y
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--CONFIG_BLK_DEV_NBD=y
--# CONFIG_BLK_DEV_SX8 is not set
--# CONFIG_BLK_DEV_UB is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=131072
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--CONFIG_BLK_DEV_SD=y
--CONFIG_CHR_DEV_ST=y
--# CONFIG_CHR_DEV_OSST is not set
--CONFIG_BLK_DEV_SR=y
--# CONFIG_BLK_DEV_SR_VENDOR is not set
--CONFIG_CHR_DEV_SG=y
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--CONFIG_SCSI_MULTI_LUN=y
--# CONFIG_SCSI_CONSTANTS is not set
--CONFIG_SCSI_LOGGING=y
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--# CONFIG_SCSI_SPI_ATTRS is not set
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_MVSAS is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_IPR is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--CONFIG_ATA=y
--# CONFIG_ATA_NONSTANDARD is not set
--CONFIG_SATA_AHCI=y
--# CONFIG_SATA_SVW is not set
--# CONFIG_ATA_PIIX is not set
--# CONFIG_SATA_MV is not set
--# CONFIG_SATA_NV is not set
--# CONFIG_PDC_ADMA is not set
--# CONFIG_SATA_QSTOR is not set
--# CONFIG_SATA_PROMISE is not set
--# CONFIG_SATA_SX4 is not set
--# CONFIG_SATA_SIL is not set
--# CONFIG_SATA_SIL24 is not set
--# CONFIG_SATA_SIS is not set
--# CONFIG_SATA_ULI is not set
--# CONFIG_SATA_VIA is not set
--# CONFIG_SATA_VITESSE is not set
--# CONFIG_SATA_INIC162X is not set
--# CONFIG_SATA_FSL is not set
--CONFIG_PATA_ALI=y
--# CONFIG_PATA_AMD is not set
--# CONFIG_PATA_ARTOP is not set
--# CONFIG_PATA_ATIIXP is not set
--# CONFIG_PATA_CMD640_PCI is not set
--# CONFIG_PATA_CMD64X is not set
--# CONFIG_PATA_CS5520 is not set
--# CONFIG_PATA_CS5530 is not set
--# CONFIG_PATA_CYPRESS is not set
--# CONFIG_PATA_EFAR is not set
--# CONFIG_ATA_GENERIC is not set
--# CONFIG_PATA_HPT366 is not set
--# CONFIG_PATA_HPT37X is not set
--# CONFIG_PATA_HPT3X2N is not set
--# CONFIG_PATA_HPT3X3 is not set
--# CONFIG_PATA_IT821X is not set
--# CONFIG_PATA_IT8213 is not set
--# CONFIG_PATA_JMICRON is not set
--# CONFIG_PATA_TRIFLEX is not set
--# CONFIG_PATA_MARVELL is not set
--# CONFIG_PATA_MPIIX is not set
--# CONFIG_PATA_OLDPIIX is not set
--# CONFIG_PATA_NETCELL is not set
--# CONFIG_PATA_NINJA32 is not set
--# CONFIG_PATA_NS87410 is not set
--# CONFIG_PATA_NS87415 is not set
--# CONFIG_PATA_OPTI is not set
--# CONFIG_PATA_OPTIDMA is not set
--# CONFIG_PATA_PDC_OLD is not set
--# CONFIG_PATA_RADISYS is not set
--# CONFIG_PATA_RZ1000 is not set
--# CONFIG_PATA_SC1200 is not set
--# CONFIG_PATA_SERVERWORKS is not set
--# CONFIG_PATA_PDC2027X is not set
--# CONFIG_PATA_SIL680 is not set
--# CONFIG_PATA_SIS is not set
--# CONFIG_PATA_VIA is not set
--# CONFIG_PATA_WINBOND is not set
--# CONFIG_PATA_PLATFORM is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--CONFIG_DUMMY=y
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--CONFIG_VITESSE_PHY=y
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--
--#
--# USB Network Adapters
--#
--# CONFIG_USB_CATC is not set
--# CONFIG_USB_KAWETH is not set
--# CONFIG_USB_PEGASUS is not set
--# CONFIG_USB_RTL8150 is not set
--# CONFIG_USB_USBNET is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--CONFIG_SERIO=y
--CONFIG_SERIO_I8042=y
--CONFIG_SERIO_SERPORT=y
--# CONFIG_SERIO_PCIPS2 is not set
--CONFIG_SERIO_LIBPS2=y
--# CONFIG_SERIO_RAW is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--CONFIG_VT=y
--CONFIG_VT_CONSOLE=y
--CONFIG_HW_CONSOLE=y
--# CONFIG_VT_HW_CONSOLE_BINDING is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=2
--CONFIG_SERIAL_8250_RUNTIME_UARTS=2
--CONFIG_SERIAL_8250_EXTENDED=y
--CONFIG_SERIAL_8250_MANY_PORTS=y
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--CONFIG_SERIAL_8250_DETECT_IRQ=y
--CONFIG_SERIAL_8250_RSA=y
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--CONFIG_NVRAM=y
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--# CONFIG_I2C_CHARDEV is not set
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_TINY_USB is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--CONFIG_SENSORS_EEPROM=y
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--CONFIG_DVB_CORE=m
--# CONFIG_DVB_CORE_ATTACH is not set
--CONFIG_DVB_CAPTURE_DRIVERS=y
--
--#
--# Supported SAA7146 based PCI Adapters
--#
--# CONFIG_TTPCI_EEPROM is not set
--# CONFIG_DVB_BUDGET_CORE is not set
--
--#
--# Supported USB Adapters
--#
--# CONFIG_DVB_USB is not set
--# CONFIG_DVB_TTUSB_BUDGET is not set
--# CONFIG_DVB_TTUSB_DEC is not set
--# CONFIG_DVB_CINERGYT2 is not set
--
--#
--# Supported FlexCopII (B2C2) Adapters
--#
--# CONFIG_DVB_B2C2_FLEXCOP is not set
--
--#
--# Supported BT878 Adapters
--#
--
--#
--# Supported Pluto2 Adapters
--#
--# CONFIG_DVB_PLUTO2 is not set
--
--#
--# Supported DVB Frontends
--#
--
--#
--# Customise DVB Frontends
--#
--# CONFIG_DVB_FE_CUSTOMISE is not set
--
--#
--# DVB-S (satellite) frontends
--#
--# CONFIG_DVB_STV0299 is not set
--# CONFIG_DVB_CX24110 is not set
--# CONFIG_DVB_CX24123 is not set
--# CONFIG_DVB_TDA8083 is not set
--# CONFIG_DVB_MT312 is not set
--# CONFIG_DVB_VES1X93 is not set
--# CONFIG_DVB_S5H1420 is not set
--# CONFIG_DVB_TDA10086 is not set
--
--#
--# DVB-T (terrestrial) frontends
--#
--# CONFIG_DVB_SP8870 is not set
--# CONFIG_DVB_SP887X is not set
--# CONFIG_DVB_CX22700 is not set
--# CONFIG_DVB_CX22702 is not set
--# CONFIG_DVB_L64781 is not set
--# CONFIG_DVB_TDA1004X is not set
--# CONFIG_DVB_NXT6000 is not set
--# CONFIG_DVB_MT352 is not set
--# CONFIG_DVB_ZL10353 is not set
--# CONFIG_DVB_DIB3000MB is not set
--# CONFIG_DVB_DIB3000MC is not set
--# CONFIG_DVB_DIB7000M is not set
--# CONFIG_DVB_DIB7000P is not set
--
--#
--# DVB-C (cable) frontends
--#
--# CONFIG_DVB_VES1820 is not set
--# CONFIG_DVB_TDA10021 is not set
--# CONFIG_DVB_TDA10023 is not set
--# CONFIG_DVB_STV0297 is not set
--
--#
--# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
--#
--# CONFIG_DVB_NXT200X is not set
--# CONFIG_DVB_OR51211 is not set
--# CONFIG_DVB_OR51132 is not set
--# CONFIG_DVB_BCM3510 is not set
--# CONFIG_DVB_LGDT330X is not set
--# CONFIG_DVB_S5H1409 is not set
--
--#
--# Tuners/PLL support
--#
--# CONFIG_DVB_PLL is not set
--# CONFIG_DVB_TDA826X is not set
--# CONFIG_DVB_TDA827X is not set
--# CONFIG_DVB_TDA18271 is not set
--# CONFIG_DVB_TUNER_QT1010 is not set
--# CONFIG_DVB_TUNER_MT2060 is not set
--# CONFIG_DVB_TUNER_MT2266 is not set
--# CONFIG_DVB_TUNER_MT2131 is not set
--# CONFIG_DVB_TUNER_DIB0070 is not set
--# CONFIG_DVB_TUNER_XC5000 is not set
--
--#
--# Miscellaneous devices
--#
--# CONFIG_DVB_LNBP21 is not set
--# CONFIG_DVB_ISL6421 is not set
--# CONFIG_DVB_TUA6100 is not set
--CONFIG_DAB=y
--# CONFIG_USB_DABUSB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=y
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Console display driver support
--#
--CONFIG_VGA_CONSOLE=y
--# CONFIG_VGACON_SOFT_SCROLLBACK is not set
--CONFIG_DUMMY_CONSOLE=y
--
--#
--# Sound
--#
--CONFIG_SOUND=y
--
--#
--# Advanced Linux Sound Architecture
--#
--CONFIG_SND=y
--CONFIG_SND_TIMER=y
--CONFIG_SND_PCM=y
--# CONFIG_SND_SEQUENCER is not set
--# CONFIG_SND_MIXER_OSS is not set
--# CONFIG_SND_PCM_OSS is not set
--# CONFIG_SND_DYNAMIC_MINORS is not set
--CONFIG_SND_SUPPORT_OLD_API=y
--CONFIG_SND_VERBOSE_PROCFS=y
--# CONFIG_SND_VERBOSE_PRINTK is not set
--# CONFIG_SND_DEBUG is not set
--
--#
--# Generic devices
--#
--CONFIG_SND_AC97_CODEC=y
--# CONFIG_SND_DUMMY is not set
--# CONFIG_SND_MTPAV is not set
--# CONFIG_SND_SERIAL_U16550 is not set
--# CONFIG_SND_MPU401 is not set
--
--#
--# PCI devices
--#
--# CONFIG_SND_AD1889 is not set
--# CONFIG_SND_ALS300 is not set
--# CONFIG_SND_ALS4000 is not set
--# CONFIG_SND_ALI5451 is not set
--# CONFIG_SND_ATIIXP is not set
--# CONFIG_SND_ATIIXP_MODEM is not set
--# CONFIG_SND_AU8810 is not set
--# CONFIG_SND_AU8820 is not set
--# CONFIG_SND_AU8830 is not set
--# CONFIG_SND_AZT3328 is not set
--# CONFIG_SND_BT87X is not set
--# CONFIG_SND_CA0106 is not set
--# CONFIG_SND_CMIPCI is not set
--# CONFIG_SND_OXYGEN is not set
--# CONFIG_SND_CS4281 is not set
--# CONFIG_SND_CS46XX is not set
--# CONFIG_SND_CS5530 is not set
--# CONFIG_SND_DARLA20 is not set
--# CONFIG_SND_GINA20 is not set
--# CONFIG_SND_LAYLA20 is not set
--# CONFIG_SND_DARLA24 is not set
--# CONFIG_SND_GINA24 is not set
--# CONFIG_SND_LAYLA24 is not set
--# CONFIG_SND_MONA is not set
--# CONFIG_SND_MIA is not set
--# CONFIG_SND_ECHO3G is not set
--# CONFIG_SND_INDIGO is not set
--# CONFIG_SND_INDIGOIO is not set
--# CONFIG_SND_INDIGODJ is not set
--# CONFIG_SND_EMU10K1 is not set
--# CONFIG_SND_EMU10K1X is not set
--# CONFIG_SND_ENS1370 is not set
--# CONFIG_SND_ENS1371 is not set
--# CONFIG_SND_ES1938 is not set
--# CONFIG_SND_ES1968 is not set
--# CONFIG_SND_FM801 is not set
--# CONFIG_SND_HDA_INTEL is not set
--# CONFIG_SND_HDSP is not set
--# CONFIG_SND_HDSPM is not set
--# CONFIG_SND_HIFIER is not set
--# CONFIG_SND_ICE1712 is not set
--# CONFIG_SND_ICE1724 is not set
--CONFIG_SND_INTEL8X0=y
--# CONFIG_SND_INTEL8X0M is not set
--# CONFIG_SND_KORG1212 is not set
--# CONFIG_SND_MAESTRO3 is not set
--# CONFIG_SND_MIXART is not set
--# CONFIG_SND_NM256 is not set
--# CONFIG_SND_PCXHR is not set
--# CONFIG_SND_RIPTIDE is not set
--# CONFIG_SND_RME32 is not set
--# CONFIG_SND_RME96 is not set
--# CONFIG_SND_RME9652 is not set
--# CONFIG_SND_SONICVIBES is not set
--# CONFIG_SND_TRIDENT is not set
--# CONFIG_SND_VIA82XX is not set
--# CONFIG_SND_VIA82XX_MODEM is not set
--# CONFIG_SND_VIRTUOSO is not set
--# CONFIG_SND_VX222 is not set
--# CONFIG_SND_YMFPCI is not set
--# CONFIG_SND_AC97_POWER_SAVE is not set
--
--#
--# ALSA PowerMac devices
--#
--
--#
--# ALSA PowerPC devices
--#
--
--#
--# USB devices
--#
--# CONFIG_SND_USB_AUDIO is not set
--# CONFIG_SND_USB_USX2Y is not set
--# CONFIG_SND_USB_CAIAQ is not set
--
--#
--# System on Chip audio support
--#
--# CONFIG_SND_SOC is not set
--
--#
--# SoC Audio support for SuperH
--#
--
--#
--# ALSA SoC audio for Freescale SOCs
--#
--
--#
--# Open Sound System
--#
--# CONFIG_SOUND_PRIME is not set
--CONFIG_AC97_BUS=y
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--
--#
--# USB Input Devices
--#
--CONFIG_USB_HID=y
--# CONFIG_USB_HIDINPUT_POWERBOOK is not set
--# CONFIG_HID_FF is not set
--# CONFIG_USB_HIDDEV is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--CONFIG_USB=y
--# CONFIG_USB_DEBUG is not set
--# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
--
--#
--# Miscellaneous USB options
--#
--CONFIG_USB_DEVICEFS=y
--CONFIG_USB_DEVICE_CLASS=y
--# CONFIG_USB_DYNAMIC_MINORS is not set
--# CONFIG_USB_OTG is not set
--
--#
--# USB Host Controller Drivers
--#
--CONFIG_USB_EHCI_HCD=y
--# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
--# CONFIG_USB_EHCI_TT_NEWSCHED is not set
--# CONFIG_USB_EHCI_FSL is not set
--CONFIG_USB_EHCI_HCD_PPC_OF=y
--# CONFIG_USB_ISP116X_HCD is not set
--CONFIG_USB_OHCI_HCD=y
--CONFIG_USB_OHCI_HCD_PPC_OF=y
--CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
--CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
--CONFIG_USB_OHCI_HCD_PCI=y
--CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
--CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
--CONFIG_USB_OHCI_LITTLE_ENDIAN=y
--# CONFIG_USB_UHCI_HCD is not set
--# CONFIG_USB_SL811_HCD is not set
--# CONFIG_USB_R8A66597_HCD is not set
--
--#
--# USB Device Class drivers
--#
--# CONFIG_USB_ACM is not set
--# CONFIG_USB_PRINTER is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--
--#
--# may also be needed; see USB_STORAGE Help for more information
--#
--CONFIG_USB_STORAGE=y
--# CONFIG_USB_STORAGE_DEBUG is not set
--# CONFIG_USB_STORAGE_DATAFAB is not set
--# CONFIG_USB_STORAGE_FREECOM is not set
--# CONFIG_USB_STORAGE_ISD200 is not set
--# CONFIG_USB_STORAGE_DPCM is not set
--# CONFIG_USB_STORAGE_USBAT is not set
--# CONFIG_USB_STORAGE_SDDR09 is not set
--# CONFIG_USB_STORAGE_SDDR55 is not set
--# CONFIG_USB_STORAGE_JUMPSHOT is not set
--# CONFIG_USB_STORAGE_ALAUDA is not set
--# CONFIG_USB_STORAGE_KARMA is not set
--# CONFIG_USB_LIBUSUAL is not set
--
--#
--# USB Imaging devices
--#
--# CONFIG_USB_MDC800 is not set
--# CONFIG_USB_MICROTEK is not set
--CONFIG_USB_MON=y
--
--#
--# USB port drivers
--#
--# CONFIG_USB_SERIAL is not set
--
--#
--# USB Miscellaneous drivers
--#
--# CONFIG_USB_EMI62 is not set
--# CONFIG_USB_EMI26 is not set
--# CONFIG_USB_ADUTUX is not set
--# CONFIG_USB_AUERSWALD is not set
--# CONFIG_USB_RIO500 is not set
--# CONFIG_USB_LEGOTOWER is not set
--# CONFIG_USB_LCD is not set
--# CONFIG_USB_BERRY_CHARGE is not set
--# CONFIG_USB_LED is not set
--# CONFIG_USB_CYPRESS_CY7C63 is not set
--# CONFIG_USB_CYTHERM is not set
--# CONFIG_USB_PHIDGET is not set
--# CONFIG_USB_IDMOUSE is not set
--# CONFIG_USB_FTDI_ELAN is not set
--# CONFIG_USB_APPLEDISPLAY is not set
--# CONFIG_USB_SISUSBVGA is not set
--# CONFIG_USB_LD is not set
--# CONFIG_USB_TRANCEVIBRATOR is not set
--# CONFIG_USB_IOWARRIOR is not set
--# CONFIG_USB_TEST is not set
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--CONFIG_RTC_LIB=y
--CONFIG_RTC_CLASS=y
--CONFIG_RTC_HCTOSYS=y
--CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
--# CONFIG_RTC_DEBUG is not set
--
--#
--# RTC interfaces
--#
--CONFIG_RTC_INTF_SYSFS=y
--CONFIG_RTC_INTF_PROC=y
--CONFIG_RTC_INTF_DEV=y
--# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
--# CONFIG_RTC_DRV_TEST is not set
--
--#
--# I2C RTC drivers
--#
--# CONFIG_RTC_DRV_DS1307 is not set
--# CONFIG_RTC_DRV_DS1374 is not set
--# CONFIG_RTC_DRV_DS1672 is not set
--# CONFIG_RTC_DRV_MAX6900 is not set
--# CONFIG_RTC_DRV_RS5C372 is not set
--# CONFIG_RTC_DRV_ISL1208 is not set
--# CONFIG_RTC_DRV_X1205 is not set
--# CONFIG_RTC_DRV_PCF8563 is not set
--# CONFIG_RTC_DRV_PCF8583 is not set
--# CONFIG_RTC_DRV_M41T80 is not set
--# CONFIG_RTC_DRV_S35390A is not set
--
--#
--# SPI RTC drivers
--#
--
--#
--# Platform RTC drivers
--#
--CONFIG_RTC_DRV_CMOS=y
--# CONFIG_RTC_DRV_DS1511 is not set
--# CONFIG_RTC_DRV_DS1553 is not set
--# CONFIG_RTC_DRV_DS1742 is not set
--# CONFIG_RTC_DRV_STK17TA8 is not set
--# CONFIG_RTC_DRV_M48T86 is not set
--# CONFIG_RTC_DRV_M48T59 is not set
--# CONFIG_RTC_DRV_V3020 is not set
--
--#
--# on-CPU RTC drivers
--#
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--CONFIG_ISO9660_FS=m
--CONFIG_JOLIET=y
--CONFIG_ZISOFS=y
--CONFIG_UDF_FS=m
--CONFIG_UDF_NLS=y
--
--#
--# DOS/FAT/NT Filesystems
--#
--CONFIG_FAT_FS=y
--CONFIG_MSDOS_FS=m
--CONFIG_VFAT_FS=y
--CONFIG_FAT_DEFAULT_CODEPAGE=437
--CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
--CONFIG_NTFS_FS=y
--# CONFIG_NTFS_DEBUG is not set
--# CONFIG_NTFS_RW is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--CONFIG_ADFS_FS=m
--# CONFIG_ADFS_FS_RW is not set
--CONFIG_AFFS_FS=m
--CONFIG_HFS_FS=m
--CONFIG_HFSPLUS_FS=m
--CONFIG_BEFS_FS=m
--# CONFIG_BEFS_DEBUG is not set
--CONFIG_BFS_FS=m
--CONFIG_EFS_FS=m
--CONFIG_CRAMFS=y
--CONFIG_VXFS_FS=m
--# CONFIG_MINIX_FS is not set
--CONFIG_HPFS_FS=m
--CONFIG_QNX4FS_FS=m
--# CONFIG_ROMFS_FS is not set
--CONFIG_SYSV_FS=m
--CONFIG_UFS_FS=m
--# CONFIG_UFS_FS_WRITE is not set
--# CONFIG_UFS_DEBUG is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--CONFIG_NFSD=y
--# CONFIG_NFSD_V3 is not set
--CONFIG_NFSD_TCP=y
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_EXPORTFS=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--CONFIG_MAC_PARTITION=y
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_BSD_DISKLABEL is not set
--# CONFIG_MINIX_SUBPARTITION is not set
--# CONFIG_SOLARIS_X86_PARTITION is not set
--# CONFIG_UNIXWARE_DISKLABEL is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--CONFIG_NLS=y
--CONFIG_NLS_DEFAULT="iso8859-1"
--# CONFIG_NLS_CODEPAGE_437 is not set
--# CONFIG_NLS_CODEPAGE_737 is not set
--# CONFIG_NLS_CODEPAGE_775 is not set
--# CONFIG_NLS_CODEPAGE_850 is not set
--# CONFIG_NLS_CODEPAGE_852 is not set
--# CONFIG_NLS_CODEPAGE_855 is not set
--# CONFIG_NLS_CODEPAGE_857 is not set
--# CONFIG_NLS_CODEPAGE_860 is not set
--# CONFIG_NLS_CODEPAGE_861 is not set
--# CONFIG_NLS_CODEPAGE_862 is not set
--# CONFIG_NLS_CODEPAGE_863 is not set
--# CONFIG_NLS_CODEPAGE_864 is not set
--# CONFIG_NLS_CODEPAGE_865 is not set
--# CONFIG_NLS_CODEPAGE_866 is not set
--# CONFIG_NLS_CODEPAGE_869 is not set
--# CONFIG_NLS_CODEPAGE_936 is not set
--# CONFIG_NLS_CODEPAGE_950 is not set
--# CONFIG_NLS_CODEPAGE_932 is not set
--# CONFIG_NLS_CODEPAGE_949 is not set
--# CONFIG_NLS_CODEPAGE_874 is not set
--# CONFIG_NLS_ISO8859_8 is not set
--# CONFIG_NLS_CODEPAGE_1250 is not set
--# CONFIG_NLS_CODEPAGE_1251 is not set
--# CONFIG_NLS_ASCII is not set
--# CONFIG_NLS_ISO8859_1 is not set
--# CONFIG_NLS_ISO8859_2 is not set
--# CONFIG_NLS_ISO8859_3 is not set
--# CONFIG_NLS_ISO8859_4 is not set
--# CONFIG_NLS_ISO8859_5 is not set
--# CONFIG_NLS_ISO8859_6 is not set
--# CONFIG_NLS_ISO8859_7 is not set
--# CONFIG_NLS_ISO8859_9 is not set
--# CONFIG_NLS_ISO8859_13 is not set
--# CONFIG_NLS_ISO8859_14 is not set
--# CONFIG_NLS_ISO8859_15 is not set
--# CONFIG_NLS_KOI8_R is not set
--# CONFIG_NLS_KOI8_U is not set
--CONFIG_NLS_UTF8=m
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--CONFIG_LIBCRC32C=m
--CONFIG_ZLIB_INFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_HIGHMEM is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--CONFIG_DEBUG_INFO=y
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_HASH=y
--CONFIG_CRYPTO_MANAGER=y
--CONFIG_CRYPTO_HMAC=y
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--CONFIG_CRYPTO_SHA1=m
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/mpc85xx_cds_defconfig
-+++ /dev/null
-@@ -1,935 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:30 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_ALL is not set
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--# CONFIG_MODULES is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--# CONFIG_MPC8540_ADS is not set
--# CONFIG_MPC8560_ADS is not set
--CONFIG_MPC85xx_CDS=y
--# CONFIG_MPC85xx_MDS is not set
--# CONFIG_MPC85xx_DS is not set
--# CONFIG_STX_GP3 is not set
--# CONFIG_TQM8540 is not set
--# CONFIG_TQM8541 is not set
--# CONFIG_TQM8555 is not set
--# CONFIG_TQM8560 is not set
--# CONFIG_SBC8548 is not set
--# CONFIG_SBC8560 is not set
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--CONFIG_PPC_I8259=y
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_CPM2 is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--CONFIG_BINFMT_MISC=y
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--# CONFIG_SECCOMP is not set
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_FSL_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--CONFIG_XFRM_USER=y
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--CONFIG_IDE=y
--CONFIG_IDE_MAX_HWIFS=4
--CONFIG_BLK_DEV_IDE=y
--
--#
--# Please see Documentation/ide/ide.txt for help/info on IDE drives
--#
--# CONFIG_BLK_DEV_IDE_SATA is not set
--# CONFIG_BLK_DEV_IDEDISK is not set
--# CONFIG_IDEDISK_MULTI_MODE is not set
--# CONFIG_BLK_DEV_IDECD is not set
--# CONFIG_BLK_DEV_IDETAPE is not set
--# CONFIG_BLK_DEV_IDEFLOPPY is not set
--# CONFIG_IDE_TASK_IOCTL is not set
--CONFIG_IDE_PROC_FS=y
--
--#
--# IDE chipset support/bugfixes
--#
--CONFIG_IDE_GENERIC=y
--# CONFIG_BLK_DEV_PLATFORM is not set
--CONFIG_BLK_DEV_IDEDMA_SFF=y
--
--#
--# PCI IDE chipsets support
--#
--CONFIG_BLK_DEV_IDEPCI=y
--CONFIG_IDEPCI_PCIBUS_ORDER=y
--# CONFIG_BLK_DEV_OFFBOARD is not set
--CONFIG_BLK_DEV_GENERIC=y
--# CONFIG_BLK_DEV_OPTI621 is not set
--CONFIG_BLK_DEV_IDEDMA_PCI=y
--# CONFIG_BLK_DEV_AEC62XX is not set
--# CONFIG_BLK_DEV_ALI15X3 is not set
--# CONFIG_BLK_DEV_AMD74XX is not set
--# CONFIG_BLK_DEV_CMD64X is not set
--# CONFIG_BLK_DEV_TRIFLEX is not set
--# CONFIG_BLK_DEV_CY82C693 is not set
--# CONFIG_BLK_DEV_CS5520 is not set
--# CONFIG_BLK_DEV_CS5530 is not set
--# CONFIG_BLK_DEV_HPT34X is not set
--# CONFIG_BLK_DEV_HPT366 is not set
--# CONFIG_BLK_DEV_JMICRON is not set
--# CONFIG_BLK_DEV_SC1200 is not set
--# CONFIG_BLK_DEV_PIIX is not set
--# CONFIG_BLK_DEV_IT8213 is not set
--# CONFIG_BLK_DEV_IT821X is not set
--# CONFIG_BLK_DEV_NS87415 is not set
--# CONFIG_BLK_DEV_PDC202XX_OLD is not set
--# CONFIG_BLK_DEV_PDC202XX_NEW is not set
--# CONFIG_BLK_DEV_SVWKS is not set
--# CONFIG_BLK_DEV_SIIMAGE is not set
--# CONFIG_BLK_DEV_SL82C105 is not set
--# CONFIG_BLK_DEV_SLC90E66 is not set
--# CONFIG_BLK_DEV_TRM290 is not set
--CONFIG_BLK_DEV_VIA82CXXX=y
--# CONFIG_BLK_DEV_TC86C001 is not set
--CONFIG_BLK_DEV_IDEDMA=y
--CONFIG_IDE_ARCH_OBSOLETE_INIT=y
--# CONFIG_BLK_DEV_HD is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--CONFIG_E1000=y
--CONFIG_E1000_NAPI=y
--# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=y
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--# CONFIG_NFS_V3 is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--# CONFIG_MSDOS_PARTITION is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--CONFIG_DEBUG_MUTEXES=y
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--# CONFIG_CRYPTO_SEQIV is not set
--# CONFIG_CRYPTO_MANAGER is not set
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--# CONFIG_CRYPTO_MD5 is not set
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--# CONFIG_CRYPTO_CBC is not set
--# CONFIG_CRYPTO_PCBC is not set
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--# CONFIG_CRYPTO_DES is not set
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/pmac32_defconfig
-+++ b/arch/powerpc/configs/pmac32_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
- # Linux kernel version: 2.6.25-rc6
--# Thu Mar 20 11:05:14 2008
-+# Thu Mar 27 13:56:21 2008
- #
- # CONFIG_PPC64 is not set
-
-@@ -77,8 +77,6 @@ CONFIG_IKCONFIG_PROC=y
- CONFIG_LOG_BUF_SHIFT=14
- # CONFIG_CGROUPS is not set
- # CONFIG_GROUP_SCHED is not set
--# CONFIG_USER_SCHED is not set
--# CONFIG_CGROUP_SCHED is not set
- CONFIG_SYSFS_DEPRECATED=y
- CONFIG_SYSFS_DEPRECATED_V2=y
- # CONFIG_RELAY is not set
-@@ -272,7 +270,7 @@ CONFIG_PCI_SYSCALL=y
- # CONFIG_PCIEPORTBUS is not set
- CONFIG_ARCH_SUPPORTS_MSI=y
- # CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_LEGACY is not set
- # CONFIG_PCI_DEBUG is not set
- CONFIG_PCCARD=m
- # CONFIG_PCMCIA_DEBUG is not set
-@@ -1895,6 +1893,7 @@ CONFIG_PLIST=y
- CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
- CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-
- #
- # Kernel hacking
---- /dev/null
-+++ b/arch/powerpc/configs/ppc40x_defconfig
-@@ -0,0 +1,896 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc9
-+# Tue Apr 15 08:46:44 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+CONFIG_40x=y
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_KALLSYMS_EXTRA_PASS=y
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_CLASSIC_RCU=y
-+CONFIG_PPC4xx_PCI_EXPRESS=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_EP405=y
-+CONFIG_KILAUEA=y
-+CONFIG_MAKALU=y
-+CONFIG_WALNUT=y
-+CONFIG_XILINX_VIRTEX_GENERIC_BOARD=y
-+CONFIG_405GP=y
-+CONFIG_405EX=y
-+CONFIG_XILINX_VIRTEX=y
-+CONFIG_XILINX_VIRTEX_II_PRO=y
-+CONFIG_XILINX_VIRTEX_4_FX=y
-+CONFIG_IBM405_ERR77=y
-+CONFIG_IBM405_ERR51=y
-+# CONFIG_IPIC is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_OF_RTC=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_FORCE_MAX_ZONEORDER=11
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_4xx_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+# CONFIG_PCI_LEGACY is not set
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+CONFIG_MTD_OF_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=m
-+CONFIG_MTD_BLOCK=m
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+CONFIG_XILINX_HWICAP=m
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+CONFIG_THERMAL=y
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_SLUB_STATS is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/ppc44x_defconfig
-+++ b/arch/powerpc/configs/ppc44x_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc2
--# Fri Feb 15 21:57:35 2008
-+# Linux kernel version: 2.6.25-rc6
-+# Sat Apr 5 09:35:48 2008
- #
- # CONFIG_PPC64 is not set
-
-@@ -79,6 +79,7 @@ CONFIG_FAIR_GROUP_SCHED=y
- CONFIG_USER_SCHED=y
- # CONFIG_CGROUP_SCHED is not set
- CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
- # CONFIG_RELAY is not set
- # CONFIG_NAMESPACES is not set
- CONFIG_BLK_DEV_INITRD=y
-@@ -113,6 +114,7 @@ CONFIG_SLUB=y
- CONFIG_HAVE_OPROFILE=y
- # CONFIG_KPROBES is not set
- CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
- CONFIG_PROC_PAGE_MONITOR=y
- CONFIG_SLABINFO=y
- CONFIG_RT_MUTEXES=y
-@@ -143,7 +145,6 @@ CONFIG_DEFAULT_AS=y
- # CONFIG_DEFAULT_NOOP is not set
- CONFIG_DEFAULT_IOSCHED="anticipatory"
- CONFIG_CLASSIC_RCU=y
--# CONFIG_PREEMPT_RCU is not set
- CONFIG_PPC4xx_PCI_EXPRESS=y
-
- #
-@@ -161,12 +162,15 @@ CONFIG_TAISHAN=y
- CONFIG_KATMAI=y
- CONFIG_RAINIER=y
- CONFIG_WARP=y
-+CONFIG_CANYONLANDS=y
-+CONFIG_YOSEMITE=y
- CONFIG_440EP=y
- CONFIG_440EPX=y
- CONFIG_440GRX=y
- CONFIG_440GP=y
- CONFIG_440GX=y
- CONFIG_440SPe=y
-+CONFIG_460EX=y
- CONFIG_IBM440EP_ERR42=y
- # CONFIG_IPIC is not set
- # CONFIG_MPIC is not set
-@@ -199,7 +203,6 @@ CONFIG_HZ=250
- CONFIG_PREEMPT_NONE=y
- # CONFIG_PREEMPT_VOLUNTARY is not set
- # CONFIG_PREEMPT is not set
--# CONFIG_RCU_TRACE is not set
- CONFIG_BINFMT_ELF=y
- # CONFIG_BINFMT_MISC is not set
- CONFIG_MATH_EMULATION=y
-@@ -232,6 +235,7 @@ CONFIG_ISA_DMA_API=y
- #
- CONFIG_ZONE_DMA=y
- CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_4xx_SOC=y
- CONFIG_PCI=y
- CONFIG_PCI_DOMAINS=y
- CONFIG_PCI_SYSCALL=y
-@@ -678,6 +682,7 @@ CONFIG_USB_ARCH_HAS_EHCI=y
- # CONFIG_INFINIBAND is not set
- # CONFIG_EDAC is not set
- # CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-
- #
- # Userspace I/O
-@@ -805,6 +810,7 @@ CONFIG_PLIST=y
- CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
- CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-
- #
- # Kernel hacking
---- a/arch/powerpc/configs/ppc64_defconfig
-+++ b/arch/powerpc/configs/ppc64_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
- # Linux kernel version: 2.6.25-rc6
--# Thu Mar 20 11:06:28 2008
-+# Thu Mar 27 13:56:24 2008
- #
- CONFIG_PPC64=y
-
-@@ -84,8 +84,6 @@ CONFIG_CGROUPS=y
- # CONFIG_CGROUP_NS is not set
- CONFIG_CPUSETS=y
- # CONFIG_GROUP_SCHED is not set
--# CONFIG_USER_SCHED is not set
--# CONFIG_CGROUP_SCHED is not set
- # CONFIG_CGROUP_CPUACCT is not set
- # CONFIG_RESOURCE_COUNTERS is not set
- CONFIG_SYSFS_DEPRECATED=y
-@@ -289,6 +287,7 @@ CONFIG_ARCH_HAS_WALK_MEMORY=y
- CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
- CONFIG_KEXEC=y
- # CONFIG_CRASH_DUMP is not set
-+# CONFIG_PHYP_DUMP is not set
- CONFIG_IRQ_ALL_CPUS=y
- # CONFIG_NUMA is not set
- CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-@@ -335,7 +334,7 @@ CONFIG_PCI_SYSCALL=y
- # CONFIG_PCIEPORTBUS is not set
- CONFIG_ARCH_SUPPORTS_MSI=y
- CONFIG_PCI_MSI=y
--CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_LEGACY is not set
- # CONFIG_PCI_DEBUG is not set
- CONFIG_PCCARD=y
- # CONFIG_PCMCIA_DEBUG is not set
-@@ -1881,6 +1880,7 @@ CONFIG_PLIST=y
- CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
- CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-
- #
- # Kernel hacking
---- a/arch/powerpc/configs/pseries_defconfig
-+++ b/arch/powerpc/configs/pseries_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
- # Linux kernel version: 2.6.25-rc6
--# Thu Mar 20 11:08:01 2008
-+# Thu Mar 27 13:56:28 2008
- #
- CONFIG_PPC64=y
-
-@@ -83,8 +83,6 @@ CONFIG_CGROUPS=y
- CONFIG_CGROUP_NS=y
- CONFIG_CPUSETS=y
- # CONFIG_GROUP_SCHED is not set
--# CONFIG_USER_SCHED is not set
--# CONFIG_CGROUP_SCHED is not set
- CONFIG_CGROUP_CPUACCT=y
- # CONFIG_RESOURCE_COUNTERS is not set
- CONFIG_SYSFS_DEPRECATED=y
-@@ -237,6 +235,7 @@ CONFIG_ARCH_HAS_WALK_MEMORY=y
- CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
- CONFIG_KEXEC=y
- # CONFIG_CRASH_DUMP is not set
-+# CONFIG_PHYP_DUMP is not set
- CONFIG_IRQ_ALL_CPUS=y
- CONFIG_NUMA=y
- CONFIG_NODES_SHIFT=4
-@@ -283,7 +282,7 @@ CONFIG_PCI_SYSCALL=y
- # CONFIG_PCIEPORTBUS is not set
- CONFIG_ARCH_SUPPORTS_MSI=y
- CONFIG_PCI_MSI=y
--CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_LEGACY is not set
- # CONFIG_PCI_DEBUG is not set
- # CONFIG_PCCARD is not set
- CONFIG_HOTPLUG_PCI=m
-@@ -1519,6 +1518,7 @@ CONFIG_PLIST=y
- CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
- CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-
- #
- # Kernel hacking
---- a/arch/powerpc/configs/rainier_defconfig
-+++ /dev/null
-@@ -1,899 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc2
--# Fri Feb 15 21:53:10 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--CONFIG_44x=y
--# CONFIG_E200 is not set
--CONFIG_4xx=y
--CONFIG_BOOKE=y
--CONFIG_PTE_64BIT=y
--CONFIG_PHYS_64BIT=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_NOT_COHERENT_CACHE=y
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--CONFIG_PPC_DCR_NATIVE=y
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_PPC_DCR=y
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_ALL is not set
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--CONFIG_LBD=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--# CONFIG_PREEMPT_RCU is not set
--# CONFIG_PPC4xx_PCI_EXPRESS is not set
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--# CONFIG_BAMBOO is not set
--# CONFIG_EBONY is not set
--# CONFIG_SEQUOIA is not set
--# CONFIG_TAISHAN is not set
--# CONFIG_KATMAI is not set
--CONFIG_RAINIER=y
--# CONFIG_WARP is not set
--CONFIG_440GRX=y
--# CONFIG_IPIC is not set
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_RCU_TRACE=y
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--CONFIG_RESOURCES_64BIT=y
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--CONFIG_CMDLINE_BOOL=y
--CONFIG_CMDLINE=""
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_CONSISTENT_START=0xff100000
--CONFIG_CONSISTENT_SIZE=0x00200000
--CONFIG_BOOT_LOAD=0x01000000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--# CONFIG_IP_MULTICAST is not set
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--CONFIG_CONNECTOR=y
--CONFIG_PROC_EVENTS=y
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--CONFIG_MTD_CMDLINE_PARTS=y
--CONFIG_MTD_OF_PARTS=y
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--# CONFIG_MTD_BLKDEVS is not set
--# CONFIG_MTD_BLOCK is not set
--# CONFIG_MTD_BLOCK_RO is not set
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--CONFIG_MTD_JEDECPROBE=y
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--CONFIG_MTD_CFI_INTELEXT=y
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--CONFIG_MTD_PHYSMAP_OF=y
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--# CONFIG_BLK_DEV_LOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=35000
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--# CONFIG_XILINX_SYSACE is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--CONFIG_MACINTOSH_DRIVERS=y
--# CONFIG_MAC_EMUMOUSEBTN is not set
--# CONFIG_WINDFARM is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--# CONFIG_NET_ETHERNET is not set
--CONFIG_IBM_NEW_EMAC_ZMII=y
--CONFIG_IBM_NEW_EMAC_RGMII=y
--CONFIG_IBM_NEW_EMAC_EMAC4=y
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--# CONFIG_SERIAL_8250_PCI is not set
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--CONFIG_SERIAL_8250_EXTENDED=y
--# CONFIG_SERIAL_8250_MANY_PORTS is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--# CONFIG_SERIAL_8250_DETECT_IRQ is not set
--# CONFIG_SERIAL_8250_RSA is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--CONFIG_SERIAL_OF_PLATFORM=y
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--CONFIG_THERMAL=y
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_JFFS2_FS=y
--CONFIG_JFFS2_FS_DEBUG=0
--CONFIG_JFFS2_FS_WRITEBUFFER=y
--# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
--# CONFIG_JFFS2_SUMMARY is not set
--# CONFIG_JFFS2_FS_XATTR is not set
--# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
--CONFIG_JFFS2_ZLIB=y
--# CONFIG_JFFS2_LZO is not set
--CONFIG_JFFS2_RTIME=y
--# CONFIG_JFFS2_RUBIN is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_ZLIB_DEFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_MAGIC_SYSRQ=y
--# CONFIG_UNUSED_SYMBOLS is not set
--CONFIG_DEBUG_FS=y
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--CONFIG_DEBUGGER=y
--# CONFIG_KGDB is not set
--# CONFIG_XMON is not set
--# CONFIG_VIRQ_DEBUG is not set
--# CONFIG_BDI_SWITCH is not set
--CONFIG_PPC_EARLY_DEBUG=y
--# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
--# CONFIG_PPC_EARLY_DEBUG_G5 is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
--# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
--# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
--# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
--# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
--CONFIG_PPC_EARLY_DEBUG_44x=y
--# CONFIG_PPC_EARLY_DEBUG_40x is not set
--# CONFIG_PPC_EARLY_DEBUG_CPM is not set
--CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
--CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x1
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=y
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=y
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/sbc834x_defconfig
-+++ /dev/null
-@@ -1,828 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:38 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_FSL_EMB_PERFMON is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLAB=y
--# CONFIG_SLUB is not set
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MULTIPLATFORM is not set
--# CONFIG_PPC_82xx is not set
--CONFIG_PPC_83xx=y
--# CONFIG_PPC_86xx is not set
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC83xx=y
--# CONFIG_MPC831x_RDB is not set
--# CONFIG_MPC832x_MDS is not set
--# CONFIG_MPC832x_RDB is not set
--# CONFIG_MPC834x_MDS is not set
--# CONFIG_MPC834x_ITX is not set
--# CONFIG_MPC836x_MDS is not set
--# CONFIG_MPC837x_MDS is not set
--# CONFIG_MPC837x_RDB is not set
--CONFIG_SBC834x=y
--CONFIG_PPC_MPC834x=y
--CONFIG_IPIC=y
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--# CONFIG_PCI is not set
--# CONFIG_PCI_DOMAINS is not set
--# CONFIG_PCI_SYSCALL is not set
--# CONFIG_ARCH_SUPPORTS_MSI is not set
--# CONFIG_PCCARD is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--CONFIG_XFRM_USER=m
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--CONFIG_BROADCOM_PHY=y
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_E1000E_ENABLED is not set
--CONFIG_GIANFAR=y
--# CONFIG_GFAR_NAPI is not set
--# CONFIG_NETDEV_10000 is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
--# CONFIG_R3964 is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--# CONFIG_SENSORS_LM75 is not set
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--CONFIG_WATCHDOG=y
--# CONFIG_WATCHDOG_NOWAYOUT is not set
--
--#
--# Watchdog Device Drivers
--#
--# CONFIG_SOFT_WATCHDOG is not set
--CONFIG_83xx_WDT=y
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--# CONFIG_DAB is not set
--
--#
--# Graphics support
--#
--# CONFIG_VGASTATE is not set
--# CONFIG_VIDEO_OUTPUT_CONTROL is not set
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--# CONFIG_USB_SUPPORT is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--# CONFIG_EXT2_FS is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--CONFIG_NFS_V4=y
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--CONFIG_SUNRPC_GSS=y
--# CONFIG_SUNRPC_BIND34 is not set
--CONFIG_RPCSEC_GSS_KRB5=y
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=m
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=m
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--# CONFIG_CRYPTO_HW is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/sbc8548_defconfig
-+++ /dev/null
-@@ -1,812 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:39 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLAB=y
--# CONFIG_SLUB is not set
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--# CONFIG_MODULES is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--# CONFIG_MPC8540_ADS is not set
--# CONFIG_MPC8560_ADS is not set
--# CONFIG_MPC85xx_CDS is not set
--# CONFIG_MPC85xx_MDS is not set
--# CONFIG_MPC85xx_DS is not set
--# CONFIG_STX_GP3 is not set
--# CONFIG_TQM8540 is not set
--# CONFIG_TQM8541 is not set
--# CONFIG_TQM8555 is not set
--# CONFIG_TQM8560 is not set
--CONFIG_SBC8548=y
--# CONFIG_SBC8560 is not set
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_CPM2 is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--CONFIG_BINFMT_MISC=y
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--# CONFIG_SECCOMP is not set
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_FSL_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--CONFIG_XFRM_USER=y
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=4096
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--CONFIG_BROADCOM_PHY=y
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=y
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--# CONFIG_HID_SUPPORT is not set
--# CONFIG_USB_SUPPORT is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--# CONFIG_EXT2_FS is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--# CONFIG_NFS_V3 is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--# CONFIG_CRYPTO_SEQIV is not set
--# CONFIG_CRYPTO_MANAGER is not set
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--# CONFIG_CRYPTO_MD5 is not set
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--# CONFIG_CRYPTO_CBC is not set
--# CONFIG_CRYPTO_PCBC is not set
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--# CONFIG_CRYPTO_DES is not set
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/sbc8560_defconfig
-+++ /dev/null
-@@ -1,830 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:39 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_ALL is not set
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLAB=y
--# CONFIG_SLUB is not set
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--# CONFIG_MODULES is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--# CONFIG_MPC8540_ADS is not set
--# CONFIG_MPC8560_ADS is not set
--# CONFIG_MPC85xx_CDS is not set
--# CONFIG_MPC85xx_MDS is not set
--# CONFIG_MPC85xx_DS is not set
--# CONFIG_STX_GP3 is not set
--# CONFIG_TQM8540 is not set
--# CONFIG_TQM8541 is not set
--# CONFIG_TQM8555 is not set
--# CONFIG_TQM8560 is not set
--# CONFIG_SBC8548 is not set
--CONFIG_SBC8560=y
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_CPM2 is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--CONFIG_BINFMT_MISC=y
--# CONFIG_MATH_EMULATION is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--# CONFIG_SECCOMP is not set
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_FSL_SOC=y
--# CONFIG_PCI is not set
--# CONFIG_PCI_DOMAINS is not set
--# CONFIG_PCI_SYSCALL is not set
--# CONFIG_ARCH_SUPPORTS_MSI is not set
--# CONFIG_PCCARD is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--CONFIG_XFRM_USER=y
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--CONFIG_BROADCOM_PHY=y
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_E1000E_ENABLED is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--CONFIG_NETDEV_10000=y
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_NR_UARTS=2
--CONFIG_SERIAL_8250_RUNTIME_UARTS=2
--# CONFIG_SERIAL_8250_EXTENDED is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=y
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--# CONFIG_USB_ARCH_HAS_HCD is not set
--# CONFIG_USB_ARCH_HAS_OHCI is not set
--# CONFIG_USB_ARCH_HAS_EHCI is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_EDAC is not set
--CONFIG_RTC_LIB=y
--CONFIG_RTC_CLASS=y
--CONFIG_RTC_HCTOSYS=y
--CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
--# CONFIG_RTC_DEBUG is not set
--
--#
--# RTC interfaces
--#
--CONFIG_RTC_INTF_SYSFS=y
--CONFIG_RTC_INTF_PROC=y
--CONFIG_RTC_INTF_DEV=y
--# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
--# CONFIG_RTC_DRV_TEST is not set
--
--#
--# SPI RTC drivers
--#
--
--#
--# Platform RTC drivers
--#
--# CONFIG_RTC_DRV_CMOS is not set
--# CONFIG_RTC_DRV_DS1511 is not set
--# CONFIG_RTC_DRV_DS1553 is not set
--# CONFIG_RTC_DRV_DS1742 is not set
--# CONFIG_RTC_DRV_STK17TA8 is not set
--# CONFIG_RTC_DRV_M48T86 is not set
--CONFIG_RTC_DRV_M48T59=y
--# CONFIG_RTC_DRV_V3020 is not set
--
--#
--# on-CPU RTC drivers
--#
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--# CONFIG_EXT2_FS is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--# CONFIG_NFS_V3 is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--# CONFIG_MSDOS_PARTITION is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_MAGIC_SYSRQ=y
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_DEBUG_SLAB is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--CONFIG_DEBUG_MUTEXES=y
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_BDI_SWITCH is not set
--CONFIG_PPC_EARLY_DEBUG=y
--# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
--# CONFIG_PPC_EARLY_DEBUG_G5 is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
--# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
--# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
--# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
--# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
--# CONFIG_PPC_EARLY_DEBUG_44x is not set
--# CONFIG_PPC_EARLY_DEBUG_40x is not set
--# CONFIG_PPC_EARLY_DEBUG_CPM is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--# CONFIG_CRYPTO_SEQIV is not set
--# CONFIG_CRYPTO_MANAGER is not set
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--# CONFIG_CRYPTO_MD5 is not set
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--# CONFIG_CRYPTO_CBC is not set
--# CONFIG_CRYPTO_PCBC is not set
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--# CONFIG_CRYPTO_DES is not set
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/sbc8641d_defconfig
-@@ -0,0 +1,1342 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25-rc6
-+# Thu Apr 10 18:03:25 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+CONFIG_ALTIVEC=y
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_SMP=y
-+CONFIG_NR_CPUS=2
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_GENERIC_LOCKBREAK=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+CONFIG_GENERIC_TBSYNC=y
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_LOCK_KERNEL=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_BSD_PROCESS_ACCT=y
-+CONFIG_BSD_PROCESS_ACCT_V3=y
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+CONFIG_RELAY=y
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+CONFIG_HAVE_OPROFILE=y
-+# CONFIG_KPROBES is not set
-+CONFIG_HAVE_KPROBES=y
-+CONFIG_HAVE_KRETPROBES=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_STOP_MACHINE=y
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_DEFAULT_AS is not set
-+# CONFIG_DEFAULT_DEADLINE is not set
-+CONFIG_DEFAULT_CFQ=y
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="cfq"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_PPC_82xx is not set
-+# CONFIG_PPC_83xx is not set
-+CONFIG_PPC_86xx=y
-+# CONFIG_PPC_MPC512x is not set
-+# CONFIG_PPC_MPC5121 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_MPC8641_HPCN is not set
-+CONFIG_SBC8641D=y
-+# CONFIG_MPC8610_HPCD is not set
-+CONFIG_MPC8641=y
-+# CONFIG_IPIC is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+# CONFIG_NO_HZ is not set
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+# CONFIG_SCHED_HRTICK is not set
-+# CONFIG_PREEMPT_NONE is not set
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+CONFIG_PREEMPT=y
-+# CONFIG_PREEMPT_RCU is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=m
-+CONFIG_FORCE_MAX_ZONEORDER=11
-+# CONFIG_IOMMU_HELPER is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_HAS_WALK_MEMORY=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-+CONFIG_IRQ_ALL_CPUS=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+# CONFIG_PROC_DEVICETREE is not set
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SECCOMP=y
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_FSL_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+CONFIG_PCIEPORTBUS=y
-+CONFIG_PCIEAER=y
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+CONFIG_PACKET_MMAP=y
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=m
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+CONFIG_NET_KEY=m
-+# CONFIG_NET_KEY_MIGRATE is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+CONFIG_IP_ADVANCED_ROUTER=y
-+CONFIG_ASK_IP_FIB_HASH=y
-+# CONFIG_IP_FIB_TRIE is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_MULTIPLE_TABLES=y
-+CONFIG_IP_ROUTE_MULTIPATH=y
-+CONFIG_IP_ROUTE_VERBOSE=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+CONFIG_IP_PNP_RARP=y
-+CONFIG_NET_IPIP=m
-+CONFIG_NET_IPGRE=m
-+CONFIG_NET_IPGRE_BROADCAST=y
-+CONFIG_IP_MROUTE=y
-+CONFIG_IP_PIMSM_V1=y
-+CONFIG_IP_PIMSM_V2=y
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+CONFIG_INET_AH=m
-+CONFIG_INET_ESP=m
-+CONFIG_INET_IPCOMP=m
-+CONFIG_INET_XFRM_TUNNEL=m
-+CONFIG_INET_TUNNEL=m
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IP_VS is not set
-+CONFIG_IPV6=m
-+# CONFIG_IPV6_PRIVACY is not set
-+# CONFIG_IPV6_ROUTER_PREF is not set
-+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-+CONFIG_INET6_AH=m
-+CONFIG_INET6_ESP=m
-+CONFIG_INET6_IPCOMP=m
-+# CONFIG_IPV6_MIP6 is not set
-+CONFIG_INET6_XFRM_TUNNEL=m
-+CONFIG_INET6_TUNNEL=m
-+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
-+CONFIG_INET6_XFRM_MODE_TUNNEL=m
-+CONFIG_INET6_XFRM_MODE_BEET=m
-+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-+CONFIG_IPV6_SIT=m
-+CONFIG_IPV6_TUNNEL=m
-+# CONFIG_IPV6_MULTIPLE_TABLES is not set
-+# CONFIG_NETLABEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+CONFIG_NETFILTER=y
-+# CONFIG_NETFILTER_DEBUG is not set
-+CONFIG_NETFILTER_ADVANCED=y
-+CONFIG_BRIDGE_NETFILTER=y
-+
-+#
-+# Core Netfilter Configuration
-+#
-+# CONFIG_NETFILTER_NETLINK_QUEUE is not set
-+# CONFIG_NETFILTER_NETLINK_LOG is not set
-+# CONFIG_NF_CONNTRACK is not set
-+CONFIG_NETFILTER_XTABLES=m
-+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
-+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
-+# CONFIG_NETFILTER_XT_TARGET_MARK is not set
-+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
-+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
-+# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
-+# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
-+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-+# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
-+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
-+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
-+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
-+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
-+# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
-+# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
-+# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
-+# CONFIG_NETFILTER_XT_MATCH_MAC is not set
-+# CONFIG_NETFILTER_XT_MATCH_MARK is not set
-+# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
-+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
-+# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
-+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
-+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
-+# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
-+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
-+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
-+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
-+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
-+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
-+# CONFIG_NETFILTER_XT_MATCH_TIME is not set
-+# CONFIG_NETFILTER_XT_MATCH_U32 is not set
-+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
-+
-+#
-+# IP: Netfilter Configuration
-+#
-+CONFIG_IP_NF_QUEUE=m
-+CONFIG_IP_NF_IPTABLES=m
-+CONFIG_IP_NF_MATCH_RECENT=m
-+CONFIG_IP_NF_MATCH_ECN=m
-+# CONFIG_IP_NF_MATCH_AH is not set
-+CONFIG_IP_NF_MATCH_TTL=m
-+CONFIG_IP_NF_MATCH_ADDRTYPE=m
-+CONFIG_IP_NF_FILTER=m
-+CONFIG_IP_NF_TARGET_REJECT=m
-+CONFIG_IP_NF_TARGET_LOG=m
-+CONFIG_IP_NF_TARGET_ULOG=m
-+CONFIG_IP_NF_MANGLE=m
-+CONFIG_IP_NF_TARGET_ECN=m
-+# CONFIG_IP_NF_TARGET_TTL is not set
-+CONFIG_IP_NF_RAW=m
-+CONFIG_IP_NF_ARPTABLES=m
-+CONFIG_IP_NF_ARPFILTER=m
-+CONFIG_IP_NF_ARP_MANGLE=m
-+
-+#
-+# IPv6: Netfilter Configuration
-+#
-+CONFIG_IP6_NF_QUEUE=m
-+CONFIG_IP6_NF_IPTABLES=m
-+CONFIG_IP6_NF_MATCH_RT=m
-+CONFIG_IP6_NF_MATCH_OPTS=m
-+CONFIG_IP6_NF_MATCH_FRAG=m
-+CONFIG_IP6_NF_MATCH_HL=m
-+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
-+# CONFIG_IP6_NF_MATCH_AH is not set
-+# CONFIG_IP6_NF_MATCH_MH is not set
-+CONFIG_IP6_NF_MATCH_EUI64=m
-+CONFIG_IP6_NF_FILTER=m
-+CONFIG_IP6_NF_TARGET_LOG=m
-+# CONFIG_IP6_NF_TARGET_REJECT is not set
-+CONFIG_IP6_NF_MANGLE=m
-+# CONFIG_IP6_NF_TARGET_HL is not set
-+CONFIG_IP6_NF_RAW=m
-+
-+#
-+# Bridge: Netfilter Configuration
-+#
-+# CONFIG_BRIDGE_NF_EBTABLES is not set
-+# CONFIG_IP_DCCP is not set
-+CONFIG_IP_SCTP=m
-+# CONFIG_SCTP_DBG_MSG is not set
-+# CONFIG_SCTP_DBG_OBJCNT is not set
-+# CONFIG_SCTP_HMAC_NONE is not set
-+# CONFIG_SCTP_HMAC_SHA1 is not set
-+CONFIG_SCTP_HMAC_MD5=y
-+CONFIG_TIPC=m
-+# CONFIG_TIPC_ADVANCED is not set
-+# CONFIG_TIPC_DEBUG is not set
-+CONFIG_ATM=m
-+CONFIG_ATM_CLIP=m
-+# CONFIG_ATM_CLIP_NO_ICMP is not set
-+CONFIG_ATM_LANE=m
-+CONFIG_ATM_MPOA=m
-+CONFIG_ATM_BR2684=m
-+# CONFIG_ATM_BR2684_IPFILTER is not set
-+CONFIG_BRIDGE=m
-+CONFIG_VLAN_8021Q=m
-+# CONFIG_DECNET is not set
-+CONFIG_LLC=m
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+CONFIG_WAN_ROUTER=m
-+CONFIG_NET_SCHED=y
-+
-+#
-+# Queueing/Scheduling
-+#
-+CONFIG_NET_SCH_CBQ=m
-+CONFIG_NET_SCH_HTB=m
-+CONFIG_NET_SCH_HFSC=m
-+CONFIG_NET_SCH_ATM=m
-+CONFIG_NET_SCH_PRIO=m
-+# CONFIG_NET_SCH_RR is not set
-+CONFIG_NET_SCH_RED=m
-+CONFIG_NET_SCH_SFQ=m
-+CONFIG_NET_SCH_TEQL=m
-+CONFIG_NET_SCH_TBF=m
-+CONFIG_NET_SCH_GRED=m
-+CONFIG_NET_SCH_DSMARK=m
-+CONFIG_NET_SCH_NETEM=m
-+
-+#
-+# Classification
-+#
-+CONFIG_NET_CLS=y
-+# CONFIG_NET_CLS_BASIC is not set
-+CONFIG_NET_CLS_TCINDEX=m
-+CONFIG_NET_CLS_ROUTE4=m
-+CONFIG_NET_CLS_ROUTE=y
-+CONFIG_NET_CLS_FW=m
-+CONFIG_NET_CLS_U32=m
-+# CONFIG_CLS_U32_PERF is not set
-+# CONFIG_CLS_U32_MARK is not set
-+CONFIG_NET_CLS_RSVP=m
-+CONFIG_NET_CLS_RSVP6=m
-+# CONFIG_NET_CLS_FLOW is not set
-+# CONFIG_NET_EMATCH is not set
-+# CONFIG_NET_CLS_ACT is not set
-+# CONFIG_NET_CLS_IND is not set
-+CONFIG_NET_SCH_FIFO=y
-+
-+#
-+# Network testing
-+#
-+CONFIG_NET_PKTGEN=m
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+CONFIG_FIB_RULES=y
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_CONCAT=y
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_PARTS is not set
-+# CONFIG_MTD_OF_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+CONFIG_MTD_CFI_ADV_OPTIONS=y
-+# CONFIG_MTD_CFI_NOSWAP is not set
-+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-+CONFIG_MTD_CFI_LE_BYTE_SWAP=y
-+# CONFIG_MTD_CFI_GEOMETRY is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_OTP is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+# CONFIG_MTD_CFI_AMDSTD is not set
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=m
-+CONFIG_BLK_DEV_CRYPTOLOOP=m
-+CONFIG_BLK_DEV_NBD=m
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=4096
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+CONFIG_MD=y
-+CONFIG_BLK_DEV_MD=y
-+CONFIG_MD_LINEAR=y
-+CONFIG_MD_RAID0=y
-+CONFIG_MD_RAID1=y
-+CONFIG_MD_RAID10=y
-+# CONFIG_MD_RAID456 is not set
-+CONFIG_MD_MULTIPATH=y
-+CONFIG_MD_FAULTY=y
-+CONFIG_BLK_DEV_DM=y
-+# CONFIG_DM_DEBUG is not set
-+CONFIG_DM_CRYPT=y
-+CONFIG_DM_SNAPSHOT=y
-+CONFIG_DM_MIRROR=y
-+CONFIG_DM_ZERO=y
-+# CONFIG_DM_MULTIPATH is not set
-+# CONFIG_DM_DELAY is not set
-+# CONFIG_DM_UEVENT is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+CONFIG_DUMMY=m
-+CONFIG_BONDING=m
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+CONFIG_TUN=m
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+CONFIG_BROADCOM_PHY=y
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_E1000E_ENABLED is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+CONFIG_GIANFAR=y
-+# CONFIG_GFAR_NAPI is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+CONFIG_ATM_DRIVERS=y
-+# CONFIG_ATM_DUMMY is not set
-+# CONFIG_ATM_TCP is not set
-+# CONFIG_ATM_LANAI is not set
-+# CONFIG_ATM_ENI is not set
-+# CONFIG_ATM_FIRESTREAM is not set
-+# CONFIG_ATM_ZATM is not set
-+# CONFIG_ATM_NICSTAR is not set
-+# CONFIG_ATM_IDT77252 is not set
-+# CONFIG_ATM_AMBASSADOR is not set
-+# CONFIG_ATM_HORIZON is not set
-+# CONFIG_ATM_IA is not set
-+# CONFIG_ATM_FORE200E_MAYBE is not set
-+# CONFIG_ATM_HE is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+CONFIG_PPP=m
-+CONFIG_PPP_MULTILINK=y
-+CONFIG_PPP_FILTER=y
-+CONFIG_PPP_ASYNC=m
-+CONFIG_PPP_SYNC_TTY=m
-+CONFIG_PPP_DEFLATE=m
-+CONFIG_PPP_BSDCOMP=m
-+# CONFIG_PPP_MPPE is not set
-+CONFIG_PPPOE=m
-+CONFIG_PPPOATM=m
-+# CONFIG_PPPOL2TP is not set
-+CONFIG_SLIP=m
-+CONFIG_SLIP_COMPRESSED=y
-+CONFIG_SLHC=m
-+CONFIG_SLIP_SMART=y
-+CONFIG_SLIP_MODE_SLIP6=y
-+CONFIG_NETCONSOLE=y
-+# CONFIG_NETCONSOLE_DYNAMIC is not set
-+CONFIG_NETPOLL=y
-+CONFIG_NETPOLL_TRAP=y
-+CONFIG_NET_POLL_CONTROLLER=y
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_VT_HW_CONSOLE_BINDING is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=2
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=m
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ADT7473 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_ADS7828 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83L786NG is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+CONFIG_SOFT_WATCHDOG=m
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Console display driver support
-+#
-+CONFIG_VGA_CONSOLE=y
-+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-+CONFIG_DUMMY_CONSOLE=y
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+# CONFIG_DMADEVICES is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+CONFIG_EXT2_FS_XATTR=y
-+CONFIG_EXT2_FS_POSIX_ACL=y
-+# CONFIG_EXT2_FS_SECURITY is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+CONFIG_EXT3_FS_POSIX_ACL=y
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+# CONFIG_JBD_DEBUG is not set
-+CONFIG_FS_MBCACHE=y
-+CONFIG_REISERFS_FS=m
-+# CONFIG_REISERFS_CHECK is not set
-+# CONFIG_REISERFS_PROC_INFO is not set
-+CONFIG_REISERFS_FS_XATTR=y
-+CONFIG_REISERFS_FS_POSIX_ACL=y
-+# CONFIG_REISERFS_FS_SECURITY is not set
-+# CONFIG_JFS_FS is not set
-+CONFIG_FS_POSIX_ACL=y
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+CONFIG_OCFS2_FS=m
-+CONFIG_OCFS2_DEBUG_MASKLOG=y
-+# CONFIG_OCFS2_DEBUG_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_AUTOFS_FS=m
-+CONFIG_AUTOFS4_FS=m
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_CONFIGFS_FS=m
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+CONFIG_MINIX_FS=m
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+CONFIG_ROMFS_FS=m
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+CONFIG_NFS_DIRECTIO=y
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+CONFIG_SMB_FS=m
-+CONFIG_SMB_NLS_DEFAULT=y
-+CONFIG_SMB_NLS_REMOTE="cp437"
-+CONFIG_CIFS=m
-+# CONFIG_CIFS_STATS is not set
-+# CONFIG_CIFS_WEAK_PW_HASH is not set
-+CONFIG_CIFS_XATTR=y
-+CONFIG_CIFS_POSIX=y
-+# CONFIG_CIFS_DEBUG2 is not set
-+# CONFIG_CIFS_EXPERIMENTAL is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+CONFIG_NLS=m
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=m
-+CONFIG_NLS_CODEPAGE_737=m
-+CONFIG_NLS_CODEPAGE_775=m
-+CONFIG_NLS_CODEPAGE_850=m
-+CONFIG_NLS_CODEPAGE_852=m
-+CONFIG_NLS_CODEPAGE_855=m
-+CONFIG_NLS_CODEPAGE_857=m
-+CONFIG_NLS_CODEPAGE_860=m
-+CONFIG_NLS_CODEPAGE_861=m
-+CONFIG_NLS_CODEPAGE_862=m
-+CONFIG_NLS_CODEPAGE_863=m
-+CONFIG_NLS_CODEPAGE_864=m
-+CONFIG_NLS_CODEPAGE_865=m
-+CONFIG_NLS_CODEPAGE_866=m
-+CONFIG_NLS_CODEPAGE_869=m
-+CONFIG_NLS_CODEPAGE_936=m
-+CONFIG_NLS_CODEPAGE_950=m
-+CONFIG_NLS_CODEPAGE_932=m
-+CONFIG_NLS_CODEPAGE_949=m
-+CONFIG_NLS_CODEPAGE_874=m
-+CONFIG_NLS_ISO8859_8=m
-+CONFIG_NLS_CODEPAGE_1250=m
-+CONFIG_NLS_CODEPAGE_1251=m
-+CONFIG_NLS_ASCII=m
-+CONFIG_NLS_ISO8859_1=m
-+CONFIG_NLS_ISO8859_2=m
-+CONFIG_NLS_ISO8859_3=m
-+CONFIG_NLS_ISO8859_4=m
-+CONFIG_NLS_ISO8859_5=m
-+CONFIG_NLS_ISO8859_6=m
-+CONFIG_NLS_ISO8859_7=m
-+CONFIG_NLS_ISO8859_9=m
-+CONFIG_NLS_ISO8859_13=m
-+CONFIG_NLS_ISO8859_14=m
-+CONFIG_NLS_ISO8859_15=m
-+CONFIG_NLS_KOI8_R=m
-+CONFIG_NLS_KOI8_U=m
-+CONFIG_NLS_UTF8=m
-+# CONFIG_DLM is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_CRC_CCITT=m
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+CONFIG_LIBCRC32C=m
-+CONFIG_ZLIB_INFLATE=m
-+CONFIG_ZLIB_DEFLATE=m
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_HAVE_LMB=y
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_SLAB is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_XMON is not set
-+# CONFIG_VIRQ_DEBUG is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+CONFIG_SECURITY=y
-+CONFIG_SECURITY_NETWORK=y
-+# CONFIG_SECURITY_NETWORK_XFRM is not set
-+CONFIG_SECURITY_CAPABILITIES=y
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_AEAD=m
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_HASH=y
-+CONFIG_CRYPTO_MANAGER=y
-+CONFIG_CRYPTO_HMAC=y
-+# CONFIG_CRYPTO_XCBC is not set
-+CONFIG_CRYPTO_NULL=m
-+CONFIG_CRYPTO_MD4=m
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=m
-+CONFIG_CRYPTO_SHA256=m
-+CONFIG_CRYPTO_SHA512=m
-+CONFIG_CRYPTO_WP512=m
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+CONFIG_CRYPTO_BLOWFISH=m
-+CONFIG_CRYPTO_TWOFISH=m
-+CONFIG_CRYPTO_TWOFISH_COMMON=m
-+CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_AES=m
-+CONFIG_CRYPTO_CAST5=m
-+CONFIG_CRYPTO_CAST6=m
-+CONFIG_CRYPTO_TEA=m
-+CONFIG_CRYPTO_ARC4=m
-+CONFIG_CRYPTO_KHAZAD=m
-+CONFIG_CRYPTO_ANUBIS=m
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+CONFIG_CRYPTO_DEFLATE=m
-+CONFIG_CRYPTO_MICHAEL_MIC=m
-+CONFIG_CRYPTO_CRC32C=m
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+CONFIG_CRYPTO_TEST=m
-+CONFIG_CRYPTO_AUTHENC=m
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/sequoia_defconfig
-+++ /dev/null
-@@ -1,916 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc2
--# Fri Feb 15 21:53:46 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--CONFIG_44x=y
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--CONFIG_4xx=y
--CONFIG_BOOKE=y
--CONFIG_PTE_64BIT=y
--CONFIG_PHYS_64BIT=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_NOT_COHERENT_CACHE=y
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--CONFIG_PPC_DCR_NATIVE=y
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_PPC_DCR=y
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--# CONFIG_FAIR_GROUP_SCHED is not set
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_ALL is not set
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--CONFIG_LBD=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--# CONFIG_PREEMPT_RCU is not set
--# CONFIG_PPC4xx_PCI_EXPRESS is not set
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--# CONFIG_BAMBOO is not set
--# CONFIG_EBONY is not set
--CONFIG_SEQUOIA=y
--# CONFIG_TAISHAN is not set
--# CONFIG_KATMAI is not set
--# CONFIG_RAINIER is not set
--# CONFIG_WARP is not set
--CONFIG_440EPX=y
--# CONFIG_IPIC is not set
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_RCU_TRACE=y
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_MATH_EMULATION is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--CONFIG_RESOURCES_64BIT=y
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--CONFIG_CMDLINE_BOOL=y
--CONFIG_CMDLINE=""
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_CONSISTENT_START=0xff100000
--CONFIG_CONSISTENT_SIZE=0x00200000
--CONFIG_BOOT_LOAD=0x01000000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--# CONFIG_IP_MULTICAST is not set
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--CONFIG_CONNECTOR=y
--CONFIG_PROC_EVENTS=y
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--CONFIG_MTD_CMDLINE_PARTS=y
--CONFIG_MTD_OF_PARTS=y
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--# CONFIG_MTD_BLKDEVS is not set
--# CONFIG_MTD_BLOCK is not set
--# CONFIG_MTD_BLOCK_RO is not set
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--CONFIG_MTD_JEDECPROBE=y
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--CONFIG_MTD_CFI_INTELEXT=y
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--CONFIG_MTD_PHYSMAP_OF=y
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--# CONFIG_BLK_DEV_LOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=35000
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--# CONFIG_XILINX_SYSACE is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--# CONFIG_PHYLIB is not set
--CONFIG_NET_ETHERNET=y
--# CONFIG_MII is not set
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--CONFIG_IBM_NEW_EMAC=y
--CONFIG_IBM_NEW_EMAC_RXB=128
--CONFIG_IBM_NEW_EMAC_TXB=64
--CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
--CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
--CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
--# CONFIG_IBM_NEW_EMAC_DEBUG is not set
--CONFIG_IBM_NEW_EMAC_ZMII=y
--CONFIG_IBM_NEW_EMAC_RGMII=y
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--CONFIG_IBM_NEW_EMAC_EMAC4=y
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--# CONFIG_SERIAL_8250_PCI is not set
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--CONFIG_SERIAL_8250_EXTENDED=y
--# CONFIG_SERIAL_8250_MANY_PORTS is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--# CONFIG_SERIAL_8250_DETECT_IRQ is not set
--# CONFIG_SERIAL_8250_RSA is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--CONFIG_SERIAL_OF_PLATFORM=y
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--CONFIG_THERMAL=y
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_JFFS2_FS=y
--CONFIG_JFFS2_FS_DEBUG=0
--CONFIG_JFFS2_FS_WRITEBUFFER=y
--# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
--# CONFIG_JFFS2_SUMMARY is not set
--# CONFIG_JFFS2_FS_XATTR is not set
--# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
--CONFIG_JFFS2_ZLIB=y
--# CONFIG_JFFS2_LZO is not set
--CONFIG_JFFS2_RTIME=y
--# CONFIG_JFFS2_RUBIN is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_ZLIB_DEFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_MAGIC_SYSRQ=y
--# CONFIG_UNUSED_SYMBOLS is not set
--CONFIG_DEBUG_FS=y
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--CONFIG_DEBUGGER=y
--# CONFIG_KGDB is not set
--# CONFIG_XMON is not set
--# CONFIG_VIRQ_DEBUG is not set
--# CONFIG_BDI_SWITCH is not set
--CONFIG_PPC_EARLY_DEBUG=y
--# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
--# CONFIG_PPC_EARLY_DEBUG_G5 is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
--# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
--# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
--# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
--# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
--CONFIG_PPC_EARLY_DEBUG_44x=y
--# CONFIG_PPC_EARLY_DEBUG_40x is not set
--# CONFIG_PPC_EARLY_DEBUG_CPM is not set
--CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
--CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x1
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=y
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=y
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/stx_gp3_defconfig
-+++ /dev/null
-@@ -1,1253 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:42 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_ALL is not set
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--# CONFIG_MODULE_UNLOAD is not set
--CONFIG_MODVERSIONS=y
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--# CONFIG_DEFAULT_AS is not set
--# CONFIG_DEFAULT_DEADLINE is not set
--CONFIG_DEFAULT_CFQ=y
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="cfq"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--# CONFIG_MPC8540_ADS is not set
--# CONFIG_MPC8560_ADS is not set
--# CONFIG_MPC85xx_CDS is not set
--# CONFIG_MPC85xx_MDS is not set
--# CONFIG_MPC85xx_DS is not set
--CONFIG_STX_GP3=y
--# CONFIG_TQM8540 is not set
--# CONFIG_TQM8541 is not set
--# CONFIG_TQM8555 is not set
--# CONFIG_TQM8560 is not set
--# CONFIG_SBC8548 is not set
--# CONFIG_SBC8560 is not set
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--CONFIG_CPM2=y
--CONFIG_PPC_CPM_NEW_BINDING=y
--# CONFIG_FSL_ULI1575 is not set
--CONFIG_CPM=y
--
--#
--# Kernel options
--#
--CONFIG_HIGHMEM=y
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--CONFIG_BINFMT_MISC=m
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_FSL_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--# CONFIG_IP_MULTICAST is not set
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--# CONFIG_IP_PNP_DHCP is not set
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IP_VS is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--CONFIG_NETFILTER=y
--# CONFIG_NETFILTER_DEBUG is not set
--CONFIG_NETFILTER_ADVANCED=y
--
--#
--# Core Netfilter Configuration
--#
--# CONFIG_NETFILTER_NETLINK_QUEUE is not set
--# CONFIG_NETFILTER_NETLINK_LOG is not set
--# CONFIG_NF_CONNTRACK is not set
--CONFIG_NETFILTER_XTABLES=m
--# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
--# CONFIG_NETFILTER_XT_TARGET_MARK is not set
--# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
--# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
--# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
--# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
--# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
--# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
--# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
--# CONFIG_NETFILTER_XT_MATCH_ESP is not set
--# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
--# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
--# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
--# CONFIG_NETFILTER_XT_MATCH_MAC is not set
--# CONFIG_NETFILTER_XT_MATCH_MARK is not set
--# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
--# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
--# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
--# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
--# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
--# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
--# CONFIG_NETFILTER_XT_MATCH_REALM is not set
--# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
--# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
--# CONFIG_NETFILTER_XT_MATCH_STRING is not set
--# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
--# CONFIG_NETFILTER_XT_MATCH_TIME is not set
--# CONFIG_NETFILTER_XT_MATCH_U32 is not set
--# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
--
--#
--# IP: Netfilter Configuration
--#
--# CONFIG_IP_NF_QUEUE is not set
--CONFIG_IP_NF_IPTABLES=m
--# CONFIG_IP_NF_MATCH_RECENT is not set
--# CONFIG_IP_NF_MATCH_ECN is not set
--# CONFIG_IP_NF_MATCH_AH is not set
--# CONFIG_IP_NF_MATCH_TTL is not set
--# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
--CONFIG_IP_NF_FILTER=m
--# CONFIG_IP_NF_TARGET_REJECT is not set
--# CONFIG_IP_NF_TARGET_LOG is not set
--# CONFIG_IP_NF_TARGET_ULOG is not set
--# CONFIG_IP_NF_MANGLE is not set
--# CONFIG_IP_NF_RAW is not set
--# CONFIG_IP_NF_ARPTABLES is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--CONFIG_NET_PKTGEN=y
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--CONFIG_PARPORT=m
--CONFIG_PARPORT_PC=m
--# CONFIG_PARPORT_PC_FIFO is not set
--# CONFIG_PARPORT_PC_SUPERIO is not set
--# CONFIG_PARPORT_GSC is not set
--# CONFIG_PARPORT_AX88796 is not set
--# CONFIG_PARPORT_1284 is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_PARIDE is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=m
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--CONFIG_BLK_DEV_NBD=m
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--CONFIG_IDE=y
--CONFIG_IDE_MAX_HWIFS=4
--CONFIG_BLK_DEV_IDE=y
--
--#
--# Please see Documentation/ide/ide.txt for help/info on IDE drives
--#
--# CONFIG_BLK_DEV_IDE_SATA is not set
--CONFIG_BLK_DEV_IDEDISK=y
--# CONFIG_IDEDISK_MULTI_MODE is not set
--CONFIG_BLK_DEV_IDECD=m
--CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
--# CONFIG_BLK_DEV_IDETAPE is not set
--# CONFIG_BLK_DEV_IDEFLOPPY is not set
--# CONFIG_BLK_DEV_IDESCSI is not set
--# CONFIG_IDE_TASK_IOCTL is not set
--CONFIG_IDE_PROC_FS=y
--
--#
--# IDE chipset support/bugfixes
--#
--CONFIG_IDE_GENERIC=y
--# CONFIG_BLK_DEV_PLATFORM is not set
--
--#
--# PCI IDE chipsets support
--#
--# CONFIG_BLK_DEV_GENERIC is not set
--# CONFIG_BLK_DEV_OPTI621 is not set
--# CONFIG_BLK_DEV_AEC62XX is not set
--# CONFIG_BLK_DEV_ALI15X3 is not set
--# CONFIG_BLK_DEV_AMD74XX is not set
--# CONFIG_BLK_DEV_CMD64X is not set
--# CONFIG_BLK_DEV_TRIFLEX is not set
--# CONFIG_BLK_DEV_CY82C693 is not set
--# CONFIG_BLK_DEV_CS5520 is not set
--# CONFIG_BLK_DEV_CS5530 is not set
--# CONFIG_BLK_DEV_HPT34X is not set
--# CONFIG_BLK_DEV_HPT366 is not set
--# CONFIG_BLK_DEV_JMICRON is not set
--# CONFIG_BLK_DEV_SC1200 is not set
--# CONFIG_BLK_DEV_PIIX is not set
--# CONFIG_BLK_DEV_IT8213 is not set
--# CONFIG_BLK_DEV_IT821X is not set
--# CONFIG_BLK_DEV_NS87415 is not set
--# CONFIG_BLK_DEV_PDC202XX_OLD is not set
--# CONFIG_BLK_DEV_PDC202XX_NEW is not set
--# CONFIG_BLK_DEV_SVWKS is not set
--# CONFIG_BLK_DEV_SIIMAGE is not set
--# CONFIG_BLK_DEV_SL82C105 is not set
--# CONFIG_BLK_DEV_SLC90E66 is not set
--# CONFIG_BLK_DEV_TRM290 is not set
--# CONFIG_BLK_DEV_VIA82CXXX is not set
--# CONFIG_BLK_DEV_TC86C001 is not set
--# CONFIG_BLK_DEV_IDEDMA is not set
--CONFIG_IDE_ARCH_OBSOLETE_INIT=y
--# CONFIG_BLK_DEV_HD is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=m
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--CONFIG_BLK_DEV_SD=m
--CONFIG_CHR_DEV_ST=m
--# CONFIG_CHR_DEV_OSST is not set
--CONFIG_BLK_DEV_SR=m
--# CONFIG_BLK_DEV_SR_VENDOR is not set
--CONFIG_CHR_DEV_SG=m
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--CONFIG_SCSI_MULTI_LUN=y
--CONFIG_SCSI_CONSTANTS=y
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--# CONFIG_SCSI_SPI_ATTRS is not set
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_PPA is not set
--# CONFIG_SCSI_IMM is not set
--# CONFIG_SCSI_MVSAS is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--CONFIG_MARVELL_PHY=y
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--# CONFIG_MII is not set
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--# CONFIG_NET_POCKET is not set
--# CONFIG_FS_ENET is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PLIP is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--CONFIG_INPUT_MOUSEDEV=y
--CONFIG_INPUT_MOUSEDEV_PSAUX=y
--CONFIG_INPUT_MOUSEDEV_SCREEN_X=1280
--CONFIG_INPUT_MOUSEDEV_SCREEN_Y=1024
--CONFIG_INPUT_JOYDEV=m
--CONFIG_INPUT_EVDEV=m
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--CONFIG_INPUT_KEYBOARD=y
--CONFIG_KEYBOARD_ATKBD=y
--# CONFIG_KEYBOARD_SUNKBD is not set
--# CONFIG_KEYBOARD_LKKBD is not set
--# CONFIG_KEYBOARD_XTKBD is not set
--# CONFIG_KEYBOARD_NEWTON is not set
--# CONFIG_KEYBOARD_STOWAWAY is not set
--CONFIG_INPUT_MOUSE=y
--CONFIG_MOUSE_PS2=y
--CONFIG_MOUSE_PS2_ALPS=y
--CONFIG_MOUSE_PS2_LOGIPS2PP=y
--CONFIG_MOUSE_PS2_SYNAPTICS=y
--CONFIG_MOUSE_PS2_LIFEBOOK=y
--CONFIG_MOUSE_PS2_TRACKPOINT=y
--# CONFIG_MOUSE_PS2_TOUCHKIT is not set
--# CONFIG_MOUSE_SERIAL is not set
--# CONFIG_MOUSE_APPLETOUCH is not set
--# CONFIG_MOUSE_VSXXXAA is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--CONFIG_SERIO=y
--CONFIG_SERIO_I8042=y
--CONFIG_SERIO_SERPORT=y
--# CONFIG_SERIO_PARKBD is not set
--# CONFIG_SERIO_PCIPS2 is not set
--CONFIG_SERIO_LIBPS2=y
--# CONFIG_SERIO_RAW is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--# CONFIG_SERIAL_8250 is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--CONFIG_SERIAL_CPM=y
--CONFIG_SERIAL_CPM_CONSOLE=y
--# CONFIG_SERIAL_CPM_SCC1 is not set
--CONFIG_SERIAL_CPM_SCC2=y
--# CONFIG_SERIAL_CPM_SCC3 is not set
--# CONFIG_SERIAL_CPM_SCC4 is not set
--# CONFIG_SERIAL_CPM_SMC1 is not set
--# CONFIG_SERIAL_CPM_SMC2 is not set
--# CONFIG_SERIAL_JSM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--CONFIG_PRINTER=m
--# CONFIG_LP_CONSOLE is not set
--# CONFIG_PPDEV is not set
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=m
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=m
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=m
--
--#
--# I2C Algorithms
--#
--CONFIG_I2C_ALGOBIT=m
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--# CONFIG_I2C_MPC is not set
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--# CONFIG_SENSORS_LM75 is not set
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--CONFIG_AGP=m
--CONFIG_DRM=m
--# CONFIG_DRM_TDFX is not set
--# CONFIG_DRM_R128 is not set
--# CONFIG_DRM_RADEON is not set
--# CONFIG_DRM_MGA is not set
--# CONFIG_DRM_SIS is not set
--# CONFIG_DRM_VIA is not set
--# CONFIG_DRM_SAVAGE is not set
--# CONFIG_VGASTATE is not set
--# CONFIG_VIDEO_OUTPUT_CONTROL is not set
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--CONFIG_SOUND=m
--
--#
--# Advanced Linux Sound Architecture
--#
--# CONFIG_SND is not set
--
--#
--# Open Sound System
--#
--# CONFIG_SOUND_PRIME is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--# CONFIG_AUXDISPLAY is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--CONFIG_AUTOFS_FS=m
--CONFIG_AUTOFS4_FS=y
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--CONFIG_ISO9660_FS=m
--# CONFIG_JOLIET is not set
--# CONFIG_ZISOFS is not set
--CONFIG_UDF_FS=m
--CONFIG_UDF_NLS=y
--
--#
--# DOS/FAT/NT Filesystems
--#
--CONFIG_FAT_FS=m
--CONFIG_MSDOS_FS=m
--CONFIG_VFAT_FS=m
--CONFIG_FAT_DEFAULT_CODEPAGE=437
--CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--# CONFIG_PROC_KCORE is not set
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_CRAMFS=m
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--CONFIG_SMB_FS=m
--# CONFIG_SMB_NLS_DEFAULT is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--CONFIG_NLS=y
--CONFIG_NLS_DEFAULT="iso8859-1"
--# CONFIG_NLS_CODEPAGE_437 is not set
--# CONFIG_NLS_CODEPAGE_737 is not set
--# CONFIG_NLS_CODEPAGE_775 is not set
--# CONFIG_NLS_CODEPAGE_850 is not set
--# CONFIG_NLS_CODEPAGE_852 is not set
--# CONFIG_NLS_CODEPAGE_855 is not set
--# CONFIG_NLS_CODEPAGE_857 is not set
--# CONFIG_NLS_CODEPAGE_860 is not set
--# CONFIG_NLS_CODEPAGE_861 is not set
--# CONFIG_NLS_CODEPAGE_862 is not set
--# CONFIG_NLS_CODEPAGE_863 is not set
--# CONFIG_NLS_CODEPAGE_864 is not set
--# CONFIG_NLS_CODEPAGE_865 is not set
--# CONFIG_NLS_CODEPAGE_866 is not set
--# CONFIG_NLS_CODEPAGE_869 is not set
--# CONFIG_NLS_CODEPAGE_936 is not set
--# CONFIG_NLS_CODEPAGE_950 is not set
--# CONFIG_NLS_CODEPAGE_932 is not set
--# CONFIG_NLS_CODEPAGE_949 is not set
--# CONFIG_NLS_CODEPAGE_874 is not set
--# CONFIG_NLS_ISO8859_8 is not set
--# CONFIG_NLS_CODEPAGE_1250 is not set
--# CONFIG_NLS_CODEPAGE_1251 is not set
--# CONFIG_NLS_ASCII is not set
--# CONFIG_NLS_ISO8859_1 is not set
--# CONFIG_NLS_ISO8859_2 is not set
--# CONFIG_NLS_ISO8859_3 is not set
--# CONFIG_NLS_ISO8859_4 is not set
--# CONFIG_NLS_ISO8859_5 is not set
--# CONFIG_NLS_ISO8859_6 is not set
--# CONFIG_NLS_ISO8859_7 is not set
--# CONFIG_NLS_ISO8859_9 is not set
--# CONFIG_NLS_ISO8859_13 is not set
--# CONFIG_NLS_ISO8859_14 is not set
--# CONFIG_NLS_ISO8859_15 is not set
--# CONFIG_NLS_KOI8_R is not set
--# CONFIG_NLS_KOI8_U is not set
--# CONFIG_NLS_UTF8 is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--CONFIG_CRC_CCITT=y
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=m
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_HIGHMEM is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_KGDB_CONSOLE is not set
--CONFIG_BDI_SWITCH=y
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--# CONFIG_CRYPTO_SEQIV is not set
--# CONFIG_CRYPTO_MANAGER is not set
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--# CONFIG_CRYPTO_MD5 is not set
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--# CONFIG_CRYPTO_CBC is not set
--# CONFIG_CRYPTO_PCBC is not set
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--# CONFIG_CRYPTO_DES is not set
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
--CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/taishan_defconfig
-+++ /dev/null
-@@ -1,815 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc2
--# Fri Feb 15 21:40:44 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--CONFIG_44x=y
--# CONFIG_E200 is not set
--CONFIG_4xx=y
--CONFIG_BOOKE=y
--CONFIG_PTE_64BIT=y
--CONFIG_PHYS_64BIT=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_NOT_COHERENT_CACHE=y
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--CONFIG_PPC_DCR_NATIVE=y
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_PPC_DCR=y
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_ALL is not set
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--CONFIG_LBD=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--# CONFIG_PREEMPT_RCU is not set
--# CONFIG_PPC4xx_PCI_EXPRESS is not set
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--# CONFIG_BAMBOO is not set
--# CONFIG_EBONY is not set
--# CONFIG_SEQUOIA is not set
--CONFIG_TAISHAN=y
--# CONFIG_KATMAI is not set
--# CONFIG_RAINIER is not set
--# CONFIG_WARP is not set
--CONFIG_440GX=y
--# CONFIG_IPIC is not set
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_RCU_TRACE=y
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_MATH_EMULATION is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--CONFIG_RESOURCES_64BIT=y
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--CONFIG_CMDLINE_BOOL=y
--CONFIG_CMDLINE=""
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_CONSISTENT_START=0xff100000
--CONFIG_CONSISTENT_SIZE=0x00200000
--CONFIG_BOOT_LOAD=0x01000000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--# CONFIG_IP_MULTICAST is not set
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--CONFIG_CONNECTOR=y
--CONFIG_PROC_EVENTS=y
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--# CONFIG_BLK_DEV_LOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=35000
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--# CONFIG_XILINX_SYSACE is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--CONFIG_MACINTOSH_DRIVERS=y
--# CONFIG_MAC_EMUMOUSEBTN is not set
--# CONFIG_WINDFARM is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--# CONFIG_PHYLIB is not set
--CONFIG_NET_ETHERNET=y
--# CONFIG_MII is not set
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--CONFIG_IBM_NEW_EMAC=y
--CONFIG_IBM_NEW_EMAC_RXB=128
--CONFIG_IBM_NEW_EMAC_TXB=64
--CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
--CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
--CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
--# CONFIG_IBM_NEW_EMAC_DEBUG is not set
--CONFIG_IBM_NEW_EMAC_ZMII=y
--CONFIG_IBM_NEW_EMAC_RGMII=y
--CONFIG_IBM_NEW_EMAC_TAH=y
--CONFIG_IBM_NEW_EMAC_EMAC4=y
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--# CONFIG_SERIAL_8250_PCI is not set
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--CONFIG_SERIAL_8250_EXTENDED=y
--# CONFIG_SERIAL_8250_MANY_PORTS is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--# CONFIG_SERIAL_8250_DETECT_IRQ is not set
--# CONFIG_SERIAL_8250_RSA is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--CONFIG_SERIAL_OF_PLATFORM=y
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--CONFIG_THERMAL=y
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_MAGIC_SYSRQ=y
--# CONFIG_UNUSED_SYMBOLS is not set
--CONFIG_DEBUG_FS=y
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--CONFIG_DEBUGGER=y
--# CONFIG_KGDB is not set
--# CONFIG_XMON is not set
--# CONFIG_VIRQ_DEBUG is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=y
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=y
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/tqm8540_defconfig
-+++ /dev/null
-@@ -1,1097 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:43 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--# CONFIG_HOTPLUG is not set
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--# CONFIG_MODULES is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--# CONFIG_MPC8540_ADS is not set
--# CONFIG_MPC8560_ADS is not set
--# CONFIG_MPC85xx_CDS is not set
--# CONFIG_MPC85xx_MDS is not set
--# CONFIG_MPC85xx_DS is not set
--# CONFIG_STX_GP3 is not set
--CONFIG_TQM8540=y
--# CONFIG_TQM8541 is not set
--# CONFIG_TQM8555 is not set
--# CONFIG_TQM8560 is not set
--# CONFIG_SBC8548 is not set
--# CONFIG_SBC8560 is not set
--CONFIG_TQM85xx=y
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_CPM2 is not set
--CONFIG_PPC_CPM_NEW_BINDING=y
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--# CONFIG_PROC_DEVICETREE is not set
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_FSL_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--CONFIG_MTD_CONCAT=y
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--CONFIG_MTD_CMDLINE_PARTS=y
--# CONFIG_MTD_OF_PARTS is not set
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--CONFIG_MTD_BLKDEVS=y
--CONFIG_MTD_BLOCK=y
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--# CONFIG_MTD_JEDECPROBE is not set
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--# CONFIG_MTD_PHYSMAP_OF is not set
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--CONFIG_IDE=y
--CONFIG_IDE_MAX_HWIFS=4
--CONFIG_BLK_DEV_IDE=y
--
--#
--# Please see Documentation/ide/ide.txt for help/info on IDE drives
--#
--# CONFIG_BLK_DEV_IDE_SATA is not set
--CONFIG_BLK_DEV_IDEDISK=y
--# CONFIG_IDEDISK_MULTI_MODE is not set
--# CONFIG_BLK_DEV_IDECD is not set
--# CONFIG_BLK_DEV_IDETAPE is not set
--# CONFIG_BLK_DEV_IDEFLOPPY is not set
--# CONFIG_IDE_TASK_IOCTL is not set
--CONFIG_IDE_PROC_FS=y
--
--#
--# IDE chipset support/bugfixes
--#
--CONFIG_IDE_GENERIC=y
--# CONFIG_BLK_DEV_PLATFORM is not set
--CONFIG_BLK_DEV_IDEDMA_SFF=y
--
--#
--# PCI IDE chipsets support
--#
--CONFIG_BLK_DEV_IDEPCI=y
--CONFIG_IDEPCI_PCIBUS_ORDER=y
--# CONFIG_BLK_DEV_OFFBOARD is not set
--CONFIG_BLK_DEV_GENERIC=y
--# CONFIG_BLK_DEV_OPTI621 is not set
--CONFIG_BLK_DEV_IDEDMA_PCI=y
--# CONFIG_BLK_DEV_AEC62XX is not set
--# CONFIG_BLK_DEV_ALI15X3 is not set
--# CONFIG_BLK_DEV_AMD74XX is not set
--# CONFIG_BLK_DEV_CMD64X is not set
--# CONFIG_BLK_DEV_TRIFLEX is not set
--# CONFIG_BLK_DEV_CY82C693 is not set
--# CONFIG_BLK_DEV_CS5520 is not set
--# CONFIG_BLK_DEV_CS5530 is not set
--# CONFIG_BLK_DEV_HPT34X is not set
--# CONFIG_BLK_DEV_HPT366 is not set
--# CONFIG_BLK_DEV_JMICRON is not set
--# CONFIG_BLK_DEV_SC1200 is not set
--# CONFIG_BLK_DEV_PIIX is not set
--# CONFIG_BLK_DEV_IT8213 is not set
--# CONFIG_BLK_DEV_IT821X is not set
--# CONFIG_BLK_DEV_NS87415 is not set
--# CONFIG_BLK_DEV_PDC202XX_OLD is not set
--# CONFIG_BLK_DEV_PDC202XX_NEW is not set
--# CONFIG_BLK_DEV_SVWKS is not set
--# CONFIG_BLK_DEV_SIIMAGE is not set
--# CONFIG_BLK_DEV_SL82C105 is not set
--# CONFIG_BLK_DEV_SLC90E66 is not set
--# CONFIG_BLK_DEV_TRM290 is not set
--CONFIG_BLK_DEV_VIA82CXXX=y
--# CONFIG_BLK_DEV_TC86C001 is not set
--CONFIG_BLK_DEV_IDEDMA=y
--CONFIG_IDE_ARCH_OBSOLETE_INIT=y
--# CONFIG_BLK_DEV_HD is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--CONFIG_NET_PCI=y
--# CONFIG_PCNET32 is not set
--# CONFIG_AMD8111_ETH is not set
--# CONFIG_ADAPTEC_STARFIRE is not set
--# CONFIG_B44 is not set
--# CONFIG_FORCEDETH is not set
--# CONFIG_EEPRO100 is not set
--CONFIG_E100=y
--# CONFIG_FEALNX is not set
--# CONFIG_NATSEMI is not set
--# CONFIG_NE2K_PCI is not set
--# CONFIG_8139CP is not set
--# CONFIG_8139TOO is not set
--# CONFIG_R6040 is not set
--# CONFIG_SIS900 is not set
--# CONFIG_EPIC100 is not set
--# CONFIG_SUNDANCE is not set
--# CONFIG_TLAN is not set
--# CONFIG_VIA_RHINE is not set
--# CONFIG_SC92031 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--CONFIG_SENSORS_LM75=y
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--CONFIG_HWMON_DEBUG_CHIP=y
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--# CONFIG_VIDEO_OUTPUT_CONTROL is not set
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_JFFS2_FS=y
--CONFIG_JFFS2_FS_DEBUG=0
--CONFIG_JFFS2_FS_WRITEBUFFER=y
--# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
--# CONFIG_JFFS2_SUMMARY is not set
--# CONFIG_JFFS2_FS_XATTR is not set
--# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
--CONFIG_JFFS2_ZLIB=y
--# CONFIG_JFFS2_LZO is not set
--CONFIG_JFFS2_RTIME=y
--# CONFIG_JFFS2_RUBIN is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--# CONFIG_NFS_V3 is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--# CONFIG_MSDOS_PARTITION is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_ZLIB_DEFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--# CONFIG_CRYPTO_SEQIV is not set
--# CONFIG_CRYPTO_MANAGER is not set
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--# CONFIG_CRYPTO_MD5 is not set
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--# CONFIG_CRYPTO_CBC is not set
--# CONFIG_CRYPTO_PCBC is not set
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--# CONFIG_CRYPTO_DES is not set
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/tqm8541_defconfig
-+++ /dev/null
-@@ -1,1109 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:44 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--# CONFIG_HOTPLUG is not set
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--# CONFIG_MODULES is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--# CONFIG_MPC8540_ADS is not set
--# CONFIG_MPC8560_ADS is not set
--# CONFIG_MPC85xx_CDS is not set
--# CONFIG_MPC85xx_MDS is not set
--# CONFIG_MPC85xx_DS is not set
--# CONFIG_STX_GP3 is not set
--# CONFIG_TQM8540 is not set
--CONFIG_TQM8541=y
--# CONFIG_TQM8555 is not set
--# CONFIG_TQM8560 is not set
--# CONFIG_SBC8548 is not set
--# CONFIG_SBC8560 is not set
--CONFIG_TQM85xx=y
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--CONFIG_CPM2=y
--CONFIG_PPC_CPM_NEW_BINDING=y
--# CONFIG_FSL_ULI1575 is not set
--CONFIG_CPM=y
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--# CONFIG_PROC_DEVICETREE is not set
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_FSL_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--CONFIG_MTD_CONCAT=y
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--CONFIG_MTD_CMDLINE_PARTS=y
--# CONFIG_MTD_OF_PARTS is not set
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--CONFIG_MTD_BLKDEVS=y
--CONFIG_MTD_BLOCK=y
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--# CONFIG_MTD_JEDECPROBE is not set
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--# CONFIG_MTD_PHYSMAP_OF is not set
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--CONFIG_IDE=y
--CONFIG_IDE_MAX_HWIFS=4
--CONFIG_BLK_DEV_IDE=y
--
--#
--# Please see Documentation/ide/ide.txt for help/info on IDE drives
--#
--# CONFIG_BLK_DEV_IDE_SATA is not set
--CONFIG_BLK_DEV_IDEDISK=y
--# CONFIG_IDEDISK_MULTI_MODE is not set
--# CONFIG_BLK_DEV_IDECD is not set
--# CONFIG_BLK_DEV_IDETAPE is not set
--# CONFIG_BLK_DEV_IDEFLOPPY is not set
--# CONFIG_IDE_TASK_IOCTL is not set
--CONFIG_IDE_PROC_FS=y
--
--#
--# IDE chipset support/bugfixes
--#
--CONFIG_IDE_GENERIC=y
--# CONFIG_BLK_DEV_PLATFORM is not set
--CONFIG_BLK_DEV_IDEDMA_SFF=y
--
--#
--# PCI IDE chipsets support
--#
--CONFIG_BLK_DEV_IDEPCI=y
--CONFIG_IDEPCI_PCIBUS_ORDER=y
--# CONFIG_BLK_DEV_OFFBOARD is not set
--CONFIG_BLK_DEV_GENERIC=y
--# CONFIG_BLK_DEV_OPTI621 is not set
--CONFIG_BLK_DEV_IDEDMA_PCI=y
--# CONFIG_BLK_DEV_AEC62XX is not set
--# CONFIG_BLK_DEV_ALI15X3 is not set
--# CONFIG_BLK_DEV_AMD74XX is not set
--# CONFIG_BLK_DEV_CMD64X is not set
--# CONFIG_BLK_DEV_TRIFLEX is not set
--# CONFIG_BLK_DEV_CY82C693 is not set
--# CONFIG_BLK_DEV_CS5520 is not set
--# CONFIG_BLK_DEV_CS5530 is not set
--# CONFIG_BLK_DEV_HPT34X is not set
--# CONFIG_BLK_DEV_HPT366 is not set
--# CONFIG_BLK_DEV_JMICRON is not set
--# CONFIG_BLK_DEV_SC1200 is not set
--# CONFIG_BLK_DEV_PIIX is not set
--# CONFIG_BLK_DEV_IT8213 is not set
--# CONFIG_BLK_DEV_IT821X is not set
--# CONFIG_BLK_DEV_NS87415 is not set
--# CONFIG_BLK_DEV_PDC202XX_OLD is not set
--# CONFIG_BLK_DEV_PDC202XX_NEW is not set
--# CONFIG_BLK_DEV_SVWKS is not set
--# CONFIG_BLK_DEV_SIIMAGE is not set
--# CONFIG_BLK_DEV_SL82C105 is not set
--# CONFIG_BLK_DEV_SLC90E66 is not set
--# CONFIG_BLK_DEV_TRM290 is not set
--CONFIG_BLK_DEV_VIA82CXXX=y
--# CONFIG_BLK_DEV_TC86C001 is not set
--CONFIG_BLK_DEV_IDEDMA=y
--CONFIG_IDE_ARCH_OBSOLETE_INIT=y
--# CONFIG_BLK_DEV_HD is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--CONFIG_NET_PCI=y
--# CONFIG_PCNET32 is not set
--# CONFIG_AMD8111_ETH is not set
--# CONFIG_ADAPTEC_STARFIRE is not set
--# CONFIG_B44 is not set
--# CONFIG_FORCEDETH is not set
--# CONFIG_EEPRO100 is not set
--CONFIG_E100=y
--# CONFIG_FEALNX is not set
--# CONFIG_NATSEMI is not set
--# CONFIG_NE2K_PCI is not set
--# CONFIG_8139CP is not set
--# CONFIG_8139TOO is not set
--# CONFIG_R6040 is not set
--# CONFIG_SIS900 is not set
--# CONFIG_EPIC100 is not set
--# CONFIG_SUNDANCE is not set
--# CONFIG_TLAN is not set
--# CONFIG_VIA_RHINE is not set
--# CONFIG_SC92031 is not set
--# CONFIG_FS_ENET is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--CONFIG_SERIAL_CPM=y
--CONFIG_SERIAL_CPM_CONSOLE=y
--CONFIG_SERIAL_CPM_SCC1=y
--# CONFIG_SERIAL_CPM_SCC2 is not set
--# CONFIG_SERIAL_CPM_SCC3 is not set
--# CONFIG_SERIAL_CPM_SCC4 is not set
--# CONFIG_SERIAL_CPM_SMC1 is not set
--# CONFIG_SERIAL_CPM_SMC2 is not set
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--CONFIG_SENSORS_LM75=y
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--CONFIG_HWMON_DEBUG_CHIP=y
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--# CONFIG_VIDEO_OUTPUT_CONTROL is not set
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_JFFS2_FS=y
--CONFIG_JFFS2_FS_DEBUG=0
--CONFIG_JFFS2_FS_WRITEBUFFER=y
--# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
--# CONFIG_JFFS2_SUMMARY is not set
--# CONFIG_JFFS2_FS_XATTR is not set
--# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
--CONFIG_JFFS2_ZLIB=y
--# CONFIG_JFFS2_LZO is not set
--CONFIG_JFFS2_RTIME=y
--# CONFIG_JFFS2_RUBIN is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--# CONFIG_NFS_V3 is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--# CONFIG_MSDOS_PARTITION is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_ZLIB_DEFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_KGDB_CONSOLE is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--# CONFIG_CRYPTO_SEQIV is not set
--# CONFIG_CRYPTO_MANAGER is not set
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--# CONFIG_CRYPTO_MD5 is not set
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--# CONFIG_CRYPTO_CBC is not set
--# CONFIG_CRYPTO_PCBC is not set
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--# CONFIG_CRYPTO_DES is not set
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
--CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/tqm8555_defconfig
-+++ /dev/null
-@@ -1,1109 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:44 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--# CONFIG_HOTPLUG is not set
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--# CONFIG_MODULES is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--# CONFIG_MPC8540_ADS is not set
--# CONFIG_MPC8560_ADS is not set
--# CONFIG_MPC85xx_CDS is not set
--# CONFIG_MPC85xx_MDS is not set
--# CONFIG_MPC85xx_DS is not set
--# CONFIG_STX_GP3 is not set
--# CONFIG_TQM8540 is not set
--# CONFIG_TQM8541 is not set
--CONFIG_TQM8555=y
--# CONFIG_TQM8560 is not set
--# CONFIG_SBC8548 is not set
--# CONFIG_SBC8560 is not set
--CONFIG_TQM85xx=y
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--CONFIG_CPM2=y
--CONFIG_PPC_CPM_NEW_BINDING=y
--# CONFIG_FSL_ULI1575 is not set
--CONFIG_CPM=y
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--# CONFIG_PROC_DEVICETREE is not set
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_FSL_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--CONFIG_MTD_CONCAT=y
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--CONFIG_MTD_CMDLINE_PARTS=y
--# CONFIG_MTD_OF_PARTS is not set
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--CONFIG_MTD_BLKDEVS=y
--CONFIG_MTD_BLOCK=y
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--# CONFIG_MTD_JEDECPROBE is not set
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--# CONFIG_MTD_PHYSMAP_OF is not set
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--CONFIG_IDE=y
--CONFIG_IDE_MAX_HWIFS=4
--CONFIG_BLK_DEV_IDE=y
--
--#
--# Please see Documentation/ide/ide.txt for help/info on IDE drives
--#
--# CONFIG_BLK_DEV_IDE_SATA is not set
--CONFIG_BLK_DEV_IDEDISK=y
--# CONFIG_IDEDISK_MULTI_MODE is not set
--# CONFIG_BLK_DEV_IDECD is not set
--# CONFIG_BLK_DEV_IDETAPE is not set
--# CONFIG_BLK_DEV_IDEFLOPPY is not set
--# CONFIG_IDE_TASK_IOCTL is not set
--CONFIG_IDE_PROC_FS=y
--
--#
--# IDE chipset support/bugfixes
--#
--CONFIG_IDE_GENERIC=y
--# CONFIG_BLK_DEV_PLATFORM is not set
--CONFIG_BLK_DEV_IDEDMA_SFF=y
--
--#
--# PCI IDE chipsets support
--#
--CONFIG_BLK_DEV_IDEPCI=y
--CONFIG_IDEPCI_PCIBUS_ORDER=y
--# CONFIG_BLK_DEV_OFFBOARD is not set
--CONFIG_BLK_DEV_GENERIC=y
--# CONFIG_BLK_DEV_OPTI621 is not set
--CONFIG_BLK_DEV_IDEDMA_PCI=y
--# CONFIG_BLK_DEV_AEC62XX is not set
--# CONFIG_BLK_DEV_ALI15X3 is not set
--# CONFIG_BLK_DEV_AMD74XX is not set
--# CONFIG_BLK_DEV_CMD64X is not set
--# CONFIG_BLK_DEV_TRIFLEX is not set
--# CONFIG_BLK_DEV_CY82C693 is not set
--# CONFIG_BLK_DEV_CS5520 is not set
--# CONFIG_BLK_DEV_CS5530 is not set
--# CONFIG_BLK_DEV_HPT34X is not set
--# CONFIG_BLK_DEV_HPT366 is not set
--# CONFIG_BLK_DEV_JMICRON is not set
--# CONFIG_BLK_DEV_SC1200 is not set
--# CONFIG_BLK_DEV_PIIX is not set
--# CONFIG_BLK_DEV_IT8213 is not set
--# CONFIG_BLK_DEV_IT821X is not set
--# CONFIG_BLK_DEV_NS87415 is not set
--# CONFIG_BLK_DEV_PDC202XX_OLD is not set
--# CONFIG_BLK_DEV_PDC202XX_NEW is not set
--# CONFIG_BLK_DEV_SVWKS is not set
--# CONFIG_BLK_DEV_SIIMAGE is not set
--# CONFIG_BLK_DEV_SL82C105 is not set
--# CONFIG_BLK_DEV_SLC90E66 is not set
--# CONFIG_BLK_DEV_TRM290 is not set
--CONFIG_BLK_DEV_VIA82CXXX=y
--# CONFIG_BLK_DEV_TC86C001 is not set
--CONFIG_BLK_DEV_IDEDMA=y
--CONFIG_IDE_ARCH_OBSOLETE_INIT=y
--# CONFIG_BLK_DEV_HD is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--CONFIG_NET_PCI=y
--# CONFIG_PCNET32 is not set
--# CONFIG_AMD8111_ETH is not set
--# CONFIG_ADAPTEC_STARFIRE is not set
--# CONFIG_B44 is not set
--# CONFIG_FORCEDETH is not set
--# CONFIG_EEPRO100 is not set
--CONFIG_E100=y
--# CONFIG_FEALNX is not set
--# CONFIG_NATSEMI is not set
--# CONFIG_NE2K_PCI is not set
--# CONFIG_8139CP is not set
--# CONFIG_8139TOO is not set
--# CONFIG_R6040 is not set
--# CONFIG_SIS900 is not set
--# CONFIG_EPIC100 is not set
--# CONFIG_SUNDANCE is not set
--# CONFIG_TLAN is not set
--# CONFIG_VIA_RHINE is not set
--# CONFIG_SC92031 is not set
--# CONFIG_FS_ENET is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--CONFIG_SERIAL_CPM=y
--CONFIG_SERIAL_CPM_CONSOLE=y
--CONFIG_SERIAL_CPM_SCC1=y
--# CONFIG_SERIAL_CPM_SCC2 is not set
--# CONFIG_SERIAL_CPM_SCC3 is not set
--# CONFIG_SERIAL_CPM_SCC4 is not set
--# CONFIG_SERIAL_CPM_SMC1 is not set
--# CONFIG_SERIAL_CPM_SMC2 is not set
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--CONFIG_SENSORS_LM75=y
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--CONFIG_HWMON_DEBUG_CHIP=y
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--# CONFIG_VIDEO_OUTPUT_CONTROL is not set
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_JFFS2_FS=y
--CONFIG_JFFS2_FS_DEBUG=0
--CONFIG_JFFS2_FS_WRITEBUFFER=y
--# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
--# CONFIG_JFFS2_SUMMARY is not set
--# CONFIG_JFFS2_FS_XATTR is not set
--# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
--CONFIG_JFFS2_ZLIB=y
--# CONFIG_JFFS2_LZO is not set
--CONFIG_JFFS2_RTIME=y
--# CONFIG_JFFS2_RUBIN is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--# CONFIG_NFS_V3 is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--# CONFIG_MSDOS_PARTITION is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_ZLIB_DEFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_KGDB_CONSOLE is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--# CONFIG_CRYPTO_SEQIV is not set
--# CONFIG_CRYPTO_MANAGER is not set
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--# CONFIG_CRYPTO_MD5 is not set
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--# CONFIG_CRYPTO_CBC is not set
--# CONFIG_CRYPTO_PCBC is not set
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--# CONFIG_CRYPTO_DES is not set
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
--CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/tqm8560_defconfig
-+++ /dev/null
-@@ -1,1109 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc6
--# Mon Mar 24 08:48:45 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--CONFIG_PPC_85xx=y
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_E500=y
--CONFIG_BOOKE=y
--CONFIG_FSL_BOOKE=y
--CONFIG_FSL_EMB_PERFMON=y
--# CONFIG_PHYS_64BIT is not set
--CONFIG_SPE=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--CONFIG_DEFAULT_UIMAGE=y
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--# CONFIG_KALLSYMS is not set
--# CONFIG_HOTPLUG is not set
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--CONFIG_HAVE_KPROBES=y
--CONFIG_HAVE_KRETPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--# CONFIG_MODULES is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--CONFIG_MPC85xx=y
--# CONFIG_MPC8540_ADS is not set
--# CONFIG_MPC8560_ADS is not set
--# CONFIG_MPC85xx_CDS is not set
--# CONFIG_MPC85xx_MDS is not set
--# CONFIG_MPC85xx_DS is not set
--# CONFIG_STX_GP3 is not set
--# CONFIG_TQM8540 is not set
--# CONFIG_TQM8541 is not set
--# CONFIG_TQM8555 is not set
--CONFIG_TQM8560=y
--# CONFIG_SBC8548 is not set
--# CONFIG_SBC8560 is not set
--CONFIG_TQM85xx=y
--# CONFIG_IPIC is not set
--CONFIG_MPIC=y
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--CONFIG_CPM2=y
--CONFIG_PPC_CPM_NEW_BINDING=y
--# CONFIG_FSL_ULI1575 is not set
--CONFIG_CPM=y
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--CONFIG_MATH_EMULATION=y
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--# CONFIG_PROC_DEVICETREE is not set
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_FSL_SOC=y
--CONFIG_FSL_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--CONFIG_MTD_CONCAT=y
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--CONFIG_MTD_CMDLINE_PARTS=y
--# CONFIG_MTD_OF_PARTS is not set
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--CONFIG_MTD_BLKDEVS=y
--CONFIG_MTD_BLOCK=y
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--# CONFIG_MTD_JEDECPROBE is not set
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--# CONFIG_MTD_PHYSMAP_OF is not set
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--CONFIG_IDE=y
--CONFIG_IDE_MAX_HWIFS=4
--CONFIG_BLK_DEV_IDE=y
--
--#
--# Please see Documentation/ide/ide.txt for help/info on IDE drives
--#
--# CONFIG_BLK_DEV_IDE_SATA is not set
--CONFIG_BLK_DEV_IDEDISK=y
--# CONFIG_IDEDISK_MULTI_MODE is not set
--# CONFIG_BLK_DEV_IDECD is not set
--# CONFIG_BLK_DEV_IDETAPE is not set
--# CONFIG_BLK_DEV_IDEFLOPPY is not set
--# CONFIG_IDE_TASK_IOCTL is not set
--CONFIG_IDE_PROC_FS=y
--
--#
--# IDE chipset support/bugfixes
--#
--CONFIG_IDE_GENERIC=y
--# CONFIG_BLK_DEV_PLATFORM is not set
--CONFIG_BLK_DEV_IDEDMA_SFF=y
--
--#
--# PCI IDE chipsets support
--#
--CONFIG_BLK_DEV_IDEPCI=y
--CONFIG_IDEPCI_PCIBUS_ORDER=y
--# CONFIG_BLK_DEV_OFFBOARD is not set
--CONFIG_BLK_DEV_GENERIC=y
--# CONFIG_BLK_DEV_OPTI621 is not set
--CONFIG_BLK_DEV_IDEDMA_PCI=y
--# CONFIG_BLK_DEV_AEC62XX is not set
--# CONFIG_BLK_DEV_ALI15X3 is not set
--# CONFIG_BLK_DEV_AMD74XX is not set
--# CONFIG_BLK_DEV_CMD64X is not set
--# CONFIG_BLK_DEV_TRIFLEX is not set
--# CONFIG_BLK_DEV_CY82C693 is not set
--# CONFIG_BLK_DEV_CS5520 is not set
--# CONFIG_BLK_DEV_CS5530 is not set
--# CONFIG_BLK_DEV_HPT34X is not set
--# CONFIG_BLK_DEV_HPT366 is not set
--# CONFIG_BLK_DEV_JMICRON is not set
--# CONFIG_BLK_DEV_SC1200 is not set
--# CONFIG_BLK_DEV_PIIX is not set
--# CONFIG_BLK_DEV_IT8213 is not set
--# CONFIG_BLK_DEV_IT821X is not set
--# CONFIG_BLK_DEV_NS87415 is not set
--# CONFIG_BLK_DEV_PDC202XX_OLD is not set
--# CONFIG_BLK_DEV_PDC202XX_NEW is not set
--# CONFIG_BLK_DEV_SVWKS is not set
--# CONFIG_BLK_DEV_SIIMAGE is not set
--# CONFIG_BLK_DEV_SL82C105 is not set
--# CONFIG_BLK_DEV_SLC90E66 is not set
--# CONFIG_BLK_DEV_TRM290 is not set
--CONFIG_BLK_DEV_VIA82CXXX=y
--# CONFIG_BLK_DEV_TC86C001 is not set
--CONFIG_BLK_DEV_IDEDMA=y
--CONFIG_IDE_ARCH_OBSOLETE_INIT=y
--# CONFIG_BLK_DEV_HD is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=y
--
--#
--# MII PHY device drivers
--#
--# CONFIG_MARVELL_PHY is not set
--# CONFIG_DAVICOM_PHY is not set
--# CONFIG_QSEMI_PHY is not set
--# CONFIG_LXT_PHY is not set
--# CONFIG_CICADA_PHY is not set
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_FIXED_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--CONFIG_NET_PCI=y
--# CONFIG_PCNET32 is not set
--# CONFIG_AMD8111_ETH is not set
--# CONFIG_ADAPTEC_STARFIRE is not set
--# CONFIG_B44 is not set
--# CONFIG_FORCEDETH is not set
--# CONFIG_EEPRO100 is not set
--CONFIG_E100=y
--# CONFIG_FEALNX is not set
--# CONFIG_NATSEMI is not set
--# CONFIG_NE2K_PCI is not set
--# CONFIG_8139CP is not set
--# CONFIG_8139TOO is not set
--# CONFIG_R6040 is not set
--# CONFIG_SIS900 is not set
--# CONFIG_EPIC100 is not set
--# CONFIG_SUNDANCE is not set
--# CONFIG_TLAN is not set
--# CONFIG_VIA_RHINE is not set
--# CONFIG_SC92031 is not set
--# CONFIG_FS_ENET is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--CONFIG_GIANFAR=y
--CONFIG_GFAR_NAPI=y
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--# CONFIG_INPUT_FF_MEMLESS is not set
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--# CONFIG_INPUT_MOUSEDEV is not set
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--# CONFIG_INPUT_KEYBOARD is not set
--# CONFIG_INPUT_MOUSE is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--# CONFIG_SERIAL_8250_EXTENDED is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--CONFIG_SERIAL_CPM=y
--CONFIG_SERIAL_CPM_CONSOLE=y
--CONFIG_SERIAL_CPM_SCC1=y
--# CONFIG_SERIAL_CPM_SCC2 is not set
--# CONFIG_SERIAL_CPM_SCC3 is not set
--# CONFIG_SERIAL_CPM_SCC4 is not set
--# CONFIG_SERIAL_CPM_SMC1 is not set
--# CONFIG_SERIAL_CPM_SMC2 is not set
--# CONFIG_SERIAL_JSM is not set
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--CONFIG_GEN_RTC=y
--# CONFIG_GEN_RTC_X is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=y
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_I810 is not set
--# CONFIG_I2C_PIIX4 is not set
--CONFIG_I2C_MPC=y
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_PROSAVAGE is not set
--# CONFIG_I2C_SAVAGE4 is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_VIA is not set
--# CONFIG_I2C_VIAPRO is not set
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_SENSORS_EEPROM is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ADT7473 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_I5K_AMB is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--CONFIG_SENSORS_LM75=y
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_SIS5595 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VIA686A is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_VT8231 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--CONFIG_HWMON_DEBUG_CHIP=y
--# CONFIG_THERMAL is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--CONFIG_DAB=y
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--# CONFIG_VIDEO_OUTPUT_CONTROL is not set
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--# CONFIG_HIDRAW is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--# CONFIG_DMADEVICES is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_JFFS2_FS=y
--CONFIG_JFFS2_FS_DEBUG=0
--CONFIG_JFFS2_FS_WRITEBUFFER=y
--# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
--# CONFIG_JFFS2_SUMMARY is not set
--# CONFIG_JFFS2_FS_XATTR is not set
--# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
--CONFIG_JFFS2_ZLIB=y
--# CONFIG_JFFS2_LZO is not set
--CONFIG_JFFS2_RTIME=y
--# CONFIG_JFFS2_RUBIN is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--# CONFIG_NFS_V3 is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--# CONFIG_MSDOS_PARTITION is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_ZLIB_DEFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_KGDB_CONSOLE is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--# CONFIG_CRYPTO_SEQIV is not set
--# CONFIG_CRYPTO_MANAGER is not set
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--# CONFIG_CRYPTO_MD5 is not set
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--# CONFIG_CRYPTO_CBC is not set
--# CONFIG_CRYPTO_PCBC is not set
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--# CONFIG_CRYPTO_DES is not set
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
--CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/walnut_defconfig
-+++ /dev/null
-@@ -1,887 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc2
--# Fri Feb 15 21:54:12 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--CONFIG_40x=y
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_4xx=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_NOT_COHERENT_CACHE=y
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--CONFIG_PPC_DCR_NATIVE=y
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_PPC_DCR=y
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--CONFIG_KALLSYMS_ALL=y
--CONFIG_KALLSYMS_EXTRA_PASS=y
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--CONFIG_LBD=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--# CONFIG_PREEMPT_RCU is not set
--# CONFIG_PPC4xx_PCI_EXPRESS is not set
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--# CONFIG_EP405 is not set
--# CONFIG_KILAUEA is not set
--# CONFIG_MAKALU is not set
--CONFIG_WALNUT=y
--# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
--CONFIG_405GP=y
--CONFIG_IBM405_ERR77=y
--CONFIG_IBM405_ERR51=y
--# CONFIG_IPIC is not set
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--CONFIG_OF_RTC=y
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_RCU_TRACE=y
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_MATH_EMULATION is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--CONFIG_RESOURCES_64BIT=y
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--# CONFIG_PM is not set
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_PPC_INDIRECT_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--# CONFIG_PCI_LEGACY is not set
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_CONSISTENT_START=0xff100000
--CONFIG_CONSISTENT_SIZE=0x00200000
--CONFIG_BOOT_LOAD=0x00400000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--# CONFIG_IP_MULTICAST is not set
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--# CONFIG_INET_XFRM_MODE_BEET is not set
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--CONFIG_CONNECTOR=y
--CONFIG_PROC_EVENTS=y
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--CONFIG_MTD_CMDLINE_PARTS=y
--CONFIG_MTD_OF_PARTS=y
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--CONFIG_MTD_BLKDEVS=m
--CONFIG_MTD_BLOCK=m
--# CONFIG_MTD_BLOCK_RO is not set
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--CONFIG_MTD_JEDECPROBE=y
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--CONFIG_MTD_PHYSMAP_OF=y
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--# CONFIG_BLK_DEV_LOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=35000
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--# CONFIG_XILINX_SYSACE is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--# CONFIG_SCSI is not set
--# CONFIG_SCSI_DMA is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_ARCNET is not set
--# CONFIG_PHYLIB is not set
--CONFIG_NET_ETHERNET=y
--# CONFIG_MII is not set
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_HP100 is not set
--CONFIG_IBM_NEW_EMAC=y
--CONFIG_IBM_NEW_EMAC_RXB=128
--CONFIG_IBM_NEW_EMAC_TXB=64
--CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
--CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
--CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
--# CONFIG_IBM_NEW_EMAC_DEBUG is not set
--CONFIG_IBM_NEW_EMAC_ZMII=y
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_NET_PCI is not set
--# CONFIG_B44 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_E1000E_ENABLED is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--CONFIG_SERIAL_8250_EXTENDED=y
--# CONFIG_SERIAL_8250_MANY_PORTS is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--# CONFIG_SERIAL_8250_DETECT_IRQ is not set
--# CONFIG_SERIAL_8250_RSA is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--CONFIG_SERIAL_OF_PLATFORM=y
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--CONFIG_THERMAL=y
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--# CONFIG_DAB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_JFFS2_FS is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_MAGIC_SYSRQ=y
--# CONFIG_UNUSED_SYMBOLS is not set
--CONFIG_DEBUG_FS=y
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_SLUB_STATS is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--CONFIG_DEBUG_BUGVERBOSE=y
--# CONFIG_DEBUG_INFO is not set
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_VIRQ_DEBUG is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_BLKCIPHER=y
--# CONFIG_CRYPTO_SEQIV is not set
--CONFIG_CRYPTO_MANAGER=y
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=y
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--CONFIG_CRYPTO_ECB=y
--CONFIG_CRYPTO_CBC=y
--CONFIG_CRYPTO_PCBC=y
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_DES=y
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_CRYPTO_DEV_HIFN_795X is not set
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/warp_defconfig
-+++ /dev/null
-@@ -1,1110 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.25-rc2
--# Fri Feb 15 21:54:43 2008
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--# CONFIG_6xx is not set
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--CONFIG_44x=y
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--CONFIG_4xx=y
--CONFIG_BOOKE=y
--CONFIG_PTE_64BIT=y
--CONFIG_PHYS_64BIT=y
--# CONFIG_PPC_MM_SLICES is not set
--CONFIG_NOT_COHERENT_CACHE=y
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--CONFIG_PPC_UDBG_16550=y
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--CONFIG_PPC_DCR_NATIVE=y
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_PPC_DCR=y
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION="-pika"
--# CONFIG_LOCALVERSION_AUTO is not set
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--CONFIG_GROUP_SCHED=y
--CONFIG_FAIR_GROUP_SCHED=y
--# CONFIG_RT_GROUP_SCHED is not set
--CONFIG_USER_SCHED=y
--# CONFIG_CGROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--# CONFIG_NAMESPACES is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_ALL is not set
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--# CONFIG_HOTPLUG is not set
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_COMPAT_BRK=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLAB=y
--# CONFIG_SLUB is not set
--# CONFIG_SLOB is not set
--# CONFIG_PROFILING is not set
--# CONFIG_MARKERS is not set
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_KPROBES is not set
--CONFIG_HAVE_KPROBES=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--CONFIG_CLASSIC_RCU=y
--# CONFIG_PREEMPT_RCU is not set
--
--#
--# Platform support
--#
--# CONFIG_PPC_MPC512x is not set
--# CONFIG_PPC_MPC5121 is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--# CONFIG_BAMBOO is not set
--# CONFIG_EBONY is not set
--# CONFIG_SEQUOIA is not set
--# CONFIG_TAISHAN is not set
--# CONFIG_KATMAI is not set
--# CONFIG_RAINIER is not set
--CONFIG_WARP=y
--CONFIG_440EP=y
--CONFIG_IBM440EP_ERR42=y
--# CONFIG_IPIC is not set
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_FSL_ULI1575 is not set
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--# CONFIG_TICK_ONESHOT is not set
--# CONFIG_NO_HZ is not set
--# CONFIG_HIGH_RES_TIMERS is not set
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--# CONFIG_HZ_250 is not set
--# CONFIG_HZ_300 is not set
--CONFIG_HZ_1000=y
--CONFIG_HZ=1000
--# CONFIG_SCHED_HRTICK is not set
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_RCU_TRACE=y
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--# CONFIG_MATH_EMULATION is not set
--# CONFIG_IOMMU_HELPER is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--CONFIG_ARCH_HAS_WALK_MEMORY=y
--CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--CONFIG_RESOURCES_64BIT=y
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--CONFIG_CMDLINE_BOOL=y
--CONFIG_CMDLINE="ip=on"
--CONFIG_SECCOMP=y
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--# CONFIG_PCI is not set
--# CONFIG_PCI_DOMAINS is not set
--# CONFIG_PCI_SYSCALL is not set
--# CONFIG_ARCH_SUPPORTS_MSI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_CONSISTENT_START=0xff100000
--CONFIG_CONSISTENT_SIZE=0x00200000
--CONFIG_BOOT_LOAD=0x01000000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--# CONFIG_IP_MULTICAST is not set
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--# CONFIG_IP_PNP_BOOTP is not set
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IP_VS is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--CONFIG_NETFILTER=y
--# CONFIG_NETFILTER_DEBUG is not set
--CONFIG_NETFILTER_ADVANCED=y
--
--#
--# Core Netfilter Configuration
--#
--# CONFIG_NETFILTER_NETLINK_QUEUE is not set
--# CONFIG_NETFILTER_NETLINK_LOG is not set
--# CONFIG_NF_CONNTRACK is not set
--# CONFIG_NETFILTER_XTABLES is not set
--
--#
--# IP: Netfilter Configuration
--#
--# CONFIG_IP_NF_QUEUE is not set
--# CONFIG_IP_NF_IPTABLES is not set
--# CONFIG_IP_NF_ARPTABLES is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--CONFIG_VLAN_8021Q=y
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--# CONFIG_STANDALONE is not set
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--CONFIG_MTD=y
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--CONFIG_MTD_PARTITIONS=y
--# CONFIG_MTD_REDBOOT_PARTS is not set
--# CONFIG_MTD_CMDLINE_PARTS is not set
--CONFIG_MTD_OF_PARTS=y
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=y
--CONFIG_MTD_BLKDEVS=y
--CONFIG_MTD_BLOCK=y
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--CONFIG_MTD_OOPS=m
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=y
--# CONFIG_MTD_JEDECPROBE is not set
--CONFIG_MTD_GEN_PROBE=y
--# CONFIG_MTD_CFI_ADV_OPTIONS is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=y
--# CONFIG_MTD_CFI_STAA is not set
--CONFIG_MTD_CFI_UTIL=y
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--# CONFIG_MTD_PHYSMAP is not set
--CONFIG_MTD_PHYSMAP_OF=y
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--CONFIG_MTD_NAND=y
--# CONFIG_MTD_NAND_VERIFY_WRITE is not set
--CONFIG_MTD_NAND_ECC_SMC=y
--# CONFIG_MTD_NAND_MUSEUM_IDS is not set
--CONFIG_MTD_NAND_IDS=y
--# CONFIG_MTD_NAND_DISKONCHIP is not set
--# CONFIG_MTD_NAND_NANDSIM is not set
--# CONFIG_MTD_NAND_PLATFORM is not set
--# CONFIG_MTD_ALAUDA is not set
--# CONFIG_MTD_NAND_FSL_ELBC is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--# CONFIG_BLK_DEV_LOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_UB is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=4096
--# CONFIG_BLK_DEV_XIP is not set
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--# CONFIG_XILINX_SYSACE is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_ENCLOSURE_SERVICES is not set
--CONFIG_HAVE_IDE=y
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--CONFIG_BLK_DEV_SD=y
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--# CONFIG_CHR_DEV_SG is not set
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--CONFIG_SCSI_SPI_ATTRS=y
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--# CONFIG_SCSI_LOWLEVEL is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_PHYLIB is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--CONFIG_IBM_NEW_EMAC=y
--CONFIG_IBM_NEW_EMAC_RXB=128
--CONFIG_IBM_NEW_EMAC_TXB=64
--CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
--CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
--CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
--# CONFIG_IBM_NEW_EMAC_DEBUG is not set
--CONFIG_IBM_NEW_EMAC_ZMII=y
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_B44 is not set
--# CONFIG_NETDEV_1000 is not set
--# CONFIG_NETDEV_10000 is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--
--#
--# USB Network Adapters
--#
--# CONFIG_USB_CATC is not set
--# CONFIG_USB_KAWETH is not set
--# CONFIG_USB_PEGASUS is not set
--# CONFIG_USB_RTL8150 is not set
--# CONFIG_USB_USBNET is not set
--# CONFIG_WAN is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_NR_UARTS=4
--CONFIG_SERIAL_8250_RUNTIME_UARTS=4
--CONFIG_SERIAL_8250_EXTENDED=y
--# CONFIG_SERIAL_8250_MANY_PORTS is not set
--CONFIG_SERIAL_8250_SHARE_IRQ=y
--# CONFIG_SERIAL_8250_DETECT_IRQ is not set
--# CONFIG_SERIAL_8250_RSA is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_OF_PLATFORM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_I2C=y
--CONFIG_I2C_BOARDINFO=y
--# CONFIG_I2C_CHARDEV is not set
--
--#
--# I2C Algorithms
--#
--# CONFIG_I2C_ALGOBIT is not set
--# CONFIG_I2C_ALGOPCF is not set
--# CONFIG_I2C_ALGOPCA is not set
--
--#
--# I2C Hardware Bus support
--#
--# CONFIG_I2C_MPC is not set
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_SIMTEC is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_STUB is not set
--# CONFIG_I2C_TINY_USB is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--CONFIG_SENSORS_EEPROM=y
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_TPS65010 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--CONFIG_HWMON=y
--# CONFIG_HWMON_VID is not set
--# CONFIG_SENSORS_AD7418 is not set
--# CONFIG_SENSORS_ADM1021 is not set
--# CONFIG_SENSORS_ADM1025 is not set
--# CONFIG_SENSORS_ADM1026 is not set
--# CONFIG_SENSORS_ADM1029 is not set
--# CONFIG_SENSORS_ADM1031 is not set
--# CONFIG_SENSORS_ADM9240 is not set
--# CONFIG_SENSORS_ADT7470 is not set
--# CONFIG_SENSORS_ATXP1 is not set
--# CONFIG_SENSORS_DS1621 is not set
--# CONFIG_SENSORS_F71805F is not set
--# CONFIG_SENSORS_F71882FG is not set
--# CONFIG_SENSORS_F75375S is not set
--# CONFIG_SENSORS_GL518SM is not set
--# CONFIG_SENSORS_GL520SM is not set
--# CONFIG_SENSORS_IT87 is not set
--# CONFIG_SENSORS_LM63 is not set
--# CONFIG_SENSORS_LM75 is not set
--# CONFIG_SENSORS_LM77 is not set
--# CONFIG_SENSORS_LM78 is not set
--# CONFIG_SENSORS_LM80 is not set
--# CONFIG_SENSORS_LM83 is not set
--# CONFIG_SENSORS_LM85 is not set
--# CONFIG_SENSORS_LM87 is not set
--# CONFIG_SENSORS_LM90 is not set
--# CONFIG_SENSORS_LM92 is not set
--# CONFIG_SENSORS_LM93 is not set
--# CONFIG_SENSORS_MAX1619 is not set
--# CONFIG_SENSORS_MAX6650 is not set
--# CONFIG_SENSORS_PC87360 is not set
--# CONFIG_SENSORS_PC87427 is not set
--# CONFIG_SENSORS_DME1737 is not set
--# CONFIG_SENSORS_SMSC47M1 is not set
--# CONFIG_SENSORS_SMSC47M192 is not set
--# CONFIG_SENSORS_SMSC47B397 is not set
--# CONFIG_SENSORS_ADS7828 is not set
--# CONFIG_SENSORS_THMC50 is not set
--# CONFIG_SENSORS_VT1211 is not set
--# CONFIG_SENSORS_W83781D is not set
--# CONFIG_SENSORS_W83791D is not set
--# CONFIG_SENSORS_W83792D is not set
--# CONFIG_SENSORS_W83793 is not set
--# CONFIG_SENSORS_W83L785TS is not set
--# CONFIG_SENSORS_W83L786NG is not set
--# CONFIG_SENSORS_W83627HF is not set
--# CONFIG_SENSORS_W83627EHF is not set
--# CONFIG_HWMON_DEBUG_CHIP is not set
--CONFIG_THERMAL=y
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--# CONFIG_DAB is not set
--
--#
--# Graphics support
--#
--# CONFIG_VGASTATE is not set
--# CONFIG_VIDEO_OUTPUT_CONTROL is not set
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--# CONFIG_USB_ARCH_HAS_EHCI is not set
--CONFIG_USB=y
--# CONFIG_USB_DEBUG is not set
--# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
--
--#
--# Miscellaneous USB options
--#
--# CONFIG_USB_DEVICEFS is not set
--CONFIG_USB_DEVICE_CLASS=y
--# CONFIG_USB_DYNAMIC_MINORS is not set
--# CONFIG_USB_OTG is not set
--
--#
--# USB Host Controller Drivers
--#
--# CONFIG_USB_ISP116X_HCD is not set
--CONFIG_USB_OHCI_HCD=y
--CONFIG_USB_OHCI_HCD_PPC_OF=y
--CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
--# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
--CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
--CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
--CONFIG_USB_OHCI_LITTLE_ENDIAN=y
--# CONFIG_USB_SL811_HCD is not set
--# CONFIG_USB_R8A66597_HCD is not set
--
--#
--# USB Device Class drivers
--#
--# CONFIG_USB_ACM is not set
--# CONFIG_USB_PRINTER is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--
--#
--# may also be needed; see USB_STORAGE Help for more information
--#
--CONFIG_USB_STORAGE=y
--# CONFIG_USB_STORAGE_DEBUG is not set
--# CONFIG_USB_STORAGE_DATAFAB is not set
--# CONFIG_USB_STORAGE_FREECOM is not set
--# CONFIG_USB_STORAGE_ISD200 is not set
--# CONFIG_USB_STORAGE_DPCM is not set
--# CONFIG_USB_STORAGE_USBAT is not set
--# CONFIG_USB_STORAGE_SDDR09 is not set
--# CONFIG_USB_STORAGE_SDDR55 is not set
--# CONFIG_USB_STORAGE_JUMPSHOT is not set
--# CONFIG_USB_STORAGE_ALAUDA is not set
--# CONFIG_USB_STORAGE_KARMA is not set
--# CONFIG_USB_LIBUSUAL is not set
--
--#
--# USB Imaging devices
--#
--# CONFIG_USB_MDC800 is not set
--# CONFIG_USB_MICROTEK is not set
--CONFIG_USB_MON=y
--
--#
--# USB port drivers
--#
--# CONFIG_USB_SERIAL is not set
--
--#
--# USB Miscellaneous drivers
--#
--# CONFIG_USB_EMI62 is not set
--# CONFIG_USB_EMI26 is not set
--# CONFIG_USB_ADUTUX is not set
--# CONFIG_USB_AUERSWALD is not set
--# CONFIG_USB_RIO500 is not set
--# CONFIG_USB_LEGOTOWER is not set
--# CONFIG_USB_LCD is not set
--# CONFIG_USB_BERRY_CHARGE is not set
--# CONFIG_USB_LED is not set
--# CONFIG_USB_CYPRESS_CY7C63 is not set
--# CONFIG_USB_CYTHERM is not set
--# CONFIG_USB_PHIDGET is not set
--# CONFIG_USB_IDMOUSE is not set
--# CONFIG_USB_FTDI_ELAN is not set
--# CONFIG_USB_APPLEDISPLAY is not set
--# CONFIG_USB_LD is not set
--# CONFIG_USB_TRANCEVIBRATOR is not set
--# CONFIG_USB_IOWARRIOR is not set
--# CONFIG_USB_GADGET is not set
--CONFIG_MMC=m
--# CONFIG_MMC_DEBUG is not set
--# CONFIG_MMC_UNSAFE_RESUME is not set
--
--#
--# MMC/SD Card Drivers
--#
--CONFIG_MMC_BLOCK=m
--CONFIG_MMC_BLOCK_BOUNCE=y
--# CONFIG_SDIO_UART is not set
--
--#
--# MMC/SD Host Controller Drivers
--#
--# CONFIG_MMC_WBSD is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--# CONFIG_EXT3_FS is not set
--# CONFIG_EXT4DEV_FS is not set
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--CONFIG_FAT_FS=y
--CONFIG_MSDOS_FS=y
--CONFIG_VFAT_FS=y
--CONFIG_FAT_DEFAULT_CODEPAGE=437
--CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--# CONFIG_TMPFS is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--CONFIG_JFFS2_FS=y
--CONFIG_JFFS2_FS_DEBUG=0
--CONFIG_JFFS2_FS_WRITEBUFFER=y
--# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
--# CONFIG_JFFS2_SUMMARY is not set
--# CONFIG_JFFS2_FS_XATTR is not set
--# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
--CONFIG_JFFS2_ZLIB=y
--# CONFIG_JFFS2_LZO is not set
--CONFIG_JFFS2_RTIME=y
--# CONFIG_JFFS2_RUBIN is not set
--CONFIG_CRAMFS=y
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=y
--CONFIG_NFS_V3=y
--# CONFIG_NFS_V3_ACL is not set
--# CONFIG_NFS_V4 is not set
--# CONFIG_NFS_DIRECTIO is not set
--# CONFIG_NFSD is not set
--CONFIG_ROOT_NFS=y
--CONFIG_LOCKD=y
--CONFIG_LOCKD_V4=y
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=y
--# CONFIG_SUNRPC_BIND34 is not set
--# CONFIG_RPCSEC_GSS_KRB5 is not set
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--CONFIG_NLS=y
--CONFIG_NLS_DEFAULT="iso8859-1"
--CONFIG_NLS_CODEPAGE_437=y
--# CONFIG_NLS_CODEPAGE_737 is not set
--# CONFIG_NLS_CODEPAGE_775 is not set
--CONFIG_NLS_CODEPAGE_850=y
--# CONFIG_NLS_CODEPAGE_852 is not set
--# CONFIG_NLS_CODEPAGE_855 is not set
--# CONFIG_NLS_CODEPAGE_857 is not set
--# CONFIG_NLS_CODEPAGE_860 is not set
--# CONFIG_NLS_CODEPAGE_861 is not set
--# CONFIG_NLS_CODEPAGE_862 is not set
--# CONFIG_NLS_CODEPAGE_863 is not set
--# CONFIG_NLS_CODEPAGE_864 is not set
--# CONFIG_NLS_CODEPAGE_865 is not set
--# CONFIG_NLS_CODEPAGE_866 is not set
--# CONFIG_NLS_CODEPAGE_869 is not set
--# CONFIG_NLS_CODEPAGE_936 is not set
--# CONFIG_NLS_CODEPAGE_950 is not set
--# CONFIG_NLS_CODEPAGE_932 is not set
--# CONFIG_NLS_CODEPAGE_949 is not set
--# CONFIG_NLS_CODEPAGE_874 is not set
--# CONFIG_NLS_ISO8859_8 is not set
--# CONFIG_NLS_CODEPAGE_1250 is not set
--# CONFIG_NLS_CODEPAGE_1251 is not set
--CONFIG_NLS_ASCII=y
--CONFIG_NLS_ISO8859_1=y
--# CONFIG_NLS_ISO8859_2 is not set
--# CONFIG_NLS_ISO8859_3 is not set
--# CONFIG_NLS_ISO8859_4 is not set
--# CONFIG_NLS_ISO8859_5 is not set
--# CONFIG_NLS_ISO8859_6 is not set
--# CONFIG_NLS_ISO8859_7 is not set
--# CONFIG_NLS_ISO8859_9 is not set
--# CONFIG_NLS_ISO8859_13 is not set
--# CONFIG_NLS_ISO8859_14 is not set
--CONFIG_NLS_ISO8859_15=y
--# CONFIG_NLS_KOI8_R is not set
--# CONFIG_NLS_KOI8_U is not set
--CONFIG_NLS_UTF8=y
--# CONFIG_DLM is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--CONFIG_CRC_CCITT=y
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--CONFIG_CRC32=y
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=y
--CONFIG_ZLIB_DEFLATE=y
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--
--#
--# Kernel hacking
--#
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--CONFIG_MAGIC_SYSRQ=y
--# CONFIG_UNUSED_SYMBOLS is not set
--CONFIG_DEBUG_FS=y
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--# CONFIG_SCHED_DEBUG is not set
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_DEBUG_SLAB is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--CONFIG_DEBUG_INFO=y
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_BACKTRACE_SELF_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_VIRQ_DEBUG is not set
--CONFIG_BDI_SWITCH=y
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--CONFIG_CRYPTO=y
--# CONFIG_CRYPTO_SEQIV is not set
--# CONFIG_CRYPTO_MANAGER is not set
--# CONFIG_CRYPTO_HMAC is not set
--# CONFIG_CRYPTO_XCBC is not set
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_MD4 is not set
--# CONFIG_CRYPTO_MD5 is not set
--# CONFIG_CRYPTO_SHA1 is not set
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_WP512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_GF128MUL is not set
--# CONFIG_CRYPTO_ECB is not set
--# CONFIG_CRYPTO_CBC is not set
--# CONFIG_CRYPTO_PCBC is not set
--# CONFIG_CRYPTO_LRW is not set
--# CONFIG_CRYPTO_XTS is not set
--# CONFIG_CRYPTO_CTR is not set
--# CONFIG_CRYPTO_GCM is not set
--# CONFIG_CRYPTO_CCM is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--# CONFIG_CRYPTO_DES is not set
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_AES is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_ARC4 is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--# CONFIG_CRYPTO_ANUBIS is not set
--# CONFIG_CRYPTO_SEED is not set
--# CONFIG_CRYPTO_SALSA20 is not set
--# CONFIG_CRYPTO_DEFLATE is not set
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_TEST is not set
--# CONFIG_CRYPTO_AUTHENC is not set
--# CONFIG_CRYPTO_LZO is not set
--CONFIG_CRYPTO_HW=y
--# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/kernel/Makefile
-+++ b/arch/powerpc/kernel/Makefile
-@@ -67,6 +67,7 @@ obj-$(CONFIG_BOOTX_TEXT) += btext.o
- obj-$(CONFIG_SMP) += smp.o
- obj-$(CONFIG_KPROBES) += kprobes.o
- obj-$(CONFIG_PPC_UDBG_16550) += legacy_serial.o udbg_16550.o
-+obj-$(CONFIG_STACKTRACE) += stacktrace.o
-
- pci64-$(CONFIG_PPC64) += pci_dn.o isa-bridge.o
- obj-$(CONFIG_PCI) += pci_$(CONFIG_WORD_SIZE).o $(pci64-y) \
---- a/arch/powerpc/kernel/asm-offsets.c
-+++ b/arch/powerpc/kernel/asm-offsets.c
-@@ -26,8 +26,6 @@
- #ifdef CONFIG_PPC64
- #include <linux/time.h>
- #include <linux/hardirq.h>
--#else
--#include <linux/ptrace.h>
- #endif
-
- #include <asm/io.h>
-@@ -46,6 +44,9 @@
- #include <asm/mmu.h>
- #include <asm/hvcall.h>
- #endif
-+#ifdef CONFIG_PPC_ISERIES
-+#include <asm/iseries/alpaca.h>
-+#endif
-
- #define DEFINE(sym, val) \
- asm volatile("\n->" #sym " %0 " #val : : "i" (val))
-@@ -60,7 +61,6 @@ int main(void)
- DEFINE(AUDITCONTEXT, offsetof(struct task_struct, audit_context));
- #else
- DEFINE(THREAD_INFO, offsetof(struct task_struct, stack));
-- DEFINE(PTRACE, offsetof(struct task_struct, ptrace));
- #endif /* CONFIG_PPC64 */
-
- DEFINE(KSP, offsetof(struct thread_struct, ksp));
-@@ -80,7 +80,6 @@ int main(void)
- DEFINE(PGDIR, offsetof(struct thread_struct, pgdir));
- #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
- DEFINE(THREAD_DBCR0, offsetof(struct thread_struct, dbcr0));
-- DEFINE(PT_PTRACED, PT_PTRACED);
- #endif
- #ifdef CONFIG_SPE
- DEFINE(THREAD_EVR0, offsetof(struct thread_struct, evr[0]));
-@@ -325,6 +324,9 @@ int main(void)
- DEFINE(PAGE_OFFSET_VSID, KERNEL_VSID(PAGE_OFFSET));
- DEFINE(VMALLOC_START_ESID, GET_ESID(VMALLOC_START));
- DEFINE(VMALLOC_START_VSID, KERNEL_VSID(VMALLOC_START));
-+
-+ /* alpaca */
-+ DEFINE(ALPACA_SIZE, sizeof(struct alpaca));
- #endif
-
- DEFINE(PGD_TABLE_SIZE, PGD_TABLE_SIZE);
---- a/arch/powerpc/kernel/btext.c
-+++ b/arch/powerpc/kernel/btext.c
-@@ -7,6 +7,7 @@
- #include <linux/string.h>
- #include <linux/init.h>
- #include <linux/module.h>
-+#include <linux/lmb.h>
-
- #include <asm/sections.h>
- #include <asm/prom.h>
-@@ -15,7 +16,7 @@
- #include <asm/mmu.h>
- #include <asm/pgtable.h>
- #include <asm/io.h>
--#include <asm/lmb.h>
-+#include <asm/prom.h>
- #include <asm/processor.h>
- #include <asm/udbg.h>
-
---- a/arch/powerpc/kernel/cpu_setup_44x.S
-+++ b/arch/powerpc/kernel/cpu_setup_44x.S
-@@ -3,7 +3,7 @@
- * Valentine Barshak <vbarshak@ru.mvista.com>
- * MontaVista Software, Inc (c) 2007
- *
-- * Based on cpu_setup_6xx code by
-+ * Based on cpu_setup_6xx code by
- * Benjamin Herrenschmidt <benh@kernel.crashing.org>
- *
- * This program is free software; you can redistribute it and/or
-@@ -32,6 +32,9 @@ _GLOBAL(__setup_cpu_440grx)
- bl __fixup_440A_mcheck
- mtlr r4
- blr
-+_GLOBAL(__setup_cpu_460ex)
-+_GLOBAL(__setup_cpu_460gt)
-+ b __init_fpu_44x
- _GLOBAL(__setup_cpu_440gx)
- _GLOBAL(__setup_cpu_440spe)
- b __fixup_440A_mcheck
---- a/arch/powerpc/kernel/cputable.c
-+++ b/arch/powerpc/kernel/cputable.c
-@@ -36,6 +36,8 @@ extern void __setup_cpu_440epx(unsigned
- extern void __setup_cpu_440gx(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_440spe(unsigned long offset, struct cpu_spec* spec);
-+extern void __setup_cpu_460ex(unsigned long offset, struct cpu_spec* spec);
-+extern void __setup_cpu_460gt(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec);
-@@ -1397,6 +1399,30 @@ static struct cpu_spec __initdata cpu_sp
- .machine_check = machine_check_440A,
- .platform = "ppc440",
- },
-+ { /* 460EX */
-+ .pvr_mask = 0xffff0002,
-+ .pvr_value = 0x13020002,
-+ .cpu_name = "460EX",
-+ .cpu_features = CPU_FTRS_44X,
-+ .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
-+ .icache_bsize = 32,
-+ .dcache_bsize = 32,
-+ .cpu_setup = __setup_cpu_460ex,
-+ .machine_check = machine_check_440A,
-+ .platform = "ppc440",
-+ },
-+ { /* 460GT */
-+ .pvr_mask = 0xffff0002,
-+ .pvr_value = 0x13020000,
-+ .cpu_name = "460GT",
-+ .cpu_features = CPU_FTRS_44X,
-+ .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
-+ .icache_bsize = 32,
-+ .dcache_bsize = 32,
-+ .cpu_setup = __setup_cpu_460gt,
-+ .machine_check = machine_check_440A,
-+ .platform = "ppc440",
-+ },
- #endif /* CONFIG_44x */
- #ifdef CONFIG_FSL_BOOKE
- #ifdef CONFIG_E200
-@@ -1512,7 +1538,7 @@ struct cpu_spec * __init identify_cpu(un
- *t = *s;
- *PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;
- #if defined(CONFIG_PPC64) || defined(CONFIG_BOOKE)
-- /* ppc64 and booke expect identify_cpu to also call
-+ /* ppc64 and booke expect identify_cpu to also call
- * setup_cpu for that processor. I will consolidate
- * that at a later time, for now, just use #ifdef.
- * we also don't need to PTRRELOC the function pointer
---- a/arch/powerpc/kernel/crash.c
-+++ b/arch/powerpc/kernel/crash.c
-@@ -24,12 +24,13 @@
- #include <linux/init.h>
- #include <linux/irq.h>
- #include <linux/types.h>
-+#include <linux/lmb.h>
-
- #include <asm/processor.h>
- #include <asm/machdep.h>
- #include <asm/kexec.h>
- #include <asm/kdump.h>
--#include <asm/lmb.h>
-+#include <asm/prom.h>
- #include <asm/firmware.h>
- #include <asm/smp.h>
- #include <asm/system.h>
---- a/arch/powerpc/kernel/crash_dump.c
-+++ b/arch/powerpc/kernel/crash_dump.c
-@@ -13,8 +13,9 @@
-
- #include <linux/crash_dump.h>
- #include <linux/bootmem.h>
-+#include <linux/lmb.h>
- #include <asm/kdump.h>
--#include <asm/lmb.h>
-+#include <asm/prom.h>
- #include <asm/firmware.h>
- #include <asm/uaccess.h>
-
---- a/arch/powerpc/kernel/entry_32.S
-+++ b/arch/powerpc/kernel/entry_32.S
-@@ -110,9 +110,9 @@ transfer_to_handler:
- stw r11,PT_REGS(r12)
- #if defined(CONFIG_40x) || defined(CONFIG_BOOKE)
- /* Check to see if the dbcr0 register is set up to debug. Use the
-- single-step bit to do this. */
-+ internal debug mode bit to do this. */
- lwz r12,THREAD_DBCR0(r12)
-- andis. r12,r12,DBCR0_IC@h
-+ andis. r12,r12,DBCR0_IDM@h
- beq+ 3f
- /* From user and task is ptraced - load up global dbcr0 */
- li r12,-1 /* clear all pending debug events */
-@@ -120,6 +120,12 @@ transfer_to_handler:
- lis r11,global_dbcr0@ha
- tophys(r11,r11)
- addi r11,r11,global_dbcr0@l
-+#ifdef CONFIG_SMP
-+ rlwinm r9,r1,0,0,(31-THREAD_SHIFT)
-+ lwz r9,TI_CPU(r9)
-+ slwi r9,r9,3
-+ add r11,r11,r9
-+#endif
- lwz r12,0(r11)
- mtspr SPRN_DBCR0,r12
- lwz r12,4(r11)
-@@ -238,10 +244,10 @@ ret_from_syscall:
- stw r11,_CCR(r1)
- syscall_exit_cont:
- #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
-- /* If the process has its own DBCR0 value, load it up. The single
-- step bit tells us that dbcr0 should be loaded. */
-+ /* If the process has its own DBCR0 value, load it up. The internal
-+ debug mode bit tells us that dbcr0 should be loaded. */
- lwz r0,THREAD+THREAD_DBCR0(r2)
-- andis. r10,r0,DBCR0_IC@h
-+ andis. r10,r0,DBCR0_IDM@h
- bnel- load_dbcr0
- #endif
- #ifdef CONFIG_44x
-@@ -666,10 +672,10 @@ user_exc_return: /* r10 contains MSR_KE
-
- restore_user:
- #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
-- /* Check whether this process has its own DBCR0 value. The single
-- step bit tells us that dbcr0 should be loaded. */
-+ /* Check whether this process has its own DBCR0 value. The internal
-+ debug mode bit tells us that dbcr0 should be loaded. */
- lwz r0,THREAD+THREAD_DBCR0(r2)
-- andis. r10,r0,DBCR0_IC@h
-+ andis. r10,r0,DBCR0_IDM@h
- bnel- load_dbcr0
- #endif
-
-@@ -879,6 +885,12 @@ load_dbcr0:
- mfspr r10,SPRN_DBCR0
- lis r11,global_dbcr0@ha
- addi r11,r11,global_dbcr0@l
-+#ifdef CONFIG_SMP
-+ rlwinm r9,r1,0,0,(31-THREAD_SHIFT)
-+ lwz r9,TI_CPU(r9)
-+ slwi r9,r9,3
-+ add r11,r11,r9
-+#endif
- stw r10,0(r11)
- mtspr SPRN_DBCR0,r0
- lwz r10,4(r11)
-@@ -891,7 +903,7 @@ load_dbcr0:
- .section .bss
- .align 4
- global_dbcr0:
-- .space 8
-+ .space 8*NR_CPUS
- .previous
- #endif /* !(CONFIG_4xx || CONFIG_BOOKE) */
-
---- a/arch/powerpc/kernel/entry_64.S
-+++ b/arch/powerpc/kernel/entry_64.S
-@@ -29,6 +29,8 @@
- #include <asm/cputable.h>
- #include <asm/firmware.h>
- #include <asm/bug.h>
-+#include <asm/ptrace.h>
-+#include <asm/irqflags.h>
-
- /*
- * System calls.
-@@ -39,7 +41,7 @@
-
- /* This value is used to mark exception frames on the stack. */
- exception_marker:
-- .tc ID_72656773_68657265[TC],0x7265677368657265
-+ .tc ID_EXC_MARKER[TC],STACK_FRAME_REGS_MARKER
-
- .section ".text"
- .align 7
-@@ -88,6 +90,14 @@ system_call_common:
- addi r9,r1,STACK_FRAME_OVERHEAD
- ld r11,exception_marker@toc(r2)
- std r11,-16(r9) /* "regshere" marker */
-+#ifdef CONFIG_TRACE_IRQFLAGS
-+ bl .trace_hardirqs_on
-+ REST_GPR(0,r1)
-+ REST_4GPRS(3,r1)
-+ REST_2GPRS(7,r1)
-+ addi r9,r1,STACK_FRAME_OVERHEAD
-+ ld r12,_MSR(r1)
-+#endif /* CONFIG_TRACE_IRQFLAGS */
- li r10,1
- stb r10,PACASOFTIRQEN(r13)
- stb r10,PACAHARDIRQEN(r13)
-@@ -102,7 +112,7 @@ BEGIN_FW_FTR_SECTION
- b hardware_interrupt_entry
- 2:
- END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
--#endif
-+#endif /* CONFIG_PPC_ISERIES */
- mfmsr r11
- ori r11,r11,MSR_EE
- mtmsrd r11,1
-@@ -504,6 +514,10 @@ BEGIN_FW_FTR_SECTION
-
- li r3,0
- stb r3,PACASOFTIRQEN(r13) /* ensure we are soft-disabled */
-+#ifdef CONFIG_TRACE_IRQFLAGS
-+ bl .trace_hardirqs_off
-+ mfmsr r10
-+#endif
- ori r10,r10,MSR_EE
- mtmsrd r10 /* hard-enable again */
- addi r3,r1,STACK_FRAME_OVERHEAD
-@@ -512,7 +526,7 @@ BEGIN_FW_FTR_SECTION
- 4:
- END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
- #endif
-- stb r5,PACASOFTIRQEN(r13)
-+ TRACE_AND_RESTORE_IRQ(r5);
-
- /* extract EE bit and use it to restore paca->hard_enabled */
- ld r3,_MSR(r1)
-@@ -580,6 +594,16 @@ do_work:
- bne restore
- /* here we are preempting the current task */
- 1:
-+#ifdef CONFIG_TRACE_IRQFLAGS
-+ bl .trace_hardirqs_on
-+ /* Note: we just clobbered r10 which used to contain the previous
-+ * MSR before the hard-disabling done by the caller of do_work.
-+ * We don't have that value anymore, but it doesn't matter as
-+ * we will hard-enable unconditionally, we can just reload the
-+ * current MSR into r10
-+ */
-+ mfmsr r10
-+#endif /* CONFIG_TRACE_IRQFLAGS */
- li r0,1
- stb r0,PACASOFTIRQEN(r13)
- stb r0,PACAHARDIRQEN(r13)
---- a/arch/powerpc/kernel/head_32.S
-+++ b/arch/powerpc/kernel/head_32.S
-@@ -30,6 +30,7 @@
- #include <asm/thread_info.h>
- #include <asm/ppc_asm.h>
- #include <asm/asm-offsets.h>
-+#include <asm/ptrace.h>
-
- /* 601 only have IBAT; cr0.eq is set on 601 when using this macro */
- #define LOAD_BAT(n, reg, RA, RB) \
-@@ -268,8 +269,8 @@ __secondary_hold_acknowledge:
- li r10,MSR_KERNEL & ~(MSR_IR|MSR_DR); /* can take exceptions */ \
- MTMSRD(r10); /* (except for mach check in rtas) */ \
- stw r0,GPR0(r11); \
-- lis r10,0x7265; /* put exception frame marker */ \
-- addi r10,r10,0x6773; \
-+ lis r10,STACK_FRAME_REGS_MARKER@ha; /* exception frame marker */ \
-+ addi r10,r10,STACK_FRAME_REGS_MARKER@l; \
- stw r10,8(r11); \
- SAVE_4GPRS(3, r11); \
- SAVE_2GPRS(7, r11)
-@@ -763,23 +764,6 @@ load_up_altivec:
- b fast_exception_return
-
- /*
-- * AltiVec unavailable trap from kernel - print a message, but let
-- * the task use AltiVec in the kernel until it returns to user mode.
-- */
--KernelAltiVec:
-- lwz r3,_MSR(r1)
-- oris r3,r3,MSR_VEC@h
-- stw r3,_MSR(r1) /* enable use of AltiVec after return */
-- lis r3,87f@h
-- ori r3,r3,87f@l
-- mr r4,r2 /* current */
-- lwz r5,_NIP(r1)
-- bl printk
-- b ret_from_except
--87: .string "AltiVec used in kernel (task=%p, pc=%x) \n"
-- .align 4,0
--
--/*
- * giveup_altivec(tsk)
- * Disable AltiVec for the task given as the argument,
- * and save the AltiVec registers in its thread_struct.
---- a/arch/powerpc/kernel/head_44x.S
-+++ b/arch/powerpc/kernel/head_44x.S
-@@ -211,7 +211,7 @@ skpinv: addi r4,r4,1 /* Increment */
- SET_IVOR(12, WatchdogTimer);
- SET_IVOR(13, DataTLBError);
- SET_IVOR(14, InstructionTLBError);
-- SET_IVOR(15, Debug);
-+ SET_IVOR(15, DebugCrit);
-
- /* Establish the interrupt vector base */
- lis r4,interrupt_base@h /* IVPR only uses the high 16-bits */
-@@ -578,7 +578,7 @@ interrupt_base:
- b InstructionStorage
-
- /* Debug Interrupt */
-- DEBUG_EXCEPTION
-+ DEBUG_CRIT_EXCEPTION
-
- /*
- * Local functions
---- a/arch/powerpc/kernel/head_64.S
-+++ b/arch/powerpc/kernel/head_64.S
-@@ -36,8 +36,7 @@
- #include <asm/firmware.h>
- #include <asm/page_64.h>
- #include <asm/exception.h>
--
--#define DO_SOFT_DISABLE
-+#include <asm/irqflags.h>
-
- /*
- * We layout physical memory as follows:
-@@ -450,8 +449,8 @@ bad_stack:
- */
- fast_exc_return_irq: /* restores irq state too */
- ld r3,SOFTE(r1)
-+ TRACE_AND_RESTORE_IRQ(r3);
- ld r12,_MSR(r1)
-- stb r3,PACASOFTIRQEN(r13) /* restore paca->soft_enabled */
- rldicl r4,r12,49,63 /* get MSR_EE to LSB */
- stb r4,PACAHARDIRQEN(r13) /* restore paca->hard_enabled */
- b 1f
-@@ -621,7 +620,7 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISER
- mtlr r10
-
- andi. r10,r12,MSR_RI /* check for unrecoverable exception */
-- beq- unrecov_slb
-+ beq- 2f
-
- .machine push
- .machine "power4"
-@@ -643,6 +642,22 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISER
- rfid
- b . /* prevent speculative execution */
-
-+2:
-+#ifdef CONFIG_PPC_ISERIES
-+BEGIN_FW_FTR_SECTION
-+ b unrecov_slb
-+END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
-+#endif /* CONFIG_PPC_ISERIES */
-+ mfspr r11,SPRN_SRR0
-+ clrrdi r10,r13,32
-+ LOAD_HANDLER(r10,unrecov_slb)
-+ mtspr SPRN_SRR0,r10
-+ mfmsr r10
-+ ori r10,r10,MSR_IR|MSR_DR|MSR_RI
-+ mtspr SPRN_SRR1,r10
-+ rfid
-+ b .
-+
- unrecov_slb:
- EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB)
- DISABLE_INTS
-@@ -808,7 +823,7 @@ _STATIC(load_up_altivec)
- * Hash table stuff
- */
- .align 7
--_GLOBAL(do_hash_page)
-+_STATIC(do_hash_page)
- std r3,_DAR(r1)
- std r4,_DSISR(r1)
-
-@@ -820,6 +835,27 @@ BEGIN_FTR_SECTION
- END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
-
- /*
-+ * On iSeries, we soft-disable interrupts here, then
-+ * hard-enable interrupts so that the hash_page code can spin on
-+ * the hash_table_lock without problems on a shared processor.
-+ */
-+ DISABLE_INTS
-+
-+ /*
-+ * Currently, trace_hardirqs_off() will be called by DISABLE_INTS
-+ * and will clobber volatile registers when irq tracing is enabled
-+ * so we need to reload them. It may be possible to be smarter here
-+ * and move the irq tracing elsewhere but let's keep it simple for
-+ * now
-+ */
-+#ifdef CONFIG_TRACE_IRQFLAGS
-+ ld r3,_DAR(r1)
-+ ld r4,_DSISR(r1)
-+ ld r5,_TRAP(r1)
-+ ld r12,_MSR(r1)
-+ clrrdi r5,r5,4
-+#endif /* CONFIG_TRACE_IRQFLAGS */
-+ /*
- * We need to set the _PAGE_USER bit if MSR_PR is set or if we are
- * accessing a userspace segment (even from the kernel). We assume
- * kernel addresses always have the high bit set.
-@@ -832,13 +868,6 @@ END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
- rlwimi r4,r5,22+2,31-2,31-2 /* Set _PAGE_EXEC if trap is 0x400 */
-
- /*
-- * On iSeries, we soft-disable interrupts here, then
-- * hard-enable interrupts so that the hash_page code can spin on
-- * the hash_table_lock without problems on a shared processor.
-- */
-- DISABLE_INTS
--
-- /*
- * r3 contains the faulting address
- * r4 contains the required access permissions
- * r5 contains the trap number
-@@ -848,7 +877,6 @@ END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
- bl .hash_page /* build HPTE if possible */
- cmpdi r3,0 /* see if hash_page succeeded */
-
--#ifdef DO_SOFT_DISABLE
- BEGIN_FW_FTR_SECTION
- /*
- * If we had interrupts soft-enabled at the point where the
-@@ -860,7 +888,7 @@ BEGIN_FW_FTR_SECTION
- */
- beq 13f
- END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
--#endif
-+
- BEGIN_FW_FTR_SECTION
- /*
- * Here we have interrupts hard-disabled, so it is sufficient
-@@ -874,11 +902,12 @@ END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISER
-
- /*
- * hash_page couldn't handle it, set soft interrupt enable back
-- * to what it was before the trap. Note that .local_irq_restore
-+ * to what it was before the trap. Note that .raw_local_irq_restore
- * handles any interrupts pending at this point.
- */
- ld r3,SOFTE(r1)
-- bl .local_irq_restore
-+ TRACE_AND_RESTORE_IRQ_PARTIAL(r3, 11f)
-+ bl .raw_local_irq_restore
- b 11f
-
- /* Here we have a page fault that hash_page can't handle. */
-@@ -1477,6 +1506,10 @@ _INIT_STATIC(start_here_multiplatform)
- addi r2,r2,0x4000
- add r2,r2,r26
-
-+ /* Set initial ptr to current */
-+ LOAD_REG_IMMEDIATE(r4, init_task)
-+ std r4,PACACURRENT(r13)
-+
- /* Do very early kernel initializations, including initial hash table,
- * stab and slb setup before we turn on relocation. */
-
-@@ -1505,10 +1538,6 @@ _INIT_GLOBAL(start_here_common)
- li r0,0
- stdu r0,-STACK_FRAME_OVERHEAD(r1)
-
-- /* ptr to current */
-- LOAD_REG_IMMEDIATE(r4, init_task)
-- std r4,PACACURRENT(r13)
--
- /* Load the TOC */
- ld r2,PACATOC(r13)
- std r1,PACAKSAVE(r13)
---- a/arch/powerpc/kernel/head_booke.h
-+++ b/arch/powerpc/kernel/head_booke.h
-@@ -56,8 +56,17 @@
- * is necessary since the MMU is always on, for Book-E parts, and the stacks
- * are offset from KERNELBASE.
- *
-+ * There is some space optimization to be had here if desired. However
-+ * to allow for a common kernel with support for debug exceptions either
-+ * going to critical or their own debug level we aren't currently
-+ * providing configurations that micro-optimize space usage.
- */
--#define BOOKE_EXCEPTION_STACK_SIZE (8192)
-+#ifdef CONFIG_44x
-+#define NUM_EXCEPTION_LVLS 2
-+#else
-+#define NUM_EXCEPTION_LVLS 3
-+#endif
-+#define BOOKE_EXCEPTION_STACK_SIZE (4096 * NUM_EXCEPTION_LVLS)
-
- /* CRIT_SPRG only used in critical exception handling */
- #define CRIT_SPRG SPRN_SPRG2
-@@ -68,7 +77,7 @@
- #define CRIT_STACK_TOP (exception_stack_top)
-
- /* only on e200 for now */
--#define DEBUG_STACK_TOP (exception_stack_top - 4096)
-+#define DEBUG_STACK_TOP (exception_stack_top - 8192)
- #define DEBUG_SPRG SPRN_SPRG6W
-
- #ifdef CONFIG_SMP
-@@ -212,9 +221,8 @@ label:
- * save (and later restore) the MSR via SPRN_CSRR1, which will still have
- * the MSR_DE bit set.
- */
--#ifdef CONFIG_E200
--#define DEBUG_EXCEPTION \
-- START_EXCEPTION(Debug); \
-+#define DEBUG_DEBUG_EXCEPTION \
-+ START_EXCEPTION(DebugDebug); \
- DEBUG_EXCEPTION_PROLOG; \
- \
- /* \
-@@ -234,8 +242,8 @@ label:
- cmplw r12,r10; \
- blt+ 2f; /* addr below exception vectors */ \
- \
-- lis r10,Debug@h; \
-- ori r10,r10,Debug@l; \
-+ lis r10,DebugDebug@h; \
-+ ori r10,r10,DebugDebug@l; \
- cmplw r12,r10; \
- bgt+ 2f; /* addr above exception vectors */ \
- \
-@@ -265,9 +273,9 @@ label:
- 2: mfspr r4,SPRN_DBSR; \
- addi r3,r1,STACK_FRAME_OVERHEAD; \
- EXC_XFER_TEMPLATE(DebugException, 0x2002, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), NOCOPY, debug_transfer_to_handler, ret_from_debug_exc)
--#else
--#define DEBUG_EXCEPTION \
-- START_EXCEPTION(Debug); \
-+
-+#define DEBUG_CRIT_EXCEPTION \
-+ START_EXCEPTION(DebugCrit); \
- CRITICAL_EXCEPTION_PROLOG; \
- \
- /* \
-@@ -287,8 +295,8 @@ label:
- cmplw r12,r10; \
- blt+ 2f; /* addr below exception vectors */ \
- \
-- lis r10,Debug@h; \
-- ori r10,r10,Debug@l; \
-+ lis r10,DebugCrit@h; \
-+ ori r10,r10,DebugCrit@l; \
- cmplw r12,r10; \
- bgt+ 2f; /* addr above exception vectors */ \
- \
-@@ -318,7 +326,6 @@ label:
- 2: mfspr r4,SPRN_DBSR; \
- addi r3,r1,STACK_FRAME_OVERHEAD; \
- EXC_XFER_TEMPLATE(DebugException, 0x2002, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), NOCOPY, crit_transfer_to_handler, ret_from_crit_exc)
--#endif
-
- #define INSTRUCTION_STORAGE_EXCEPTION \
- START_EXCEPTION(InstructionStorage) \
---- a/arch/powerpc/kernel/head_fsl_booke.S
-+++ b/arch/powerpc/kernel/head_fsl_booke.S
-@@ -68,7 +68,9 @@ _ENTRY(_start);
- mr r29,r5
- mr r28,r6
- mr r27,r7
-+ li r25,0 /* phys kernel start (low) */
- li r24,0 /* CPU number */
-+ li r23,0 /* phys kernel start (high) */
-
- /* We try to not make any assumptions about how the boot loader
- * setup or used the TLBs. We invalidate all mappings from the
-@@ -167,7 +169,28 @@ skpinv: addi r6,r6,1 /* Increment */
- mtspr SPRN_MAS0,r7
- tlbre
-
-- /* Just modify the entry ID, EPN and RPN for the temp mapping */
-+ /* grab and fixup the RPN */
-+ mfspr r6,SPRN_MAS1 /* extract MAS1[SIZE] */
-+ rlwinm r6,r6,25,27,30
-+ li r8,-1
-+ addi r6,r6,10
-+ slw r6,r8,r6 /* convert to mask */
-+
-+ bl 1f /* Find our address */
-+1: mflr r7
-+
-+ mfspr r8,SPRN_MAS3
-+#ifdef CONFIG_PHYS_64BIT
-+ mfspr r23,SPRN_MAS7
-+#endif
-+ and r8,r6,r8
-+ subfic r9,r6,-4096
-+ and r9,r9,r7
-+
-+ or r25,r8,r9
-+ ori r8,r25,(MAS3_SX|MAS3_SW|MAS3_SR)
-+
-+ /* Just modify the entry ID and EPN for the temp mapping */
- lis r7,0x1000 /* Set MAS0(TLBSEL) = 1 */
- rlwimi r7,r5,16,4,15 /* Setup MAS0 = TLBSEL | ESEL(r5) */
- mtspr SPRN_MAS0,r7
-@@ -177,12 +200,10 @@ skpinv: addi r6,r6,1 /* Increment */
- ori r6,r6,(MAS1_TSIZE(BOOKE_PAGESZ_4K))@l
- mtspr SPRN_MAS1,r6
- mfspr r6,SPRN_MAS2
-- lis r7,PHYSICAL_START@h
-+ li r7,0 /* temp EPN = 0 */
- rlwimi r7,r6,0,20,31
- mtspr SPRN_MAS2,r7
-- mfspr r6,SPRN_MAS3
-- rlwimi r7,r6,0,20,31
-- mtspr SPRN_MAS3,r7
-+ mtspr SPRN_MAS3,r8
- tlbwe
-
- xori r6,r4,1
-@@ -232,8 +253,7 @@ skpinv: addi r6,r6,1 /* Increment */
- ori r6,r6,PAGE_OFFSET@l
- rlwimi r6,r7,0,20,31
- mtspr SPRN_MAS2,r6
-- li r7,(MAS3_SX|MAS3_SW|MAS3_SR)
-- mtspr SPRN_MAS3,r7
-+ mtspr SPRN_MAS3,r8
- tlbwe
-
- /* 7. Jump to KERNELBASE mapping */
-@@ -283,7 +303,10 @@ skpinv: addi r6,r6,1 /* Increment */
- SET_IVOR(12, WatchdogTimer);
- SET_IVOR(13, DataTLBError);
- SET_IVOR(14, InstructionTLBError);
-- SET_IVOR(15, Debug);
-+ SET_IVOR(15, DebugDebug);
-+#if defined(CONFIG_E500)
-+ SET_IVOR(15, DebugCrit);
-+#endif
- SET_IVOR(32, SPEUnavailable);
- SET_IVOR(33, SPEFloatingPointData);
- SET_IVOR(34, SPEFloatingPointRound);
-@@ -718,7 +741,10 @@ interrupt_base:
-
-
- /* Debug Interrupt */
-- DEBUG_EXCEPTION
-+ DEBUG_DEBUG_EXCEPTION
-+#if defined(CONFIG_E500)
-+ DEBUG_CRIT_EXCEPTION
-+#endif
-
- /*
- * Local functions
---- a/arch/powerpc/kernel/ibmebus.c
-+++ b/arch/powerpc/kernel/ibmebus.c
-@@ -183,7 +183,7 @@ static int ibmebus_create_devices(const
- ret = ibmebus_create_device(child);
- if (ret) {
- printk(KERN_ERR "%s: failed to create device (%i)",
-- __FUNCTION__, ret);
-+ __func__, ret);
- of_node_put(child);
- break;
- }
-@@ -269,7 +269,7 @@ static ssize_t ibmebus_store_probe(struc
- if (bus_find_device(&ibmebus_bus_type, NULL, path,
- ibmebus_match_path)) {
- printk(KERN_WARNING "%s: %s has already been probed\n",
-- __FUNCTION__, path);
-+ __func__, path);
- rc = -EEXIST;
- goto out;
- }
-@@ -279,7 +279,7 @@ static ssize_t ibmebus_store_probe(struc
- of_node_put(dn);
- } else {
- printk(KERN_WARNING "%s: no such device node: %s\n",
-- __FUNCTION__, path);
-+ __func__, path);
- rc = -ENODEV;
- }
-
-@@ -308,7 +308,7 @@ static ssize_t ibmebus_store_remove(stru
- return count;
- } else {
- printk(KERN_WARNING "%s: %s not on the bus\n",
-- __FUNCTION__, path);
-+ __func__, path);
-
- kfree(path);
- return -ENODEV;
-@@ -337,14 +337,14 @@ static int __init ibmebus_bus_init(void)
- err = of_bus_type_init(&ibmebus_bus_type, "ibmebus");
- if (err) {
- printk(KERN_ERR "%s: failed to register IBM eBus.\n",
-- __FUNCTION__);
-+ __func__);
- return err;
- }
-
- err = device_register(&ibmebus_bus_device);
- if (err) {
- printk(KERN_WARNING "%s: device_register returned %i\n",
-- __FUNCTION__, err);
-+ __func__, err);
- bus_unregister(&ibmebus_bus_type);
-
- return err;
---- a/arch/powerpc/kernel/iommu.c
-+++ b/arch/powerpc/kernel/iommu.c
-@@ -520,7 +520,7 @@ void iommu_free_table(struct iommu_table
- unsigned int order;
-
- if (!tbl || !tbl->it_map) {
-- printk(KERN_ERR "%s: expected TCE map for %s\n", __FUNCTION__,
-+ printk(KERN_ERR "%s: expected TCE map for %s\n", __func__,
- node_name);
- return;
- }
-@@ -530,7 +530,7 @@ void iommu_free_table(struct iommu_table
- for (i = 0; i < (tbl->it_size/64); i++) {
- if (tbl->it_map[i] != 0) {
- printk(KERN_WARNING "%s: Unexpected TCEs for %s\n",
-- __FUNCTION__, node_name);
-+ __func__, node_name);
- break;
- }
- }
---- a/arch/powerpc/kernel/irq.c
-+++ b/arch/powerpc/kernel/irq.c
-@@ -114,7 +114,7 @@ static inline void set_soft_enabled(unsi
- : : "r" (enable), "i" (offsetof(struct paca_struct, soft_enabled)));
- }
-
--void local_irq_restore(unsigned long en)
-+void raw_local_irq_restore(unsigned long en)
- {
- /*
- * get_paca()->soft_enabled = en;
-@@ -174,6 +174,7 @@ void local_irq_restore(unsigned long en)
-
- __hard_irq_enable();
- }
-+EXPORT_SYMBOL(raw_local_irq_restore);
- #endif /* CONFIG_PPC64 */
-
- int show_interrupts(struct seq_file *p, void *v)
-@@ -310,8 +311,21 @@ void do_IRQ(struct pt_regs *regs)
- handler = &__do_IRQ;
- irqtp->task = curtp->task;
- irqtp->flags = 0;
-+
-+ /* Copy the softirq bits in preempt_count so that the
-+ * softirq checks work in the hardirq context.
-+ */
-+ irqtp->preempt_count =
-+ (irqtp->preempt_count & ~SOFTIRQ_MASK) |
-+ (curtp->preempt_count & SOFTIRQ_MASK);
-+
- call_handle_irq(irq, desc, irqtp, handler);
- irqtp->task = NULL;
-+
-+
-+ /* Set any flag that may have been set on the
-+ * alternate stack
-+ */
- if (irqtp->flags)
- set_bits(irqtp->flags, &curtp->flags);
- } else
-@@ -357,7 +371,7 @@ void irq_ctx_init(void)
- memset((void *)softirq_ctx[i], 0, THREAD_SIZE);
- tp = softirq_ctx[i];
- tp->cpu = i;
-- tp->preempt_count = SOFTIRQ_OFFSET;
-+ tp->preempt_count = 0;
-
- memset((void *)hardirq_ctx[i], 0, THREAD_SIZE);
- tp = hardirq_ctx[i];
---- a/arch/powerpc/kernel/isa-bridge.c
-+++ b/arch/powerpc/kernel/isa-bridge.c
-@@ -80,13 +80,13 @@ static void __devinit pci_process_ISA_OF
- * (size depending on dev->n_addr_cells)
- * cell 5: the size of the range
- */
-- if ((range->isa_addr.a_hi && ISA_SPACE_MASK) != ISA_SPACE_IO) {
-+ if ((range->isa_addr.a_hi & ISA_SPACE_MASK) != ISA_SPACE_IO) {
- range++;
- rlen -= sizeof(struct isa_range);
- if (rlen < sizeof(struct isa_range))
- goto inval_range;
- }
-- if ((range->isa_addr.a_hi && ISA_SPACE_MASK) != ISA_SPACE_IO)
-+ if ((range->isa_addr.a_hi & ISA_SPACE_MASK) != ISA_SPACE_IO)
- goto inval_range;
-
- isa_addr = range->isa_addr.a_lo;
-@@ -99,7 +99,7 @@ static void __devinit pci_process_ISA_OF
- */
- if ((pci_addr != 0) || (isa_addr != 0)) {
- printk(KERN_ERR "unexpected isa to pci mapping: %s\n",
-- __FUNCTION__);
-+ __func__);
- return;
- }
-
---- a/arch/powerpc/kernel/lparcfg.c
-+++ b/arch/powerpc/kernel/lparcfg.c
-@@ -226,7 +226,7 @@ static void parse_system_parameter_strin
- unsigned char *local_buffer = kmalloc(SPLPAR_MAXLENGTH, GFP_KERNEL);
- if (!local_buffer) {
- printk(KERN_ERR "%s %s kmalloc failure at line %d \n",
-- __FILE__, __FUNCTION__, __LINE__);
-+ __FILE__, __func__, __LINE__);
- return;
- }
-
-@@ -243,14 +243,14 @@ static void parse_system_parameter_strin
- if (call_status != 0) {
- printk(KERN_INFO
- "%s %s Error calling get-system-parameter (0x%x)\n",
-- __FILE__, __FUNCTION__, call_status);
-+ __FILE__, __func__, call_status);
- } else {
- int splpar_strlen;
- int idx, w_idx;
- char *workbuffer = kzalloc(SPLPAR_MAXLENGTH, GFP_KERNEL);
- if (!workbuffer) {
- printk(KERN_ERR "%s %s kmalloc failure at line %d \n",
-- __FILE__, __FUNCTION__, __LINE__);
-+ __FILE__, __func__, __LINE__);
- kfree(local_buffer);
- return;
- }
-@@ -484,10 +484,10 @@ static ssize_t lparcfg_write(struct file
- current_weight = (resource >> 5 * 8) & 0xFF;
-
- pr_debug("%s: current_entitled = %lu, current_weight = %u\n",
-- __FUNCTION__, current_entitled, current_weight);
-+ __func__, current_entitled, current_weight);
-
- pr_debug("%s: new_entitled = %lu, new_weight = %u\n",
-- __FUNCTION__, *new_entitled_ptr, *new_weight_ptr);
-+ __func__, *new_entitled_ptr, *new_weight_ptr);
-
- retval = plpar_hcall_norets(H_SET_PPP, *new_entitled_ptr,
- *new_weight_ptr);
-@@ -502,7 +502,7 @@ static ssize_t lparcfg_write(struct file
- retval = -EINVAL;
- } else {
- printk(KERN_WARNING "%s: received unknown hv return code %ld",
-- __FUNCTION__, retval);
-+ __func__, retval);
- retval = -EIO;
- }
-
---- a/arch/powerpc/kernel/machine_kexec.c
-+++ b/arch/powerpc/kernel/machine_kexec.c
-@@ -12,8 +12,9 @@
- #include <linux/kexec.h>
- #include <linux/reboot.h>
- #include <linux/threads.h>
-+#include <linux/lmb.h>
- #include <asm/machdep.h>
--#include <asm/lmb.h>
-+#include <asm/prom.h>
-
- void machine_crash_shutdown(struct pt_regs *regs)
- {
---- a/arch/powerpc/kernel/paca.c
-+++ b/arch/powerpc/kernel/paca.c
-@@ -15,7 +15,6 @@
- #include <asm/ptrace.h>
- #include <asm/page.h>
- #include <asm/lppaca.h>
--#include <asm/iseries/it_lp_reg_save.h>
- #include <asm/paca.h>
- #include <asm/mmu.h>
-
-@@ -25,13 +24,13 @@
- extern unsigned long __toc_start;
-
- /*
-- * iSeries structure which the hypervisor knows about - this structure
-+ * The structure which the hypervisor knows about - this structure
- * should not cross a page boundary. The vpa_init/register_vpa call
- * is now known to fail if the lppaca structure crosses a page
-- * boundary. The lppaca is also used on POWER5 pSeries boxes. The
-- * lppaca is 640 bytes long, and cannot readily change since the
-- * hypervisor knows its layout, so a 1kB alignment will suffice to
-- * ensure that it doesn't cross a page boundary.
-+ * boundary. The lppaca is also used on legacy iSeries and POWER5
-+ * pSeries boxes. The lppaca is 640 bytes long, and cannot readily
-+ * change since the hypervisor knows its layout, so a 1kB alignment
-+ * will suffice to ensure that it doesn't cross a page boundary.
- */
- struct lppaca lppaca[] = {
- [0 ... (NR_CPUS-1)] = {
-@@ -66,32 +65,17 @@ struct slb_shadow slb_shadow[] __cacheli
- * processors. The processor VPD array needs one entry per physical
- * processor (not thread).
- */
--#define PACA_INIT_COMMON(number) \
-+#define PACA_INIT(number) \
-+{ \
- .lppaca_ptr = &lppaca[number], \
- .lock_token = 0x8000, \
- .paca_index = (number), /* Paca Index */ \
- .kernel_toc = (unsigned long)(&__toc_start) + 0x8000UL, \
- .hw_cpu_id = 0xffff, \
-- .slb_shadow_ptr = &slb_shadow[number],
--
--#ifdef CONFIG_PPC_ISERIES
--#define PACA_INIT_ISERIES(number) \
-- .reg_save_ptr = &iseries_reg_save[number],
--
--#define PACA_INIT(number) \
--{ \
-- PACA_INIT_COMMON(number) \
-- PACA_INIT_ISERIES(number) \
-+ .slb_shadow_ptr = &slb_shadow[number], \
-+ .__current = &init_task, \
- }
-
--#else
--#define PACA_INIT(number) \
--{ \
-- PACA_INIT_COMMON(number) \
--}
--
--#endif
--
- struct paca_struct paca[] = {
- PACA_INIT(0),
- #if NR_CPUS > 1
---- a/arch/powerpc/kernel/ppc_ksyms.c
-+++ b/arch/powerpc/kernel/ppc_ksyms.c
-@@ -45,10 +45,6 @@
- #include <asm/signal.h>
- #include <asm/dcr.h>
-
--#ifdef CONFIG_PPC64
--EXPORT_SYMBOL(local_irq_restore);
--#endif
--
- #ifdef CONFIG_PPC32
- extern void transfer_to_handler(void);
- extern void do_IRQ(struct pt_regs *regs);
-@@ -58,7 +54,6 @@ extern void program_check_exception(stru
- extern void single_step_exception(struct pt_regs *regs);
- extern int sys_sigreturn(struct pt_regs *regs);
-
--EXPORT_SYMBOL(empty_zero_page);
- EXPORT_SYMBOL(clear_pages);
- EXPORT_SYMBOL(copy_page);
- EXPORT_SYMBOL(ISA_DMA_THRESHOLD);
-@@ -79,6 +74,7 @@ EXPORT_SYMBOL(strncpy);
- EXPORT_SYMBOL(strcat);
- EXPORT_SYMBOL(strlen);
- EXPORT_SYMBOL(strcmp);
-+EXPORT_SYMBOL(strncmp);
-
- EXPORT_SYMBOL(csum_partial);
- EXPORT_SYMBOL(csum_partial_copy_generic);
-@@ -192,3 +188,4 @@ EXPORT_SYMBOL(intercept_table);
- EXPORT_SYMBOL(__mtdcr);
- EXPORT_SYMBOL(__mfdcr);
- #endif
-+EXPORT_SYMBOL(empty_zero_page);
---- a/arch/powerpc/kernel/process.c
-+++ b/arch/powerpc/kernel/process.c
-@@ -868,11 +868,6 @@ int sys_execve(unsigned long a0, unsigne
- flush_spe_to_thread(current);
- error = do_execve(filename, (char __user * __user *) a1,
- (char __user * __user *) a2, regs);
-- if (error == 0) {
-- task_lock(current);
-- current->ptrace &= ~PT_DTRACE;
-- task_unlock(current);
-- }
- putname(filename);
- out:
- return error;
-@@ -919,20 +914,6 @@ int validate_sp(unsigned long sp, struct
- return valid_irq_stack(sp, p, nbytes);
- }
-
--#ifdef CONFIG_PPC64
--#define MIN_STACK_FRAME 112 /* same as STACK_FRAME_OVERHEAD, in fact */
--#define FRAME_LR_SAVE 2
--#define INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD + 288)
--#define REGS_MARKER 0x7265677368657265ul
--#define FRAME_MARKER 12
--#else
--#define MIN_STACK_FRAME 16
--#define FRAME_LR_SAVE 1
--#define INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD)
--#define REGS_MARKER 0x72656773ul
--#define FRAME_MARKER 2
--#endif
--
- EXPORT_SYMBOL(validate_sp);
-
- unsigned long get_wchan(struct task_struct *p)
-@@ -944,15 +925,15 @@ unsigned long get_wchan(struct task_stru
- return 0;
-
- sp = p->thread.ksp;
-- if (!validate_sp(sp, p, MIN_STACK_FRAME))
-+ if (!validate_sp(sp, p, STACK_FRAME_OVERHEAD))
- return 0;
-
- do {
- sp = *(unsigned long *)sp;
-- if (!validate_sp(sp, p, MIN_STACK_FRAME))
-+ if (!validate_sp(sp, p, STACK_FRAME_OVERHEAD))
- return 0;
- if (count > 0) {
-- ip = ((unsigned long *)sp)[FRAME_LR_SAVE];
-+ ip = ((unsigned long *)sp)[STACK_FRAME_LR_SAVE];
- if (!in_sched_functions(ip))
- return ip;
- }
-@@ -981,12 +962,12 @@ void show_stack(struct task_struct *tsk,
- lr = 0;
- printk("Call Trace:\n");
- do {
-- if (!validate_sp(sp, tsk, MIN_STACK_FRAME))
-+ if (!validate_sp(sp, tsk, STACK_FRAME_OVERHEAD))
- return;
-
- stack = (unsigned long *) sp;
- newsp = stack[0];
-- ip = stack[FRAME_LR_SAVE];
-+ ip = stack[STACK_FRAME_LR_SAVE];
- if (!firstframe || ip != lr) {
- printk("["REG"] ["REG"] ", sp, ip);
- print_symbol("%s", ip);
-@@ -1000,8 +981,8 @@ void show_stack(struct task_struct *tsk,
- * See if this is an exception frame.
- * We look for the "regshere" marker in the current frame.
- */
-- if (validate_sp(sp, tsk, INT_FRAME_SIZE)
-- && stack[FRAME_MARKER] == REGS_MARKER) {
-+ if (validate_sp(sp, tsk, STACK_INT_FRAME_SIZE)
-+ && stack[STACK_FRAME_MARKER] == STACK_FRAME_REGS_MARKER) {
- struct pt_regs *regs = (struct pt_regs *)
- (sp + STACK_FRAME_OVERHEAD);
- printk("--- Exception: %lx", regs->trap);
---- a/arch/powerpc/kernel/prom.c
-+++ b/arch/powerpc/kernel/prom.c
-@@ -31,10 +31,10 @@
- #include <linux/kexec.h>
- #include <linux/debugfs.h>
- #include <linux/irq.h>
-+#include <linux/lmb.h>
-
- #include <asm/prom.h>
- #include <asm/rtas.h>
--#include <asm/lmb.h>
- #include <asm/page.h>
- #include <asm/processor.h>
- #include <asm/irq.h>
-@@ -51,6 +51,7 @@
- #include <asm/machdep.h>
- #include <asm/pSeries_reconfig.h>
- #include <asm/pci-bridge.h>
-+#include <asm/phyp_dump.h>
- #include <asm/kexec.h>
-
- #ifdef DEBUG
-@@ -436,7 +437,7 @@ early_param("mem", early_parse_mem);
- * The device tree may be allocated beyond our memory limit, or inside the
- * crash kernel region for kdump. If so, move it out of the way.
- */
--static void move_device_tree(void)
-+static void __init move_device_tree(void)
- {
- unsigned long start, size;
- void *p;
-@@ -1040,6 +1041,87 @@ static void __init early_reserve_mem(voi
- #endif
- }
-
-+#ifdef CONFIG_PHYP_DUMP
-+/**
-+ * phyp_dump_calculate_reserve_size() - reserve variable boot area 5% or arg
-+ *
-+ * Function to find the largest size we need to reserve
-+ * during early boot process.
-+ *
-+ * It either looks for boot param and returns that OR
-+ * returns larger of 256 or 5% rounded down to multiples of 256MB.
-+ *
-+ */
-+static inline unsigned long phyp_dump_calculate_reserve_size(void)
-+{
-+ unsigned long tmp;
-+
-+ if (phyp_dump_info->reserve_bootvar)
-+ return phyp_dump_info->reserve_bootvar;
-+
-+ /* divide by 20 to get 5% of value */
-+ tmp = lmb_end_of_DRAM();
-+ do_div(tmp, 20);
-+
-+ /* round it down in multiples of 256 */
-+ tmp = tmp & ~0x0FFFFFFFUL;
-+
-+ return (tmp > PHYP_DUMP_RMR_END ? tmp : PHYP_DUMP_RMR_END);
-+}
-+
-+/**
-+ * phyp_dump_reserve_mem() - reserve all not-yet-dumped mmemory
-+ *
-+ * This routine may reserve memory regions in the kernel only
-+ * if the system is supported and a dump was taken in last
-+ * boot instance or if the hardware is supported and the
-+ * scratch area needs to be setup. In other instances it returns
-+ * without reserving anything. The memory in case of dump being
-+ * active is freed when the dump is collected (by userland tools).
-+ */
-+static void __init phyp_dump_reserve_mem(void)
-+{
-+ unsigned long base, size;
-+ unsigned long variable_reserve_size;
-+
-+ if (!phyp_dump_info->phyp_dump_configured) {
-+ printk(KERN_ERR "Phyp-dump not supported on this hardware\n");
-+ return;
-+ }
-+
-+ if (!phyp_dump_info->phyp_dump_at_boot) {
-+ printk(KERN_INFO "Phyp-dump disabled at boot time\n");
-+ return;
-+ }
-+
-+ variable_reserve_size = phyp_dump_calculate_reserve_size();
-+
-+ if (phyp_dump_info->phyp_dump_is_active) {
-+ /* Reserve *everything* above RMR.Area freed by userland tools*/
-+ base = variable_reserve_size;
-+ size = lmb_end_of_DRAM() - base;
-+
-+ /* XXX crashed_ram_end is wrong, since it may be beyond
-+ * the memory_limit, it will need to be adjusted. */
-+ lmb_reserve(base, size);
-+
-+ phyp_dump_info->init_reserve_start = base;
-+ phyp_dump_info->init_reserve_size = size;
-+ } else {
-+ size = phyp_dump_info->cpu_state_size +
-+ phyp_dump_info->hpte_region_size +
-+ variable_reserve_size;
-+ base = lmb_end_of_DRAM() - size;
-+ lmb_reserve(base, size);
-+ phyp_dump_info->init_reserve_start = base;
-+ phyp_dump_info->init_reserve_size = size;
-+ }
-+}
-+#else
-+static inline void __init phyp_dump_reserve_mem(void) {}
-+#endif /* CONFIG_PHYP_DUMP && CONFIG_PPC_RTAS */
-+
-+
- void __init early_init_devtree(void *params)
- {
- DBG(" -> early_init_devtree(%p)\n", params);
-@@ -1052,6 +1134,11 @@ void __init early_init_devtree(void *par
- of_scan_flat_dt(early_init_dt_scan_rtas, NULL);
- #endif
-
-+#ifdef CONFIG_PHYP_DUMP
-+ /* scan tree to see if dump occured during last boot */
-+ of_scan_flat_dt(early_init_dt_scan_phyp_dump, NULL);
-+#endif
-+
- /* Retrieve various informations from the /chosen node of the
- * device-tree, including the platform type, initrd location and
- * size, TCE reserve, and more ...
-@@ -1072,6 +1159,7 @@ void __init early_init_devtree(void *par
- reserve_kdump_trampoline();
- reserve_crashkernel();
- early_reserve_mem();
-+ phyp_dump_reserve_mem();
-
- lmb_enforce_memory_limit(memory_limit);
- lmb_analyze();
-@@ -1244,12 +1332,14 @@ EXPORT_SYMBOL(of_node_put);
- */
- void of_attach_node(struct device_node *np)
- {
-- write_lock(&devtree_lock);
-+ unsigned long flags;
-+
-+ write_lock_irqsave(&devtree_lock, flags);
- np->sibling = np->parent->child;
- np->allnext = allnodes;
- np->parent->child = np;
- allnodes = np;
-- write_unlock(&devtree_lock);
-+ write_unlock_irqrestore(&devtree_lock, flags);
- }
-
- /*
-@@ -1260,8 +1350,9 @@ void of_attach_node(struct device_node *
- void of_detach_node(struct device_node *np)
- {
- struct device_node *parent;
-+ unsigned long flags;
-
-- write_lock(&devtree_lock);
-+ write_lock_irqsave(&devtree_lock, flags);
-
- parent = np->parent;
- if (!parent)
-@@ -1292,7 +1383,7 @@ void of_detach_node(struct device_node *
- of_node_set_flag(np, OF_DETACHED);
-
- out_unlock:
-- write_unlock(&devtree_lock);
-+ write_unlock_irqrestore(&devtree_lock, flags);
- }
-
- #ifdef CONFIG_PPC_PSERIES
-@@ -1373,20 +1464,21 @@ __initcall(prom_reconfig_setup);
- int prom_add_property(struct device_node* np, struct property* prop)
- {
- struct property **next;
-+ unsigned long flags;
-
- prop->next = NULL;
-- write_lock(&devtree_lock);
-+ write_lock_irqsave(&devtree_lock, flags);
- next = &np->properties;
- while (*next) {
- if (strcmp(prop->name, (*next)->name) == 0) {
- /* duplicate ! don't insert it */
-- write_unlock(&devtree_lock);
-+ write_unlock_irqrestore(&devtree_lock, flags);
- return -1;
- }
- next = &(*next)->next;
- }
- *next = prop;
-- write_unlock(&devtree_lock);
-+ write_unlock_irqrestore(&devtree_lock, flags);
-
- #ifdef CONFIG_PROC_DEVICETREE
- /* try to add to proc as well if it was initialized */
-@@ -1406,9 +1498,10 @@ int prom_add_property(struct device_node
- int prom_remove_property(struct device_node *np, struct property *prop)
- {
- struct property **next;
-+ unsigned long flags;
- int found = 0;
-
-- write_lock(&devtree_lock);
-+ write_lock_irqsave(&devtree_lock, flags);
- next = &np->properties;
- while (*next) {
- if (*next == prop) {
-@@ -1421,7 +1514,7 @@ int prom_remove_property(struct device_n
- }
- next = &(*next)->next;
- }
-- write_unlock(&devtree_lock);
-+ write_unlock_irqrestore(&devtree_lock, flags);
-
- if (!found)
- return -ENODEV;
-@@ -1447,9 +1540,10 @@ int prom_update_property(struct device_n
- struct property *oldprop)
- {
- struct property **next;
-+ unsigned long flags;
- int found = 0;
-
-- write_lock(&devtree_lock);
-+ write_lock_irqsave(&devtree_lock, flags);
- next = &np->properties;
- while (*next) {
- if (*next == oldprop) {
-@@ -1463,7 +1557,7 @@ int prom_update_property(struct device_n
- }
- next = &(*next)->next;
- }
-- write_unlock(&devtree_lock);
-+ write_unlock_irqrestore(&devtree_lock, flags);
-
- if (!found)
- return -ENODEV;
---- a/arch/powerpc/kernel/prom_init.c
-+++ b/arch/powerpc/kernel/prom_init.c
-@@ -2240,6 +2240,14 @@ static void __init fixup_device_tree_efi
- if (rv != PROM_ERROR && (strcmp(prop, "chrp") == 0))
- prom_setprop(node, "/", "device_type", "efika", sizeof("efika"));
-
-+ /* CODEGEN,description is exposed in /proc/cpuinfo so
-+ fix that too */
-+ rv = prom_getprop(node, "CODEGEN,description", prop, sizeof(prop));
-+ if (rv != PROM_ERROR && (strstr(prop, "CHRP")))
-+ prom_setprop(node, "/", "CODEGEN,description",
-+ "Efika 5200B PowerPC System",
-+ sizeof("Efika 5200B PowerPC System"));
-+
- /* Fixup bestcomm interrupts property */
- node = call_prom("finddevice", 1, 1, ADDR("/builtin/bestcomm"));
- if (PHANDLE_VALID(node)) {
---- a/arch/powerpc/kernel/rtas.c
-+++ b/arch/powerpc/kernel/rtas.c
-@@ -22,6 +22,7 @@
- #include <linux/smp.h>
- #include <linux/completion.h>
- #include <linux/cpumask.h>
-+#include <linux/lmb.h>
-
- #include <asm/prom.h>
- #include <asm/rtas.h>
-@@ -34,7 +35,6 @@
- #include <asm/system.h>
- #include <asm/delay.h>
- #include <asm/uaccess.h>
--#include <asm/lmb.h>
- #include <asm/udbg.h>
- #include <asm/syscalls.h>
- #include <asm/smp.h>
-@@ -507,7 +507,7 @@ int rtas_error_rc(int rtas_rc)
- break;
- default:
- printk(KERN_ERR "%s: unexpected RTAS error %d\n",
-- __FUNCTION__, rtas_rc);
-+ __func__, rtas_rc);
- rc = -ERANGE;
- break;
- }
---- a/arch/powerpc/kernel/rtas_flash.c
-+++ b/arch/powerpc/kernel/rtas_flash.c
-@@ -807,7 +807,7 @@ int __init rtas_flash_init(void)
- rtas_block_ctor);
- if (!flash_block_cache) {
- printk(KERN_ERR "%s: failed to create block cache\n",
-- __FUNCTION__);
-+ __func__);
- rc = -ENOMEM;
- goto cleanup;
- }
---- a/arch/powerpc/kernel/rtas_pci.c
-+++ b/arch/powerpc/kernel/rtas_pci.c
-@@ -56,21 +56,6 @@ static inline int config_access_valid(st
- return 0;
- }
-
--static int of_device_available(struct device_node * dn)
--{
-- const char *status;
--
-- status = of_get_property(dn, "status", NULL);
--
-- if (!status)
-- return 1;
--
-- if (!strcmp(status, "okay"))
-- return 1;
--
-- return 0;
--}
--
- int rtas_read_config(struct pci_dn *pdn, int where, int size, u32 *val)
- {
- int returnval = -1;
-@@ -117,7 +102,7 @@ static int rtas_pci_read_config(struct p
- for (dn = busdn->child; dn; dn = dn->sibling) {
- struct pci_dn *pdn = PCI_DN(dn);
- if (pdn && pdn->devfn == devfn
-- && of_device_available(dn))
-+ && of_device_is_available(dn))
- return rtas_read_config(pdn, where, size, val);
- }
-
-@@ -164,7 +149,7 @@ static int rtas_pci_write_config(struct
- for (dn = busdn->child; dn; dn = dn->sibling) {
- struct pci_dn *pdn = PCI_DN(dn);
- if (pdn && pdn->devfn == devfn
-- && of_device_available(dn))
-+ && of_device_is_available(dn))
- return rtas_write_config(pdn, where, size, val);
- }
- return PCIBIOS_DEVICE_NOT_FOUND;
-@@ -326,7 +311,7 @@ int pcibios_remove_root_bus(struct pci_c
-
- res = b->resource[0];
- if (!res->flags) {
-- printk(KERN_ERR "%s: no IO resource for PHB %s\n", __FUNCTION__,
-+ printk(KERN_ERR "%s: no IO resource for PHB %s\n", __func__,
- b->name);
- return 1;
- }
-@@ -334,13 +319,13 @@ int pcibios_remove_root_bus(struct pci_c
- rc = pcibios_unmap_io_space(b);
- if (rc) {
- printk(KERN_ERR "%s: failed to unmap IO on bus %s\n",
-- __FUNCTION__, b->name);
-+ __func__, b->name);
- return 1;
- }
-
- if (release_resource(res)) {
- printk(KERN_ERR "%s: failed to release IO on bus %s\n",
-- __FUNCTION__, b->name);
-+ __func__, b->name);
- return 1;
- }
-
-@@ -348,13 +333,13 @@ int pcibios_remove_root_bus(struct pci_c
- res = b->resource[i];
- if (!res->flags && i == 0) {
- printk(KERN_ERR "%s: no MEM resource for PHB %s\n",
-- __FUNCTION__, b->name);
-+ __func__, b->name);
- return 1;
- }
- if (res->flags && release_resource(res)) {
- printk(KERN_ERR
- "%s: failed to release IO %d on bus %s\n",
-- __FUNCTION__, i, b->name);
-+ __func__, i, b->name);
- return 1;
- }
- }
---- a/arch/powerpc/kernel/setup-common.c
-+++ b/arch/powerpc/kernel/setup-common.c
-@@ -34,6 +34,7 @@
- #include <linux/serial_8250.h>
- #include <linux/debugfs.h>
- #include <linux/percpu.h>
-+#include <linux/lmb.h>
- #include <asm/io.h>
- #include <asm/prom.h>
- #include <asm/processor.h>
-@@ -56,7 +57,6 @@
- #include <asm/cache.h>
- #include <asm/page.h>
- #include <asm/mmu.h>
--#include <asm/lmb.h>
- #include <asm/xmon.h>
- #include <asm/cputhreads.h>
-
-@@ -167,6 +167,8 @@ static int show_cpuinfo(struct seq_file
- unsigned short min;
-
- if (cpu_id == NR_CPUS) {
-+ struct device_node *root;
-+ const char *model = NULL;
- #if defined(CONFIG_SMP) && defined(CONFIG_PPC32)
- unsigned long bogosum = 0;
- int i;
-@@ -178,6 +180,13 @@ static int show_cpuinfo(struct seq_file
- seq_printf(m, "timebase\t: %lu\n", ppc_tb_freq);
- if (ppc_md.name)
- seq_printf(m, "platform\t: %s\n", ppc_md.name);
-+ root = of_find_node_by_path("/");
-+ if (root)
-+ model = of_get_property(root, "model", NULL);
-+ if (model)
-+ seq_printf(m, "model\t\t: %s\n", model);
-+ of_node_put(root);
-+
- if (ppc_md.show_cpuinfo != NULL)
- ppc_md.show_cpuinfo(m);
-
---- a/arch/powerpc/kernel/setup_32.c
-+++ b/arch/powerpc/kernel/setup_32.c
-@@ -172,6 +172,18 @@ int __init ppc_setup_l2cr(char *str)
- }
- __setup("l2cr=", ppc_setup_l2cr);
-
-+/* Checks "l3cr=xxxx" command-line option */
-+int __init ppc_setup_l3cr(char *str)
-+{
-+ if (cpu_has_feature(CPU_FTR_L3CR)) {
-+ unsigned long val = simple_strtoul(str, NULL, 0);
-+ printk(KERN_INFO "l3cr set to %lx\n", val);
-+ _set_L3CR(val); /* and enable it */
-+ }
-+ return 1;
-+}
-+__setup("l3cr=", ppc_setup_l3cr);
-+
- #ifdef CONFIG_GENERIC_NVRAM
-
- /* Generic nvram hooks used by drivers/char/gen_nvram.c */
-@@ -277,7 +289,7 @@ void __init setup_arch(char **cmdline_p)
- if (ppc_md.panic)
- setup_panic();
-
-- init_mm.start_code = PAGE_OFFSET;
-+ init_mm.start_code = (unsigned long)_stext;
- init_mm.end_code = (unsigned long) _etext;
- init_mm.end_data = (unsigned long) _edata;
- init_mm.brk = klimit;
---- a/arch/powerpc/kernel/setup_64.c
-+++ b/arch/powerpc/kernel/setup_64.c
-@@ -33,6 +33,8 @@
- #include <linux/serial_8250.h>
- #include <linux/bootmem.h>
- #include <linux/pci.h>
-+#include <linux/lockdep.h>
-+#include <linux/lmb.h>
- #include <asm/io.h>
- #include <asm/kdump.h>
- #include <asm/prom.h>
-@@ -55,7 +57,6 @@
- #include <asm/cache.h>
- #include <asm/page.h>
- #include <asm/mmu.h>
--#include <asm/lmb.h>
- #include <asm/firmware.h>
- #include <asm/xmon.h>
- #include <asm/udbg.h>
-@@ -178,6 +179,9 @@ void __init early_setup(unsigned long dt
- /* Enable early debugging if any specified (see udbg.h) */
- udbg_early_init();
-
-+ /* Initialize lockdep early or else spinlocks will blow */
-+ lockdep_init();
-+
- DBG(" -> early_setup(), dt_ptr: 0x%lx\n", dt_ptr);
-
- /*
-@@ -510,7 +514,7 @@ void __init setup_arch(char **cmdline_p)
- if (ppc_md.panic)
- setup_panic();
-
-- init_mm.start_code = PAGE_OFFSET;
-+ init_mm.start_code = (unsigned long)_stext;
- init_mm.end_code = (unsigned long) _etext;
- init_mm.end_data = (unsigned long) _edata;
- init_mm.brk = klimit;
---- /dev/null
-+++ b/arch/powerpc/kernel/stacktrace.c
-@@ -0,0 +1,47 @@
-+/*
-+ * Stack trace utility
-+ *
-+ * Copyright 2008 Christoph Hellwig, IBM Corp.
-+ *
-+ *
-+ * 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/sched.h>
-+#include <linux/stacktrace.h>
-+#include <asm/ptrace.h>
-+#include <asm/asm-offsets.h>
-+
-+/*
-+ * Save stack-backtrace addresses into a stack_trace buffer.
-+ */
-+void save_stack_trace(struct stack_trace *trace)
-+{
-+ unsigned long sp;
-+
-+ asm("mr %0,1" : "=r" (sp));
-+
-+ for (;;) {
-+ unsigned long *stack = (unsigned long *) sp;
-+ unsigned long newsp, ip;
-+
-+ if (!validate_sp(sp, current, STACK_FRAME_OVERHEAD))
-+ return;
-+
-+ newsp = stack[0];
-+ ip = stack[STACK_FRAME_LR_SAVE];
-+
-+ if (!trace->skip)
-+ trace->entries[trace->nr_entries++] = ip;
-+ else
-+ trace->skip--;
-+
-+ if (trace->nr_entries >= trace->max_entries)
-+ return;
-+
-+ sp = newsp;
-+ }
-+}
---- a/arch/powerpc/kernel/sys_ppc32.c
-+++ b/arch/powerpc/kernel/sys_ppc32.c
-@@ -368,11 +368,6 @@ long compat_sys_execve(unsigned long a0,
-
- error = compat_do_execve(filename, compat_ptr(a1), compat_ptr(a2), regs);
-
-- if (error == 0) {
-- task_lock(current);
-- current->ptrace &= ~PT_DTRACE;
-- task_unlock(current);
-- }
- putname(filename);
-
- out:
---- a/arch/powerpc/kernel/vdso.c
-+++ b/arch/powerpc/kernel/vdso.c
-@@ -21,13 +21,14 @@
- #include <linux/elf.h>
- #include <linux/security.h>
- #include <linux/bootmem.h>
-+#include <linux/lmb.h>
-
- #include <asm/pgtable.h>
- #include <asm/system.h>
- #include <asm/processor.h>
- #include <asm/mmu.h>
- #include <asm/mmu_context.h>
--#include <asm/lmb.h>
-+#include <asm/prom.h>
- #include <asm/machdep.h>
- #include <asm/cputable.h>
- #include <asm/sections.h>
---- a/arch/powerpc/kernel/vio.c
-+++ b/arch/powerpc/kernel/vio.c
-@@ -139,7 +139,7 @@ static int vio_bus_remove(struct device
- */
- int vio_register_driver(struct vio_driver *viodrv)
- {
-- printk(KERN_DEBUG "%s: driver %s registering\n", __FUNCTION__,
-+ printk(KERN_DEBUG "%s: driver %s registering\n", __func__,
- viodrv->driver.name);
-
- /* fill in 'struct driver' fields */
-@@ -184,7 +184,7 @@ struct vio_dev *vio_register_device_node
- /* we need the 'device_type' property, in order to match with drivers */
- if (of_node->type == NULL) {
- printk(KERN_WARNING "%s: node %s missing 'device_type'\n",
-- __FUNCTION__,
-+ __func__,
- of_node->name ? of_node->name : "<unknown>");
- return NULL;
- }
-@@ -192,7 +192,7 @@ struct vio_dev *vio_register_device_node
- unit_address = of_get_property(of_node, "reg", NULL);
- if (unit_address == NULL) {
- printk(KERN_WARNING "%s: node %s missing 'reg'\n",
-- __FUNCTION__,
-+ __func__,
- of_node->name ? of_node->name : "<unknown>");
- return NULL;
- }
-@@ -227,7 +227,7 @@ struct vio_dev *vio_register_device_node
- /* register with generic device framework */
- if (device_register(&viodev->dev)) {
- printk(KERN_ERR "%s: failed to register device %s\n",
-- __FUNCTION__, viodev->dev.bus_id);
-+ __func__, viodev->dev.bus_id);
- /* XXX free TCE table */
- kfree(viodev);
- return NULL;
-@@ -258,7 +258,7 @@ static int __init vio_bus_init(void)
- err = device_register(&vio_bus_device.dev);
- if (err) {
- printk(KERN_WARNING "%s: device_register returned %i\n",
-- __FUNCTION__, err);
-+ __func__, err);
- return err;
- }
-
---- a/arch/powerpc/kernel/vmlinux.lds.S
-+++ b/arch/powerpc/kernel/vmlinux.lds.S
-@@ -1,11 +1,9 @@
- #ifdef CONFIG_PPC64
--#include <asm/page.h>
- #define PROVIDE32(x) PROVIDE(__unused__##x)
- #else
--#define PAGE_SIZE 4096
--#define KERNELBASE CONFIG_KERNEL_START
- #define PROVIDE32(x) PROVIDE(x)
- #endif
-+#include <asm/page.h>
- #include <asm-generic/vmlinux.lds.h>
- #include <asm/cache.h>
-
-@@ -33,7 +31,7 @@ SECTIONS
- */
-
- /* Text and gots */
-- .text : {
-+ .text : AT(ADDR(.text) - LOAD_OFFSET) {
- ALIGN_FUNCTION();
- *(.text.head)
- _text = .;
-@@ -58,7 +56,7 @@ SECTIONS
- RODATA
-
- /* Exception & bug tables */
-- __ex_table : {
-+ __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
- __start___ex_table = .;
- *(__ex_table)
- __stop___ex_table = .;
-@@ -74,7 +72,7 @@ SECTIONS
- . = ALIGN(PAGE_SIZE);
- __init_begin = .;
-
-- .init.text : {
-+ .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
- _sinittext = .;
- INIT_TEXT
- _einittext = .;
-@@ -83,11 +81,11 @@ SECTIONS
- /* .exit.text is discarded at runtime, not link time,
- * to deal with references from __bug_table
- */
-- .exit.text : {
-+ .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
- EXIT_TEXT
- }
-
-- .init.data : {
-+ .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
- INIT_DATA
- __vtop_table_begin = .;
- *(.vtop_fixup);
-@@ -103,19 +101,19 @@ SECTIONS
- }
-
- . = ALIGN(16);
-- .init.setup : {
-+ .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
- __setup_start = .;
- *(.init.setup)
- __setup_end = .;
- }
-
-- .initcall.init : {
-+ .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
- __initcall_start = .;
- INITCALLS
- __initcall_end = .;
- }
-
-- .con_initcall.init : {
-+ .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
- __con_initcall_start = .;
- *(.con_initcall.init)
- __con_initcall_end = .;
-@@ -124,14 +122,14 @@ SECTIONS
- SECURITY_INIT
-
- . = ALIGN(8);
-- __ftr_fixup : {
-+ __ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
- __start___ftr_fixup = .;
- *(__ftr_fixup)
- __stop___ftr_fixup = .;
- }
- #ifdef CONFIG_PPC64
- . = ALIGN(8);
-- __fw_ftr_fixup : {
-+ __fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
- __start___fw_ftr_fixup = .;
- *(__fw_ftr_fixup)
- __stop___fw_ftr_fixup = .;
-@@ -139,14 +137,14 @@ SECTIONS
- #endif
- #ifdef CONFIG_BLK_DEV_INITRD
- . = ALIGN(PAGE_SIZE);
-- .init.ramfs : {
-+ .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
- __initramfs_start = .;
- *(.init.ramfs)
- __initramfs_end = .;
- }
- #endif
- . = ALIGN(PAGE_SIZE);
-- .data.percpu : {
-+ .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) {
- __per_cpu_start = .;
- *(.data.percpu)
- *(.data.percpu.shared_aligned)
-@@ -154,7 +152,7 @@ SECTIONS
- }
-
- . = ALIGN(8);
-- .machine.desc : {
-+ .machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
- __machine_desc_start = . ;
- *(.machine.desc)
- __machine_desc_end = . ;
-@@ -172,25 +170,24 @@ SECTIONS
- _sdata = .;
-
- #ifdef CONFIG_PPC32
-- .data :
-- {
-+ .data : AT(ADDR(.data) - LOAD_OFFSET) {
- DATA_DATA
- *(.sdata)
- *(.got.plt) *(.got)
- }
- #else
-- .data : {
-+ .data : AT(ADDR(.data) - LOAD_OFFSET) {
- DATA_DATA
- *(.data.rel*)
- *(.toc1)
- *(.branch_lt)
- }
-
-- .opd : {
-+ .opd : AT(ADDR(.opd) - LOAD_OFFSET) {
- *(.opd)
- }
-
-- .got : {
-+ .got : AT(ADDR(.got) - LOAD_OFFSET) {
- __toc_start = .;
- *(.got)
- *(.toc)
-@@ -207,26 +204,26 @@ SECTIONS
- #else
- . = ALIGN(16384);
- #endif
-- .data.init_task : {
-+ .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
- *(.data.init_task)
- }
-
- . = ALIGN(PAGE_SIZE);
-- .data.page_aligned : {
-+ .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
- *(.data.page_aligned)
- }
-
-- .data.cacheline_aligned : {
-+ .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
- *(.data.cacheline_aligned)
- }
-
- . = ALIGN(L1_CACHE_BYTES);
-- .data.read_mostly : {
-+ .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
- *(.data.read_mostly)
- }
-
- . = ALIGN(PAGE_SIZE);
-- __data_nosave : {
-+ .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
- __nosave_begin = .;
- *(.data.nosave)
- . = ALIGN(PAGE_SIZE);
-@@ -237,7 +234,7 @@ SECTIONS
- * And finally the bss
- */
-
-- .bss : {
-+ .bss : AT(ADDR(.bss) - LOAD_OFFSET) {
- __bss_start = .;
- *(.sbss) *(.scommon)
- *(.dynbss)
---- a/arch/powerpc/lib/rheap.c
-+++ b/arch/powerpc/lib/rheap.c
-@@ -54,7 +54,7 @@ static int grow(rh_info_t * info, int ma
-
- new_blocks = max_blocks - info->max_blocks;
-
-- block = kmalloc(sizeof(rh_block_t) * max_blocks, GFP_KERNEL);
-+ block = kmalloc(sizeof(rh_block_t) * max_blocks, GFP_ATOMIC);
- if (block == NULL)
- return -ENOMEM;
-
-@@ -258,7 +258,7 @@ rh_info_t *rh_create(unsigned int alignm
- if ((alignment & (alignment - 1)) != 0)
- return ERR_PTR(-EINVAL);
-
-- info = kmalloc(sizeof(*info), GFP_KERNEL);
-+ info = kmalloc(sizeof(*info), GFP_ATOMIC);
- if (info == NULL)
- return ERR_PTR(-ENOMEM);
-
---- a/arch/powerpc/lib/string.S
-+++ b/arch/powerpc/lib/string.S
-@@ -75,6 +75,20 @@ _GLOBAL(strcmp)
- beq 1b
- blr
-
-+_GLOBAL(strncmp)
-+ PPC_LCMPI r5,0
-+ beqlr
-+ mtctr r5
-+ addi r5,r3,-1
-+ addi r4,r4,-1
-+1: lbzu r3,1(r5)
-+ cmpwi 1,r3,0
-+ lbzu r0,1(r4)
-+ subf. r3,r0,r3
-+ beqlr 1
-+ bdnzt eq,1b
-+ blr
-+
- _GLOBAL(strlen)
- addi r4,r3,-1
- 1: lbzu r0,1(r4)
---- a/arch/powerpc/math-emu/fabs.c
-+++ b/arch/powerpc/math-emu/fabs.c
-@@ -9,7 +9,7 @@ fabs(u32 *frD, u32 *frB)
- frD[1] = frB[1];
-
- #ifdef DEBUG
-- printk("%s: D %p, B %p: ", __FUNCTION__, frD, frB);
-+ printk("%s: D %p, B %p: ", __func__, frD, frB);
- dump_double(frD);
- printk("\n");
- #endif
---- a/arch/powerpc/math-emu/fadd.c
-+++ b/arch/powerpc/math-emu/fadd.c
-@@ -14,7 +14,7 @@ fadd(void *frD, void *frA, void *frB)
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB);
-+ printk("%s: %p %p %p\n", __func__, frD, frA, frB);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fadds.c
-+++ b/arch/powerpc/math-emu/fadds.c
-@@ -15,7 +15,7 @@ fadds(void *frD, void *frA, void *frB)
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB);
-+ printk("%s: %p %p %p\n", __func__, frD, frA, frB);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fcmpo.c
-+++ b/arch/powerpc/math-emu/fcmpo.c
-@@ -15,7 +15,7 @@ fcmpo(u32 *ccr, int crfD, void *frA, voi
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p (%08x) %d %p %p\n", __FUNCTION__, ccr, *ccr, crfD, frA, frB);
-+ printk("%s: %p (%08x) %d %p %p\n", __func__, ccr, *ccr, crfD, frA, frB);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fcmpu.c
-+++ b/arch/powerpc/math-emu/fcmpu.c
-@@ -14,7 +14,7 @@ fcmpu(u32 *ccr, int crfD, void *frA, voi
- long cmp;
-
- #ifdef DEBUG
-- printk("%s: %p (%08x) %d %p %p\n", __FUNCTION__, ccr, *ccr, crfD, frA, frB);
-+ printk("%s: %p (%08x) %d %p %p\n", __func__, ccr, *ccr, crfD, frA, frB);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fctiw.c
-+++ b/arch/powerpc/math-emu/fctiw.c
-@@ -16,7 +16,7 @@ fctiw(u32 *frD, void *frB)
- frD[1] = r;
-
- #ifdef DEBUG
-- printk("%s: D %p, B %p: ", __FUNCTION__, frD, frB);
-+ printk("%s: D %p, B %p: ", __func__, frD, frB);
- dump_double(frD);
- printk("\n");
- #endif
---- a/arch/powerpc/math-emu/fctiwz.c
-+++ b/arch/powerpc/math-emu/fctiwz.c
-@@ -23,7 +23,7 @@ fctiwz(u32 *frD, void *frB)
- __FPU_FPSCR = fpscr;
-
- #ifdef DEBUG
-- printk("%s: D %p, B %p: ", __FUNCTION__, frD, frB);
-+ printk("%s: D %p, B %p: ", __func__, frD, frB);
- dump_double(frD);
- printk("\n");
- #endif
---- a/arch/powerpc/math-emu/fdiv.c
-+++ b/arch/powerpc/math-emu/fdiv.c
-@@ -14,7 +14,7 @@ fdiv(void *frD, void *frA, void *frB)
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB);
-+ printk("%s: %p %p %p\n", __func__, frD, frA, frB);
- #endif
-
- __FP_UNPACK_D(A, frA);
-@@ -28,13 +28,13 @@ fdiv(void *frD, void *frA, void *frB)
- if (A_c == FP_CLS_ZERO && B_c == FP_CLS_ZERO) {
- ret |= EFLAG_VXZDZ;
- #ifdef DEBUG
-- printk("%s: FPSCR_VXZDZ raised\n", __FUNCTION__);
-+ printk("%s: FPSCR_VXZDZ raised\n", __func__);
- #endif
- }
- if (A_c == FP_CLS_INF && B_c == FP_CLS_INF) {
- ret |= EFLAG_VXIDI;
- #ifdef DEBUG
-- printk("%s: FPSCR_VXIDI raised\n", __FUNCTION__);
-+ printk("%s: FPSCR_VXIDI raised\n", __func__);
- #endif
- }
-
---- a/arch/powerpc/math-emu/fdivs.c
-+++ b/arch/powerpc/math-emu/fdivs.c
-@@ -15,7 +15,7 @@ fdivs(void *frD, void *frA, void *frB)
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB);
-+ printk("%s: %p %p %p\n", __func__, frD, frA, frB);
- #endif
-
- __FP_UNPACK_D(A, frA);
-@@ -29,13 +29,13 @@ fdivs(void *frD, void *frA, void *frB)
- if (A_c == FP_CLS_ZERO && B_c == FP_CLS_ZERO) {
- ret |= EFLAG_VXZDZ;
- #ifdef DEBUG
-- printk("%s: FPSCR_VXZDZ raised\n", __FUNCTION__);
-+ printk("%s: FPSCR_VXZDZ raised\n", __func__);
- #endif
- }
- if (A_c == FP_CLS_INF && B_c == FP_CLS_INF) {
- ret |= EFLAG_VXIDI;
- #ifdef DEBUG
-- printk("%s: FPSCR_VXIDI raised\n", __FUNCTION__);
-+ printk("%s: FPSCR_VXIDI raised\n", __func__);
- #endif
- }
-
---- a/arch/powerpc/math-emu/fmadd.c
-+++ b/arch/powerpc/math-emu/fmadd.c
-@@ -16,7 +16,7 @@ fmadd(void *frD, void *frA, void *frB, v
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC);
-+ printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fmadds.c
-+++ b/arch/powerpc/math-emu/fmadds.c
-@@ -17,7 +17,7 @@ fmadds(void *frD, void *frA, void *frB,
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC);
-+ printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fmr.c
-+++ b/arch/powerpc/math-emu/fmr.c
-@@ -9,7 +9,7 @@ fmr(u32 *frD, u32 *frB)
- frD[1] = frB[1];
-
- #ifdef DEBUG
-- printk("%s: D %p, B %p: ", __FUNCTION__, frD, frB);
-+ printk("%s: D %p, B %p: ", __func__, frD, frB);
- dump_double(frD);
- printk("\n");
- #endif
---- a/arch/powerpc/math-emu/fmsub.c
-+++ b/arch/powerpc/math-emu/fmsub.c
-@@ -16,7 +16,7 @@ fmsub(void *frD, void *frA, void *frB, v
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC);
-+ printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fmsubs.c
-+++ b/arch/powerpc/math-emu/fmsubs.c
-@@ -17,7 +17,7 @@ fmsubs(void *frD, void *frA, void *frB,
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC);
-+ printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fmul.c
-+++ b/arch/powerpc/math-emu/fmul.c
-@@ -14,7 +14,7 @@ fmul(void *frD, void *frA, void *frB)
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB);
-+ printk("%s: %p %p %p\n", __func__, frD, frA, frB);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fmuls.c
-+++ b/arch/powerpc/math-emu/fmuls.c
-@@ -15,7 +15,7 @@ fmuls(void *frD, void *frA, void *frB)
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB);
-+ printk("%s: %p %p %p\n", __func__, frD, frA, frB);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fnabs.c
-+++ b/arch/powerpc/math-emu/fnabs.c
-@@ -9,7 +9,7 @@ fnabs(u32 *frD, u32 *frB)
- frD[1] = frB[1];
-
- #ifdef DEBUG
-- printk("%s: D %p, B %p: ", __FUNCTION__, frD, frB);
-+ printk("%s: D %p, B %p: ", __func__, frD, frB);
- dump_double(frD);
- printk("\n");
- #endif
---- a/arch/powerpc/math-emu/fneg.c
-+++ b/arch/powerpc/math-emu/fneg.c
-@@ -9,7 +9,7 @@ fneg(u32 *frD, u32 *frB)
- frD[1] = frB[1];
-
- #ifdef DEBUG
-- printk("%s: D %p, B %p: ", __FUNCTION__, frD, frB);
-+ printk("%s: D %p, B %p: ", __func__, frD, frB);
- dump_double(frD);
- printk("\n");
- #endif
---- a/arch/powerpc/math-emu/fnmadd.c
-+++ b/arch/powerpc/math-emu/fnmadd.c
-@@ -16,7 +16,7 @@ fnmadd(void *frD, void *frA, void *frB,
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC);
-+ printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fnmadds.c
-+++ b/arch/powerpc/math-emu/fnmadds.c
-@@ -17,7 +17,7 @@ fnmadds(void *frD, void *frA, void *frB,
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC);
-+ printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fnmsub.c
-+++ b/arch/powerpc/math-emu/fnmsub.c
-@@ -16,7 +16,7 @@ fnmsub(void *frD, void *frA, void *frB,
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC);
-+ printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fnmsubs.c
-+++ b/arch/powerpc/math-emu/fnmsubs.c
-@@ -17,7 +17,7 @@ fnmsubs(void *frD, void *frA, void *frB,
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC);
-+ printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fres.c
-+++ b/arch/powerpc/math-emu/fres.c
-@@ -6,7 +6,7 @@ int
- fres(void *frD, void *frB)
- {
- #ifdef DEBUG
-- printk("%s: %p %p\n", __FUNCTION__, frD, frB);
-+ printk("%s: %p %p\n", __func__, frD, frB);
- #endif
- return -ENOSYS;
- }
---- a/arch/powerpc/math-emu/frsp.c
-+++ b/arch/powerpc/math-emu/frsp.c
-@@ -12,7 +12,7 @@ frsp(void *frD, void *frB)
- FP_DECL_D(B);
-
- #ifdef DEBUG
-- printk("%s: D %p, B %p\n", __FUNCTION__, frD, frB);
-+ printk("%s: D %p, B %p\n", __func__, frD, frB);
- #endif
-
- __FP_UNPACK_D(B, frB);
---- a/arch/powerpc/math-emu/frsqrte.c
-+++ b/arch/powerpc/math-emu/frsqrte.c
-@@ -6,7 +6,7 @@ int
- frsqrte(void *frD, void *frB)
- {
- #ifdef DEBUG
-- printk("%s: %p %p\n", __FUNCTION__, frD, frB);
-+ printk("%s: %p %p\n", __func__, frD, frB);
- #endif
- return 0;
- }
---- a/arch/powerpc/math-emu/fsel.c
-+++ b/arch/powerpc/math-emu/fsel.c
-@@ -11,7 +11,7 @@ fsel(u32 *frD, void *frA, u32 *frB, u32
- FP_DECL_D(A);
-
- #ifdef DEBUG
-- printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC);
-+ printk("%s: %p %p %p %p\n", __func__, frD, frA, frB, frC);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fsqrt.c
-+++ b/arch/powerpc/math-emu/fsqrt.c
-@@ -13,7 +13,7 @@ fsqrt(void *frD, void *frB)
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frB);
-+ printk("%s: %p %p %p %p\n", __func__, frD, frB);
- #endif
-
- __FP_UNPACK_D(B, frB);
---- a/arch/powerpc/math-emu/fsqrts.c
-+++ b/arch/powerpc/math-emu/fsqrts.c
-@@ -14,7 +14,7 @@ fsqrts(void *frD, void *frB)
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frB);
-+ printk("%s: %p %p %p %p\n", __func__, frD, frB);
- #endif
-
- __FP_UNPACK_D(B, frB);
---- a/arch/powerpc/math-emu/fsub.c
-+++ b/arch/powerpc/math-emu/fsub.c
-@@ -14,7 +14,7 @@ fsub(void *frD, void *frA, void *frB)
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB);
-+ printk("%s: %p %p %p\n", __func__, frD, frA, frB);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/fsubs.c
-+++ b/arch/powerpc/math-emu/fsubs.c
-@@ -15,7 +15,7 @@ fsubs(void *frD, void *frA, void *frB)
- int ret = 0;
-
- #ifdef DEBUG
-- printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB);
-+ printk("%s: %p %p %p\n", __func__, frD, frA, frB);
- #endif
-
- __FP_UNPACK_D(A, frA);
---- a/arch/powerpc/math-emu/lfd.c
-+++ b/arch/powerpc/math-emu/lfd.c
-@@ -11,7 +11,7 @@ lfd(void *frD, void *ea)
- if (copy_from_user(frD, ea, sizeof(double)))
- return -EFAULT;
- #ifdef DEBUG
-- printk("%s: D %p, ea %p: ", __FUNCTION__, frD, ea);
-+ printk("%s: D %p, ea %p: ", __func__, frD, ea);
- dump_double(frD);
- printk("\n");
- #endif
---- a/arch/powerpc/math-emu/lfs.c
-+++ b/arch/powerpc/math-emu/lfs.c
-@@ -14,7 +14,7 @@ lfs(void *frD, void *ea)
- float f;
-
- #ifdef DEBUG
-- printk("%s: D %p, ea %p\n", __FUNCTION__, frD, ea);
-+ printk("%s: D %p, ea %p\n", __func__, frD, ea);
- #endif
-
- if (copy_from_user(&f, ea, sizeof(float)))
---- a/arch/powerpc/math-emu/mcrfs.c
-+++ b/arch/powerpc/math-emu/mcrfs.c
-@@ -10,7 +10,7 @@ mcrfs(u32 *ccr, u32 crfD, u32 crfS)
- u32 value, clear;
-
- #ifdef DEBUG
-- printk("%s: %p (%08x) %d %d\n", __FUNCTION__, ccr, *ccr, crfD, crfS);
-+ printk("%s: %p (%08x) %d %d\n", __func__, ccr, *ccr, crfD, crfS);
- #endif
-
- clear = 15 << ((7 - crfS) << 2);
-@@ -24,7 +24,7 @@ mcrfs(u32 *ccr, u32 crfD, u32 crfS)
- *ccr |= (value << ((7 - crfD) << 2));
-
- #ifdef DEBUG
-- printk("CR: %08x\n", __FUNCTION__, *ccr);
-+ printk("CR: %08x\n", __func__, *ccr);
- #endif
-
- return 0;
---- a/arch/powerpc/math-emu/mffs.c
-+++ b/arch/powerpc/math-emu/mffs.c
-@@ -10,7 +10,7 @@ mffs(u32 *frD)
- frD[1] = __FPU_FPSCR;
-
- #ifdef DEBUG
-- printk("%s: frD %p: %08x.%08x\n", __FUNCTION__, frD, frD[0], frD[1]);
-+ printk("%s: frD %p: %08x.%08x\n", __func__, frD, frD[0], frD[1]);
- #endif
-
- return 0;
---- a/arch/powerpc/math-emu/mtfsb0.c
-+++ b/arch/powerpc/math-emu/mtfsb0.c
-@@ -11,7 +11,7 @@ mtfsb0(int crbD)
- __FPU_FPSCR &= ~(1 << (31 - crbD));
-
- #ifdef DEBUG
-- printk("%s: %d %08lx\n", __FUNCTION__, crbD, __FPU_FPSCR);
-+ printk("%s: %d %08lx\n", __func__, crbD, __FPU_FPSCR);
- #endif
-
- return 0;
---- a/arch/powerpc/math-emu/mtfsb1.c
-+++ b/arch/powerpc/math-emu/mtfsb1.c
-@@ -11,7 +11,7 @@ mtfsb1(int crbD)
- __FPU_FPSCR |= (1 << (31 - crbD));
-
- #ifdef DEBUG
-- printk("%s: %d %08lx\n", __FUNCTION__, crbD, __FPU_FPSCR);
-+ printk("%s: %d %08lx\n", __func__, crbD, __FPU_FPSCR);
- #endif
-
- return 0;
---- a/arch/powerpc/math-emu/mtfsf.c
-+++ b/arch/powerpc/math-emu/mtfsf.c
-@@ -38,7 +38,7 @@ mtfsf(unsigned int FM, u32 *frB)
- __FPU_FPSCR |= (frB[1] & mask);
-
- #ifdef DEBUG
-- printk("%s: %02x %p: %08lx\n", __FUNCTION__, FM, frB, __FPU_FPSCR);
-+ printk("%s: %02x %p: %08lx\n", __func__, FM, frB, __FPU_FPSCR);
- #endif
-
- return 0;
---- a/arch/powerpc/math-emu/mtfsfi.c
-+++ b/arch/powerpc/math-emu/mtfsfi.c
-@@ -16,7 +16,7 @@ mtfsfi(unsigned int crfD, unsigned int I
- __FPU_FPSCR |= (IMM & 0xf) << ((7 - crfD) << 2);
-
- #ifdef DEBUG
-- printk("%s: %d %x: %08lx\n", __FUNCTION__, crfD, IMM, __FPU_FPSCR);
-+ printk("%s: %d %x: %08lx\n", __func__, crfD, IMM, __FPU_FPSCR);
- #endif
-
- return 0;
---- a/arch/powerpc/math-emu/stfd.c
-+++ b/arch/powerpc/math-emu/stfd.c
-@@ -7,7 +7,7 @@ stfd(void *frS, void *ea)
- {
- #if 0
- #ifdef DEBUG
-- printk("%s: S %p, ea %p: ", __FUNCTION__, frS, ea);
-+ printk("%s: S %p, ea %p: ", __func__, frS, ea);
- dump_double(frS);
- printk("\n");
- #endif
---- a/arch/powerpc/math-emu/stfiwx.c
-+++ b/arch/powerpc/math-emu/stfiwx.c
-@@ -6,7 +6,7 @@ int
- stfiwx(u32 *frS, void *ea)
- {
- #ifdef DEBUG
-- printk("%s: %p %p\n", __FUNCTION__, frS, ea);
-+ printk("%s: %p %p\n", __func__, frS, ea);
- #endif
-
- if (copy_to_user(ea, &frS[1], sizeof(frS[1])))
---- a/arch/powerpc/math-emu/stfs.c
-+++ b/arch/powerpc/math-emu/stfs.c
-@@ -15,7 +15,7 @@ stfs(void *frS, void *ea)
- int err;
-
- #ifdef DEBUG
-- printk("%s: S %p, ea %p\n", __FUNCTION__, frS, ea);
-+ printk("%s: S %p, ea %p\n", __func__, frS, ea);
- #endif
-
- __FP_UNPACK_D(A, frS);
---- a/arch/powerpc/mm/40x_mmu.c
-+++ b/arch/powerpc/mm/40x_mmu.c
-@@ -97,7 +97,7 @@ unsigned long __init mmu_mapin_ram(void)
- phys_addr_t p;
-
- v = KERNELBASE;
-- p = PPC_MEMSTART;
-+ p = 0;
- s = total_lowmem;
-
- if (__map_without_ltlbs)
---- a/arch/powerpc/mm/44x_mmu.c
-+++ b/arch/powerpc/mm/44x_mmu.c
-@@ -67,7 +67,7 @@ unsigned long __init mmu_mapin_ram(void)
-
- /* Pin in enough TLBs to cover any lowmem not covered by the
- * initial 256M mapping established in head_44x.S */
-- for (addr = PPC_PIN_SIZE; addr < total_lowmem;
-+ for (addr = PPC_PIN_SIZE; addr < lowmem_end_addr;
- addr += PPC_PIN_SIZE)
- ppc44x_pin_tlb(addr + PAGE_OFFSET, addr);
-
---- a/arch/powerpc/mm/Makefile
-+++ b/arch/powerpc/mm/Makefile
-@@ -6,7 +6,7 @@ ifeq ($(CONFIG_PPC64),y)
- EXTRA_CFLAGS += -mno-minimal-toc
- endif
-
--obj-y := fault.o mem.o lmb.o \
-+obj-y := fault.o mem.o \
- init_$(CONFIG_WORD_SIZE).o \
- pgtable_$(CONFIG_WORD_SIZE).o \
- mmu_context_$(CONFIG_WORD_SIZE).o
---- a/arch/powerpc/mm/fsl_booke_mmu.c
-+++ b/arch/powerpc/mm/fsl_booke_mmu.c
-@@ -49,18 +49,15 @@
- #include <asm/mmu.h>
- #include <asm/uaccess.h>
- #include <asm/smp.h>
--#include <asm/bootx.h>
- #include <asm/machdep.h>
- #include <asm/setup.h>
-
-+#include "mmu_decl.h"
-+
- extern void loadcam_entry(unsigned int index);
- unsigned int tlbcam_index;
- unsigned int num_tlbcam_entries;
- static unsigned long __cam0, __cam1, __cam2;
--extern unsigned long total_lowmem;
--extern unsigned long __max_low_memory;
--extern unsigned long __initial_memory_limit;
--#define MAX_LOW_MEM CONFIG_LOWMEM_SIZE
-
- #define NUM_TLBCAMS (16)
-
-@@ -165,15 +162,15 @@ void invalidate_tlbcam_entry(int index)
- void __init cam_mapin_ram(unsigned long cam0, unsigned long cam1,
- unsigned long cam2)
- {
-- settlbcam(0, PAGE_OFFSET, PPC_MEMSTART, cam0, _PAGE_KERNEL, 0);
-+ settlbcam(0, PAGE_OFFSET, memstart_addr, cam0, _PAGE_KERNEL, 0);
- tlbcam_index++;
- if (cam1) {
- tlbcam_index++;
-- settlbcam(1, PAGE_OFFSET+cam0, PPC_MEMSTART+cam0, cam1, _PAGE_KERNEL, 0);
-+ settlbcam(1, PAGE_OFFSET+cam0, memstart_addr+cam0, cam1, _PAGE_KERNEL, 0);
- }
- if (cam2) {
- tlbcam_index++;
-- settlbcam(2, PAGE_OFFSET+cam0+cam1, PPC_MEMSTART+cam0+cam1, cam2, _PAGE_KERNEL, 0);
-+ settlbcam(2, PAGE_OFFSET+cam0+cam1, memstart_addr+cam0+cam1, cam2, _PAGE_KERNEL, 0);
- }
- }
-
-@@ -196,35 +193,32 @@ unsigned long __init mmu_mapin_ram(void)
- void __init
- adjust_total_lowmem(void)
- {
-- unsigned long max_low_mem = MAX_LOW_MEM;
-- unsigned long cam_max = 0x10000000;
-- unsigned long ram;
--
-- /* adjust CAM size to max_low_mem */
-- if (max_low_mem < cam_max)
-- cam_max = max_low_mem;
--
-- /* adjust lowmem size to max_low_mem */
-- if (max_low_mem < total_lowmem)
-- ram = max_low_mem;
-- else
-- ram = total_lowmem;
-+ phys_addr_t max_lowmem_size = __max_low_memory;
-+ phys_addr_t cam_max_size = 0x10000000;
-+ phys_addr_t ram;
-+
-+ /* adjust CAM size to max_lowmem_size */
-+ if (max_lowmem_size < cam_max_size)
-+ cam_max_size = max_lowmem_size;
-+
-+ /* adjust lowmem size to max_lowmem_size */
-+ ram = min(max_lowmem_size, total_lowmem);
-
- /* Calculate CAM values */
- __cam0 = 1UL << 2 * (__ilog2(ram) / 2);
-- if (__cam0 > cam_max)
-- __cam0 = cam_max;
-+ if (__cam0 > cam_max_size)
-+ __cam0 = cam_max_size;
- ram -= __cam0;
- if (ram) {
- __cam1 = 1UL << 2 * (__ilog2(ram) / 2);
-- if (__cam1 > cam_max)
-- __cam1 = cam_max;
-+ if (__cam1 > cam_max_size)
-+ __cam1 = cam_max_size;
- ram -= __cam1;
- }
- if (ram) {
- __cam2 = 1UL << 2 * (__ilog2(ram) / 2);
-- if (__cam2 > cam_max)
-- __cam2 = cam_max;
-+ if (__cam2 > cam_max_size)
-+ __cam2 = cam_max_size;
- ram -= __cam2;
- }
-
-@@ -232,6 +226,6 @@ adjust_total_lowmem(void)
- " CAM2=%ldMb residual: %ldMb\n",
- __cam0 >> 20, __cam1 >> 20, __cam2 >> 20,
- (total_lowmem - __cam0 - __cam1 - __cam2) >> 20);
-- __max_low_memory = max_low_mem = __cam0 + __cam1 + __cam2;
-- __initial_memory_limit = __max_low_memory;
-+ __max_low_memory = __cam0 + __cam1 + __cam2;
-+ __initial_memory_limit_addr = memstart_addr + __max_low_memory;
- }
---- a/arch/powerpc/mm/hash_utils_64.c
-+++ b/arch/powerpc/mm/hash_utils_64.c
-@@ -31,6 +31,7 @@
- #include <linux/cache.h>
- #include <linux/init.h>
- #include <linux/signal.h>
-+#include <linux/lmb.h>
-
- #include <asm/processor.h>
- #include <asm/pgtable.h>
-@@ -41,7 +42,7 @@
- #include <asm/system.h>
- #include <asm/uaccess.h>
- #include <asm/machdep.h>
--#include <asm/lmb.h>
-+#include <asm/prom.h>
- #include <asm/abs_addr.h>
- #include <asm/tlbflush.h>
- #include <asm/io.h>
-@@ -191,6 +192,29 @@ int htab_bolt_mapping(unsigned long vsta
- return ret < 0 ? ret : 0;
- }
-
-+#ifdef CONFIG_MEMORY_HOTPLUG
-+static int htab_remove_mapping(unsigned long vstart, unsigned long vend,
-+ int psize, int ssize)
-+{
-+ unsigned long vaddr;
-+ unsigned int step, shift;
-+
-+ shift = mmu_psize_defs[psize].shift;
-+ step = 1 << shift;
-+
-+ if (!ppc_md.hpte_removebolted) {
-+ printk(KERN_WARNING "Platform doesn't implement "
-+ "hpte_removebolted\n");
-+ return -EINVAL;
-+ }
-+
-+ for (vaddr = vstart; vaddr < vend; vaddr += step)
-+ ppc_md.hpte_removebolted(vaddr, psize, ssize);
-+
-+ return 0;
-+}
-+#endif /* CONFIG_MEMORY_HOTPLUG */
-+
- static int __init htab_dt_scan_seg_sizes(unsigned long node,
- const char *uname, int depth,
- void *data)
-@@ -434,6 +458,12 @@ void create_section_mapping(unsigned lon
- _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_COHERENT | PP_RWXX,
- mmu_linear_psize, mmu_kernel_ssize));
- }
-+
-+int remove_section_mapping(unsigned long start, unsigned long end)
-+{
-+ return htab_remove_mapping(start, end, mmu_linear_psize,
-+ mmu_kernel_ssize);
-+}
- #endif /* CONFIG_MEMORY_HOTPLUG */
-
- static inline void make_bl(unsigned int *insn_addr, void *func)
---- a/arch/powerpc/mm/init_32.c
-+++ b/arch/powerpc/mm/init_32.c
-@@ -30,6 +30,7 @@
- #include <linux/highmem.h>
- #include <linux/initrd.h>
- #include <linux/pagemap.h>
-+#include <linux/lmb.h>
-
- #include <asm/pgalloc.h>
- #include <asm/prom.h>
-@@ -41,7 +42,6 @@
- #include <asm/machdep.h>
- #include <asm/btext.h>
- #include <asm/tlb.h>
--#include <asm/lmb.h>
- #include <asm/sections.h>
-
- #include "mmu_decl.h"
-@@ -59,8 +59,8 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_ga
- unsigned long total_memory;
- unsigned long total_lowmem;
-
--unsigned long ppc_memstart;
--unsigned long ppc_memoffset = PAGE_OFFSET;
-+phys_addr_t memstart_addr;
-+phys_addr_t lowmem_end_addr;
-
- int boot_mapsize;
- #ifdef CONFIG_PPC_PMAC
-@@ -95,10 +95,10 @@ int __map_without_ltlbs;
- unsigned long __max_low_memory = MAX_LOW_MEM;
-
- /*
-- * limit of what is accessible with initial MMU setup -
-+ * address of the limit of what is accessible with initial MMU setup -
- * 256MB usually, but only 16MB on 601.
- */
--unsigned long __initial_memory_limit = 0x10000000;
-+phys_addr_t __initial_memory_limit_addr = (phys_addr_t)0x10000000;
-
- /*
- * Check for command-line options that affect what MMU_init will do.
-@@ -131,10 +131,10 @@ void __init MMU_init(void)
-
- /* 601 can only access 16MB at the moment */
- if (PVR_VER(mfspr(SPRN_PVR)) == 1)
-- __initial_memory_limit = 0x01000000;
-+ __initial_memory_limit_addr = 0x01000000;
- /* 8xx can only access 8MB at the moment */
- if (PVR_VER(mfspr(SPRN_PVR)) == 0x50)
-- __initial_memory_limit = 0x00800000;
-+ __initial_memory_limit_addr = 0x00800000;
-
- /* parse args from command line */
- MMU_setup();
-@@ -145,8 +145,8 @@ void __init MMU_init(void)
- printk(KERN_WARNING "Only using first contiguous memory region");
- }
-
-- total_memory = lmb_end_of_DRAM();
-- total_lowmem = total_memory;
-+ total_lowmem = total_memory = lmb_end_of_DRAM() - memstart_addr;
-+ lowmem_end_addr = memstart_addr + total_lowmem;
-
- #ifdef CONFIG_FSL_BOOKE
- /* Freescale Book-E parts expect lowmem to be mapped by fixed TLB
-@@ -157,9 +157,10 @@ void __init MMU_init(void)
-
- if (total_lowmem > __max_low_memory) {
- total_lowmem = __max_low_memory;
-+ lowmem_end_addr = memstart_addr + total_lowmem;
- #ifndef CONFIG_HIGHMEM
- total_memory = total_lowmem;
-- lmb_enforce_memory_limit(total_lowmem);
-+ lmb_enforce_memory_limit(lowmem_end_addr);
- lmb_analyze();
- #endif /* CONFIG_HIGHMEM */
- }
-@@ -184,8 +185,6 @@ void __init MMU_init(void)
- /* Map in I/O resources */
- if (ppc_md.progress)
- ppc_md.progress("MMU:setio", 0x302);
-- if (ppc_md.setup_io_mappings)
-- ppc_md.setup_io_mappings();
-
- /* Initialize the context management stuff */
- mmu_context_init();
-@@ -208,7 +207,7 @@ void __init *early_get_page(void)
- p = alloc_bootmem_pages(PAGE_SIZE);
- } else {
- p = __va(lmb_alloc_base(PAGE_SIZE, PAGE_SIZE,
-- __initial_memory_limit));
-+ __initial_memory_limit_addr));
- }
- return p;
- }
-@@ -276,7 +275,7 @@ static int __init setup_kcore(void)
-
- kcore_mem = kmalloc(sizeof(struct kcore_list), GFP_ATOMIC);
- if (!kcore_mem)
-- panic("%s: kmalloc failed\n", __FUNCTION__);
-+ panic("%s: kmalloc failed\n", __func__);
-
- /* must stay under 32 bits */
- if ( 0xfffffffful - (unsigned long)__va(base) < size) {
---- a/arch/powerpc/mm/init_64.c
-+++ b/arch/powerpc/mm/init_64.c
-@@ -38,11 +38,11 @@
- #include <linux/nodemask.h>
- #include <linux/module.h>
- #include <linux/poison.h>
-+#include <linux/lmb.h>
-
- #include <asm/pgalloc.h>
- #include <asm/page.h>
- #include <asm/prom.h>
--#include <asm/lmb.h>
- #include <asm/rtas.h>
- #include <asm/io.h>
- #include <asm/mmu_context.h>
-@@ -72,8 +72,7 @@
- #warning TASK_SIZE is smaller than it needs to be.
- #endif
-
--/* max amount of RAM to use */
--unsigned long __max_memory;
-+phys_addr_t memstart_addr;
-
- void free_initmem(void)
- {
-@@ -122,7 +121,7 @@ static int __init setup_kcore(void)
- /* GFP_ATOMIC to avoid might_sleep warnings during boot */
- kcore_mem = kmalloc(sizeof(struct kcore_list), GFP_ATOMIC);
- if (!kcore_mem)
-- panic("%s: kmalloc failed\n", __FUNCTION__);
-+ panic("%s: kmalloc failed\n", __func__);
-
- kclist_add(kcore_mem, __va(base), size);
- }
---- a/arch/powerpc/mm/lmb.c
-+++ /dev/null
-@@ -1,357 +0,0 @@
--/*
-- * Procedures for maintaining information about logical memory blocks.
-- *
-- * Peter Bergner, IBM Corp. June 2001.
-- * Copyright (C) 2001 Peter Bergner.
-- *
-- * 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/bitops.h>
--#include <asm/types.h>
--#include <asm/page.h>
--#include <asm/prom.h>
--#include <asm/lmb.h>
--#ifdef CONFIG_PPC32
--#include "mmu_decl.h" /* for __max_low_memory */
--#endif
--
--#undef DEBUG
--
--#ifdef DEBUG
--#include <asm/udbg.h>
--#define DBG(fmt...) udbg_printf(fmt)
--#else
--#define DBG(fmt...)
--#endif
--
--#define LMB_ALLOC_ANYWHERE 0
--
--struct lmb lmb;
--
--void lmb_dump_all(void)
--{
--#ifdef DEBUG
-- unsigned long i;
--
-- DBG("lmb_dump_all:\n");
-- DBG(" memory.cnt = 0x%lx\n", lmb.memory.cnt);
-- DBG(" memory.size = 0x%lx\n", lmb.memory.size);
-- for (i=0; i < lmb.memory.cnt ;i++) {
-- DBG(" memory.region[0x%x].base = 0x%lx\n",
-- i, lmb.memory.region[i].base);
-- DBG(" .size = 0x%lx\n",
-- lmb.memory.region[i].size);
-- }
--
-- DBG("\n reserved.cnt = 0x%lx\n", lmb.reserved.cnt);
-- DBG(" reserved.size = 0x%lx\n", lmb.reserved.size);
-- for (i=0; i < lmb.reserved.cnt ;i++) {
-- DBG(" reserved.region[0x%x].base = 0x%lx\n",
-- i, lmb.reserved.region[i].base);
-- DBG(" .size = 0x%lx\n",
-- lmb.reserved.region[i].size);
-- }
--#endif /* DEBUG */
--}
--
--static unsigned long __init lmb_addrs_overlap(unsigned long base1,
-- unsigned long size1, unsigned long base2, unsigned long size2)
--{
-- return ((base1 < (base2+size2)) && (base2 < (base1+size1)));
--}
--
--static long __init lmb_addrs_adjacent(unsigned long base1, unsigned long size1,
-- unsigned long base2, unsigned long size2)
--{
-- if (base2 == base1 + size1)
-- return 1;
-- else if (base1 == base2 + size2)
-- return -1;
--
-- return 0;
--}
--
--static long __init lmb_regions_adjacent(struct lmb_region *rgn,
-- unsigned long r1, unsigned long r2)
--{
-- unsigned long base1 = rgn->region[r1].base;
-- unsigned long size1 = rgn->region[r1].size;
-- unsigned long base2 = rgn->region[r2].base;
-- unsigned long size2 = rgn->region[r2].size;
--
-- return lmb_addrs_adjacent(base1, size1, base2, size2);
--}
--
--static void __init lmb_remove_region(struct lmb_region *rgn, unsigned long r)
--{
-- unsigned long i;
--
-- for (i = r; i < rgn->cnt - 1; i++) {
-- rgn->region[i].base = rgn->region[i + 1].base;
-- rgn->region[i].size = rgn->region[i + 1].size;
-- }
-- rgn->cnt--;
--}
--
--/* Assumption: base addr of region 1 < base addr of region 2 */
--static void __init lmb_coalesce_regions(struct lmb_region *rgn,
-- unsigned long r1, unsigned long r2)
--{
-- rgn->region[r1].size += rgn->region[r2].size;
-- lmb_remove_region(rgn, r2);
--}
--
--/* This routine called with relocation disabled. */
--void __init lmb_init(void)
--{
-- /* Create a dummy zero size LMB which will get coalesced away later.
-- * This simplifies the lmb_add() code below...
-- */
-- lmb.memory.region[0].base = 0;
-- lmb.memory.region[0].size = 0;
-- lmb.memory.cnt = 1;
--
-- /* Ditto. */
-- lmb.reserved.region[0].base = 0;
-- lmb.reserved.region[0].size = 0;
-- lmb.reserved.cnt = 1;
--}
--
--/* This routine may be called with relocation disabled. */
--void __init lmb_analyze(void)
--{
-- int i;
--
-- lmb.memory.size = 0;
--
-- for (i = 0; i < lmb.memory.cnt; i++)
-- lmb.memory.size += lmb.memory.region[i].size;
--}
--
--/* This routine called with relocation disabled. */
--static long __init lmb_add_region(struct lmb_region *rgn, unsigned long base,
-- unsigned long size)
--{
-- unsigned long coalesced = 0;
-- long adjacent, i;
--
-- /* First try and coalesce this LMB with another. */
-- for (i=0; i < rgn->cnt; i++) {
-- unsigned long rgnbase = rgn->region[i].base;
-- unsigned long rgnsize = rgn->region[i].size;
--
-- if ((rgnbase == base) && (rgnsize == size))
-- /* Already have this region, so we're done */
-- return 0;
--
-- adjacent = lmb_addrs_adjacent(base,size,rgnbase,rgnsize);
-- if ( adjacent > 0 ) {
-- rgn->region[i].base -= size;
-- rgn->region[i].size += size;
-- coalesced++;
-- break;
-- }
-- else if ( adjacent < 0 ) {
-- rgn->region[i].size += size;
-- coalesced++;
-- break;
-- }
-- }
--
-- if ((i < rgn->cnt-1) && lmb_regions_adjacent(rgn, i, i+1) ) {
-- lmb_coalesce_regions(rgn, i, i+1);
-- coalesced++;
-- }
--
-- if (coalesced)
-- return coalesced;
-- if (rgn->cnt >= MAX_LMB_REGIONS)
-- return -1;
--
-- /* Couldn't coalesce the LMB, so add it to the sorted table. */
-- for (i = rgn->cnt-1; i >= 0; i--) {
-- if (base < rgn->region[i].base) {
-- rgn->region[i+1].base = rgn->region[i].base;
-- rgn->region[i+1].size = rgn->region[i].size;
-- } else {
-- rgn->region[i+1].base = base;
-- rgn->region[i+1].size = size;
-- break;
-- }
-- }
-- rgn->cnt++;
--
-- return 0;
--}
--
--/* This routine may be called with relocation disabled. */
--long __init lmb_add(unsigned long base, unsigned long size)
--{
-- struct lmb_region *_rgn = &(lmb.memory);
--
-- /* On pSeries LPAR systems, the first LMB is our RMO region. */
-- if (base == 0)
-- lmb.rmo_size = size;
--
-- return lmb_add_region(_rgn, base, size);
--
--}
--
--long __init lmb_reserve(unsigned long base, unsigned long size)
--{
-- struct lmb_region *_rgn = &(lmb.reserved);
--
-- BUG_ON(0 == size);
--
-- return lmb_add_region(_rgn, base, size);
--}
--
--long __init lmb_overlaps_region(struct lmb_region *rgn, unsigned long base,
-- unsigned long size)
--{
-- unsigned long i;
--
-- for (i=0; i < rgn->cnt; i++) {
-- unsigned long rgnbase = rgn->region[i].base;
-- unsigned long rgnsize = rgn->region[i].size;
-- if ( lmb_addrs_overlap(base,size,rgnbase,rgnsize) ) {
-- break;
-- }
-- }
--
-- return (i < rgn->cnt) ? i : -1;
--}
--
--unsigned long __init lmb_alloc(unsigned long size, unsigned long align)
--{
-- return lmb_alloc_base(size, align, LMB_ALLOC_ANYWHERE);
--}
--
--unsigned long __init lmb_alloc_base(unsigned long size, unsigned long align,
-- unsigned long max_addr)
--{
-- unsigned long alloc;
--
-- alloc = __lmb_alloc_base(size, align, max_addr);
--
-- if (alloc == 0)
-- panic("ERROR: Failed to allocate 0x%lx bytes below 0x%lx.\n",
-- size, max_addr);
--
-- return alloc;
--}
--
--unsigned long __init __lmb_alloc_base(unsigned long size, unsigned long align,
-- unsigned long max_addr)
--{
-- long i, j;
-- unsigned long base = 0;
--
-- BUG_ON(0 == size);
--
--#ifdef CONFIG_PPC32
-- /* On 32-bit, make sure we allocate lowmem */
-- if (max_addr == LMB_ALLOC_ANYWHERE)
-- max_addr = __max_low_memory;
--#endif
-- for (i = lmb.memory.cnt-1; i >= 0; i--) {
-- unsigned long lmbbase = lmb.memory.region[i].base;
-- unsigned long lmbsize = lmb.memory.region[i].size;
--
-- if (max_addr == LMB_ALLOC_ANYWHERE)
-- base = _ALIGN_DOWN(lmbbase + lmbsize - size, align);
-- else if (lmbbase < max_addr) {
-- base = min(lmbbase + lmbsize, max_addr);
-- base = _ALIGN_DOWN(base - size, align);
-- } else
-- continue;
--
-- while ((lmbbase <= base) &&
-- ((j = lmb_overlaps_region(&lmb.reserved, base, size)) >= 0) )
-- base = _ALIGN_DOWN(lmb.reserved.region[j].base - size,
-- align);
--
-- if ((base != 0) && (lmbbase <= base))
-- break;
-- }
--
-- if (i < 0)
-- return 0;
--
-- lmb_add_region(&lmb.reserved, base, size);
--
-- return base;
--}
--
--/* You must call lmb_analyze() before this. */
--unsigned long __init lmb_phys_mem_size(void)
--{
-- return lmb.memory.size;
--}
--
--unsigned long __init lmb_end_of_DRAM(void)
--{
-- int idx = lmb.memory.cnt - 1;
--
-- return (lmb.memory.region[idx].base + lmb.memory.region[idx].size);
--}
--
--/* You must call lmb_analyze() after this. */
--void __init lmb_enforce_memory_limit(unsigned long memory_limit)
--{
-- unsigned long i, limit;
-- struct lmb_property *p;
--
-- if (! memory_limit)
-- return;
--
-- /* Truncate the lmb regions to satisfy the memory limit. */
-- limit = memory_limit;
-- for (i = 0; i < lmb.memory.cnt; i++) {
-- if (limit > lmb.memory.region[i].size) {
-- limit -= lmb.memory.region[i].size;
-- continue;
-- }
--
-- lmb.memory.region[i].size = limit;
-- lmb.memory.cnt = i + 1;
-- break;
-- }
--
-- if (lmb.memory.region[0].size < lmb.rmo_size)
-- lmb.rmo_size = lmb.memory.region[0].size;
--
-- /* And truncate any reserves above the limit also. */
-- for (i = 0; i < lmb.reserved.cnt; i++) {
-- p = &lmb.reserved.region[i];
--
-- if (p->base > memory_limit)
-- p->size = 0;
-- else if ((p->base + p->size) > memory_limit)
-- p->size = memory_limit - p->base;
--
-- if (p->size == 0) {
-- lmb_remove_region(&lmb.reserved, i);
-- i--;
-- }
-- }
--}
--
--int __init lmb_is_reserved(unsigned long addr)
--{
-- int i;
--
-- for (i = 0; i < lmb.reserved.cnt; i++) {
-- unsigned long upper = lmb.reserved.region[i].base +
-- lmb.reserved.region[i].size - 1;
-- if ((addr >= lmb.reserved.region[i].base) && (addr <= upper))
-- return 1;
-- }
-- return 0;
--}
---- a/arch/powerpc/mm/mem.c
-+++ b/arch/powerpc/mm/mem.c
-@@ -31,6 +31,7 @@
- #include <linux/initrd.h>
- #include <linux/pagemap.h>
- #include <linux/suspend.h>
-+#include <linux/lmb.h>
-
- #include <asm/pgalloc.h>
- #include <asm/prom.h>
-@@ -42,7 +43,6 @@
- #include <asm/machdep.h>
- #include <asm/btext.h>
- #include <asm/tlb.h>
--#include <asm/lmb.h>
- #include <asm/sections.h>
- #include <asm/vdso.h>
-
-@@ -111,7 +111,7 @@ int memory_add_physaddr_to_nid(u64 start
- }
- #endif
-
--int __devinit arch_add_memory(int nid, u64 start, u64 size)
-+int arch_add_memory(int nid, u64 start, u64 size)
- {
- struct pglist_data *pgdata;
- struct zone *zone;
-@@ -175,7 +175,6 @@ void show_mem(void)
-
- printk("Mem-info:\n");
- show_free_areas();
-- printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
- for_each_online_pgdat(pgdat) {
- unsigned long flags;
- pgdat_resize_lock(pgdat, &flags);
-@@ -217,9 +216,11 @@ void __init do_init_bootmem(void)
- unsigned long total_pages;
- int boot_mapsize;
-
-- max_pfn = total_pages = lmb_end_of_DRAM() >> PAGE_SHIFT;
-+ max_pfn = lmb_end_of_DRAM() >> PAGE_SHIFT;
-+ total_pages = (lmb_end_of_DRAM() - memstart_addr) >> PAGE_SHIFT;
- #ifdef CONFIG_HIGHMEM
- total_pages = total_lowmem >> PAGE_SHIFT;
-+ max_low_pfn = lowmem_end_addr >> PAGE_SHIFT;
- #endif
-
- /*
-@@ -245,18 +246,18 @@ void __init do_init_bootmem(void)
- * present.
- */
- #ifdef CONFIG_HIGHMEM
-- free_bootmem_with_active_regions(0, total_lowmem >> PAGE_SHIFT);
-+ free_bootmem_with_active_regions(0, lowmem_end_addr >> PAGE_SHIFT);
-
- /* reserve the sections we're already using */
- for (i = 0; i < lmb.reserved.cnt; i++) {
- unsigned long addr = lmb.reserved.region[i].base +
- lmb_size_bytes(&lmb.reserved, i) - 1;
-- if (addr < total_lowmem)
-+ if (addr < lowmem_end_addr)
- reserve_bootmem(lmb.reserved.region[i].base,
- lmb_size_bytes(&lmb.reserved, i),
- BOOTMEM_DEFAULT);
-- else if (lmb.reserved.region[i].base < total_lowmem) {
-- unsigned long adjusted_size = total_lowmem -
-+ else if (lmb.reserved.region[i].base < lowmem_end_addr) {
-+ unsigned long adjusted_size = lowmem_end_addr -
- lmb.reserved.region[i].base;
- reserve_bootmem(lmb.reserved.region[i].base,
- adjusted_size, BOOTMEM_DEFAULT);
-@@ -326,7 +327,7 @@ void __init paging_init(void)
- (top_of_ram - total_ram) >> 20);
- memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
- #ifdef CONFIG_HIGHMEM
-- max_zone_pfns[ZONE_DMA] = total_lowmem >> PAGE_SHIFT;
-+ max_zone_pfns[ZONE_DMA] = lowmem_end_addr >> PAGE_SHIFT;
- max_zone_pfns[ZONE_HIGHMEM] = top_of_ram >> PAGE_SHIFT;
- #else
- max_zone_pfns[ZONE_DMA] = top_of_ram >> PAGE_SHIFT;
-@@ -381,7 +382,7 @@ void __init mem_init(void)
- {
- unsigned long pfn, highmem_mapnr;
-
-- highmem_mapnr = total_lowmem >> PAGE_SHIFT;
-+ highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT;
- for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) {
- struct page *page = pfn_to_page(pfn);
- if (lmb_is_reserved(pfn << PAGE_SHIFT))
---- a/arch/powerpc/mm/mmu_decl.h
-+++ b/arch/powerpc/mm/mmu_decl.h
-@@ -48,9 +48,11 @@ extern unsigned int num_tlbcam_entries;
-
- extern unsigned long ioremap_bot;
- extern unsigned long __max_low_memory;
--extern unsigned long __initial_memory_limit;
-+extern phys_addr_t __initial_memory_limit_addr;
- extern unsigned long total_memory;
- extern unsigned long total_lowmem;
-+extern phys_addr_t memstart_addr;
-+extern phys_addr_t lowmem_end_addr;
-
- /* ...and now those things that may be slightly different between processor
- * architectures. -- Dan
---- a/arch/powerpc/mm/numa.c
-+++ b/arch/powerpc/mm/numa.c
-@@ -17,8 +17,9 @@
- #include <linux/nodemask.h>
- #include <linux/cpu.h>
- #include <linux/notifier.h>
-+#include <linux/lmb.h>
- #include <asm/sparsemem.h>
--#include <asm/lmb.h>
-+#include <asm/prom.h>
- #include <asm/system.h>
- #include <asm/smp.h>
-
---- a/arch/powerpc/mm/pgtable_32.c
-+++ b/arch/powerpc/mm/pgtable_32.c
-@@ -281,12 +281,13 @@ int map_page(unsigned long va, phys_addr
- */
- void __init mapin_ram(void)
- {
-- unsigned long v, p, s, f;
-+ unsigned long v, s, f;
-+ phys_addr_t p;
- int ktext;
-
- s = mmu_mapin_ram();
- v = KERNELBASE + s;
-- p = PPC_MEMSTART + s;
-+ p = memstart_addr + s;
- for (; s < total_lowmem; s += PAGE_SIZE) {
- ktext = ((char *) v >= _stext && (char *) v < etext);
- f = ktext ?_PAGE_RAM_TEXT : _PAGE_RAM;
---- a/arch/powerpc/mm/ppc_mmu_32.c
-+++ b/arch/powerpc/mm/ppc_mmu_32.c
-@@ -26,11 +26,11 @@
- #include <linux/mm.h>
- #include <linux/init.h>
- #include <linux/highmem.h>
-+#include <linux/lmb.h>
-
- #include <asm/prom.h>
- #include <asm/mmu.h>
- #include <asm/machdep.h>
--#include <asm/lmb.h>
-
- #include "mmu_decl.h"
-
-@@ -82,7 +82,6 @@ unsigned long __init mmu_mapin_ram(void)
- #else
- unsigned long tot, bl, done;
- unsigned long max_size = (256<<20);
-- unsigned long align;
-
- if (__map_without_bats) {
- printk(KERN_DEBUG "RAM mapped without BATs\n");
-@@ -93,19 +92,13 @@ unsigned long __init mmu_mapin_ram(void)
-
- /* Make sure we don't map a block larger than the
- smallest alignment of the physical address. */
-- /* alignment of PPC_MEMSTART */
-- align = ~(PPC_MEMSTART-1) & PPC_MEMSTART;
-- /* set BAT block size to MIN(max_size, align) */
-- if (align && align < max_size)
-- max_size = align;
--
- tot = total_lowmem;
- for (bl = 128<<10; bl < max_size; bl <<= 1) {
- if (bl * 2 > tot)
- break;
- }
-
-- setbat(2, KERNELBASE, PPC_MEMSTART, bl, _PAGE_RAM);
-+ setbat(2, KERNELBASE, 0, bl, _PAGE_RAM);
- done = (unsigned long)bat_addrs[2].limit - KERNELBASE + 1;
- if ((done < tot) && !bat_addrs[3].limit) {
- /* use BAT3 to cover a bit more */
-@@ -113,7 +106,7 @@ unsigned long __init mmu_mapin_ram(void)
- for (bl = 128<<10; bl < max_size; bl <<= 1)
- if (bl * 2 > tot)
- break;
-- setbat(3, KERNELBASE+done, PPC_MEMSTART+done, bl, _PAGE_RAM);
-+ setbat(3, KERNELBASE+done, done, bl, _PAGE_RAM);
- done = (unsigned long)bat_addrs[3].limit - KERNELBASE + 1;
- }
-
-@@ -240,7 +233,7 @@ void __init MMU_init_hw(void)
- */
- if ( ppc_md.progress ) ppc_md.progress("hash:find piece", 0x322);
- Hash = __va(lmb_alloc_base(Hash_size, Hash_size,
-- __initial_memory_limit));
-+ __initial_memory_limit_addr));
- cacheable_memzero(Hash, Hash_size);
- _SDR1 = __pa(Hash) | SDR1_LOW_BITS;
-
---- a/arch/powerpc/mm/stab.c
-+++ b/arch/powerpc/mm/stab.c
-@@ -12,12 +12,14 @@
- * 2 of the License, or (at your option) any later version.
- */
-
-+#include <linux/lmb.h>
-+
- #include <asm/pgtable.h>
- #include <asm/mmu.h>
- #include <asm/mmu_context.h>
- #include <asm/paca.h>
- #include <asm/cputable.h>
--#include <asm/lmb.h>
-+#include <asm/prom.h>
- #include <asm/abs_addr.h>
- #include <asm/firmware.h>
- #include <asm/iseries/hv_call.h>
---- a/arch/powerpc/oprofile/cell/spu_task_sync.c
-+++ b/arch/powerpc/oprofile/cell/spu_task_sync.c
-@@ -68,7 +68,7 @@ static struct cached_info *get_cached_in
- if (spu_num >= num_spu_nodes) {
- printk(KERN_ERR "SPU_PROF: "
- "%s, line %d: Invalid index %d into spu info cache\n",
-- __FUNCTION__, __LINE__, spu_num);
-+ __func__, __LINE__, spu_num);
- ret_info = NULL;
- goto out;
- }
-@@ -115,7 +115,7 @@ prepare_cached_spu_info(struct spu *spu,
- if (!info) {
- printk(KERN_ERR "SPU_PROF: "
- "%s, line %d: create vma_map failed\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- retval = -ENOMEM;
- goto err_alloc;
- }
-@@ -123,7 +123,7 @@ prepare_cached_spu_info(struct spu *spu,
- if (!new_map) {
- printk(KERN_ERR "SPU_PROF: "
- "%s, line %d: create vma_map failed\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- retval = -ENOMEM;
- goto err_alloc;
- }
-@@ -171,7 +171,7 @@ static int release_cached_info(int spu_i
- printk(KERN_ERR "SPU_PROF: "
- "%s, line %d: "
- "Invalid index %d into spu info cache\n",
-- __FUNCTION__, __LINE__, spu_index);
-+ __func__, __LINE__, spu_index);
- goto out;
- }
- end = spu_index + 1;
-@@ -273,7 +273,7 @@ fail_no_image_cookie:
-
- printk(KERN_ERR "SPU_PROF: "
- "%s, line %d: Cannot find dcookie for SPU binary\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- goto out;
- }
-
-@@ -467,7 +467,7 @@ int spu_sync_stop(void)
- if (ret) {
- printk(KERN_ERR "SPU_PROF: "
- "%s, line %d: spu_switch_event_unregister returned %d\n",
-- __FUNCTION__, __LINE__, ret);
-+ __func__, __LINE__, ret);
- goto out;
- }
-
---- a/arch/powerpc/oprofile/cell/vma_map.c
-+++ b/arch/powerpc/oprofile/cell/vma_map.c
-@@ -72,7 +72,7 @@ vma_map_add(struct vma_to_fileoffset_map
- kzalloc(sizeof(struct vma_to_fileoffset_map), GFP_KERNEL);
- if (!new) {
- printk(KERN_ERR "SPU_PROF: %s, line %d: malloc failed\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- vma_map_free(map);
- return NULL;
- }
-@@ -134,19 +134,19 @@ struct vma_to_fileoffset_map *create_vma
- if (memcmp(ehdr.e_ident, expected, EI_PAD) != 0) {
- printk(KERN_ERR "SPU_PROF: "
- "%s, line %d: Unexpected e_ident parsing SPU ELF\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- goto fail;
- }
- if (ehdr.e_machine != EM_SPU) {
- printk(KERN_ERR "SPU_PROF: "
- "%s, line %d: Unexpected e_machine parsing SPU ELF\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- goto fail;
- }
- if (ehdr.e_type != ET_EXEC) {
- printk(KERN_ERR "SPU_PROF: "
- "%s, line %d: Unexpected e_type parsing SPU ELF\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- goto fail;
- }
- phdr_start = spu_elf_start + ehdr.e_phoff;
-@@ -232,7 +232,7 @@ struct vma_to_fileoffset_map *create_vma
- if (overlay_tbl_offset < 0) {
- printk(KERN_ERR "SPU_PROF: "
- "%s, line %d: Error finding SPU overlay table\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- goto fail;
- }
- ovly_table = spu_elf_start + overlay_tbl_offset;
---- a/arch/powerpc/oprofile/op_model_cell.c
-+++ b/arch/powerpc/oprofile/op_model_cell.c
-@@ -216,7 +216,7 @@ static void pm_rtas_reset_signals(u32 no
- * failure to stop OProfile.
- */
- printk(KERN_WARNING "%s: rtas returned: %d\n",
-- __FUNCTION__, ret);
-+ __func__, ret);
- }
-
- static int pm_rtas_activate_signals(u32 node, u32 count)
-@@ -255,7 +255,7 @@ static int pm_rtas_activate_signals(u32
-
- if (unlikely(ret)) {
- printk(KERN_WARNING "%s: rtas returned: %d\n",
-- __FUNCTION__, ret);
-+ __func__, ret);
- return -EIO;
- }
- }
-@@ -560,7 +560,7 @@ static int cell_reg_setup(struct op_coun
- if (unlikely(spu_rtas_token == RTAS_UNKNOWN_SERVICE)) {
- printk(KERN_ERR
- "%s: rtas token ibm,cbe-spu-perftools unknown\n",
-- __FUNCTION__);
-+ __func__);
- return -EIO;
- }
- }
-@@ -576,7 +576,7 @@ static int cell_reg_setup(struct op_coun
- if (unlikely(pm_rtas_token == RTAS_UNKNOWN_SERVICE)) {
- printk(KERN_ERR
- "%s: rtas token ibm,cbe-perftools unknown\n",
-- __FUNCTION__);
-+ __func__);
- return -EIO;
- }
-
-@@ -853,7 +853,7 @@ static int pm_rtas_activate_spu_profilin
-
- if (unlikely(ret)) {
- printk(KERN_WARNING "%s: rtas returned: %d\n",
-- __FUNCTION__, ret);
-+ __func__, ret);
- return -EIO;
- }
-
-@@ -949,7 +949,7 @@ static int cell_global_start_spu(struct
- if (unlikely(ret != 0)) {
- printk(KERN_ERR
- "%s: rtas call ibm,cbe-spu-perftools failed, return = %d\n",
-- __FUNCTION__, ret);
-+ __func__, ret);
- rtas_error = -EIO;
- goto out;
- }
-@@ -1061,7 +1061,7 @@ static void cell_global_stop_spu(void)
- if (unlikely(rtn_value != 0)) {
- printk(KERN_ERR
- "%s: rtas call ibm,cbe-spu-perftools failed, return = %d\n",
-- __FUNCTION__, rtn_value);
-+ __func__, rtn_value);
- }
-
- /* Deactivate the signals */
---- a/arch/powerpc/platforms/40x/ep405.c
-+++ b/arch/powerpc/platforms/40x/ep405.c
-@@ -29,6 +29,7 @@
- #include <asm/time.h>
- #include <asm/uic.h>
- #include <asm/pci-bridge.h>
-+#include <asm/ppc4xx.h>
-
- static struct device_node *bcsr_node;
- static void __iomem *bcsr_regs;
-@@ -119,5 +120,6 @@ define_machine(ep405) {
- .progress = udbg_progress,
- .init_IRQ = uic_init_tree,
- .get_irq = uic_get_irq,
-+ .restart = ppc4xx_reset_system,
- .calibrate_decr = generic_calibrate_decr,
- };
---- a/arch/powerpc/platforms/40x/kilauea.c
-+++ b/arch/powerpc/platforms/40x/kilauea.c
-@@ -1,7 +1,7 @@
- /*
- * Kilauea board specific routines
- *
-- * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ * Copyright 2007-2008 DENX Software Engineering, Stefan Roese <sr@denx.de>
- *
- * Based on the Walnut code by
- * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-@@ -20,6 +20,7 @@
- #include <asm/time.h>
- #include <asm/uic.h>
- #include <asm/pci-bridge.h>
-+#include <asm/ppc4xx.h>
-
- static __initdata struct of_device_id kilauea_of_bus[] = {
- { .compatible = "ibm,plb4", },
-@@ -54,5 +55,6 @@ define_machine(kilauea) {
- .progress = udbg_progress,
- .init_IRQ = uic_init_tree,
- .get_irq = uic_get_irq,
-+ .restart = ppc4xx_reset_system,
- .calibrate_decr = generic_calibrate_decr,
- };
---- a/arch/powerpc/platforms/40x/makalu.c
-+++ b/arch/powerpc/platforms/40x/makalu.c
-@@ -20,6 +20,7 @@
- #include <asm/time.h>
- #include <asm/uic.h>
- #include <asm/pci-bridge.h>
-+#include <asm/ppc4xx.h>
-
- static __initdata struct of_device_id makalu_of_bus[] = {
- { .compatible = "ibm,plb4", },
-@@ -54,5 +55,6 @@ define_machine(makalu) {
- .progress = udbg_progress,
- .init_IRQ = uic_init_tree,
- .get_irq = uic_get_irq,
-+ .restart = ppc4xx_reset_system,
- .calibrate_decr = generic_calibrate_decr,
- };
---- a/arch/powerpc/platforms/40x/virtex.c
-+++ b/arch/powerpc/platforms/40x/virtex.c
-@@ -14,6 +14,7 @@
- #include <asm/prom.h>
- #include <asm/time.h>
- #include <asm/xilinx_intc.h>
-+#include <asm/ppc4xx.h>
-
- static struct of_device_id xilinx_of_bus_ids[] __initdata = {
- { .compatible = "xlnx,plb-v46-1.00.a", },
-@@ -48,5 +49,6 @@ define_machine(virtex) {
- .probe = virtex_probe,
- .init_IRQ = xilinx_intc_init_tree,
- .get_irq = xilinx_intc_get_irq,
-+ .restart = ppc4xx_reset_system,
- .calibrate_decr = generic_calibrate_decr,
- };
---- a/arch/powerpc/platforms/40x/walnut.c
-+++ b/arch/powerpc/platforms/40x/walnut.c
-@@ -26,6 +26,7 @@
- #include <asm/time.h>
- #include <asm/uic.h>
- #include <asm/pci-bridge.h>
-+#include <asm/ppc4xx.h>
-
- static __initdata struct of_device_id walnut_of_bus[] = {
- { .compatible = "ibm,plb3", },
-@@ -61,5 +62,6 @@ define_machine(walnut) {
- .progress = udbg_progress,
- .init_IRQ = uic_init_tree,
- .get_irq = uic_get_irq,
-- .calibrate_decr = generic_calibrate_decr,
-+ .restart = ppc4xx_reset_system,
-+ .calibrate_decr = generic_calibrate_decr,
- };
---- a/arch/powerpc/platforms/44x/44x.h
-+++ b/arch/powerpc/platforms/44x/44x.h
-@@ -3,6 +3,5 @@
-
- extern u8 as1_readb(volatile u8 __iomem *addr);
- extern void as1_writeb(u8 data, volatile u8 __iomem *addr);
--extern void ppc44x_reset_system(char *cmd);
-
- #endif /* __POWERPC_PLATFORMS_44X_44X_H */
---- a/arch/powerpc/platforms/44x/Kconfig
-+++ b/arch/powerpc/platforms/44x/Kconfig
-@@ -67,6 +67,25 @@ config WARP
- See http://www.pikatechnologies.com/ and follow the "PIKA for Computer
- Telephony Developers" link for more information.
-
-+config CANYONLANDS
-+ bool "Canyonlands"
-+ depends on 44x
-+ default n
-+ select 460EX
-+ select PCI
-+ select PPC4xx_PCI_EXPRESS
-+ help
-+ This option enables support for the AMCC PPC460EX evaluation board.
-+
-+config YOSEMITE
-+ bool "Yosemite"
-+ depends on 44x
-+ default n
-+ select 440EP
-+ select PCI
-+ help
-+ This option enables support for the AMCC PPC440EP evaluation board.
-+
- #config LUAN
- # bool "Luan"
- # depends on 44x
-@@ -122,6 +141,14 @@ config 440SPe
- bool
- select IBM_NEW_EMAC_EMAC4
-
-+config 460EX
-+ bool
-+ select PPC_FPU
-+ select IBM_NEW_EMAC_EMAC4
-+ select IBM_NEW_EMAC_RGMII
-+ select IBM_NEW_EMAC_ZMII
-+ select IBM_NEW_EMAC_TAH
-+
- # 44x errata/workaround config symbols, selected by the CPU models above
- config IBM440EP_ERR42
- bool
---- a/arch/powerpc/platforms/44x/Makefile
-+++ b/arch/powerpc/platforms/44x/Makefile
-@@ -1,9 +1,11 @@
--obj-$(CONFIG_44x) := misc_44x.o
-+obj-$(CONFIG_44x) := misc_44x.o idle.o
- obj-$(CONFIG_EBONY) += ebony.o
- obj-$(CONFIG_TAISHAN) += taishan.o
- obj-$(CONFIG_BAMBOO) += bamboo.o
-+obj-$(CONFIG_YOSEMITE) += bamboo.o
- obj-$(CONFIG_SEQUOIA) += sequoia.o
- obj-$(CONFIG_KATMAI) += katmai.o
- obj-$(CONFIG_RAINIER) += rainier.o
- obj-$(CONFIG_WARP) += warp.o
- obj-$(CONFIG_WARP) += warp-nand.o
-+obj-$(CONFIG_CANYONLANDS) += canyonlands.o
---- a/arch/powerpc/platforms/44x/bamboo.c
-+++ b/arch/powerpc/platforms/44x/bamboo.c
-@@ -22,8 +22,7 @@
- #include <asm/time.h>
- #include <asm/uic.h>
- #include <asm/pci-bridge.h>
--
--#include "44x.h"
-+#include <asm/ppc4xx.h>
-
- static __initdata struct of_device_id bamboo_of_bus[] = {
- { .compatible = "ibm,plb4", },
-@@ -53,11 +52,11 @@ static int __init bamboo_probe(void)
- }
-
- define_machine(bamboo) {
-- .name = "Bamboo",
-- .probe = bamboo_probe,
-- .progress = udbg_progress,
-- .init_IRQ = uic_init_tree,
-- .get_irq = uic_get_irq,
-- .restart = ppc44x_reset_system,
-+ .name = "Bamboo",
-+ .probe = bamboo_probe,
-+ .progress = udbg_progress,
-+ .init_IRQ = uic_init_tree,
-+ .get_irq = uic_get_irq,
-+ .restart = ppc4xx_reset_system,
- .calibrate_decr = generic_calibrate_decr,
- };
---- /dev/null
-+++ b/arch/powerpc/platforms/44x/canyonlands.c
-@@ -0,0 +1,63 @@
-+/*
-+ * Canyonlands board specific routines
-+ *
-+ * Copyright 2008 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * Based on the Katmai code by
-+ * Benjamin Herrenschmidt <benh@kernel.crashing.org>
-+ * Copyright 2007 IBM Corp.
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ * Copyright 2007 IBM 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 the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+#include <asm/ppc4xx.h>
-+
-+static __initdata struct of_device_id canyonlands_of_bus[] = {
-+ { .compatible = "ibm,plb4", },
-+ { .compatible = "ibm,opb", },
-+ { .compatible = "ibm,ebc", },
-+ {},
-+};
-+
-+static int __init canyonlands_device_probe(void)
-+{
-+ of_platform_bus_probe(NULL, canyonlands_of_bus, NULL);
-+
-+ return 0;
-+}
-+machine_device_initcall(canyonlands, canyonlands_device_probe);
-+
-+static int __init canyonlands_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+
-+ if (!of_flat_dt_is_compatible(root, "amcc,canyonlands"))
-+ return 0;
-+
-+ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-+ return 1;
-+}
-+
-+define_machine(canyonlands) {
-+ .name = "Canyonlands",
-+ .probe = canyonlands_probe,
-+ .progress = udbg_progress,
-+ .init_IRQ = uic_init_tree,
-+ .get_irq = uic_get_irq,
-+ .restart = ppc4xx_reset_system,
-+ .calibrate_decr = generic_calibrate_decr,
-+};
---- a/arch/powerpc/platforms/44x/ebony.c
-+++ b/arch/powerpc/platforms/44x/ebony.c
-@@ -26,8 +26,7 @@
- #include <asm/time.h>
- #include <asm/uic.h>
- #include <asm/pci-bridge.h>
--
--#include "44x.h"
-+#include <asm/ppc4xx.h>
-
- static __initdata struct of_device_id ebony_of_bus[] = {
- { .compatible = "ibm,plb4", },
-@@ -66,6 +65,6 @@ define_machine(ebony) {
- .progress = udbg_progress,
- .init_IRQ = uic_init_tree,
- .get_irq = uic_get_irq,
-- .restart = ppc44x_reset_system,
-+ .restart = ppc4xx_reset_system,
- .calibrate_decr = generic_calibrate_decr,
- };
---- /dev/null
-+++ b/arch/powerpc/platforms/44x/idle.c
-@@ -0,0 +1,67 @@
-+/*
-+ * Copyright 2008 IBM Corp.
-+ *
-+ * Based on arch/powerpc/platforms/pasemi/idle.c:
-+ * Copyright (C) 2006-2007 PA Semi, Inc
-+ *
-+ * Added by: Jerone Young <jyoung5@us.ibm.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.
-+ *
-+ * 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/of.h>
-+#include <linux/kernel.h>
-+#include <asm/machdep.h>
-+
-+static int mode_spin;
-+
-+static void ppc44x_idle(void)
-+{
-+ unsigned long msr_save;
-+
-+ msr_save = mfmsr();
-+ /* set wait state MSR */
-+ mtmsr(msr_save|MSR_WE|MSR_EE|MSR_CE|MSR_DE);
-+ isync();
-+ /* return to initial state */
-+ mtmsr(msr_save);
-+ isync();
-+}
-+
-+int __init ppc44x_idle_init(void)
-+{
-+ if (!mode_spin) {
-+ /* If we are not setting spin mode
-+ then we set to wait mode */
-+ ppc_md.power_save = &ppc44x_idle;
-+ }
-+
-+ return 0;
-+}
-+
-+arch_initcall(ppc44x_idle_init);
-+
-+static int __init idle_param(char *p)
-+{
-+
-+ if (!strcmp("spin", p)) {
-+ mode_spin = 1;
-+ ppc_md.power_save = NULL;
-+ }
-+
-+ return 0;
-+}
-+
-+early_param("idle", idle_param);
---- a/arch/powerpc/platforms/44x/katmai.c
-+++ b/arch/powerpc/platforms/44x/katmai.c
-@@ -22,8 +22,7 @@
- #include <asm/time.h>
- #include <asm/uic.h>
- #include <asm/pci-bridge.h>
--
--#include "44x.h"
-+#include <asm/ppc4xx.h>
-
- static __initdata struct of_device_id katmai_of_bus[] = {
- { .compatible = "ibm,plb4", },
-@@ -58,6 +57,6 @@ define_machine(katmai) {
- .progress = udbg_progress,
- .init_IRQ = uic_init_tree,
- .get_irq = uic_get_irq,
-- .restart = ppc44x_reset_system,
-+ .restart = ppc4xx_reset_system,
- .calibrate_decr = generic_calibrate_decr,
- };
---- a/arch/powerpc/platforms/44x/misc_44x.S
-+++ b/arch/powerpc/platforms/44x/misc_44x.S
-@@ -44,14 +44,3 @@ _GLOBAL(as1_writeb)
- sync
- isync
- blr
--
--/*
-- * void ppc44x_reset_system(char *cmd)
-- *
-- * At present, this routine just applies a system reset.
-- */
--_GLOBAL(ppc44x_reset_system)
-- mfspr r13,SPRN_DBCR0
-- oris r13,r13,DBCR0_RST_SYSTEM@h
-- mtspr SPRN_DBCR0,r13
-- b . /* Just in case the reset doesn't work */
---- a/arch/powerpc/platforms/44x/rainier.c
-+++ b/arch/powerpc/platforms/44x/rainier.c
-@@ -22,7 +22,7 @@
- #include <asm/time.h>
- #include <asm/uic.h>
- #include <asm/pci-bridge.h>
--#include "44x.h"
-+#include <asm/ppc4xx.h>
-
- static __initdata struct of_device_id rainier_of_bus[] = {
- { .compatible = "ibm,plb4", },
-@@ -57,6 +57,6 @@ define_machine(rainier) {
- .progress = udbg_progress,
- .init_IRQ = uic_init_tree,
- .get_irq = uic_get_irq,
-- .restart = ppc44x_reset_system,
-+ .restart = ppc4xx_reset_system,
- .calibrate_decr = generic_calibrate_decr,
- };
---- a/arch/powerpc/platforms/44x/sequoia.c
-+++ b/arch/powerpc/platforms/44x/sequoia.c
-@@ -23,7 +23,7 @@
- #include <asm/uic.h>
- #include <asm/pci-bridge.h>
-
--#include "44x.h"
-+#include <asm/ppc4xx.h>
-
- static __initdata struct of_device_id sequoia_of_bus[] = {
- { .compatible = "ibm,plb4", },
-@@ -58,6 +58,6 @@ define_machine(sequoia) {
- .progress = udbg_progress,
- .init_IRQ = uic_init_tree,
- .get_irq = uic_get_irq,
-- .restart = ppc44x_reset_system,
-+ .restart = ppc4xx_reset_system,
- .calibrate_decr = generic_calibrate_decr,
- };
---- a/arch/powerpc/platforms/44x/taishan.c
-+++ b/arch/powerpc/platforms/44x/taishan.c
-@@ -29,8 +29,7 @@
- #include <asm/time.h>
- #include <asm/uic.h>
- #include <asm/pci-bridge.h>
--
--#include "44x.h"
-+#include <asm/ppc4xx.h>
-
- static __initdata struct of_device_id taishan_of_bus[] = {
- { .compatible = "ibm,plb4", },
-@@ -68,6 +67,6 @@ define_machine(taishan) {
- .progress = udbg_progress,
- .init_IRQ = uic_init_tree,
- .get_irq = uic_get_irq,
-- .restart = ppc44x_reset_system,
-+ .restart = ppc4xx_reset_system,
- .calibrate_decr = generic_calibrate_decr,
- };
---- a/arch/powerpc/platforms/44x/warp-nand.c
-+++ b/arch/powerpc/platforms/44x/warp-nand.c
-@@ -11,6 +11,7 @@
- #include <linux/mtd/partitions.h>
- #include <linux/mtd/nand.h>
- #include <linux/mtd/ndfc.h>
-+#include <asm/machdep.h>
-
- #ifdef CONFIG_MTD_NAND_NDFC
-
-@@ -100,6 +101,6 @@ static int warp_setup_nand_flash(void)
-
- return 0;
- }
--device_initcall(warp_setup_nand_flash);
-+machine_device_initcall(warp, warp_setup_nand_flash);
-
- #endif
---- a/arch/powerpc/platforms/44x/warp.c
-+++ b/arch/powerpc/platforms/44x/warp.c
-@@ -18,9 +18,7 @@
- #include <asm/udbg.h>
- #include <asm/time.h>
- #include <asm/uic.h>
--
--#include "44x.h"
--
-+#include <asm/ppc4xx.h>
-
- static __initdata struct of_device_id warp_of_bus[] = {
- { .compatible = "ibm,plb4", },
-@@ -49,7 +47,7 @@ define_machine(warp) {
- .progress = udbg_progress,
- .init_IRQ = uic_init_tree,
- .get_irq = uic_get_irq,
-- .restart = ppc44x_reset_system,
-+ .restart = ppc4xx_reset_system,
- .calibrate_decr = generic_calibrate_decr,
- };
-
---- a/arch/powerpc/platforms/52xx/lite5200.c
-+++ b/arch/powerpc/platforms/52xx/lite5200.c
-@@ -63,7 +63,7 @@ lite5200_fix_clock_config(void)
- of_node_put(np);
- if (!cdm) {
- printk(KERN_ERR "%s() failed; expect abnormal behaviour\n",
-- __FUNCTION__);
-+ __func__);
- return;
- }
-
-@@ -98,7 +98,7 @@ lite5200_fix_port_config(void)
- of_node_put(np);
- if (!gpio) {
- printk(KERN_ERR "%s() failed. expect abnormal behavior\n",
-- __FUNCTION__);
-+ __func__);
- return;
- }
-
---- a/arch/powerpc/platforms/82xx/Kconfig
-+++ b/arch/powerpc/platforms/82xx/Kconfig
-@@ -11,7 +11,6 @@ config MPC8272_ADS
- select 8260
- select FSL_SOC
- select PQ2_ADS_PCI_PIC if PCI
-- select PPC_CPM_NEW_BINDING
- help
- This option enables support for the MPC8272 ADS board
-
-@@ -22,7 +21,6 @@ config PQ2FADS
- select 8260
- select FSL_SOC
- select PQ2_ADS_PCI_PIC if PCI
-- select PPC_CPM_NEW_BINDING
- help
- This option enables support for the PQ2FADS board
-
-@@ -31,7 +29,6 @@ config EP8248E
- select 8272
- select 8260
- select FSL_SOC
-- select PPC_CPM_NEW_BINDING
- select MDIO_BITBANG
- help
- This enables support for the Embedded Planet EP8248E board.
---- a/arch/powerpc/platforms/83xx/mpc837x_rdb.c
-+++ b/arch/powerpc/platforms/83xx/mpc837x_rdb.c
-@@ -46,6 +46,7 @@ static void __init mpc837x_rdb_setup_arc
- static struct of_device_id mpc837x_ids[] = {
- { .type = "soc", },
- { .compatible = "soc", },
-+ { .compatible = "simple-bus", },
- {},
- };
-
---- a/arch/powerpc/platforms/83xx/mpc83xx.h
-+++ b/arch/powerpc/platforms/83xx/mpc83xx.h
-@@ -16,6 +16,7 @@
- #define MPC83XX_SCCR_USB_DRCM_10 0x00200000
- #define MPC8315_SCCR_USB_MASK 0x00c00000
- #define MPC8315_SCCR_USB_DRCM_11 0x00c00000
-+#define MPC8315_SCCR_USB_DRCM_01 0x00400000
- #define MPC837X_SCCR_USB_DRCM_11 0x00c00000
-
- /* system i/o configuration register low */
-@@ -37,6 +38,7 @@
- /* USB Control Register */
- #define FSL_USB2_CONTROL_OFFS 0x500
- #define CONTROL_UTMI_PHY_EN 0x00000200
-+#define CONTROL_REFSEL_24MHZ 0x00000040
- #define CONTROL_REFSEL_48MHZ 0x00000080
- #define CONTROL_PHY_CLK_SEL_ULPI 0x00000400
- #define CONTROL_OTG_PORT 0x00000020
---- a/arch/powerpc/platforms/83xx/usb.c
-+++ b/arch/powerpc/platforms/83xx/usb.c
-@@ -129,7 +129,7 @@ int mpc831x_usb_cfg(void)
- if (immr_node && of_device_is_compatible(immr_node, "fsl,mpc8315-immr"))
- clrsetbits_be32(immap + MPC83XX_SCCR_OFFS,
- MPC8315_SCCR_USB_MASK,
-- MPC8315_SCCR_USB_DRCM_11);
-+ MPC8315_SCCR_USB_DRCM_01);
- else
- clrsetbits_be32(immap + MPC83XX_SCCR_OFFS,
- MPC83XX_SCCR_USB_MASK,
-@@ -164,9 +164,15 @@ int mpc831x_usb_cfg(void)
- /* Using on-chip PHY */
- if (prop && (!strcmp(prop, "utmi_wide") ||
- !strcmp(prop, "utmi"))) {
-- /* Set UTMI_PHY_EN, REFSEL to 48MHZ */
-+ u32 refsel;
-+
-+ if (of_device_is_compatible(immr_node, "fsl,mpc8315-immr"))
-+ refsel = CONTROL_REFSEL_24MHZ;
-+ else
-+ refsel = CONTROL_REFSEL_48MHZ;
-+ /* Set UTMI_PHY_EN and REFSEL */
- out_be32(usb_regs + FSL_USB2_CONTROL_OFFS,
-- CONTROL_UTMI_PHY_EN | CONTROL_REFSEL_48MHZ);
-+ CONTROL_UTMI_PHY_EN | refsel);
- /* Using external UPLI PHY */
- } else if (prop && !strcmp(prop, "ulpi")) {
- /* Set PHY_CLK_SEL to ULPI */
---- a/arch/powerpc/platforms/85xx/Kconfig
-+++ b/arch/powerpc/platforms/85xx/Kconfig
-@@ -19,7 +19,6 @@ config MPC8540_ADS
- config MPC8560_ADS
- bool "Freescale MPC8560 ADS"
- select DEFAULT_UIMAGE
-- select PPC_CPM_NEW_BINDING
- select CPM2
- help
- This option enables support for the MPC 8560 ADS board
-@@ -46,6 +45,12 @@ config MPC85xx_DS
- help
- This option enables support for the MPC85xx DS (MPC8544 DS) board
-
-+config KSI8560
-+ bool "Emerson KSI8560"
-+ select DEFAULT_UIMAGE
-+ help
-+ This option enables support for the Emerson KSI8560 board
-+
- config STX_GP3
- bool "Silicon Turnkey Express GP3"
- help
-@@ -53,14 +58,12 @@ config STX_GP3
- board.
- select CPM2
- select DEFAULT_UIMAGE
-- select PPC_CPM_NEW_BINDING
-
- config TQM8540
- bool "TQ Components TQM8540"
- help
- This option enables support for the TQ Components TQM8540 board.
- select DEFAULT_UIMAGE
-- select PPC_CPM_NEW_BINDING
- select TQM85xx
-
- config TQM8541
-@@ -68,7 +71,6 @@ config TQM8541
- help
- This option enables support for the TQ Components TQM8541 board.
- select DEFAULT_UIMAGE
-- select PPC_CPM_NEW_BINDING
- select TQM85xx
- select CPM2
-
-@@ -77,7 +79,6 @@ config TQM8555
- help
- This option enables support for the TQ Components TQM8555 board.
- select DEFAULT_UIMAGE
-- select PPC_CPM_NEW_BINDING
- select TQM85xx
- select CPM2
-
-@@ -86,7 +87,6 @@ config TQM8560
- help
- This option enables support for the TQ Components TQM8560 board.
- select DEFAULT_UIMAGE
-- select PPC_CPM_NEW_BINDING
- select TQM85xx
- select CPM2
-
-@@ -99,7 +99,6 @@ config SBC8548
- config SBC8560
- bool "Wind River SBC8560"
- select DEFAULT_UIMAGE
-- select PPC_CPM_NEW_BINDING if CPM2
- help
- This option enables support for the Wind River SBC8560 board
-
---- a/arch/powerpc/platforms/85xx/Makefile
-+++ b/arch/powerpc/platforms/85xx/Makefile
-@@ -10,3 +10,4 @@ obj-$(CONFIG_STX_GP3) += stx_gp3.o
- obj-$(CONFIG_TQM85xx) += tqm85xx.o
- obj-$(CONFIG_SBC8560) += sbc8560.o
- obj-$(CONFIG_SBC8548) += sbc8548.o
-+obj-$(CONFIG_KSI8560) += ksi8560.o
---- /dev/null
-+++ b/arch/powerpc/platforms/85xx/ksi8560.c
-@@ -0,0 +1,257 @@
-+/*
-+ * Board setup routines for the Emerson KSI8560
-+ *
-+ * Author: Alexandr Smirnov <asmirnov@ru.mvista.com>
-+ *
-+ * Based on mpc85xx_ads.c maintained by Kumar Gala
-+ *
-+ * 2008 (c) MontaVista, Software, Inc. This file is licensed under
-+ * the terms of the GNU General Public License version 2. This program
-+ * is licensed "as is" without any warranty of any kind, whether express
-+ * or implied.
-+ *
-+ */
-+
-+#include <linux/stddef.h>
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include <linux/kdev_t.h>
-+#include <linux/delay.h>
-+#include <linux/seq_file.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/system.h>
-+#include <asm/time.h>
-+#include <asm/machdep.h>
-+#include <asm/pci-bridge.h>
-+#include <asm/mpic.h>
-+#include <mm/mmu_decl.h>
-+#include <asm/udbg.h>
-+#include <asm/prom.h>
-+
-+#include <sysdev/fsl_soc.h>
-+#include <sysdev/fsl_pci.h>
-+
-+#include <asm/cpm2.h>
-+#include <sysdev/cpm2_pic.h>
-+
-+
-+#define KSI8560_CPLD_HVR 0x04 /* Hardware Version Register */
-+#define KSI8560_CPLD_PVR 0x08 /* PLD Version Register */
-+#define KSI8560_CPLD_RCR1 0x30 /* Reset Command Register 1 */
-+
-+#define KSI8560_CPLD_RCR1_CPUHR 0x80 /* CPU Hard Reset */
-+
-+static void __iomem *cpld_base = NULL;
-+
-+static void machine_restart(char *cmd)
-+{
-+ if (cpld_base)
-+ out_8(cpld_base + KSI8560_CPLD_RCR1, KSI8560_CPLD_RCR1_CPUHR);
-+ else
-+ printk(KERN_ERR "Can't find CPLD base, hang forever\n");
-+
-+ for (;;);
-+}
-+
-+static void cpm2_cascade(unsigned int irq, struct irq_desc *desc)
-+{
-+ int cascade_irq;
-+
-+ while ((cascade_irq = cpm2_get_irq()) >= 0)
-+ generic_handle_irq(cascade_irq);
-+
-+ desc->chip->eoi(irq);
-+}
-+
-+static void __init ksi8560_pic_init(void)
-+{
-+ struct mpic *mpic;
-+ struct resource r;
-+ struct device_node *np;
-+#ifdef CONFIG_CPM2
-+ int irq;
-+#endif
-+
-+ np = of_find_node_by_type(NULL, "open-pic");
-+
-+ if (np == NULL) {
-+ printk(KERN_ERR "Could not find open-pic node\n");
-+ return;
-+ }
-+
-+ if (of_address_to_resource(np, 0, &r)) {
-+ printk(KERN_ERR "Could not map mpic register space\n");
-+ of_node_put(np);
-+ return;
-+ }
-+
-+ mpic = mpic_alloc(np, r.start,
-+ MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
-+ 0, 256, " OpenPIC ");
-+ BUG_ON(mpic == NULL);
-+ of_node_put(np);
-+
-+ mpic_init(mpic);
-+
-+#ifdef CONFIG_CPM2
-+ /* Setup CPM2 PIC */
-+ np = of_find_compatible_node(NULL, NULL, "fsl,cpm2-pic");
-+ if (np == NULL) {
-+ printk(KERN_ERR "PIC init: can not find fsl,cpm2-pic node\n");
-+ return;
-+ }
-+ irq = irq_of_parse_and_map(np, 0);
-+
-+ cpm2_pic_init(np);
-+ of_node_put(np);
-+ set_irq_chained_handler(irq, cpm2_cascade);
-+
-+ setup_irq(0, NULL);
-+#endif
-+}
-+
-+#ifdef CONFIG_CPM2
-+/*
-+ * Setup I/O ports
-+ */
-+struct cpm_pin {
-+ int port, pin, flags;
-+};
-+
-+static struct cpm_pin __initdata ksi8560_pins[] = {
-+ /* SCC1 */
-+ {3, 29, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {3, 30, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {3, 31, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+
-+ /* SCC2 */
-+ {3, 26, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {3, 27, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {3, 28, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+
-+ /* FCC1 */
-+ {0, 14, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {0, 15, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {0, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {0, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {0, 18, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {0, 19, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {0, 20, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {0, 21, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {0, 26, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+ {0, 27, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+ {0, 28, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {0, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {0, 30, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+ {0, 31, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+ {2, 23, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, /* CLK9 */
-+ {2, 22, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, /* CLK10 */
-+
-+};
-+
-+static void __init init_ioports(void)
-+{
-+ int i;
-+
-+ for (i = 0; i < ARRAY_SIZE(ksi8560_pins); i++) {
-+ struct cpm_pin *pin = &ksi8560_pins[i];
-+ cpm2_set_pin(pin->port, pin->pin, pin->flags);
-+ }
-+
-+ cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_RX);
-+ cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_TX);
-+ cpm2_clk_setup(CPM_CLK_SCC2, CPM_BRG2, CPM_CLK_RX);
-+ cpm2_clk_setup(CPM_CLK_SCC2, CPM_BRG2, CPM_CLK_TX);
-+ cpm2_clk_setup(CPM_CLK_FCC1, CPM_CLK9, CPM_CLK_RX);
-+ cpm2_clk_setup(CPM_CLK_FCC1, CPM_CLK10, CPM_CLK_TX);
-+}
-+#endif
-+
-+/*
-+ * Setup the architecture
-+ */
-+static void __init ksi8560_setup_arch(void)
-+{
-+ struct device_node *cpld;
-+
-+ cpld = of_find_compatible_node(NULL, NULL, "emerson,KSI8560-cpld");
-+ if (cpld)
-+ cpld_base = of_iomap(cpld, 0);
-+ else
-+ printk(KERN_ERR "Can't find CPLD in device tree\n");
-+
-+ if (ppc_md.progress)
-+ ppc_md.progress("ksi8560_setup_arch()", 0);
-+
-+#ifdef CONFIG_CPM2
-+ cpm2_reset();
-+ init_ioports();
-+#endif
-+}
-+
-+static void ksi8560_show_cpuinfo(struct seq_file *m)
-+{
-+ uint pvid, svid, phid1;
-+ uint memsize = total_memory;
-+
-+ pvid = mfspr(SPRN_PVR);
-+ svid = mfspr(SPRN_SVR);
-+
-+ seq_printf(m, "Vendor\t\t: Emerson Network Power\n");
-+ seq_printf(m, "Board\t\t: KSI8560\n");
-+
-+ if (cpld_base) {
-+ seq_printf(m, "Hardware rev\t: %d\n",
-+ in_8(cpld_base + KSI8560_CPLD_HVR));
-+ seq_printf(m, "CPLD rev\t: %d\n",
-+ in_8(cpld_base + KSI8560_CPLD_PVR));
-+ } else
-+ seq_printf(m, "Unknown Hardware and CPLD revs\n");
-+
-+ seq_printf(m, "PVR\t\t: 0x%x\n", pvid);
-+ seq_printf(m, "SVR\t\t: 0x%x\n", svid);
-+
-+ /* Display cpu Pll setting */
-+ phid1 = mfspr(SPRN_HID1);
-+ seq_printf(m, "PLL setting\t: 0x%x\n", ((phid1 >> 24) & 0x3f));
-+
-+ /* Display the amount of memory */
-+ seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024));
-+}
-+
-+static struct of_device_id __initdata of_bus_ids[] = {
-+ { .type = "soc", },
-+ { .name = "cpm", },
-+ { .name = "localbus", },
-+ {},
-+};
-+
-+static int __init declare_of_platform_devices(void)
-+{
-+ of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+
-+ return 0;
-+}
-+machine_device_initcall(ksi8560, declare_of_platform_devices);
-+
-+/*
-+ * Called very early, device-tree isn't unflattened
-+ */
-+static int __init ksi8560_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+
-+ return of_flat_dt_is_compatible(root, "emerson,KSI8560");
-+}
-+
-+define_machine(ksi8560) {
-+ .name = "KSI8560",
-+ .probe = ksi8560_probe,
-+ .setup_arch = ksi8560_setup_arch,
-+ .init_IRQ = ksi8560_pic_init,
-+ .show_cpuinfo = ksi8560_show_cpuinfo,
-+ .get_irq = mpic_get_irq,
-+ .restart = machine_restart,
-+ .calibrate_decr = generic_calibrate_decr,
-+};
---- a/arch/powerpc/platforms/85xx/mpc85xx_ads.c
-+++ b/arch/powerpc/platforms/85xx/mpc85xx_ads.c
-@@ -165,7 +165,7 @@ static void __init init_ioports(void)
- int i;
-
- for (i = 0; i < ARRAY_SIZE(mpc8560_ads_pins); i++) {
-- struct cpm_pin *pin = &mpc8560_ads_pins[i];
-+ const struct cpm_pin *pin = &mpc8560_ads_pins[i];
- cpm2_set_pin(pin->port, pin->pin, pin->flags);
- }
-
---- a/arch/powerpc/platforms/85xx/mpc85xx_ds.c
-+++ b/arch/powerpc/platforms/85xx/mpc85xx_ds.c
-@@ -19,6 +19,7 @@
- #include <linux/delay.h>
- #include <linux/seq_file.h>
- #include <linux/interrupt.h>
-+#include <linux/of_platform.h>
-
- #include <asm/system.h>
- #include <asm/time.h>
-@@ -36,7 +37,7 @@
- #undef DEBUG
-
- #ifdef DEBUG
--#define DBG(fmt, args...) printk(KERN_ERR "%s: " fmt, __FUNCTION__, ## args)
-+#define DBG(fmt, args...) printk(KERN_ERR "%s: " fmt, __func__, ## args)
- #else
- #define DBG(fmt, args...)
- #endif
-@@ -183,6 +184,18 @@ static int __init mpc8544_ds_probe(void)
- }
- }
-
-+static struct of_device_id mpc85xxds_ids[] = {
-+ { .type = "soc", },
-+ { .compatible = "soc", },
-+ {},
-+};
-+
-+static int __init mpc85xxds_publish_devices(void)
-+{
-+ return of_platform_bus_probe(NULL, mpc85xxds_ids, NULL);
-+}
-+machine_device_initcall(mpc8544_ds, mpc85xxds_publish_devices);
-+
- /*
- * Called very early, device-tree isn't unflattened
- */
---- a/arch/powerpc/platforms/86xx/Kconfig
-+++ b/arch/powerpc/platforms/86xx/Kconfig
-@@ -11,6 +11,12 @@ config MPC8641_HPCN
- help
- This option enables support for the MPC8641 HPCN board.
-
-+config SBC8641D
-+ bool "Wind River SBC8641D"
-+ select DEFAULT_UIMAGE
-+ help
-+ This option enables support for the WRS SBC8641D board.
-+
- config MPC8610_HPCD
- bool "Freescale MPC8610 HPCD"
- select DEFAULT_UIMAGE
-@@ -24,7 +30,7 @@ config MPC8641
- select FSL_PCI if PCI
- select PPC_UDBG_16550
- select MPIC
-- default y if MPC8641_HPCN
-+ default y if MPC8641_HPCN || SBC8641D
-
- config MPC8610
- bool
---- a/arch/powerpc/platforms/86xx/Makefile
-+++ b/arch/powerpc/platforms/86xx/Makefile
-@@ -4,4 +4,5 @@
-
- obj-$(CONFIG_SMP) += mpc86xx_smp.o
- obj-$(CONFIG_MPC8641_HPCN) += mpc86xx_hpcn.o
-+obj-$(CONFIG_SBC8641D) += sbc8641d.o
- obj-$(CONFIG_MPC8610_HPCD) += mpc8610_hpcd.o
---- a/arch/powerpc/platforms/86xx/mpc8610_hpcd.c
-+++ b/arch/powerpc/platforms/86xx/mpc8610_hpcd.c
-@@ -52,7 +52,7 @@ static int __init mpc8610_declare_of_pla
- }
- machine_device_initcall(mpc86xx_hpcd, mpc8610_declare_of_platform_devices);
-
--void __init
-+static void __init
- mpc86xx_hpcd_init_irq(void)
- {
- struct mpic *mpic1;
-@@ -200,7 +200,7 @@ static int __init mpc86xx_hpcd_probe(voi
- return 0;
- }
-
--long __init
-+static long __init
- mpc86xx_time_init(void)
- {
- unsigned int temp;
---- a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c
-+++ b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c
-@@ -55,7 +55,7 @@ static void mpc86xx_8259_cascade(unsigne
- }
- #endif /* CONFIG_PCI */
-
--void __init
-+static void __init
- mpc86xx_hpcn_init_irq(void)
- {
- struct mpic *mpic1;
-@@ -162,7 +162,7 @@ mpc86xx_hpcn_setup_arch(void)
- }
-
-
--void
-+static void
- mpc86xx_hpcn_show_cpuinfo(struct seq_file *m)
- {
- struct device_node *root;
-@@ -190,13 +190,19 @@ static int __init mpc86xx_hpcn_probe(voi
- {
- unsigned long root = of_get_flat_dt_root();
-
-- if (of_flat_dt_is_compatible(root, "mpc86xx"))
-+ if (of_flat_dt_is_compatible(root, "fsl,mpc8641hpcn"))
- return 1; /* Looks good */
-
-+ /* Be nice and don't give silent boot death. Delete this in 2.6.27 */
-+ if (of_flat_dt_is_compatible(root, "mpc86xx")) {
-+ pr_warning("WARNING: your dts/dtb is old. You must update before the next kernel release\n");
-+ return 1;
-+ }
-+
- return 0;
- }
-
--long __init
-+static long __init
- mpc86xx_time_init(void)
- {
- unsigned int temp;
---- /dev/null
-+++ b/arch/powerpc/platforms/86xx/sbc8641d.c
-@@ -0,0 +1,164 @@
-+/*
-+ * SBC8641D board specific routines
-+ *
-+ * Copyright 2008 Wind River Systems Inc.
-+ *
-+ * By Paul Gortmaker (see MAINTAINERS for contact information)
-+ *
-+ * Based largely on the 8641 HPCN support by Freescale Semiconductor 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.
-+ */
-+
-+#include <linux/stddef.h>
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include <linux/kdev_t.h>
-+#include <linux/delay.h>
-+#include <linux/seq_file.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/system.h>
-+#include <asm/time.h>
-+#include <asm/machdep.h>
-+#include <asm/pci-bridge.h>
-+#include <asm/mpc86xx.h>
-+#include <asm/prom.h>
-+#include <mm/mmu_decl.h>
-+#include <asm/udbg.h>
-+
-+#include <asm/mpic.h>
-+
-+#include <sysdev/fsl_pci.h>
-+#include <sysdev/fsl_soc.h>
-+
-+#include "mpc86xx.h"
-+
-+static void __init
-+sbc8641_init_irq(void)
-+{
-+ struct mpic *mpic1;
-+ struct device_node *np;
-+ struct resource res;
-+
-+ /* Determine PIC address. */
-+ np = of_find_node_by_type(NULL, "open-pic");
-+ if (np == NULL)
-+ return;
-+ of_address_to_resource(np, 0, &res);
-+
-+ /* Alloc mpic structure and per isu has 16 INT entries. */
-+ mpic1 = mpic_alloc(np, res.start,
-+ MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
-+ 0, 256, " MPIC ");
-+ of_node_put(np);
-+ BUG_ON(mpic1 == NULL);
-+
-+ mpic_init(mpic1);
-+}
-+
-+static void __init
-+sbc8641_setup_arch(void)
-+{
-+#ifdef CONFIG_PCI
-+ struct device_node *np;
-+#endif
-+
-+ if (ppc_md.progress)
-+ ppc_md.progress("sbc8641_setup_arch()", 0);
-+
-+#ifdef CONFIG_PCI
-+ for_each_compatible_node(np, "pci", "fsl,mpc8641-pcie")
-+ fsl_add_bridge(np, 0);
-+#endif
-+
-+ printk("SBC8641 board from Wind River\n");
-+
-+#ifdef CONFIG_SMP
-+ mpc86xx_smp_init();
-+#endif
-+}
-+
-+
-+static void
-+sbc8641_show_cpuinfo(struct seq_file *m)
-+{
-+ struct device_node *root;
-+ uint memsize = total_memory;
-+ const char *model = "";
-+ uint svid = mfspr(SPRN_SVR);
-+
-+ seq_printf(m, "Vendor\t\t: Wind River Systems\n");
-+
-+ root = of_find_node_by_path("/");
-+ if (root)
-+ model = of_get_property(root, "model", NULL);
-+ seq_printf(m, "Machine\t\t: %s\n", model);
-+ of_node_put(root);
-+
-+ seq_printf(m, "SVR\t\t: 0x%x\n", svid);
-+ seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024));
-+}
-+
-+
-+/*
-+ * Called very early, device-tree isn't unflattened
-+ */
-+static int __init sbc8641_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+
-+ if (of_flat_dt_is_compatible(root, "wind,sbc8641"))
-+ return 1; /* Looks good */
-+
-+ return 0;
-+}
-+
-+static long __init
-+mpc86xx_time_init(void)
-+{
-+ unsigned int temp;
-+
-+ /* Set the time base to zero */
-+ mtspr(SPRN_TBWL, 0);
-+ mtspr(SPRN_TBWU, 0);
-+
-+ temp = mfspr(SPRN_HID0);
-+ temp |= HID0_TBEN;
-+ mtspr(SPRN_HID0, temp);
-+ asm volatile("isync");
-+
-+ return 0;
-+}
-+
-+static __initdata struct of_device_id of_bus_ids[] = {
-+ { .compatible = "simple-bus", },
-+ {},
-+};
-+
-+static int __init declare_of_platform_devices(void)
-+{
-+ of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+
-+ return 0;
-+}
-+machine_device_initcall(sbc8641, declare_of_platform_devices);
-+
-+define_machine(sbc8641) {
-+ .name = "SBC8641D",
-+ .probe = sbc8641_probe,
-+ .setup_arch = sbc8641_setup_arch,
-+ .init_IRQ = sbc8641_init_irq,
-+ .show_cpuinfo = sbc8641_show_cpuinfo,
-+ .get_irq = mpic_get_irq,
-+ .restart = fsl_rstcr_restart,
-+ .time_init = mpc86xx_time_init,
-+ .calibrate_decr = generic_calibrate_decr,
-+ .progress = udbg_progress,
-+#ifdef CONFIG_PCI
-+ .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
-+#endif
-+};
---- a/arch/powerpc/platforms/8xx/Kconfig
-+++ b/arch/powerpc/platforms/8xx/Kconfig
-@@ -18,7 +18,6 @@ config MPC8XXFADS
- config MPC86XADS
- bool "MPC86XADS"
- select CPM1
-- select PPC_CPM_NEW_BINDING
- help
- MPC86x Application Development System by Freescale Semiconductor.
- The MPC86xADS is meant to serve as a platform for s/w and h/w
-@@ -27,7 +26,6 @@ config MPC86XADS
- config MPC885ADS
- bool "MPC885ADS"
- select CPM1
-- select PPC_CPM_NEW_BINDING
- help
- Freescale Semiconductor MPC885 Application Development System (ADS).
- Also known as DUET.
-@@ -37,7 +35,6 @@ config MPC885ADS
- config PPC_EP88XC
- bool "Embedded Planet EP88xC (a.k.a. CWH-PPC-885XN-VE)"
- select CPM1
-- select PPC_CPM_NEW_BINDING
- help
- This enables support for the Embedded Planet EP88xC board.
-
-@@ -47,7 +44,6 @@ config PPC_EP88XC
- config PPC_ADDER875
- bool "Analogue & Micro Adder 875"
- select CPM1
-- select PPC_CPM_NEW_BINDING
- select REDBOOT
- help
- This enables support for the Analogue & Micro Adder 875
---- a/arch/powerpc/platforms/8xx/m8xx_setup.c
-+++ b/arch/powerpc/platforms/8xx/m8xx_setup.c
-@@ -111,17 +111,12 @@ void __init mpc8xx_calibrate_decr(void)
-
- /* Processor frequency is MHz.
- */
-- ppc_tb_freq = 50000000;
-- if (!get_freq("bus-frequency", &ppc_tb_freq)) {
-- printk(KERN_ERR "WARNING: Estimating decrementer frequency "
-- "(not found)\n");
-- }
-- ppc_tb_freq /= 16;
- ppc_proc_freq = 50000000;
- if (!get_freq("clock-frequency", &ppc_proc_freq))
- printk(KERN_ERR "WARNING: Estimating processor frequency "
- "(not found)\n");
-
-+ ppc_tb_freq = ppc_proc_freq / 16;
- printk("Decrementer Frequency = 0x%lx\n", ppc_tb_freq);
-
- /* Perform some more timer/timebase initialization. This used
---- a/arch/powerpc/platforms/Kconfig
-+++ b/arch/powerpc/platforms/Kconfig
-@@ -290,13 +290,7 @@ config CPM2
- config PPC_CPM_NEW_BINDING
- bool
- depends on CPM1 || CPM2
-- help
-- Select this if your board has been converted to use the new
-- device tree bindings for CPM, and no longer needs the
-- ioport callbacks or the platform device glue code.
--
-- The fs_enet and cpm_uart drivers will be built as
-- of_platform devices.
-+ default y
-
- config AXON_RAM
- tristate "Axon DDR2 memory device driver"
---- a/arch/powerpc/platforms/Kconfig.cputype
-+++ b/arch/powerpc/platforms/Kconfig.cputype
-@@ -41,11 +41,13 @@ config 40x
- bool "AMCC 40x"
- select PPC_DCR_NATIVE
- select PPC_UDBG_16550
-+ select 4xx_SOC
-
- config 44x
- bool "AMCC 44x"
- select PPC_DCR_NATIVE
- select PPC_UDBG_16550
-+ select 4xx_SOC
-
- config E200
- bool "Freescale e200"
---- a/arch/powerpc/platforms/cell/iommu.c
-+++ b/arch/powerpc/platforms/cell/iommu.c
-@@ -28,13 +28,13 @@
- #include <linux/notifier.h>
- #include <linux/of.h>
- #include <linux/of_platform.h>
-+#include <linux/lmb.h>
-
- #include <asm/prom.h>
- #include <asm/iommu.h>
- #include <asm/machdep.h>
- #include <asm/pci-bridge.h>
- #include <asm/udbg.h>
--#include <asm/lmb.h>
- #include <asm/firmware.h>
- #include <asm/cell-regs.h>
-
-@@ -316,7 +316,7 @@ static void cell_iommu_setup_stab(struct
- segments = max(dbase + dsize, fbase + fsize) >> IO_SEGMENT_SHIFT;
-
- pr_debug("%s: iommu[%d]: segments: %lu\n",
-- __FUNCTION__, iommu->nid, segments);
-+ __func__, iommu->nid, segments);
-
- /* set up the segment table */
- stab_size = segments * sizeof(unsigned long);
-@@ -343,7 +343,7 @@ static unsigned long *cell_iommu_alloc_p
- (1 << 12) / sizeof(unsigned long));
-
- ptab_size = segments * pages_per_segment * sizeof(unsigned long);
-- pr_debug("%s: iommu[%d]: ptab_size: %lu, order: %d\n", __FUNCTION__,
-+ pr_debug("%s: iommu[%d]: ptab_size: %lu, order: %d\n", __func__,
- iommu->nid, ptab_size, get_order(ptab_size));
- page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(ptab_size));
- BUG_ON(!page);
-@@ -355,7 +355,7 @@ static unsigned long *cell_iommu_alloc_p
- n_pte_pages = (pages_per_segment * sizeof(unsigned long)) >> 12;
-
- pr_debug("%s: iommu[%d]: stab at %p, ptab at %p, n_pte_pages: %lu\n",
-- __FUNCTION__, iommu->nid, iommu->stab, ptab,
-+ __func__, iommu->nid, iommu->stab, ptab,
- n_pte_pages);
-
- /* initialise the STEs */
-@@ -394,7 +394,7 @@ static void cell_iommu_enable_hardware(s
-
- if (cell_iommu_find_ioc(iommu->nid, &xlate_base))
- panic("%s: missing IOC register mappings for node %d\n",
-- __FUNCTION__, iommu->nid);
-+ __func__, iommu->nid);
-
- iommu->xlate_regs = ioremap(xlate_base, IOC_Reg_Size);
- iommu->cmd_regs = iommu->xlate_regs + IOC_IOCmd_Offset;
---- a/arch/powerpc/platforms/cell/pervasive.c
-+++ b/arch/powerpc/platforms/cell/pervasive.c
-@@ -65,7 +65,7 @@ static void cbe_power_save(void)
- break;
- default:
- printk(KERN_WARNING "%s: unknown configuration\n",
-- __FUNCTION__);
-+ __func__);
- break;
- }
- mtspr(SPRN_TSC_CELL, thread_switch_control);
---- a/arch/powerpc/platforms/cell/ras.c
-+++ b/arch/powerpc/platforms/cell/ras.c
-@@ -132,7 +132,7 @@ static int __init cbe_ptcal_enable_on_no
- (unsigned int)(addr >> 32),
- (unsigned int)(addr & 0xffffffff))) {
- printk(KERN_ERR "%s: error enabling PTCAL on node %d!\n",
-- __FUNCTION__, nid);
-+ __func__, nid);
- goto out_free_pages;
- }
-
-@@ -162,7 +162,7 @@ static int __init cbe_ptcal_enable(void)
- if (!size)
- return -ENODEV;
-
-- pr_debug("%s: enabling PTCAL, size = 0x%x\n", __FUNCTION__, *size);
-+ pr_debug("%s: enabling PTCAL, size = 0x%x\n", __func__, *size);
- order = get_order(*size);
- of_node_put(np);
-
-@@ -180,7 +180,7 @@ static int __init cbe_ptcal_enable(void)
- const u32 *nid = of_get_property(np, "node-id", NULL);
- if (!nid) {
- printk(KERN_ERR "%s: node %s is missing node-id?\n",
-- __FUNCTION__, np->full_name);
-+ __func__, np->full_name);
- continue;
- }
- cbe_ptcal_enable_on_node(*nid, order);
-@@ -195,13 +195,13 @@ static int cbe_ptcal_disable(void)
- struct ptcal_area *area, *tmp;
- int ret = 0;
-
-- pr_debug("%s: disabling PTCAL\n", __FUNCTION__);
-+ pr_debug("%s: disabling PTCAL\n", __func__);
-
- list_for_each_entry_safe(area, tmp, &ptcal_list, list) {
- /* disable ptcal on this node */
- if (rtas_call(ptcal_stop_tok, 1, 1, NULL, area->nid)) {
- printk(KERN_ERR "%s: error disabling PTCAL "
-- "on node %d!\n", __FUNCTION__,
-+ "on node %d!\n", __func__,
- area->nid);
- ret = -EIO;
- continue;
---- a/arch/powerpc/platforms/cell/spu_base.c
-+++ b/arch/powerpc/platforms/cell/spu_base.c
-@@ -165,7 +165,7 @@ static int __spu_trap_data_seg(struct sp
- struct spu_slb slb;
- int psize;
-
-- pr_debug("%s\n", __FUNCTION__);
-+ pr_debug("%s\n", __func__);
-
- slb.esid = (ea & ESID_MASK) | SLB_ESID_V;
-
-@@ -215,7 +215,7 @@ static int __spu_trap_data_seg(struct sp
- extern int hash_page(unsigned long ea, unsigned long access, unsigned long trap); //XXX
- static int __spu_trap_data_map(struct spu *spu, unsigned long ea, u64 dsisr)
- {
-- pr_debug("%s, %lx, %lx\n", __FUNCTION__, dsisr, ea);
-+ pr_debug("%s, %lx, %lx\n", __func__, dsisr, ea);
-
- /* Handle kernel space hash faults immediately.
- User hash faults need to be deferred to process context. */
-@@ -351,7 +351,7 @@ spu_irq_class_1(int irq, void *data)
- __spu_trap_data_seg(spu, dar);
-
- spin_unlock(&spu->register_lock);
-- pr_debug("%s: %lx %lx %lx %lx\n", __FUNCTION__, mask, stat,
-+ pr_debug("%s: %lx %lx %lx %lx\n", __func__, mask, stat,
- dar, dsisr);
-
- if (stat & CLASS1_STORAGE_FAULT_INTR)
-@@ -726,7 +726,7 @@ static int __init init_spu_base(void)
-
- if (ret < 0) {
- printk(KERN_WARNING "%s: Error initializing spus\n",
-- __FUNCTION__);
-+ __func__);
- goto out_unregister_sysdev_class;
- }
-
---- a/arch/powerpc/platforms/cell/spu_callbacks.c
-+++ b/arch/powerpc/platforms/cell/spu_callbacks.c
-@@ -54,7 +54,7 @@ long spu_sys_callback(struct spu_syscall
- long (*syscall)(u64 a1, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6);
-
- if (s->nr_ret >= ARRAY_SIZE(spu_syscall_table)) {
-- pr_debug("%s: invalid syscall #%ld", __FUNCTION__, s->nr_ret);
-+ pr_debug("%s: invalid syscall #%ld", __func__, s->nr_ret);
- return -ENOSYS;
- }
-
---- a/arch/powerpc/platforms/cell/spu_manage.c
-+++ b/arch/powerpc/platforms/cell/spu_manage.c
-@@ -92,7 +92,7 @@ static int __init spu_map_interrupts_old
-
- tmp = of_get_property(np->parent->parent, "node-id", NULL);
- if (!tmp) {
-- printk(KERN_WARNING "%s: can't find node-id\n", __FUNCTION__);
-+ printk(KERN_WARNING "%s: can't find node-id\n", __func__);
- nid = spu->node;
- } else
- nid = tmp[0];
-@@ -296,7 +296,7 @@ static int __init of_enumerate_spus(int
- ret = fn(node);
- if (ret) {
- printk(KERN_WARNING "%s: Error initializing %s\n",
-- __FUNCTION__, node->name);
-+ __func__, node->name);
- break;
- }
- n++;
-@@ -327,7 +327,7 @@ static int __init of_create_spu(struct s
- if (!legacy_map) {
- legacy_map = 1;
- printk(KERN_WARNING "%s: Legacy device tree found, "
-- "trying to map old style\n", __FUNCTION__);
-+ "trying to map old style\n", __func__);
- }
- ret = spu_map_device_old(spu);
- if (ret) {
-@@ -342,7 +342,7 @@ static int __init of_create_spu(struct s
- if (!legacy_irq) {
- legacy_irq = 1;
- printk(KERN_WARNING "%s: Legacy device tree found, "
-- "trying old style irq\n", __FUNCTION__);
-+ "trying old style irq\n", __func__);
- }
- ret = spu_map_interrupts_old(spu, spe);
- if (ret) {
---- a/arch/powerpc/platforms/cell/spufs/coredump.c
-+++ b/arch/powerpc/platforms/cell/spufs/coredump.c
-@@ -133,8 +133,6 @@ static struct spu_context *coredump_next
- if (ctx->flags & SPU_CREATE_NOSCHED)
- continue;
-
-- /* start searching the next fd next time we're called */
-- (*fd)++;
- break;
- }
-
-@@ -157,6 +155,9 @@ int spufs_coredump_extra_notes_size(void
- break;
-
- size += rc;
-+
-+ /* start searching the next fd next time */
-+ fd++;
- }
-
- return size;
-@@ -239,6 +240,9 @@ int spufs_coredump_extra_notes_write(str
- }
-
- spu_release_saved(ctx);
-+
-+ /* start searching the next fd next time */
-+ fd++;
- }
-
- return 0;
---- a/arch/powerpc/platforms/cell/spufs/file.c
-+++ b/arch/powerpc/platforms/cell/spufs/file.c
-@@ -1337,7 +1337,7 @@ static u64 spufs_signal1_type_get(struct
- return ctx->ops->signal1_type_get(ctx);
- }
- DEFINE_SPUFS_ATTRIBUTE(spufs_signal1_type, spufs_signal1_type_get,
-- spufs_signal1_type_set, "%llu", SPU_ATTR_ACQUIRE);
-+ spufs_signal1_type_set, "%llu\n", SPU_ATTR_ACQUIRE);
-
-
- static int spufs_signal2_type_set(void *data, u64 val)
-@@ -1359,7 +1359,7 @@ static u64 spufs_signal2_type_get(struct
- return ctx->ops->signal2_type_get(ctx);
- }
- DEFINE_SPUFS_ATTRIBUTE(spufs_signal2_type, spufs_signal2_type_get,
-- spufs_signal2_type_set, "%llu", SPU_ATTR_ACQUIRE);
-+ spufs_signal2_type_set, "%llu\n", SPU_ATTR_ACQUIRE);
-
- #if SPUFS_MMAP_4K
- static unsigned long spufs_mss_mmap_nopfn(struct vm_area_struct *vma,
-@@ -1556,7 +1556,7 @@ void spufs_mfc_callback(struct spu *spu)
-
- wake_up_all(&ctx->mfc_wq);
-
-- pr_debug("%s %s\n", __FUNCTION__, spu->name);
-+ pr_debug("%s %s\n", __func__, spu->name);
- if (ctx->mfc_fasync) {
- u32 free_elements, tagstatus;
- unsigned int mask;
-@@ -1790,7 +1790,7 @@ static unsigned int spufs_mfc_poll(struc
- if (tagstatus & ctx->tagwait)
- mask |= POLLIN | POLLRDNORM;
-
-- pr_debug("%s: free %d tagstatus %d tagwait %d\n", __FUNCTION__,
-+ pr_debug("%s: free %d tagstatus %d tagwait %d\n", __func__,
- free_elements, tagstatus, ctx->tagwait);
-
- return mask;
---- a/arch/powerpc/platforms/cell/spufs/run.c
-+++ b/arch/powerpc/platforms/cell/spufs/run.c
-@@ -98,7 +98,7 @@ static int spu_setup_isolated(struct spu
- != MFC_CNTL_PURGE_DMA_COMPLETE) {
- if (time_after(jiffies, timeout)) {
- printk(KERN_ERR "%s: timeout flushing MFC DMA queue\n",
-- __FUNCTION__);
-+ __func__);
- ret = -EIO;
- goto out;
- }
-@@ -124,7 +124,7 @@ static int spu_setup_isolated(struct spu
- status_loading) {
- if (time_after(jiffies, timeout)) {
- printk(KERN_ERR "%s: timeout waiting for loader\n",
-- __FUNCTION__);
-+ __func__);
- ret = -EIO;
- goto out_drop_priv;
- }
-@@ -134,7 +134,7 @@ static int spu_setup_isolated(struct spu
- if (!(status & SPU_STATUS_RUNNING)) {
- /* If isolated LOAD has failed: run SPU, we will get a stop-and
- * signal later. */
-- pr_debug("%s: isolated LOAD failed\n", __FUNCTION__);
-+ pr_debug("%s: isolated LOAD failed\n", __func__);
- ctx->ops->runcntl_write(ctx, SPU_RUNCNTL_RUNNABLE);
- ret = -EACCES;
- goto out_drop_priv;
-@@ -142,7 +142,7 @@ static int spu_setup_isolated(struct spu
-
- if (!(status & SPU_STATUS_ISOLATED_STATE)) {
- /* This isn't allowed by the CBEA, but check anyway */
-- pr_debug("%s: SPU fell out of isolated mode?\n", __FUNCTION__);
-+ pr_debug("%s: SPU fell out of isolated mode?\n", __func__);
- ctx->ops->runcntl_write(ctx, SPU_RUNCNTL_STOP);
- ret = -EINVAL;
- goto out_drop_priv;
-@@ -282,7 +282,7 @@ static int spu_handle_restartsys(struct
- break;
- default:
- printk(KERN_WARNING "%s: unexpected return code %ld\n",
-- __FUNCTION__, *spu_ret);
-+ __func__, *spu_ret);
- ret = 0;
- }
- return ret;
-@@ -323,6 +323,10 @@ static int spu_process_callback(struct s
- return -EINTR;
- }
-
-+ /* need to re-get the ls, as it may have changed when we released the
-+ * spu */
-+ ls = (void __iomem *)ctx->ops->get_ls(ctx);
-+
- /* write result, jump over indirect pointer */
- memcpy_toio(ls + ls_pointer, &spu_ret, sizeof(spu_ret));
- ctx->ops->npc_write(ctx, npc);
---- a/arch/powerpc/platforms/cell/spufs/switch.c
-+++ b/arch/powerpc/platforms/cell/spufs/switch.c
-@@ -1815,6 +1815,7 @@ static void save_csa(struct spu_state *p
- save_mfc_csr_ato(prev, spu); /* Step 24. */
- save_mfc_tclass_id(prev, spu); /* Step 25. */
- set_mfc_tclass_id(prev, spu); /* Step 26. */
-+ save_mfc_cmd(prev, spu); /* Step 26a - moved from 44. */
- purge_mfc_queue(prev, spu); /* Step 27. */
- wait_purge_complete(prev, spu); /* Step 28. */
- setup_mfc_sr1(prev, spu); /* Step 30. */
-@@ -1831,7 +1832,6 @@ static void save_csa(struct spu_state *p
- save_ppuint_mb(prev, spu); /* Step 41. */
- save_ch_part1(prev, spu); /* Step 42. */
- save_spu_mb(prev, spu); /* Step 43. */
-- save_mfc_cmd(prev, spu); /* Step 44. */
- reset_ch(prev, spu); /* Step 45. */
- }
-
---- a/arch/powerpc/platforms/celleb/beat.c
-+++ b/arch/powerpc/platforms/celleb/beat.c
-@@ -48,6 +48,7 @@ void beat_power_off(void)
- }
-
- u64 beat_halt_code = 0x1000000000000000UL;
-+EXPORT_SYMBOL(beat_halt_code);
-
- void beat_halt(void)
- {
-@@ -94,9 +95,8 @@ ssize_t beat_nvram_read(char *buf, size_
- len = count;
- if (len > BEAT_NVRW_CNT)
- len = BEAT_NVRW_CNT;
-- if (beat_eeprom_read(i, len, p)) {
-+ if (beat_eeprom_read(i, len, p))
- return -EIO;
-- }
-
- p += len;
- i += len;
-@@ -121,9 +121,8 @@ ssize_t beat_nvram_write(char *buf, size
- len = count;
- if (len > BEAT_NVRW_CNT)
- len = BEAT_NVRW_CNT;
-- if (beat_eeprom_write(i, len, p)) {
-+ if (beat_eeprom_write(i, len, p))
- return -EIO;
-- }
-
- p += len;
- i += len;
-@@ -149,13 +148,14 @@ int64_t beat_get_term_char(u64 vterm, u6
- u64 db[2];
- s64 ret;
-
-- ret = beat_get_characters_from_console(vterm, len, (u8*)db);
-+ ret = beat_get_characters_from_console(vterm, len, (u8 *)db);
- if (ret == 0) {
- *t1 = db[0];
- *t2 = db[1];
- }
- return ret;
- }
-+EXPORT_SYMBOL(beat_get_term_char);
-
- int64_t beat_put_term_char(u64 vterm, u64 len, u64 t1, u64 t2)
- {
-@@ -163,8 +163,9 @@ int64_t beat_put_term_char(u64 vterm, u6
-
- db[0] = t1;
- db[1] = t2;
-- return beat_put_characters_to_console(vterm, len, (u8*)db);
-+ return beat_put_characters_to_console(vterm, len, (u8 *)db);
- }
-+EXPORT_SYMBOL(beat_put_term_char);
-
- void beat_power_save(void)
- {
-@@ -261,7 +262,3 @@ static int __init beat_event_init(void)
- }
-
- device_initcall(beat_event_init);
--
--EXPORT_SYMBOL(beat_get_term_char);
--EXPORT_SYMBOL(beat_put_term_char);
--EXPORT_SYMBOL(beat_halt_code);
---- a/arch/powerpc/platforms/celleb/beat.h
-+++ b/arch/powerpc/platforms/celleb/beat.h
-@@ -21,8 +21,8 @@
- #ifndef _CELLEB_BEAT_H
- #define _CELLEB_BEAT_H
-
--int64_t beat_get_term_char(uint64_t,uint64_t*,uint64_t*,uint64_t*);
--int64_t beat_put_term_char(uint64_t,uint64_t,uint64_t,uint64_t);
-+int64_t beat_get_term_char(uint64_t, uint64_t *, uint64_t *, uint64_t *);
-+int64_t beat_put_term_char(uint64_t, uint64_t, uint64_t, uint64_t);
- int64_t beat_repository_encode(int, const char *, uint64_t[4]);
- void beat_restart(char *);
- void beat_power_off(void);
---- a/arch/powerpc/platforms/celleb/beat_wrapper.h
-+++ b/arch/powerpc/platforms/celleb/beat_wrapper.h
-@@ -197,7 +197,8 @@ static inline s64 beat_put_characters_to
- u64 b[2];
-
- memcpy(b, buffer, len);
-- return beat_hcall_norets(HV_put_characters_to_console, termno, len, b[0], b[1]);
-+ return beat_hcall_norets(HV_put_characters_to_console, termno, len,
-+ b[0], b[1]);
- }
-
- static inline s64 beat_get_spe_privileged_state_1_registers(
---- a/arch/powerpc/platforms/celleb/htab.c
-+++ b/arch/powerpc/platforms/celleb/htab.c
-@@ -35,9 +35,9 @@
- #include "beat_wrapper.h"
-
- #ifdef DEBUG_LOW
--#define DBG_LOW(fmt...) do { udbg_printf(fmt); } while(0)
-+#define DBG_LOW(fmt...) do { udbg_printf(fmt); } while (0)
- #else
--#define DBG_LOW(fmt...) do { } while(0)
-+#define DBG_LOW(fmt...) do { } while (0)
- #endif
-
- static DEFINE_SPINLOCK(beat_htab_lock);
-@@ -116,7 +116,8 @@ static long beat_lpar_hpte_insert(unsign
- hpte_r &= ~_PAGE_COHERENT;
-
- spin_lock(&beat_htab_lock);
-- if ((lpar_rc = beat_read_mask(hpte_group)) == 0) {
-+ lpar_rc = beat_read_mask(hpte_group);
-+ if (lpar_rc == 0) {
- if (!(vflags & HPTE_V_BOLTED))
- DBG_LOW(" full\n");
- spin_unlock(&beat_htab_lock);
---- a/arch/powerpc/platforms/celleb/interrupt.c
-+++ b/arch/powerpc/platforms/celleb/interrupt.c
-@@ -34,7 +34,7 @@ static DEFINE_SPINLOCK(beatic_irq_mask_l
- static uint64_t beatic_irq_mask_enable[(MAX_IRQS+255)/64];
- static uint64_t beatic_irq_mask_ack[(MAX_IRQS+255)/64];
-
--static struct irq_host *beatic_host = NULL;
-+static struct irq_host *beatic_host;
-
- /*
- * In this implementation, "virq" == "IRQ plug number",
-@@ -49,13 +49,13 @@ static inline void beatic_update_irq_mas
-
- off = (irq_plug / 256) * 4;
- masks[0] = beatic_irq_mask_enable[off + 0]
-- & beatic_irq_mask_ack[off + 0];
-+ & beatic_irq_mask_ack[off + 0];
- masks[1] = beatic_irq_mask_enable[off + 1]
-- & beatic_irq_mask_ack[off + 1];
-+ & beatic_irq_mask_ack[off + 1];
- masks[2] = beatic_irq_mask_enable[off + 2]
-- & beatic_irq_mask_ack[off + 2];
-+ & beatic_irq_mask_ack[off + 2];
- masks[3] = beatic_irq_mask_enable[off + 3]
-- & beatic_irq_mask_ack[off + 3];
-+ & beatic_irq_mask_ack[off + 3];
- if (beat_set_interrupt_mask(irq_plug&~255UL,
- masks[0], masks[1], masks[2], masks[3]) != 0)
- panic("Failed to set mask IRQ!");
-@@ -96,7 +96,8 @@ static void beatic_end_irq(unsigned int
- s64 err;
- unsigned long flags;
-
-- if ((err = beat_downcount_of_interrupt(irq_plug)) != 0) {
-+ err = beat_downcount_of_interrupt(irq_plug);
-+ if (err != 0) {
- if ((err & 0xFFFFFFFF) != 0xFFFFFFF5) /* -11: wrong state */
- panic("Failed to downcount IRQ! Error = %16lx", err);
-
-@@ -138,7 +139,8 @@ static int beatic_pic_host_map(struct ir
- struct irq_desc *desc = get_irq_desc(virq);
- int64_t err;
-
-- if ((err = beat_construct_and_connect_irq_plug(virq, hw)) < 0)
-+ err = beat_construct_and_connect_irq_plug(virq, hw);
-+ if (err < 0)
- return -EIO;
-
- desc->status |= IRQ_LEVEL;
-@@ -202,22 +204,22 @@ static inline unsigned int beatic_get_ir
- beat_detect_pending_interrupts(i, pending);
- __asm__ ("cntlzd %0,%1":"=r"(ub):
- "r"(pending[0] & beatic_irq_mask_enable[i/64+0]
-- & beatic_irq_mask_ack[i/64+0]));
-+ & beatic_irq_mask_ack[i/64+0]));
- if (ub != 64)
- return i + ub + 0;
- __asm__ ("cntlzd %0,%1":"=r"(ub):
- "r"(pending[1] & beatic_irq_mask_enable[i/64+1]
-- & beatic_irq_mask_ack[i/64+1]));
-+ & beatic_irq_mask_ack[i/64+1]));
- if (ub != 64)
- return i + ub + 64;
- __asm__ ("cntlzd %0,%1":"=r"(ub):
- "r"(pending[2] & beatic_irq_mask_enable[i/64+2]
-- & beatic_irq_mask_ack[i/64+2]));
-+ & beatic_irq_mask_ack[i/64+2]));
- if (ub != 64)
- return i + ub + 128;
- __asm__ ("cntlzd %0,%1":"=r"(ub):
- "r"(pending[3] & beatic_irq_mask_enable[i/64+3]
-- & beatic_irq_mask_ack[i/64+3]));
-+ & beatic_irq_mask_ack[i/64+3]));
- if (ub != 64)
- return i + ub + 192;
- }
-@@ -250,7 +252,7 @@ void __init beatic_init_IRQ(void)
-
- /* Allocate an irq host */
- beatic_host = irq_alloc_host(NULL, IRQ_HOST_MAP_NOMAP, 0,
-- &beatic_pic_host_ops,
-+ &beatic_pic_host_ops,
- 0);
- BUG_ON(beatic_host == NULL);
- irq_set_default_host(beatic_host);
---- a/arch/powerpc/platforms/celleb/scc_epci.c
-+++ b/arch/powerpc/platforms/celleb/scc_epci.c
-@@ -161,9 +161,9 @@ static PCI_IO_ADDR celleb_epci_make_conf
- if (bus != hose->bus)
- addr = celleb_epci_get_epci_cfg(hose) +
- (((bus->number & 0xff) << 16)
-- | ((devfn & 0xff) << 8)
-- | (where & 0xff)
-- | 0x01000000);
-+ | ((devfn & 0xff) << 8)
-+ | (where & 0xff)
-+ | 0x01000000);
- else
- addr = celleb_epci_get_epci_cfg(hose) +
- (((devfn & 0xff) << 8) | (where & 0xff));
-@@ -174,7 +174,7 @@ static PCI_IO_ADDR celleb_epci_make_conf
- }
-
- static int celleb_epci_read_config(struct pci_bus *bus,
-- unsigned int devfn, int where, int size, u32 * val)
-+ unsigned int devfn, int where, int size, u32 *val)
- {
- PCI_IO_ADDR epci_base;
- PCI_IO_ADDR addr;
---- a/arch/powerpc/platforms/celleb/scc_sio.c
-+++ b/arch/powerpc/platforms/celleb/scc_sio.c
-@@ -28,7 +28,7 @@
-
- /* sio irq0=0xb00010022 irq0=0xb00010023 irq2=0xb00010024
- mmio=0xfff000-0x1000,0xff2000-0x1000 */
--static int txx9_serial_bitmap __initdata = 0;
-+static int txx9_serial_bitmap __initdata;
-
- static struct {
- uint32_t offset;
-@@ -84,7 +84,7 @@ static int __init txx9_serial_config(cha
- int i;
-
- for (;;) {
-- switch(get_option(&ptr, &i)) {
-+ switch (get_option(&ptr, &i)) {
- default:
- return 0;
- case 2:
---- a/arch/powerpc/platforms/celleb/spu_priv1.c
-+++ b/arch/powerpc/platforms/celleb/spu_priv1.c
-@@ -183,8 +183,7 @@ static u64 resource_allocation_enable_ge
- return enable;
- }
-
--const struct spu_priv1_ops spu_priv1_beat_ops =
--{
-+const struct spu_priv1_ops spu_priv1_beat_ops = {
- .int_mask_and = int_mask_and,
- .int_mask_or = int_mask_or,
- .int_mask_set = int_mask_set,
---- a/arch/powerpc/platforms/celleb/udbg_beat.c
-+++ b/arch/powerpc/platforms/celleb/udbg_beat.c
-@@ -54,7 +54,8 @@ static int udbg_getc_poll_beat(void)
- if (inbuflen == 0) {
- /* get some more chars. */
- inbuflen = 0;
-- rc = beat_get_term_char(celleb_vtermno, &inbuflen, inbuf+0, inbuf+1);
-+ rc = beat_get_term_char(celleb_vtermno, &inbuflen,
-+ inbuf+0, inbuf+1);
- if (rc != 0)
- inbuflen = 0; /* otherwise inbuflen is garbage */
- }
-@@ -78,7 +79,7 @@ static int udbg_getc_beat(void)
- if (ch == -1) {
- /* This shouldn't be needed...but... */
- volatile unsigned long delay;
-- for (delay=0; delay < 2000000; delay++)
-+ for (delay = 0; delay < 2000000; delay++)
- ;
- } else {
- return ch;
---- a/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
-+++ b/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
-@@ -117,11 +117,11 @@ static void __init mpc7448_hpc2_init_IRQ
- }
-
- if (mpic_paddr == 0) {
-- printk("%s: No tsi108 PIC found !\n", __FUNCTION__);
-+ printk("%s: No tsi108 PIC found !\n", __func__);
- return;
- }
-
-- DBG("%s: tsi108 pic phys_addr = 0x%x\n", __FUNCTION__,
-+ DBG("%s: tsi108 pic phys_addr = 0x%x\n", __func__,
- (u32) mpic_paddr);
-
- mpic = mpic_alloc(tsi_pic, mpic_paddr,
-@@ -140,17 +140,17 @@ static void __init mpc7448_hpc2_init_IRQ
- #ifdef CONFIG_PCI
- tsi_pci = of_find_node_by_type(NULL, "pci");
- if (tsi_pci == NULL) {
-- printk("%s: No tsi108 pci node found !\n", __FUNCTION__);
-+ printk("%s: No tsi108 pci node found !\n", __func__);
- return;
- }
- cascade_node = of_find_node_by_type(NULL, "pic-router");
- if (cascade_node == NULL) {
-- printk("%s: No tsi108 pci cascade node found !\n", __FUNCTION__);
-+ printk("%s: No tsi108 pci cascade node found !\n", __func__);
- return;
- }
-
- cascade_pci_irq = irq_of_parse_and_map(tsi_pci, 0);
-- DBG("%s: tsi108 cascade_pci_irq = 0x%x\n", __FUNCTION__,
-+ DBG("%s: tsi108 cascade_pci_irq = 0x%x\n", __func__,
- (u32) cascade_pci_irq);
- tsi108_pci_int_init(cascade_node);
- set_irq_data(cascade_pci_irq, mpic);
---- a/arch/powerpc/platforms/embedded6xx/prpmc2800.c
-+++ b/arch/powerpc/platforms/embedded6xx/prpmc2800.c
-@@ -49,13 +49,13 @@ static void __init prpmc2800_setup_arch(
- * ioremap mpp and gpp registers in case they are later
- * needed by prpmc2800_reset_board().
- */
-- np = of_find_compatible_node(NULL, NULL, "marvell,mv64x60-mpp");
-+ np = of_find_compatible_node(NULL, NULL, "marvell,mv64360-mpp");
- reg = of_get_property(np, "reg", NULL);
- paddr = of_translate_address(np, reg);
- of_node_put(np);
- mv64x60_mpp_reg_base = ioremap(paddr, reg[1]);
-
-- np = of_find_compatible_node(NULL, NULL, "marvell,mv64x60-gpp");
-+ np = of_find_compatible_node(NULL, NULL, "marvell,mv64360-gpp");
- reg = of_get_property(np, "reg", NULL);
- paddr = of_translate_address(np, reg);
- of_node_put(np);
---- a/arch/powerpc/platforms/iseries/exception.S
-+++ b/arch/powerpc/platforms/iseries/exception.S
-@@ -38,11 +38,19 @@
-
- .globl system_reset_iSeries
- system_reset_iSeries:
-- mfspr r13,SPRN_SPRG3 /* Get paca address */
-+ mfspr r13,SPRN_SPRG3 /* Get alpaca address */
-+ LOAD_REG_IMMEDIATE(r23, alpaca)
-+ li r0,ALPACA_SIZE
-+ sub r23,r13,r23
-+ divdu r23,r23,r0 /* r23 has cpu number */
-+ LOAD_REG_IMMEDIATE(r13, paca)
-+ mulli r0,r23,PACA_SIZE
-+ add r13,r13,r0
-+ mtspr SPRN_SPRG3,r13 /* Save it away for the future */
- mfmsr r24
- ori r24,r24,MSR_RI
- mtmsrd r24 /* RI on */
-- lhz r24,PACAPACAINDEX(r13) /* Get processor # */
-+ mr r24,r23
- cmpwi 0,r24,0 /* Are we processor 0? */
- bne 1f
- b .__start_initialization_iSeries /* Start up the first processor */
---- a/arch/powerpc/platforms/iseries/ipl_parms.h
-+++ b/arch/powerpc/platforms/iseries/ipl_parms.h
-@@ -65,6 +65,4 @@ struct ItIplParmsReal {
- u64 xRsvd13; // Reserved x38-x3F
- };
-
--extern struct ItIplParmsReal xItIplParmsReal;
--
- #endif /* _ISERIES_IPL_PARMS_H */
---- a/arch/powerpc/platforms/iseries/lpardata.c
-+++ b/arch/powerpc/platforms/iseries/lpardata.c
-@@ -14,10 +14,10 @@
- #include <asm/ptrace.h>
- #include <asm/abs_addr.h>
- #include <asm/lppaca.h>
--#include <asm/iseries/it_lp_reg_save.h>
- #include <asm/paca.h>
- #include <asm/iseries/lpar_map.h>
- #include <asm/iseries/it_lp_queue.h>
-+#include <asm/iseries/alpaca.h>
-
- #include "naca.h"
- #include "vpd_areas.h"
-@@ -31,7 +31,7 @@
- /* The HvReleaseData is the root of the information shared between
- * the hypervisor and Linux.
- */
--struct HvReleaseData hvReleaseData = {
-+const struct HvReleaseData hvReleaseData = {
- .xDesc = 0xc8a5d9c4, /* "HvRD" ebcdic */
- .xSize = sizeof(struct HvReleaseData),
- .xVpdAreasPtrOffset = offsetof(struct naca_struct, xItVpdAreas),
-@@ -61,6 +61,63 @@ struct naca_struct naca = {
- .xRamDiskSize = 0,
- };
-
-+struct ItLpRegSave {
-+ u32 xDesc; // Eye catcher "LpRS" ebcdic 000-003
-+ u16 xSize; // Size of this class 004-005
-+ u8 xInUse; // Area is live 006-007
-+ u8 xRsvd1[9]; // Reserved 007-00F
-+
-+ u8 xFixedRegSave[352]; // Fixed Register Save Area 010-16F
-+ u32 xCTRL; // Control Register 170-173
-+ u32 xDEC; // Decrementer 174-177
-+ u32 xFPSCR; // FP Status and Control Reg 178-17B
-+ u32 xPVR; // Processor Version Number 17C-17F
-+
-+ u64 xMMCR0; // Monitor Mode Control Reg 0 180-187
-+ u32 xPMC1; // Perf Monitor Counter 1 188-18B
-+ u32 xPMC2; // Perf Monitor Counter 2 18C-18F
-+ u32 xPMC3; // Perf Monitor Counter 3 190-193
-+ u32 xPMC4; // Perf Monitor Counter 4 194-197
-+ u32 xPIR; // Processor ID Reg 198-19B
-+
-+ u32 xMMCR1; // Monitor Mode Control Reg 1 19C-19F
-+ u32 xMMCRA; // Monitor Mode Control Reg A 1A0-1A3
-+ u32 xPMC5; // Perf Monitor Counter 5 1A4-1A7
-+ u32 xPMC6; // Perf Monitor Counter 6 1A8-1AB
-+ u32 xPMC7; // Perf Monitor Counter 7 1AC-1AF
-+ u32 xPMC8; // Perf Monitor Counter 8 1B0-1B3
-+ u32 xTSC; // Thread Switch Control 1B4-1B7
-+ u32 xTST; // Thread Switch Timeout 1B8-1BB
-+ u32 xRsvd; // Reserved 1BC-1BF
-+
-+ u64 xACCR; // Address Compare Control Reg 1C0-1C7
-+ u64 xIMR; // Instruction Match Register 1C8-1CF
-+ u64 xSDR1; // Storage Description Reg 1 1D0-1D7
-+ u64 xSPRG0; // Special Purpose Reg General0 1D8-1DF
-+ u64 xSPRG1; // Special Purpose Reg General1 1E0-1E7
-+ u64 xSPRG2; // Special Purpose Reg General2 1E8-1EF
-+ u64 xSPRG3; // Special Purpose Reg General3 1F0-1F7
-+ u64 xTB; // Time Base Register 1F8-1FF
-+
-+ u64 xFPR[32]; // Floating Point Registers 200-2FF
-+
-+ u64 xMSR; // Machine State Register 300-307
-+ u64 xNIA; // Next Instruction Address 308-30F
-+
-+ u64 xDABR; // Data Address Breakpoint Reg 310-317
-+ u64 xIABR; // Inst Address Breakpoint Reg 318-31F
-+
-+ u64 xHID0; // HW Implementation Dependent0 320-327
-+
-+ u64 xHID4; // HW Implementation Dependent4 328-32F
-+ u64 xSCOMd; // SCON Data Reg (SPRG4) 330-337
-+ u64 xSCOMc; // SCON Command Reg (SPRG5) 338-33F
-+ u64 xSDAR; // Sample Data Address Register 340-347
-+ u64 xSIAR; // Sample Inst Address Register 348-34F
-+
-+ u8 xRsvd3[176]; // Reserved 350-3FF
-+};
-+
- extern void system_reset_iSeries(void);
- extern void machine_check_iSeries(void);
- extern void data_access_iSeries(void);
-@@ -129,7 +186,7 @@ struct ItLpNaca itLpNaca = {
- };
-
- /* May be filled in by the hypervisor so cannot end up in the BSS */
--struct ItIplParmsReal xItIplParmsReal __attribute__((__section__(".data")));
-+static struct ItIplParmsReal xItIplParmsReal __attribute__((__section__(".data")));
-
- /* May be filled in by the hypervisor so cannot end up in the BSS */
- struct ItExtVpdPanel xItExtVpdPanel __attribute__((__section__(".data")));
-@@ -152,13 +209,54 @@ u64 xMsVpd[3400] __attribute__((__sec
-
- /* Space for Recovery Log Buffer */
- /* May be filled in by the hypervisor so cannot end up in the BSS */
--u64 xRecoveryLogBuffer[32] __attribute__((__section__(".data")));
-+static u64 xRecoveryLogBuffer[32] __attribute__((__section__(".data")));
-
--struct SpCommArea xSpCommArea = {
-+static const struct SpCommArea xSpCommArea = {
- .xDesc = 0xE2D7C3C2,
- .xFormat = 1,
- };
-
-+static const struct ItLpRegSave iseries_reg_save[] = {
-+ [0 ... (NR_CPUS-1)] = {
-+ .xDesc = 0xd397d9e2, /* "LpRS" */
-+ .xSize = sizeof(struct ItLpRegSave),
-+ },
-+};
-+
-+#define ALPACA_INIT(number) \
-+{ \
-+ .lppaca_ptr = &lppaca[number], \
-+ .reg_save_ptr = &iseries_reg_save[number], \
-+}
-+
-+const struct alpaca alpaca[] = {
-+ ALPACA_INIT( 0),
-+#if NR_CPUS > 1
-+ ALPACA_INIT( 1), ALPACA_INIT( 2), ALPACA_INIT( 3),
-+#if NR_CPUS > 4
-+ ALPACA_INIT( 4), ALPACA_INIT( 5), ALPACA_INIT( 6), ALPACA_INIT( 7),
-+#if NR_CPUS > 8
-+ ALPACA_INIT( 8), ALPACA_INIT( 9), ALPACA_INIT(10), ALPACA_INIT(11),
-+ ALPACA_INIT(12), ALPACA_INIT(13), ALPACA_INIT(14), ALPACA_INIT(15),
-+ ALPACA_INIT(16), ALPACA_INIT(17), ALPACA_INIT(18), ALPACA_INIT(19),
-+ ALPACA_INIT(20), ALPACA_INIT(21), ALPACA_INIT(22), ALPACA_INIT(23),
-+ ALPACA_INIT(24), ALPACA_INIT(25), ALPACA_INIT(26), ALPACA_INIT(27),
-+ ALPACA_INIT(28), ALPACA_INIT(29), ALPACA_INIT(30), ALPACA_INIT(31),
-+#if NR_CPUS > 32
-+ ALPACA_INIT(32), ALPACA_INIT(33), ALPACA_INIT(34), ALPACA_INIT(35),
-+ ALPACA_INIT(36), ALPACA_INIT(37), ALPACA_INIT(38), ALPACA_INIT(39),
-+ ALPACA_INIT(40), ALPACA_INIT(41), ALPACA_INIT(42), ALPACA_INIT(43),
-+ ALPACA_INIT(44), ALPACA_INIT(45), ALPACA_INIT(46), ALPACA_INIT(47),
-+ ALPACA_INIT(48), ALPACA_INIT(49), ALPACA_INIT(50), ALPACA_INIT(51),
-+ ALPACA_INIT(52), ALPACA_INIT(53), ALPACA_INIT(54), ALPACA_INIT(55),
-+ ALPACA_INIT(56), ALPACA_INIT(57), ALPACA_INIT(58), ALPACA_INIT(59),
-+ ALPACA_INIT(60), ALPACA_INIT(61), ALPACA_INIT(62), ALPACA_INIT(63),
-+#endif
-+#endif
-+#endif
-+#endif
-+};
-+
- /* The LparMap data is now located at offset 0x6000 in head.S
- * It was put there so that the HvReleaseData could address it
- * with a 32-bit offset as required by the iSeries hypervisor
-@@ -167,7 +265,7 @@ struct SpCommArea xSpCommArea = {
- * the Naca via the HvReleaseData area. The HvReleaseData has the
- * offset into the Naca of the pointer to the ItVpdAreas.
- */
--struct ItVpdAreas itVpdAreas = {
-+const struct ItVpdAreas itVpdAreas = {
- .xSlicDesc = 0xc9a3e5c1, /* "ItVA" */
- .xSlicSize = sizeof(struct ItVpdAreas),
- .xSlicVpdEntries = ItVpdMaxEntries, /* # VPD array entries */
-@@ -185,7 +283,7 @@ struct ItVpdAreas itVpdAreas = {
- .xSlicVpdLens = { /* VPD lengths */
- 0,0,0, /* 0 - 2 */
- sizeof(xItExtVpdPanel), /* 3 Extended VPD */
-- sizeof(struct paca_struct), /* 4 length of Paca */
-+ sizeof(struct alpaca), /* 4 length of (fake) Paca */
- 0, /* 5 */
- sizeof(struct ItIplParmsReal),/* 6 length of IPL parms */
- 26992, /* 7 length of MS VPD */
-@@ -203,7 +301,7 @@ struct ItVpdAreas itVpdAreas = {
- .xSlicVpdAdrs = { /* VPD addresses */
- 0,0,0, /* 0 - 2 */
- &xItExtVpdPanel, /* 3 Extended VPD */
-- &paca[0], /* 4 first Paca */
-+ &alpaca[0], /* 4 first (fake) Paca */
- 0, /* 5 */
- &xItIplParmsReal, /* 6 IPL parms */
- &xMsVpd, /* 7 MS Vpd */
-@@ -219,10 +317,3 @@ struct ItVpdAreas itVpdAreas = {
- 0,0
- }
- };
--
--struct ItLpRegSave iseries_reg_save[] = {
-- [0 ... (NR_CPUS-1)] = {
-- .xDesc = 0xd397d9e2, /* "LpRS" */
-- .xSize = sizeof(struct ItLpRegSave),
-- },
--};
---- a/arch/powerpc/platforms/iseries/naca.h
-+++ b/arch/powerpc/platforms/iseries/naca.h
-@@ -14,7 +14,7 @@
-
- struct naca_struct {
- /* Kernel only data - undefined for user space */
-- void *xItVpdAreas; /* VPD Data 0x00 */
-+ const void *xItVpdAreas; /* VPD Data 0x00 */
- void *xRamDisk; /* iSeries ramdisk 0x08 */
- u64 xRamDiskSize; /* In pages 0x10 */
- };
---- a/arch/powerpc/platforms/iseries/pci.c
-+++ b/arch/powerpc/platforms/iseries/pci.c
-@@ -23,6 +23,7 @@
-
- #undef DEBUG
-
-+#include <linux/jiffies.h>
- #include <linux/kernel.h>
- #include <linux/list.h>
- #include <linux/string.h>
-@@ -586,7 +587,7 @@ static inline struct device_node *xlate_
- static unsigned long last_jiffies;
- static int num_printed;
-
-- if ((jiffies - last_jiffies) > 60 * HZ) {
-+ if (time_after(jiffies, last_jiffies + 60 * HZ)) {
- last_jiffies = jiffies;
- num_printed = 0;
- }
---- a/arch/powerpc/platforms/iseries/release_data.h
-+++ b/arch/powerpc/platforms/iseries/release_data.h
-@@ -58,6 +58,6 @@ struct HvReleaseData {
- char xRsvd3[20]; /* Reserved x2C-x3F */
- };
-
--extern struct HvReleaseData hvReleaseData;
-+extern const struct HvReleaseData hvReleaseData;
-
- #endif /* _ISERIES_RELEASE_DATA_H */
---- a/arch/powerpc/platforms/iseries/spcomm_area.h
-+++ b/arch/powerpc/platforms/iseries/spcomm_area.h
-@@ -31,6 +31,4 @@ struct SpCommArea {
- u8 xRsvd2[80]; // Reserved 030-07F
- };
-
--extern struct SpCommArea xSpCommArea;
--
- #endif /* _ISERIES_SPCOMM_AREA_H */
---- a/arch/powerpc/platforms/iseries/vpd_areas.h
-+++ b/arch/powerpc/platforms/iseries/vpd_areas.h
-@@ -80,9 +80,9 @@ struct ItVpdAreas {
- u32 xPlicDmaLens[ItDmaMaxEntries];// Array of DMA lengths 080-0A7
- u32 xPlicDmaToks[ItDmaMaxEntries];// Array of DMA tokens 0A8-0CF
- u32 xSlicVpdLens[ItVpdMaxEntries];// Array of VPD lengths 0D0-12F
-- void *xSlicVpdAdrs[ItVpdMaxEntries];// Array of VPD buffers 130-1EF
-+ const void *xSlicVpdAdrs[ItVpdMaxEntries];// Array of VPD buffers 130-1EF
- };
-
--extern struct ItVpdAreas itVpdAreas;
-+extern const struct ItVpdAreas itVpdAreas;
-
- #endif /* _ISERIES_VPD_AREAS_H */
---- a/arch/powerpc/platforms/maple/pci.c
-+++ b/arch/powerpc/platforms/maple/pci.c
-@@ -592,50 +592,3 @@ int maple_pci_get_legacy_ide_irq(struct
- }
- return irq;
- }
--
--/* XXX: To remove once all firmwares are ok */
--static void fixup_maple_ide(struct pci_dev* dev)
--{
-- if (!machine_is(maple))
-- return;
--
--#if 0 /* Enable this to enable IDE port 0 */
-- {
-- u8 v;
--
-- pci_read_config_byte(dev, 0x40, &v);
-- v |= 2;
-- pci_write_config_byte(dev, 0x40, v);
-- }
--#endif
--#if 0 /* fix bus master base */
-- pci_write_config_dword(dev, 0x20, 0xcc01);
-- printk("old ide resource: %lx -> %lx \n",
-- dev->resource[4].start, dev->resource[4].end);
-- dev->resource[4].start = 0xcc00;
-- dev->resource[4].end = 0xcc10;
--#endif
--#if 0 /* Enable this to fixup IDE sense/polarity of irqs in IO-APICs */
-- {
-- struct pci_dev *apicdev;
-- u32 v;
--
-- apicdev = pci_get_slot (dev->bus, PCI_DEVFN(5,0));
-- if (apicdev == NULL)
-- printk("IDE Fixup IRQ: Can't find IO-APIC !\n");
-- else {
-- pci_write_config_byte(apicdev, 0xf2, 0x10 + 2*14);
-- pci_read_config_dword(apicdev, 0xf4, &v);
-- v &= ~0x00000022;
-- pci_write_config_dword(apicdev, 0xf4, v);
-- pci_write_config_byte(apicdev, 0xf2, 0x10 + 2*15);
-- pci_read_config_dword(apicdev, 0xf4, &v);
-- v &= ~0x00000022;
-- pci_write_config_dword(apicdev, 0xf4, v);
-- pci_dev_put(apicdev);
-- }
-- }
--#endif
--}
--DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8111_IDE,
-- fixup_maple_ide);
---- a/arch/powerpc/platforms/maple/setup.c
-+++ b/arch/powerpc/platforms/maple/setup.c
-@@ -43,6 +43,7 @@
- #include <linux/smp.h>
- #include <linux/bitops.h>
- #include <linux/of_device.h>
-+#include <linux/lmb.h>
-
- #include <asm/processor.h>
- #include <asm/sections.h>
-@@ -57,7 +58,6 @@
- #include <asm/dma.h>
- #include <asm/cputable.h>
- #include <asm/time.h>
--#include <asm/lmb.h>
- #include <asm/mpic.h>
- #include <asm/rtas.h>
- #include <asm/udbg.h>
-@@ -319,7 +319,7 @@ static int __init maple_probe(void)
- return 1;
- }
-
--define_machine(maple_md) {
-+define_machine(maple) {
- .name = "Maple",
- .probe = maple_probe,
- .setup_arch = maple_setup_arch,
---- a/arch/powerpc/platforms/pasemi/dma_lib.c
-+++ b/arch/powerpc/platforms/pasemi/dma_lib.c
-@@ -17,6 +17,7 @@
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-+#include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/pci.h>
-@@ -26,6 +27,8 @@
-
- #define MAX_TXCH 64
- #define MAX_RXCH 64
-+#define MAX_FLAGS 64
-+#define MAX_FUN 8
-
- static struct pasdma_status *dma_status;
-
-@@ -43,6 +46,8 @@ static struct pci_dev *dma_pdev;
-
- static DECLARE_BITMAP(txch_free, MAX_TXCH);
- static DECLARE_BITMAP(rxch_free, MAX_RXCH);
-+static DECLARE_BITMAP(flags_free, MAX_FLAGS);
-+static DECLARE_BITMAP(fun_free, MAX_FUN);
-
- /* pasemi_read_iob_reg - read IOB register
- * @reg: Register to read (offset into PCI CFG space)
-@@ -373,6 +378,106 @@ void pasemi_dma_free_buf(struct pasemi_d
- }
- EXPORT_SYMBOL(pasemi_dma_free_buf);
-
-+/* pasemi_dma_alloc_flag - Allocate a flag (event) for channel syncronization
-+ *
-+ * Allocates a flag for use with channel syncronization (event descriptors).
-+ * Returns allocated flag (0-63), < 0 on error.
-+ */
-+int pasemi_dma_alloc_flag(void)
-+{
-+ int bit;
-+
-+retry:
-+ bit = find_next_bit(flags_free, MAX_FLAGS, 0);
-+ if (bit >= MAX_FLAGS)
-+ return -ENOSPC;
-+ if (!test_and_clear_bit(bit, flags_free))
-+ goto retry;
-+
-+ return bit;
-+}
-+EXPORT_SYMBOL(pasemi_dma_alloc_flag);
-+
-+
-+/* pasemi_dma_free_flag - Deallocates a flag (event)
-+ * @flag: Flag number to deallocate
-+ *
-+ * Frees up a flag so it can be reused for other purposes.
-+ */
-+void pasemi_dma_free_flag(int flag)
-+{
-+ BUG_ON(test_bit(flag, flags_free));
-+ BUG_ON(flag >= MAX_FLAGS);
-+ set_bit(flag, flags_free);
-+}
-+EXPORT_SYMBOL(pasemi_dma_free_flag);
-+
-+
-+/* pasemi_dma_set_flag - Sets a flag (event) to 1
-+ * @flag: Flag number to set active
-+ *
-+ * Sets the flag provided to 1.
-+ */
-+void pasemi_dma_set_flag(int flag)
-+{
-+ BUG_ON(flag >= MAX_FLAGS);
-+ if (flag < 32)
-+ pasemi_write_dma_reg(PAS_DMA_TXF_SFLG0, 1 << flag);
-+ else
-+ pasemi_write_dma_reg(PAS_DMA_TXF_SFLG1, 1 << flag);
-+}
-+EXPORT_SYMBOL(pasemi_dma_set_flag);
-+
-+/* pasemi_dma_clear_flag - Sets a flag (event) to 0
-+ * @flag: Flag number to set inactive
-+ *
-+ * Sets the flag provided to 0.
-+ */
-+void pasemi_dma_clear_flag(int flag)
-+{
-+ BUG_ON(flag >= MAX_FLAGS);
-+ if (flag < 32)
-+ pasemi_write_dma_reg(PAS_DMA_TXF_CFLG0, 1 << flag);
-+ else
-+ pasemi_write_dma_reg(PAS_DMA_TXF_CFLG1, 1 << flag);
-+}
-+EXPORT_SYMBOL(pasemi_dma_clear_flag);
-+
-+/* pasemi_dma_alloc_fun - Allocate a function engine
-+ *
-+ * Allocates a function engine to use for crypto/checksum offload
-+ * Returns allocated engine (0-8), < 0 on error.
-+ */
-+int pasemi_dma_alloc_fun(void)
-+{
-+ int bit;
-+
-+retry:
-+ bit = find_next_bit(fun_free, MAX_FLAGS, 0);
-+ if (bit >= MAX_FLAGS)
-+ return -ENOSPC;
-+ if (!test_and_clear_bit(bit, fun_free))
-+ goto retry;
-+
-+ return bit;
-+}
-+EXPORT_SYMBOL(pasemi_dma_alloc_fun);
-+
-+
-+/* pasemi_dma_free_fun - Deallocates a function engine
-+ * @flag: Engine number to deallocate
-+ *
-+ * Frees up a function engine so it can be used for other purposes.
-+ */
-+void pasemi_dma_free_fun(int fun)
-+{
-+ BUG_ON(test_bit(fun, fun_free));
-+ BUG_ON(fun >= MAX_FLAGS);
-+ set_bit(fun, fun_free);
-+}
-+EXPORT_SYMBOL(pasemi_dma_free_fun);
-+
-+
- static void *map_onedev(struct pci_dev *p, int index)
- {
- struct device_node *dn;
-@@ -410,6 +515,7 @@ int pasemi_dma_init(void)
- struct resource res;
- struct device_node *dn;
- int i, intf, err = 0;
-+ unsigned long timeout;
- u32 tmp;
-
- if (!machine_is(pasemi))
-@@ -478,6 +584,44 @@ int pasemi_dma_init(void)
- for (i = 0; i < MAX_RXCH; i++)
- __set_bit(i, rxch_free);
-
-+ timeout = jiffies + HZ;
-+ pasemi_write_dma_reg(PAS_DMA_COM_RXCMD, 0);
-+ while (pasemi_read_dma_reg(PAS_DMA_COM_RXSTA) & 1) {
-+ if (time_after(jiffies, timeout)) {
-+ pr_warning("Warning: Could not disable RX section\n");
-+ break;
-+ }
-+ }
-+
-+ timeout = jiffies + HZ;
-+ pasemi_write_dma_reg(PAS_DMA_COM_TXCMD, 0);
-+ while (pasemi_read_dma_reg(PAS_DMA_COM_TXSTA) & 1) {
-+ if (time_after(jiffies, timeout)) {
-+ pr_warning("Warning: Could not disable TX section\n");
-+ break;
-+ }
-+ }
-+
-+ /* setup resource allocations for the different DMA sections */
-+ tmp = pasemi_read_dma_reg(PAS_DMA_COM_CFG);
-+ pasemi_write_dma_reg(PAS_DMA_COM_CFG, tmp | 0x18000000);
-+
-+ /* enable tx section */
-+ pasemi_write_dma_reg(PAS_DMA_COM_TXCMD, PAS_DMA_COM_TXCMD_EN);
-+
-+ /* enable rx section */
-+ pasemi_write_dma_reg(PAS_DMA_COM_RXCMD, PAS_DMA_COM_RXCMD_EN);
-+
-+ for (i = 0; i < MAX_FLAGS; i++)
-+ __set_bit(i, flags_free);
-+
-+ for (i = 0; i < MAX_FUN; i++)
-+ __set_bit(i, fun_free);
-+
-+ /* clear all status flags */
-+ pasemi_write_dma_reg(PAS_DMA_TXF_CFLG0, 0xffffffff);
-+ pasemi_write_dma_reg(PAS_DMA_TXF_CFLG1, 0xffffffff);
-+
- printk(KERN_INFO "PA Semi PWRficient DMA library initialized "
- "(%d tx, %d rx channels)\n", num_txch, num_rxch);
-
---- a/arch/powerpc/platforms/pasemi/iommu.c
-+++ b/arch/powerpc/platforms/pasemi/iommu.c
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (C) 2005-2007, PA Semi, Inc
-+ * Copyright (C) 2005-2008, PA Semi, Inc
- *
- * Maintained by: Olof Johansson <olof@lixom.net>
- *
-@@ -27,7 +27,6 @@
- #include <asm/abs_addr.h>
- #include <asm/firmware.h>
-
--
- #define IOBMAP_PAGE_SHIFT 12
- #define IOBMAP_PAGE_SIZE (1 << IOBMAP_PAGE_SHIFT)
- #define IOBMAP_PAGE_MASK (IOBMAP_PAGE_SIZE - 1)
-@@ -35,13 +34,13 @@
- #define IOB_BASE 0xe0000000
- #define IOB_SIZE 0x3000
- /* Configuration registers */
--#define IOBCAP_REG 0x10
--#define IOBCOM_REG 0x40
-+#define IOBCAP_REG 0x40
-+#define IOBCOM_REG 0x100
- /* Enable IOB address translation */
- #define IOBCOM_ATEN 0x00000100
-
- /* Address decode configuration register */
--#define IOB_AD_REG 0x53
-+#define IOB_AD_REG 0x14c
- /* IOBCOM_AD_REG fields */
- #define IOB_AD_VGPRT 0x00000e00
- #define IOB_AD_VGAEN 0x00000100
-@@ -56,13 +55,13 @@
- #define IOB_AD_TRNG_2G 0x00000001
- #define IOB_AD_TRNG_128G 0x00000003
-
--#define IOB_TABLEBASE_REG 0x55
-+#define IOB_TABLEBASE_REG 0x154
-
- /* Base of the 64 4-byte L1 registers */
--#define IOB_XLT_L1_REGBASE 0xac0
-+#define IOB_XLT_L1_REGBASE 0x2b00
-
- /* Register to invalidate TLB entries */
--#define IOB_AT_INVAL_TLB_REG 0xb40
-+#define IOB_AT_INVAL_TLB_REG 0x2d00
-
- /* The top two bits of the level 1 entry contains valid and type flags */
- #define IOBMAP_L1E_V 0x40000000
-@@ -76,7 +75,7 @@
- #define IOBMAP_L2E_V 0x80000000
- #define IOBMAP_L2E_V_CACHED 0xc0000000
-
--static u32 __iomem *iob;
-+static void __iomem *iob;
- static u32 iob_l1_emptyval;
- static u32 iob_l2_emptyval;
- static u32 *iob_l2_base;
-@@ -219,7 +218,7 @@ int __init iob_init(struct device_node *
- for (i = 0; i < 64; i++) {
- /* Each L1 covers 32MB, i.e. 8K entries = 32K of ram */
- regword = IOBMAP_L1E_V | (__pa(iob_l2_base + i*0x2000) >> 12);
-- out_le32(iob+IOB_XLT_L1_REGBASE+i, regword);
-+ out_le32(iob+IOB_XLT_L1_REGBASE+i*4, regword);
- }
-
- /* set 2GB translation window, based at 0 */
---- a/arch/powerpc/platforms/powermac/setup.c
-+++ b/arch/powerpc/platforms/powermac/setup.c
-@@ -53,6 +53,7 @@
- #include <linux/suspend.h>
- #include <linux/of_device.h>
- #include <linux/of_platform.h>
-+#include <linux/lmb.h>
-
- #include <asm/reg.h>
- #include <asm/sections.h>
-@@ -74,7 +75,6 @@
- #include <asm/iommu.h>
- #include <asm/smu.h>
- #include <asm/pmc.h>
--#include <asm/lmb.h>
- #include <asm/udbg.h>
-
- #include "pmac.h"
---- a/arch/powerpc/platforms/ps3/device-init.c
-+++ b/arch/powerpc/platforms/ps3/device-init.c
-@@ -499,41 +499,14 @@ static int __init ps3_register_graphics_
- }
-
- /**
-- * ps3_register_repository_device - Register a device from the repositiory info.
-- *
-+ * ps3_setup_dynamic_device - Setup a dynamic device from the repository
- */
-
--static int ps3_register_repository_device(
-- const struct ps3_repository_device *repo)
-+static int ps3_setup_dynamic_device(const struct ps3_repository_device *repo)
- {
- int result;
-
- switch (repo->dev_type) {
-- case PS3_DEV_TYPE_SB_GELIC:
-- result = ps3_setup_gelic_device(repo);
-- if (result) {
-- pr_debug("%s:%d ps3_setup_gelic_device failed\n",
-- __func__, __LINE__);
-- }
-- break;
-- case PS3_DEV_TYPE_SB_USB:
--
-- /* Each USB device has both an EHCI and an OHCI HC */
--
-- result = ps3_setup_ehci_device(repo);
--
-- if (result) {
-- pr_debug("%s:%d ps3_setup_ehci_device failed\n",
-- __func__, __LINE__);
-- }
--
-- result = ps3_setup_ohci_device(repo);
--
-- if (result) {
-- pr_debug("%s:%d ps3_setup_ohci_device failed\n",
-- __func__, __LINE__);
-- }
-- break;
- case PS3_DEV_TYPE_STOR_DISK:
- result = ps3_setup_storage_dev(repo, PS3_MATCH_ID_STOR_DISK);
-
-@@ -572,6 +545,48 @@ static int ps3_register_repository_devic
- return result;
- }
-
-+/**
-+ * ps3_setup_static_device - Setup a static device from the repository
-+ */
-+
-+static int __init ps3_setup_static_device(const struct ps3_repository_device *repo)
-+{
-+ int result;
-+
-+ switch (repo->dev_type) {
-+ case PS3_DEV_TYPE_SB_GELIC:
-+ result = ps3_setup_gelic_device(repo);
-+ if (result) {
-+ pr_debug("%s:%d ps3_setup_gelic_device failed\n",
-+ __func__, __LINE__);
-+ }
-+ break;
-+ case PS3_DEV_TYPE_SB_USB:
-+
-+ /* Each USB device has both an EHCI and an OHCI HC */
-+
-+ result = ps3_setup_ehci_device(repo);
-+
-+ if (result) {
-+ pr_debug("%s:%d ps3_setup_ehci_device failed\n",
-+ __func__, __LINE__);
-+ }
-+
-+ result = ps3_setup_ohci_device(repo);
-+
-+ if (result) {
-+ pr_debug("%s:%d ps3_setup_ohci_device failed\n",
-+ __func__, __LINE__);
-+ }
-+ break;
-+
-+ default:
-+ return ps3_setup_dynamic_device(repo);
-+ }
-+
-+ return result;
-+}
-+
- static void ps3_find_and_add_device(u64 bus_id, u64 dev_id)
- {
- struct ps3_repository_device repo;
-@@ -601,7 +616,7 @@ found:
- pr_debug("%s:%u: device %lu:%lu found after %u retries\n",
- __func__, __LINE__, bus_id, dev_id, retries);
-
-- ps3_register_repository_device(&repo);
-+ ps3_setup_dynamic_device(&repo);
- return;
- }
-
-@@ -905,8 +920,7 @@ static int __init ps3_register_devices(v
-
- ps3_register_graphics_devices();
-
-- ps3_repository_find_devices(PS3_BUS_TYPE_SB,
-- ps3_register_repository_device);
-+ ps3_repository_find_devices(PS3_BUS_TYPE_SB, ps3_setup_static_device);
-
- ps3_register_sound_devices();
-
---- a/arch/powerpc/platforms/ps3/htab.c
-+++ b/arch/powerpc/platforms/ps3/htab.c
-@@ -19,9 +19,10 @@
- */
-
- #include <linux/kernel.h>
-+#include <linux/lmb.h>
-
- #include <asm/machdep.h>
--#include <asm/lmb.h>
-+#include <asm/prom.h>
- #include <asm/udbg.h>
- #include <asm/lv1call.h>
- #include <asm/ps3fb.h>
---- a/arch/powerpc/platforms/ps3/interrupt.c
-+++ b/arch/powerpc/platforms/ps3/interrupt.c
-@@ -709,7 +709,7 @@ static unsigned int ps3_get_irq(void)
- asm volatile("cntlzd %0,%1" : "=r" (plug) : "r" (x));
- plug &= 0x3f;
-
-- if (unlikely(plug) == NO_IRQ) {
-+ if (unlikely(plug == NO_IRQ)) {
- pr_debug("%s:%d: no plug found: thread_id %lu\n", __func__,
- __LINE__, pd->thread_id);
- dump_bmp(&per_cpu(ps3_private, 0));
---- a/arch/powerpc/platforms/ps3/mm.c
-+++ b/arch/powerpc/platforms/ps3/mm.c
-@@ -21,9 +21,10 @@
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/memory_hotplug.h>
-+#include <linux/lmb.h>
-
- #include <asm/firmware.h>
--#include <asm/lmb.h>
-+#include <asm/prom.h>
- #include <asm/udbg.h>
- #include <asm/lv1call.h>
-
---- a/arch/powerpc/platforms/ps3/os-area.c
-+++ b/arch/powerpc/platforms/ps3/os-area.c
-@@ -24,8 +24,9 @@
- #include <linux/fs.h>
- #include <linux/syscalls.h>
- #include <linux/ctype.h>
-+#include <linux/lmb.h>
-
--#include <asm/lmb.h>
-+#include <asm/prom.h>
-
- #include "platform.h"
-
---- a/arch/powerpc/platforms/ps3/setup.c
-+++ b/arch/powerpc/platforms/ps3/setup.c
-@@ -95,6 +95,14 @@ static void ps3_power_off(void)
- ps3_sys_manager_power_off(); /* never returns */
- }
-
-+static void ps3_halt(void)
-+{
-+ DBG("%s:%d\n", __func__, __LINE__);
-+
-+ smp_send_stop();
-+ ps3_sys_manager_halt(); /* never returns */
-+}
-+
- static void ps3_panic(char *str)
- {
- DBG("%s:%d %s\n", __func__, __LINE__, str);
-@@ -105,7 +113,8 @@ static void ps3_panic(char *str)
- printk(" Please press POWER button.\n");
- printk("\n");
-
-- while(1);
-+ while(1)
-+ lv1_pause(1);
- }
-
- #if defined(CONFIG_FB_PS3) || defined(CONFIG_FB_PS3_MODULE) || \
-@@ -117,7 +126,7 @@ static void __init prealloc(struct ps3_p
-
- p->address = __alloc_bootmem(p->size, p->align, __pa(MAX_DMA_ADDRESS));
- if (!p->address) {
-- printk(KERN_ERR "%s: Cannot allocate %s\n", __FUNCTION__,
-+ printk(KERN_ERR "%s: Cannot allocate %s\n", __func__,
- p->name);
- return;
- }
-@@ -266,6 +275,7 @@ define_machine(ps3) {
- .progress = ps3_progress,
- .restart = ps3_restart,
- .power_off = ps3_power_off,
-+ .halt = ps3_halt,
- #if defined(CONFIG_KEXEC)
- .kexec_cpu_down = ps3_kexec_cpu_down,
- .machine_kexec = default_machine_kexec,
---- a/arch/powerpc/platforms/ps3/spu.c
-+++ b/arch/powerpc/platforms/ps3/spu.c
-@@ -27,6 +27,7 @@
- #include <asm/spu.h>
- #include <asm/spu_priv1.h>
- #include <asm/lv1call.h>
-+#include <asm/ps3.h>
-
- #include "../cell/spufs/spufs.h"
- #include "platform.h"
-@@ -140,6 +141,12 @@ static void _dump_areas(unsigned int spe
- pr_debug("%s:%d: shadow: %lxh\n", func, line, shadow);
- }
-
-+inline u64 ps3_get_spe_id(void *arg)
-+{
-+ return spu_pdata(arg)->spe_id;
-+}
-+EXPORT_SYMBOL_GPL(ps3_get_spe_id);
-+
- static unsigned long get_vas_id(void)
- {
- unsigned long id;
---- a/arch/powerpc/platforms/pseries/Makefile
-+++ b/arch/powerpc/platforms/pseries/Makefile
-@@ -18,3 +18,4 @@ obj-$(CONFIG_HOTPLUG_CPU) += hotplug-cpu
- obj-$(CONFIG_HVC_CONSOLE) += hvconsole.o
- obj-$(CONFIG_HVCS) += hvcserver.o
- obj-$(CONFIG_HCALL_STATS) += hvCall_inst.o
-+obj-$(CONFIG_PHYP_DUMP) += phyp_dump.o
---- a/arch/powerpc/platforms/pseries/eeh.c
-+++ b/arch/powerpc/platforms/pseries/eeh.c
-@@ -945,7 +945,6 @@ static void *early_enable_eeh(struct dev
- unsigned int rets[3];
- struct eeh_early_enable_info *info = data;
- int ret;
-- const char *status = of_get_property(dn, "status", NULL);
- const u32 *class_code = of_get_property(dn, "class-code", NULL);
- const u32 *vendor_id = of_get_property(dn, "vendor-id", NULL);
- const u32 *device_id = of_get_property(dn, "device-id", NULL);
-@@ -959,8 +958,8 @@ static void *early_enable_eeh(struct dev
- pdn->eeh_freeze_count = 0;
- pdn->eeh_false_positives = 0;
-
-- if (status && strncmp(status, "ok", 2) != 0)
-- return NULL; /* ignore devices with bad status */
-+ if (!of_device_is_available(dn))
-+ return NULL;
-
- /* Ignore bad nodes. */
- if (!class_code || !vendor_id || !device_id)
---- a/arch/powerpc/platforms/pseries/lpar.c
-+++ b/arch/powerpc/platforms/pseries/lpar.c
-@@ -40,6 +40,7 @@
- #include <asm/smp.h>
-
- #include "plpar_wrappers.h"
-+#include "pseries.h"
-
- #ifdef DEBUG_LOW
- #define DBG_LOW(fmt...) do { udbg_printf(fmt); } while(0)
-@@ -203,7 +204,6 @@ void __init find_udbg_vterm(void)
- struct device_node *stdout_node;
- const u32 *termno;
- const char *name;
-- int add_console;
-
- /* find the boot console from /chosen/stdout */
- if (!of_chosen)
-@@ -219,8 +219,6 @@ void __init find_udbg_vterm(void)
- printk(KERN_WARNING "stdout node missing 'name' property!\n");
- goto out;
- }
-- /* The user has requested a console so this is already set up. */
-- add_console = !strstr(cmd_line, "console=");
-
- /* Check if it's a virtual terminal */
- if (strncmp(name, "vty", 3) != 0)
-@@ -234,15 +232,13 @@ void __init find_udbg_vterm(void)
- udbg_putc = udbg_putcLP;
- udbg_getc = udbg_getcLP;
- udbg_getc_poll = udbg_getc_pollLP;
-- if (add_console)
-- add_preferred_console("hvc", termno[0] & 0xff, NULL);
-+ add_preferred_console("hvc", termno[0] & 0xff, NULL);
- } else if (of_device_is_compatible(stdout_node, "hvterm-protocol")) {
- vtermno = termno[0];
- udbg_putc = udbg_hvsi_putc;
- udbg_getc = udbg_hvsi_getc;
- udbg_getc_poll = udbg_hvsi_getc_poll;
-- if (add_console)
-- add_preferred_console("hvsi", termno[0] & 0xff, NULL);
-+ add_preferred_console("hvsi", termno[0] & 0xff, NULL);
- }
- out:
- of_node_put(stdout_node);
-@@ -520,6 +516,20 @@ static void pSeries_lpar_hpte_invalidate
- BUG_ON(lpar_rc != H_SUCCESS);
- }
-
-+static void pSeries_lpar_hpte_removebolted(unsigned long ea,
-+ int psize, int ssize)
-+{
-+ unsigned long slot, vsid, va;
-+
-+ vsid = get_kernel_vsid(ea, ssize);
-+ va = hpt_va(ea, vsid, ssize);
-+
-+ slot = pSeries_lpar_hpte_find(va, psize, ssize);
-+ BUG_ON(slot == -1);
-+
-+ pSeries_lpar_hpte_invalidate(slot, va, psize, ssize, 0);
-+}
-+
- /* Flag bits for H_BULK_REMOVE */
- #define HBR_REQUEST 0x4000000000000000UL
- #define HBR_RESPONSE 0x8000000000000000UL
-@@ -597,6 +607,7 @@ void __init hpte_init_lpar(void)
- ppc_md.hpte_updateboltedpp = pSeries_lpar_hpte_updateboltedpp;
- ppc_md.hpte_insert = pSeries_lpar_hpte_insert;
- ppc_md.hpte_remove = pSeries_lpar_hpte_remove;
-+ ppc_md.hpte_removebolted = pSeries_lpar_hpte_removebolted;
- ppc_md.flush_hash_range = pSeries_lpar_flush_hash_range;
- ppc_md.hpte_clear_all = pSeries_lpar_hptab_clear;
- }
---- a/arch/powerpc/platforms/pseries/pci_dlpar.c
-+++ b/arch/powerpc/platforms/pseries/pci_dlpar.c
-@@ -123,7 +123,7 @@ pcibios_pci_config_bridge(struct pci_dev
- /* Add to children of PCI bridge dev->bus */
- child_bus = pci_add_new_bus(dev->bus, dev, sec_busno);
- if (!child_bus) {
-- printk (KERN_ERR "%s: could not add second bus\n", __FUNCTION__);
-+ printk (KERN_ERR "%s: could not add second bus\n", __func__);
- return -EIO;
- }
- sprintf(child_bus->name, "PCI Bus #%02x", child_bus->number);
---- /dev/null
-+++ b/arch/powerpc/platforms/pseries/phyp_dump.c
-@@ -0,0 +1,507 @@
-+/*
-+ * Hypervisor-assisted dump
-+ *
-+ * Linas Vepstas, Manish Ahuja 2008
-+ * Copyright 2008 IBM Corp.
-+ *
-+ * 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/kobject.h>
-+#include <linux/mm.h>
-+#include <linux/of.h>
-+#include <linux/pfn.h>
-+#include <linux/swap.h>
-+#include <linux/sysfs.h>
-+
-+#include <asm/page.h>
-+#include <asm/phyp_dump.h>
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/rtas.h>
-+
-+/* Variables, used to communicate data between early boot and late boot */
-+static struct phyp_dump phyp_dump_vars;
-+struct phyp_dump *phyp_dump_info = &phyp_dump_vars;
-+
-+static int ibm_configure_kernel_dump;
-+/* ------------------------------------------------- */
-+/* RTAS interfaces to declare the dump regions */
-+
-+struct dump_section {
-+ u32 dump_flags;
-+ u16 source_type;
-+ u16 error_flags;
-+ u64 source_address;
-+ u64 source_length;
-+ u64 length_copied;
-+ u64 destination_address;
-+};
-+
-+struct phyp_dump_header {
-+ u32 version;
-+ u16 num_of_sections;
-+ u16 status;
-+
-+ u32 first_offset_section;
-+ u32 dump_disk_section;
-+ u64 block_num_dd;
-+ u64 num_of_blocks_dd;
-+ u32 offset_dd;
-+ u32 maxtime_to_auto;
-+ /* No dump disk path string used */
-+
-+ struct dump_section cpu_data;
-+ struct dump_section hpte_data;
-+ struct dump_section kernel_data;
-+};
-+
-+/* The dump header *must be* in low memory, so .bss it */
-+static struct phyp_dump_header phdr;
-+
-+#define NUM_DUMP_SECTIONS 3
-+#define DUMP_HEADER_VERSION 0x1
-+#define DUMP_REQUEST_FLAG 0x1
-+#define DUMP_SOURCE_CPU 0x0001
-+#define DUMP_SOURCE_HPTE 0x0002
-+#define DUMP_SOURCE_RMO 0x0011
-+#define DUMP_ERROR_FLAG 0x2000
-+#define DUMP_TRIGGERED 0x4000
-+#define DUMP_PERFORMED 0x8000
-+
-+
-+/**
-+ * init_dump_header() - initialize the header declaring a dump
-+ * Returns: length of dump save area.
-+ *
-+ * When the hypervisor saves crashed state, it needs to put
-+ * it somewhere. The dump header tells the hypervisor where
-+ * the data can be saved.
-+ */
-+static unsigned long init_dump_header(struct phyp_dump_header *ph)
-+{
-+ unsigned long addr_offset = 0;
-+
-+ /* Set up the dump header */
-+ ph->version = DUMP_HEADER_VERSION;
-+ ph->num_of_sections = NUM_DUMP_SECTIONS;
-+ ph->status = 0;
-+
-+ ph->first_offset_section =
-+ (u32)offsetof(struct phyp_dump_header, cpu_data);
-+ ph->dump_disk_section = 0;
-+ ph->block_num_dd = 0;
-+ ph->num_of_blocks_dd = 0;
-+ ph->offset_dd = 0;
-+
-+ ph->maxtime_to_auto = 0; /* disabled */
-+
-+ /* The first two sections are mandatory */
-+ ph->cpu_data.dump_flags = DUMP_REQUEST_FLAG;
-+ ph->cpu_data.source_type = DUMP_SOURCE_CPU;
-+ ph->cpu_data.source_address = 0;
-+ ph->cpu_data.source_length = phyp_dump_info->cpu_state_size;
-+ ph->cpu_data.destination_address = addr_offset;
-+ addr_offset += phyp_dump_info->cpu_state_size;
-+
-+ ph->hpte_data.dump_flags = DUMP_REQUEST_FLAG;
-+ ph->hpte_data.source_type = DUMP_SOURCE_HPTE;
-+ ph->hpte_data.source_address = 0;
-+ ph->hpte_data.source_length = phyp_dump_info->hpte_region_size;
-+ ph->hpte_data.destination_address = addr_offset;
-+ addr_offset += phyp_dump_info->hpte_region_size;
-+
-+ /* This section describes the low kernel region */
-+ ph->kernel_data.dump_flags = DUMP_REQUEST_FLAG;
-+ ph->kernel_data.source_type = DUMP_SOURCE_RMO;
-+ ph->kernel_data.source_address = PHYP_DUMP_RMR_START;
-+ ph->kernel_data.source_length = PHYP_DUMP_RMR_END;
-+ ph->kernel_data.destination_address = addr_offset;
-+ addr_offset += ph->kernel_data.source_length;
-+
-+ return addr_offset;
-+}
-+
-+static void print_dump_header(const struct phyp_dump_header *ph)
-+{
-+#ifdef DEBUG
-+ printk(KERN_INFO "dump header:\n");
-+ /* setup some ph->sections required */
-+ printk(KERN_INFO "version = %d\n", ph->version);
-+ printk(KERN_INFO "Sections = %d\n", ph->num_of_sections);
-+ printk(KERN_INFO "Status = 0x%x\n", ph->status);
-+
-+ /* No ph->disk, so all should be set to 0 */
-+ printk(KERN_INFO "Offset to first section 0x%x\n",
-+ ph->first_offset_section);
-+ printk(KERN_INFO "dump disk sections should be zero\n");
-+ printk(KERN_INFO "dump disk section = %d\n", ph->dump_disk_section);
-+ printk(KERN_INFO "block num = %ld\n", ph->block_num_dd);
-+ printk(KERN_INFO "number of blocks = %ld\n", ph->num_of_blocks_dd);
-+ printk(KERN_INFO "dump disk offset = %d\n", ph->offset_dd);
-+ printk(KERN_INFO "Max auto time= %d\n", ph->maxtime_to_auto);
-+
-+ /*set cpu state and hpte states as well scratch pad area */
-+ printk(KERN_INFO " CPU AREA \n");
-+ printk(KERN_INFO "cpu dump_flags =%d\n", ph->cpu_data.dump_flags);
-+ printk(KERN_INFO "cpu source_type =%d\n", ph->cpu_data.source_type);
-+ printk(KERN_INFO "cpu error_flags =%d\n", ph->cpu_data.error_flags);
-+ printk(KERN_INFO "cpu source_address =%lx\n",
-+ ph->cpu_data.source_address);
-+ printk(KERN_INFO "cpu source_length =%lx\n",
-+ ph->cpu_data.source_length);
-+ printk(KERN_INFO "cpu length_copied =%lx\n",
-+ ph->cpu_data.length_copied);
-+
-+ printk(KERN_INFO " HPTE AREA \n");
-+ printk(KERN_INFO "HPTE dump_flags =%d\n", ph->hpte_data.dump_flags);
-+ printk(KERN_INFO "HPTE source_type =%d\n", ph->hpte_data.source_type);
-+ printk(KERN_INFO "HPTE error_flags =%d\n", ph->hpte_data.error_flags);
-+ printk(KERN_INFO "HPTE source_address =%lx\n",
-+ ph->hpte_data.source_address);
-+ printk(KERN_INFO "HPTE source_length =%lx\n",
-+ ph->hpte_data.source_length);
-+ printk(KERN_INFO "HPTE length_copied =%lx\n",
-+ ph->hpte_data.length_copied);
-+
-+ printk(KERN_INFO " SRSD AREA \n");
-+ printk(KERN_INFO "SRSD dump_flags =%d\n", ph->kernel_data.dump_flags);
-+ printk(KERN_INFO "SRSD source_type =%d\n", ph->kernel_data.source_type);
-+ printk(KERN_INFO "SRSD error_flags =%d\n", ph->kernel_data.error_flags);
-+ printk(KERN_INFO "SRSD source_address =%lx\n",
-+ ph->kernel_data.source_address);
-+ printk(KERN_INFO "SRSD source_length =%lx\n",
-+ ph->kernel_data.source_length);
-+ printk(KERN_INFO "SRSD length_copied =%lx\n",
-+ ph->kernel_data.length_copied);
-+#endif
-+}
-+
-+static ssize_t show_phyp_dump_active(struct kobject *kobj,
-+ struct kobj_attribute *attr, char *buf)
-+{
-+
-+ /* create filesystem entry so kdump is phyp-dump aware */
-+ return sprintf(buf, "%lx\n", phyp_dump_info->phyp_dump_at_boot);
-+}
-+
-+static struct kobj_attribute pdl = __ATTR(phyp_dump_active, 0600,
-+ show_phyp_dump_active,
-+ NULL);
-+
-+static void register_dump_area(struct phyp_dump_header *ph, unsigned long addr)
-+{
-+ int rc;
-+
-+ /* Add addr value if not initialized before */
-+ if (ph->cpu_data.destination_address == 0) {
-+ ph->cpu_data.destination_address += addr;
-+ ph->hpte_data.destination_address += addr;
-+ ph->kernel_data.destination_address += addr;
-+ }
-+
-+ /* ToDo Invalidate kdump and free memory range. */
-+
-+ do {
-+ rc = rtas_call(ibm_configure_kernel_dump, 3, 1, NULL,
-+ 1, ph, sizeof(struct phyp_dump_header));
-+ } while (rtas_busy_delay(rc));
-+
-+ if (rc) {
-+ printk(KERN_ERR "phyp-dump: unexpected error (%d) on "
-+ "register\n", rc);
-+ print_dump_header(ph);
-+ return;
-+ }
-+
-+ rc = sysfs_create_file(kernel_kobj, &pdl.attr);
-+ if (rc)
-+ printk(KERN_ERR "phyp-dump: unable to create sysfs"
-+ " file (%d)\n", rc);
-+}
-+
-+static
-+void invalidate_last_dump(struct phyp_dump_header *ph, unsigned long addr)
-+{
-+ int rc;
-+
-+ /* Add addr value if not initialized before */
-+ if (ph->cpu_data.destination_address == 0) {
-+ ph->cpu_data.destination_address += addr;
-+ ph->hpte_data.destination_address += addr;
-+ ph->kernel_data.destination_address += addr;
-+ }
-+
-+ do {
-+ rc = rtas_call(ibm_configure_kernel_dump, 3, 1, NULL,
-+ 2, ph, sizeof(struct phyp_dump_header));
-+ } while (rtas_busy_delay(rc));
-+
-+ if (rc) {
-+ printk(KERN_ERR "phyp-dump: unexpected error (%d) "
-+ "on invalidate\n", rc);
-+ print_dump_header(ph);
-+ }
-+}
-+
-+/* ------------------------------------------------- */
-+/**
-+ * release_memory_range -- release memory previously lmb_reserved
-+ * @start_pfn: starting physical frame number
-+ * @nr_pages: number of pages to free.
-+ *
-+ * This routine will release memory that had been previously
-+ * lmb_reserved in early boot. The released memory becomes
-+ * available for genreal use.
-+ */
-+static void release_memory_range(unsigned long start_pfn,
-+ unsigned long nr_pages)
-+{
-+ struct page *rpage;
-+ unsigned long end_pfn;
-+ long i;
-+
-+ end_pfn = start_pfn + nr_pages;
-+
-+ for (i = start_pfn; i <= end_pfn; i++) {
-+ rpage = pfn_to_page(i);
-+ if (PageReserved(rpage)) {
-+ ClearPageReserved(rpage);
-+ init_page_count(rpage);
-+ __free_page(rpage);
-+ totalram_pages++;
-+ }
-+ }
-+}
-+
-+/**
-+ * track_freed_range -- Counts the range being freed.
-+ * Once the counter goes to zero, it re-registers dump for
-+ * future use.
-+ */
-+static void
-+track_freed_range(unsigned long addr, unsigned long length)
-+{
-+ static unsigned long scratch_area_size, reserved_area_size;
-+
-+ if (addr < phyp_dump_info->init_reserve_start)
-+ return;
-+
-+ if ((addr >= phyp_dump_info->init_reserve_start) &&
-+ (addr <= phyp_dump_info->init_reserve_start +
-+ phyp_dump_info->init_reserve_size))
-+ reserved_area_size += length;
-+
-+ if ((addr >= phyp_dump_info->reserved_scratch_addr) &&
-+ (addr <= phyp_dump_info->reserved_scratch_addr +
-+ phyp_dump_info->reserved_scratch_size))
-+ scratch_area_size += length;
-+
-+ if ((reserved_area_size == phyp_dump_info->init_reserve_size) &&
-+ (scratch_area_size == phyp_dump_info->reserved_scratch_size)) {
-+
-+ invalidate_last_dump(&phdr,
-+ phyp_dump_info->reserved_scratch_addr);
-+ register_dump_area(&phdr,
-+ phyp_dump_info->reserved_scratch_addr);
-+ }
-+}
-+
-+/* ------------------------------------------------- */
-+/**
-+ * sysfs_release_region -- sysfs interface to release memory range.
-+ *
-+ * Usage:
-+ * "echo <start addr> <length> > /sys/kernel/release_region"
-+ *
-+ * Example:
-+ * "echo 0x40000000 0x10000000 > /sys/kernel/release_region"
-+ *
-+ * will release 256MB starting at 1GB.
-+ */
-+static ssize_t store_release_region(struct kobject *kobj,
-+ struct kobj_attribute *attr,
-+ const char *buf, size_t count)
-+{
-+ unsigned long start_addr, length, end_addr;
-+ unsigned long start_pfn, nr_pages;
-+ ssize_t ret;
-+
-+ ret = sscanf(buf, "%lx %lx", &start_addr, &length);
-+ if (ret != 2)
-+ return -EINVAL;
-+
-+ track_freed_range(start_addr, length);
-+
-+ /* Range-check - don't free any reserved memory that
-+ * wasn't reserved for phyp-dump */
-+ if (start_addr < phyp_dump_info->init_reserve_start)
-+ start_addr = phyp_dump_info->init_reserve_start;
-+
-+ end_addr = phyp_dump_info->init_reserve_start +
-+ phyp_dump_info->init_reserve_size;
-+ if (start_addr+length > end_addr)
-+ length = end_addr - start_addr;
-+
-+ /* Release the region of memory assed in by user */
-+ start_pfn = PFN_DOWN(start_addr);
-+ nr_pages = PFN_DOWN(length);
-+ release_memory_range(start_pfn, nr_pages);
-+
-+ return count;
-+}
-+
-+static ssize_t show_release_region(struct kobject *kobj,
-+ struct kobj_attribute *attr, char *buf)
-+{
-+ u64 second_addr_range;
-+
-+ /* total reserved size - start of scratch area */
-+ second_addr_range = phyp_dump_info->init_reserve_size -
-+ phyp_dump_info->reserved_scratch_size;
-+ return sprintf(buf, "CPU:0x%lx-0x%lx: HPTE:0x%lx-0x%lx:"
-+ " DUMP:0x%lx-0x%lx, 0x%lx-0x%lx:\n",
-+ phdr.cpu_data.destination_address,
-+ phdr.cpu_data.length_copied,
-+ phdr.hpte_data.destination_address,
-+ phdr.hpte_data.length_copied,
-+ phdr.kernel_data.destination_address,
-+ phdr.kernel_data.length_copied,
-+ phyp_dump_info->init_reserve_start,
-+ second_addr_range);
-+}
-+
-+static struct kobj_attribute rr = __ATTR(release_region, 0600,
-+ show_release_region,
-+ store_release_region);
-+
-+static int __init phyp_dump_setup(void)
-+{
-+ struct device_node *rtas;
-+ const struct phyp_dump_header *dump_header = NULL;
-+ unsigned long dump_area_start;
-+ unsigned long dump_area_length;
-+ int header_len = 0;
-+ int rc;
-+
-+ /* If no memory was reserved in early boot, there is nothing to do */
-+ if (phyp_dump_info->init_reserve_size == 0)
-+ return 0;
-+
-+ /* Return if phyp dump not supported */
-+ if (!phyp_dump_info->phyp_dump_configured)
-+ return -ENOSYS;
-+
-+ /* Is there dump data waiting for us? If there isn't,
-+ * then register a new dump area, and release all of
-+ * the rest of the reserved ram.
-+ *
-+ * The /rtas/ibm,kernel-dump rtas node is present only
-+ * if there is dump data waiting for us.
-+ */
-+ rtas = of_find_node_by_path("/rtas");
-+ if (rtas) {
-+ dump_header = of_get_property(rtas, "ibm,kernel-dump",
-+ &header_len);
-+ of_node_put(rtas);
-+ }
-+
-+ print_dump_header(dump_header);
-+ dump_area_length = init_dump_header(&phdr);
-+ /* align down */
-+ dump_area_start = phyp_dump_info->init_reserve_start & PAGE_MASK;
-+
-+ if (dump_header == NULL) {
-+ register_dump_area(&phdr, dump_area_start);
-+ return 0;
-+ }
-+
-+ /* re-register the dump area, if old dump was invalid */
-+ if ((dump_header) && (dump_header->status & DUMP_ERROR_FLAG)) {
-+ invalidate_last_dump(&phdr, dump_area_start);
-+ register_dump_area(&phdr, dump_area_start);
-+ return 0;
-+ }
-+
-+ if (dump_header) {
-+ phyp_dump_info->reserved_scratch_addr =
-+ dump_header->cpu_data.destination_address;
-+ phyp_dump_info->reserved_scratch_size =
-+ dump_header->cpu_data.source_length +
-+ dump_header->hpte_data.source_length +
-+ dump_header->kernel_data.source_length;
-+ }
-+
-+ /* Should we create a dump_subsys, analogous to s390/ipl.c ? */
-+ rc = sysfs_create_file(kernel_kobj, &rr.attr);
-+ if (rc)
-+ printk(KERN_ERR "phyp-dump: unable to create sysfs file (%d)\n",
-+ rc);
-+
-+ /* ToDo: re-register the dump area, for next time. */
-+ return 0;
-+}
-+machine_subsys_initcall(pseries, phyp_dump_setup);
-+
-+int __init early_init_dt_scan_phyp_dump(unsigned long node,
-+ const char *uname, int depth, void *data)
-+{
-+ const unsigned int *sizes;
-+
-+ phyp_dump_info->phyp_dump_configured = 0;
-+ phyp_dump_info->phyp_dump_is_active = 0;
-+
-+ if (depth != 1 || strcmp(uname, "rtas") != 0)
-+ return 0;
-+
-+ if (of_get_flat_dt_prop(node, "ibm,configure-kernel-dump", NULL))
-+ phyp_dump_info->phyp_dump_configured++;
-+
-+ if (of_get_flat_dt_prop(node, "ibm,dump-kernel", NULL))
-+ phyp_dump_info->phyp_dump_is_active++;
-+
-+ sizes = of_get_flat_dt_prop(node, "ibm,configure-kernel-dump-sizes",
-+ NULL);
-+ if (!sizes)
-+ return 0;
-+
-+ if (sizes[0] == 1)
-+ phyp_dump_info->cpu_state_size = *((unsigned long *)&sizes[1]);
-+
-+ if (sizes[3] == 2)
-+ phyp_dump_info->hpte_region_size =
-+ *((unsigned long *)&sizes[4]);
-+ return 1;
-+}
-+
-+/* Look for phyp_dump= cmdline option */
-+static int __init early_phyp_dump_enabled(char *p)
-+{
-+ phyp_dump_info->phyp_dump_at_boot = 1;
-+
-+ if (!p)
-+ return 0;
-+
-+ if (strncmp(p, "1", 1) == 0)
-+ phyp_dump_info->phyp_dump_at_boot = 1;
-+ else if (strncmp(p, "0", 1) == 0)
-+ phyp_dump_info->phyp_dump_at_boot = 0;
-+
-+ return 0;
-+}
-+early_param("phyp_dump", early_phyp_dump_enabled);
-+
-+/* Look for phyp_dump_reserve_size= cmdline option */
-+static int __init early_phyp_dump_reserve_size(char *p)
-+{
-+ if (p)
-+ phyp_dump_info->reserve_bootvar = memparse(p, &p);
-+
-+ return 0;
-+}
-+early_param("phyp_dump_reserve_size", early_phyp_dump_reserve_size);
---- a/arch/powerpc/platforms/pseries/pseries.h
-+++ b/arch/powerpc/platforms/pseries/pseries.h
-@@ -38,4 +38,6 @@ extern void pSeries_final_fixup(void);
- /* Poweron flag used for enabling auto ups restart */
- extern unsigned long rtas_poweron_auto;
-
-+extern void find_udbg_vterm(void);
-+
- #endif /* _PSERIES_PSERIES_H */
---- a/arch/powerpc/platforms/pseries/reconfig.c
-+++ b/arch/powerpc/platforms/pseries/reconfig.c
-@@ -222,14 +222,14 @@ static char * parse_next_property(char *
- tmp = strchr(buf, ' ');
- if (!tmp) {
- printk(KERN_ERR "property parse failed in %s at line %d\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- return NULL;
- }
- *tmp = '\0';
-
- if (++tmp >= end) {
- printk(KERN_ERR "property parse failed in %s at line %d\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- return NULL;
- }
-
-@@ -238,12 +238,12 @@ static char * parse_next_property(char *
- *length = simple_strtoul(tmp, &tmp, 10);
- if (*length == -1) {
- printk(KERN_ERR "property parse failed in %s at line %d\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- return NULL;
- }
- if (*tmp != ' ' || ++tmp >= end) {
- printk(KERN_ERR "property parse failed in %s at line %d\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- return NULL;
- }
-
-@@ -252,12 +252,12 @@ static char * parse_next_property(char *
- tmp += *length;
- if (tmp > end) {
- printk(KERN_ERR "property parse failed in %s at line %d\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- return NULL;
- }
- else if (tmp < end && *tmp != ' ' && *tmp != '\0') {
- printk(KERN_ERR "property parse failed in %s at line %d\n",
-- __FUNCTION__, __LINE__);
-+ __func__, __LINE__);
- return NULL;
- }
- tmp++;
---- a/arch/powerpc/platforms/pseries/scanlog.c
-+++ b/arch/powerpc/platforms/pseries/scanlog.c
-@@ -195,31 +195,30 @@ const struct file_operations scanlog_fop
- static int __init scanlog_init(void)
- {
- struct proc_dir_entry *ent;
-+ void *data;
-+ int err = -ENOMEM;
-
- ibm_scan_log_dump = rtas_token("ibm,scan-log-dump");
-- if (ibm_scan_log_dump == RTAS_UNKNOWN_SERVICE) {
-- printk(KERN_ERR "scan-log-dump not implemented on this system\n");
-- return -EIO;
-- }
-+ if (ibm_scan_log_dump == RTAS_UNKNOWN_SERVICE)
-+ return -ENODEV;
-
-- ent = create_proc_entry("ppc64/rtas/scan-log-dump", S_IRUSR, NULL);
-- if (ent) {
-- ent->proc_fops = &scanlog_fops;
-- /* Ideally we could allocate a buffer < 4G */
-- ent->data = kmalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL);
-- if (!ent->data) {
-- printk(KERN_ERR "Failed to allocate a buffer\n");
-- remove_proc_entry("scan-log-dump", ent->parent);
-- return -ENOMEM;
-- }
-- ((unsigned int *)ent->data)[0] = 0;
-- } else {
-- printk(KERN_ERR "Failed to create ppc64/scan-log-dump proc entry\n");
-- return -EIO;
-- }
-+ /* Ideally we could allocate a buffer < 4G */
-+ data = kzalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL);
-+ if (!data)
-+ goto err;
-+
-+ ent = proc_create("ppc64/rtas/scan-log-dump", S_IRUSR, NULL,
-+ &scanlog_fops);
-+ if (!ent)
-+ goto err;
-+
-+ ent->data = data;
- proc_ppc64_scan_log_dump = ent;
-
- return 0;
-+err:
-+ kfree(data);
-+ return err;
- }
-
- static void __exit scanlog_cleanup(void)
---- a/arch/powerpc/platforms/pseries/setup.c
-+++ b/arch/powerpc/platforms/pseries/setup.c
-@@ -76,9 +76,6 @@
- #define DBG(fmt...)
- #endif
-
--/* move those away to a .h */
--extern void find_udbg_vterm(void);
--
- int fwnmi_active; /* TRUE if an FWNMI handler is present */
-
- static void pseries_shared_idle_sleep(void);
-@@ -127,14 +124,60 @@ void pseries_8259_cascade(unsigned int i
- desc->chip->eoi(irq);
- }
-
--static void __init pseries_mpic_init_IRQ(void)
-+static void __init pseries_setup_i8259_cascade(void)
- {
-- struct device_node *np, *old, *cascade = NULL;
-- const unsigned int *addrp;
-+ struct device_node *np, *old, *found = NULL;
-+ unsigned int cascade;
-+ const u32 *addrp;
- unsigned long intack = 0;
-+ int naddr;
-+
-+ for_each_node_by_type(np, "interrupt-controller") {
-+ if (of_device_is_compatible(np, "chrp,iic")) {
-+ found = np;
-+ break;
-+ }
-+ }
-+
-+ if (found == NULL) {
-+ printk(KERN_DEBUG "pic: no ISA interrupt controller\n");
-+ return;
-+ }
-+
-+ cascade = irq_of_parse_and_map(found, 0);
-+ if (cascade == NO_IRQ) {
-+ printk(KERN_ERR "pic: failed to map cascade interrupt");
-+ return;
-+ }
-+ pr_debug("pic: cascade mapped to irq %d\n", cascade);
-+
-+ for (old = of_node_get(found); old != NULL ; old = np) {
-+ np = of_get_parent(old);
-+ of_node_put(old);
-+ if (np == NULL)
-+ break;
-+ if (strcmp(np->name, "pci") != 0)
-+ continue;
-+ addrp = of_get_property(np, "8259-interrupt-acknowledge", NULL);
-+ if (addrp == NULL)
-+ continue;
-+ naddr = of_n_addr_cells(np);
-+ intack = addrp[naddr-1];
-+ if (naddr > 1)
-+ intack |= ((unsigned long)addrp[naddr-2]) << 32;
-+ }
-+ if (intack)
-+ printk(KERN_DEBUG "pic: PCI 8259 intack at 0x%016lx\n", intack);
-+ i8259_init(found, intack);
-+ of_node_put(found);
-+ set_irq_chained_handler(cascade, pseries_8259_cascade);
-+}
-+
-+static void __init pseries_mpic_init_IRQ(void)
-+{
-+ struct device_node *np;
- const unsigned int *opprop;
- unsigned long openpic_addr = 0;
-- unsigned int cascade_irq;
- int naddr, n, i, opplen;
- struct mpic *mpic;
-
-@@ -167,43 +210,13 @@ static void __init pseries_mpic_init_IRQ
- mpic_init(mpic);
-
- /* Look for cascade */
-- for_each_node_by_type(np, "interrupt-controller")
-- if (of_device_is_compatible(np, "chrp,iic")) {
-- cascade = np;
-- break;
-- }
-- if (cascade == NULL)
-- return;
--
-- cascade_irq = irq_of_parse_and_map(cascade, 0);
-- if (cascade_irq == NO_IRQ) {
-- printk(KERN_ERR "mpic: failed to map cascade interrupt");
-- return;
-- }
-+ pseries_setup_i8259_cascade();
-+}
-
-- /* Check ACK type */
-- for (old = of_node_get(cascade); old != NULL ; old = np) {
-- np = of_get_parent(old);
-- of_node_put(old);
-- if (np == NULL)
-- break;
-- if (strcmp(np->name, "pci") != 0)
-- continue;
-- addrp = of_get_property(np, "8259-interrupt-acknowledge",
-- NULL);
-- if (addrp == NULL)
-- continue;
-- naddr = of_n_addr_cells(np);
-- intack = addrp[naddr-1];
-- if (naddr > 1)
-- intack |= ((unsigned long)addrp[naddr-2]) << 32;
-- }
-- if (intack)
-- printk(KERN_DEBUG "mpic: PCI 8259 intack at 0x%016lx\n",
-- intack);
-- i8259_init(cascade, intack);
-- of_node_put(cascade);
-- set_irq_chained_handler(cascade_irq, pseries_8259_cascade);
-+static void __init pseries_xics_init_IRQ(void)
-+{
-+ xics_init_IRQ();
-+ pseries_setup_i8259_cascade();
- }
-
- static void pseries_lpar_enable_pmcs(void)
-@@ -235,7 +248,7 @@ static void __init pseries_discover_pic(
- smp_init_pseries_mpic();
- return;
- } else if (strstr(typep, "ppc-xicp")) {
-- ppc_md.init_IRQ = xics_init_IRQ;
-+ ppc_md.init_IRQ = pseries_xics_init_IRQ;
- setup_kexec_cpu_down_xics();
- smp_init_pseries_xics();
- return;
-@@ -393,6 +406,7 @@ static void pseries_dedicated_idle_sleep
- {
- unsigned int cpu = smp_processor_id();
- unsigned long start_snooze;
-+ unsigned long in_purr, out_purr;
-
- /*
- * Indicate to the HV that we are idle. Now would be
-@@ -400,6 +414,7 @@ static void pseries_dedicated_idle_sleep
- */
- get_lppaca()->idle = 1;
- get_lppaca()->donate_dedicated_cpu = 1;
-+ in_purr = mfspr(SPRN_PURR);
-
- /*
- * We come in with interrupts disabled, and need_resched()
-@@ -432,6 +447,8 @@ static void pseries_dedicated_idle_sleep
-
- out:
- HMT_medium();
-+ out_purr = mfspr(SPRN_PURR);
-+ get_lppaca()->wait_state_cycles += out_purr - in_purr;
- get_lppaca()->donate_dedicated_cpu = 0;
- get_lppaca()->idle = 0;
- }
---- a/arch/powerpc/platforms/pseries/xics.c
-+++ b/arch/powerpc/platforms/pseries/xics.c
-@@ -516,6 +516,8 @@ static struct irq_chip xics_pic_lpar = {
- .set_affinity = xics_set_affinity
- };
-
-+/* Points to the irq_chip we're actually using */
-+static struct irq_chip *xics_irq_chip;
-
- static int xics_host_match(struct irq_host *h, struct device_node *node)
- {
-@@ -526,23 +528,13 @@ static int xics_host_match(struct irq_ho
- return !of_device_is_compatible(node, "chrp,iic");
- }
-
--static int xics_host_map_direct(struct irq_host *h, unsigned int virq,
-- irq_hw_number_t hw)
-+static int xics_host_map(struct irq_host *h, unsigned int virq,
-+ irq_hw_number_t hw)
- {
-- pr_debug("xics: map_direct virq %d, hwirq 0x%lx\n", virq, hw);
-+ pr_debug("xics: map virq %d, hwirq 0x%lx\n", virq, hw);
-
- get_irq_desc(virq)->status |= IRQ_LEVEL;
-- set_irq_chip_and_handler(virq, &xics_pic_direct, handle_fasteoi_irq);
-- return 0;
--}
--
--static int xics_host_map_lpar(struct irq_host *h, unsigned int virq,
-- irq_hw_number_t hw)
--{
-- pr_debug("xics: map_direct virq %d, hwirq 0x%lx\n", virq, hw);
--
-- get_irq_desc(virq)->status |= IRQ_LEVEL;
-- set_irq_chip_and_handler(virq, &xics_pic_lpar, handle_fasteoi_irq);
-+ set_irq_chip_and_handler(virq, xics_irq_chip, handle_fasteoi_irq);
- return 0;
- }
-
-@@ -561,27 +553,20 @@ static int xics_host_xlate(struct irq_ho
- return 0;
- }
-
--static struct irq_host_ops xics_host_direct_ops = {
-- .match = xics_host_match,
-- .map = xics_host_map_direct,
-- .xlate = xics_host_xlate,
--};
--
--static struct irq_host_ops xics_host_lpar_ops = {
-+static struct irq_host_ops xics_host_ops = {
- .match = xics_host_match,
-- .map = xics_host_map_lpar,
-+ .map = xics_host_map,
- .xlate = xics_host_xlate,
- };
-
- static void __init xics_init_host(void)
- {
-- struct irq_host_ops *ops;
--
- if (firmware_has_feature(FW_FEATURE_LPAR))
-- ops = &xics_host_lpar_ops;
-+ xics_irq_chip = &xics_pic_lpar;
- else
-- ops = &xics_host_direct_ops;
-- xics_host = irq_alloc_host(NULL, IRQ_HOST_MAP_TREE, 0, ops,
-+ xics_irq_chip = &xics_pic_direct;
-+
-+ xics_host = irq_alloc_host(NULL, IRQ_HOST_MAP_TREE, 0, &xics_host_ops,
- XICS_IRQ_SPURIOUS);
- BUG_ON(xics_host == NULL);
- irq_set_default_host(xics_host);
-@@ -655,52 +640,6 @@ static void __init xics_init_one_node(st
- }
- }
-
--
--static void __init xics_setup_8259_cascade(void)
--{
-- struct device_node *np, *old, *found = NULL;
-- int cascade, naddr;
-- const u32 *addrp;
-- unsigned long intack = 0;
--
-- for_each_node_by_type(np, "interrupt-controller")
-- if (of_device_is_compatible(np, "chrp,iic")) {
-- found = np;
-- break;
-- }
-- if (found == NULL) {
-- printk(KERN_DEBUG "xics: no ISA interrupt controller\n");
-- return;
-- }
-- cascade = irq_of_parse_and_map(found, 0);
-- if (cascade == NO_IRQ) {
-- printk(KERN_ERR "xics: failed to map cascade interrupt");
-- return;
-- }
-- pr_debug("xics: cascade mapped to irq %d\n", cascade);
--
-- for (old = of_node_get(found); old != NULL ; old = np) {
-- np = of_get_parent(old);
-- of_node_put(old);
-- if (np == NULL)
-- break;
-- if (strcmp(np->name, "pci") != 0)
-- continue;
-- addrp = of_get_property(np, "8259-interrupt-acknowledge", NULL);
-- if (addrp == NULL)
-- continue;
-- naddr = of_n_addr_cells(np);
-- intack = addrp[naddr-1];
-- if (naddr > 1)
-- intack |= ((unsigned long)addrp[naddr-2]) << 32;
-- }
-- if (intack)
-- printk(KERN_DEBUG "xics: PCI 8259 intack at 0x%016lx\n", intack);
-- i8259_init(found, intack);
-- of_node_put(found);
-- set_irq_chained_handler(cascade, pseries_8259_cascade);
--}
--
- void __init xics_init_IRQ(void)
- {
- struct device_node *np;
-@@ -733,8 +672,6 @@ void __init xics_init_IRQ(void)
-
- xics_setup_cpu();
-
-- xics_setup_8259_cascade();
--
- ppc64_boot_msg(0x21, "XICS Done");
- }
-
---- a/arch/powerpc/platforms/pseries/xics.h
-+++ b/arch/powerpc/platforms/pseries/xics.h
-@@ -28,7 +28,4 @@ struct xics_ipi_struct {
-
- extern struct xics_ipi_struct xics_ipi_message[NR_CPUS] __cacheline_aligned;
-
--struct irq_desc;
--extern void pseries_8259_cascade(unsigned int irq, struct irq_desc *desc);
--
- #endif /* _POWERPC_KERNEL_XICS_H */
---- a/arch/powerpc/sysdev/Makefile
-+++ b/arch/powerpc/sysdev/Makefile
-@@ -12,6 +12,7 @@ obj-$(CONFIG_U3_DART) += dart_iommu.o
- obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o
- obj-$(CONFIG_FSL_SOC) += fsl_soc.o
- obj-$(CONFIG_FSL_PCI) += fsl_pci.o
-+obj-$(CONFIG_FSL_LBC) += fsl_lbc.o
- obj-$(CONFIG_RAPIDIO) += fsl_rio.o
- obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o
- obj-$(CONFIG_QUICC_ENGINE) += qe_lib/
-@@ -27,6 +28,7 @@ obj-$(CONFIG_PPC_INDIRECT_PCI) += indire
- obj-$(CONFIG_PPC_I8259) += i8259.o
- obj-$(CONFIG_IPIC) += ipic.o
- obj-$(CONFIG_4xx) += uic.o
-+obj-$(CONFIG_4xx_SOC) += ppc4xx_soc.o
- obj-$(CONFIG_XILINX_VIRTEX) += xilinx_intc.o
- obj-$(CONFIG_OF_RTC) += of_rtc.o
- ifeq ($(CONFIG_PCI),y)
---- a/arch/powerpc/sysdev/cpm1.c
-+++ b/arch/powerpc/sysdev/cpm1.c
-@@ -44,9 +44,6 @@
-
- #define CPM_MAP_SIZE (0x4000)
-
--#ifndef CONFIG_PPC_CPM_NEW_BINDING
--static void m8xx_cpm_dpinit(void);
--#endif
- cpm8xx_t __iomem *cpmp; /* Pointer to comm processor space */
- immap_t __iomem *mpc8xx_immr;
- static cpic8xx_t __iomem *cpic_reg;
-@@ -229,12 +226,7 @@ void __init cpm_reset(void)
- out_be32(&siu_conf->sc_sdcr, 1);
- immr_unmap(siu_conf);
-
--#ifdef CONFIG_PPC_CPM_NEW_BINDING
- cpm_muram_init();
--#else
-- /* Reclaim the DP memory for our use. */
-- m8xx_cpm_dpinit();
--#endif
- }
-
- static DEFINE_SPINLOCK(cmd_lock);
-@@ -257,7 +249,7 @@ int cpm_command(u32 command, u8 opcode)
- if ((in_be16(&cpmp->cp_cpcr) & CPM_CR_FLG) == 0)
- goto out;
-
-- printk(KERN_ERR "%s(): Not able to issue CPM command\n", __FUNCTION__);
-+ printk(KERN_ERR "%s(): Not able to issue CPM command\n", __func__);
- ret = -EIO;
- out:
- spin_unlock_irqrestore(&cmd_lock, flags);
-@@ -293,110 +285,6 @@ cpm_setbrg(uint brg, uint rate)
- CPM_BRG_EN | CPM_BRG_DIV16);
- }
-
--#ifndef CONFIG_PPC_CPM_NEW_BINDING
--/*
-- * dpalloc / dpfree bits.
-- */
--static spinlock_t cpm_dpmem_lock;
--/*
-- * 16 blocks should be enough to satisfy all requests
-- * until the memory subsystem goes up...
-- */
--static rh_block_t cpm_boot_dpmem_rh_block[16];
--static rh_info_t cpm_dpmem_info;
--
--#define CPM_DPMEM_ALIGNMENT 8
--static u8 __iomem *dpram_vbase;
--static phys_addr_t dpram_pbase;
--
--static void m8xx_cpm_dpinit(void)
--{
-- spin_lock_init(&cpm_dpmem_lock);
--
-- dpram_vbase = cpmp->cp_dpmem;
-- dpram_pbase = get_immrbase() + offsetof(immap_t, im_cpm.cp_dpmem);
--
-- /* Initialize the info header */
-- rh_init(&cpm_dpmem_info, CPM_DPMEM_ALIGNMENT,
-- sizeof(cpm_boot_dpmem_rh_block) /
-- sizeof(cpm_boot_dpmem_rh_block[0]),
-- cpm_boot_dpmem_rh_block);
--
-- /*
-- * Attach the usable dpmem area.
-- * XXX: This is actually crap. CPM_DATAONLY_BASE and
-- * CPM_DATAONLY_SIZE are a subset of the available dparm. It varies
-- * with the processor and the microcode patches applied / activated.
-- * But the following should be at least safe.
-- */
-- rh_attach_region(&cpm_dpmem_info, CPM_DATAONLY_BASE, CPM_DATAONLY_SIZE);
--}
--
--/*
-- * Allocate the requested size worth of DP memory.
-- * This function returns an offset into the DPRAM area.
-- * Use cpm_dpram_addr() to get the virtual address of the area.
-- */
--unsigned long cpm_dpalloc(uint size, uint align)
--{
-- unsigned long start;
-- unsigned long flags;
--
-- spin_lock_irqsave(&cpm_dpmem_lock, flags);
-- cpm_dpmem_info.alignment = align;
-- start = rh_alloc(&cpm_dpmem_info, size, "commproc");
-- spin_unlock_irqrestore(&cpm_dpmem_lock, flags);
--
-- return (uint)start;
--}
--EXPORT_SYMBOL(cpm_dpalloc);
--
--int cpm_dpfree(unsigned long offset)
--{
-- int ret;
-- unsigned long flags;
--
-- spin_lock_irqsave(&cpm_dpmem_lock, flags);
-- ret = rh_free(&cpm_dpmem_info, offset);
-- spin_unlock_irqrestore(&cpm_dpmem_lock, flags);
--
-- return ret;
--}
--EXPORT_SYMBOL(cpm_dpfree);
--
--unsigned long cpm_dpalloc_fixed(unsigned long offset, uint size, uint align)
--{
-- unsigned long start;
-- unsigned long flags;
--
-- spin_lock_irqsave(&cpm_dpmem_lock, flags);
-- cpm_dpmem_info.alignment = align;
-- start = rh_alloc_fixed(&cpm_dpmem_info, offset, size, "commproc");
-- spin_unlock_irqrestore(&cpm_dpmem_lock, flags);
--
-- return start;
--}
--EXPORT_SYMBOL(cpm_dpalloc_fixed);
--
--void cpm_dpdump(void)
--{
-- rh_dump(&cpm_dpmem_info);
--}
--EXPORT_SYMBOL(cpm_dpdump);
--
--void *cpm_dpram_addr(unsigned long offset)
--{
-- return (void *)(dpram_vbase + offset);
--}
--EXPORT_SYMBOL(cpm_dpram_addr);
--
--uint cpm_dpram_phys(u8 *addr)
--{
-- return (dpram_pbase + (uint)(addr - dpram_vbase));
--}
--EXPORT_SYMBOL(cpm_dpram_phys);
--#endif /* !CONFIG_PPC_CPM_NEW_BINDING */
--
- struct cpm_ioport16 {
- __be16 dir, par, odr_sor, dat, intr;
- __be16 res[3];
---- a/arch/powerpc/sysdev/cpm2.c
-+++ b/arch/powerpc/sysdev/cpm2.c
-@@ -46,10 +46,6 @@
-
- #include <sysdev/fsl_soc.h>
-
--#ifndef CONFIG_PPC_CPM_NEW_BINDING
--static void cpm2_dpinit(void);
--#endif
--
- cpm_cpm2_t __iomem *cpmp; /* Pointer to comm processor space */
-
- /* We allocate this here because it is used almost exclusively for
-@@ -71,15 +67,17 @@ void __init cpm2_reset(void)
-
- /* Reclaim the DP memory for our use.
- */
--#ifdef CONFIG_PPC_CPM_NEW_BINDING
- cpm_muram_init();
--#else
-- cpm2_dpinit();
--#endif
-
- /* Tell everyone where the comm processor resides.
- */
- cpmp = &cpm2_immr->im_cpm;
-+
-+#ifndef CONFIG_PPC_EARLY_DEBUG_CPM
-+ /* Reset the CPM.
-+ */
-+ cpm_command(CPM_CR_RST, 0);
-+#endif
- }
-
- static DEFINE_SPINLOCK(cmd_lock);
-@@ -99,7 +97,7 @@ int cpm_command(u32 command, u8 opcode)
- if ((in_be32(&cpmp->cp_cpcr) & CPM_CR_FLG) == 0)
- goto out;
-
-- printk(KERN_ERR "%s(): Not able to issue CPM command\n", __FUNCTION__);
-+ printk(KERN_ERR "%s(): Not able to issue CPM command\n", __func__);
- ret = -EIO;
- out:
- spin_unlock_irqrestore(&cmd_lock, flags);
-@@ -347,95 +345,6 @@ int cpm2_smc_clk_setup(enum cpm_clk_targ
- return ret;
- }
-
--#ifndef CONFIG_PPC_CPM_NEW_BINDING
--/*
-- * dpalloc / dpfree bits.
-- */
--static spinlock_t cpm_dpmem_lock;
--/* 16 blocks should be enough to satisfy all requests
-- * until the memory subsystem goes up... */
--static rh_block_t cpm_boot_dpmem_rh_block[16];
--static rh_info_t cpm_dpmem_info;
--static u8 __iomem *im_dprambase;
--
--static void cpm2_dpinit(void)
--{
-- spin_lock_init(&cpm_dpmem_lock);
--
-- /* initialize the info header */
-- rh_init(&cpm_dpmem_info, 1,
-- sizeof(cpm_boot_dpmem_rh_block) /
-- sizeof(cpm_boot_dpmem_rh_block[0]),
-- cpm_boot_dpmem_rh_block);
--
-- im_dprambase = cpm2_immr;
--
-- /* Attach the usable dpmem area */
-- /* XXX: This is actually crap. CPM_DATAONLY_BASE and
-- * CPM_DATAONLY_SIZE is only a subset of the available dpram. It
-- * varies with the processor and the microcode patches activated.
-- * But the following should be at least safe.
-- */
-- rh_attach_region(&cpm_dpmem_info, CPM_DATAONLY_BASE, CPM_DATAONLY_SIZE);
--}
--
--/* This function returns an index into the DPRAM area.
-- */
--unsigned long cpm_dpalloc(uint size, uint align)
--{
-- unsigned long start;
-- unsigned long flags;
--
-- spin_lock_irqsave(&cpm_dpmem_lock, flags);
-- cpm_dpmem_info.alignment = align;
-- start = rh_alloc(&cpm_dpmem_info, size, "commproc");
-- spin_unlock_irqrestore(&cpm_dpmem_lock, flags);
--
-- return (uint)start;
--}
--EXPORT_SYMBOL(cpm_dpalloc);
--
--int cpm_dpfree(unsigned long offset)
--{
-- int ret;
-- unsigned long flags;
--
-- spin_lock_irqsave(&cpm_dpmem_lock, flags);
-- ret = rh_free(&cpm_dpmem_info, offset);
-- spin_unlock_irqrestore(&cpm_dpmem_lock, flags);
--
-- return ret;
--}
--EXPORT_SYMBOL(cpm_dpfree);
--
--/* not sure if this is ever needed */
--unsigned long cpm_dpalloc_fixed(unsigned long offset, uint size, uint align)
--{
-- unsigned long start;
-- unsigned long flags;
--
-- spin_lock_irqsave(&cpm_dpmem_lock, flags);
-- cpm_dpmem_info.alignment = align;
-- start = rh_alloc_fixed(&cpm_dpmem_info, offset, size, "commproc");
-- spin_unlock_irqrestore(&cpm_dpmem_lock, flags);
--
-- return start;
--}
--EXPORT_SYMBOL(cpm_dpalloc_fixed);
--
--void cpm_dpdump(void)
--{
-- rh_dump(&cpm_dpmem_info);
--}
--EXPORT_SYMBOL(cpm_dpdump);
--
--void *cpm_dpram_addr(unsigned long offset)
--{
-- return (void *)(im_dprambase + offset);
--}
--EXPORT_SYMBOL(cpm_dpram_addr);
--#endif /* !CONFIG_PPC_CPM_NEW_BINDING */
--
- struct cpm2_ioports {
- u32 dir, par, sor, odr, dat;
- u32 res[3];
---- a/arch/powerpc/sysdev/cpm_common.c
-+++ b/arch/powerpc/sysdev/cpm_common.c
-@@ -58,7 +58,6 @@ void __init udbg_init_cpm(void)
- }
- #endif
-
--#ifdef CONFIG_PPC_CPM_NEW_BINDING
- static spinlock_t cpm_muram_lock;
- static rh_block_t cpm_boot_muram_rh_block[16];
- static rh_info_t cpm_muram_info;
-@@ -199,5 +198,3 @@ dma_addr_t cpm_muram_dma(void __iomem *a
- return muram_pbase + ((u8 __iomem *)addr - muram_vbase);
- }
- EXPORT_SYMBOL(cpm_muram_dma);
--
--#endif /* CONFIG_PPC_CPM_NEW_BINDING */
---- a/arch/powerpc/sysdev/dart_iommu.c
-+++ b/arch/powerpc/sysdev/dart_iommu.c
-@@ -37,6 +37,7 @@
- #include <linux/dma-mapping.h>
- #include <linux/vmalloc.h>
- #include <linux/suspend.h>
-+#include <linux/lmb.h>
- #include <asm/io.h>
- #include <asm/prom.h>
- #include <asm/iommu.h>
-@@ -44,7 +45,6 @@
- #include <asm/machdep.h>
- #include <asm/abs_addr.h>
- #include <asm/cacheflush.h>
--#include <asm/lmb.h>
- #include <asm/ppc-pci.h>
-
- #include "dart.h"
---- /dev/null
-+++ b/arch/powerpc/sysdev/fsl_lbc.c
-@@ -0,0 +1,129 @@
-+/*
-+ * Freescale LBC and UPM routines.
-+ *
-+ * Copyright (c) 2007-2008 MontaVista Software, Inc.
-+ *
-+ * Author: Anton Vorontsov <avorontsov@ru.mvista.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/kernel.h>
-+#include <linux/of.h>
-+#include <asm/fsl_lbc.h>
-+
-+spinlock_t fsl_lbc_lock = __SPIN_LOCK_UNLOCKED(fsl_lbc_lock);
-+
-+struct fsl_lbc_regs __iomem *fsl_lbc_regs;
-+EXPORT_SYMBOL(fsl_lbc_regs);
-+
-+static char __initdata *compat_lbc[] = {
-+ "fsl,pq2-localbus",
-+ "fsl,pq2pro-localbus",
-+ "fsl,pq3-localbus",
-+ "fsl,elbc",
-+};
-+
-+static int __init fsl_lbc_init(void)
-+{
-+ struct device_node *lbus;
-+ int i;
-+
-+ for (i = 0; i < ARRAY_SIZE(compat_lbc); i++) {
-+ lbus = of_find_compatible_node(NULL, NULL, compat_lbc[i]);
-+ if (lbus)
-+ goto found;
-+ }
-+ return -ENODEV;
-+
-+found:
-+ fsl_lbc_regs = of_iomap(lbus, 0);
-+ of_node_put(lbus);
-+ if (!fsl_lbc_regs)
-+ return -ENOMEM;
-+ return 0;
-+}
-+arch_initcall(fsl_lbc_init);
-+
-+/**
-+ * fsl_lbc_find - find Localbus bank
-+ * @addr_base: base address of the memory bank
-+ *
-+ * This function walks LBC banks comparing "Base address" field of the BR
-+ * registers with the supplied addr_base argument. When bases match this
-+ * function returns bank number (starting with 0), otherwise it returns
-+ * appropriate errno value.
-+ */
-+int fsl_lbc_find(phys_addr_t addr_base)
-+{
-+ int i;
-+
-+ if (!fsl_lbc_regs)
-+ return -ENODEV;
-+
-+ for (i = 0; i < ARRAY_SIZE(fsl_lbc_regs->bank); i++) {
-+ __be32 br = in_be32(&fsl_lbc_regs->bank[i].br);
-+ __be32 or = in_be32(&fsl_lbc_regs->bank[i].or);
-+
-+ if (br & BR_V && (br & or & BR_BA) == addr_base)
-+ return i;
-+ }
-+
-+ return -ENOENT;
-+}
-+EXPORT_SYMBOL(fsl_lbc_find);
-+
-+/**
-+ * fsl_upm_find - find pre-programmed UPM via base address
-+ * @addr_base: base address of the memory bank controlled by the UPM
-+ * @upm: pointer to the allocated fsl_upm structure
-+ *
-+ * This function fills fsl_upm structure so you can use it with the rest of
-+ * UPM API. On success this function returns 0, otherwise it returns
-+ * appropriate errno value.
-+ */
-+int fsl_upm_find(phys_addr_t addr_base, struct fsl_upm *upm)
-+{
-+ int bank;
-+ __be32 br;
-+
-+ bank = fsl_lbc_find(addr_base);
-+ if (bank < 0)
-+ return bank;
-+
-+ br = in_be32(&fsl_lbc_regs->bank[bank].br);
-+
-+ switch (br & BR_MSEL) {
-+ case BR_MS_UPMA:
-+ upm->mxmr = &fsl_lbc_regs->mamr;
-+ break;
-+ case BR_MS_UPMB:
-+ upm->mxmr = &fsl_lbc_regs->mbmr;
-+ break;
-+ case BR_MS_UPMC:
-+ upm->mxmr = &fsl_lbc_regs->mcmr;
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-+
-+ switch (br & BR_PS) {
-+ case BR_PS_8:
-+ upm->width = 8;
-+ break;
-+ case BR_PS_16:
-+ upm->width = 16;
-+ break;
-+ case BR_PS_32:
-+ upm->width = 32;
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL(fsl_upm_find);
---- a/arch/powerpc/sysdev/fsl_soc.c
-+++ b/arch/powerpc/sysdev/fsl_soc.c
-@@ -75,6 +75,33 @@ phys_addr_t get_immrbase(void)
-
- EXPORT_SYMBOL(get_immrbase);
-
-+static u32 sysfreq = -1;
-+
-+u32 fsl_get_sys_freq(void)
-+{
-+ struct device_node *soc;
-+ const u32 *prop;
-+ int size;
-+
-+ if (sysfreq != -1)
-+ return sysfreq;
-+
-+ soc = of_find_node_by_type(NULL, "soc");
-+ if (!soc)
-+ return -1;
-+
-+ prop = of_get_property(soc, "clock-frequency", &size);
-+ if (!prop || size != sizeof(*prop) || *prop == 0)
-+ prop = of_get_property(soc, "bus-frequency", &size);
-+
-+ if (prop && size == sizeof(*prop))
-+ sysfreq = *prop;
-+
-+ of_node_put(soc);
-+ return sysfreq;
-+}
-+EXPORT_SYMBOL(fsl_get_sys_freq);
-+
- #if defined(CONFIG_CPM2) || defined(CONFIG_QUICC_ENGINE) || defined(CONFIG_8xx)
-
- static u32 brgfreq = -1;
-@@ -516,9 +543,9 @@ arch_initcall(fsl_i2c_of_init);
- static int __init mpc83xx_wdt_init(void)
- {
- struct resource r;
-- struct device_node *soc, *np;
-+ struct device_node *np;
- struct platform_device *dev;
-- const unsigned int *freq;
-+ u32 freq = fsl_get_sys_freq();
- int ret;
-
- np = of_find_compatible_node(NULL, "watchdog", "mpc83xx_wdt");
-@@ -528,19 +555,6 @@ static int __init mpc83xx_wdt_init(void)
- goto nodev;
- }
-
-- soc = of_find_node_by_type(NULL, "soc");
--
-- if (!soc) {
-- ret = -ENODEV;
-- goto nosoc;
-- }
--
-- freq = of_get_property(soc, "bus-frequency", NULL);
-- if (!freq) {
-- ret = -ENODEV;
-- goto err;
-- }
--
- memset(&r, 0, sizeof(r));
-
- ret = of_address_to_resource(np, 0, &r);
-@@ -553,20 +567,16 @@ static int __init mpc83xx_wdt_init(void)
- goto err;
- }
-
-- ret = platform_device_add_data(dev, freq, sizeof(int));
-+ ret = platform_device_add_data(dev, &freq, sizeof(freq));
- if (ret)
- goto unreg;
-
-- of_node_put(soc);
- of_node_put(np);
--
- return 0;
-
- unreg:
- platform_device_unregister(dev);
- err:
-- of_node_put(soc);
--nosoc:
- of_node_put(np);
- nodev:
- return ret;
-@@ -735,547 +745,6 @@ err:
-
- arch_initcall(fsl_usb_of_init);
-
--#ifndef CONFIG_PPC_CPM_NEW_BINDING
--#ifdef CONFIG_CPM2
--
--extern void init_scc_ioports(struct fs_uart_platform_info*);
--
--static const char fcc_regs[] = "fcc_regs";
--static const char fcc_regs_c[] = "fcc_regs_c";
--static const char fcc_pram[] = "fcc_pram";
--static char bus_id[9][BUS_ID_SIZE];
--
--static int __init fs_enet_of_init(void)
--{
-- struct device_node *np;
-- unsigned int i;
-- struct platform_device *fs_enet_dev;
-- struct resource res;
-- int ret;
--
-- for (np = NULL, i = 0;
-- (np = of_find_compatible_node(np, "network", "fs_enet")) != NULL;
-- i++) {
-- struct resource r[4];
-- struct device_node *phy, *mdio;
-- struct fs_platform_info fs_enet_data;
-- const unsigned int *id, *phy_addr, *phy_irq;
-- const void *mac_addr;
-- const phandle *ph;
-- const char *model;
--
-- memset(r, 0, sizeof(r));
-- memset(&fs_enet_data, 0, sizeof(fs_enet_data));
--
-- ret = of_address_to_resource(np, 0, &r[0]);
-- if (ret)
-- goto err;
-- r[0].name = fcc_regs;
--
-- ret = of_address_to_resource(np, 1, &r[1]);
-- if (ret)
-- goto err;
-- r[1].name = fcc_pram;
--
-- ret = of_address_to_resource(np, 2, &r[2]);
-- if (ret)
-- goto err;
-- r[2].name = fcc_regs_c;
-- fs_enet_data.fcc_regs_c = r[2].start;
--
-- of_irq_to_resource(np, 0, &r[3]);
--
-- fs_enet_dev =
-- platform_device_register_simple("fsl-cpm-fcc", i, &r[0], 4);
--
-- if (IS_ERR(fs_enet_dev)) {
-- ret = PTR_ERR(fs_enet_dev);
-- goto err;
-- }
--
-- model = of_get_property(np, "model", NULL);
-- if (model == NULL) {
-- ret = -ENODEV;
-- goto unreg;
-- }
--
-- mac_addr = of_get_mac_address(np);
-- if (mac_addr)
-- memcpy(fs_enet_data.macaddr, mac_addr, 6);
--
-- ph = of_get_property(np, "phy-handle", NULL);
-- phy = of_find_node_by_phandle(*ph);
--
-- if (phy == NULL) {
-- ret = -ENODEV;
-- goto unreg;
-- }
--
-- phy_addr = of_get_property(phy, "reg", NULL);
-- fs_enet_data.phy_addr = *phy_addr;
--
-- phy_irq = of_get_property(phy, "interrupts", NULL);
--
-- id = of_get_property(np, "device-id", NULL);
-- fs_enet_data.fs_no = *id;
-- strcpy(fs_enet_data.fs_type, model);
--
-- mdio = of_get_parent(phy);
-- ret = of_address_to_resource(mdio, 0, &res);
-- if (ret) {
-- of_node_put(phy);
-- of_node_put(mdio);
-- goto unreg;
-- }
--
-- fs_enet_data.clk_rx = *((u32 *)of_get_property(np,
-- "rx-clock", NULL));
-- fs_enet_data.clk_tx = *((u32 *)of_get_property(np,
-- "tx-clock", NULL));
--
-- if (strstr(model, "FCC")) {
-- int fcc_index = *id - 1;
-- const unsigned char *mdio_bb_prop;
--
-- fs_enet_data.dpram_offset = (u32)cpm_dpram_addr(0);
-- fs_enet_data.rx_ring = 32;
-- fs_enet_data.tx_ring = 32;
-- fs_enet_data.rx_copybreak = 240;
-- fs_enet_data.use_napi = 0;
-- fs_enet_data.napi_weight = 17;
-- fs_enet_data.mem_offset = FCC_MEM_OFFSET(fcc_index);
-- fs_enet_data.cp_page = CPM_CR_FCC_PAGE(fcc_index);
-- fs_enet_data.cp_block = CPM_CR_FCC_SBLOCK(fcc_index);
--
-- snprintf((char*)&bus_id[(*id)], BUS_ID_SIZE, "%x:%02x",
-- (u32)res.start, fs_enet_data.phy_addr);
-- fs_enet_data.bus_id = (char*)&bus_id[(*id)];
-- fs_enet_data.init_ioports = init_fcc_ioports;
--
-- mdio_bb_prop = of_get_property(phy, "bitbang", NULL);
-- if (mdio_bb_prop) {
-- struct platform_device *fs_enet_mdio_bb_dev;
-- struct fs_mii_bb_platform_info fs_enet_mdio_bb_data;
--
-- fs_enet_mdio_bb_dev =
-- platform_device_register_simple("fsl-bb-mdio",
-- i, NULL, 0);
-- memset(&fs_enet_mdio_bb_data, 0,
-- sizeof(struct fs_mii_bb_platform_info));
-- fs_enet_mdio_bb_data.mdio_dat.bit =
-- mdio_bb_prop[0];
-- fs_enet_mdio_bb_data.mdio_dir.bit =
-- mdio_bb_prop[1];
-- fs_enet_mdio_bb_data.mdc_dat.bit =
-- mdio_bb_prop[2];
-- fs_enet_mdio_bb_data.mdio_port =
-- mdio_bb_prop[3];
-- fs_enet_mdio_bb_data.mdc_port =
-- mdio_bb_prop[4];
-- fs_enet_mdio_bb_data.delay =
-- mdio_bb_prop[5];
--
-- fs_enet_mdio_bb_data.irq[0] = phy_irq[0];
-- fs_enet_mdio_bb_data.irq[1] = -1;
-- fs_enet_mdio_bb_data.irq[2] = -1;
-- fs_enet_mdio_bb_data.irq[3] = phy_irq[0];
-- fs_enet_mdio_bb_data.irq[31] = -1;
--
-- fs_enet_mdio_bb_data.mdio_dat.offset =
-- (u32)&cpm2_immr->im_ioport.iop_pdatc;
-- fs_enet_mdio_bb_data.mdio_dir.offset =
-- (u32)&cpm2_immr->im_ioport.iop_pdirc;
-- fs_enet_mdio_bb_data.mdc_dat.offset =
-- (u32)&cpm2_immr->im_ioport.iop_pdatc;
--
-- ret = platform_device_add_data(
-- fs_enet_mdio_bb_dev,
-- &fs_enet_mdio_bb_data,
-- sizeof(struct fs_mii_bb_platform_info));
-- if (ret)
-- goto unreg;
-- }
--
-- of_node_put(phy);
-- of_node_put(mdio);
--
-- ret = platform_device_add_data(fs_enet_dev, &fs_enet_data,
-- sizeof(struct
-- fs_platform_info));
-- if (ret)
-- goto unreg;
-- }
-- }
-- return 0;
--
--unreg:
-- platform_device_unregister(fs_enet_dev);
--err:
-- return ret;
--}
--
--arch_initcall(fs_enet_of_init);
--
--static const char scc_regs[] = "regs";
--static const char scc_pram[] = "pram";
--
--static int __init cpm_uart_of_init(void)
--{
-- struct device_node *np;
-- unsigned int i;
-- struct platform_device *cpm_uart_dev;
-- int ret;
--
-- for (np = NULL, i = 0;
-- (np = of_find_compatible_node(np, "serial", "cpm_uart")) != NULL;
-- i++) {
-- struct resource r[3];
-- struct fs_uart_platform_info cpm_uart_data;
-- const int *id;
-- const char *model;
--
-- memset(r, 0, sizeof(r));
-- memset(&cpm_uart_data, 0, sizeof(cpm_uart_data));
--
-- ret = of_address_to_resource(np, 0, &r[0]);
-- if (ret)
-- goto err;
--
-- r[0].name = scc_regs;
--
-- ret = of_address_to_resource(np, 1, &r[1]);
-- if (ret)
-- goto err;
-- r[1].name = scc_pram;
--
-- of_irq_to_resource(np, 0, &r[2]);
--
-- cpm_uart_dev =
-- platform_device_register_simple("fsl-cpm-scc:uart", i, &r[0], 3);
--
-- if (IS_ERR(cpm_uart_dev)) {
-- ret = PTR_ERR(cpm_uart_dev);
-- goto err;
-- }
--
-- id = of_get_property(np, "device-id", NULL);
-- cpm_uart_data.fs_no = *id;
--
-- model = of_get_property(np, "model", NULL);
-- strcpy(cpm_uart_data.fs_type, model);
--
-- cpm_uart_data.uart_clk = ppc_proc_freq;
--
-- cpm_uart_data.tx_num_fifo = 4;
-- cpm_uart_data.tx_buf_size = 32;
-- cpm_uart_data.rx_num_fifo = 4;
-- cpm_uart_data.rx_buf_size = 32;
-- cpm_uart_data.clk_rx = *((u32 *)of_get_property(np,
-- "rx-clock", NULL));
-- cpm_uart_data.clk_tx = *((u32 *)of_get_property(np,
-- "tx-clock", NULL));
--
-- ret =
-- platform_device_add_data(cpm_uart_dev, &cpm_uart_data,
-- sizeof(struct
-- fs_uart_platform_info));
-- if (ret)
-- goto unreg;
-- }
--
-- return 0;
--
--unreg:
-- platform_device_unregister(cpm_uart_dev);
--err:
-- return ret;
--}
--
--arch_initcall(cpm_uart_of_init);
--#endif /* CONFIG_CPM2 */
--
--#ifdef CONFIG_8xx
--
--extern void init_scc_ioports(struct fs_platform_info*);
--extern int platform_device_skip(const char *model, int id);
--
--static int __init fs_enet_mdio_of_init(void)
--{
-- struct device_node *np;
-- unsigned int i;
-- struct platform_device *mdio_dev;
-- struct resource res;
-- int ret;
--
-- for (np = NULL, i = 0;
-- (np = of_find_compatible_node(np, "mdio", "fs_enet")) != NULL;
-- i++) {
-- struct fs_mii_fec_platform_info mdio_data;
--
-- memset(&res, 0, sizeof(res));
-- memset(&mdio_data, 0, sizeof(mdio_data));
--
-- ret = of_address_to_resource(np, 0, &res);
-- if (ret)
-- goto err;
--
-- mdio_dev =
-- platform_device_register_simple("fsl-cpm-fec-mdio",
-- res.start, &res, 1);
-- if (IS_ERR(mdio_dev)) {
-- ret = PTR_ERR(mdio_dev);
-- goto err;
-- }
--
-- mdio_data.mii_speed = ((((ppc_proc_freq + 4999999) / 2500000) / 2) & 0x3F) << 1;
--
-- ret =
-- platform_device_add_data(mdio_dev, &mdio_data,
-- sizeof(struct fs_mii_fec_platform_info));
-- if (ret)
-- goto unreg;
-- }
-- return 0;
--
--unreg:
-- platform_device_unregister(mdio_dev);
--err:
-- return ret;
--}
--
--arch_initcall(fs_enet_mdio_of_init);
--
--static const char *enet_regs = "regs";
--static const char *enet_pram = "pram";
--static const char *enet_irq = "interrupt";
--static char bus_id[9][BUS_ID_SIZE];
--
--static int __init fs_enet_of_init(void)
--{
-- struct device_node *np;
-- unsigned int i;
-- struct platform_device *fs_enet_dev = NULL;
-- struct resource res;
-- int ret;
--
-- for (np = NULL, i = 0;
-- (np = of_find_compatible_node(np, "network", "fs_enet")) != NULL;
-- i++) {
-- struct resource r[4];
-- struct device_node *phy = NULL, *mdio = NULL;
-- struct fs_platform_info fs_enet_data;
-- const unsigned int *id;
-- const unsigned int *phy_addr;
-- const void *mac_addr;
-- const phandle *ph;
-- const char *model;
--
-- memset(r, 0, sizeof(r));
-- memset(&fs_enet_data, 0, sizeof(fs_enet_data));
--
-- model = of_get_property(np, "model", NULL);
-- if (model == NULL) {
-- ret = -ENODEV;
-- goto unreg;
-- }
--
-- id = of_get_property(np, "device-id", NULL);
-- fs_enet_data.fs_no = *id;
--
-- if (platform_device_skip(model, *id))
-- continue;
--
-- ret = of_address_to_resource(np, 0, &r[0]);
-- if (ret)
-- goto err;
-- r[0].name = enet_regs;
--
-- mac_addr = of_get_mac_address(np);
-- if (mac_addr)
-- memcpy(fs_enet_data.macaddr, mac_addr, 6);
--
-- ph = of_get_property(np, "phy-handle", NULL);
-- if (ph != NULL)
-- phy = of_find_node_by_phandle(*ph);
--
-- if (phy != NULL) {
-- phy_addr = of_get_property(phy, "reg", NULL);
-- fs_enet_data.phy_addr = *phy_addr;
-- fs_enet_data.has_phy = 1;
--
-- mdio = of_get_parent(phy);
-- ret = of_address_to_resource(mdio, 0, &res);
-- if (ret) {
-- of_node_put(phy);
-- of_node_put(mdio);
-- goto unreg;
-- }
-- }
--
-- model = of_get_property(np, "model", NULL);
-- strcpy(fs_enet_data.fs_type, model);
--
-- if (strstr(model, "FEC")) {
-- r[1].start = r[1].end = irq_of_parse_and_map(np, 0);
-- r[1].flags = IORESOURCE_IRQ;
-- r[1].name = enet_irq;
--
-- fs_enet_dev =
-- platform_device_register_simple("fsl-cpm-fec", i, &r[0], 2);
--
-- if (IS_ERR(fs_enet_dev)) {
-- ret = PTR_ERR(fs_enet_dev);
-- goto err;
-- }
--
-- fs_enet_data.rx_ring = 128;
-- fs_enet_data.tx_ring = 16;
-- fs_enet_data.rx_copybreak = 240;
-- fs_enet_data.use_napi = 1;
-- fs_enet_data.napi_weight = 17;
--
-- snprintf((char*)&bus_id[i], BUS_ID_SIZE, "%x:%02x",
-- (u32)res.start, fs_enet_data.phy_addr);
-- fs_enet_data.bus_id = (char*)&bus_id[i];
-- fs_enet_data.init_ioports = init_fec_ioports;
-- }
-- if (strstr(model, "SCC")) {
-- ret = of_address_to_resource(np, 1, &r[1]);
-- if (ret)
-- goto err;
-- r[1].name = enet_pram;
--
-- r[2].start = r[2].end = irq_of_parse_and_map(np, 0);
-- r[2].flags = IORESOURCE_IRQ;
-- r[2].name = enet_irq;
--
-- fs_enet_dev =
-- platform_device_register_simple("fsl-cpm-scc", i, &r[0], 3);
--
-- if (IS_ERR(fs_enet_dev)) {
-- ret = PTR_ERR(fs_enet_dev);
-- goto err;
-- }
--
-- fs_enet_data.rx_ring = 64;
-- fs_enet_data.tx_ring = 8;
-- fs_enet_data.rx_copybreak = 240;
-- fs_enet_data.use_napi = 1;
-- fs_enet_data.napi_weight = 17;
--
-- snprintf((char*)&bus_id[i], BUS_ID_SIZE, "%s", "fixed@10:1");
-- fs_enet_data.bus_id = (char*)&bus_id[i];
-- fs_enet_data.init_ioports = init_scc_ioports;
-- }
--
-- of_node_put(phy);
-- of_node_put(mdio);
--
-- ret = platform_device_add_data(fs_enet_dev, &fs_enet_data,
-- sizeof(struct
-- fs_platform_info));
-- if (ret)
-- goto unreg;
-- }
-- return 0;
--
--unreg:
-- platform_device_unregister(fs_enet_dev);
--err:
-- return ret;
--}
--
--arch_initcall(fs_enet_of_init);
--
--static int __init fsl_pcmcia_of_init(void)
--{
-- struct device_node *np;
-- /*
-- * Register all the devices which type is "pcmcia"
-- */
-- for_each_compatible_node(np, "pcmcia", "fsl,pq-pcmcia")
-- of_platform_device_create(np, "m8xx-pcmcia", NULL);
-- return 0;
--}
--
--arch_initcall(fsl_pcmcia_of_init);
--
--static const char *smc_regs = "regs";
--static const char *smc_pram = "pram";
--
--static int __init cpm_smc_uart_of_init(void)
--{
-- struct device_node *np;
-- unsigned int i;
-- struct platform_device *cpm_uart_dev;
-- int ret;
--
-- for (np = NULL, i = 0;
-- (np = of_find_compatible_node(np, "serial", "cpm_uart")) != NULL;
-- i++) {
-- struct resource r[3];
-- struct fs_uart_platform_info cpm_uart_data;
-- const int *id;
-- const char *model;
--
-- memset(r, 0, sizeof(r));
-- memset(&cpm_uart_data, 0, sizeof(cpm_uart_data));
--
-- ret = of_address_to_resource(np, 0, &r[0]);
-- if (ret)
-- goto err;
--
-- r[0].name = smc_regs;
--
-- ret = of_address_to_resource(np, 1, &r[1]);
-- if (ret)
-- goto err;
-- r[1].name = smc_pram;
--
-- r[2].start = r[2].end = irq_of_parse_and_map(np, 0);
-- r[2].flags = IORESOURCE_IRQ;
--
-- cpm_uart_dev =
-- platform_device_register_simple("fsl-cpm-smc:uart", i, &r[0], 3);
--
-- if (IS_ERR(cpm_uart_dev)) {
-- ret = PTR_ERR(cpm_uart_dev);
-- goto err;
-- }
--
-- model = of_get_property(np, "model", NULL);
-- strcpy(cpm_uart_data.fs_type, model);
--
-- id = of_get_property(np, "device-id", NULL);
-- cpm_uart_data.fs_no = *id;
-- cpm_uart_data.uart_clk = ppc_proc_freq;
--
-- cpm_uart_data.tx_num_fifo = 4;
-- cpm_uart_data.tx_buf_size = 32;
-- cpm_uart_data.rx_num_fifo = 4;
-- cpm_uart_data.rx_buf_size = 32;
--
-- ret =
-- platform_device_add_data(cpm_uart_dev, &cpm_uart_data,
-- sizeof(struct
-- fs_uart_platform_info));
-- if (ret)
-- goto unreg;
-- }
--
-- return 0;
--
--unreg:
-- platform_device_unregister(cpm_uart_dev);
--err:
-- return ret;
--}
--
--arch_initcall(cpm_smc_uart_of_init);
--
--#endif /* CONFIG_8xx */
--#endif /* CONFIG_PPC_CPM_NEW_BINDING */
--
- static int __init of_fsl_spi_probe(char *type, char *compatible, u32 sysclk,
- struct spi_board_info *board_infos,
- unsigned int num_board_infos,
-@@ -1371,25 +840,9 @@ int __init fsl_spi_init(struct spi_board
- sysclk = get_brgfreq();
- #endif
- if (sysclk == -1) {
-- struct device_node *np;
-- const u32 *freq;
-- int size;
--
-- np = of_find_node_by_type(NULL, "soc");
-- if (!np)
-+ sysclk = fsl_get_sys_freq();
-+ if (sysclk == -1)
- return -ENODEV;
--
-- freq = of_get_property(np, "clock-frequency", &size);
-- if (!freq || size != sizeof(*freq) || *freq == 0) {
-- freq = of_get_property(np, "bus-frequency", &size);
-- if (!freq || size != sizeof(*freq) || *freq == 0) {
-- of_node_put(np);
-- return -ENODEV;
-- }
-- }
--
-- sysclk = *freq;
-- of_node_put(np);
- }
-
- ret = of_fsl_spi_probe(NULL, "fsl,spi", sysclk, board_infos,
---- a/arch/powerpc/sysdev/fsl_soc.h
-+++ b/arch/powerpc/sysdev/fsl_soc.h
-@@ -7,6 +7,7 @@
- extern phys_addr_t get_immrbase(void);
- extern u32 get_brgfreq(void);
- extern u32 get_baudrate(void);
-+extern u32 fsl_get_sys_freq(void);
-
- struct spi_board_info;
-
---- a/arch/powerpc/sysdev/mpic.c
-+++ b/arch/powerpc/sysdev/mpic.c
-@@ -175,13 +175,16 @@ static inline void _mpic_write(enum mpic
- switch(type) {
- #ifdef CONFIG_PPC_DCR
- case mpic_access_dcr:
-- return dcr_write(rb->dhost, reg, value);
-+ dcr_write(rb->dhost, reg, value);
-+ break;
- #endif
- case mpic_access_mmio_be:
-- return out_be32(rb->base + (reg >> 2), value);
-+ out_be32(rb->base + (reg >> 2), value);
-+ break;
- case mpic_access_mmio_le:
- default:
-- return out_le32(rb->base + (reg >> 2), value);
-+ out_le32(rb->base + (reg >> 2), value);
-+ break;
- }
- }
-
-@@ -1000,7 +1003,7 @@ struct mpic * __init mpic_alloc(struct d
- const char *name)
- {
- struct mpic *mpic;
-- u32 reg;
-+ u32 greg_feature;
- const char *vers;
- int i;
- int intvec_top;
-@@ -1064,7 +1067,8 @@ struct mpic * __init mpic_alloc(struct d
-
- /* Look for protected sources */
- if (node) {
-- unsigned int psize, bits, mapsize;
-+ int psize;
-+ unsigned int bits, mapsize;
- const u32 *psrc =
- of_get_property(node, "protected-sources", &psize);
- if (psrc) {
-@@ -1107,8 +1111,7 @@ struct mpic * __init mpic_alloc(struct d
- * in, try to obtain one
- */
- if (paddr == 0 && !(mpic->flags & MPIC_USES_DCR)) {
-- const u32 *reg;
-- reg = of_get_property(node, "reg", NULL);
-+ const u32 *reg = of_get_property(node, "reg", NULL);
- BUG_ON(reg == NULL);
- paddr = of_translate_address(node, reg);
- BUG_ON(paddr == OF_BAD_ADDR);
-@@ -1137,12 +1140,13 @@ struct mpic * __init mpic_alloc(struct d
- * MPICs, num sources as well. On ISU MPICs, sources are counted
- * as ISUs are added
- */
-- reg = mpic_read(mpic->gregs, MPIC_INFO(GREG_FEATURE_0));
-- mpic->num_cpus = ((reg & MPIC_GREG_FEATURE_LAST_CPU_MASK)
-+ greg_feature = mpic_read(mpic->gregs, MPIC_INFO(GREG_FEATURE_0));
-+ mpic->num_cpus = ((greg_feature & MPIC_GREG_FEATURE_LAST_CPU_MASK)
- >> MPIC_GREG_FEATURE_LAST_CPU_SHIFT) + 1;
- if (isu_size == 0)
-- mpic->num_sources = ((reg & MPIC_GREG_FEATURE_LAST_SRC_MASK)
-- >> MPIC_GREG_FEATURE_LAST_SRC_SHIFT) + 1;
-+ mpic->num_sources =
-+ ((greg_feature & MPIC_GREG_FEATURE_LAST_SRC_MASK)
-+ >> MPIC_GREG_FEATURE_LAST_SRC_SHIFT) + 1;
-
- /* Map the per-CPU registers */
- for (i = 0; i < mpic->num_cpus; i++) {
-@@ -1161,7 +1165,7 @@ struct mpic * __init mpic_alloc(struct d
- mpic->isu_mask = (1 << mpic->isu_shift) - 1;
-
- /* Display version */
-- switch (reg & MPIC_GREG_FEATURE_VERSION_MASK) {
-+ switch (greg_feature & MPIC_GREG_FEATURE_VERSION_MASK) {
- case 1:
- vers = "1.0";
- break;
-@@ -1321,7 +1325,7 @@ void __init mpic_set_serial_int(struct m
-
- void mpic_irq_set_priority(unsigned int irq, unsigned int pri)
- {
-- int is_ipi;
-+ unsigned int is_ipi;
- struct mpic *mpic = mpic_find(irq, &is_ipi);
- unsigned int src = mpic_irq_to_hw(irq);
- unsigned long flags;
-@@ -1344,7 +1348,7 @@ void mpic_irq_set_priority(unsigned int
-
- unsigned int mpic_irq_get_priority(unsigned int irq)
- {
-- int is_ipi;
-+ unsigned int is_ipi;
- struct mpic *mpic = mpic_find(irq, &is_ipi);
- unsigned int src = mpic_irq_to_hw(irq);
- unsigned long flags;
-@@ -1406,11 +1410,6 @@ void mpic_cpu_set_priority(int prio)
- mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), prio);
- }
-
--/*
-- * XXX: someone who knows mpic should check this.
-- * do we need to eoi the ipi including for kexec cpu here (see xics comments)?
-- * or can we reset the mpic in the new kernel?
-- */
- void mpic_teardown_this_cpu(int secondary)
- {
- struct mpic *mpic = mpic_primary;
-@@ -1430,6 +1429,10 @@ void mpic_teardown_this_cpu(int secondar
-
- /* Set current processor priority to max */
- mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), 0xf);
-+ /* We need to EOI the IPI since not all platforms reset the MPIC
-+ * on boot and new interrupts wouldn't get delivered otherwise.
-+ */
-+ mpic_eoi(mpic);
-
- spin_unlock_irqrestore(&mpic_lock, flags);
- }
---- a/arch/powerpc/sysdev/mv64x60_dev.c
-+++ b/arch/powerpc/sysdev/mv64x60_dev.c
-@@ -127,7 +127,7 @@ static int __init mv64x60_mpsc_device_se
- if (err)
- return err;
-
-- prop = of_get_property(np, "block-index", NULL);
-+ prop = of_get_property(np, "cell-index", NULL);
- if (!prop)
- return -ENODEV;
- port_number = *(int *)prop;
-@@ -136,6 +136,7 @@ static int __init mv64x60_mpsc_device_se
-
- pdata.cache_mgmt = 1; /* All current revs need this set */
-
-+ pdata.max_idle = 40; /* default */
- prop = of_get_property(np, "max_idle", NULL);
- if (prop)
- pdata.max_idle = *prop;
-@@ -205,30 +206,24 @@ error:
- /*
- * Create mv64x60_eth platform devices
- */
--static int __init eth_register_shared_pdev(struct device_node *np)
-+static struct platform_device * __init mv64x60_eth_register_shared_pdev(
-+ struct device_node *np, int id)
- {
- struct platform_device *pdev;
- struct resource r[1];
- int err;
-
-- np = of_get_parent(np);
-- if (!np)
-- return -ENODEV;
--
- err = of_address_to_resource(np, 0, &r[0]);
-- of_node_put(np);
- if (err)
-- return err;
-+ return ERR_PTR(err);
-
-- pdev = platform_device_register_simple(MV643XX_ETH_SHARED_NAME, 0,
-+ pdev = platform_device_register_simple(MV643XX_ETH_SHARED_NAME, id,
- r, 1);
-- if (IS_ERR(pdev))
-- return PTR_ERR(pdev);
--
-- return 0;
-+ return pdev;
- }
-
--static int __init mv64x60_eth_device_setup(struct device_node *np, int id)
-+static int __init mv64x60_eth_device_setup(struct device_node *np, int id,
-+ struct platform_device *shared_pdev)
- {
- struct resource r[1];
- struct mv643xx_eth_platform_data pdata;
-@@ -239,16 +234,12 @@ static int __init mv64x60_eth_device_set
- const phandle *ph;
- int err;
-
-- /* only register the shared platform device the first time through */
-- if (id == 0 && (err = eth_register_shared_pdev(np)))
-- return err;
--
- memset(r, 0, sizeof(r));
- of_irq_to_resource(np, 0, &r[0]);
-
- memset(&pdata, 0, sizeof(pdata));
-
-- prop = of_get_property(np, "block-index", NULL);
-+ prop = of_get_property(np, "reg", NULL);
- if (!prop)
- return -ENODEV;
- pdata.port_number = *prop;
-@@ -301,7 +292,7 @@ static int __init mv64x60_eth_device_set
-
- of_node_put(phy);
-
-- pdev = platform_device_alloc(MV643XX_ETH_NAME, pdata.port_number);
-+ pdev = platform_device_alloc(MV643XX_ETH_NAME, id);
- if (!pdev)
- return -ENOMEM;
-
-@@ -345,21 +336,19 @@ static int __init mv64x60_i2c_device_set
-
- memset(&pdata, 0, sizeof(pdata));
-
-+ pdata.freq_m = 8; /* default */
- prop = of_get_property(np, "freq_m", NULL);
- if (!prop)
- return -ENODEV;
- pdata.freq_m = *prop;
-
-+ pdata.freq_m = 3; /* default */
- prop = of_get_property(np, "freq_n", NULL);
- if (!prop)
- return -ENODEV;
- pdata.freq_n = *prop;
-
-- prop = of_get_property(np, "timeout", NULL);
-- if (prop)
-- pdata.timeout = *prop;
-- else
-- pdata.timeout = 1000; /* 1 second */
-+ pdata.timeout = 1000; /* default: 1 second */
-
- pdev = platform_device_alloc(MV64XXX_I2C_CTLR_NAME, id);
- if (!pdev)
-@@ -401,10 +390,7 @@ static int __init mv64x60_wdt_device_set
-
- memset(&pdata, 0, sizeof(pdata));
-
-- prop = of_get_property(np, "timeout", NULL);
-- if (!prop)
-- return -ENODEV;
-- pdata.timeout = *prop;
-+ pdata.timeout = 10; /* Default: 10 seconds */
-
- np = of_get_parent(np);
- if (!np)
-@@ -441,27 +427,43 @@ error:
-
- static int __init mv64x60_device_setup(void)
- {
-- struct device_node *np = NULL;
-- int id;
-+ struct device_node *np, *np2;
-+ struct platform_device *pdev;
-+ int id, id2;
- int err;
-
- id = 0;
-- for_each_compatible_node(np, "serial", "marvell,mpsc")
-+ for_each_compatible_node(np, "serial", "marvell,mv64360-mpsc")
- if ((err = mv64x60_mpsc_device_setup(np, id++)))
- goto error;
-
- id = 0;
-- for_each_compatible_node(np, "network", "marvell,mv64x60-eth")
-- if ((err = mv64x60_eth_device_setup(np, id++)))
-+ id2 = 0;
-+ for_each_compatible_node(np, NULL, "marvell,mv64360-eth-group") {
-+ pdev = mv64x60_eth_register_shared_pdev(np, id++);
-+ if (IS_ERR(pdev)) {
-+ err = PTR_ERR(pdev);
- goto error;
-+ }
-+ for_each_child_of_node(np, np2) {
-+ if (!of_device_is_compatible(np2,
-+ "marvell,mv64360-eth"))
-+ continue;
-+ err = mv64x60_eth_device_setup(np2, id2++, pdev);
-+ if (err) {
-+ of_node_put(np2);
-+ goto error;
-+ }
-+ }
-+ }
-
- id = 0;
-- for_each_compatible_node(np, "i2c", "marvell,mv64x60-i2c")
-+ for_each_compatible_node(np, "i2c", "marvell,mv64360-i2c")
- if ((err = mv64x60_i2c_device_setup(np, id++)))
- goto error;
-
- /* support up to one watchdog timer */
-- np = of_find_compatible_node(np, NULL, "marvell,mv64x60-wdt");
-+ np = of_find_compatible_node(np, NULL, "marvell,mv64360-wdt");
- if (np) {
- if ((err = mv64x60_wdt_device_setup(np, id)))
- goto error;
-@@ -489,10 +491,10 @@ static int __init mv64x60_add_mpsc_conso
- if (!np)
- goto not_mpsc;
-
-- if (!of_device_is_compatible(np, "marvell,mpsc"))
-+ if (!of_device_is_compatible(np, "marvell,mv64360-mpsc"))
- goto not_mpsc;
-
-- prop = of_get_property(np, "block-index", NULL);
-+ prop = of_get_property(np, "cell-index", NULL);
- if (!prop)
- goto not_mpsc;
-
---- a/arch/powerpc/sysdev/mv64x60_pci.c
-+++ b/arch/powerpc/sysdev/mv64x60_pci.c
-@@ -86,14 +86,14 @@ static int __init mv64x60_sysfs_init(voi
- struct platform_device *pdev;
- const unsigned int *prop;
-
-- np = of_find_compatible_node(NULL, NULL, "marvell,mv64x60");
-+ np = of_find_compatible_node(NULL, NULL, "marvell,mv64360");
- if (!np)
- return 0;
-
- prop = of_get_property(np, "hs_reg_valid", NULL);
- of_node_put(np);
-
-- pdev = platform_device_register_simple("marvell,mv64x60", 0, NULL, 0);
-+ pdev = platform_device_register_simple("marvell,mv64360", 0, NULL, 0);
- if (IS_ERR(pdev))
- return PTR_ERR(pdev);
-
-@@ -166,6 +166,6 @@ void __init mv64x60_pci_init(void)
- {
- struct device_node *np;
-
-- for_each_compatible_node(np, "pci", "marvell,mv64x60-pci")
-+ for_each_compatible_node(np, "pci", "marvell,mv64360-pci")
- mv64x60_add_bridge(np);
- }
---- a/arch/powerpc/sysdev/mv64x60_pic.c
-+++ b/arch/powerpc/sysdev/mv64x60_pic.c
-@@ -238,13 +238,13 @@ void __init mv64x60_init_irq(void)
- const unsigned int *reg;
- unsigned long flags;
-
-- np = of_find_compatible_node(NULL, NULL, "marvell,mv64x60-gpp");
-+ np = of_find_compatible_node(NULL, NULL, "marvell,mv64360-gpp");
- reg = of_get_property(np, "reg", &size);
- paddr = of_translate_address(np, reg);
- mv64x60_gpp_reg_base = ioremap(paddr, reg[1]);
- of_node_put(np);
-
-- np = of_find_compatible_node(NULL, NULL, "marvell,mv64x60-pic");
-+ np = of_find_compatible_node(NULL, NULL, "marvell,mv64360-pic");
- reg = of_get_property(np, "reg", &size);
- paddr = of_translate_address(np, reg);
- mv64x60_irq_reg_base = ioremap(paddr, reg[1]);
---- a/arch/powerpc/sysdev/mv64x60_udbg.c
-+++ b/arch/powerpc/sysdev/mv64x60_udbg.c
-@@ -85,7 +85,7 @@ static void mv64x60_udbg_init(void)
- if (!stdout)
- return;
-
-- for_each_compatible_node(np, "serial", "marvell,mpsc") {
-+ for_each_compatible_node(np, "serial", "marvell,mv64360-mpsc") {
- if (np == stdout)
- break;
- }
---- a/arch/powerpc/sysdev/ppc4xx_pci.c
-+++ b/arch/powerpc/sysdev/ppc4xx_pci.c
-@@ -527,6 +527,7 @@ static void __init ppc4xx_probe_pcix_bri
- *
- * ibm,plb-pciex-440spe
- * ibm,plb-pciex-405ex
-+ * ibm,plb-pciex-460ex
- *
- * Anything else will be rejected for now as they are all subtly
- * different unfortunately.
-@@ -645,7 +646,7 @@ static int __init ppc440spe_pciex_core_i
- int time_out = 20;
-
- /* Set PLL clock receiver to LVPECL */
-- mtdcri(SDR0, PESDR0_PLLLCT1, mfdcri(SDR0, PESDR0_PLLLCT1) | 1 << 28);
-+ dcri_clrset(SDR0, PESDR0_PLLLCT1, 0, 1 << 28);
-
- /* Shouldn't we do all the calibration stuff etc... here ? */
- if (ppc440spe_pciex_check_reset(np))
-@@ -659,8 +660,7 @@ static int __init ppc440spe_pciex_core_i
- }
-
- /* De-assert reset of PCIe PLL, wait for lock */
-- mtdcri(SDR0, PESDR0_PLLLCT1,
-- mfdcri(SDR0, PESDR0_PLLLCT1) & ~(1 << 24));
-+ dcri_clrset(SDR0, PESDR0_PLLLCT1, 1 << 24, 0);
- udelay(3);
-
- while (time_out) {
-@@ -712,9 +712,8 @@ static int ppc440spe_pciex_init_port_hw(
- mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL7SET1,
- 0x35000000);
- }
-- val = mfdcri(SDR0, port->sdr_base + PESDRn_RCSSET);
-- mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET,
-- (val & ~(1 << 24 | 1 << 16)) | 1 << 12);
-+ dcri_clrset(SDR0, port->sdr_base + PESDRn_RCSSET,
-+ (1 << 24) | (1 << 16), 1 << 12);
-
- return 0;
- }
-@@ -775,6 +774,115 @@ static struct ppc4xx_pciex_hwops ppc440s
- .setup_utl = ppc440speB_pciex_init_utl,
- };
-
-+static int __init ppc460ex_pciex_core_init(struct device_node *np)
-+{
-+ /* Nothing to do, return 2 ports */
-+ return 2;
-+}
-+
-+static int ppc460ex_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
-+{
-+ u32 val;
-+ u32 utlset1;
-+
-+ if (port->endpoint)
-+ val = PTYPE_LEGACY_ENDPOINT << 20;
-+ else
-+ val = PTYPE_ROOT_PORT << 20;
-+
-+ if (port->index == 0) {
-+ val |= LNKW_X1 << 12;
-+ utlset1 = 0x20000000;
-+ } else {
-+ val |= LNKW_X4 << 12;
-+ utlset1 = 0x20101101;
-+ }
-+
-+ mtdcri(SDR0, port->sdr_base + PESDRn_DLPSET, val);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET1, utlset1);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET2, 0x01210000);
-+
-+ switch (port->index) {
-+ case 0:
-+ mtdcri(SDR0, PESDR0_460EX_L0CDRCTL, 0x00003230);
-+ mtdcri(SDR0, PESDR0_460EX_L0DRV, 0x00000136);
-+ mtdcri(SDR0, PESDR0_460EX_L0CLK, 0x00000006);
-+
-+ mtdcri(SDR0, PESDR0_460EX_PHY_CTL_RST,0x10000000);
-+ break;
-+
-+ case 1:
-+ mtdcri(SDR0, PESDR1_460EX_L0CDRCTL, 0x00003230);
-+ mtdcri(SDR0, PESDR1_460EX_L1CDRCTL, 0x00003230);
-+ mtdcri(SDR0, PESDR1_460EX_L2CDRCTL, 0x00003230);
-+ mtdcri(SDR0, PESDR1_460EX_L3CDRCTL, 0x00003230);
-+ mtdcri(SDR0, PESDR1_460EX_L0DRV, 0x00000136);
-+ mtdcri(SDR0, PESDR1_460EX_L1DRV, 0x00000136);
-+ mtdcri(SDR0, PESDR1_460EX_L2DRV, 0x00000136);
-+ mtdcri(SDR0, PESDR1_460EX_L3DRV, 0x00000136);
-+ mtdcri(SDR0, PESDR1_460EX_L0CLK, 0x00000006);
-+ mtdcri(SDR0, PESDR1_460EX_L1CLK, 0x00000006);
-+ mtdcri(SDR0, PESDR1_460EX_L2CLK, 0x00000006);
-+ mtdcri(SDR0, PESDR1_460EX_L3CLK, 0x00000006);
-+
-+ mtdcri(SDR0, PESDR1_460EX_PHY_CTL_RST,0x10000000);
-+ break;
-+ }
-+
-+ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET,
-+ mfdcri(SDR0, port->sdr_base + PESDRn_RCSSET) |
-+ (PESDRx_RCSSET_RSTGU | PESDRx_RCSSET_RSTPYN));
-+
-+ /* Poll for PHY reset */
-+ /* XXX FIXME add timeout */
-+ switch (port->index) {
-+ case 0:
-+ while (!(mfdcri(SDR0, PESDR0_460EX_RSTSTA) & 0x1))
-+ udelay(10);
-+ break;
-+ case 1:
-+ while (!(mfdcri(SDR0, PESDR1_460EX_RSTSTA) & 0x1))
-+ udelay(10);
-+ break;
-+ }
-+
-+ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET,
-+ (mfdcri(SDR0, port->sdr_base + PESDRn_RCSSET) &
-+ ~(PESDRx_RCSSET_RSTGU | PESDRx_RCSSET_RSTDL)) |
-+ PESDRx_RCSSET_RSTPYN);
-+
-+ port->has_ibpre = 1;
-+
-+ return 0;
-+}
-+
-+static int ppc460ex_pciex_init_utl(struct ppc4xx_pciex_port *port)
-+{
-+ dcr_write(port->dcrs, DCRO_PEGPL_SPECIAL, 0x0);
-+
-+ /*
-+ * Set buffer allocations and then assert VRB and TXE.
-+ */
-+ out_be32(port->utl_base + PEUTL_PBCTL, 0x0800000c);
-+ out_be32(port->utl_base + PEUTL_OUTTR, 0x08000000);
-+ out_be32(port->utl_base + PEUTL_INTR, 0x02000000);
-+ out_be32(port->utl_base + PEUTL_OPDBSZ, 0x04000000);
-+ out_be32(port->utl_base + PEUTL_PBBSZ, 0x00000000);
-+ out_be32(port->utl_base + PEUTL_IPHBSZ, 0x02000000);
-+ out_be32(port->utl_base + PEUTL_IPDBSZ, 0x04000000);
-+ out_be32(port->utl_base + PEUTL_RCIRQEN,0x00f00000);
-+ out_be32(port->utl_base + PEUTL_PCTL, 0x80800066);
-+
-+ return 0;
-+}
-+
-+static struct ppc4xx_pciex_hwops ppc460ex_pcie_hwops __initdata =
-+{
-+ .core_init = ppc460ex_pciex_core_init,
-+ .port_init_hw = ppc460ex_pciex_init_port_hw,
-+ .setup_utl = ppc460ex_pciex_init_utl,
-+};
-+
- #endif /* CONFIG_44x */
-
- #ifdef CONFIG_40x
-@@ -830,17 +938,9 @@ static int ppc405ex_pciex_init_port_hw(s
- * PCIe boards don't show this problem.
- * This has to be re-tested and fixed in a later release!
- */
--#if 0 /* XXX FIXME: Not resetting the PHY will leave all resources
-- * configured as done previously by U-Boot. Then Linux will currently
-- * not reassign them. So the PHY reset is now done always. This will
-- * lead to problems with the Atheros PCIe board again.
-- */
- val = mfdcri(SDR0, port->sdr_base + PESDRn_LOOP);
- if (!(val & 0x00001000))
- ppc405ex_pcie_phy_reset(port);
--#else
-- ppc405ex_pcie_phy_reset(port);
--#endif
-
- dcr_write(port->dcrs, DCRO_PEGPL_CFG, 0x10000000); /* guarded on */
-
-@@ -896,6 +996,8 @@ static int __init ppc4xx_pciex_check_cor
- else
- ppc4xx_pciex_hwops = &ppc440speB_pcie_hwops;
- }
-+ if (of_device_is_compatible(np, "ibm,plb-pciex-460ex"))
-+ ppc4xx_pciex_hwops = &ppc460ex_pcie_hwops;
- #endif /* CONFIG_44x */
- #ifdef CONFIG_40x
- if (of_device_is_compatible(np, "ibm,plb-pciex-405ex"))
-@@ -1042,8 +1144,7 @@ static int __init ppc4xx_pciex_port_init
- port->link = 0;
- }
-
-- mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET,
-- mfdcri(SDR0, port->sdr_base + PESDRn_RCSSET) | 1 << 20);
-+ dcri_clrset(SDR0, port->sdr_base + PESDRn_RCSSET, 0, 1 << 20);
- msleep(100);
-
- return 0;
---- a/arch/powerpc/sysdev/ppc4xx_pci.h
-+++ b/arch/powerpc/sysdev/ppc4xx_pci.h
-@@ -271,6 +271,59 @@
- #define PESDR1_405EX_PHYSTA 0x044C
-
- /*
-+ * 460EX additional DCRs
-+ */
-+#define PESDR0_460EX_L0BIST 0x0308
-+#define PESDR0_460EX_L0BISTSTS 0x0309
-+#define PESDR0_460EX_L0CDRCTL 0x030A
-+#define PESDR0_460EX_L0DRV 0x030B
-+#define PESDR0_460EX_L0REC 0x030C
-+#define PESDR0_460EX_L0LPB 0x030D
-+#define PESDR0_460EX_L0CLK 0x030E
-+#define PESDR0_460EX_PHY_CTL_RST 0x030F
-+#define PESDR0_460EX_RSTSTA 0x0310
-+#define PESDR0_460EX_OBS 0x0311
-+#define PESDR0_460EX_L0ERRC 0x0320
-+
-+#define PESDR1_460EX_L0BIST 0x0348
-+#define PESDR1_460EX_L1BIST 0x0349
-+#define PESDR1_460EX_L2BIST 0x034A
-+#define PESDR1_460EX_L3BIST 0x034B
-+#define PESDR1_460EX_L0BISTSTS 0x034C
-+#define PESDR1_460EX_L1BISTSTS 0x034D
-+#define PESDR1_460EX_L2BISTSTS 0x034E
-+#define PESDR1_460EX_L3BISTSTS 0x034F
-+#define PESDR1_460EX_L0CDRCTL 0x0350
-+#define PESDR1_460EX_L1CDRCTL 0x0351
-+#define PESDR1_460EX_L2CDRCTL 0x0352
-+#define PESDR1_460EX_L3CDRCTL 0x0353
-+#define PESDR1_460EX_L0DRV 0x0354
-+#define PESDR1_460EX_L1DRV 0x0355
-+#define PESDR1_460EX_L2DRV 0x0356
-+#define PESDR1_460EX_L3DRV 0x0357
-+#define PESDR1_460EX_L0REC 0x0358
-+#define PESDR1_460EX_L1REC 0x0359
-+#define PESDR1_460EX_L2REC 0x035A
-+#define PESDR1_460EX_L3REC 0x035B
-+#define PESDR1_460EX_L0LPB 0x035C
-+#define PESDR1_460EX_L1LPB 0x035D
-+#define PESDR1_460EX_L2LPB 0x035E
-+#define PESDR1_460EX_L3LPB 0x035F
-+#define PESDR1_460EX_L0CLK 0x0360
-+#define PESDR1_460EX_L1CLK 0x0361
-+#define PESDR1_460EX_L2CLK 0x0362
-+#define PESDR1_460EX_L3CLK 0x0363
-+#define PESDR1_460EX_PHY_CTL_RST 0x0364
-+#define PESDR1_460EX_RSTSTA 0x0365
-+#define PESDR1_460EX_OBS 0x0366
-+#define PESDR1_460EX_L0ERRC 0x0368
-+#define PESDR1_460EX_L1ERRC 0x0369
-+#define PESDR1_460EX_L2ERRC 0x036A
-+#define PESDR1_460EX_L3ERRC 0x036B
-+#define PESDR0_460EX_IHS1 0x036C
-+#define PESDR0_460EX_IHS2 0x036D
-+
-+/*
- * Of the above, some are common offsets from the base
- */
- #define PESDRn_UTLSET1 0x00
-@@ -353,6 +406,12 @@
- #define PECFG_POM2LAL 0x390
- #define PECFG_POM2LAH 0x394
-
-+/* SDR Bit Mappings */
-+#define PESDRx_RCSSET_HLDPLB 0x10000000
-+#define PESDRx_RCSSET_RSTGU 0x01000000
-+#define PESDRx_RCSSET_RDY 0x00100000
-+#define PESDRx_RCSSET_RSTDL 0x00010000
-+#define PESDRx_RCSSET_RSTPYN 0x00001000
-
- enum
- {
---- /dev/null
-+++ b/arch/powerpc/sysdev/ppc4xx_soc.c
-@@ -0,0 +1,200 @@
-+/*
-+ * IBM/AMCC PPC4xx SoC setup code
-+ *
-+ * Copyright 2008 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * L2 cache routines cloned from arch/ppc/syslib/ibm440gx_common.c which is:
-+ * Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
-+ * Copyright (c) 2003 - 2006 Zultys Technologies
-+ *
-+ * 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/stddef.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/errno.h>
-+#include <linux/interrupt.h>
-+#include <linux/irq.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/dcr.h>
-+#include <asm/dcr-regs.h>
-+#include <asm/reg.h>
-+
-+static u32 dcrbase_l2c;
-+
-+/*
-+ * L2-cache
-+ */
-+
-+/* Issue L2C diagnostic command */
-+static inline u32 l2c_diag(u32 addr)
-+{
-+ mtdcr(dcrbase_l2c + DCRN_L2C0_ADDR, addr);
-+ mtdcr(dcrbase_l2c + DCRN_L2C0_CMD, L2C_CMD_DIAG);
-+ while (!(mfdcr(dcrbase_l2c + DCRN_L2C0_SR) & L2C_SR_CC))
-+ ;
-+
-+ return mfdcr(dcrbase_l2c + DCRN_L2C0_DATA);
-+}
-+
-+static irqreturn_t l2c_error_handler(int irq, void *dev)
-+{
-+ u32 sr = mfdcr(dcrbase_l2c + DCRN_L2C0_SR);
-+
-+ if (sr & L2C_SR_CPE) {
-+ /* Read cache trapped address */
-+ u32 addr = l2c_diag(0x42000000);
-+ printk(KERN_EMERG "L2C: Cache Parity Error, addr[16:26] = 0x%08x\n",
-+ addr);
-+ }
-+ if (sr & L2C_SR_TPE) {
-+ /* Read tag trapped address */
-+ u32 addr = l2c_diag(0x82000000) >> 16;
-+ printk(KERN_EMERG "L2C: Tag Parity Error, addr[16:26] = 0x%08x\n",
-+ addr);
-+ }
-+
-+ /* Clear parity errors */
-+ if (sr & (L2C_SR_CPE | L2C_SR_TPE)){
-+ mtdcr(dcrbase_l2c + DCRN_L2C0_ADDR, 0);
-+ mtdcr(dcrbase_l2c + DCRN_L2C0_CMD, L2C_CMD_CCP | L2C_CMD_CTE);
-+ } else {
-+ printk(KERN_EMERG "L2C: LRU error\n");
-+ }
-+
-+ return IRQ_HANDLED;
-+}
-+
-+static int __init ppc4xx_l2c_probe(void)
-+{
-+ struct device_node *np;
-+ u32 r;
-+ unsigned long flags;
-+ int irq;
-+ const u32 *dcrreg;
-+ u32 dcrbase_isram;
-+ int len;
-+ const u32 *prop;
-+ u32 l2_size;
-+
-+ np = of_find_compatible_node(NULL, NULL, "ibm,l2-cache");
-+ if (!np)
-+ return 0;
-+
-+ /* Get l2 cache size */
-+ prop = of_get_property(np, "cache-size", NULL);
-+ if (prop == NULL) {
-+ printk(KERN_ERR "%s: Can't get cache-size!\n", np->full_name);
-+ of_node_put(np);
-+ return -ENODEV;
-+ }
-+ l2_size = prop[0];
-+
-+ /* Map DCRs */
-+ dcrreg = of_get_property(np, "dcr-reg", &len);
-+ if (!dcrreg || (len != 4 * sizeof(u32))) {
-+ printk(KERN_ERR "%s: Can't get DCR register base !",
-+ np->full_name);
-+ of_node_put(np);
-+ return -ENODEV;
-+ }
-+ dcrbase_isram = dcrreg[0];
-+ dcrbase_l2c = dcrreg[2];
-+
-+ /* Get and map irq number from device tree */
-+ irq = irq_of_parse_and_map(np, 0);
-+ if (irq == NO_IRQ) {
-+ printk(KERN_ERR "irq_of_parse_and_map failed\n");
-+ of_node_put(np);
-+ return -ENODEV;
-+ }
-+
-+ /* Install error handler */
-+ if (request_irq(irq, l2c_error_handler, IRQF_DISABLED, "L2C", 0) < 0) {
-+ printk(KERN_ERR "Cannot install L2C error handler"
-+ ", cache is not enabled\n");
-+ of_node_put(np);
-+ return -ENODEV;
-+ }
-+
-+ local_irq_save(flags);
-+ asm volatile ("sync" ::: "memory");
-+
-+ /* Disable SRAM */
-+ mtdcr(dcrbase_isram + DCRN_SRAM0_DPC,
-+ mfdcr(dcrbase_isram + DCRN_SRAM0_DPC) & ~SRAM_DPC_ENABLE);
-+ mtdcr(dcrbase_isram + DCRN_SRAM0_SB0CR,
-+ mfdcr(dcrbase_isram + DCRN_SRAM0_SB0CR) & ~SRAM_SBCR_BU_MASK);
-+ mtdcr(dcrbase_isram + DCRN_SRAM0_SB1CR,
-+ mfdcr(dcrbase_isram + DCRN_SRAM0_SB1CR) & ~SRAM_SBCR_BU_MASK);
-+ mtdcr(dcrbase_isram + DCRN_SRAM0_SB2CR,
-+ mfdcr(dcrbase_isram + DCRN_SRAM0_SB2CR) & ~SRAM_SBCR_BU_MASK);
-+ mtdcr(dcrbase_isram + DCRN_SRAM0_SB3CR,
-+ mfdcr(dcrbase_isram + DCRN_SRAM0_SB3CR) & ~SRAM_SBCR_BU_MASK);
-+
-+ /* Enable L2_MODE without ICU/DCU */
-+ r = mfdcr(dcrbase_l2c + DCRN_L2C0_CFG) &
-+ ~(L2C_CFG_ICU | L2C_CFG_DCU | L2C_CFG_SS_MASK);
-+ r |= L2C_CFG_L2M | L2C_CFG_SS_256;
-+ mtdcr(dcrbase_l2c + DCRN_L2C0_CFG, r);
-+
-+ mtdcr(dcrbase_l2c + DCRN_L2C0_ADDR, 0);
-+
-+ /* Hardware Clear Command */
-+ mtdcr(dcrbase_l2c + DCRN_L2C0_CMD, L2C_CMD_HCC);
-+ while (!(mfdcr(dcrbase_l2c + DCRN_L2C0_SR) & L2C_SR_CC))
-+ ;
-+
-+ /* Clear Cache Parity and Tag Errors */
-+ mtdcr(dcrbase_l2c + DCRN_L2C0_CMD, L2C_CMD_CCP | L2C_CMD_CTE);
-+
-+ /* Enable 64G snoop region starting at 0 */
-+ r = mfdcr(dcrbase_l2c + DCRN_L2C0_SNP0) &
-+ ~(L2C_SNP_BA_MASK | L2C_SNP_SSR_MASK);
-+ r |= L2C_SNP_SSR_32G | L2C_SNP_ESR;
-+ mtdcr(dcrbase_l2c + DCRN_L2C0_SNP0, r);
-+
-+ r = mfdcr(dcrbase_l2c + DCRN_L2C0_SNP1) &
-+ ~(L2C_SNP_BA_MASK | L2C_SNP_SSR_MASK);
-+ r |= 0x80000000 | L2C_SNP_SSR_32G | L2C_SNP_ESR;
-+ mtdcr(dcrbase_l2c + DCRN_L2C0_SNP1, r);
-+
-+ asm volatile ("sync" ::: "memory");
-+
-+ /* Enable ICU/DCU ports */
-+ r = mfdcr(dcrbase_l2c + DCRN_L2C0_CFG);
-+ r &= ~(L2C_CFG_DCW_MASK | L2C_CFG_PMUX_MASK | L2C_CFG_PMIM
-+ | L2C_CFG_TPEI | L2C_CFG_CPEI | L2C_CFG_NAM | L2C_CFG_NBRM);
-+ r |= L2C_CFG_ICU | L2C_CFG_DCU | L2C_CFG_TPC | L2C_CFG_CPC | L2C_CFG_FRAN
-+ | L2C_CFG_CPIM | L2C_CFG_TPIM | L2C_CFG_LIM | L2C_CFG_SMCM;
-+
-+ /* Check for 460EX/GT special handling */
-+ if (of_device_is_compatible(np, "ibm,l2-cache-460ex"))
-+ r |= L2C_CFG_RDBW;
-+
-+ mtdcr(dcrbase_l2c + DCRN_L2C0_CFG, r);
-+
-+ asm volatile ("sync; isync" ::: "memory");
-+ local_irq_restore(flags);
-+
-+ printk(KERN_INFO "%dk L2-cache enabled\n", l2_size >> 10);
-+
-+ of_node_put(np);
-+ return 0;
-+}
-+arch_initcall(ppc4xx_l2c_probe);
-+
-+/*
-+ * At present, this routine just applies a system reset.
-+ */
-+void ppc4xx_reset_system(char *cmd)
-+{
-+ mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_RST_SYSTEM);
-+ while (1)
-+ ; /* Just in case the reset doesn't work */
-+}
---- a/arch/powerpc/sysdev/qe_lib/qe.c
-+++ b/arch/powerpc/sysdev/qe_lib/qe.c
-@@ -55,7 +55,7 @@ struct qe_snum {
- /* We allocate this here because it is used almost exclusively for
- * the communication processor devices.
- */
--struct qe_immap *qe_immr = NULL;
-+struct qe_immap __iomem *qe_immr;
- EXPORT_SYMBOL(qe_immr);
-
- static struct qe_snum snums[QE_NUM_OF_SNUM]; /* Dynamically allocated SNUMs */
-@@ -156,7 +156,7 @@ EXPORT_SYMBOL(qe_issue_cmd);
- */
- static unsigned int brg_clk = 0;
-
--unsigned int get_brg_clk(void)
-+unsigned int qe_get_brg_clk(void)
- {
- struct device_node *qe;
- unsigned int size;
-@@ -180,6 +180,7 @@ unsigned int get_brg_clk(void)
-
- return brg_clk;
- }
-+EXPORT_SYMBOL(qe_get_brg_clk);
-
- /* Program the BRG to the given sampling rate and multiplier
- *
-@@ -197,7 +198,7 @@ int qe_setbrg(enum qe_clock brg, unsigne
- if ((brg < QE_BRG1) || (brg > QE_BRG16))
- return -EINVAL;
-
-- divisor = get_brg_clk() / (rate * multiplier);
-+ divisor = qe_get_brg_clk() / (rate * multiplier);
-
- if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
- div16 = QE_BRGC_DIV16;
-@@ -415,12 +416,6 @@ void qe_muram_dump(void)
- }
- EXPORT_SYMBOL(qe_muram_dump);
-
--void *qe_muram_addr(unsigned long offset)
--{
-- return (void *)&qe_immr->muram[offset];
--}
--EXPORT_SYMBOL(qe_muram_addr);
--
- /* The maximum number of RISCs we support */
- #define MAX_QE_RISC 2
-
---- a/arch/powerpc/sysdev/qe_lib/qe_io.c
-+++ b/arch/powerpc/sysdev/qe_lib/qe_io.c
-@@ -22,6 +22,7 @@
- #include <linux/ioport.h>
-
- #include <asm/io.h>
-+#include <asm/qe.h>
- #include <asm/prom.h>
- #include <sysdev/fsl_soc.h>
-
-@@ -41,7 +42,7 @@ struct port_regs {
- #endif
- };
-
--static struct port_regs *par_io = NULL;
-+static struct port_regs __iomem *par_io;
- static int num_par_io_ports = 0;
-
- int par_io_init(struct device_node *np)
-@@ -165,7 +166,7 @@ int par_io_of_config(struct device_node
- }
-
- ph = of_get_property(np, "pio-handle", NULL);
-- if (ph == 0) {
-+ if (ph == NULL) {
- printk(KERN_ERR "pio-handle not available \n");
- return -1;
- }
-@@ -200,7 +201,7 @@ static void dump_par_io(void)
- {
- unsigned int i;
-
-- printk(KERN_INFO "%s: par_io=%p\n", __FUNCTION__, par_io);
-+ printk(KERN_INFO "%s: par_io=%p\n", __func__, par_io);
- for (i = 0; i < num_par_io_ports; i++) {
- printk(KERN_INFO " cpodr[%u]=%08x\n", i,
- in_be32(&par_io[i].cpodr));
---- a/arch/powerpc/sysdev/qe_lib/ucc_fast.c
-+++ b/arch/powerpc/sysdev/qe_lib/ucc_fast.c
-@@ -148,57 +148,57 @@ int ucc_fast_init(struct ucc_fast_info *
-
- /* check if the UCC port number is in range. */
- if ((uf_info->ucc_num < 0) || (uf_info->ucc_num > UCC_MAX_NUM - 1)) {
-- printk(KERN_ERR "%s: illegal UCC number\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: illegal UCC number\n", __func__);
- return -EINVAL;
- }
-
- /* Check that 'max_rx_buf_length' is properly aligned (4). */
- if (uf_info->max_rx_buf_length & (UCC_FAST_MRBLR_ALIGNMENT - 1)) {
- printk(KERN_ERR "%s: max_rx_buf_length not aligned\n",
-- __FUNCTION__);
-+ __func__);
- return -EINVAL;
- }
-
- /* Validate Virtual Fifo register values */
- if (uf_info->urfs < UCC_FAST_URFS_MIN_VAL) {
-- printk(KERN_ERR "%s: urfs is too small\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: urfs is too small\n", __func__);
- return -EINVAL;
- }
-
- if (uf_info->urfs & (UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT - 1)) {
-- printk(KERN_ERR "%s: urfs is not aligned\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: urfs is not aligned\n", __func__);
- return -EINVAL;
- }
-
- if (uf_info->urfet & (UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT - 1)) {
-- printk(KERN_ERR "%s: urfet is not aligned.\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: urfet is not aligned.\n", __func__);
- return -EINVAL;
- }
-
- if (uf_info->urfset & (UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT - 1)) {
-- printk(KERN_ERR "%s: urfset is not aligned\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: urfset is not aligned\n", __func__);
- return -EINVAL;
- }
-
- if (uf_info->utfs & (UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT - 1)) {
-- printk(KERN_ERR "%s: utfs is not aligned\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: utfs is not aligned\n", __func__);
- return -EINVAL;
- }
-
- if (uf_info->utfet & (UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT - 1)) {
-- printk(KERN_ERR "%s: utfet is not aligned\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: utfet is not aligned\n", __func__);
- return -EINVAL;
- }
-
- if (uf_info->utftt & (UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT - 1)) {
-- printk(KERN_ERR "%s: utftt is not aligned\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: utftt is not aligned\n", __func__);
- return -EINVAL;
- }
-
- uccf = kzalloc(sizeof(struct ucc_fast_private), GFP_KERNEL);
- if (!uccf) {
- printk(KERN_ERR "%s: Cannot allocate private data\n",
-- __FUNCTION__);
-+ __func__);
- return -ENOMEM;
- }
-
-@@ -207,7 +207,7 @@ int ucc_fast_init(struct ucc_fast_info *
- /* Set the PHY base address */
- uccf->uf_regs = ioremap(uf_info->regs, sizeof(struct ucc_fast));
- if (uccf->uf_regs == NULL) {
-- printk(KERN_ERR "%s: Cannot map UCC registers\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: Cannot map UCC registers\n", __func__);
- return -ENOMEM;
- }
-
-@@ -230,7 +230,7 @@ int ucc_fast_init(struct ucc_fast_info *
- /* Set UCC to fast type */
- ret = ucc_set_type(uf_info->ucc_num, UCC_SPEED_TYPE_FAST);
- if (ret) {
-- printk(KERN_ERR "%s: cannot set UCC type\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: cannot set UCC type\n", __func__);
- ucc_fast_free(uccf);
- return ret;
- }
-@@ -270,7 +270,7 @@ int ucc_fast_init(struct ucc_fast_info *
- qe_muram_alloc(uf_info->utfs, UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
- if (IS_ERR_VALUE(uccf->ucc_fast_tx_virtual_fifo_base_offset)) {
- printk(KERN_ERR "%s: cannot allocate MURAM for TX FIFO\n",
-- __FUNCTION__);
-+ __func__);
- uccf->ucc_fast_tx_virtual_fifo_base_offset = 0;
- ucc_fast_free(uccf);
- return -ENOMEM;
-@@ -283,7 +283,7 @@ int ucc_fast_init(struct ucc_fast_info *
- UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
- if (IS_ERR_VALUE(uccf->ucc_fast_rx_virtual_fifo_base_offset)) {
- printk(KERN_ERR "%s: cannot allocate MURAM for RX FIFO\n",
-- __FUNCTION__);
-+ __func__);
- uccf->ucc_fast_rx_virtual_fifo_base_offset = 0;
- ucc_fast_free(uccf);
- return -ENOMEM;
-@@ -314,7 +314,7 @@ int ucc_fast_init(struct ucc_fast_info *
- ucc_set_qe_mux_rxtx(uf_info->ucc_num, uf_info->rx_clock,
- COMM_DIR_RX)) {
- printk(KERN_ERR "%s: illegal value for RX clock\n",
-- __FUNCTION__);
-+ __func__);
- ucc_fast_free(uccf);
- return -EINVAL;
- }
-@@ -323,7 +323,7 @@ int ucc_fast_init(struct ucc_fast_info *
- ucc_set_qe_mux_rxtx(uf_info->ucc_num, uf_info->tx_clock,
- COMM_DIR_TX)) {
- printk(KERN_ERR "%s: illegal value for TX clock\n",
-- __FUNCTION__);
-+ __func__);
- ucc_fast_free(uccf);
- return -EINVAL;
- }
---- a/arch/powerpc/sysdev/qe_lib/ucc_slow.c
-+++ b/arch/powerpc/sysdev/qe_lib/ucc_slow.c
-@@ -142,7 +142,7 @@ int ucc_slow_init(struct ucc_slow_info *
-
- /* check if the UCC port number is in range. */
- if ((us_info->ucc_num < 0) || (us_info->ucc_num > UCC_MAX_NUM - 1)) {
-- printk(KERN_ERR "%s: illegal UCC number\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: illegal UCC number\n", __func__);
- return -EINVAL;
- }
-
-@@ -161,7 +161,7 @@ int ucc_slow_init(struct ucc_slow_info *
- uccs = kzalloc(sizeof(struct ucc_slow_private), GFP_KERNEL);
- if (!uccs) {
- printk(KERN_ERR "%s: Cannot allocate private data\n",
-- __FUNCTION__);
-+ __func__);
- return -ENOMEM;
- }
-
-@@ -170,7 +170,7 @@ int ucc_slow_init(struct ucc_slow_info *
- /* Set the PHY base address */
- uccs->us_regs = ioremap(us_info->regs, sizeof(struct ucc_slow));
- if (uccs->us_regs == NULL) {
-- printk(KERN_ERR "%s: Cannot map UCC registers\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: Cannot map UCC registers\n", __func__);
- return -ENOMEM;
- }
-
-@@ -189,7 +189,7 @@ int ucc_slow_init(struct ucc_slow_info *
- uccs->us_pram_offset =
- qe_muram_alloc(UCC_SLOW_PRAM_SIZE, ALIGNMENT_OF_UCC_SLOW_PRAM);
- if (IS_ERR_VALUE(uccs->us_pram_offset)) {
-- printk(KERN_ERR "%s: cannot allocate MURAM for PRAM", __FUNCTION__);
-+ printk(KERN_ERR "%s: cannot allocate MURAM for PRAM", __func__);
- ucc_slow_free(uccs);
- return -ENOMEM;
- }
-@@ -202,7 +202,7 @@ int ucc_slow_init(struct ucc_slow_info *
- /* Set UCC to slow type */
- ret = ucc_set_type(us_info->ucc_num, UCC_SPEED_TYPE_SLOW);
- if (ret) {
-- printk(KERN_ERR "%s: cannot set UCC type", __FUNCTION__);
-+ printk(KERN_ERR "%s: cannot set UCC type", __func__);
- ucc_slow_free(uccs);
- return ret;
- }
-@@ -216,7 +216,7 @@ int ucc_slow_init(struct ucc_slow_info *
- qe_muram_alloc(us_info->rx_bd_ring_len * sizeof(struct qe_bd),
- QE_ALIGNMENT_OF_BD);
- if (IS_ERR_VALUE(uccs->rx_base_offset)) {
-- printk(KERN_ERR "%s: cannot allocate %u RX BDs\n", __FUNCTION__,
-+ printk(KERN_ERR "%s: cannot allocate %u RX BDs\n", __func__,
- us_info->rx_bd_ring_len);
- uccs->rx_base_offset = 0;
- ucc_slow_free(uccs);
-@@ -227,7 +227,7 @@ int ucc_slow_init(struct ucc_slow_info *
- qe_muram_alloc(us_info->tx_bd_ring_len * sizeof(struct qe_bd),
- QE_ALIGNMENT_OF_BD);
- if (IS_ERR_VALUE(uccs->tx_base_offset)) {
-- printk(KERN_ERR "%s: cannot allocate TX BDs", __FUNCTION__);
-+ printk(KERN_ERR "%s: cannot allocate TX BDs", __func__);
- uccs->tx_base_offset = 0;
- ucc_slow_free(uccs);
- return -ENOMEM;
-@@ -317,7 +317,7 @@ int ucc_slow_init(struct ucc_slow_info *
- if (ucc_set_qe_mux_rxtx(us_info->ucc_num, us_info->rx_clock,
- COMM_DIR_RX)) {
- printk(KERN_ERR "%s: illegal value for RX clock\n",
-- __FUNCTION__);
-+ __func__);
- ucc_slow_free(uccs);
- return -EINVAL;
- }
-@@ -325,7 +325,7 @@ int ucc_slow_init(struct ucc_slow_info *
- if (ucc_set_qe_mux_rxtx(us_info->ucc_num, us_info->tx_clock,
- COMM_DIR_TX)) {
- printk(KERN_ERR "%s: illegal value for TX clock\n",
-- __FUNCTION__);
-+ __func__);
- ucc_slow_free(uccs);
- return -EINVAL;
- }
---- a/arch/powerpc/sysdev/rtc_cmos_setup.c
-+++ b/arch/powerpc/sysdev/rtc_cmos_setup.c
-@@ -56,3 +56,5 @@ static int __init add_rtc(void)
- return 0;
- }
- fs_initcall(add_rtc);
-+
-+MODULE_LICENSE("GPL");
---- a/arch/powerpc/sysdev/tsi108_dev.c
-+++ b/arch/powerpc/sysdev/tsi108_dev.c
-@@ -84,7 +84,7 @@ static int __init tsi108_eth_of_init(voi
-
- ret = of_address_to_resource(np, 0, &r[0]);
- DBG("%s: name:start->end = %s:0x%lx-> 0x%lx\n",
-- __FUNCTION__,r[0].name, r[0].start, r[0].end);
-+ __func__,r[0].name, r[0].start, r[0].end);
- if (ret)
- goto err;
-
-@@ -93,7 +93,7 @@ static int __init tsi108_eth_of_init(voi
- r[1].end = irq_of_parse_and_map(np, 0);
- r[1].flags = IORESOURCE_IRQ;
- DBG("%s: name:start->end = %s:0x%lx-> 0x%lx\n",
-- __FUNCTION__,r[1].name, r[1].start, r[1].end);
-+ __func__,r[1].name, r[1].start, r[1].end);
-
- tsi_eth_dev =
- platform_device_register_simple("tsi-ethernet", i++, &r[0],
---- a/arch/powerpc/sysdev/tsi108_pci.c
-+++ b/arch/powerpc/sysdev/tsi108_pci.c
-@@ -207,7 +207,7 @@ int __init tsi108_setup_pci(struct devic
- /* PCI Config mapping */
- tsi108_pci_cfg_base = (u32)ioremap(cfg_phys, TSI108_PCI_CFG_SIZE);
- tsi108_pci_cfg_phys = cfg_phys;
-- DBG("TSI_PCI: %s tsi108_pci_cfg_base=0x%x\n", __FUNCTION__,
-+ DBG("TSI_PCI: %s tsi108_pci_cfg_base=0x%x\n", __func__,
- tsi108_pci_cfg_base);
-
- /* Fetch host bridge registers address */
-@@ -395,7 +395,7 @@ static int pci_irq_host_xlate(struct irq
- static int pci_irq_host_map(struct irq_host *h, unsigned int virq,
- irq_hw_number_t hw)
- { unsigned int irq;
-- DBG("%s(%d, 0x%lx)\n", __FUNCTION__, virq, hw);
-+ DBG("%s(%d, 0x%lx)\n", __func__, virq, hw);
- if ((virq >= 1) && (virq <= 4)){
- irq = virq + IRQ_PCI_INTAD_BASE - 1;
- get_irq_desc(irq)->status |= IRQ_LEVEL;
---- a/arch/powerpc/xmon/xmon.c
-+++ b/arch/powerpc/xmon/xmon.c
-@@ -45,7 +45,6 @@
- #ifdef CONFIG_PPC64
- #include <asm/hvcall.h>
- #include <asm/paca.h>
--#include <asm/iseries/it_lp_reg_save.h>
- #endif
-
- #include "nonstdio.h"
-@@ -1244,15 +1243,12 @@ static void get_function_bounds(unsigned
-
- static int xmon_depth_to_print = 64;
-
--#ifdef CONFIG_PPC64
--#define LRSAVE_OFFSET 0x10
--#define REG_FRAME_MARKER 0x7265677368657265ul /* "regshere" */
--#define MARKER_OFFSET 0x60
-+#define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
-+#define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
-+
-+#ifdef __powerpc64__
- #define REGS_OFFSET 0x70
- #else
--#define LRSAVE_OFFSET 4
--#define REG_FRAME_MARKER 0x72656773
--#define MARKER_OFFSET 8
- #define REGS_OFFSET 16
- #endif
-
-@@ -1318,7 +1314,7 @@ static void xmon_show_stack(unsigned lon
- /* Look for "regshere" marker to see if this is
- an exception frame. */
- if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
-- && marker == REG_FRAME_MARKER) {
-+ && marker == STACK_FRAME_REGS_MARKER) {
- if (mread(sp + REGS_OFFSET, ®s, sizeof(regs))
- != sizeof(regs)) {
- printf("Couldn't read registers at %lx\n",
-@@ -1598,7 +1594,6 @@ void super_regs(void)
- if (firmware_has_feature(FW_FEATURE_ISERIES)) {
- struct paca_struct *ptrPaca;
- struct lppaca *ptrLpPaca;
-- struct ItLpRegSave *ptrLpRegSave;
-
- /* Dump out relevant Paca data areas. */
- printf("Paca: \n");
-@@ -1611,15 +1606,6 @@ void super_regs(void)
- printf(" Saved Gpr3=%.16lx Saved Gpr4=%.16lx \n",
- ptrLpPaca->saved_gpr3, ptrLpPaca->saved_gpr4);
- printf(" Saved Gpr5=%.16lx \n", ptrLpPaca->saved_gpr5);
--
-- printf(" Local Processor Register Save Area (LpRegSave): \n");
-- ptrLpRegSave = ptrPaca->reg_save_ptr;
-- printf(" Saved Sprg0=%.16lx Saved Sprg1=%.16lx \n",
-- ptrLpRegSave->xSPRG0, ptrLpRegSave->xSPRG0);
-- printf(" Saved Sprg2=%.16lx Saved Sprg3=%.16lx \n",
-- ptrLpRegSave->xSPRG2, ptrLpRegSave->xSPRG3);
-- printf(" Saved Msr =%.16lx Saved Nia =%.16lx \n",
-- ptrLpRegSave->xMSR, ptrLpRegSave->xNIA);
- }
- #endif
-
---- a/arch/ppc/8xx_io/commproc.c
-+++ b/arch/ppc/8xx_io/commproc.c
-@@ -43,7 +43,7 @@
- ({ \
- u32 offset = offsetof(immap_t, member); \
- void *addr = ioremap (IMAP_ADDR + offset, \
-- sizeof( ((immap_t*)0)->member)); \
-+ FIELD_SIZEOF(immap_t, member)); \
- addr; \
- })
-
---- a/arch/ppc/8xx_io/fec.c
-+++ b/arch/ppc/8xx_io/fec.c
-@@ -520,7 +520,7 @@ fec_enet_interrupt(int irq, void * dev_i
- #ifdef CONFIG_USE_MDIO
- fec_enet_mii(dev);
- #else
--printk("%s[%d] %s: unexpected FEC_ENET_MII event\n", __FILE__,__LINE__,__FUNCTION__);
-+printk("%s[%d] %s: unexpected FEC_ENET_MII event\n", __FILE__, __LINE__, __func__);
- #endif /* CONFIG_USE_MDIO */
- }
-
-@@ -1441,7 +1441,7 @@ irqreturn_t mii_link_interrupt(int irq,
- fecp->fec_ecntrl = ecntrl; /* restore old settings */
- }
- #else
--printk("%s[%d] %s: unexpected Link interrupt\n", __FILE__,__LINE__,__FUNCTION__);
-+printk("%s[%d] %s: unexpected Link interrupt\n", __FILE__, __LINE__, __func__);
- #endif /* CONFIG_USE_MDIO */
-
- #ifndef CONFIG_RPXCLASSIC
---- a/arch/ppc/kernel/head.S
-+++ b/arch/ppc/kernel/head.S
-@@ -701,23 +701,6 @@ load_up_altivec:
- b fast_exception_return
-
- /*
-- * AltiVec unavailable trap from kernel - print a message, but let
-- * the task use AltiVec in the kernel until it returns to user mode.
-- */
--KernelAltiVec:
-- lwz r3,_MSR(r1)
-- oris r3,r3,MSR_VEC@h
-- stw r3,_MSR(r1) /* enable use of AltiVec after return */
-- lis r3,87f@h
-- ori r3,r3,87f@l
-- mr r4,r2 /* current */
-- lwz r5,_NIP(r1)
-- bl printk
-- b ret_from_except
--87: .string "AltiVec used in kernel (task=%p, pc=%x) \n"
-- .align 4,0
--
--/*
- * giveup_altivec(tsk)
- * Disable AltiVec for the task given as the argument,
- * and save the AltiVec registers in its thread_struct.
---- a/arch/ppc/mm/init.c
-+++ b/arch/ppc/mm/init.c
-@@ -109,7 +109,6 @@ void show_mem(void)
-
- printk("Mem-info:\n");
- show_free_areas();
-- printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
- i = max_mapnr;
- while (i-- > 0) {
- total++;
---- a/arch/ppc/platforms/radstone_ppc7d.c
-+++ b/arch/ppc/platforms/radstone_ppc7d.c
-@@ -512,7 +512,7 @@ static void __init ppc7d_init_irq(void)
- {
- int irq;
-
-- pr_debug("%s\n", __FUNCTION__);
-+ pr_debug("%s\n", __func__);
- i8259_init(0, 0);
- mv64360_init_irq();
-
-@@ -569,7 +569,7 @@ static int __init ppc7d_map_irq(struct p
- };
- const long min_idsel = 10, max_idsel = 14, irqs_per_slot = 4;
-
-- pr_debug("%s: %04x/%04x/%x: idsel=%hx pin=%hu\n", __FUNCTION__,
-+ pr_debug("%s: %04x/%04x/%x: idsel=%hx pin=%hu\n", __func__,
- dev->vendor, dev->device, PCI_FUNC(dev->devfn), idsel, pin);
-
- return PCI_IRQ_TABLE_LOOKUP;
-@@ -1300,7 +1300,7 @@ static void ppc7d_init2(void)
- u32 data;
- u8 data8;
-
-- pr_debug("%s: enter\n", __FUNCTION__);
-+ pr_debug("%s: enter\n", __func__);
-
- /* Wait for debugger? */
- if (ppc7d_wait_debugger) {
-@@ -1333,7 +1333,7 @@ static void ppc7d_init2(void)
- ppc_md.set_rtc_time = ppc7d_set_rtc_time;
- ppc_md.get_rtc_time = ppc7d_get_rtc_time;
-
-- pr_debug("%s: exit\n", __FUNCTION__);
-+ pr_debug("%s: exit\n", __func__);
- }
-
- /* Called from machine_init(), early, before any of the __init functions
---- a/arch/ppc/syslib/mpc52xx_setup.c
-+++ b/arch/ppc/syslib/mpc52xx_setup.c
-@@ -279,7 +279,7 @@ int mpc52xx_match_psc_function(int psc_i
-
- int mpc52xx_set_psc_clkdiv(int psc_id, int clkdiv)
- {
-- static spinlock_t lock = SPIN_LOCK_UNLOCKED;
-+ static DEFINE_SPINLOCK(lock);
- struct mpc52xx_cdm __iomem *cdm;
- unsigned long flags;
- u16 mclken_div;
---- a/arch/sparc64/Kconfig
-+++ b/arch/sparc64/Kconfig
-@@ -16,6 +16,7 @@ config SPARC64
- bool
- default y
- select HAVE_IDE
-+ select HAVE_LMB
- help
- SPARC is a family of RISC microprocessors designed and marketed by
- Sun Microsystems, incorporated. This port covers the newer 64-bit
---- a/drivers/block/viodasd.c
-+++ b/drivers/block/viodasd.c
-@@ -69,7 +69,7 @@ MODULE_LICENSE("GPL");
- enum {
- PARTITION_SHIFT = 3,
- MAX_DISKNO = HVMAXARCHITECTEDVIRTUALDISKS,
-- MAX_DISK_NAME = sizeof(((struct gendisk *)0)->disk_name)
-+ MAX_DISK_NAME = FIELD_SIZEOF(struct gendisk, disk_name)
- };
-
- static DEFINE_SPINLOCK(viodasd_spinlock);
---- a/drivers/char/hvc_beat.c
-+++ b/drivers/char/hvc_beat.c
-@@ -78,8 +78,8 @@ static int hvc_beat_put_chars(uint32_t v
- for (rest = cnt; rest > 0; rest -= nlen) {
- nlen = (rest > 16) ? 16 : rest;
- memcpy(kb, buf, nlen);
-- beat_put_term_char(vtermno, rest, kb[0], kb[1]);
-- rest -= nlen;
-+ beat_put_term_char(vtermno, nlen, kb[0], kb[1]);
-+ buf += nlen;
- }
- return cnt;
- }
---- a/drivers/char/xilinx_hwicap/buffer_icap.c
-+++ b/drivers/char/xilinx_hwicap/buffer_icap.c
-@@ -74,7 +74,7 @@
-
- /**
- * buffer_icap_get_status - Get the contents of the status register.
-- * @base_address: is the base address of the device
-+ * @drvdata: a pointer to the drvdata.
- *
- * The status register contains the ICAP status and the done bit.
- *
-@@ -88,9 +88,9 @@
- * D1 - Always 1
- * D0 - Done bit
- **/
--static inline u32 buffer_icap_get_status(void __iomem *base_address)
-+u32 buffer_icap_get_status(struct hwicap_drvdata *drvdata)
- {
-- return in_be32(base_address + XHI_STATUS_REG_OFFSET);
-+ return in_be32(drvdata->base_address + XHI_STATUS_REG_OFFSET);
- }
-
- /**
-@@ -117,20 +117,8 @@ static inline u32 buffer_icap_get_bram(v
- **/
- static inline bool buffer_icap_busy(void __iomem *base_address)
- {
-- return (buffer_icap_get_status(base_address) & 1) == XHI_NOT_FINISHED;
--}
--
--/**
-- * buffer_icap_busy - Return true if the icap device is not busy
-- * @base_address: is the base address of the device
-- *
-- * The queries the low order bit of the status register, which
-- * indicates whether the current configuration or readback operation
-- * has completed.
-- **/
--static inline bool buffer_icap_done(void __iomem *base_address)
--{
-- return (buffer_icap_get_status(base_address) & 1) == XHI_FINISHED;
-+ u32 status = in_be32(base_address + XHI_STATUS_REG_OFFSET);
-+ return (status & 1) == XHI_NOT_FINISHED;
- }
-
- /**
---- a/drivers/char/xilinx_hwicap/buffer_icap.h
-+++ b/drivers/char/xilinx_hwicap/buffer_icap.h
-@@ -44,8 +44,6 @@
- #include <asm/io.h>
- #include "xilinx_hwicap.h"
-
--void buffer_icap_reset(struct hwicap_drvdata *drvdata);
--
- /* Loads a partial bitstream from system memory. */
- int buffer_icap_set_configuration(struct hwicap_drvdata *drvdata, u32 *data,
- u32 Size);
-@@ -54,4 +52,7 @@ int buffer_icap_set_configuration(struct
- int buffer_icap_get_configuration(struct hwicap_drvdata *drvdata, u32 *data,
- u32 Size);
-
-+u32 buffer_icap_get_status(struct hwicap_drvdata *drvdata);
-+void buffer_icap_reset(struct hwicap_drvdata *drvdata);
-+
- #endif
---- a/drivers/char/xilinx_hwicap/fifo_icap.c
-+++ b/drivers/char/xilinx_hwicap/fifo_icap.c
-@@ -78,13 +78,6 @@
- #define XHI_CR_READ_MASK 0x00000002 /* Read from ICAP to FIFO */
- #define XHI_CR_WRITE_MASK 0x00000001 /* Write from FIFO to ICAP */
-
--/* Status Register (SR) */
--#define XHI_SR_CFGERR_N_MASK 0x00000100 /* Config Error Mask */
--#define XHI_SR_DALIGN_MASK 0x00000080 /* Data Alignment Mask */
--#define XHI_SR_RIP_MASK 0x00000040 /* Read back Mask */
--#define XHI_SR_IN_ABORT_N_MASK 0x00000020 /* Select Map Abort Mask */
--#define XHI_SR_DONE_MASK 0x00000001 /* Done bit Mask */
--
-
- #define XHI_WFO_MAX_VACANCY 1024 /* Max Write FIFO Vacancy, in words */
- #define XHI_RFO_MAX_OCCUPANCY 256 /* Max Read FIFO Occupancy, in words */
-@@ -152,13 +145,35 @@ static inline void fifo_icap_start_readb
- }
-
- /**
-+ * fifo_icap_get_status - Get the contents of the status register.
-+ * @drvdata: a pointer to the drvdata.
-+ *
-+ * The status register contains the ICAP status and the done bit.
-+ *
-+ * D8 - cfgerr
-+ * D7 - dalign
-+ * D6 - rip
-+ * D5 - in_abort_l
-+ * D4 - Always 1
-+ * D3 - Always 1
-+ * D2 - Always 1
-+ * D1 - Always 1
-+ * D0 - Done bit
-+ **/
-+u32 fifo_icap_get_status(struct hwicap_drvdata *drvdata)
-+{
-+ u32 status = in_be32(drvdata->base_address + XHI_SR_OFFSET);
-+ dev_dbg(drvdata->dev, "Getting status = %x\n", status);
-+ return status;
-+}
-+
-+/**
- * fifo_icap_busy - Return true if the ICAP is still processing a transaction.
- * @drvdata: a pointer to the drvdata.
- **/
- static inline u32 fifo_icap_busy(struct hwicap_drvdata *drvdata)
- {
- u32 status = in_be32(drvdata->base_address + XHI_SR_OFFSET);
-- dev_dbg(drvdata->dev, "Getting status = %x\n", status);
- return (status & XHI_SR_DONE_MASK) ? 0 : 1;
- }
-
---- a/drivers/char/xilinx_hwicap/fifo_icap.h
-+++ b/drivers/char/xilinx_hwicap/fifo_icap.h
-@@ -56,6 +56,7 @@ int fifo_icap_set_configuration(
- u32 *FrameBuffer,
- u32 NumWords);
-
-+u32 fifo_icap_get_status(struct hwicap_drvdata *drvdata);
- void fifo_icap_reset(struct hwicap_drvdata *drvdata);
- void fifo_icap_flush_fifo(struct hwicap_drvdata *drvdata);
-
---- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c
-+++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c
-@@ -36,7 +36,7 @@
- *****************************************************************************/
-
- /*
-- * This is the code behind /dev/xilinx_icap -- it allows a user-space
-+ * This is the code behind /dev/icap* -- it allows a user-space
- * application to use the Xilinx ICAP subsystem.
- *
- * The following operations are possible:
-@@ -67,7 +67,7 @@
- * user-space application code that uses this device. The simplest
- * way to use this interface is simply:
- *
-- * cp foo.bit /dev/xilinx_icap
-+ * cp foo.bit /dev/icap0
- *
- * Note that unless foo.bit is an appropriately constructed partial
- * bitstream, this has a high likelyhood of overwriting the design
-@@ -105,18 +105,14 @@
- #include "buffer_icap.h"
- #include "fifo_icap.h"
-
--#define DRIVER_NAME "xilinx_icap"
-+#define DRIVER_NAME "icap"
-
- #define HWICAP_REGS (0x10000)
-
--/* dynamically allocate device number */
--static int xhwicap_major;
--static int xhwicap_minor;
-+#define XHWICAP_MAJOR 259
-+#define XHWICAP_MINOR 0
- #define HWICAP_DEVICES 1
-
--module_param(xhwicap_major, int, S_IRUGO);
--module_param(xhwicap_minor, int, S_IRUGO);
--
- /* An array, which is set to true when the device is registered. */
- static bool probed_devices[HWICAP_DEVICES];
- static struct mutex icap_sem;
-@@ -250,8 +246,26 @@ static int hwicap_get_configuration_regi
- * Create the data to be written to the ICAP.
- */
- buffer[index++] = XHI_DUMMY_PACKET;
-+ buffer[index++] = XHI_NOOP_PACKET;
- buffer[index++] = XHI_SYNC_PACKET;
- buffer[index++] = XHI_NOOP_PACKET;
-+ buffer[index++] = XHI_NOOP_PACKET;
-+
-+ /*
-+ * Write the data to the FIFO and initiate the transfer of data present
-+ * in the FIFO to the ICAP device.
-+ */
-+ status = drvdata->config->set_configuration(drvdata,
-+ &buffer[0], index);
-+ if (status)
-+ return status;
-+
-+ /* If the syncword was not found, then we need to start over. */
-+ status = drvdata->config->get_status(drvdata);
-+ if ((status & XHI_SR_DALIGN_MASK) != XHI_SR_DALIGN_MASK)
-+ return -EIO;
-+
-+ index = 0;
- buffer[index++] = hwicap_type_1_read(reg) | 1;
- buffer[index++] = XHI_NOOP_PACKET;
- buffer[index++] = XHI_NOOP_PACKET;
-@@ -587,7 +601,7 @@ static int __devinit hwicap_setup(struct
- probed_devices[id] = 1;
- mutex_unlock(&icap_sem);
-
-- devt = MKDEV(xhwicap_major, xhwicap_minor + id);
-+ devt = MKDEV(XHWICAP_MAJOR, XHWICAP_MINOR + id);
-
- drvdata = kzalloc(sizeof(struct hwicap_drvdata), GFP_KERNEL);
- if (!drvdata) {
-@@ -664,12 +678,14 @@ static int __devinit hwicap_setup(struct
- static struct hwicap_driver_config buffer_icap_config = {
- .get_configuration = buffer_icap_get_configuration,
- .set_configuration = buffer_icap_set_configuration,
-+ .get_status = buffer_icap_get_status,
- .reset = buffer_icap_reset,
- };
-
- static struct hwicap_driver_config fifo_icap_config = {
- .get_configuration = fifo_icap_get_configuration,
- .set_configuration = fifo_icap_set_configuration,
-+ .get_status = fifo_icap_get_status,
- .reset = fifo_icap_reset,
- };
-
-@@ -690,7 +706,7 @@ static int __devexit hwicap_remove(struc
- dev_set_drvdata(dev, NULL);
-
- mutex_lock(&icap_sem);
-- probed_devices[MINOR(dev->devt)-xhwicap_minor] = 0;
-+ probed_devices[MINOR(dev->devt)-XHWICAP_MINOR] = 0;
- mutex_unlock(&icap_sem);
- return 0; /* success */
- }
-@@ -830,23 +846,12 @@ static int __init hwicap_module_init(voi
- icap_class = class_create(THIS_MODULE, "xilinx_config");
- mutex_init(&icap_sem);
-
-- if (xhwicap_major) {
-- devt = MKDEV(xhwicap_major, xhwicap_minor);
-- retval = register_chrdev_region(
-- devt,
-- HWICAP_DEVICES,
-- DRIVER_NAME);
-- if (retval < 0)
-- return retval;
-- } else {
-- retval = alloc_chrdev_region(&devt,
-- xhwicap_minor,
-- HWICAP_DEVICES,
-- DRIVER_NAME);
-- if (retval < 0)
-- return retval;
-- xhwicap_major = MAJOR(devt);
-- }
-+ devt = MKDEV(XHWICAP_MAJOR, XHWICAP_MINOR);
-+ retval = register_chrdev_region(devt,
-+ HWICAP_DEVICES,
-+ DRIVER_NAME);
-+ if (retval < 0)
-+ return retval;
-
- retval = platform_driver_register(&hwicap_platform_driver);
-
-@@ -871,7 +876,7 @@ static int __init hwicap_module_init(voi
-
- static void __exit hwicap_module_cleanup(void)
- {
-- dev_t devt = MKDEV(xhwicap_major, xhwicap_minor);
-+ dev_t devt = MKDEV(XHWICAP_MAJOR, XHWICAP_MINOR);
-
- class_destroy(icap_class);
-
---- a/drivers/char/xilinx_hwicap/xilinx_hwicap.h
-+++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.h
-@@ -65,10 +65,27 @@ struct hwicap_drvdata {
- };
-
- struct hwicap_driver_config {
-+ /* Read configuration data given by size into the data buffer.
-+ Return 0 if successful. */
- int (*get_configuration)(struct hwicap_drvdata *drvdata, u32 *data,
- u32 size);
-+ /* Write configuration data given by size from the data buffer.
-+ Return 0 if successful. */
- int (*set_configuration)(struct hwicap_drvdata *drvdata, u32 *data,
- u32 size);
-+ /* Get the status register, bit pattern given by:
-+ * D8 - 0 = configuration error
-+ * D7 - 1 = alignment found
-+ * D6 - 1 = readback in progress
-+ * D5 - 0 = abort in progress
-+ * D4 - Always 1
-+ * D3 - Always 1
-+ * D2 - Always 1
-+ * D1 - Always 1
-+ * D0 - 1 = operation completed
-+ */
-+ u32 (*get_status)(struct hwicap_drvdata *drvdata);
-+ /* Reset the hw */
- void (*reset)(struct hwicap_drvdata *drvdata);
- };
-
-@@ -163,6 +180,13 @@ struct config_registers {
- /* Constant to use for CRC check when CRC has been disabled */
- #define XHI_DISABLED_AUTO_CRC 0x0000DEFCUL
-
-+/* Meanings of the bits returned by get_status */
-+#define XHI_SR_CFGERR_N_MASK 0x00000100 /* Config Error Mask */
-+#define XHI_SR_DALIGN_MASK 0x00000080 /* Data Alignment Mask */
-+#define XHI_SR_RIP_MASK 0x00000040 /* Read back Mask */
-+#define XHI_SR_IN_ABORT_N_MASK 0x00000020 /* Select Map Abort Mask */
-+#define XHI_SR_DONE_MASK 0x00000001 /* Done bit Mask */
-+
- /**
- * hwicap_type_1_read - Generates a Type 1 read packet header.
- * @reg: is the address of the register to be read back.
---- a/drivers/mtd/nand/fsl_elbc_nand.c
-+++ b/drivers/mtd/nand/fsl_elbc_nand.c
-@@ -36,207 +36,12 @@
- #include <linux/mtd/partitions.h>
-
- #include <asm/io.h>
--
-+#include <asm/fsl_lbc.h>
-
- #define MAX_BANKS 8
- #define ERR_BYTE 0xFF /* Value returned for read bytes when read failed */
- #define FCM_TIMEOUT_MSECS 500 /* Maximum number of mSecs to wait for FCM */
-
--struct elbc_bank {
-- __be32 br; /**< Base Register */
--#define BR_BA 0xFFFF8000
--#define BR_BA_SHIFT 15
--#define BR_PS 0x00001800
--#define BR_PS_SHIFT 11
--#define BR_PS_8 0x00000800 /* Port Size 8 bit */
--#define BR_PS_16 0x00001000 /* Port Size 16 bit */
--#define BR_PS_32 0x00001800 /* Port Size 32 bit */
--#define BR_DECC 0x00000600
--#define BR_DECC_SHIFT 9
--#define BR_DECC_OFF 0x00000000 /* HW ECC checking and generation off */
--#define BR_DECC_CHK 0x00000200 /* HW ECC checking on, generation off */
--#define BR_DECC_CHK_GEN 0x00000400 /* HW ECC checking and generation on */
--#define BR_WP 0x00000100
--#define BR_WP_SHIFT 8
--#define BR_MSEL 0x000000E0
--#define BR_MSEL_SHIFT 5
--#define BR_MS_GPCM 0x00000000 /* GPCM */
--#define BR_MS_FCM 0x00000020 /* FCM */
--#define BR_MS_SDRAM 0x00000060 /* SDRAM */
--#define BR_MS_UPMA 0x00000080 /* UPMA */
--#define BR_MS_UPMB 0x000000A0 /* UPMB */
--#define BR_MS_UPMC 0x000000C0 /* UPMC */
--#define BR_V 0x00000001
--#define BR_V_SHIFT 0
--#define BR_RES ~(BR_BA|BR_PS|BR_DECC|BR_WP|BR_MSEL|BR_V)
--
-- __be32 or; /**< Base Register */
--#define OR0 0x5004
--#define OR1 0x500C
--#define OR2 0x5014
--#define OR3 0x501C
--#define OR4 0x5024
--#define OR5 0x502C
--#define OR6 0x5034
--#define OR7 0x503C
--
--#define OR_FCM_AM 0xFFFF8000
--#define OR_FCM_AM_SHIFT 15
--#define OR_FCM_BCTLD 0x00001000
--#define OR_FCM_BCTLD_SHIFT 12
--#define OR_FCM_PGS 0x00000400
--#define OR_FCM_PGS_SHIFT 10
--#define OR_FCM_CSCT 0x00000200
--#define OR_FCM_CSCT_SHIFT 9
--#define OR_FCM_CST 0x00000100
--#define OR_FCM_CST_SHIFT 8
--#define OR_FCM_CHT 0x00000080
--#define OR_FCM_CHT_SHIFT 7
--#define OR_FCM_SCY 0x00000070
--#define OR_FCM_SCY_SHIFT 4
--#define OR_FCM_SCY_1 0x00000010
--#define OR_FCM_SCY_2 0x00000020
--#define OR_FCM_SCY_3 0x00000030
--#define OR_FCM_SCY_4 0x00000040
--#define OR_FCM_SCY_5 0x00000050
--#define OR_FCM_SCY_6 0x00000060
--#define OR_FCM_SCY_7 0x00000070
--#define OR_FCM_RST 0x00000008
--#define OR_FCM_RST_SHIFT 3
--#define OR_FCM_TRLX 0x00000004
--#define OR_FCM_TRLX_SHIFT 2
--#define OR_FCM_EHTR 0x00000002
--#define OR_FCM_EHTR_SHIFT 1
--};
--
--struct elbc_regs {
-- struct elbc_bank bank[8];
-- u8 res0[0x28];
-- __be32 mar; /**< UPM Address Register */
-- u8 res1[0x4];
-- __be32 mamr; /**< UPMA Mode Register */
-- __be32 mbmr; /**< UPMB Mode Register */
-- __be32 mcmr; /**< UPMC Mode Register */
-- u8 res2[0x8];
-- __be32 mrtpr; /**< Memory Refresh Timer Prescaler Register */
-- __be32 mdr; /**< UPM Data Register */
-- u8 res3[0x4];
-- __be32 lsor; /**< Special Operation Initiation Register */
-- __be32 lsdmr; /**< SDRAM Mode Register */
-- u8 res4[0x8];
-- __be32 lurt; /**< UPM Refresh Timer */
-- __be32 lsrt; /**< SDRAM Refresh Timer */
-- u8 res5[0x8];
-- __be32 ltesr; /**< Transfer Error Status Register */
--#define LTESR_BM 0x80000000
--#define LTESR_FCT 0x40000000
--#define LTESR_PAR 0x20000000
--#define LTESR_WP 0x04000000
--#define LTESR_ATMW 0x00800000
--#define LTESR_ATMR 0x00400000
--#define LTESR_CS 0x00080000
--#define LTESR_CC 0x00000001
--#define LTESR_NAND_MASK (LTESR_FCT | LTESR_PAR | LTESR_CC)
-- __be32 ltedr; /**< Transfer Error Disable Register */
-- __be32 lteir; /**< Transfer Error Interrupt Register */
-- __be32 lteatr; /**< Transfer Error Attributes Register */
-- __be32 ltear; /**< Transfer Error Address Register */
-- u8 res6[0xC];
-- __be32 lbcr; /**< Configuration Register */
--#define LBCR_LDIS 0x80000000
--#define LBCR_LDIS_SHIFT 31
--#define LBCR_BCTLC 0x00C00000
--#define LBCR_BCTLC_SHIFT 22
--#define LBCR_AHD 0x00200000
--#define LBCR_LPBSE 0x00020000
--#define LBCR_LPBSE_SHIFT 17
--#define LBCR_EPAR 0x00010000
--#define LBCR_EPAR_SHIFT 16
--#define LBCR_BMT 0x0000FF00
--#define LBCR_BMT_SHIFT 8
--#define LBCR_INIT 0x00040000
-- __be32 lcrr; /**< Clock Ratio Register */
--#define LCRR_DBYP 0x80000000
--#define LCRR_DBYP_SHIFT 31
--#define LCRR_BUFCMDC 0x30000000
--#define LCRR_BUFCMDC_SHIFT 28
--#define LCRR_ECL 0x03000000
--#define LCRR_ECL_SHIFT 24
--#define LCRR_EADC 0x00030000
--#define LCRR_EADC_SHIFT 16
--#define LCRR_CLKDIV 0x0000000F
--#define LCRR_CLKDIV_SHIFT 0
-- u8 res7[0x8];
-- __be32 fmr; /**< Flash Mode Register */
--#define FMR_CWTO 0x0000F000
--#define FMR_CWTO_SHIFT 12
--#define FMR_BOOT 0x00000800
--#define FMR_ECCM 0x00000100
--#define FMR_AL 0x00000030
--#define FMR_AL_SHIFT 4
--#define FMR_OP 0x00000003
--#define FMR_OP_SHIFT 0
-- __be32 fir; /**< Flash Instruction Register */
--#define FIR_OP0 0xF0000000
--#define FIR_OP0_SHIFT 28
--#define FIR_OP1 0x0F000000
--#define FIR_OP1_SHIFT 24
--#define FIR_OP2 0x00F00000
--#define FIR_OP2_SHIFT 20
--#define FIR_OP3 0x000F0000
--#define FIR_OP3_SHIFT 16
--#define FIR_OP4 0x0000F000
--#define FIR_OP4_SHIFT 12
--#define FIR_OP5 0x00000F00
--#define FIR_OP5_SHIFT 8
--#define FIR_OP6 0x000000F0
--#define FIR_OP6_SHIFT 4
--#define FIR_OP7 0x0000000F
--#define FIR_OP7_SHIFT 0
--#define FIR_OP_NOP 0x0 /* No operation and end of sequence */
--#define FIR_OP_CA 0x1 /* Issue current column address */
--#define FIR_OP_PA 0x2 /* Issue current block+page address */
--#define FIR_OP_UA 0x3 /* Issue user defined address */
--#define FIR_OP_CM0 0x4 /* Issue command from FCR[CMD0] */
--#define FIR_OP_CM1 0x5 /* Issue command from FCR[CMD1] */
--#define FIR_OP_CM2 0x6 /* Issue command from FCR[CMD2] */
--#define FIR_OP_CM3 0x7 /* Issue command from FCR[CMD3] */
--#define FIR_OP_WB 0x8 /* Write FBCR bytes from FCM buffer */
--#define FIR_OP_WS 0x9 /* Write 1 or 2 bytes from MDR[AS] */
--#define FIR_OP_RB 0xA /* Read FBCR bytes to FCM buffer */
--#define FIR_OP_RS 0xB /* Read 1 or 2 bytes to MDR[AS] */
--#define FIR_OP_CW0 0xC /* Wait then issue FCR[CMD0] */
--#define FIR_OP_CW1 0xD /* Wait then issue FCR[CMD1] */
--#define FIR_OP_RBW 0xE /* Wait then read FBCR bytes */
--#define FIR_OP_RSW 0xE /* Wait then read 1 or 2 bytes */
-- __be32 fcr; /**< Flash Command Register */
--#define FCR_CMD0 0xFF000000
--#define FCR_CMD0_SHIFT 24
--#define FCR_CMD1 0x00FF0000
--#define FCR_CMD1_SHIFT 16
--#define FCR_CMD2 0x0000FF00
--#define FCR_CMD2_SHIFT 8
--#define FCR_CMD3 0x000000FF
--#define FCR_CMD3_SHIFT 0
-- __be32 fbar; /**< Flash Block Address Register */
--#define FBAR_BLK 0x00FFFFFF
-- __be32 fpar; /**< Flash Page Address Register */
--#define FPAR_SP_PI 0x00007C00
--#define FPAR_SP_PI_SHIFT 10
--#define FPAR_SP_MS 0x00000200
--#define FPAR_SP_CI 0x000001FF
--#define FPAR_SP_CI_SHIFT 0
--#define FPAR_LP_PI 0x0003F000
--#define FPAR_LP_PI_SHIFT 12
--#define FPAR_LP_MS 0x00000800
--#define FPAR_LP_CI 0x000007FF
--#define FPAR_LP_CI_SHIFT 0
-- __be32 fbcr; /**< Flash Byte Count Register */
--#define FBCR_BC 0x00000FFF
-- u8 res11[0x8];
-- u8 res8[0xF00];
--};
--
- struct fsl_elbc_ctrl;
-
- /* mtd information per set */
-@@ -261,7 +66,7 @@ struct fsl_elbc_ctrl {
-
- /* device info */
- struct device *dev;
-- struct elbc_regs __iomem *regs;
-+ struct fsl_lbc_regs __iomem *regs;
- int irq;
- wait_queue_head_t irq_wait;
- unsigned int irq_status; /* status read from LTESR by irq handler */
-@@ -322,7 +127,7 @@ static void set_addr(struct mtd_info *mt
- struct nand_chip *chip = mtd->priv;
- struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
-- struct elbc_regs __iomem *lbc = ctrl->regs;
-+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
- int buf_num;
-
- ctrl->page = page_addr;
-@@ -363,7 +168,7 @@ static int fsl_elbc_run_command(struct m
- struct nand_chip *chip = mtd->priv;
- struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
-- struct elbc_regs __iomem *lbc = ctrl->regs;
-+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
-
- /* Setup the FMR[OP] to execute without write protection */
- out_be32(&lbc->fmr, priv->fmr | 3);
-@@ -406,7 +211,7 @@ static void fsl_elbc_do_read(struct nand
- {
- struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
-- struct elbc_regs __iomem *lbc = ctrl->regs;
-+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
-
- if (priv->page_size) {
- out_be32(&lbc->fir,
-@@ -439,7 +244,7 @@ static void fsl_elbc_cmdfunc(struct mtd_
- struct nand_chip *chip = mtd->priv;
- struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
-- struct elbc_regs __iomem *lbc = ctrl->regs;
-+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
-
- ctrl->use_mdr = 0;
-
-@@ -775,7 +580,7 @@ static int fsl_elbc_wait(struct mtd_info
- {
- struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
-- struct elbc_regs __iomem *lbc = ctrl->regs;
-+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
-
- if (ctrl->status != LTESR_CC)
- return NAND_STATUS_FAIL;
-@@ -807,7 +612,7 @@ static int fsl_elbc_chip_init_tail(struc
- struct nand_chip *chip = mtd->priv;
- struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
-- struct elbc_regs __iomem *lbc = ctrl->regs;
-+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
- unsigned int al;
-
- /* calculate FMR Address Length field */
-@@ -922,7 +727,7 @@ static void fsl_elbc_write_page(struct m
- static int fsl_elbc_chip_init(struct fsl_elbc_mtd *priv)
- {
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
-- struct elbc_regs __iomem *lbc = ctrl->regs;
-+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
- struct nand_chip *chip = &priv->chip;
-
- dev_dbg(priv->dev, "eLBC Set Information for bank %d\n", priv->bank);
-@@ -986,7 +791,7 @@ static int fsl_elbc_chip_remove(struct f
- static int fsl_elbc_chip_probe(struct fsl_elbc_ctrl *ctrl,
- struct device_node *node)
- {
-- struct elbc_regs __iomem *lbc = ctrl->regs;
-+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
- struct fsl_elbc_mtd *priv;
- struct resource res;
- #ifdef CONFIG_MTD_PARTITIONS
-@@ -1083,7 +888,7 @@ err:
-
- static int __devinit fsl_elbc_ctrl_init(struct fsl_elbc_ctrl *ctrl)
- {
-- struct elbc_regs __iomem *lbc = ctrl->regs;
-+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
-
- /* clear event registers */
- setbits32(&lbc->ltesr, LTESR_NAND_MASK);
-@@ -1128,7 +933,7 @@ static int __devexit fsl_elbc_ctrl_remov
- static irqreturn_t fsl_elbc_ctrl_irq(int irqno, void *data)
- {
- struct fsl_elbc_ctrl *ctrl = data;
-- struct elbc_regs __iomem *lbc = ctrl->regs;
-+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
- __be32 status = in_be32(&lbc->ltesr) & LTESR_NAND_MASK;
-
- if (status) {
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -219,7 +219,8 @@ obj-$(CONFIG_SMC911X) += smc911x.o
- obj-$(CONFIG_BFIN_MAC) += bfin_mac.o
- obj-$(CONFIG_DM9000) += dm9000.o
- obj-$(CONFIG_FEC_8XX) += fec_8xx/
--obj-$(CONFIG_PASEMI_MAC) += pasemi_mac.o
-+obj-$(CONFIG_PASEMI_MAC) += pasemi_mac_driver.o
-+pasemi_mac_driver-objs := pasemi_mac.o pasemi_mac_ethtool.o
- obj-$(CONFIG_MLX4_CORE) += mlx4/
- obj-$(CONFIG_ENC28J60) += enc28j60.o
-
---- a/drivers/net/iseries_veth.c
-+++ b/drivers/net/iseries_veth.c
-@@ -308,7 +308,8 @@ static void veth_complete_allocation(voi
-
- static int veth_allocate_events(HvLpIndex rlp, int number)
- {
-- struct veth_allocation vc = { COMPLETION_INITIALIZER(vc.c), 0 };
-+ struct veth_allocation vc =
-+ { COMPLETION_INITIALIZER_ONSTACK(vc.c), 0 };
-
- mf_allocate_lp_events(rlp, HvLpEvent_Type_VirtualLan,
- sizeof(struct veth_lpevent), number,
---- a/drivers/net/pasemi_mac.c
-+++ b/drivers/net/pasemi_mac.c
-@@ -55,15 +55,10 @@
- * - Multiqueue RX/TX
- */
-
--
--/* Must be a power of two */
--#define RX_RING_SIZE 2048
--#define TX_RING_SIZE 4096
--
- #define LRO_MAX_AGGR 64
-
- #define PE_MIN_MTU 64
--#define PE_MAX_MTU 1500
-+#define PE_MAX_MTU 9000
- #define PE_DEF_MTU ETH_DATA_LEN
-
- #define DEFAULT_MSG_ENABLE \
-@@ -76,16 +71,6 @@
- NETIF_MSG_RX_ERR | \
- NETIF_MSG_TX_ERR)
-
--#define TX_DESC(tx, num) ((tx)->chan.ring_virt[(num) & (TX_RING_SIZE-1)])
--#define TX_DESC_INFO(tx, num) ((tx)->ring_info[(num) & (TX_RING_SIZE-1)])
--#define RX_DESC(rx, num) ((rx)->chan.ring_virt[(num) & (RX_RING_SIZE-1)])
--#define RX_DESC_INFO(rx, num) ((rx)->ring_info[(num) & (RX_RING_SIZE-1)])
--#define RX_BUFF(rx, num) ((rx)->buffers[(num) & (RX_RING_SIZE-1)])
--
--#define RING_USED(ring) (((ring)->next_to_fill - (ring)->next_to_clean) \
-- & ((ring)->size - 1))
--#define RING_AVAIL(ring) ((ring->size) - RING_USED(ring))
--
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR ("Olof Johansson <olof@lixom.net>");
- MODULE_DESCRIPTION("PA Semi PWRficient Ethernet driver");
-@@ -94,6 +79,8 @@ static int debug = -1; /* -1 == use DEFA
- module_param(debug, int, 0);
- MODULE_PARM_DESC(debug, "PA Semi MAC bitmapped debugging message enable value");
-
-+extern const struct ethtool_ops pasemi_mac_ethtool_ops;
-+
- static int translation_enabled(void)
- {
- #if defined(CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE)
-@@ -322,6 +309,104 @@ static int pasemi_mac_unmap_tx_skb(struc
- return (nfrags + 3) & ~1;
- }
-
-+static struct pasemi_mac_csring *pasemi_mac_setup_csring(struct pasemi_mac *mac)
-+{
-+ struct pasemi_mac_csring *ring;
-+ u32 val;
-+ unsigned int cfg;
-+ int chno;
-+
-+ ring = pasemi_dma_alloc_chan(TXCHAN, sizeof(struct pasemi_mac_csring),
-+ offsetof(struct pasemi_mac_csring, chan));
-+
-+ if (!ring) {
-+ dev_err(&mac->pdev->dev, "Can't allocate checksum channel\n");
-+ goto out_chan;
-+ }
-+
-+ chno = ring->chan.chno;
-+
-+ ring->size = CS_RING_SIZE;
-+ ring->next_to_fill = 0;
-+
-+ /* Allocate descriptors */
-+ if (pasemi_dma_alloc_ring(&ring->chan, CS_RING_SIZE))
-+ goto out_ring_desc;
-+
-+ write_dma_reg(PAS_DMA_TXCHAN_BASEL(chno),
-+ PAS_DMA_TXCHAN_BASEL_BRBL(ring->chan.ring_dma));
-+ val = PAS_DMA_TXCHAN_BASEU_BRBH(ring->chan.ring_dma >> 32);
-+ val |= PAS_DMA_TXCHAN_BASEU_SIZ(CS_RING_SIZE >> 3);
-+
-+ write_dma_reg(PAS_DMA_TXCHAN_BASEU(chno), val);
-+
-+ ring->events[0] = pasemi_dma_alloc_flag();
-+ ring->events[1] = pasemi_dma_alloc_flag();
-+ if (ring->events[0] < 0 || ring->events[1] < 0)
-+ goto out_flags;
-+
-+ pasemi_dma_clear_flag(ring->events[0]);
-+ pasemi_dma_clear_flag(ring->events[1]);
-+
-+ ring->fun = pasemi_dma_alloc_fun();
-+ if (ring->fun < 0)
-+ goto out_fun;
-+
-+ cfg = PAS_DMA_TXCHAN_CFG_TY_FUNC | PAS_DMA_TXCHAN_CFG_UP |
-+ PAS_DMA_TXCHAN_CFG_TATTR(ring->fun) |
-+ PAS_DMA_TXCHAN_CFG_LPSQ | PAS_DMA_TXCHAN_CFG_LPDQ;
-+
-+ if (translation_enabled())
-+ cfg |= PAS_DMA_TXCHAN_CFG_TRD | PAS_DMA_TXCHAN_CFG_TRR;
-+
-+ write_dma_reg(PAS_DMA_TXCHAN_CFG(chno), cfg);
-+
-+ /* enable channel */
-+ pasemi_dma_start_chan(&ring->chan, PAS_DMA_TXCHAN_TCMDSTA_SZ |
-+ PAS_DMA_TXCHAN_TCMDSTA_DB |
-+ PAS_DMA_TXCHAN_TCMDSTA_DE |
-+ PAS_DMA_TXCHAN_TCMDSTA_DA);
-+
-+ return ring;
-+
-+out_fun:
-+out_flags:
-+ if (ring->events[0] >= 0)
-+ pasemi_dma_free_flag(ring->events[0]);
-+ if (ring->events[1] >= 0)
-+ pasemi_dma_free_flag(ring->events[1]);
-+ pasemi_dma_free_ring(&ring->chan);
-+out_ring_desc:
-+ pasemi_dma_free_chan(&ring->chan);
-+out_chan:
-+
-+ return NULL;
-+}
-+
-+static void pasemi_mac_setup_csrings(struct pasemi_mac *mac)
-+{
-+ int i;
-+ mac->cs[0] = pasemi_mac_setup_csring(mac);
-+ if (mac->type == MAC_TYPE_XAUI)
-+ mac->cs[1] = pasemi_mac_setup_csring(mac);
-+ else
-+ mac->cs[1] = 0;
-+
-+ for (i = 0; i < MAX_CS; i++)
-+ if (mac->cs[i])
-+ mac->num_cs++;
-+}
-+
-+static void pasemi_mac_free_csring(struct pasemi_mac_csring *csring)
-+{
-+ pasemi_dma_stop_chan(&csring->chan);
-+ pasemi_dma_free_flag(csring->events[0]);
-+ pasemi_dma_free_flag(csring->events[1]);
-+ pasemi_dma_free_ring(&csring->chan);
-+ pasemi_dma_free_chan(&csring->chan);
-+ pasemi_dma_free_fun(csring->fun);
-+}
-+
- static int pasemi_mac_setup_rx_resources(const struct net_device *dev)
- {
- struct pasemi_mac_rxring *ring;
-@@ -445,7 +530,7 @@ pasemi_mac_setup_tx_resources(const stru
- cfg = PAS_DMA_TXCHAN_CFG_TY_IFACE |
- PAS_DMA_TXCHAN_CFG_TATTR(mac->dma_if) |
- PAS_DMA_TXCHAN_CFG_UP |
-- PAS_DMA_TXCHAN_CFG_WT(2);
-+ PAS_DMA_TXCHAN_CFG_WT(4);
-
- if (translation_enabled())
- cfg |= PAS_DMA_TXCHAN_CFG_TRD | PAS_DMA_TXCHAN_CFG_TRR;
-@@ -810,13 +895,21 @@ restart:
- u64 mactx = TX_DESC(txring, i);
- struct sk_buff *skb;
-
-- skb = TX_DESC_INFO(txring, i+1).skb;
-- nr_frags = TX_DESC_INFO(txring, i).dma;
--
- if ((mactx & XCT_MACTX_E) ||
- (*chan->status & PAS_STATUS_ERROR))
- pasemi_mac_tx_error(mac, mactx);
-
-+ /* Skip over control descriptors */
-+ if (!(mactx & XCT_MACTX_LLEN_M)) {
-+ TX_DESC(txring, i) = 0;
-+ TX_DESC(txring, i+1) = 0;
-+ buf_count = 2;
-+ continue;
-+ }
-+
-+ skb = TX_DESC_INFO(txring, i+1).skb;
-+ nr_frags = TX_DESC_INFO(txring, i).dma;
-+
- if (unlikely(mactx & XCT_MACTX_O))
- /* Not yet transmitted */
- break;
-@@ -1041,13 +1134,7 @@ static int pasemi_mac_open(struct net_de
- {
- struct pasemi_mac *mac = netdev_priv(dev);
- unsigned int flags;
-- int ret;
--
-- /* enable rx section */
-- write_dma_reg(PAS_DMA_COM_RXCMD, PAS_DMA_COM_RXCMD_EN);
--
-- /* enable tx section */
-- write_dma_reg(PAS_DMA_COM_TXCMD, PAS_DMA_COM_TXCMD_EN);
-+ int i, ret;
-
- flags = PAS_MAC_CFG_TXP_FCE | PAS_MAC_CFG_TXP_FPC(3) |
- PAS_MAC_CFG_TXP_SL(3) | PAS_MAC_CFG_TXP_COB(0xf) |
-@@ -1064,6 +1151,19 @@ static int pasemi_mac_open(struct net_de
- if (!mac->tx)
- goto out_tx_ring;
-
-+ /* We might already have allocated rings in case mtu was changed
-+ * before interface was brought up.
-+ */
-+ if (dev->mtu > 1500 && !mac->num_cs) {
-+ pasemi_mac_setup_csrings(mac);
-+ if (!mac->num_cs)
-+ goto out_tx_ring;
-+ }
-+
-+ /* Zero out rmon counters */
-+ for (i = 0; i < 32; i++)
-+ write_mac_reg(mac, PAS_MAC_RMON(i), 0);
-+
- /* 0x3ff with 33MHz clock is about 31us */
- write_iob_reg(PAS_IOB_DMA_COM_TIMEOUTCFG,
- PAS_IOB_DMA_COM_TIMEOUTCFG_TCNT(0x3ff));
-@@ -1247,7 +1347,7 @@ static int pasemi_mac_close(struct net_d
- {
- struct pasemi_mac *mac = netdev_priv(dev);
- unsigned int sta;
-- int rxch, txch;
-+ int rxch, txch, i;
-
- rxch = rx_ring(mac)->chan.chno;
- txch = tx_ring(mac)->chan.chno;
-@@ -1292,6 +1392,13 @@ static int pasemi_mac_close(struct net_d
- free_irq(mac->tx->chan.irq, mac->tx);
- free_irq(mac->rx->chan.irq, mac->rx);
-
-+ for (i = 0; i < mac->num_cs; i++) {
-+ pasemi_mac_free_csring(mac->cs[i]);
-+ mac->cs[i] = NULL;
-+ }
-+
-+ mac->num_cs = 0;
-+
- /* Free resources */
- pasemi_mac_free_rx_resources(mac);
- pasemi_mac_free_tx_resources(mac);
-@@ -1299,35 +1406,113 @@ static int pasemi_mac_close(struct net_d
- return 0;
- }
-
-+static void pasemi_mac_queue_csdesc(const struct sk_buff *skb,
-+ const dma_addr_t *map,
-+ const unsigned int *map_size,
-+ struct pasemi_mac_txring *txring,
-+ struct pasemi_mac_csring *csring)
-+{
-+ u64 fund;
-+ dma_addr_t cs_dest;
-+ const int nh_off = skb_network_offset(skb);
-+ const int nh_len = skb_network_header_len(skb);
-+ const int nfrags = skb_shinfo(skb)->nr_frags;
-+ int cs_size, i, fill, hdr, cpyhdr, evt;
-+ dma_addr_t csdma;
-+
-+ fund = XCT_FUN_ST | XCT_FUN_RR_8BRES |
-+ XCT_FUN_O | XCT_FUN_FUN(csring->fun) |
-+ XCT_FUN_CRM_SIG | XCT_FUN_LLEN(skb->len - nh_off) |
-+ XCT_FUN_SHL(nh_len >> 2) | XCT_FUN_SE;
-+
-+ switch (ip_hdr(skb)->protocol) {
-+ case IPPROTO_TCP:
-+ fund |= XCT_FUN_SIG_TCP4;
-+ /* TCP checksum is 16 bytes into the header */
-+ cs_dest = map[0] + skb_transport_offset(skb) + 16;
-+ break;
-+ case IPPROTO_UDP:
-+ fund |= XCT_FUN_SIG_UDP4;
-+ /* UDP checksum is 6 bytes into the header */
-+ cs_dest = map[0] + skb_transport_offset(skb) + 6;
-+ break;
-+ default:
-+ BUG();
-+ }
-+
-+ /* Do the checksum offloaded */
-+ fill = csring->next_to_fill;
-+ hdr = fill;
-+
-+ CS_DESC(csring, fill++) = fund;
-+ /* Room for 8BRES. Checksum result is really 2 bytes into it */
-+ csdma = csring->chan.ring_dma + (fill & (CS_RING_SIZE-1)) * 8 + 2;
-+ CS_DESC(csring, fill++) = 0;
-+
-+ CS_DESC(csring, fill) = XCT_PTR_LEN(map_size[0]-nh_off) | XCT_PTR_ADDR(map[0]+nh_off);
-+ for (i = 1; i <= nfrags; i++)
-+ CS_DESC(csring, fill+i) = XCT_PTR_LEN(map_size[i]) | XCT_PTR_ADDR(map[i]);
-+
-+ fill += i;
-+ if (fill & 1)
-+ fill++;
-+
-+ /* Copy the result into the TCP packet */
-+ cpyhdr = fill;
-+ CS_DESC(csring, fill++) = XCT_FUN_O | XCT_FUN_FUN(csring->fun) |
-+ XCT_FUN_LLEN(2) | XCT_FUN_SE;
-+ CS_DESC(csring, fill++) = XCT_PTR_LEN(2) | XCT_PTR_ADDR(cs_dest) | XCT_PTR_T;
-+ CS_DESC(csring, fill++) = XCT_PTR_LEN(2) | XCT_PTR_ADDR(csdma);
-+ fill++;
-+
-+ evt = !csring->last_event;
-+ csring->last_event = evt;
-+
-+ /* Event handshaking with MAC TX */
-+ CS_DESC(csring, fill++) = CTRL_CMD_T | CTRL_CMD_META_EVT | CTRL_CMD_O |
-+ CTRL_CMD_ETYPE_SET | CTRL_CMD_REG(csring->events[evt]);
-+ CS_DESC(csring, fill++) = 0;
-+ CS_DESC(csring, fill++) = CTRL_CMD_T | CTRL_CMD_META_EVT | CTRL_CMD_O |
-+ CTRL_CMD_ETYPE_WCLR | CTRL_CMD_REG(csring->events[!evt]);
-+ CS_DESC(csring, fill++) = 0;
-+ csring->next_to_fill = fill & (CS_RING_SIZE-1);
-+
-+ cs_size = fill - hdr;
-+ write_dma_reg(PAS_DMA_TXCHAN_INCR(csring->chan.chno), (cs_size) >> 1);
-+
-+ /* TX-side event handshaking */
-+ fill = txring->next_to_fill;
-+ TX_DESC(txring, fill++) = CTRL_CMD_T | CTRL_CMD_META_EVT | CTRL_CMD_O |
-+ CTRL_CMD_ETYPE_WSET | CTRL_CMD_REG(csring->events[evt]);
-+ TX_DESC(txring, fill++) = 0;
-+ TX_DESC(txring, fill++) = CTRL_CMD_T | CTRL_CMD_META_EVT | CTRL_CMD_O |
-+ CTRL_CMD_ETYPE_CLR | CTRL_CMD_REG(csring->events[!evt]);
-+ TX_DESC(txring, fill++) = 0;
-+ txring->next_to_fill = fill;
-+
-+ write_dma_reg(PAS_DMA_TXCHAN_INCR(txring->chan.chno), 2);
-+
-+ return;
-+}
-+
- static int pasemi_mac_start_tx(struct sk_buff *skb, struct net_device *dev)
- {
-- struct pasemi_mac *mac = netdev_priv(dev);
-- struct pasemi_mac_txring *txring;
-- u64 dflags, mactx;
-+ struct pasemi_mac * const mac = netdev_priv(dev);
-+ struct pasemi_mac_txring * const txring = tx_ring(mac);
-+ struct pasemi_mac_csring *csring;
-+ u64 dflags = 0;
-+ u64 mactx;
- dma_addr_t map[MAX_SKB_FRAGS+1];
- unsigned int map_size[MAX_SKB_FRAGS+1];
- unsigned long flags;
- int i, nfrags;
- int fill;
-+ const int nh_off = skb_network_offset(skb);
-+ const int nh_len = skb_network_header_len(skb);
-
-- dflags = XCT_MACTX_O | XCT_MACTX_ST | XCT_MACTX_CRC_PAD;
--
-- if (skb->ip_summed == CHECKSUM_PARTIAL) {
-- const unsigned char *nh = skb_network_header(skb);
-+ prefetch(&txring->ring_info);
-
-- switch (ip_hdr(skb)->protocol) {
-- case IPPROTO_TCP:
-- dflags |= XCT_MACTX_CSUM_TCP;
-- dflags |= XCT_MACTX_IPH(skb_network_header_len(skb) >> 2);
-- dflags |= XCT_MACTX_IPO(nh - skb->data);
-- break;
-- case IPPROTO_UDP:
-- dflags |= XCT_MACTX_CSUM_UDP;
-- dflags |= XCT_MACTX_IPH(skb_network_header_len(skb) >> 2);
-- dflags |= XCT_MACTX_IPO(nh - skb->data);
-- break;
-- }
-- }
-+ dflags = XCT_MACTX_O | XCT_MACTX_ST | XCT_MACTX_CRC_PAD;
-
- nfrags = skb_shinfo(skb)->nr_frags;
-
-@@ -1350,24 +1535,46 @@ static int pasemi_mac_start_tx(struct sk
- }
- }
-
-- mactx = dflags | XCT_MACTX_LLEN(skb->len);
-+ if (skb->ip_summed == CHECKSUM_PARTIAL && skb->len <= 1540) {
-+ switch (ip_hdr(skb)->protocol) {
-+ case IPPROTO_TCP:
-+ dflags |= XCT_MACTX_CSUM_TCP;
-+ dflags |= XCT_MACTX_IPH(nh_len >> 2);
-+ dflags |= XCT_MACTX_IPO(nh_off);
-+ break;
-+ case IPPROTO_UDP:
-+ dflags |= XCT_MACTX_CSUM_UDP;
-+ dflags |= XCT_MACTX_IPH(nh_len >> 2);
-+ dflags |= XCT_MACTX_IPO(nh_off);
-+ break;
-+ default:
-+ WARN_ON(1);
-+ }
-+ }
-
-- txring = tx_ring(mac);
-+ mactx = dflags | XCT_MACTX_LLEN(skb->len);
-
- spin_lock_irqsave(&txring->lock, flags);
-
-- fill = txring->next_to_fill;
--
- /* Avoid stepping on the same cache line that the DMA controller
- * is currently about to send, so leave at least 8 words available.
- * Total free space needed is mactx + fragments + 8
- */
-- if (RING_AVAIL(txring) < nfrags + 10) {
-+ if (RING_AVAIL(txring) < nfrags + 14) {
- /* no room -- stop the queue and wait for tx intr */
- netif_stop_queue(dev);
- goto out_err;
- }
-
-+ /* Queue up checksum + event descriptors, if needed */
-+ if (mac->num_cs && skb->ip_summed == CHECKSUM_PARTIAL && skb->len > 1540) {
-+ csring = mac->cs[mac->last_cs];
-+ mac->last_cs = (mac->last_cs + 1) % mac->num_cs;
-+
-+ pasemi_mac_queue_csdesc(skb, map, map_size, txring, csring);
-+ }
-+
-+ fill = txring->next_to_fill;
- TX_DESC(txring, fill) = mactx;
- TX_DESC_INFO(txring, fill).dma = nfrags;
- fill++;
-@@ -1441,12 +1648,33 @@ static int pasemi_mac_poll(struct napi_s
- return pkts;
- }
-
-+#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 pasemi_mac_netpoll(struct net_device *dev)
-+{
-+ const struct pasemi_mac *mac = netdev_priv(dev);
-+
-+ disable_irq(mac->tx->chan.irq);
-+ pasemi_mac_tx_intr(mac->tx->chan.irq, mac->tx);
-+ enable_irq(mac->tx->chan.irq);
-+
-+ disable_irq(mac->rx->chan.irq);
-+ pasemi_mac_rx_intr(mac->rx->chan.irq, mac->rx);
-+ enable_irq(mac->rx->chan.irq);
-+}
-+#endif
-+
- static int pasemi_mac_change_mtu(struct net_device *dev, int new_mtu)
- {
- struct pasemi_mac *mac = netdev_priv(dev);
- unsigned int reg;
-- unsigned int rcmdsta;
-+ unsigned int rcmdsta = 0;
- int running;
-+ int ret = 0;
-
- if (new_mtu < PE_MIN_MTU || new_mtu > PE_MAX_MTU)
- return -EINVAL;
-@@ -1468,6 +1696,16 @@ static int pasemi_mac_change_mtu(struct
- pasemi_mac_pause_rxint(mac);
- pasemi_mac_clean_rx(rx_ring(mac), RX_RING_SIZE);
- pasemi_mac_free_rx_buffers(mac);
-+
-+ }
-+
-+ /* Setup checksum channels if large MTU and none already allocated */
-+ if (new_mtu > 1500 && !mac->num_cs) {
-+ pasemi_mac_setup_csrings(mac);
-+ if (!mac->num_cs) {
-+ ret = -ENOMEM;
-+ goto out;
-+ }
- }
-
- /* Change maxf, i.e. what size frames are accepted.
-@@ -1482,6 +1720,7 @@ static int pasemi_mac_change_mtu(struct
- /* MTU + ETH_HLEN + VLAN_HLEN + 2 64B cachelines */
- mac->bufsz = new_mtu + ETH_HLEN + ETH_FCS_LEN + LOCAL_SKB_ALIGN + 128;
-
-+out:
- if (running) {
- write_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if),
- rcmdsta | PAS_DMA_RXINT_RCMDSTA_EN);
-@@ -1494,7 +1733,7 @@ static int pasemi_mac_change_mtu(struct
- pasemi_mac_intf_enable(mac);
- }
-
-- return 0;
-+ return ret;
- }
-
- static int __devinit
-@@ -1528,7 +1767,7 @@ pasemi_mac_probe(struct pci_dev *pdev, c
- netif_napi_add(dev, &mac->napi, pasemi_mac_poll, 64);
-
- dev->features = NETIF_F_IP_CSUM | NETIF_F_LLTX | NETIF_F_SG |
-- NETIF_F_HIGHDMA;
-+ NETIF_F_HIGHDMA | NETIF_F_GSO;
-
- mac->lro_mgr.max_aggr = LRO_MAX_AGGR;
- mac->lro_mgr.max_desc = MAX_LRO_DESCRIPTORS;
-@@ -1588,8 +1827,12 @@ pasemi_mac_probe(struct pci_dev *pdev, c
- dev->mtu = PE_DEF_MTU;
- /* 1500 MTU + ETH_HLEN + VLAN_HLEN + 2 64B cachelines */
- mac->bufsz = dev->mtu + ETH_HLEN + ETH_FCS_LEN + LOCAL_SKB_ALIGN + 128;
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+ dev->poll_controller = pasemi_mac_netpoll;
-+#endif
-
- dev->change_mtu = pasemi_mac_change_mtu;
-+ dev->ethtool_ops = &pasemi_mac_ethtool_ops;
-
- if (err)
- goto out;
---- a/drivers/net/pasemi_mac.h
-+++ b/drivers/net/pasemi_mac.h
-@@ -26,7 +26,14 @@
- #include <linux/spinlock.h>
- #include <linux/phy.h>
-
-+/* Must be a power of two */
-+#define RX_RING_SIZE 2048
-+#define TX_RING_SIZE 4096
-+#define CS_RING_SIZE (TX_RING_SIZE*2)
-+
-+
- #define MAX_LRO_DESCRIPTORS 8
-+#define MAX_CS 2
-
- struct pasemi_mac_txring {
- struct pasemi_dmachan chan; /* Must be first */
-@@ -51,6 +58,15 @@ struct pasemi_mac_rxring {
- struct pasemi_mac *mac; /* Needed in intr handler */
- };
-
-+struct pasemi_mac_csring {
-+ struct pasemi_dmachan chan;
-+ unsigned int size;
-+ unsigned int next_to_fill;
-+ int events[2];
-+ int last_event;
-+ int fun;
-+};
-+
- struct pasemi_mac {
- struct net_device *netdev;
- struct pci_dev *pdev;
-@@ -60,10 +76,12 @@ struct pasemi_mac {
- struct napi_struct napi;
-
- int bufsz; /* RX ring buffer size */
-+ int last_cs;
-+ int num_cs;
-+ u32 dma_if;
- u8 type;
- #define MAC_TYPE_GMAC 1
- #define MAC_TYPE_XAUI 2
-- u32 dma_if;
-
- u8 mac_addr[6];
-
-@@ -74,6 +92,7 @@ struct pasemi_mac {
-
- struct pasemi_mac_txring *tx;
- struct pasemi_mac_rxring *rx;
-+ struct pasemi_mac_csring *cs[MAX_CS];
- char tx_irq_name[10]; /* "eth%d tx" */
- char rx_irq_name[10]; /* "eth%d rx" */
- int link;
-@@ -90,6 +109,16 @@ struct pasemi_mac_buffer {
- dma_addr_t dma;
- };
-
-+#define TX_DESC(tx, num) ((tx)->chan.ring_virt[(num) & (TX_RING_SIZE-1)])
-+#define TX_DESC_INFO(tx, num) ((tx)->ring_info[(num) & (TX_RING_SIZE-1)])
-+#define RX_DESC(rx, num) ((rx)->chan.ring_virt[(num) & (RX_RING_SIZE-1)])
-+#define RX_DESC_INFO(rx, num) ((rx)->ring_info[(num) & (RX_RING_SIZE-1)])
-+#define RX_BUFF(rx, num) ((rx)->buffers[(num) & (RX_RING_SIZE-1)])
-+#define CS_DESC(cs, num) ((cs)->chan.ring_virt[(num) & (CS_RING_SIZE-1)])
-+
-+#define RING_USED(ring) (((ring)->next_to_fill - (ring)->next_to_clean) \
-+ & ((ring)->size - 1))
-+#define RING_AVAIL(ring) ((ring->size) - RING_USED(ring))
-
- /* PCI register offsets and formats */
-
-@@ -101,6 +130,7 @@ enum {
- PAS_MAC_CFG_ADR0 = 0x8c,
- PAS_MAC_CFG_ADR1 = 0x90,
- PAS_MAC_CFG_TXP = 0x98,
-+ PAS_MAC_CFG_RMON = 0x100,
- PAS_MAC_IPC_CHNL = 0x208,
- };
-
-@@ -172,6 +202,8 @@ enum {
- #define PAS_MAC_CFG_TXP_TIFG(x) (((x) << PAS_MAC_CFG_TXP_TIFG_S) & \
- PAS_MAC_CFG_TXP_TIFG_M)
-
-+#define PAS_MAC_RMON(r) (0x100+(r)*4)
-+
- #define PAS_MAC_IPC_CHNL_DCHNO_M 0x003f0000
- #define PAS_MAC_IPC_CHNL_DCHNO_S 16
- #define PAS_MAC_IPC_CHNL_DCHNO(x) (((x) << PAS_MAC_IPC_CHNL_DCHNO_S) & \
-@@ -181,4 +213,5 @@ enum {
- #define PAS_MAC_IPC_CHNL_BCH(x) (((x) << PAS_MAC_IPC_CHNL_BCH_S) & \
- PAS_MAC_IPC_CHNL_BCH_M)
-
-+
- #endif /* PASEMI_MAC_H */
---- /dev/null
-+++ b/drivers/net/pasemi_mac_ethtool.c
-@@ -0,0 +1,159 @@
-+/*
-+ * Copyright (C) 2006-2008 PA Semi, Inc
-+ *
-+ * Ethtool hooks for the PA Semi PWRficient onchip 1G/10G Ethernet MACs
-+ *
-+ * This program is free software; you can 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
-+ */
-+
-+
-+#include <linux/netdevice.h>
-+#include <linux/ethtool.h>
-+#include <linux/pci.h>
-+#include <linux/inet_lro.h>
-+
-+#include <asm/pasemi_dma.h>
-+#include "pasemi_mac.h"
-+
-+static struct {
-+ const char str[ETH_GSTRING_LEN];
-+} ethtool_stats_keys[] = {
-+ { "rx-drops" },
-+ { "rx-bytes" },
-+ { "rx-packets" },
-+ { "rx-broadcast-packets" },
-+ { "rx-multicast-packets" },
-+ { "rx-crc-errors" },
-+ { "rx-undersize-errors" },
-+ { "rx-oversize-errors" },
-+ { "rx-short-fragment-errors" },
-+ { "rx-jabber-errors" },
-+ { "rx-64-byte-packets" },
-+ { "rx-65-127-byte-packets" },
-+ { "rx-128-255-byte-packets" },
-+ { "rx-256-511-byte-packets" },
-+ { "rx-512-1023-byte-packets" },
-+ { "rx-1024-1518-byte-packets" },
-+ { "rx-pause-frames" },
-+ { "tx-bytes" },
-+ { "tx-packets" },
-+ { "tx-broadcast-packets" },
-+ { "tx-multicast-packets" },
-+ { "tx-collisions" },
-+ { "tx-late-collisions" },
-+ { "tx-excessive-collisions" },
-+ { "tx-crc-errors" },
-+ { "tx-undersize-errors" },
-+ { "tx-oversize-errors" },
-+ { "tx-64-byte-packets" },
-+ { "tx-65-127-byte-packets" },
-+ { "tx-128-255-byte-packets" },
-+ { "tx-256-511-byte-packets" },
-+ { "tx-512-1023-byte-packets" },
-+ { "tx-1024-1518-byte-packets" },
-+};
-+
-+static int
-+pasemi_mac_ethtool_get_settings(struct net_device *netdev,
-+ struct ethtool_cmd *cmd)
-+{
-+ struct pasemi_mac *mac = netdev_priv(netdev);
-+ struct phy_device *phydev = mac->phydev;
-+
-+ return phy_ethtool_gset(phydev, cmd);
-+}
-+
-+static void
-+pasemi_mac_ethtool_get_drvinfo(struct net_device *netdev,
-+ struct ethtool_drvinfo *drvinfo)
-+{
-+ struct pasemi_mac *mac;
-+ mac = netdev_priv(netdev);
-+
-+ /* clear and fill out info */
-+ memset(drvinfo, 0, sizeof(struct ethtool_drvinfo));
-+ strncpy(drvinfo->driver, "pasemi_mac", 12);
-+ strcpy(drvinfo->version, "N/A");
-+ strcpy(drvinfo->fw_version, "N/A");
-+ strncpy(drvinfo->bus_info, pci_name(mac->pdev), 32);
-+}
-+
-+static u32
-+pasemi_mac_ethtool_get_msglevel(struct net_device *netdev)
-+{
-+ struct pasemi_mac *mac = netdev_priv(netdev);
-+ return mac->msg_enable;
-+}
-+
-+static void
-+pasemi_mac_ethtool_set_msglevel(struct net_device *netdev,
-+ u32 level)
-+{
-+ struct pasemi_mac *mac = netdev_priv(netdev);
-+ mac->msg_enable = level;
-+}
-+
-+
-+static void
-+pasemi_mac_ethtool_get_ringparam(struct net_device *netdev,
-+ struct ethtool_ringparam *ering)
-+{
-+ struct pasemi_mac *mac = netdev->priv;
-+
-+ ering->tx_max_pending = TX_RING_SIZE/2;
-+ ering->tx_pending = RING_USED(mac->tx)/2;
-+ ering->rx_max_pending = RX_RING_SIZE/4;
-+ ering->rx_pending = RING_USED(mac->rx)/4;
-+}
-+
-+static int pasemi_mac_get_sset_count(struct net_device *netdev, int sset)
-+{
-+ switch (sset) {
-+ case ETH_SS_STATS:
-+ return ARRAY_SIZE(ethtool_stats_keys);
-+ default:
-+ return -EOPNOTSUPP;
-+ }
-+}
-+
-+static void pasemi_mac_get_ethtool_stats(struct net_device *netdev,
-+ struct ethtool_stats *stats, u64 *data)
-+{
-+ struct pasemi_mac *mac = netdev->priv;
-+ int i;
-+
-+ data[0] = pasemi_read_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if))
-+ >> PAS_DMA_RXINT_RCMDSTA_DROPS_S;
-+ for (i = 0; i < 32; i++)
-+ data[1+i] = pasemi_read_mac_reg(mac->dma_if, PAS_MAC_RMON(i));
-+}
-+
-+static void pasemi_mac_get_strings(struct net_device *netdev, u32 stringset,
-+ u8 *data)
-+{
-+ memcpy(data, ethtool_stats_keys, sizeof(ethtool_stats_keys));
-+}
-+
-+const struct ethtool_ops pasemi_mac_ethtool_ops = {
-+ .get_settings = pasemi_mac_ethtool_get_settings,
-+ .get_drvinfo = pasemi_mac_ethtool_get_drvinfo,
-+ .get_msglevel = pasemi_mac_ethtool_get_msglevel,
-+ .set_msglevel = pasemi_mac_ethtool_set_msglevel,
-+ .get_link = ethtool_op_get_link,
-+ .get_ringparam = pasemi_mac_ethtool_get_ringparam,
-+ .get_strings = pasemi_mac_get_strings,
-+ .get_sset_count = pasemi_mac_get_sset_count,
-+ .get_ethtool_stats = pasemi_mac_get_ethtool_stats,
-+};
-+
---- a/drivers/net/ps3_gelic_net.c
-+++ b/drivers/net/ps3_gelic_net.c
-@@ -1266,6 +1266,85 @@ int gelic_net_set_rx_csum(struct net_dev
- return 0;
- }
-
-+static void gelic_net_get_wol(struct net_device *netdev,
-+ struct ethtool_wolinfo *wol)
-+{
-+ if (0 <= ps3_compare_firmware_version(2, 2, 0))
-+ wol->supported = WAKE_MAGIC;
-+ else
-+ wol->supported = 0;
-+
-+ wol->wolopts = ps3_sys_manager_get_wol() ? wol->supported : 0;
-+ memset(&wol->sopass, 0, sizeof(wol->sopass));
-+}
-+static int gelic_net_set_wol(struct net_device *netdev,
-+ struct ethtool_wolinfo *wol)
-+{
-+ int status;
-+ struct gelic_card *card;
-+ u64 v1, v2;
-+
-+ if (ps3_compare_firmware_version(2, 2, 0) < 0 ||
-+ !capable(CAP_NET_ADMIN))
-+ return -EPERM;
-+
-+ if (wol->wolopts & ~WAKE_MAGIC)
-+ return -EINVAL;
-+
-+ card = netdev_card(netdev);
-+ if (wol->wolopts & WAKE_MAGIC) {
-+ status = lv1_net_control(bus_id(card), dev_id(card),
-+ GELIC_LV1_SET_WOL,
-+ GELIC_LV1_WOL_MAGIC_PACKET,
-+ 0, GELIC_LV1_WOL_MP_ENABLE,
-+ &v1, &v2);
-+ if (status) {
-+ pr_info("%s: enabling WOL failed %d\n", __func__,
-+ status);
-+ status = -EIO;
-+ goto done;
-+ }
-+ status = lv1_net_control(bus_id(card), dev_id(card),
-+ GELIC_LV1_SET_WOL,
-+ GELIC_LV1_WOL_ADD_MATCH_ADDR,
-+ 0, GELIC_LV1_WOL_MATCH_ALL,
-+ &v1, &v2);
-+ if (!status)
-+ ps3_sys_manager_set_wol(1);
-+ else {
-+ pr_info("%s: enabling WOL filter failed %d\n",
-+ __func__, status);
-+ status = -EIO;
-+ }
-+ } else {
-+ status = lv1_net_control(bus_id(card), dev_id(card),
-+ GELIC_LV1_SET_WOL,
-+ GELIC_LV1_WOL_MAGIC_PACKET,
-+ 0, GELIC_LV1_WOL_MP_DISABLE,
-+ &v1, &v2);
-+ if (status) {
-+ pr_info("%s: disabling WOL failed %d\n", __func__,
-+ status);
-+ status = -EIO;
-+ goto done;
-+ }
-+ status = lv1_net_control(bus_id(card), dev_id(card),
-+ GELIC_LV1_SET_WOL,
-+ GELIC_LV1_WOL_DELETE_MATCH_ADDR,
-+ 0, GELIC_LV1_WOL_MATCH_ALL,
-+ &v1, &v2);
-+ if (!status)
-+ ps3_sys_manager_set_wol(0);
-+ else {
-+ pr_info("%s: removing WOL filter failed %d\n",
-+ __func__, status);
-+ status = -EIO;
-+ }
-+ }
-+done:
-+ return status;
-+}
-+
- static struct ethtool_ops gelic_ether_ethtool_ops = {
- .get_drvinfo = gelic_net_get_drvinfo,
- .get_settings = gelic_ether_get_settings,
-@@ -1274,6 +1353,8 @@ static struct ethtool_ops gelic_ether_et
- .set_tx_csum = ethtool_op_set_tx_csum,
- .get_rx_csum = gelic_net_get_rx_csum,
- .set_rx_csum = gelic_net_set_rx_csum,
-+ .get_wol = gelic_net_get_wol,
-+ .set_wol = gelic_net_set_wol,
- };
-
- /**
---- a/drivers/net/ps3_gelic_net.h
-+++ b/drivers/net/ps3_gelic_net.h
-@@ -182,12 +182,32 @@ enum gelic_lv1_net_control_code {
- GELIC_LV1_GET_ETH_PORT_STATUS = 2,
- GELIC_LV1_SET_NEGOTIATION_MODE = 3,
- GELIC_LV1_GET_VLAN_ID = 4,
-+ GELIC_LV1_SET_WOL = 5,
- GELIC_LV1_GET_CHANNEL = 6,
- GELIC_LV1_POST_WLAN_CMD = 9,
- GELIC_LV1_GET_WLAN_CMD_RESULT = 10,
- GELIC_LV1_GET_WLAN_EVENT = 11
- };
-
-+/* for GELIC_LV1_SET_WOL */
-+enum gelic_lv1_wol_command {
-+ GELIC_LV1_WOL_MAGIC_PACKET = 1,
-+ GELIC_LV1_WOL_ADD_MATCH_ADDR = 6,
-+ GELIC_LV1_WOL_DELETE_MATCH_ADDR = 7,
-+};
-+
-+/* for GELIC_LV1_WOL_MAGIC_PACKET */
-+enum gelic_lv1_wol_mp_arg {
-+ GELIC_LV1_WOL_MP_DISABLE = 0,
-+ GELIC_LV1_WOL_MP_ENABLE = 1,
-+};
-+
-+/* for GELIC_LV1_WOL_{ADD,DELETE}_MATCH_ADDR */
-+enum gelic_lv1_wol_match_arg {
-+ GELIC_LV1_WOL_MATCH_INDIVIDUAL = 0,
-+ GELIC_LV1_WOL_MATCH_ALL = 1,
-+};
-+
- /* status returened from GET_ETH_PORT_STATUS */
- enum gelic_lv1_ether_port_status {
- GELIC_LV1_ETHER_LINK_UP = 0x0000000000000001L,
---- a/drivers/net/ucc_geth.c
-+++ b/drivers/net/ucc_geth.c
-@@ -3853,7 +3853,13 @@ static int ucc_geth_probe(struct of_devi
-
- ugeth_vdbg("%s: IN", __FUNCTION__);
-
-- prop = of_get_property(np, "device-id", NULL);
-+ prop = of_get_property(np, "cell-index", NULL);
-+ if (!prop) {
-+ prop = of_get_property(np, "device-id", NULL);
-+ if (!prop)
-+ return -ENODEV;
-+ }
-+
- ucc_num = *prop - 1;
- if ((ucc_num < 0) || (ucc_num > 7))
- return -ENODEV;
---- a/drivers/net/ucc_geth_mii.c
-+++ b/drivers/net/ucc_geth_mii.c
-@@ -203,9 +203,14 @@ static int uec_mdio_probe(struct of_devi
- if ((res.start >= tempres.start) &&
- (res.end <= tempres.end)) {
- /* set this UCC to be the MII master */
-- const u32 *id = of_get_property(tempnp, "device-id", NULL);
-- if (id == NULL)
-- goto bus_register_fail;
-+ const u32 *id;
-+
-+ id = of_get_property(tempnp, "cell-index", NULL);
-+ if (!id) {
-+ id = of_get_property(tempnp, "device-id", NULL);
-+ if (!id)
-+ goto bus_register_fail;
-+ }
-
- ucc_set_qe_mux_mii_mng(*id - 1);
-
---- a/drivers/of/Kconfig
-+++ b/drivers/of/Kconfig
-@@ -1,3 +1,15 @@
- config OF_DEVICE
- def_bool y
- depends on OF && (SPARC || PPC_OF)
-+
-+config OF_GPIO
-+ def_bool y
-+ depends on OF && PPC_OF && HAVE_GPIO_LIB
-+ help
-+ OpenFirmware GPIO accessors
-+
-+config OF_I2C
-+ def_bool y
-+ depends on OF && I2C
-+ help
-+ OpenFirmware I2C accessors
---- a/drivers/of/Makefile
-+++ b/drivers/of/Makefile
-@@ -1,2 +1,4 @@
- obj-y = base.o
- obj-$(CONFIG_OF_DEVICE) += device.o platform.o
-+obj-$(CONFIG_OF_GPIO) += gpio.o
-+obj-$(CONFIG_OF_I2C) += i2c.o
---- a/drivers/of/base.c
-+++ b/drivers/of/base.c
-@@ -117,6 +117,32 @@ int of_device_is_compatible(const struct
- EXPORT_SYMBOL(of_device_is_compatible);
-
- /**
-+ * of_device_is_available - check if a device is available for use
-+ *
-+ * @device: Node to check for availability
-+ *
-+ * Returns 1 if the status property is absent or set to "okay" or "ok",
-+ * 0 otherwise
-+ */
-+int of_device_is_available(const struct device_node *device)
-+{
-+ const char *status;
-+ int statlen;
-+
-+ status = of_get_property(device, "status", &statlen);
-+ if (status == NULL)
-+ return 1;
-+
-+ if (statlen > 0) {
-+ if (!strcmp(status, "okay") || !strcmp(status, "ok"))
-+ return 1;
-+ }
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL(of_device_is_available);
-+
-+/**
- * of_get_parent - Get a node's parent if any
- * @node: Node to get parent
- *
---- /dev/null
-+++ b/drivers/of/gpio.c
-@@ -0,0 +1,242 @@
-+/*
-+ * OF helpers for the GPIO API
-+ *
-+ * Copyright (c) 2007-2008 MontaVista Software, Inc.
-+ *
-+ * Author: Anton Vorontsov <avorontsov@ru.mvista.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/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/io.h>
-+#include <linux/of.h>
-+#include <linux/of_gpio.h>
-+#include <asm/prom.h>
-+
-+/**
-+ * of_get_gpio - Get a GPIO number from the device tree to use with GPIO API
-+ * @np: device node to get GPIO from
-+ * @index: index of the GPIO
-+ *
-+ * Returns GPIO number to use with Linux generic GPIO API, or one of the errno
-+ * value on the error condition.
-+ */
-+int of_get_gpio(struct device_node *np, int index)
-+{
-+ int ret = -EINVAL;
-+ struct device_node *gc;
-+ struct of_gpio_chip *of_gc = NULL;
-+ int size;
-+ const u32 *gpios;
-+ u32 nr_cells;
-+ int i;
-+ const void *gpio_spec;
-+ const u32 *gpio_cells;
-+ int gpio_index = 0;
-+
-+ gpios = of_get_property(np, "gpios", &size);
-+ if (!gpios) {
-+ ret = -ENOENT;
-+ goto err0;
-+ }
-+ nr_cells = size / sizeof(u32);
-+
-+ for (i = 0; i < nr_cells; gpio_index++) {
-+ const phandle *gpio_phandle;
-+
-+ gpio_phandle = gpios + i;
-+ gpio_spec = gpio_phandle + 1;
-+
-+ /* one cell hole in the gpios = <>; */
-+ if (!*gpio_phandle) {
-+ if (gpio_index == index)
-+ return -ENOENT;
-+ i++;
-+ continue;
-+ }
-+
-+ gc = of_find_node_by_phandle(*gpio_phandle);
-+ if (!gc) {
-+ pr_debug("%s: could not find phandle for gpios\n",
-+ np->full_name);
-+ goto err0;
-+ }
-+
-+ of_gc = gc->data;
-+ if (!of_gc) {
-+ pr_debug("%s: gpio controller %s isn't registered\n",
-+ np->full_name, gc->full_name);
-+ goto err1;
-+ }
-+
-+ gpio_cells = of_get_property(gc, "#gpio-cells", &size);
-+ if (!gpio_cells || size != sizeof(*gpio_cells) ||
-+ *gpio_cells != of_gc->gpio_cells) {
-+ pr_debug("%s: wrong #gpio-cells for %s\n",
-+ np->full_name, gc->full_name);
-+ goto err1;
-+ }
-+
-+ /* Next phandle is at phandle cells + #gpio-cells */
-+ i += sizeof(*gpio_phandle) / sizeof(u32) + *gpio_cells;
-+ if (i >= nr_cells + 1) {
-+ pr_debug("%s: insufficient gpio-spec length\n",
-+ np->full_name);
-+ goto err1;
-+ }
-+
-+ if (gpio_index == index)
-+ break;
-+
-+ of_gc = NULL;
-+ of_node_put(gc);
-+ }
-+
-+ if (!of_gc) {
-+ ret = -ENOENT;
-+ goto err0;
-+ }
-+
-+ ret = of_gc->xlate(of_gc, np, gpio_spec);
-+ if (ret < 0)
-+ goto err1;
-+
-+ ret += of_gc->gc.base;
-+err1:
-+ of_node_put(gc);
-+err0:
-+ pr_debug("%s exited with status %d\n", __func__, ret);
-+ return ret;
-+}
-+EXPORT_SYMBOL(of_get_gpio);
-+
-+/**
-+ * of_gpio_simple_xlate - translate gpio_spec to the GPIO number
-+ * @of_gc: pointer to the of_gpio_chip structure
-+ * @np: device node of the GPIO chip
-+ * @gpio_spec: gpio specifier as found in the device tree
-+ *
-+ * This is simple translation function, suitable for the most 1:1 mapped
-+ * gpio chips. This function performs only one sanity check: whether gpio
-+ * is less than ngpios (that is specified in the gpio_chip).
-+ */
-+int of_gpio_simple_xlate(struct of_gpio_chip *of_gc, struct device_node *np,
-+ const void *gpio_spec)
-+{
-+ const u32 *gpio = gpio_spec;
-+
-+ if (*gpio > of_gc->gc.ngpio)
-+ return -EINVAL;
-+
-+ return *gpio;
-+}
-+EXPORT_SYMBOL(of_gpio_simple_xlate);
-+
-+/* Should be sufficient for now, later we'll use dynamic bases. */
-+#if defined(CONFIG_PPC32) || defined(CONFIG_SPARC32)
-+#define GPIOS_PER_CHIP 32
-+#else
-+#define GPIOS_PER_CHIP 64
-+#endif
-+
-+static int of_get_gpiochip_base(struct device_node *np)
-+{
-+ struct device_node *gc = NULL;
-+ int gpiochip_base = 0;
-+
-+ while ((gc = of_find_all_nodes(gc))) {
-+ if (!of_get_property(gc, "gpio-controller", NULL))
-+ continue;
-+
-+ if (gc != np) {
-+ gpiochip_base += GPIOS_PER_CHIP;
-+ continue;
-+ }
-+
-+ of_node_put(gc);
-+
-+ if (gpiochip_base >= ARCH_NR_GPIOS)
-+ return -ENOSPC;
-+
-+ return gpiochip_base;
-+ }
-+
-+ return -ENOENT;
-+}
-+
-+/**
-+ * of_mm_gpiochip_add - Add memory mapped GPIO chip (bank)
-+ * @np: device node of the GPIO chip
-+ * @mm_gc: pointer to the of_mm_gpio_chip allocated structure
-+ *
-+ * To use this function you should allocate and fill mm_gc with:
-+ *
-+ * 1) In the gpio_chip structure:
-+ * - all the callbacks
-+ *
-+ * 2) In the of_gpio_chip structure:
-+ * - gpio_cells
-+ * - xlate callback (optional)
-+ *
-+ * 3) In the of_mm_gpio_chip structure:
-+ * - save_regs callback (optional)
-+ *
-+ * If succeeded, this function will map bank's memory and will
-+ * do all necessary work for you. Then you'll able to use .regs
-+ * to manage GPIOs from the callbacks.
-+ */
-+int of_mm_gpiochip_add(struct device_node *np,
-+ struct of_mm_gpio_chip *mm_gc)
-+{
-+ int ret = -ENOMEM;
-+ struct of_gpio_chip *of_gc = &mm_gc->of_gc;
-+ struct gpio_chip *gc = &of_gc->gc;
-+
-+ gc->label = kstrdup(np->full_name, GFP_KERNEL);
-+ if (!gc->label)
-+ goto err0;
-+
-+ mm_gc->regs = of_iomap(np, 0);
-+ if (!mm_gc->regs)
-+ goto err1;
-+
-+ gc->base = of_get_gpiochip_base(np);
-+ if (gc->base < 0) {
-+ ret = gc->base;
-+ goto err1;
-+ }
-+
-+ if (!of_gc->xlate)
-+ of_gc->xlate = of_gpio_simple_xlate;
-+
-+ if (mm_gc->save_regs)
-+ mm_gc->save_regs(mm_gc);
-+
-+ np->data = of_gc;
-+
-+ ret = gpiochip_add(gc);
-+ if (ret)
-+ goto err2;
-+
-+ /* We don't want to lose the node and its ->data */
-+ of_node_get(np);
-+
-+ pr_debug("%s: registered as generic GPIO chip, base is %d\n",
-+ np->full_name, gc->base);
-+ return 0;
-+err2:
-+ np->data = NULL;
-+ iounmap(mm_gc->regs);
-+err1:
-+ kfree(gc->label);
-+err0:
-+ pr_err("%s: GPIO chip registration failed with status %d\n",
-+ np->full_name, ret);
-+ return ret;
-+}
-+EXPORT_SYMBOL(of_mm_gpiochip_add);
---- /dev/null
-+++ b/drivers/of/i2c.c
-@@ -0,0 +1,115 @@
-+/*
-+ * OF helpers for the I2C API
-+ *
-+ * Copyright (c) 2008 Jochen Friedrich <jochen@scram.de>
-+ *
-+ * Based on a previous patch from Jon Smirl <jonsmirl@gmail.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/i2c.h>
-+#include <linux/of.h>
-+
-+struct i2c_driver_device {
-+ char *of_device;
-+ char *i2c_type;
-+};
-+
-+static struct i2c_driver_device i2c_devices[] = {
-+ { "dallas,ds1374", "rtc-ds1374" },
-+};
-+
-+static int of_find_i2c_driver(struct device_node *node,
-+ struct i2c_board_info *info)
-+{
-+ int i, cplen;
-+ const char *compatible;
-+ const char *p;
-+
-+ /* 1. search for exception list entry */
-+ for (i = 0; i < ARRAY_SIZE(i2c_devices); i++) {
-+ if (!of_device_is_compatible(node, i2c_devices[i].of_device))
-+ continue;
-+ if (strlcpy(info->type, i2c_devices[i].i2c_type,
-+ I2C_NAME_SIZE) >= I2C_NAME_SIZE)
-+ return -ENOMEM;
-+
-+ return 0;
-+ }
-+
-+ compatible = of_get_property(node, "compatible", &cplen);
-+ if (!compatible)
-+ return -ENODEV;
-+
-+ /* 2. search for linux,<i2c-type> entry */
-+ p = compatible;
-+ while (cplen > 0) {
-+ if (!strncmp(p, "linux,", 6)) {
-+ p += 6;
-+ if (strlcpy(info->type, p,
-+ I2C_NAME_SIZE) >= I2C_NAME_SIZE)
-+ return -ENOMEM;
-+ return 0;
-+ }
-+
-+ i = strlen(p) + 1;
-+ p += i;
-+ cplen -= i;
-+ }
-+
-+ /* 3. take fist compatible entry and strip manufacturer */
-+ p = strchr(compatible, ',');
-+ if (!p)
-+ return -ENODEV;
-+ p++;
-+ if (strlcpy(info->type, p, I2C_NAME_SIZE) >= I2C_NAME_SIZE)
-+ return -ENOMEM;
-+ return 0;
-+}
-+
-+void of_register_i2c_devices(struct i2c_adapter *adap,
-+ struct device_node *adap_node)
-+{
-+ void *result;
-+ struct device_node *node;
-+
-+ for_each_child_of_node(adap_node, node) {
-+ struct i2c_board_info info = {};
-+ const u32 *addr;
-+ int len;
-+
-+ addr = of_get_property(node, "reg", &len);
-+ if (!addr || len < sizeof(int) || *addr > (1 << 10) - 1) {
-+ printk(KERN_ERR
-+ "of-i2c: invalid i2c device entry\n");
-+ continue;
-+ }
-+
-+ info.irq = irq_of_parse_and_map(node, 0);
-+ if (info.irq == NO_IRQ)
-+ info.irq = -1;
-+
-+ if (of_find_i2c_driver(node, &info) < 0) {
-+ irq_dispose_mapping(info.irq);
-+ continue;
-+ }
-+
-+ info.addr = *addr;
-+
-+ request_module(info.type);
-+
-+ result = i2c_new_device(adap, &info);
-+ if (result == NULL) {
-+ printk(KERN_ERR
-+ "of-i2c: Failed to load driver for %s\n",
-+ info.type);
-+ irq_dispose_mapping(info.irq);
-+ continue;
-+ }
-+ }
-+}
-+EXPORT_SYMBOL(of_register_i2c_devices);
---- a/drivers/ps3/ps3-sys-manager.c
-+++ b/drivers/ps3/ps3-sys-manager.c
-@@ -24,6 +24,7 @@
- #include <linux/reboot.h>
-
- #include <asm/firmware.h>
-+#include <asm/lv1call.h>
- #include <asm/ps3.h>
-
- #include "vuart.h"
-@@ -187,6 +188,7 @@ enum ps3_sys_manager_next_op {
- * controller, and bluetooth controller.
- * @PS3_SM_WAKE_RTC:
- * @PS3_SM_WAKE_RTC_ERROR:
-+ * @PS3_SM_WAKE_W_O_L: Ether or wireless LAN.
- * @PS3_SM_WAKE_P_O_R: Power on reset.
- *
- * Additional wakeup sources when specifying PS3_SM_NEXT_OP_SYS_SHUTDOWN.
-@@ -200,10 +202,19 @@ enum ps3_sys_manager_wake_source {
- PS3_SM_WAKE_DEFAULT = 0,
- PS3_SM_WAKE_RTC = 0x00000040,
- PS3_SM_WAKE_RTC_ERROR = 0x00000080,
-+ PS3_SM_WAKE_W_O_L = 0x00000400,
- PS3_SM_WAKE_P_O_R = 0x80000000,
- };
-
- /**
-+ * user_wake_sources - User specified wakeup sources.
-+ *
-+ * Logical OR of enum ps3_sys_manager_wake_source types.
-+ */
-+
-+static u32 user_wake_sources = PS3_SM_WAKE_DEFAULT;
-+
-+/**
- * enum ps3_sys_manager_cmd - Command from system manager to guest.
- *
- * The guest completes the actions needed, then acks or naks the command via
-@@ -581,6 +592,23 @@ fail_id:
- return -EIO;
- }
-
-+static void ps3_sys_manager_fin(struct ps3_system_bus_device *dev)
-+{
-+ ps3_sys_manager_send_request_shutdown(dev);
-+
-+ pr_emerg("System Halted, OK to turn off power\n");
-+
-+ while (ps3_sys_manager_handle_msg(dev)) {
-+ /* pause until next DEC interrupt */
-+ lv1_pause(0);
-+ }
-+
-+ while (1) {
-+ /* pause, ignoring DEC interrupt */
-+ lv1_pause(1);
-+ }
-+}
-+
- /**
- * ps3_sys_manager_final_power_off - The final platform machine_power_off routine.
- *
-@@ -601,13 +629,9 @@ static void ps3_sys_manager_final_power_
- ps3_vuart_cancel_async(dev);
-
- ps3_sys_manager_send_next_op(dev, PS3_SM_NEXT_OP_SYS_SHUTDOWN,
-- PS3_SM_WAKE_DEFAULT);
-- ps3_sys_manager_send_request_shutdown(dev);
--
-- pr_emerg("System Halted, OK to turn off power\n");
-+ user_wake_sources);
-
-- while (1)
-- ps3_sys_manager_handle_msg(dev);
-+ ps3_sys_manager_fin(dev);
- }
-
- /**
-@@ -638,14 +662,42 @@ static void ps3_sys_manager_final_restar
-
- ps3_sys_manager_send_attr(dev, 0);
- ps3_sys_manager_send_next_op(dev, PS3_SM_NEXT_OP_SYS_REBOOT,
-- PS3_SM_WAKE_DEFAULT);
-- ps3_sys_manager_send_request_shutdown(dev);
-+ user_wake_sources);
-
-- pr_emerg("System Halted, OK to turn off power\n");
-+ ps3_sys_manager_fin(dev);
-+}
-+
-+/**
-+ * ps3_sys_manager_get_wol - Get wake-on-lan setting.
-+ */
-+
-+int ps3_sys_manager_get_wol(void)
-+{
-+ pr_debug("%s:%d\n", __func__, __LINE__);
-+
-+ return (user_wake_sources & PS3_SM_WAKE_W_O_L) != 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_sys_manager_get_wol);
-+
-+/**
-+ * ps3_sys_manager_set_wol - Set wake-on-lan setting.
-+ */
-+
-+void ps3_sys_manager_set_wol(int state)
-+{
-+ static DEFINE_MUTEX(mutex);
-+
-+ mutex_lock(&mutex);
-+
-+ pr_debug("%s:%d: %d\n", __func__, __LINE__, state);
-
-- while (1)
-- ps3_sys_manager_handle_msg(dev);
-+ if (state)
-+ user_wake_sources |= PS3_SM_WAKE_W_O_L;
-+ else
-+ user_wake_sources &= ~PS3_SM_WAKE_W_O_L;
-+ mutex_unlock(&mutex);
- }
-+EXPORT_SYMBOL_GPL(ps3_sys_manager_set_wol);
-
- /**
- * ps3_sys_manager_work - Asynchronous read handler.
---- a/drivers/ps3/sys-manager-core.c
-+++ b/drivers/ps3/sys-manager-core.c
-@@ -19,6 +19,7 @@
- */
-
- #include <linux/kernel.h>
-+#include <asm/lv1call.h>
- #include <asm/ps3.h>
-
- /**
-@@ -50,10 +51,7 @@ void ps3_sys_manager_power_off(void)
- if (ps3_sys_manager_ops.power_off)
- ps3_sys_manager_ops.power_off(ps3_sys_manager_ops.dev);
-
-- printk(KERN_EMERG "System Halted, OK to turn off power\n");
-- local_irq_disable();
-- while (1)
-- (void)0;
-+ ps3_sys_manager_halt();
- }
-
- void ps3_sys_manager_restart(void)
-@@ -61,8 +59,14 @@ void ps3_sys_manager_restart(void)
- if (ps3_sys_manager_ops.restart)
- ps3_sys_manager_ops.restart(ps3_sys_manager_ops.dev);
-
-- printk(KERN_EMERG "System Halted, OK to turn off power\n");
-+ ps3_sys_manager_halt();
-+}
-+
-+void ps3_sys_manager_halt(void)
-+{
-+ pr_emerg("System Halted, OK to turn off power\n");
- local_irq_disable();
- while (1)
-- (void)0;
-+ lv1_pause(1);
- }
-+
---- a/drivers/serial/cpm_uart/cpm_uart.h
-+++ b/drivers/serial/cpm_uart/cpm_uart.h
-@@ -92,6 +92,9 @@ extern struct uart_cpm_port cpm_uart_por
-
- /* these are located in their respective files */
- void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd);
-+void __iomem *cpm_uart_map_pram(struct uart_cpm_port *port,
-+ struct device_node *np);
-+void cpm_uart_unmap_pram(struct uart_cpm_port *port, void __iomem *pram);
- int cpm_uart_init_portdesc(void);
- int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con);
- void cpm_uart_freebuf(struct uart_cpm_port *pinfo);
---- a/drivers/serial/cpm_uart/cpm_uart_core.c
-+++ b/drivers/serial/cpm_uart/cpm_uart_core.c
-@@ -966,24 +966,23 @@ static int cpm_uart_init_port(struct dev
- if (!mem)
- return -ENOMEM;
-
-- pram = of_iomap(np, 1);
-- if (!pram) {
-- ret = -ENOMEM;
-- goto out_mem;
-- }
--
- if (of_device_is_compatible(np, "fsl,cpm1-scc-uart") ||
- of_device_is_compatible(np, "fsl,cpm2-scc-uart")) {
- pinfo->sccp = mem;
-- pinfo->sccup = pram;
-+ pinfo->sccup = pram = cpm_uart_map_pram(pinfo, np);
- } else if (of_device_is_compatible(np, "fsl,cpm1-smc-uart") ||
- of_device_is_compatible(np, "fsl,cpm2-smc-uart")) {
- pinfo->flags |= FLAG_SMC;
- pinfo->smcp = mem;
-- pinfo->smcup = pram;
-+ pinfo->smcup = pram = cpm_uart_map_pram(pinfo, np);
- } else {
- ret = -ENODEV;
-- goto out_pram;
-+ goto out_mem;
-+ }
-+
-+ if (!pram) {
-+ ret = -ENOMEM;
-+ goto out_mem;
- }
-
- pinfo->tx_nrfifos = TX_NUM_FIFO;
-@@ -1007,7 +1006,7 @@ static int cpm_uart_init_port(struct dev
- return cpm_uart_request_port(&pinfo->port);
-
- out_pram:
-- iounmap(pram);
-+ cpm_uart_unmap_pram(pinfo, pram);
- out_mem:
- iounmap(mem);
- return ret;
---- a/drivers/serial/cpm_uart/cpm_uart_cpm1.c
-+++ b/drivers/serial/cpm_uart/cpm_uart_cpm1.c
-@@ -45,6 +45,8 @@
- #include <linux/serial_core.h>
- #include <linux/kernel.h>
-
-+#include <linux/of.h>
-+
- #include "cpm_uart.h"
-
- /**************************************************************/
-@@ -54,6 +56,18 @@ void cpm_line_cr_cmd(struct uart_cpm_por
- {
- cpm_command(port->command, cmd);
- }
-+
-+void __iomem *cpm_uart_map_pram(struct uart_cpm_port *port,
-+ struct device_node *np)
-+{
-+ return of_iomap(np, 1);
-+}
-+
-+void cpm_uart_unmap_pram(struct uart_cpm_port *port, void __iomem *pram)
-+{
-+ iounmap(pram);
-+}
-+
- #else
- void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
- {
---- a/drivers/serial/cpm_uart/cpm_uart_cpm2.c
-+++ b/drivers/serial/cpm_uart/cpm_uart_cpm2.c
-@@ -41,6 +41,9 @@
- #include <asm/io.h>
- #include <asm/irq.h>
- #include <asm/fs_pd.h>
-+#ifdef CONFIG_PPC_CPM_NEW_BINDING
-+#include <asm/prom.h>
-+#endif
-
- #include <linux/serial_core.h>
- #include <linux/kernel.h>
-@@ -54,6 +57,55 @@ void cpm_line_cr_cmd(struct uart_cpm_por
- {
- cpm_command(port->command, cmd);
- }
-+
-+void __iomem *cpm_uart_map_pram(struct uart_cpm_port *port,
-+ struct device_node *np)
-+{
-+ void __iomem *pram;
-+ unsigned long offset;
-+ struct resource res;
-+ unsigned long len;
-+
-+ /* Don't remap parameter RAM if it has already been initialized
-+ * during console setup.
-+ */
-+ if (IS_SMC(port) && port->smcup)
-+ return port->smcup;
-+ else if (!IS_SMC(port) && port->sccup)
-+ return port->sccup;
-+
-+ if (of_address_to_resource(np, 1, &res))
-+ return NULL;
-+
-+ len = 1 + res.end - res.start;
-+ pram = ioremap(res.start, len);
-+ if (!pram)
-+ return NULL;
-+
-+ if (!IS_SMC(port))
-+ return pram;
-+
-+ if (len != 2) {
-+ printk(KERN_WARNING "cpm_uart[%d]: device tree references "
-+ "SMC pram, using boot loader/wrapper pram mapping. "
-+ "Please fix your device tree to reference the pram "
-+ "base register instead.\n",
-+ port->port.line);
-+ return pram;
-+ }
-+
-+ offset = cpm_dpalloc(PROFF_SMC_SIZE, 64);
-+ out_be16(pram, offset);
-+ iounmap(pram);
-+ return cpm_muram_addr(offset);
-+}
-+
-+void cpm_uart_unmap_pram(struct uart_cpm_port *port, void __iomem *pram)
-+{
-+ if (!IS_SMC(port))
-+ iounmap(pram);
-+}
-+
- #else
- void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
- {
---- a/drivers/serial/of_serial.c
-+++ b/drivers/serial/of_serial.c
-@@ -56,7 +56,9 @@ static int __devinit of_platform_serial_
- port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP
- | UPF_FIXED_PORT;
- port->dev = &ofdev->dev;
-- port->custom_divisor = *clk / (16 * (*spd));
-+ /* If current-speed was set, then try not to change it. */
-+ if (spd)
-+ port->custom_divisor = *clk / (16 * (*spd));
-
- return 0;
- }
---- a/drivers/serial/ucc_uart.c
-+++ b/drivers/serial/ucc_uart.c
-@@ -1270,10 +1270,18 @@ static int ucc_uart_probe(struct of_devi
-
- /* Get the UCC number (device ID) */
- /* UCCs are numbered 1-7 */
-- iprop = of_get_property(np, "device-id", NULL);
-- if (!iprop || (*iprop < 1) || (*iprop > UCC_MAX_NUM)) {
-- dev_err(&ofdev->dev,
-- "missing or invalid UCC specified in device tree\n");
-+ iprop = of_get_property(np, "cell-index", NULL);
-+ if (!iprop) {
-+ iprop = of_get_property(np, "device-id", NULL);
-+ if (!iprop) {
-+ dev_err(&ofdev->dev, "UCC is unspecified in "
-+ "device tree\n");
-+ return -EINVAL;
-+ }
-+ }
-+
-+ if ((*iprop < 1) || (*iprop > UCC_MAX_NUM)) {
-+ dev_err(&ofdev->dev, "no support for UCC%u\n", *iprop);
- kfree(qe_port);
- return -ENODEV;
- }
---- a/include/asm-powerpc/Kbuild
-+++ b/include/asm-powerpc/Kbuild
-@@ -1,5 +1,6 @@
- include include/asm-generic/Kbuild.asm
-
-+header-y += a.out.h
- header-y += auxvec.h
- header-y += ioctls.h
- header-y += mman.h
-@@ -23,7 +24,6 @@ header-y += sigcontext.h
- header-y += statfs.h
- header-y += ps3fb.h
-
--unifdef-y += a.out.h
- unifdef-y += asm-compat.h
- unifdef-y += bootx.h
- unifdef-y += byteorder.h
---- a/include/asm-powerpc/abs_addr.h
-+++ b/include/asm-powerpc/abs_addr.h
-@@ -12,10 +12,11 @@
- * 2 of the License, or (at your option) any later version.
- */
-
-+#include <linux/lmb.h>
-+
- #include <asm/types.h>
- #include <asm/page.h>
- #include <asm/prom.h>
--#include <asm/lmb.h>
- #include <asm/firmware.h>
-
- struct mschunks_map {
---- a/include/asm-powerpc/bitops.h
-+++ b/include/asm-powerpc/bitops.h
-@@ -312,24 +312,26 @@ static __inline__ int fls(unsigned int x
- asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x));
- return 32 - lz;
- }
-+
-+/*
-+ * 64-bit can do this using one cntlzd (count leading zeroes doubleword)
-+ * instruction; for 32-bit we use the generic version, which does two
-+ * 32-bit fls calls.
-+ */
-+#ifdef __powerpc64__
-+static __inline__ int fls64(__u64 x)
-+{
-+ int lz;
-+
-+ asm ("cntlzd %0,%1" : "=r" (lz) : "r" (x));
-+ return 64 - lz;
-+}
-+#else
- #include <asm-generic/bitops/fls64.h>
-+#endif /* __powerpc64__ */
-
- #include <asm-generic/bitops/hweight.h>
--
--#define find_first_zero_bit(addr, size) find_next_zero_bit((addr), (size), 0)
--unsigned long find_next_zero_bit(const unsigned long *addr,
-- unsigned long size, unsigned long offset);
--/**
-- * find_first_bit - find the first set bit in a memory region
-- * @addr: The address to start the search at
-- * @size: The maximum size to search
-- *
-- * Returns the bit-number of the first set bit, not the number of the byte
-- * containing a bit.
-- */
--#define find_first_bit(addr, size) find_next_bit((addr), (size), 0)
--unsigned long find_next_bit(const unsigned long *addr,
-- unsigned long size, unsigned long offset);
-+#include <asm-generic/bitops/find.h>
-
- /* Little-endian versions */
-
---- a/include/asm-powerpc/cpm.h
-+++ b/include/asm-powerpc/cpm.h
-@@ -4,6 +4,20 @@
- #include <linux/compiler.h>
- #include <linux/types.h>
-
-+/* Opcodes common to CPM1 and CPM2
-+*/
-+#define CPM_CR_INIT_TRX ((ushort)0x0000)
-+#define CPM_CR_INIT_RX ((ushort)0x0001)
-+#define CPM_CR_INIT_TX ((ushort)0x0002)
-+#define CPM_CR_HUNT_MODE ((ushort)0x0003)
-+#define CPM_CR_STOP_TX ((ushort)0x0004)
-+#define CPM_CR_GRA_STOP_TX ((ushort)0x0005)
-+#define CPM_CR_RESTART_TX ((ushort)0x0006)
-+#define CPM_CR_CLOSE_RX_BD ((ushort)0x0007)
-+#define CPM_CR_SET_GADDR ((ushort)0x0008)
-+#define CPM_CR_SET_TIMER ((ushort)0x0008)
-+#define CPM_CR_STOP_IDMA ((ushort)0x000b)
-+
- /* Buffer descriptors used by many of the CPM protocols. */
- typedef struct cpm_buf_desc {
- ushort cbd_sc; /* Status and Control */
---- a/include/asm-powerpc/cpm1.h
-+++ b/include/asm-powerpc/cpm1.h
-@@ -28,19 +28,6 @@
- #define CPM_CR_CHAN ((ushort)0x00f0)
- #define CPM_CR_FLG ((ushort)0x0001)
-
--/* Some commands (there are more...later)
--*/
--#define CPM_CR_INIT_TRX ((ushort)0x0000)
--#define CPM_CR_INIT_RX ((ushort)0x0001)
--#define CPM_CR_INIT_TX ((ushort)0x0002)
--#define CPM_CR_HUNT_MODE ((ushort)0x0003)
--#define CPM_CR_STOP_TX ((ushort)0x0004)
--#define CPM_CR_GRA_STOP_TX ((ushort)0x0005)
--#define CPM_CR_RESTART_TX ((ushort)0x0006)
--#define CPM_CR_CLOSE_RX_BD ((ushort)0x0007)
--#define CPM_CR_SET_GADDR ((ushort)0x0008)
--#define CPM_CR_SET_TIMER CPM_CR_SET_GADDR
--
- /* Channel numbers.
- */
- #define CPM_CR_CH_SCC1 ((ushort)0x0000)
---- a/include/asm-powerpc/cpm2.h
-+++ b/include/asm-powerpc/cpm2.h
-@@ -71,18 +71,9 @@
-
- #define CPM_CR_FCC_PAGE(x) (x + 0x04)
-
--/* Some opcodes (there are more...later)
-+/* CPM2-specific opcodes (see cpm.h for common opcodes)
- */
--#define CPM_CR_INIT_TRX ((ushort)0x0000)
--#define CPM_CR_INIT_RX ((ushort)0x0001)
--#define CPM_CR_INIT_TX ((ushort)0x0002)
--#define CPM_CR_HUNT_MODE ((ushort)0x0003)
--#define CPM_CR_STOP_TX ((ushort)0x0004)
--#define CPM_CR_GRA_STOP_TX ((ushort)0x0005)
--#define CPM_CR_RESTART_TX ((ushort)0x0006)
--#define CPM_CR_SET_GADDR ((ushort)0x0008)
- #define CPM_CR_START_IDMA ((ushort)0x0009)
--#define CPM_CR_STOP_IDMA ((ushort)0x000b)
-
- #define mk_cr_cmd(PG, SBC, MCN, OP) \
- ((PG << 26) | (SBC << 21) | (MCN << 6) | OP)
---- a/include/asm-powerpc/cputhreads.h
-+++ b/include/asm-powerpc/cputhreads.h
-@@ -35,7 +35,7 @@ static inline cpumask_t cpu_thread_mask_
-
- res = CPU_MASK_NONE;
- for (i = 0; i < NR_CPUS; i += threads_per_core) {
-- cpus_shift_right(tmp, threads_core_mask, i);
-+ cpus_shift_left(tmp, threads_core_mask, i);
- if (cpus_intersects(threads, tmp))
- cpu_set(i, res);
- }
---- a/include/asm-powerpc/dcr-native.h
-+++ b/include/asm-powerpc/dcr-native.h
-@@ -82,6 +82,19 @@ static inline void __mtdcri(int base_add
- spin_unlock_irqrestore(&dcr_ind_lock, flags);
- }
-
-+static inline void __dcri_clrset(int base_addr, int base_data, int reg,
-+ unsigned clr, unsigned set)
-+{
-+ unsigned long flags;
-+ unsigned int val;
-+
-+ spin_lock_irqsave(&dcr_ind_lock, flags);
-+ __mtdcr(base_addr, reg);
-+ val = (__mfdcr(base_data) & ~clr) | set;
-+ __mtdcr(base_data, val);
-+ spin_unlock_irqrestore(&dcr_ind_lock, flags);
-+}
-+
- #define mfdcri(base, reg) __mfdcri(DCRN_ ## base ## _CONFIG_ADDR, \
- DCRN_ ## base ## _CONFIG_DATA, \
- reg)
-@@ -90,6 +103,10 @@ static inline void __mtdcri(int base_add
- DCRN_ ## base ## _CONFIG_DATA, \
- reg, data)
-
-+#define dcri_clrset(base, reg, clr, set) __dcri_clrset(DCRN_ ## base ## _CONFIG_ADDR, \
-+ DCRN_ ## base ## _CONFIG_DATA, \
-+ reg, clr, set)
-+
- #endif /* __ASSEMBLY__ */
- #endif /* __KERNEL__ */
- #endif /* _ASM_POWERPC_DCR_NATIVE_H */
---- a/include/asm-powerpc/dcr-regs.h
-+++ b/include/asm-powerpc/dcr-regs.h
-@@ -68,4 +68,82 @@
- #define SDR0_UART3 0x0123
- #define SDR0_CUST0 0x4000
-
-+/*
-+ * All those DCR register addresses are offsets from the base address
-+ * for the SRAM0 controller (e.g. 0x20 on 440GX). The base address is
-+ * excluded here and configured in the device tree.
-+ */
-+#define DCRN_SRAM0_SB0CR 0x00
-+#define DCRN_SRAM0_SB1CR 0x01
-+#define DCRN_SRAM0_SB2CR 0x02
-+#define DCRN_SRAM0_SB3CR 0x03
-+#define SRAM_SBCR_BU_MASK 0x00000180
-+#define SRAM_SBCR_BS_64KB 0x00000800
-+#define SRAM_SBCR_BU_RO 0x00000080
-+#define SRAM_SBCR_BU_RW 0x00000180
-+#define DCRN_SRAM0_BEAR 0x04
-+#define DCRN_SRAM0_BESR0 0x05
-+#define DCRN_SRAM0_BESR1 0x06
-+#define DCRN_SRAM0_PMEG 0x07
-+#define DCRN_SRAM0_CID 0x08
-+#define DCRN_SRAM0_REVID 0x09
-+#define DCRN_SRAM0_DPC 0x0a
-+#define SRAM_DPC_ENABLE 0x80000000
-+
-+/*
-+ * All those DCR register addresses are offsets from the base address
-+ * for the SRAM0 controller (e.g. 0x30 on 440GX). The base address is
-+ * excluded here and configured in the device tree.
-+ */
-+#define DCRN_L2C0_CFG 0x00
-+#define L2C_CFG_L2M 0x80000000
-+#define L2C_CFG_ICU 0x40000000
-+#define L2C_CFG_DCU 0x20000000
-+#define L2C_CFG_DCW_MASK 0x1e000000
-+#define L2C_CFG_TPC 0x01000000
-+#define L2C_CFG_CPC 0x00800000
-+#define L2C_CFG_FRAN 0x00200000
-+#define L2C_CFG_SS_MASK 0x00180000
-+#define L2C_CFG_SS_256 0x00000000
-+#define L2C_CFG_CPIM 0x00040000
-+#define L2C_CFG_TPIM 0x00020000
-+#define L2C_CFG_LIM 0x00010000
-+#define L2C_CFG_PMUX_MASK 0x00007000
-+#define L2C_CFG_PMUX_SNP 0x00000000
-+#define L2C_CFG_PMUX_IF 0x00001000
-+#define L2C_CFG_PMUX_DF 0x00002000
-+#define L2C_CFG_PMUX_DS 0x00003000
-+#define L2C_CFG_PMIM 0x00000800
-+#define L2C_CFG_TPEI 0x00000400
-+#define L2C_CFG_CPEI 0x00000200
-+#define L2C_CFG_NAM 0x00000100
-+#define L2C_CFG_SMCM 0x00000080
-+#define L2C_CFG_NBRM 0x00000040
-+#define L2C_CFG_RDBW 0x00000008 /* only 460EX/GT */
-+#define DCRN_L2C0_CMD 0x01
-+#define L2C_CMD_CLR 0x80000000
-+#define L2C_CMD_DIAG 0x40000000
-+#define L2C_CMD_INV 0x20000000
-+#define L2C_CMD_CCP 0x10000000
-+#define L2C_CMD_CTE 0x08000000
-+#define L2C_CMD_STRC 0x04000000
-+#define L2C_CMD_STPC 0x02000000
-+#define L2C_CMD_RPMC 0x01000000
-+#define L2C_CMD_HCC 0x00800000
-+#define DCRN_L2C0_ADDR 0x02
-+#define DCRN_L2C0_DATA 0x03
-+#define DCRN_L2C0_SR 0x04
-+#define L2C_SR_CC 0x80000000
-+#define L2C_SR_CPE 0x40000000
-+#define L2C_SR_TPE 0x20000000
-+#define L2C_SR_LRU 0x10000000
-+#define L2C_SR_PCS 0x08000000
-+#define DCRN_L2C0_REVID 0x05
-+#define DCRN_L2C0_SNP0 0x06
-+#define DCRN_L2C0_SNP1 0x07
-+#define L2C_SNP_BA_MASK 0xffff0000
-+#define L2C_SNP_SSR_MASK 0x0000f000
-+#define L2C_SNP_SSR_32G 0x0000f000
-+#define L2C_SNP_ESR 0x00000800
-+
- #endif /* __DCR_REGS_H__ */
---- a/include/asm-powerpc/exception.h
-+++ b/include/asm-powerpc/exception.h
-@@ -228,18 +228,18 @@ label##_pSeries: \
- BEGIN_FW_FTR_SECTION; \
- stb r11,PACAHARDIRQEN(r13); \
- END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES); \
-+ TRACE_DISABLE_INTS; \
- BEGIN_FW_FTR_SECTION; \
- mfmsr r10; \
- ori r10,r10,MSR_EE; \
- mtmsrd r10,1; \
- END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
--
- #else
- #define DISABLE_INTS \
- li r11,0; \
- stb r11,PACASOFTIRQEN(r13); \
-- stb r11,PACAHARDIRQEN(r13)
--
-+ stb r11,PACAHARDIRQEN(r13); \
-+ TRACE_DISABLE_INTS
- #endif /* CONFIG_PPC_ISERIES */
-
- #define ENABLE_INTS \
---- /dev/null
-+++ b/include/asm-powerpc/fsl_lbc.h
-@@ -0,0 +1,311 @@
-+/* Freescale Local Bus Controller
-+ *
-+ * Copyright (c) 2006-2007 Freescale Semiconductor
-+ *
-+ * Authors: Nick Spence <nick.spence@freescale.com>,
-+ * Scott Wood <scottwood@freescale.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 __ASM_FSL_LBC_H
-+#define __ASM_FSL_LBC_H
-+
-+#include <linux/types.h>
-+#include <linux/spinlock.h>
-+#include <asm/io.h>
-+
-+struct fsl_lbc_bank {
-+ __be32 br; /**< Base Register */
-+#define BR_BA 0xFFFF8000
-+#define BR_BA_SHIFT 15
-+#define BR_PS 0x00001800
-+#define BR_PS_SHIFT 11
-+#define BR_PS_8 0x00000800 /* Port Size 8 bit */
-+#define BR_PS_16 0x00001000 /* Port Size 16 bit */
-+#define BR_PS_32 0x00001800 /* Port Size 32 bit */
-+#define BR_DECC 0x00000600
-+#define BR_DECC_SHIFT 9
-+#define BR_DECC_OFF 0x00000000 /* HW ECC checking and generation off */
-+#define BR_DECC_CHK 0x00000200 /* HW ECC checking on, generation off */
-+#define BR_DECC_CHK_GEN 0x00000400 /* HW ECC checking and generation on */
-+#define BR_WP 0x00000100
-+#define BR_WP_SHIFT 8
-+#define BR_MSEL 0x000000E0
-+#define BR_MSEL_SHIFT 5
-+#define BR_MS_GPCM 0x00000000 /* GPCM */
-+#define BR_MS_FCM 0x00000020 /* FCM */
-+#define BR_MS_SDRAM 0x00000060 /* SDRAM */
-+#define BR_MS_UPMA 0x00000080 /* UPMA */
-+#define BR_MS_UPMB 0x000000A0 /* UPMB */
-+#define BR_MS_UPMC 0x000000C0 /* UPMC */
-+#define BR_V 0x00000001
-+#define BR_V_SHIFT 0
-+#define BR_RES ~(BR_BA|BR_PS|BR_DECC|BR_WP|BR_MSEL|BR_V)
-+
-+ __be32 or; /**< Base Register */
-+#define OR0 0x5004
-+#define OR1 0x500C
-+#define OR2 0x5014
-+#define OR3 0x501C
-+#define OR4 0x5024
-+#define OR5 0x502C
-+#define OR6 0x5034
-+#define OR7 0x503C
-+
-+#define OR_FCM_AM 0xFFFF8000
-+#define OR_FCM_AM_SHIFT 15
-+#define OR_FCM_BCTLD 0x00001000
-+#define OR_FCM_BCTLD_SHIFT 12
-+#define OR_FCM_PGS 0x00000400
-+#define OR_FCM_PGS_SHIFT 10
-+#define OR_FCM_CSCT 0x00000200
-+#define OR_FCM_CSCT_SHIFT 9
-+#define OR_FCM_CST 0x00000100
-+#define OR_FCM_CST_SHIFT 8
-+#define OR_FCM_CHT 0x00000080
-+#define OR_FCM_CHT_SHIFT 7
-+#define OR_FCM_SCY 0x00000070
-+#define OR_FCM_SCY_SHIFT 4
-+#define OR_FCM_SCY_1 0x00000010
-+#define OR_FCM_SCY_2 0x00000020
-+#define OR_FCM_SCY_3 0x00000030
-+#define OR_FCM_SCY_4 0x00000040
-+#define OR_FCM_SCY_5 0x00000050
-+#define OR_FCM_SCY_6 0x00000060
-+#define OR_FCM_SCY_7 0x00000070
-+#define OR_FCM_RST 0x00000008
-+#define OR_FCM_RST_SHIFT 3
-+#define OR_FCM_TRLX 0x00000004
-+#define OR_FCM_TRLX_SHIFT 2
-+#define OR_FCM_EHTR 0x00000002
-+#define OR_FCM_EHTR_SHIFT 1
-+};
-+
-+struct fsl_lbc_regs {
-+ struct fsl_lbc_bank bank[8];
-+ u8 res0[0x28];
-+ __be32 mar; /**< UPM Address Register */
-+ u8 res1[0x4];
-+ __be32 mamr; /**< UPMA Mode Register */
-+#define MxMR_OP_NO (0 << 28) /**< normal operation */
-+#define MxMR_OP_WA (1 << 28) /**< write array */
-+#define MxMR_OP_RA (2 << 28) /**< read array */
-+#define MxMR_OP_RP (3 << 28) /**< run pattern */
-+#define MxMR_MAD 0x3f /**< machine address */
-+ __be32 mbmr; /**< UPMB Mode Register */
-+ __be32 mcmr; /**< UPMC Mode Register */
-+ u8 res2[0x8];
-+ __be32 mrtpr; /**< Memory Refresh Timer Prescaler Register */
-+ __be32 mdr; /**< UPM Data Register */
-+ u8 res3[0x4];
-+ __be32 lsor; /**< Special Operation Initiation Register */
-+ __be32 lsdmr; /**< SDRAM Mode Register */
-+ u8 res4[0x8];
-+ __be32 lurt; /**< UPM Refresh Timer */
-+ __be32 lsrt; /**< SDRAM Refresh Timer */
-+ u8 res5[0x8];
-+ __be32 ltesr; /**< Transfer Error Status Register */
-+#define LTESR_BM 0x80000000
-+#define LTESR_FCT 0x40000000
-+#define LTESR_PAR 0x20000000
-+#define LTESR_WP 0x04000000
-+#define LTESR_ATMW 0x00800000
-+#define LTESR_ATMR 0x00400000
-+#define LTESR_CS 0x00080000
-+#define LTESR_CC 0x00000001
-+#define LTESR_NAND_MASK (LTESR_FCT | LTESR_PAR | LTESR_CC)
-+ __be32 ltedr; /**< Transfer Error Disable Register */
-+ __be32 lteir; /**< Transfer Error Interrupt Register */
-+ __be32 lteatr; /**< Transfer Error Attributes Register */
-+ __be32 ltear; /**< Transfer Error Address Register */
-+ u8 res6[0xC];
-+ __be32 lbcr; /**< Configuration Register */
-+#define LBCR_LDIS 0x80000000
-+#define LBCR_LDIS_SHIFT 31
-+#define LBCR_BCTLC 0x00C00000
-+#define LBCR_BCTLC_SHIFT 22
-+#define LBCR_AHD 0x00200000
-+#define LBCR_LPBSE 0x00020000
-+#define LBCR_LPBSE_SHIFT 17
-+#define LBCR_EPAR 0x00010000
-+#define LBCR_EPAR_SHIFT 16
-+#define LBCR_BMT 0x0000FF00
-+#define LBCR_BMT_SHIFT 8
-+#define LBCR_INIT 0x00040000
-+ __be32 lcrr; /**< Clock Ratio Register */
-+#define LCRR_DBYP 0x80000000
-+#define LCRR_DBYP_SHIFT 31
-+#define LCRR_BUFCMDC 0x30000000
-+#define LCRR_BUFCMDC_SHIFT 28
-+#define LCRR_ECL 0x03000000
-+#define LCRR_ECL_SHIFT 24
-+#define LCRR_EADC 0x00030000
-+#define LCRR_EADC_SHIFT 16
-+#define LCRR_CLKDIV 0x0000000F
-+#define LCRR_CLKDIV_SHIFT 0
-+ u8 res7[0x8];
-+ __be32 fmr; /**< Flash Mode Register */
-+#define FMR_CWTO 0x0000F000
-+#define FMR_CWTO_SHIFT 12
-+#define FMR_BOOT 0x00000800
-+#define FMR_ECCM 0x00000100
-+#define FMR_AL 0x00000030
-+#define FMR_AL_SHIFT 4
-+#define FMR_OP 0x00000003
-+#define FMR_OP_SHIFT 0
-+ __be32 fir; /**< Flash Instruction Register */
-+#define FIR_OP0 0xF0000000
-+#define FIR_OP0_SHIFT 28
-+#define FIR_OP1 0x0F000000
-+#define FIR_OP1_SHIFT 24
-+#define FIR_OP2 0x00F00000
-+#define FIR_OP2_SHIFT 20
-+#define FIR_OP3 0x000F0000
-+#define FIR_OP3_SHIFT 16
-+#define FIR_OP4 0x0000F000
-+#define FIR_OP4_SHIFT 12
-+#define FIR_OP5 0x00000F00
-+#define FIR_OP5_SHIFT 8
-+#define FIR_OP6 0x000000F0
-+#define FIR_OP6_SHIFT 4
-+#define FIR_OP7 0x0000000F
-+#define FIR_OP7_SHIFT 0
-+#define FIR_OP_NOP 0x0 /* No operation and end of sequence */
-+#define FIR_OP_CA 0x1 /* Issue current column address */
-+#define FIR_OP_PA 0x2 /* Issue current block+page address */
-+#define FIR_OP_UA 0x3 /* Issue user defined address */
-+#define FIR_OP_CM0 0x4 /* Issue command from FCR[CMD0] */
-+#define FIR_OP_CM1 0x5 /* Issue command from FCR[CMD1] */
-+#define FIR_OP_CM2 0x6 /* Issue command from FCR[CMD2] */
-+#define FIR_OP_CM3 0x7 /* Issue command from FCR[CMD3] */
-+#define FIR_OP_WB 0x8 /* Write FBCR bytes from FCM buffer */
-+#define FIR_OP_WS 0x9 /* Write 1 or 2 bytes from MDR[AS] */
-+#define FIR_OP_RB 0xA /* Read FBCR bytes to FCM buffer */
-+#define FIR_OP_RS 0xB /* Read 1 or 2 bytes to MDR[AS] */
-+#define FIR_OP_CW0 0xC /* Wait then issue FCR[CMD0] */
-+#define FIR_OP_CW1 0xD /* Wait then issue FCR[CMD1] */
-+#define FIR_OP_RBW 0xE /* Wait then read FBCR bytes */
-+#define FIR_OP_RSW 0xE /* Wait then read 1 or 2 bytes */
-+ __be32 fcr; /**< Flash Command Register */
-+#define FCR_CMD0 0xFF000000
-+#define FCR_CMD0_SHIFT 24
-+#define FCR_CMD1 0x00FF0000
-+#define FCR_CMD1_SHIFT 16
-+#define FCR_CMD2 0x0000FF00
-+#define FCR_CMD2_SHIFT 8
-+#define FCR_CMD3 0x000000FF
-+#define FCR_CMD3_SHIFT 0
-+ __be32 fbar; /**< Flash Block Address Register */
-+#define FBAR_BLK 0x00FFFFFF
-+ __be32 fpar; /**< Flash Page Address Register */
-+#define FPAR_SP_PI 0x00007C00
-+#define FPAR_SP_PI_SHIFT 10
-+#define FPAR_SP_MS 0x00000200
-+#define FPAR_SP_CI 0x000001FF
-+#define FPAR_SP_CI_SHIFT 0
-+#define FPAR_LP_PI 0x0003F000
-+#define FPAR_LP_PI_SHIFT 12
-+#define FPAR_LP_MS 0x00000800
-+#define FPAR_LP_CI 0x000007FF
-+#define FPAR_LP_CI_SHIFT 0
-+ __be32 fbcr; /**< Flash Byte Count Register */
-+#define FBCR_BC 0x00000FFF
-+ u8 res11[0x8];
-+ u8 res8[0xF00];
-+};
-+
-+extern struct fsl_lbc_regs __iomem *fsl_lbc_regs;
-+extern spinlock_t fsl_lbc_lock;
-+
-+/*
-+ * FSL UPM routines
-+ */
-+struct fsl_upm {
-+ __be32 __iomem *mxmr;
-+ int width;
-+};
-+
-+extern int fsl_lbc_find(phys_addr_t addr_base);
-+extern int fsl_upm_find(phys_addr_t addr_base, struct fsl_upm *upm);
-+
-+/**
-+ * fsl_upm_start_pattern - start UPM patterns execution
-+ * @upm: pointer to the fsl_upm structure obtained via fsl_upm_find
-+ * @pat_offset: UPM pattern offset for the command to be executed
-+ *
-+ * This routine programmes UPM so the next memory access that hits an UPM
-+ * will trigger pattern execution, starting at pat_offset.
-+ */
-+static inline void fsl_upm_start_pattern(struct fsl_upm *upm, u8 pat_offset)
-+{
-+ clrsetbits_be32(upm->mxmr, MxMR_MAD, MxMR_OP_RP | pat_offset);
-+}
-+
-+/**
-+ * fsl_upm_end_pattern - end UPM patterns execution
-+ * @upm: pointer to the fsl_upm structure obtained via fsl_upm_find
-+ *
-+ * This routine reverts UPM to normal operation mode.
-+ */
-+static inline void fsl_upm_end_pattern(struct fsl_upm *upm)
-+{
-+ clrbits32(upm->mxmr, MxMR_OP_RP);
-+
-+ while (in_be32(upm->mxmr) & MxMR_OP_RP)
-+ cpu_relax();
-+}
-+
-+/**
-+ * fsl_upm_run_pattern - actually run an UPM pattern
-+ * @upm: pointer to the fsl_upm structure obtained via fsl_upm_find
-+ * @io_base: remapped pointer to where memory access should happen
-+ * @mar: MAR register content during pattern execution
-+ *
-+ * This function triggers dummy write to the memory specified by the io_base,
-+ * thus UPM pattern actually executed. Note that mar usage depends on the
-+ * pre-programmed AMX bits in the UPM RAM.
-+ */
-+static inline int fsl_upm_run_pattern(struct fsl_upm *upm,
-+ void __iomem *io_base, u32 mar)
-+{
-+ int ret = 0;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&fsl_lbc_lock, flags);
-+
-+ out_be32(&fsl_lbc_regs->mar, mar << (32 - upm->width));
-+
-+ switch (upm->width) {
-+ case 8:
-+ out_8(io_base, 0x0);
-+ break;
-+ case 16:
-+ out_be16(io_base, 0x0);
-+ break;
-+ case 32:
-+ out_be32(io_base, 0x0);
-+ break;
-+ default:
-+ ret = -EINVAL;
-+ break;
-+ }
-+
-+ spin_unlock_irqrestore(&fsl_lbc_lock, flags);
-+
-+ return ret;
-+}
-+
-+#endif /* __ASM_FSL_LBC_H */
---- /dev/null
-+++ b/include/asm-powerpc/gpio.h
-@@ -0,0 +1,56 @@
-+/*
-+ * Generic GPIO API implementation for PowerPC.
-+ *
-+ * Copyright (c) 2007-2008 MontaVista Software, Inc.
-+ *
-+ * Author: Anton Vorontsov <avorontsov@ru.mvista.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.
-+ */
-+
-+#ifndef __ASM_POWERPC_GPIO_H
-+#define __ASM_POWERPC_GPIO_H
-+
-+#include <linux/errno.h>
-+#include <asm-generic/gpio.h>
-+
-+#ifdef CONFIG_HAVE_GPIO_LIB
-+
-+/*
-+ * We don't (yet) implement inlined/rapid versions for on-chip gpios.
-+ * Just call gpiolib.
-+ */
-+static inline int gpio_get_value(unsigned int gpio)
-+{
-+ return __gpio_get_value(gpio);
-+}
-+
-+static inline void gpio_set_value(unsigned int gpio, int value)
-+{
-+ __gpio_set_value(gpio, value);
-+}
-+
-+static inline int gpio_cansleep(unsigned int gpio)
-+{
-+ return __gpio_cansleep(gpio);
-+}
-+
-+/*
-+ * Not implemented, yet.
-+ */
-+static inline int gpio_to_irq(unsigned int gpio)
-+{
-+ return -ENOSYS;
-+}
-+
-+static inline int irq_to_gpio(unsigned int irq)
-+{
-+ return -EINVAL;
-+}
-+
-+#endif /* CONFIG_HAVE_GPIO_LIB */
-+
-+#endif /* __ASM_POWERPC_GPIO_H */
---- a/include/asm-powerpc/hw_irq.h
-+++ b/include/asm-powerpc/hw_irq.h
-@@ -27,7 +27,7 @@ static inline unsigned long local_get_fl
- return flags;
- }
-
--static inline unsigned long local_irq_disable(void)
-+static inline unsigned long raw_local_irq_disable(void)
- {
- unsigned long flags, zero;
-
-@@ -39,14 +39,15 @@ static inline unsigned long local_irq_di
- return flags;
- }
-
--extern void local_irq_restore(unsigned long);
-+extern void raw_local_irq_restore(unsigned long);
- extern void iseries_handle_interrupts(void);
-
--#define local_irq_enable() local_irq_restore(1)
--#define local_save_flags(flags) ((flags) = local_get_flags())
--#define local_irq_save(flags) ((flags) = local_irq_disable())
-+#define raw_local_irq_enable() raw_local_irq_restore(1)
-+#define raw_local_save_flags(flags) ((flags) = local_get_flags())
-+#define raw_local_irq_save(flags) ((flags) = raw_local_irq_disable())
-
--#define irqs_disabled() (local_get_flags() == 0)
-+#define raw_irqs_disabled() (local_get_flags() == 0)
-+#define raw_irqs_disabled_flags(flags) ((flags) == 0)
-
- #define __hard_irq_enable() __mtmsrd(mfmsr() | MSR_EE, 1)
- #define __hard_irq_disable() __mtmsrd(mfmsr() & ~MSR_EE, 1)
---- a/include/asm-powerpc/immap_qe.h
-+++ b/include/asm-powerpc/immap_qe.h
-@@ -20,6 +20,7 @@
- #ifdef __KERNEL__
-
- #include <linux/kernel.h>
-+#include <asm/io.h>
-
- #define QE_IMMAP_SIZE (1024 * 1024) /* 1MB from 1MB+IMMR */
-
-@@ -468,7 +469,7 @@ struct qe_immap {
- u8 res18[0xC0000]; /* 0x140000 - 0x200000 */
- } __attribute__ ((packed));
-
--extern struct qe_immap *qe_immr;
-+extern struct qe_immap __iomem *qe_immr;
- extern phys_addr_t get_qe_base(void);
-
- static inline unsigned long immrbar_virt_to_phys(void *address)
---- a/include/asm-powerpc/irqflags.h
-+++ b/include/asm-powerpc/irqflags.h
-@@ -2,30 +2,43 @@
- * include/asm-powerpc/irqflags.h
- *
- * IRQ flags handling
-- *
-- * This file gets included from lowlevel asm headers too, to provide
-- * wrapped versions of the local_irq_*() APIs, based on the
-- * raw_local_irq_*() macros from the lowlevel headers.
- */
- #ifndef _ASM_IRQFLAGS_H
- #define _ASM_IRQFLAGS_H
-
-+#ifndef __ASSEMBLY__
- /*
- * Get definitions for raw_local_save_flags(x), etc.
- */
- #include <asm-powerpc/hw_irq.h>
-
-+#else
-+#ifdef CONFIG_TRACE_IRQFLAGS
- /*
-- * Do the CPU's IRQ-state tracing from assembly code. We call a
-- * C function, so save all the C-clobbered registers:
-+ * Most of the CPU's IRQ-state tracing is done from assembly code; we
-+ * have to call a C function so call a wrapper that saves all the
-+ * C-clobbered registers.
- */
--#ifdef CONFIG_TRACE_IRQFLAGS
--
--#error No support on PowerPC yet for CONFIG_TRACE_IRQFLAGS
--
-+#define TRACE_ENABLE_INTS bl .trace_hardirqs_on
-+#define TRACE_DISABLE_INTS bl .trace_hardirqs_off
-+#define TRACE_AND_RESTORE_IRQ_PARTIAL(en,skip) \
-+ cmpdi en, 0; \
-+ bne 95f; \
-+ stb en,PACASOFTIRQEN(r13); \
-+ bl .trace_hardirqs_off; \
-+ b skip; \
-+95: bl .trace_hardirqs_on; \
-+ li en,1;
-+#define TRACE_AND_RESTORE_IRQ(en) \
-+ TRACE_AND_RESTORE_IRQ_PARTIAL(en,96f); \
-+96: stb en,PACASOFTIRQEN(r13)
- #else
--# define TRACE_IRQS_ON
--# define TRACE_IRQS_OFF
-+#define TRACE_ENABLE_INTS
-+#define TRACE_DISABLE_INTS
-+#define TRACE_AND_RESTORE_IRQ_PARTIAL(en,skip)
-+#define TRACE_AND_RESTORE_IRQ(en) \
-+ stb en,PACASOFTIRQEN(r13)
-+#endif
- #endif
-
- #endif
---- /dev/null
-+++ b/include/asm-powerpc/iseries/alpaca.h
-@@ -0,0 +1,31 @@
-+/*
-+ * Copyright © 2008 Stephen Rothwell IBM 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
-+ * 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_POWERPC_ISERIES_ALPACA_H
-+#define _ASM_POWERPC_ISERIES_ALPACA_H
-+
-+/*
-+ * This is the part of the paca that the iSeries hypervisor
-+ * needs to be statically initialised. Immediately after boot
-+ * we switch to the normal Linux paca.
-+ */
-+struct alpaca {
-+ struct lppaca *lppaca_ptr; /* Pointer to LpPaca for PLIC */
-+ const void *reg_save_ptr; /* Pointer to LpRegSave for PLIC */
-+};
-+
-+#endif /* _ASM_POWERPC_ISERIES_ALPACA_H */
---- a/include/asm-powerpc/iseries/it_lp_reg_save.h
-+++ /dev/null
-@@ -1,85 +0,0 @@
--/*
-- * Copyright (C) 2001 Mike Corrigan IBM 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
-- * 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_POWERPC_ISERIES_IT_LP_REG_SAVE_H
--#define _ASM_POWERPC_ISERIES_IT_LP_REG_SAVE_H
--
--/*
-- * This control block contains the data that is shared between PLIC
-- * and the OS
-- */
--
--struct ItLpRegSave {
-- u32 xDesc; // Eye catcher "LpRS" ebcdic 000-003
-- u16 xSize; // Size of this class 004-005
-- u8 xInUse; // Area is live 006-007
-- u8 xRsvd1[9]; // Reserved 007-00F
--
-- u8 xFixedRegSave[352]; // Fixed Register Save Area 010-16F
-- u32 xCTRL; // Control Register 170-173
-- u32 xDEC; // Decrementer 174-177
-- u32 xFPSCR; // FP Status and Control Reg 178-17B
-- u32 xPVR; // Processor Version Number 17C-17F
--
-- u64 xMMCR0; // Monitor Mode Control Reg 0 180-187
-- u32 xPMC1; // Perf Monitor Counter 1 188-18B
-- u32 xPMC2; // Perf Monitor Counter 2 18C-18F
-- u32 xPMC3; // Perf Monitor Counter 3 190-193
-- u32 xPMC4; // Perf Monitor Counter 4 194-197
-- u32 xPIR; // Processor ID Reg 198-19B
--
-- u32 xMMCR1; // Monitor Mode Control Reg 1 19C-19F
-- u32 xMMCRA; // Monitor Mode Control Reg A 1A0-1A3
-- u32 xPMC5; // Perf Monitor Counter 5 1A4-1A7
-- u32 xPMC6; // Perf Monitor Counter 6 1A8-1AB
-- u32 xPMC7; // Perf Monitor Counter 7 1AC-1AF
-- u32 xPMC8; // Perf Monitor Counter 8 1B0-1B3
-- u32 xTSC; // Thread Switch Control 1B4-1B7
-- u32 xTST; // Thread Switch Timeout 1B8-1BB
-- u32 xRsvd; // Reserved 1BC-1BF
--
-- u64 xACCR; // Address Compare Control Reg 1C0-1C7
-- u64 xIMR; // Instruction Match Register 1C8-1CF
-- u64 xSDR1; // Storage Description Reg 1 1D0-1D7
-- u64 xSPRG0; // Special Purpose Reg General0 1D8-1DF
-- u64 xSPRG1; // Special Purpose Reg General1 1E0-1E7
-- u64 xSPRG2; // Special Purpose Reg General2 1E8-1EF
-- u64 xSPRG3; // Special Purpose Reg General3 1F0-1F7
-- u64 xTB; // Time Base Register 1F8-1FF
--
-- u64 xFPR[32]; // Floating Point Registers 200-2FF
--
-- u64 xMSR; // Machine State Register 300-307
-- u64 xNIA; // Next Instruction Address 308-30F
--
-- u64 xDABR; // Data Address Breakpoint Reg 310-317
-- u64 xIABR; // Inst Address Breakpoint Reg 318-31F
--
-- u64 xHID0; // HW Implementation Dependent0 320-327
--
-- u64 xHID4; // HW Implementation Dependent4 328-32F
-- u64 xSCOMd; // SCON Data Reg (SPRG4) 330-337
-- u64 xSCOMc; // SCON Command Reg (SPRG5) 338-33F
-- u64 xSDAR; // Sample Data Address Register 340-347
-- u64 xSIAR; // Sample Inst Address Register 348-34F
--
-- u8 xRsvd3[176]; // Reserved 350-3FF
--};
--
--extern struct ItLpRegSave iseries_reg_save[];
--
--#endif /* _ASM_POWERPC_ISERIES_IT_LP_REG_SAVE_H */
---- a/include/asm-powerpc/lmb.h
-+++ b/include/asm-powerpc/lmb.h
-@@ -1,81 +1,15 @@
- #ifndef _ASM_POWERPC_LMB_H
- #define _ASM_POWERPC_LMB_H
--#ifdef __KERNEL__
-
--/*
-- * Definitions for talking to the Open Firmware PROM on
-- * Power Macintosh computers.
-- *
-- * Copyright (C) 2001 Peter Bergner, IBM Corp.
-- *
-- * 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 <asm/udbg.h>
-
--#include <linux/init.h>
--#include <asm/prom.h>
-+#define LMB_DBG(fmt...) udbg_printf(fmt)
-
--#define MAX_LMB_REGIONS 128
-+#ifdef CONFIG_PPC32
-+extern phys_addr_t lowmem_end_addr;
-+#define LMB_REAL_LIMIT lowmem_end_addr
-+#else
-+#define LMB_REAL_LIMIT 0
-+#endif
-
--struct lmb_property {
-- unsigned long base;
-- unsigned long size;
--};
--
--struct lmb_region {
-- unsigned long cnt;
-- unsigned long size;
-- struct lmb_property region[MAX_LMB_REGIONS+1];
--};
--
--struct lmb {
-- unsigned long debug;
-- unsigned long rmo_size;
-- struct lmb_region memory;
-- struct lmb_region reserved;
--};
--
--extern struct lmb lmb;
--
--extern void __init lmb_init(void);
--extern void __init lmb_analyze(void);
--extern long __init lmb_add(unsigned long base, unsigned long size);
--extern long __init lmb_reserve(unsigned long base, unsigned long size);
--extern unsigned long __init lmb_alloc(unsigned long size, unsigned long align);
--extern unsigned long __init lmb_alloc_base(unsigned long size,
-- unsigned long align, unsigned long max_addr);
--extern unsigned long __init __lmb_alloc_base(unsigned long size,
-- unsigned long align, unsigned long max_addr);
--extern unsigned long __init lmb_phys_mem_size(void);
--extern unsigned long __init lmb_end_of_DRAM(void);
--extern void __init lmb_enforce_memory_limit(unsigned long memory_limit);
--extern int __init lmb_is_reserved(unsigned long addr);
--
--extern void lmb_dump_all(void);
--
--static inline unsigned long
--lmb_size_bytes(struct lmb_region *type, unsigned long region_nr)
--{
-- return type->region[region_nr].size;
--}
--static inline unsigned long
--lmb_size_pages(struct lmb_region *type, unsigned long region_nr)
--{
-- return lmb_size_bytes(type, region_nr) >> PAGE_SHIFT;
--}
--static inline unsigned long
--lmb_start_pfn(struct lmb_region *type, unsigned long region_nr)
--{
-- return type->region[region_nr].base >> PAGE_SHIFT;
--}
--static inline unsigned long
--lmb_end_pfn(struct lmb_region *type, unsigned long region_nr)
--{
-- return lmb_start_pfn(type, region_nr) +
-- lmb_size_pages(type, region_nr);
--}
--
--#endif /* __KERNEL__ */
- #endif /* _ASM_POWERPC_LMB_H */
---- a/include/asm-powerpc/machdep.h
-+++ b/include/asm-powerpc/machdep.h
-@@ -68,6 +68,8 @@ struct machdep_calls {
- unsigned long vflags,
- int psize, int ssize);
- long (*hpte_remove)(unsigned long hpte_group);
-+ void (*hpte_removebolted)(unsigned long ea,
-+ int psize, int ssize);
- void (*flush_hash_range)(unsigned long number, int local);
-
- /* special for kexec, to be called in real mode, linar mapping is
-@@ -196,9 +198,6 @@ struct machdep_calls {
- May be NULL. */
- void (*init)(void);
-
-- void (*setup_io_mappings)(void);
--
-- void (*early_serial_map)(void);
- void (*kgdb_map_scc)(void);
-
- /*
---- a/include/asm-powerpc/macio.h
-+++ b/include/asm-powerpc/macio.h
-@@ -2,7 +2,7 @@
- #define __MACIO_ASIC_H__
- #ifdef __KERNEL__
-
--#include <asm/of_device.h>
-+#include <linux/of_device.h>
-
- extern struct bus_type macio_bus_type;
-
---- a/include/asm-powerpc/mmu-40x.h
-+++ b/include/asm-powerpc/mmu-40x.h
-@@ -53,8 +53,6 @@
-
- #ifndef __ASSEMBLY__
-
--typedef unsigned long phys_addr_t;
--
- typedef struct {
- unsigned long id;
- unsigned long vdso_base;
---- a/include/asm-powerpc/mmu-44x.h
-+++ b/include/asm-powerpc/mmu-44x.h
-@@ -53,8 +53,6 @@
-
- #ifndef __ASSEMBLY__
-
--typedef unsigned long long phys_addr_t;
--
- typedef struct {
- unsigned long id;
- unsigned long vdso_base;
---- a/include/asm-powerpc/mmu-8xx.h
-+++ b/include/asm-powerpc/mmu-8xx.h
-@@ -136,8 +136,6 @@
- #define SPRN_M_TW 799
-
- #ifndef __ASSEMBLY__
--typedef unsigned long phys_addr_t;
--
- typedef struct {
- unsigned long id;
- unsigned long vdso_base;
---- a/include/asm-powerpc/mmu-fsl-booke.h
-+++ b/include/asm-powerpc/mmu-fsl-booke.h
-@@ -73,12 +73,6 @@
-
- #ifndef __ASSEMBLY__
-
--#ifndef CONFIG_PHYS_64BIT
--typedef unsigned long phys_addr_t;
--#else
--typedef unsigned long long phys_addr_t;
--#endif
--
- typedef struct {
- unsigned long id;
- unsigned long vdso_base;
---- a/include/asm-powerpc/mmu-hash32.h
-+++ b/include/asm-powerpc/mmu-hash32.h
-@@ -84,8 +84,6 @@ typedef struct {
- unsigned long vdso_base;
- } mm_context_t;
-
--typedef unsigned long phys_addr_t;
--
- #endif /* !__ASSEMBLY__ */
-
- #endif /* _ASM_POWERPC_MMU_HASH32_H_ */
---- a/include/asm-powerpc/mmu-hash64.h
-+++ b/include/asm-powerpc/mmu-hash64.h
-@@ -469,9 +469,6 @@ static inline unsigned long get_vsid(uns
- VSID_MODULUS_256M)
- #define KERNEL_VSID(ea) VSID_SCRAMBLE(GET_ESID(ea))
-
--/* Physical address used by some IO functions */
--typedef unsigned long phys_addr_t;
--
- #endif /* __ASSEMBLY__ */
-
- #endif /* _ASM_POWERPC_MMU_HASH64_H_ */
---- a/include/asm-powerpc/paca.h
-+++ b/include/asm-powerpc/paca.h
-@@ -42,10 +42,7 @@ struct task_struct;
- * Defines the layout of the paca.
- *
- * This structure is not directly accessed by firmware or the service
-- * processor except for the first two pointers that point to the
-- * lppaca area and the ItLpRegSave area for this CPU. The lppaca
-- * object is currently contained within the PACA but it doesn't need
-- * to be.
-+ * processor.
- */
- struct paca_struct {
- /*
-@@ -55,14 +52,7 @@ struct paca_struct {
- * avoid cacheline bouncing.
- */
-
-- /*
-- * MAGIC: These first two pointers can't be moved - they're
-- * accessed by the firmware
-- */
- struct lppaca *lppaca_ptr; /* Pointer to LpPaca for PLIC */
--#ifdef CONFIG_PPC_ISERIES
-- void *reg_save_ptr; /* Pointer to LpRegSave for PLIC */
--#endif /* CONFIG_PPC_ISERIES */
-
- /*
- * MAGIC: the spinlock functions in arch/powerpc/lib/locks.c
---- a/include/asm-powerpc/page.h
-+++ b/include/asm-powerpc/page.h
-@@ -53,6 +53,7 @@
-
- #define PAGE_OFFSET ASM_CONST(CONFIG_KERNEL_START)
- #define KERNELBASE (PAGE_OFFSET + PHYSICAL_START)
-+#define LOAD_OFFSET PAGE_OFFSET
-
- #ifdef CONFIG_FLATMEM
- #define pfn_valid(pfn) ((pfn) < max_mapnr)
---- a/include/asm-powerpc/page_32.h
-+++ b/include/asm-powerpc/page_32.h
-@@ -3,8 +3,6 @@
-
- #define VM_DATA_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS32
-
--#define PPC_MEMSTART 0
--
- #ifdef CONFIG_NOT_COHERENT_CACHE
- #define ARCH_KMALLOC_MINALIGN L1_CACHE_BYTES
- #endif
---- a/include/asm-powerpc/pasemi_dma.h
-+++ b/include/asm-powerpc/pasemi_dma.h
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (C) 2006 PA Semi, Inc
-+ * Copyright (C) 2006-2008 PA Semi, Inc
- *
- * Hardware register layout and descriptor formats for the on-board
- * DMA engine on PA Semi PWRficient. Used by ethernet, function and security
-@@ -40,6 +40,11 @@ enum {
- PAS_DMA_COM_TXSTA = 0x104, /* Transmit Status Register */
- PAS_DMA_COM_RXCMD = 0x108, /* Receive Command Register */
- PAS_DMA_COM_RXSTA = 0x10c, /* Receive Status Register */
-+ PAS_DMA_COM_CFG = 0x114, /* Common config reg */
-+ PAS_DMA_TXF_SFLG0 = 0x140, /* Set flags */
-+ PAS_DMA_TXF_SFLG1 = 0x144, /* Set flags */
-+ PAS_DMA_TXF_CFLG0 = 0x148, /* Set flags */
-+ PAS_DMA_TXF_CFLG1 = 0x14c, /* Set flags */
- };
-
-
-@@ -123,11 +128,16 @@ enum {
- #define PAS_DMA_TXCHAN_TCMDSTA_DA 0x00000100
- #define PAS_DMA_TXCHAN_CFG(c) (0x304+(c)*_PAS_DMA_TXCHAN_STRIDE)
- #define PAS_DMA_TXCHAN_CFG_TY_IFACE 0x00000000 /* Type = interface */
-+#define PAS_DMA_TXCHAN_CFG_TY_COPY 0x00000001 /* Type = copy only */
-+#define PAS_DMA_TXCHAN_CFG_TY_FUNC 0x00000002 /* Type = function */
-+#define PAS_DMA_TXCHAN_CFG_TY_XOR 0x00000003 /* Type = xor only */
- #define PAS_DMA_TXCHAN_CFG_TATTR_M 0x0000003c
- #define PAS_DMA_TXCHAN_CFG_TATTR_S 2
- #define PAS_DMA_TXCHAN_CFG_TATTR(x) (((x) << PAS_DMA_TXCHAN_CFG_TATTR_S) & \
- PAS_DMA_TXCHAN_CFG_TATTR_M)
--#define PAS_DMA_TXCHAN_CFG_WT_M 0x000001c0
-+#define PAS_DMA_TXCHAN_CFG_LPDQ 0x00000800
-+#define PAS_DMA_TXCHAN_CFG_LPSQ 0x00000400
-+#define PAS_DMA_TXCHAN_CFG_WT_M 0x000003c0
- #define PAS_DMA_TXCHAN_CFG_WT_S 6
- #define PAS_DMA_TXCHAN_CFG_WT(x) (((x) << PAS_DMA_TXCHAN_CFG_WT_S) & \
- PAS_DMA_TXCHAN_CFG_WT_M)
-@@ -394,11 +404,62 @@ enum {
- XCT_COPY_LLEN_M)
- #define XCT_COPY_SE 0x0000000000000001ull
-
-+/* Function descriptor fields */
-+#define XCT_FUN_T 0x8000000000000000ull
-+#define XCT_FUN_ST 0x4000000000000000ull
-+#define XCT_FUN_RR_M 0x3000000000000000ull
-+#define XCT_FUN_RR_NORES 0x0000000000000000ull
-+#define XCT_FUN_RR_8BRES 0x1000000000000000ull
-+#define XCT_FUN_RR_24BRES 0x2000000000000000ull
-+#define XCT_FUN_RR_40BRES 0x3000000000000000ull
-+#define XCT_FUN_I 0x0800000000000000ull
-+#define XCT_FUN_O 0x0400000000000000ull
-+#define XCT_FUN_E 0x0200000000000000ull
-+#define XCT_FUN_FUN_M 0x01c0000000000000ull
-+#define XCT_FUN_FUN_S 54
-+#define XCT_FUN_FUN(x) ((((long)(x)) << XCT_FUN_FUN_S) & XCT_FUN_FUN_M)
-+#define XCT_FUN_CRM_M 0x0038000000000000ull
-+#define XCT_FUN_CRM_NOP 0x0000000000000000ull
-+#define XCT_FUN_CRM_SIG 0x0008000000000000ull
-+#define XCT_FUN_LLEN_M 0x0007ffff00000000ull
-+#define XCT_FUN_LLEN_S 32
-+#define XCT_FUN_LLEN(x) ((((long)(x)) << XCT_FUN_LLEN_S) & XCT_FUN_LLEN_M)
-+#define XCT_FUN_SHL_M 0x00000000f8000000ull
-+#define XCT_FUN_SHL_S 27
-+#define XCT_FUN_SHL(x) ((((long)(x)) << XCT_FUN_SHL_S) & XCT_FUN_SHL_M)
-+#define XCT_FUN_CHL_M 0x0000000007c00000ull
-+#define XCT_FUN_HSZ_M 0x00000000003c0000ull
-+#define XCT_FUN_ALG_M 0x0000000000038000ull
-+#define XCT_FUN_HP 0x0000000000004000ull
-+#define XCT_FUN_BCM_M 0x0000000000003800ull
-+#define XCT_FUN_BCP_M 0x0000000000000600ull
-+#define XCT_FUN_SIG_M 0x00000000000001f0ull
-+#define XCT_FUN_SIG_TCP4 0x0000000000000140ull
-+#define XCT_FUN_SIG_TCP6 0x0000000000000150ull
-+#define XCT_FUN_SIG_UDP4 0x0000000000000160ull
-+#define XCT_FUN_SIG_UDP6 0x0000000000000170ull
-+#define XCT_FUN_A 0x0000000000000008ull
-+#define XCT_FUN_C 0x0000000000000004ull
-+#define XCT_FUN_AL2 0x0000000000000002ull
-+#define XCT_FUN_SE 0x0000000000000001ull
-+
-+/* Function descriptor 8byte result fields */
-+#define XCT_FUNRES_8B_CS_M 0x0000ffff00000000ull
-+#define XCT_FUNRES_8B_CS_S 32
-+#define XCT_FUNRES_8B_CRC_M 0x00000000ffffffffull
-+#define XCT_FUNRES_8B_CRC_S 0
-+
- /* Control descriptor fields */
- #define CTRL_CMD_T 0x8000000000000000ull
- #define CTRL_CMD_META_EVT 0x2000000000000000ull
- #define CTRL_CMD_O 0x0400000000000000ull
--#define CTRL_CMD_REG_M 0x000000000000000full
-+#define CTRL_CMD_ETYPE_M 0x0038000000000000ull
-+#define CTRL_CMD_ETYPE_EXT 0x0000000000000000ull
-+#define CTRL_CMD_ETYPE_WSET 0x0020000000000000ull
-+#define CTRL_CMD_ETYPE_WCLR 0x0028000000000000ull
-+#define CTRL_CMD_ETYPE_SET 0x0030000000000000ull
-+#define CTRL_CMD_ETYPE_CLR 0x0038000000000000ull
-+#define CTRL_CMD_REG_M 0x000000000000007full
- #define CTRL_CMD_REG_S 0
- #define CTRL_CMD_REG(x) ((((long)(x)) << CTRL_CMD_REG_S) & \
- CTRL_CMD_REG_M)
-@@ -461,6 +522,16 @@ extern void *pasemi_dma_alloc_buf(struct
- extern void pasemi_dma_free_buf(struct pasemi_dmachan *chan, int size,
- dma_addr_t *handle);
-
-+/* Routines to allocate flags (events) for channel syncronization */
-+extern int pasemi_dma_alloc_flag(void);
-+extern void pasemi_dma_free_flag(int flag);
-+extern void pasemi_dma_set_flag(int flag);
-+extern void pasemi_dma_clear_flag(int flag);
-+
-+/* Routines to allocate function engines */
-+extern int pasemi_dma_alloc_fun(void);
-+extern void pasemi_dma_free_fun(int fun);
-+
- /* Initialize the library, must be called before any other functions */
- extern int pasemi_dma_init(void);
-
---- a/include/asm-powerpc/pci-bridge.h
-+++ b/include/asm-powerpc/pci-bridge.h
-@@ -117,7 +117,7 @@ struct pci_controller {
-
- #ifndef CONFIG_PPC64
-
--static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
-+static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus)
- {
- return bus->sysdata;
- }
-@@ -235,7 +235,7 @@ extern void pcibios_fixup_new_pci_device
-
- extern int pcibios_remove_root_bus(struct pci_controller *phb);
-
--static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
-+static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus)
- {
- struct device_node *busdn = bus->sysdata;
-
---- a/include/asm-powerpc/pgtable-ppc32.h
-+++ b/include/asm-powerpc/pgtable-ppc32.h
-@@ -98,9 +98,6 @@ extern int icache_44x_need_flush;
- #define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE)
- #define FIRST_USER_ADDRESS 0
-
--#define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT)
--#define KERNEL_PGD_PTRS (PTRS_PER_PGD-USER_PGD_PTRS)
--
- #define pte_ERROR(e) \
- printk("%s:%d: bad pte %llx.\n", __FILE__, __LINE__, \
- (unsigned long long)pte_val(e))
-@@ -420,7 +417,8 @@ extern int icache_44x_need_flush;
- #define _PAGE_IO (_PAGE_KERNEL | _PAGE_NO_CACHE | _PAGE_GUARDED)
- #define _PAGE_RAM (_PAGE_KERNEL | _PAGE_HWEXEC)
-
--#if defined(CONFIG_KGDB) || defined(CONFIG_XMON) || defined(CONFIG_BDI_SWITCH)
-+#if defined(CONFIG_KGDB) || defined(CONFIG_XMON) || defined(CONFIG_BDI_SWITCH) ||\
-+ defined(CONFIG_KPROBES)
- /* We want the debuggers to be able to set breakpoints anywhere, so
- * don't write protect the kernel text */
- #define _PAGE_RAM_TEXT _PAGE_RAM
-@@ -692,7 +690,7 @@ extern pgprot_t phys_mem_access_prot(str
- #define pmd_page_vaddr(pmd) \
- ((unsigned long) (pmd_val(pmd) & PAGE_MASK))
- #define pmd_page(pmd) \
-- (mem_map + (__pa(pmd_val(pmd)) >> PAGE_SHIFT))
-+ pfn_to_page((__pa(pmd_val(pmd)) >> PAGE_SHIFT))
- #endif
-
- /* to find an entry in a kernel page-table-directory */
---- /dev/null
-+++ b/include/asm-powerpc/phyp_dump.h
-@@ -0,0 +1,47 @@
-+/*
-+ * Hypervisor-assisted dump
-+ *
-+ * Linas Vepstas, Manish Ahuja 2008
-+ * Copyright 2008 IBM Corp.
-+ *
-+ * 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 _PPC64_PHYP_DUMP_H
-+#define _PPC64_PHYP_DUMP_H
-+
-+#ifdef CONFIG_PHYP_DUMP
-+
-+/* The RMR region will be saved for later dumping
-+ * whenever the kernel crashes. Set this to 256MB. */
-+#define PHYP_DUMP_RMR_START 0x0
-+#define PHYP_DUMP_RMR_END (1UL<<28)
-+
-+struct phyp_dump {
-+ /* Memory that is reserved during very early boot. */
-+ unsigned long init_reserve_start;
-+ unsigned long init_reserve_size;
-+ /* cmd line options during boot */
-+ unsigned long reserve_bootvar;
-+ unsigned long phyp_dump_at_boot;
-+ /* Check status during boot if dump supported, active & present*/
-+ unsigned long phyp_dump_configured;
-+ unsigned long phyp_dump_is_active;
-+ /* store cpu & hpte size */
-+ unsigned long cpu_state_size;
-+ unsigned long hpte_region_size;
-+ /* previous scratch area values */
-+ unsigned long reserved_scratch_addr;
-+ unsigned long reserved_scratch_size;
-+};
-+
-+extern struct phyp_dump *phyp_dump_info;
-+
-+int early_init_dt_scan_phyp_dump(unsigned long node,
-+ const char *uname, int depth, void *data);
-+
-+#endif /* CONFIG_PHYP_DUMP */
-+#endif /* _PPC64_PHYP_DUMP_H */
---- a/include/asm-powerpc/pmi.h
-+++ b/include/asm-powerpc/pmi.h
-@@ -29,8 +29,6 @@
-
- #ifdef __KERNEL__
-
--#include <asm/of_device.h>
--
- #define PMI_TYPE_FREQ_CHANGE 0x01
- #define PMI_READ_TYPE 0
- #define PMI_READ_DATA0 1
---- /dev/null
-+++ b/include/asm-powerpc/ppc4xx.h
-@@ -0,0 +1,18 @@
-+/*
-+ * PPC4xx Prototypes and definitions
-+ *
-+ * Copyright 2008 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * This 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_POWERPC_PPC4xx_H__
-+#define __ASM_POWERPC_PPC4xx_H__
-+
-+extern void ppc4xx_reset_system(char *cmd);
-+
-+#endif /* __ASM_POWERPC_PPC4xx_H__ */
---- a/include/asm-powerpc/ps3.h
-+++ b/include/asm-powerpc/ps3.h
-@@ -434,8 +434,11 @@ struct ps3_sys_manager_ops {
- };
-
- void ps3_sys_manager_register_ops(const struct ps3_sys_manager_ops *ops);
--void ps3_sys_manager_power_off(void);
--void ps3_sys_manager_restart(void);
-+void __noreturn ps3_sys_manager_power_off(void);
-+void __noreturn ps3_sys_manager_restart(void);
-+void __noreturn ps3_sys_manager_halt(void);
-+int ps3_sys_manager_get_wol(void);
-+void ps3_sys_manager_set_wol(int state);
-
- struct ps3_prealloc {
- const char *name;
---- a/include/asm-powerpc/ptrace.h
-+++ b/include/asm-powerpc/ptrace.h
-@@ -58,6 +58,11 @@ struct pt_regs {
- #define __ARCH_WANT_COMPAT_SYS_PTRACE
-
- #define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */
-+#define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */
-+#define STACK_FRAME_REGS_MARKER ASM_CONST(0x7265677368657265)
-+#define STACK_INT_FRAME_SIZE (sizeof(struct pt_regs) + \
-+ STACK_FRAME_OVERHEAD + 288)
-+#define STACK_FRAME_MARKER 12
-
- /* Size of dummy stack frame allocated when calling signal handler. */
- #define __SIGNAL_FRAMESIZE 128
-@@ -66,6 +71,10 @@ struct pt_regs {
- #else /* __powerpc64__ */
-
- #define STACK_FRAME_OVERHEAD 16 /* size of minimum stack frame */
-+#define STACK_FRAME_LR_SAVE 1 /* Location of LR in stack frame */
-+#define STACK_FRAME_REGS_MARKER ASM_CONST(0x72656773)
-+#define STACK_INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD)
-+#define STACK_FRAME_MARKER 2
-
- /* Size of stack frame allocated when calling signal handler. */
- #define __SIGNAL_FRAMESIZE 64
---- a/include/asm-powerpc/qe.h
-+++ b/include/asm-powerpc/qe.h
-@@ -85,6 +85,7 @@ extern int par_io_data_set(u8 port, u8 p
- /* QE internal API */
- int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input);
- enum qe_clock qe_clock_source(const char *source);
-+unsigned int qe_get_brg_clk(void);
- int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier);
- int qe_get_snum(void);
- void qe_put_snum(u8 snum);
-@@ -92,7 +93,16 @@ unsigned long qe_muram_alloc(int size, i
- int qe_muram_free(unsigned long offset);
- unsigned long qe_muram_alloc_fixed(unsigned long offset, int size);
- void qe_muram_dump(void);
--void *qe_muram_addr(unsigned long offset);
-+
-+static inline void __iomem *qe_muram_addr(unsigned long offset)
-+{
-+ return (void __iomem *)&qe_immr->muram[offset];
-+}
-+
-+static inline unsigned long qe_muram_offset(void __iomem *addr)
-+{
-+ return addr - (void __iomem *)qe_immr->muram;
-+}
-
- /* Structure that defines QE firmware binary files.
- *
---- a/include/asm-powerpc/rwsem.h
-+++ b/include/asm-powerpc/rwsem.h
-@@ -32,11 +32,20 @@ struct rw_semaphore {
- #define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
- spinlock_t wait_lock;
- struct list_head wait_list;
-+#ifdef CONFIG_DEBUG_LOCK_ALLOC
-+ struct lockdep_map dep_map;
-+#endif
- };
-
-+#ifdef CONFIG_DEBUG_LOCK_ALLOC
-+# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
-+#else
-+# define __RWSEM_DEP_MAP_INIT(lockname)
-+#endif
-+
- #define __RWSEM_INITIALIZER(name) \
-- { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \
-- LIST_HEAD_INIT((name).wait_list) }
-+ { RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED((name).wait_lock), \
-+ LIST_HEAD_INIT((name).wait_list) __RWSEM_DEP_MAP_INIT(name) }
-
- #define DECLARE_RWSEM(name) \
- struct rw_semaphore name = __RWSEM_INITIALIZER(name)
-@@ -46,12 +55,15 @@ extern struct rw_semaphore *rwsem_down_w
- extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem);
- extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
-
--static inline void init_rwsem(struct rw_semaphore *sem)
--{
-- sem->count = RWSEM_UNLOCKED_VALUE;
-- spin_lock_init(&sem->wait_lock);
-- INIT_LIST_HEAD(&sem->wait_list);
--}
-+extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
-+ struct lock_class_key *key);
-+
-+#define init_rwsem(sem) \
-+ do { \
-+ static struct lock_class_key __key; \
-+ \
-+ __init_rwsem((sem), #sem, &__key); \
-+ } while (0)
-
- /*
- * lock for reading
-@@ -78,7 +90,7 @@ static inline int __down_read_trylock(st
- /*
- * lock for writing
- */
--static inline void __down_write(struct rw_semaphore *sem)
-+static inline void __down_write_nested(struct rw_semaphore *sem, int subclass)
- {
- int tmp;
-
-@@ -88,6 +100,11 @@ static inline void __down_write(struct r
- rwsem_down_write_failed(sem);
- }
-
-+static inline void __down_write(struct rw_semaphore *sem)
-+{
-+ __down_write_nested(sem, 0);
-+}
-+
- static inline int __down_write_trylock(struct rw_semaphore *sem)
- {
- int tmp;
---- a/include/asm-powerpc/sparsemem.h
-+++ b/include/asm-powerpc/sparsemem.h
-@@ -15,6 +15,7 @@
-
- #ifdef CONFIG_MEMORY_HOTPLUG
- extern void create_section_mapping(unsigned long start, unsigned long end);
-+extern int remove_section_mapping(unsigned long start, unsigned long end);
- #ifdef CONFIG_NUMA
- extern int hot_add_scn_to_nid(unsigned long scn_addr);
- #else
---- a/include/asm-powerpc/spinlock.h
-+++ b/include/asm-powerpc/spinlock.h
-@@ -19,6 +19,7 @@
- *
- * (the type definitions are in asm/spinlock_types.h)
- */
-+#include <linux/irqflags.h>
- #ifdef CONFIG_PPC64
- #include <asm/paca.h>
- #include <asm/hvcall.h>
---- a/include/asm-powerpc/string.h
-+++ b/include/asm-powerpc/string.h
-@@ -7,6 +7,7 @@
- #define __HAVE_ARCH_STRNCPY
- #define __HAVE_ARCH_STRLEN
- #define __HAVE_ARCH_STRCMP
-+#define __HAVE_ARCH_STRNCMP
- #define __HAVE_ARCH_STRCAT
- #define __HAVE_ARCH_MEMSET
- #define __HAVE_ARCH_MEMCPY
-@@ -18,6 +19,7 @@ extern char * strcpy(char *,const char *
- extern char * strncpy(char *,const char *, __kernel_size_t);
- extern __kernel_size_t strlen(const char *);
- extern int strcmp(const char *,const char *);
-+extern int strncmp(const char *, const char *, __kernel_size_t);
- extern char * strcat(char *, const char *);
- extern void * memset(void *,int,__kernel_size_t);
- extern void * memcpy(void *,const void *,__kernel_size_t);
---- a/include/asm-powerpc/types.h
-+++ b/include/asm-powerpc/types.h
-@@ -84,6 +84,13 @@ typedef unsigned long long u64;
-
- typedef __vector128 vector128;
-
-+/* Physical address used by some IO functions */
-+#if defined(CONFIG_PPC64) || defined(CONFIG_PHYS_64BIT)
-+typedef u64 phys_addr_t;
-+#else
-+typedef u32 phys_addr_t;
-+#endif
-+
- #ifdef __powerpc64__
- typedef u64 dma_addr_t;
- #else
---- /dev/null
-+++ b/include/asm-sparc64/lmb.h
-@@ -0,0 +1,10 @@
-+#ifndef _SPARC64_LMB_H
-+#define _SPARC64_LMB_H
-+
-+#include <asm/oplib.h>
-+
-+#define LMB_DBG(fmt...) prom_printf(fmt)
-+
-+#define LMB_REAL_LIMIT 0
-+
-+#endif /* !(_SPARC64_LMB_H) */
---- /dev/null
-+++ b/include/linux/lmb.h
-@@ -0,0 +1,85 @@
-+#ifndef _LINUX_LMB_H
-+#define _LINUX_LMB_H
-+#ifdef __KERNEL__
-+
-+/*
-+ * Logical memory blocks.
-+ *
-+ * Copyright (C) 2001 Peter Bergner, IBM Corp.
-+ *
-+ * 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/mm.h>
-+
-+#define MAX_LMB_REGIONS 128
-+
-+struct lmb_property {
-+ u64 base;
-+ u64 size;
-+};
-+
-+struct lmb_region {
-+ unsigned long cnt;
-+ u64 size;
-+ struct lmb_property region[MAX_LMB_REGIONS+1];
-+};
-+
-+struct lmb {
-+ unsigned long debug;
-+ u64 rmo_size;
-+ struct lmb_region memory;
-+ struct lmb_region reserved;
-+};
-+
-+extern struct lmb lmb;
-+
-+extern void __init lmb_init(void);
-+extern void __init lmb_analyze(void);
-+extern long __init lmb_add(u64 base, u64 size);
-+extern long __init lmb_reserve(u64 base, u64 size);
-+extern u64 __init lmb_alloc_nid(u64 size, u64 align, int nid,
-+ u64 (*nid_range)(u64, u64, int *));
-+extern u64 __init lmb_alloc(u64 size, u64 align);
-+extern u64 __init lmb_alloc_base(u64 size,
-+ u64, u64 max_addr);
-+extern u64 __init __lmb_alloc_base(u64 size,
-+ u64 align, u64 max_addr);
-+extern u64 __init lmb_phys_mem_size(void);
-+extern u64 __init lmb_end_of_DRAM(void);
-+extern void __init lmb_enforce_memory_limit(u64 memory_limit);
-+extern int __init lmb_is_reserved(u64 addr);
-+
-+extern void lmb_dump_all(void);
-+
-+static inline u64
-+lmb_size_bytes(struct lmb_region *type, unsigned long region_nr)
-+{
-+ return type->region[region_nr].size;
-+}
-+static inline u64
-+lmb_size_pages(struct lmb_region *type, unsigned long region_nr)
-+{
-+ return lmb_size_bytes(type, region_nr) >> PAGE_SHIFT;
-+}
-+static inline u64
-+lmb_start_pfn(struct lmb_region *type, unsigned long region_nr)
-+{
-+ return type->region[region_nr].base >> PAGE_SHIFT;
-+}
-+static inline u64
-+lmb_end_pfn(struct lmb_region *type, unsigned long region_nr)
-+{
-+ return lmb_start_pfn(type, region_nr) +
-+ lmb_size_pages(type, region_nr);
-+}
-+
-+#include <asm/lmb.h>
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _LINUX_LMB_H */
---- a/include/linux/of.h
-+++ b/include/linux/of.h
-@@ -62,6 +62,7 @@ extern struct property *of_find_property
- int *lenp);
- extern int of_device_is_compatible(const struct device_node *device,
- const char *);
-+extern int of_device_is_available(const struct device_node *device);
- extern const void *of_get_property(const struct device_node *node,
- const char *name,
- int *lenp);
---- /dev/null
-+++ b/include/linux/of_gpio.h
-@@ -0,0 +1,69 @@
-+/*
-+ * OF helpers for the GPIO API
-+ *
-+ * Copyright (c) 2007-2008 MontaVista Software, Inc.
-+ *
-+ * Author: Anton Vorontsov <avorontsov@ru.mvista.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.
-+ */
-+
-+#ifndef __LINUX_OF_GPIO_H
-+#define __LINUX_OF_GPIO_H
-+
-+#include <linux/errno.h>
-+#include <asm/gpio.h>
-+
-+#ifdef CONFIG_OF_GPIO
-+
-+/*
-+ * Generic OF GPIO chip
-+ */
-+struct of_gpio_chip {
-+ struct gpio_chip gc;
-+ int gpio_cells;
-+ int (*xlate)(struct of_gpio_chip *of_gc, struct device_node *np,
-+ const void *gpio_spec);
-+};
-+
-+static inline struct of_gpio_chip *to_of_gpio_chip(struct gpio_chip *gc)
-+{
-+ return container_of(gc, struct of_gpio_chip, gc);
-+}
-+
-+/*
-+ * OF GPIO chip for memory mapped banks
-+ */
-+struct of_mm_gpio_chip {
-+ struct of_gpio_chip of_gc;
-+ void (*save_regs)(struct of_mm_gpio_chip *mm_gc);
-+ void __iomem *regs;
-+};
-+
-+static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc)
-+{
-+ struct of_gpio_chip *of_gc = to_of_gpio_chip(gc);
-+
-+ return container_of(of_gc, struct of_mm_gpio_chip, of_gc);
-+}
-+
-+extern int of_get_gpio(struct device_node *np, int index);
-+extern int of_mm_gpiochip_add(struct device_node *np,
-+ struct of_mm_gpio_chip *mm_gc);
-+extern int of_gpio_simple_xlate(struct of_gpio_chip *of_gc,
-+ struct device_node *np,
-+ const void *gpio_spec);
-+#else
-+
-+/* Drivers may not strictly depend on the GPIO support, so let them link. */
-+static inline int of_get_gpio(struct device_node *np, int index)
-+{
-+ return -ENOSYS;
-+}
-+
-+#endif /* CONFIG_OF_GPIO */
-+
-+#endif /* __LINUX_OF_GPIO_H */
---- /dev/null
-+++ b/include/linux/of_i2c.h
-@@ -0,0 +1,24 @@
-+/*
-+ * Generic I2C API implementation for PowerPC.
-+ *
-+ * Copyright (c) 2008 Jochen Friedrich <jochen@scram.de>
-+ *
-+ * 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_OF_I2C_H
-+#define __LINUX_OF_I2C_H
-+
-+#include <linux/i2c.h>
-+
-+#ifdef CONFIG_OF_I2C
-+
-+void of_register_i2c_devices(struct i2c_adapter *adap,
-+ struct device_node *adap_node);
-+
-+#endif /* CONFIG_OF_I2C */
-+
-+#endif /* __LINUX_OF_I2C_H */
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -141,4 +141,7 @@ config HAS_DMA
- config CHECK_SIGNATURE
- bool
-
-+config HAVE_LMB
-+ boolean
-+
- endmenu
---- a/lib/Makefile
-+++ b/lib/Makefile
-@@ -70,6 +70,8 @@ obj-$(CONFIG_FAULT_INJECTION) += fault-i
-
- lib-$(CONFIG_GENERIC_BUG) += bug.o
-
-+obj-$(CONFIG_HAVE_LMB) += lmb.o
-+
- hostprogs-y := gen_crc32table
- clean-files := crc32table.h
-
---- /dev/null
-+++ b/lib/lmb.c
-@@ -0,0 +1,428 @@
-+/*
-+ * Procedures for maintaining information about logical memory blocks.
-+ *
-+ * Peter Bergner, IBM Corp. June 2001.
-+ * Copyright (C) 2001 Peter Bergner.
-+ *
-+ * 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/bitops.h>
-+#include <linux/lmb.h>
-+
-+#define LMB_ALLOC_ANYWHERE 0
-+
-+struct lmb lmb;
-+
-+void lmb_dump_all(void)
-+{
-+#ifdef DEBUG
-+ unsigned long i;
-+
-+ pr_debug("lmb_dump_all:\n");
-+ pr_debug(" memory.cnt = 0x%lx\n", lmb.memory.cnt);
-+ pr_debug(" memory.size = 0x%llx\n",
-+ (unsigned long long)lmb.memory.size);
-+ for (i=0; i < lmb.memory.cnt ;i++) {
-+ pr_debug(" memory.region[0x%x].base = 0x%llx\n",
-+ i, (unsigned long long)lmb.memory.region[i].base);
-+ pr_debug(" .size = 0x%llx\n",
-+ (unsigned long long)lmb.memory.region[i].size);
-+ }
-+
-+ pr_debug(" reserved.cnt = 0x%lx\n", lmb.reserved.cnt);
-+ pr_debug(" reserved.size = 0x%lx\n", lmb.reserved.size);
-+ for (i=0; i < lmb.reserved.cnt ;i++) {
-+ pr_debug(" reserved.region[0x%x].base = 0x%llx\n",
-+ i, (unsigned long long)lmb.reserved.region[i].base);
-+ pr_debug(" .size = 0x%llx\n",
-+ (unsigned long long)lmb.reserved.region[i].size);
-+ }
-+#endif /* DEBUG */
-+}
-+
-+static unsigned long __init lmb_addrs_overlap(u64 base1, u64 size1,
-+ u64 base2, u64 size2)
-+{
-+ return ((base1 < (base2 + size2)) && (base2 < (base1 + size1)));
-+}
-+
-+static long __init lmb_addrs_adjacent(u64 base1, u64 size1,
-+ u64 base2, u64 size2)
-+{
-+ if (base2 == base1 + size1)
-+ return 1;
-+ else if (base1 == base2 + size2)
-+ return -1;
-+
-+ return 0;
-+}
-+
-+static long __init lmb_regions_adjacent(struct lmb_region *rgn,
-+ unsigned long r1, unsigned long r2)
-+{
-+ u64 base1 = rgn->region[r1].base;
-+ u64 size1 = rgn->region[r1].size;
-+ u64 base2 = rgn->region[r2].base;
-+ u64 size2 = rgn->region[r2].size;
-+
-+ return lmb_addrs_adjacent(base1, size1, base2, size2);
-+}
-+
-+static void __init lmb_remove_region(struct lmb_region *rgn, unsigned long r)
-+{
-+ unsigned long i;
-+
-+ for (i = r; i < rgn->cnt - 1; i++) {
-+ rgn->region[i].base = rgn->region[i + 1].base;
-+ rgn->region[i].size = rgn->region[i + 1].size;
-+ }
-+ rgn->cnt--;
-+}
-+
-+/* Assumption: base addr of region 1 < base addr of region 2 */
-+static void __init lmb_coalesce_regions(struct lmb_region *rgn,
-+ unsigned long r1, unsigned long r2)
-+{
-+ rgn->region[r1].size += rgn->region[r2].size;
-+ lmb_remove_region(rgn, r2);
-+}
-+
-+void __init lmb_init(void)
-+{
-+ /* Create a dummy zero size LMB which will get coalesced away later.
-+ * This simplifies the lmb_add() code below...
-+ */
-+ lmb.memory.region[0].base = 0;
-+ lmb.memory.region[0].size = 0;
-+ lmb.memory.cnt = 1;
-+
-+ /* Ditto. */
-+ lmb.reserved.region[0].base = 0;
-+ lmb.reserved.region[0].size = 0;
-+ lmb.reserved.cnt = 1;
-+}
-+
-+void __init lmb_analyze(void)
-+{
-+ int i;
-+
-+ lmb.memory.size = 0;
-+
-+ for (i = 0; i < lmb.memory.cnt; i++)
-+ lmb.memory.size += lmb.memory.region[i].size;
-+}
-+
-+static long __init lmb_add_region(struct lmb_region *rgn, u64 base, u64 size)
-+{
-+ unsigned long coalesced = 0;
-+ long adjacent, i;
-+
-+ if ((rgn->cnt == 1) && (rgn->region[0].size == 0)) {
-+ rgn->region[0].base = base;
-+ rgn->region[0].size = size;
-+ return 0;
-+ }
-+
-+ /* First try and coalesce this LMB with another. */
-+ for (i = 0; i < rgn->cnt; i++) {
-+ u64 rgnbase = rgn->region[i].base;
-+ u64 rgnsize = rgn->region[i].size;
-+
-+ if ((rgnbase == base) && (rgnsize == size))
-+ /* Already have this region, so we're done */
-+ return 0;
-+
-+ adjacent = lmb_addrs_adjacent(base, size, rgnbase, rgnsize);
-+ if (adjacent > 0) {
-+ rgn->region[i].base -= size;
-+ rgn->region[i].size += size;
-+ coalesced++;
-+ break;
-+ } else if (adjacent < 0) {
-+ rgn->region[i].size += size;
-+ coalesced++;
-+ break;
-+ }
-+ }
-+
-+ if ((i < rgn->cnt - 1) && lmb_regions_adjacent(rgn, i, i+1)) {
-+ lmb_coalesce_regions(rgn, i, i+1);
-+ coalesced++;
-+ }
-+
-+ if (coalesced)
-+ return coalesced;
-+ if (rgn->cnt >= MAX_LMB_REGIONS)
-+ return -1;
-+
-+ /* Couldn't coalesce the LMB, so add it to the sorted table. */
-+ for (i = rgn->cnt - 1; i >= 0; i--) {
-+ if (base < rgn->region[i].base) {
-+ rgn->region[i+1].base = rgn->region[i].base;
-+ rgn->region[i+1].size = rgn->region[i].size;
-+ } else {
-+ rgn->region[i+1].base = base;
-+ rgn->region[i+1].size = size;
-+ break;
-+ }
-+ }
-+
-+ if (base < rgn->region[0].base) {
-+ rgn->region[0].base = base;
-+ rgn->region[0].size = size;
-+ }
-+ rgn->cnt++;
-+
-+ return 0;
-+}
-+
-+long __init lmb_add(u64 base, u64 size)
-+{
-+ struct lmb_region *_rgn = &lmb.memory;
-+
-+ /* On pSeries LPAR systems, the first LMB is our RMO region. */
-+ if (base == 0)
-+ lmb.rmo_size = size;
-+
-+ return lmb_add_region(_rgn, base, size);
-+
-+}
-+
-+long __init lmb_reserve(u64 base, u64 size)
-+{
-+ struct lmb_region *_rgn = &lmb.reserved;
-+
-+ BUG_ON(0 == size);
-+
-+ return lmb_add_region(_rgn, base, size);
-+}
-+
-+long __init lmb_overlaps_region(struct lmb_region *rgn, u64 base, u64 size)
-+{
-+ unsigned long i;
-+
-+ for (i = 0; i < rgn->cnt; i++) {
-+ u64 rgnbase = rgn->region[i].base;
-+ u64 rgnsize = rgn->region[i].size;
-+ if (lmb_addrs_overlap(base, size, rgnbase, rgnsize))
-+ break;
-+ }
-+
-+ return (i < rgn->cnt) ? i : -1;
-+}
-+
-+static u64 lmb_align_down(u64 addr, u64 size)
-+{
-+ return addr & ~(size - 1);
-+}
-+
-+static u64 lmb_align_up(u64 addr, u64 size)
-+{
-+ return (addr + (size - 1)) & ~(size - 1);
-+}
-+
-+static u64 __init lmb_alloc_nid_unreserved(u64 start, u64 end,
-+ u64 size, u64 align)
-+{
-+ u64 base, res_base;
-+ long j;
-+
-+ base = lmb_align_down((end - size), align);
-+ while (start <= base) {
-+ j = lmb_overlaps_region(&lmb.reserved, base, size);
-+ if (j < 0) {
-+ /* this area isn't reserved, take it */
-+ if (lmb_add_region(&lmb.reserved, base,
-+ lmb_align_up(size, align)) < 0)
-+ base = ~(u64)0;
-+ return base;
-+ }
-+ res_base = lmb.reserved.region[j].base;
-+ if (res_base < size)
-+ break;
-+ base = lmb_align_down(res_base - size, align);
-+ }
-+
-+ return ~(u64)0;
-+}
-+
-+static u64 __init lmb_alloc_nid_region(struct lmb_property *mp,
-+ u64 (*nid_range)(u64, u64, int *),
-+ u64 size, u64 align, int nid)
-+{
-+ u64 start, end;
-+
-+ start = mp->base;
-+ end = start + mp->size;
-+
-+ start = lmb_align_up(start, align);
-+ while (start < end) {
-+ u64 this_end;
-+ int this_nid;
-+
-+ this_end = nid_range(start, end, &this_nid);
-+ if (this_nid == nid) {
-+ u64 ret = lmb_alloc_nid_unreserved(start, this_end,
-+ size, align);
-+ if (ret != ~(u64)0)
-+ return ret;
-+ }
-+ start = this_end;
-+ }
-+
-+ return ~(u64)0;
-+}
-+
-+u64 __init lmb_alloc_nid(u64 size, u64 align, int nid,
-+ u64 (*nid_range)(u64 start, u64 end, int *nid))
-+{
-+ struct lmb_region *mem = &lmb.memory;
-+ int i;
-+
-+ for (i = 0; i < mem->cnt; i++) {
-+ u64 ret = lmb_alloc_nid_region(&mem->region[i],
-+ nid_range,
-+ size, align, nid);
-+ if (ret != ~(u64)0)
-+ return ret;
-+ }
-+
-+ return lmb_alloc(size, align);
-+}
-+
-+u64 __init lmb_alloc(u64 size, u64 align)
-+{
-+ return lmb_alloc_base(size, align, LMB_ALLOC_ANYWHERE);
-+}
-+
-+u64 __init lmb_alloc_base(u64 size, u64 align, u64 max_addr)
-+{
-+ u64 alloc;
-+
-+ alloc = __lmb_alloc_base(size, align, max_addr);
-+
-+ if (alloc == 0)
-+ panic("ERROR: Failed to allocate 0x%llx bytes below 0x%llx.\n",
-+ (unsigned long long) size, (unsigned long long) max_addr);
-+
-+ return alloc;
-+}
-+
-+u64 __init __lmb_alloc_base(u64 size, u64 align, u64 max_addr)
-+{
-+ long i, j;
-+ u64 base = 0;
-+ u64 res_base;
-+
-+ BUG_ON(0 == size);
-+
-+ /* On some platforms, make sure we allocate lowmem */
-+ /* Note that LMB_REAL_LIMIT may be LMB_ALLOC_ANYWHERE */
-+ if (max_addr == LMB_ALLOC_ANYWHERE)
-+ max_addr = LMB_REAL_LIMIT;
-+
-+ for (i = lmb.memory.cnt - 1; i >= 0; i--) {
-+ u64 lmbbase = lmb.memory.region[i].base;
-+ u64 lmbsize = lmb.memory.region[i].size;
-+
-+ if (lmbsize < size)
-+ continue;
-+ if (max_addr == LMB_ALLOC_ANYWHERE)
-+ base = lmb_align_down(lmbbase + lmbsize - size, align);
-+ else if (lmbbase < max_addr) {
-+ base = min(lmbbase + lmbsize, max_addr);
-+ base = lmb_align_down(base - size, align);
-+ } else
-+ continue;
-+
-+ while (base && lmbbase <= base) {
-+ j = lmb_overlaps_region(&lmb.reserved, base, size);
-+ if (j < 0) {
-+ /* this area isn't reserved, take it */
-+ if (lmb_add_region(&lmb.reserved, base,
-+ size) < 0)
-+ return 0;
-+ return base;
-+ }
-+ res_base = lmb.reserved.region[j].base;
-+ if (res_base < size)
-+ break;
-+ base = lmb_align_down(res_base - size, align);
-+ }
-+ }
-+ return 0;
-+}
-+
-+/* You must call lmb_analyze() before this. */
-+u64 __init lmb_phys_mem_size(void)
-+{
-+ return lmb.memory.size;
-+}
-+
-+u64 __init lmb_end_of_DRAM(void)
-+{
-+ int idx = lmb.memory.cnt - 1;
-+
-+ return (lmb.memory.region[idx].base + lmb.memory.region[idx].size);
-+}
-+
-+/* You must call lmb_analyze() after this. */
-+void __init lmb_enforce_memory_limit(u64 memory_limit)
-+{
-+ unsigned long i;
-+ u64 limit;
-+ struct lmb_property *p;
-+
-+ if (!memory_limit)
-+ return;
-+
-+ /* Truncate the lmb regions to satisfy the memory limit. */
-+ limit = memory_limit;
-+ for (i = 0; i < lmb.memory.cnt; i++) {
-+ if (limit > lmb.memory.region[i].size) {
-+ limit -= lmb.memory.region[i].size;
-+ continue;
-+ }
-+
-+ lmb.memory.region[i].size = limit;
-+ lmb.memory.cnt = i + 1;
-+ break;
-+ }
-+
-+ if (lmb.memory.region[0].size < lmb.rmo_size)
-+ lmb.rmo_size = lmb.memory.region[0].size;
-+
-+ /* And truncate any reserves above the limit also. */
-+ for (i = 0; i < lmb.reserved.cnt; i++) {
-+ p = &lmb.reserved.region[i];
-+
-+ if (p->base > memory_limit)
-+ p->size = 0;
-+ else if ((p->base + p->size) > memory_limit)
-+ p->size = memory_limit - p->base;
-+
-+ if (p->size == 0) {
-+ lmb_remove_region(&lmb.reserved, i);
-+ i--;
-+ }
-+ }
-+}
-+
-+int __init lmb_is_reserved(u64 addr)
-+{
-+ int i;
-+
-+ for (i = 0; i < lmb.reserved.cnt; i++) {
-+ u64 upper = lmb.reserved.region[i].base +
-+ lmb.reserved.region[i].size - 1;
-+ if ((addr >= lmb.reserved.region[i].base) && (addr <= upper))
-+ return 1;
-+ }
-+ return 0;
-+}
+++ /dev/null
---- a/drivers/usb/serial/usb-serial.c
-+++ b/drivers/usb/serial/usb-serial.c
-@@ -58,6 +58,7 @@ static struct usb_driver usb_serial_driv
- drivers depend on it.
- */
-
-+static ushort maxSize = 0;
- static int debug;
- static struct usb_serial *serial_table[SERIAL_TTY_MINORS]; /* initially all NULL */
- static DEFINE_MUTEX(table_lock);
-@@ -903,7 +904,7 @@ int usb_serial_probe(struct usb_interfac
- dev_err(&interface->dev, "No free urbs available\n");
- goto probe_error;
- }
-- buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
-+ buffer_size = (endpoint->wMaxPacketSize > maxSize) ? endpoint->wMaxPacketSize : maxSize;
- port->bulk_in_size = buffer_size;
- port->bulk_in_endpointAddress = endpoint->bEndpointAddress;
- port->bulk_in_buffer = kmalloc (buffer_size, GFP_KERNEL);
-@@ -1315,3 +1316,5 @@ MODULE_LICENSE("GPL");
-
- module_param(debug, bool, S_IRUGO | S_IWUSR);
- MODULE_PARM_DESC(debug, "Debug enabled or not");
-+module_param(maxSize, ushort,0);
-+MODULE_PARM_DESC(maxSize,"User specified USB endpoint size");
+++ /dev/null
---- a/init/main.c
-+++ b/init/main.c
-@@ -775,7 +775,7 @@ static int noinline init_post(void)
- numa_default_policy();
-
- if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
-- printk(KERN_WARNING "Warning: unable to open an initial console.\n");
-+ printk(KERN_WARNING "Please be patient, while OpenWrt loads ...\n");
-
- (void) sys_dup(0);
- (void) sys_dup(0);
+++ /dev/null
---- a/fs/jffs2/erase.c
-+++ b/fs/jffs2/erase.c
-@@ -35,6 +35,8 @@ static void jffs2_erase_block(struct jff
- {
- int ret;
- uint32_t bad_offset;
-+ static char s[]="|/-\\", *p=s;
-+
- #ifdef __ECOS
- ret = jffs2_flash_erase(c, jeb);
- if (!ret) {
-@@ -47,6 +49,11 @@ static void jffs2_erase_block(struct jff
-
- D1(printk(KERN_DEBUG "jffs2_erase_block(): erase block %#08x (range %#08x-%#08x)\n",
- jeb->offset, jeb->offset, jeb->offset + c->sector_size));
-+
-+ printk("%c\b", *p);
-+ if (*++p==0)
-+ p=s;
-+
- instr = kmalloc(sizeof(struct erase_info) + sizeof(struct erase_priv_struct), GFP_KERNEL);
- if (!instr) {
- printk(KERN_WARNING "kmalloc for struct erase_info in jffs2_erase_block failed. Refiling block for later\n");
+++ /dev/null
---- a/include/linux/time.h
-+++ b/include/linux/time.h
-@@ -1,6 +1,10 @@
- #ifndef _LINUX_TIME_H
- #define _LINUX_TIME_H
-
-+#ifndef __KERNEL__
-+#include <time.h>
-+#else
-+
- #include <linux/types.h>
-
- #ifdef __KERNEL__
-@@ -232,4 +236,6 @@ struct itimerval {
- */
- #define TIMER_ABSTIME 0x01
-
-+#endif /* __KERNEL__ DEBIAN */
-+
- #endif
---- a/include/linux/types.h
-+++ b/include/linux/types.h
-@@ -1,6 +1,14 @@
- #ifndef _LINUX_TYPES_H
- #define _LINUX_TYPES_H
-
-+/* Debian: Use userland types instead. */
-+#ifndef __KERNEL__
-+# include <sys/types.h>
-+/* For other kernel headers. */
-+# include <linux/posix_types.h>
-+# include <asm/types.h>
-+#else
-+
- #ifdef __KERNEL__
-
- #define DECLARE_BITMAP(name,bits) \
-@@ -161,6 +169,8 @@ typedef unsigned long blkcnt_t;
-
- #endif /* __KERNEL_STRICT_NAMES */
-
-+#endif /* __KERNEL__ DEBIAN */
-+
- /*
- * Below are truly Linux-specific types that should never collide with
- * any application/library that wants linux/types.h.
+++ /dev/null
---- a/scripts/genksyms/parse.c_shipped
-+++ b/scripts/genksyms/parse.c_shipped
-@@ -160,7 +160,9 @@
-
-
- #include <assert.h>
-+#ifndef __APPLE__
- #include <malloc.h>
-+#endif
- #include "genksyms.h"
-
- static int is_typedef;
---- a/scripts/genksyms/parse.y
-+++ b/scripts/genksyms/parse.y
-@@ -24,7 +24,9 @@
- %{
-
- #include <assert.h>
-+#ifndef __APPLE__
- #include <malloc.h>
-+#endif
- #include "genksyms.h"
-
- static int is_typedef;
---- a/scripts/kallsyms.c
-+++ b/scripts/kallsyms.c
-@@ -28,6 +28,35 @@
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
-+#ifdef __APPLE__
-+/* Darwin has no memmem implementation, this one is ripped of the uClibc-0.9.28 source */
-+void *memmem (const void *haystack, size_t haystack_len,
-+ const void *needle, size_t needle_len)
-+{
-+ const char *begin;
-+ const char *const last_possible
-+ = (const char *) haystack + haystack_len - needle_len;
-+
-+ if (needle_len == 0)
-+ /* The first occurrence of the empty string is deemed to occur at
-+ the beginning of the string. */
-+ return (void *) haystack;
-+
-+ /* Sanity check, otherwise the loop might search through the whole
-+ memory. */
-+ if (__builtin_expect (haystack_len < needle_len, 0))
-+ return NULL;
-+
-+ for (begin = (const char *) haystack; begin <= last_possible; ++begin)
-+ if (begin[0] == ((const char *) needle)[0] &&
-+ !memcmp ((const void *) &begin[1],
-+ (const void *) ((const char *) needle + 1),
-+ needle_len - 1))
-+ return (void *) begin;
-+
-+ return NULL;
-+}
-+#endif
-
- #define KSYM_NAME_LEN 128
-
---- a/scripts/kconfig/Makefile
-+++ b/scripts/kconfig/Makefile
-@@ -93,6 +93,9 @@ check-lxdialog := $(srctree)/$(src)/lxd
- # we really need to do so. (Do not call gcc as part of make mrproper)
- HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
- HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
-+ifeq ($(shell uname -s),Darwin)
-+HOST_LOADLIBES += -lncurses
-+endif
-
- HOST_EXTRACFLAGS += -DLOCALE
-
---- a/scripts/mod/mk_elfconfig.c
-+++ b/scripts/mod/mk_elfconfig.c
-@@ -1,7 +1,11 @@
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-+#ifndef __APPLE__
- #include <elf.h>
-+#else
-+#include "../../../../../tools/sstrip/include/elf.h"
-+#endif
-
- int
- main(int argc, char **argv)
---- a/scripts/mod/modpost.h
-+++ b/scripts/mod/modpost.h
-@@ -7,7 +7,11 @@
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <unistd.h>
-+#if !(defined(__APPLE__) || defined(__CYGWIN__))
- #include <elf.h>
-+#else
-+#include "../../../../../tools/sstrip/include/elf.h"
-+#endif
-
- #include "elfconfig.h"
-
+++ /dev/null
---- a/drivers/net/wireless/hostap/hostap_ap.c
-+++ b/drivers/net/wireless/hostap/hostap_ap.c
-@@ -2397,13 +2397,13 @@ int prism2_ap_get_sta_qual(local_info_t
- addr[count].sa_family = ARPHRD_ETHER;
- memcpy(addr[count].sa_data, sta->addr, ETH_ALEN);
- if (sta->last_rx_silence == 0)
-- qual[count].qual = sta->last_rx_signal < 27 ?
-- 0 : (sta->last_rx_signal - 27) * 92 / 127;
-+ qual[count].qual = (sta->last_rx_signal - 156) == 0 ?
-+ 0 : (sta->last_rx_signal - 156) * 92 / 64;
- else
-- qual[count].qual = sta->last_rx_signal -
-- sta->last_rx_silence - 35;
-- qual[count].level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);
-- qual[count].noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);
-+ qual[count].qual = (sta->last_rx_signal -
-+ sta->last_rx_silence) * 92 / 64;
-+ qual[count].level = sta->last_rx_signal;
-+ qual[count].noise = sta->last_rx_silence;
- qual[count].updated = sta->last_rx_updated;
-
- sta->last_rx_updated = IW_QUAL_DBM;
-@@ -2468,13 +2468,13 @@ int prism2_ap_translate_scan(struct net_
- memset(&iwe, 0, sizeof(iwe));
- iwe.cmd = IWEVQUAL;
- if (sta->last_rx_silence == 0)
-- iwe.u.qual.qual = sta->last_rx_signal < 27 ?
-- 0 : (sta->last_rx_signal - 27) * 92 / 127;
-+ iwe.u.qual.qual = (sta->last_rx_signal -156) == 0 ?
-+ 0 : (sta->last_rx_signal - 156) * 92 / 64;
- else
-- iwe.u.qual.qual = sta->last_rx_signal -
-- sta->last_rx_silence - 35;
-- iwe.u.qual.level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);
-- iwe.u.qual.noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);
-+ iwe.u.qual.qual = (sta->last_rx_signal -
-+ sta->last_rx_silence) * 92 / 64;
-+ iwe.u.qual.level = sta->last_rx_signal;
-+ iwe.u.qual.noise = sta->last_rx_silence;
- iwe.u.qual.updated = sta->last_rx_updated;
- iwe.len = IW_EV_QUAL_LEN;
- current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
---- a/drivers/net/wireless/hostap/hostap_config.h
-+++ b/drivers/net/wireless/hostap/hostap_config.h
-@@ -45,4 +45,9 @@
- */
- /* #define PRISM2_NO_STATION_MODES */
-
-+/* Enable TX power Setting functions
-+ * (min att = -128 , max att = 127)
-+ */
-+#define RAW_TXPOWER_SETTING
-+
- #endif /* HOSTAP_CONFIG_H */
---- a/drivers/net/wireless/hostap/hostap.h
-+++ b/drivers/net/wireless/hostap/hostap.h
-@@ -89,6 +89,7 @@ extern const struct iw_handler_def hosta
- extern const struct ethtool_ops prism2_ethtool_ops;
-
- int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
-+int hostap_restore_power(struct net_device *dev);
-
-
- #endif /* HOSTAP_H */
---- a/drivers/net/wireless/hostap/hostap_hw.c
-+++ b/drivers/net/wireless/hostap/hostap_hw.c
-@@ -933,6 +933,7 @@ static int hfa384x_set_rid(struct net_de
- prism2_hw_reset(dev);
- }
-
-+ hostap_restore_power(dev);
- return res;
- }
-
---- a/drivers/net/wireless/hostap/hostap_info.c
-+++ b/drivers/net/wireless/hostap/hostap_info.c
-@@ -434,6 +434,11 @@ static void handle_info_queue_linkstatus
- }
-
- /* Get BSSID if we have a valid AP address */
-+
-+ if ( val == HFA384X_LINKSTATUS_CONNECTED ||
-+ val == HFA384X_LINKSTATUS_DISCONNECTED )
-+ hostap_restore_power(local->dev);
-+
- if (connected) {
- netif_carrier_on(local->dev);
- netif_carrier_on(local->ddev);
---- a/drivers/net/wireless/hostap/hostap_ioctl.c
-+++ b/drivers/net/wireless/hostap/hostap_ioctl.c
-@@ -1500,23 +1500,20 @@ static int prism2_txpower_hfa386x_to_dBm
- val = 255;
-
- tmp = val;
-- tmp >>= 2;
-
-- return -12 - tmp;
-+ return tmp;
- }
-
- static u16 prism2_txpower_dBm_to_hfa386x(int val)
- {
- signed char tmp;
-
-- if (val > 20)
-- return 128;
-- else if (val < -43)
-+ if (val > 127)
- return 127;
-+ else if (val < -128)
-+ return 128;
-
- tmp = val;
-- tmp = -12 - tmp;
-- tmp <<= 2;
-
- return (unsigned char) tmp;
- }
-@@ -4076,3 +4073,35 @@ int hostap_ioctl(struct net_device *dev,
-
- return ret;
- }
-+
-+/* BUG FIX: Restore power setting value when lost due to F/W bug */
-+
-+int hostap_restore_power(struct net_device *dev)
-+{
-+ struct hostap_interface *iface = dev->priv;
-+ local_info_t *local = iface->local;
-+
-+ u16 val;
-+ int ret = 0;
-+
-+ if (local->txpower_type == PRISM2_TXPOWER_OFF) {
-+ val = 0xff; /* use all standby and sleep modes */
-+ ret = local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
-+ HFA386X_CR_A_D_TEST_MODES2,
-+ &val, NULL);
-+ }
-+
-+#ifdef RAW_TXPOWER_SETTING
-+ if (local->txpower_type == PRISM2_TXPOWER_FIXED) {
-+ val = HFA384X_TEST_CFG_BIT_ALC;
-+ local->func->cmd(dev, HFA384X_CMDCODE_TEST |
-+ (HFA384X_TEST_CFG_BITS << 8), 0, &val, NULL);
-+ val = prism2_txpower_dBm_to_hfa386x(local->txpower);
-+ ret = (local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
-+ HFA386X_CR_MANUAL_TX_POWER, &val, NULL));
-+ }
-+#endif /* RAW_TXPOWER_SETTING */
-+ return (ret ? -EOPNOTSUPP : 0);
-+}
-+
-+EXPORT_SYMBOL(hostap_restore_power);
+++ /dev/null
---- a/include/linux/stddef.h
-+++ b/include/linux/stddef.h
-@@ -16,6 +16,7 @@ enum {
- false = 0,
- true = 1
- };
-+#endif /* __KERNEL__ */
-
- #undef offsetof
- #ifdef __compiler_offsetof
-@@ -23,6 +24,5 @@ enum {
- #else
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
- #endif
--#endif /* __KERNEL__ */
-
- #endif
+++ /dev/null
---- a/scripts/gen_initramfs_list.sh
-+++ b/scripts/gen_initramfs_list.sh
-@@ -125,7 +125,7 @@ parse() {
- str="${ftype} ${name} ${location} ${str}"
- ;;
- "nod")
-- local dev=`LC_ALL=C ls -l "${location}"`
-+ local dev=`LC_ALL=C ls -l --time-style=locale "${location}"`
- local maj=`field 5 ${dev}`
- local min=`field 6 ${dev}`
- maj=${maj%,}
-@@ -135,7 +135,7 @@ parse() {
- str="${ftype} ${name} ${str} ${dev} ${maj} ${min}"
- ;;
- "slink")
-- local target=`field 11 $(LC_ALL=C ls -l "${location}")`
-+ local target=`field 11 $(LC_ALL=C ls -l --time-style=locale "${location}")`
- str="${ftype} ${name} ${target} ${str}"
- ;;
- *)
+++ /dev/null
---- a/arch/x86/boot/tools/build.c
-+++ b/arch/x86/boot/tools/build.c
-@@ -29,7 +29,6 @@
- #include <stdarg.h>
- #include <sys/types.h>
- #include <sys/stat.h>
--#include <sys/sysmacros.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/mman.h>
+++ /dev/null
---- a/include/linux/msdos_fs.h
-+++ b/include/linux/msdos_fs.h
-@@ -57,11 +57,13 @@
- #define MSDOS_DOT ". " /* ".", padded to MSDOS_NAME chars */
- #define MSDOS_DOTDOT ".. " /* "..", padded to MSDOS_NAME chars */
-
-+#ifdef __KERNEL__
- /* media of boot sector */
- static inline int fat_valid_media(u8 media)
- {
- return 0xf8 <= media || media == 0xf0;
- }
-+#endif
-
- #define FAT_FIRST_ENT(s, x) ((MSDOS_SB(s)->fat_bits == 32 ? 0x0FFFFF00 : \
- MSDOS_SB(s)->fat_bits == 16 ? 0xFF00 : 0xF00) | (x))
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -627,12 +627,10 @@ static int __devinit m25p_probe(struct s
- struct mtd_partition *parts = NULL;
- int nr_parts = 0;
-
--#ifdef CONFIG_MTD_CMDLINE_PARTS
-- static const char *part_probes[] = { "cmdlinepart", NULL, };
-+ static const char *part_probes[] = { "RedBoot", "cmdlinepart", NULL, };
-
- nr_parts = parse_mtd_partitions(&flash->mtd,
- part_probes, &parts, 0);
--#endif
-
- if (nr_parts <= 0 && data && data->parts) {
- parts = data->parts;
+++ /dev/null
---- /dev/null
-+++ b/include/linux/spi/spi_gpio.h
-@@ -0,0 +1,72 @@
-+/*
-+ * spi_gpio interface to platform code
-+ *
-+ * Copyright (c) 2008 Piotr Skamruk
-+ *
-+ * This program is free software; you can 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 _LINUX_SPI_SPI_GPIO
-+#define _LINUX_SPI_SPI_GPIO
-+
-+#include <linux/types.h>
-+#include <linux/spi/spi.h>
-+
-+
-+/**
-+ * struct spi_gpio_platform_data - Data definitions for a SPI-GPIO device.
-+ *
-+ * This structure holds information about a GPIO-based SPI device.
-+ *
-+ * @pin_clk: The GPIO pin number of the CLOCK pin.
-+ *
-+ * @pin_miso: The GPIO pin number of the MISO pin.
-+ *
-+ * @pin_mosi: The GPIO pin number of the MOSI pin.
-+ *
-+ * @pin_cs: The GPIO pin number of the CHIPSELECT pin.
-+ *
-+ * @cs_activelow: If true, the chip is selected when the CS line is low.
-+ *
-+ * @no_spi_delay: If true, no delay is done in the lowlevel bitbanging.
-+ * Note that doing no delay is not standards compliant,
-+ * but it might be needed to speed up transfers on some
-+ * slow embedded machines.
-+ *
-+ * @boardinfo_setup: This callback is called after the
-+ * SPI master device was registered, but before the
-+ * device is registered.
-+ * @boardinfo_setup_data: Data argument passed to boardinfo_setup().
-+ */
-+struct spi_gpio_platform_data {
-+ unsigned int pin_clk;
-+ unsigned int pin_miso;
-+ unsigned int pin_mosi;
-+ unsigned int pin_cs;
-+ bool cs_activelow;
-+ bool no_spi_delay;
-+ int (*boardinfo_setup)(struct spi_board_info *bi,
-+ struct spi_master *master,
-+ void *data);
-+ void *boardinfo_setup_data;
-+};
-+
-+/**
-+ * SPI_GPIO_PLATDEV_NAME - The platform device name string.
-+ *
-+ * The name string that has to be used for platform_device_alloc
-+ * when allocating a spi-gpio device.
-+ */
-+#define SPI_GPIO_PLATDEV_NAME "spi-gpio"
-+
-+/**
-+ * spi_gpio_next_id - Get another platform device ID number.
-+ *
-+ * This returns the next platform device ID number that has to be used
-+ * for platform_device_alloc. The ID is opaque and should not be used for
-+ * anything else.
-+ */
-+int spi_gpio_next_id(void);
-+
-+#endif /* _LINUX_SPI_SPI_GPIO */
---- /dev/null
-+++ b/drivers/spi/spi_gpio.c
-@@ -0,0 +1,249 @@
-+/*
-+ * Bitbanging SPI bus driver using GPIO API
-+ *
-+ * Copyright (c) 2008 Piotr Skamruk
-+ *
-+ * based on spi_s3c2410_gpio.c
-+ * Copyright (c) 2006 Ben Dooks
-+ * Copyright (c) 2006 Simtec Electronics
-+ * and on i2c-gpio.c
-+ * Copyright (C) 2007 Atmel Corporation
-+ *
-+ * This program is free software; you can 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/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/spi/spi.h>
-+#include <linux/spi/spi_bitbang.h>
-+#include <linux/spi/spi_gpio.h>
-+#include <linux/gpio.h>
-+#include <asm/atomic.h>
-+
-+
-+struct spi_gpio {
-+ struct spi_bitbang bitbang;
-+ struct spi_gpio_platform_data *info;
-+ struct platform_device *pdev;
-+ struct spi_board_info bi;
-+};
-+
-+
-+static inline struct spi_gpio *spidev_to_sg(struct spi_device *dev)
-+{
-+ return dev->controller_data;
-+}
-+
-+static inline void setsck(struct spi_device *dev, int val)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+ gpio_set_value(sp->info->pin_clk, val ? 1 : 0);
-+}
-+
-+static inline void setmosi(struct spi_device *dev, int val)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+ gpio_set_value(sp->info->pin_mosi, val ? 1 : 0);
-+}
-+
-+static inline u32 getmiso(struct spi_device *dev)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+ return gpio_get_value(sp->info->pin_miso) ? 1 : 0;
-+}
-+
-+static inline void do_spidelay(struct spi_device *dev, unsigned nsecs)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+
-+ if (!sp->info->no_spi_delay)
-+ ndelay(nsecs);
-+}
-+
-+#define spidelay(nsecs) do { \
-+ /* Steal the spi_device pointer from our caller. \
-+ * The bitbang-API should probably get fixed here... */ \
-+ do_spidelay(spi, nsecs); \
-+ } while (0)
-+
-+#define EXPAND_BITBANG_TXRX
-+#include <linux/spi/spi_bitbang.h>
-+
-+static u32 spi_gpio_txrx_mode0(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
-+}
-+
-+static u32 spi_gpio_txrx_mode1(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits);
-+}
-+
-+static u32 spi_gpio_txrx_mode2(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits);
-+}
-+
-+static u32 spi_gpio_txrx_mode3(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits);
-+}
-+
-+static void spi_gpio_chipselect(struct spi_device *dev, int on)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+
-+ if (sp->info->cs_activelow)
-+ on = !on;
-+ gpio_set_value(sp->info->pin_cs, on ? 1 : 0);
-+}
-+
-+static int spi_gpio_probe(struct platform_device *pdev)
-+{
-+ struct spi_master *master;
-+ struct spi_gpio_platform_data *pdata;
-+ struct spi_gpio *sp;
-+ struct spi_device *spidev;
-+ int err;
-+
-+ pdata = pdev->dev.platform_data;
-+ if (!pdata)
-+ return -ENXIO;
-+
-+ err = -ENOMEM;
-+ master = spi_alloc_master(&pdev->dev, sizeof(struct spi_gpio));
-+ if (!master)
-+ goto err_alloc_master;
-+
-+ sp = spi_master_get_devdata(master);
-+ platform_set_drvdata(pdev, sp);
-+ sp->info = pdata;
-+
-+ err = gpio_request(pdata->pin_clk, "spi_clock");
-+ if (err)
-+ goto err_request_clk;
-+ err = gpio_request(pdata->pin_mosi, "spi_mosi");
-+ if (err)
-+ goto err_request_mosi;
-+ err = gpio_request(pdata->pin_miso, "spi_miso");
-+ if (err)
-+ goto err_request_miso;
-+ err = gpio_request(pdata->pin_cs, "spi_cs");
-+ if (err)
-+ goto err_request_cs;
-+
-+ sp->bitbang.master = spi_master_get(master);
-+ sp->bitbang.master->bus_num = -1;
-+ sp->bitbang.master->num_chipselect = 1;
-+ sp->bitbang.chipselect = spi_gpio_chipselect;
-+ sp->bitbang.txrx_word[SPI_MODE_0] = spi_gpio_txrx_mode0;
-+ sp->bitbang.txrx_word[SPI_MODE_1] = spi_gpio_txrx_mode1;
-+ sp->bitbang.txrx_word[SPI_MODE_2] = spi_gpio_txrx_mode2;
-+ sp->bitbang.txrx_word[SPI_MODE_3] = spi_gpio_txrx_mode3;
-+
-+ gpio_direction_output(pdata->pin_clk, 0);
-+ gpio_direction_output(pdata->pin_mosi, 0);
-+ gpio_direction_output(pdata->pin_cs,
-+ pdata->cs_activelow ? 1 : 0);
-+ gpio_direction_input(pdata->pin_miso);
-+
-+ err = spi_bitbang_start(&sp->bitbang);
-+ if (err)
-+ goto err_no_bitbang;
-+ err = pdata->boardinfo_setup(&sp->bi, master,
-+ pdata->boardinfo_setup_data);
-+ if (err)
-+ goto err_bi_setup;
-+ sp->bi.controller_data = sp;
-+ spidev = spi_new_device(master, &sp->bi);
-+ if (!spidev)
-+ goto err_new_dev;
-+
-+ return 0;
-+
-+err_new_dev:
-+err_bi_setup:
-+ spi_bitbang_stop(&sp->bitbang);
-+err_no_bitbang:
-+ spi_master_put(sp->bitbang.master);
-+ gpio_free(pdata->pin_cs);
-+err_request_cs:
-+ gpio_free(pdata->pin_miso);
-+err_request_miso:
-+ gpio_free(pdata->pin_mosi);
-+err_request_mosi:
-+ gpio_free(pdata->pin_clk);
-+err_request_clk:
-+ kfree(master);
-+
-+err_alloc_master:
-+ return err;
-+}
-+
-+static int __devexit spi_gpio_remove(struct platform_device *pdev)
-+{
-+ struct spi_gpio *sp;
-+ struct spi_gpio_platform_data *pdata;
-+
-+ pdata = pdev->dev.platform_data;
-+ sp = platform_get_drvdata(pdev);
-+
-+ gpio_free(pdata->pin_clk);
-+ gpio_free(pdata->pin_mosi);
-+ gpio_free(pdata->pin_miso);
-+ gpio_free(pdata->pin_cs);
-+ spi_bitbang_stop(&sp->bitbang);
-+ spi_master_put(sp->bitbang.master);
-+
-+ return 0;
-+}
-+
-+static struct platform_driver spi_gpio_driver = {
-+ .driver = {
-+ .name = SPI_GPIO_PLATDEV_NAME,
-+ .owner = THIS_MODULE,
-+ },
-+ .probe = spi_gpio_probe,
-+ .remove = __devexit_p(spi_gpio_remove),
-+};
-+
-+int spi_gpio_next_id(void)
-+{
-+ static atomic_t counter = ATOMIC_INIT(-1);
-+
-+ return atomic_inc_return(&counter);
-+}
-+EXPORT_SYMBOL(spi_gpio_next_id);
-+
-+static int __init spi_gpio_init(void)
-+{
-+ int err;
-+
-+ err = platform_driver_register(&spi_gpio_driver);
-+ if (err)
-+ printk(KERN_ERR "spi-gpio: register failed: %d\n", err);
-+
-+ return err;
-+}
-+module_init(spi_gpio_init);
-+
-+static void __exit spi_gpio_exit(void)
-+{
-+ platform_driver_unregister(&spi_gpio_driver);
-+}
-+module_exit(spi_gpio_exit);
-+
-+MODULE_AUTHOR("Piot Skamruk <piotr.skamruk at gmail.com>");
-+MODULE_DESCRIPTION("Platform independent GPIO bitbanging SPI driver");
-+MODULE_LICENSE("GPL v2");
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -100,6 +100,19 @@ config SPI_BUTTERFLY
- inexpensive battery powered microcontroller evaluation board.
- This same cable can be used to flash new firmware.
-
-+config SPI_GPIO
-+ tristate "GPIO API based bitbanging SPI controller"
-+ depends on SPI_MASTER && GENERIC_GPIO
-+ select SPI_BITBANG
-+ help
-+ This is a platform driver that can be used for bitbanging
-+ an SPI bus over GPIO pins.
-+ Select this if you have any SPI device that is connected via
-+ GPIO pins.
-+ The module will be called spi_gpio.
-+
-+ If unsure, say N.
-+
- config SPI_IMX
- tristate "Freescale iMX SPI controller"
- depends on SPI_MASTER && ARCH_IMX && EXPERIMENTAL
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -16,6 +16,7 @@ obj-$(CONFIG_SPI_BFIN) += spi_bfin5xx.
- obj-$(CONFIG_SPI_BITBANG) += spi_bitbang.o
- obj-$(CONFIG_SPI_AU1550) += au1550_spi.o
- obj-$(CONFIG_SPI_BUTTERFLY) += spi_butterfly.o
-+obj-$(CONFIG_SPI_GPIO) += spi_gpio.o
- obj-$(CONFIG_SPI_IMX) += spi_imx.o
- obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o
- obj-$(CONFIG_SPI_PXA2XX) += pxa2xx_spi.o
+++ /dev/null
---- /dev/null
-+++ b/drivers/mmc/host/gpiommc.c
-@@ -0,0 +1,605 @@
-+/*
-+ * Driver an MMC/SD card on a bitbanging GPIO SPI bus.
-+ * This module hooks up the mmc_spi and spi_gpio modules and also
-+ * provides a configfs interface.
-+ *
-+ * Licensed under the GNU/GPL. See COPYING for details.
-+ */
-+
-+#include <linux/mmc/gpiommc.h>
-+#include <linux/platform_device.h>
-+#include <linux/list.h>
-+#include <linux/mutex.h>
-+#include <linux/spi/spi_gpio.h>
-+#include <linux/configfs.h>
-+#include <linux/gpio.h>
-+#include <asm/atomic.h>
-+
-+
-+#define PFX "gpio-mmc: "
-+
-+
-+struct gpiommc_device {
-+ struct platform_device *pdev;
-+ struct platform_device *spi_pdev;
-+ struct spi_board_info boardinfo;
-+};
-+
-+
-+MODULE_DESCRIPTION("GPIO based MMC driver");
-+MODULE_LICENSE("GPL");
-+
-+
-+static int gpiommc_boardinfo_setup(struct spi_board_info *bi,
-+ struct spi_master *master,
-+ void *data)
-+{
-+ struct gpiommc_device *d = data;
-+ struct gpiommc_platform_data *pdata = d->pdev->dev.platform_data;
-+
-+ /* Bind the SPI master to the MMC-SPI host driver. */
-+ strlcpy(bi->modalias, "mmc_spi", sizeof(bi->modalias));
-+
-+ bi->max_speed_hz = pdata->max_bus_speed;
-+ bi->bus_num = master->bus_num;
-+ bi->mode = pdata->mode;
-+
-+ return 0;
-+}
-+
-+static int gpiommc_probe(struct platform_device *pdev)
-+{
-+ struct gpiommc_platform_data *mmc_pdata = pdev->dev.platform_data;
-+ struct spi_gpio_platform_data spi_pdata;
-+ struct gpiommc_device *d;
-+ int err;
-+
-+ err = -ENXIO;
-+ if (!mmc_pdata)
-+ goto error;
-+
-+#ifdef CONFIG_MMC_SPI_MODULE
-+ err = request_module("mmc_spi");
-+ if (err) {
-+ printk(KERN_WARNING PFX
-+ "Failed to request mmc_spi module.\n");
-+ }
-+#endif /* CONFIG_MMC_SPI_MODULE */
-+
-+ /* Allocate the GPIO-MMC device */
-+ err = -ENOMEM;
-+ d = kzalloc(sizeof(*d), GFP_KERNEL);
-+ if (!d)
-+ goto error;
-+ d->pdev = pdev;
-+
-+ /* Create the SPI-GPIO device */
-+ d->spi_pdev = platform_device_alloc(SPI_GPIO_PLATDEV_NAME,
-+ spi_gpio_next_id());
-+ if (!d->spi_pdev)
-+ goto err_free_d;
-+
-+ memset(&spi_pdata, 0, sizeof(spi_pdata));
-+ spi_pdata.pin_clk = mmc_pdata->pins.gpio_clk;
-+ spi_pdata.pin_miso = mmc_pdata->pins.gpio_do;
-+ spi_pdata.pin_mosi = mmc_pdata->pins.gpio_di;
-+ spi_pdata.pin_cs = mmc_pdata->pins.gpio_cs;
-+ spi_pdata.cs_activelow = mmc_pdata->pins.cs_activelow;
-+ spi_pdata.no_spi_delay = mmc_pdata->no_spi_delay;
-+ spi_pdata.boardinfo_setup = gpiommc_boardinfo_setup;
-+ spi_pdata.boardinfo_setup_data = d;
-+
-+ err = platform_device_add_data(d->spi_pdev, &spi_pdata,
-+ sizeof(spi_pdata));
-+ if (err)
-+ goto err_free_pdev;
-+ err = platform_device_add(d->spi_pdev);
-+ if (err)
-+ goto err_free_pdata;
-+ platform_set_drvdata(pdev, d);
-+
-+ printk(KERN_INFO PFX "MMC-Card \"%s\" "
-+ "attached to GPIO pins di=%u, do=%u, clk=%u, cs=%u\n",
-+ mmc_pdata->name, mmc_pdata->pins.gpio_di,
-+ mmc_pdata->pins.gpio_do,
-+ mmc_pdata->pins.gpio_clk,
-+ mmc_pdata->pins.gpio_cs);
-+
-+ return 0;
-+
-+err_free_pdata:
-+ kfree(d->spi_pdev->dev.platform_data);
-+ d->spi_pdev->dev.platform_data = NULL;
-+err_free_pdev:
-+ platform_device_put(d->spi_pdev);
-+err_free_d:
-+ kfree(d);
-+error:
-+ return err;
-+}
-+
-+static int gpiommc_remove(struct platform_device *pdev)
-+{
-+ struct gpiommc_device *d = platform_get_drvdata(pdev);
-+ struct gpiommc_platform_data *pdata = d->pdev->dev.platform_data;
-+
-+ platform_device_unregister(d->spi_pdev);
-+ printk(KERN_INFO PFX "GPIO based MMC-Card \"%s\" removed\n",
-+ pdata->name);
-+ platform_device_put(d->spi_pdev);
-+
-+ return 0;
-+}
-+
-+#ifdef CONFIG_GPIOMMC_CONFIGFS
-+
-+/* A device that was created through configfs */
-+struct gpiommc_configfs_device {
-+ struct config_item item;
-+ /* The platform device, after registration. */
-+ struct platform_device *pdev;
-+ /* The configuration */
-+ struct gpiommc_platform_data pdata;
-+};
-+
-+#define GPIO_INVALID -1
-+
-+static inline bool gpiommc_is_registered(struct gpiommc_configfs_device *dev)
-+{
-+ return (dev->pdev != NULL);
-+}
-+
-+static inline struct gpiommc_configfs_device *ci_to_gpiommc(struct config_item *item)
-+{
-+ return item ? container_of(item, struct gpiommc_configfs_device, item) : NULL;
-+}
-+
-+static struct configfs_attribute gpiommc_attr_DI = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_data_in",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_DO = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_data_out",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_CLK = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_clock",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_CS = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_chipselect",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_CS_activelow = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_chipselect_activelow",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_spimode = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "spi_mode",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_spidelay = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "spi_delay",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_max_bus_speed = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "max_bus_speed",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_register = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "register",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute *gpiommc_config_attrs[] = {
-+ &gpiommc_attr_DI,
-+ &gpiommc_attr_DO,
-+ &gpiommc_attr_CLK,
-+ &gpiommc_attr_CS,
-+ &gpiommc_attr_CS_activelow,
-+ &gpiommc_attr_spimode,
-+ &gpiommc_attr_spidelay,
-+ &gpiommc_attr_max_bus_speed,
-+ &gpiommc_attr_register,
-+ NULL,
-+};
-+
-+static ssize_t gpiommc_config_attr_show(struct config_item *item,
-+ struct configfs_attribute *attr,
-+ char *page)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+ ssize_t count = 0;
-+ unsigned int gpio;
-+ int err = 0;
-+
-+ if (attr == &gpiommc_attr_DI) {
-+ gpio = dev->pdata.pins.gpio_di;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_DO) {
-+ gpio = dev->pdata.pins.gpio_do;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CLK) {
-+ gpio = dev->pdata.pins.gpio_clk;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS) {
-+ gpio = dev->pdata.pins.gpio_cs;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS_activelow) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ dev->pdata.pins.cs_activelow);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spimode) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ dev->pdata.mode);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spidelay) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ !dev->pdata.no_spi_delay);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_max_bus_speed) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ dev->pdata.max_bus_speed);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_register) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ gpiommc_is_registered(dev));
-+ goto out;
-+ }
-+ WARN_ON(1);
-+ err = -ENOSYS;
-+out:
-+ return err ? err : count;
-+}
-+
-+static int gpiommc_do_register(struct gpiommc_configfs_device *dev,
-+ const char *name)
-+{
-+ int err;
-+
-+ if (gpiommc_is_registered(dev))
-+ return 0;
-+
-+ if (!gpio_is_valid(dev->pdata.pins.gpio_di) ||
-+ !gpio_is_valid(dev->pdata.pins.gpio_do) ||
-+ !gpio_is_valid(dev->pdata.pins.gpio_clk) ||
-+ !gpio_is_valid(dev->pdata.pins.gpio_cs)) {
-+ printk(KERN_ERR PFX
-+ "configfs: Invalid GPIO pin number(s)\n");
-+ return -EINVAL;
-+ }
-+
-+ strlcpy(dev->pdata.name, name,
-+ sizeof(dev->pdata.name));
-+
-+ dev->pdev = platform_device_alloc(GPIOMMC_PLATDEV_NAME,
-+ gpiommc_next_id());
-+ if (!dev->pdev)
-+ return -ENOMEM;
-+ err = platform_device_add_data(dev->pdev, &dev->pdata,
-+ sizeof(dev->pdata));
-+ if (err) {
-+ platform_device_put(dev->pdev);
-+ return err;
-+ }
-+ err = platform_device_add(dev->pdev);
-+ if (err) {
-+ platform_device_put(dev->pdev);
-+ return err;
-+ }
-+
-+ return 0;
-+}
-+
-+static void gpiommc_do_unregister(struct gpiommc_configfs_device *dev)
-+{
-+ if (!gpiommc_is_registered(dev))
-+ return;
-+
-+ platform_device_unregister(dev->pdev);
-+ dev->pdev = NULL;
-+}
-+
-+static ssize_t gpiommc_config_attr_store(struct config_item *item,
-+ struct configfs_attribute *attr,
-+ const char *page, size_t count)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+ int err = -EINVAL;
-+ unsigned long data;
-+
-+ if (attr == &gpiommc_attr_register) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data == 1)
-+ err = gpiommc_do_register(dev, item->ci_name);
-+ if (data == 0) {
-+ gpiommc_do_unregister(dev);
-+ err = 0;
-+ }
-+ goto out;
-+ }
-+
-+ if (gpiommc_is_registered(dev)) {
-+ /* The rest of the config parameters can only be set
-+ * as long as the device is not registered, yet. */
-+ err = -EBUSY;
-+ goto out;
-+ }
-+
-+ if (attr == &gpiommc_attr_DI) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_di = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_DO) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_do = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CLK) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_clk = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_cs = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS_activelow) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data != 0 && data != 1)
-+ goto out;
-+ dev->pdata.pins.cs_activelow = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spimode) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ switch (data) {
-+ case 0:
-+ dev->pdata.mode = SPI_MODE_0;
-+ break;
-+ case 1:
-+ dev->pdata.mode = SPI_MODE_1;
-+ break;
-+ case 2:
-+ dev->pdata.mode = SPI_MODE_2;
-+ break;
-+ case 3:
-+ dev->pdata.mode = SPI_MODE_3;
-+ break;
-+ default:
-+ goto out;
-+ }
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spidelay) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data != 0 && data != 1)
-+ goto out;
-+ dev->pdata.no_spi_delay = !data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_max_bus_speed) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data > UINT_MAX)
-+ goto out;
-+ dev->pdata.max_bus_speed = data;
-+ err = 0;
-+ goto out;
-+ }
-+ WARN_ON(1);
-+ err = -ENOSYS;
-+out:
-+ return err ? err : count;
-+}
-+
-+static void gpiommc_config_item_release(struct config_item *item)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+
-+ kfree(dev);
-+}
-+
-+static struct configfs_item_operations gpiommc_config_item_ops = {
-+ .release = gpiommc_config_item_release,
-+ .show_attribute = gpiommc_config_attr_show,
-+ .store_attribute = gpiommc_config_attr_store,
-+};
-+
-+static struct config_item_type gpiommc_dev_ci_type = {
-+ .ct_item_ops = &gpiommc_config_item_ops,
-+ .ct_attrs = gpiommc_config_attrs,
-+ .ct_owner = THIS_MODULE,
-+};
-+
-+static struct config_item *gpiommc_make_item(struct config_group *group,
-+ const char *name)
-+{
-+ struct gpiommc_configfs_device *dev;
-+
-+ if (strlen(name) > GPIOMMC_MAX_NAMELEN) {
-+ printk(KERN_ERR PFX "configfs: device name too long\n");
-+ return NULL;
-+ }
-+
-+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-+ if (!dev)
-+ return NULL;
-+
-+ config_item_init_type_name(&dev->item, name,
-+ &gpiommc_dev_ci_type);
-+
-+ /* Assign default configuration */
-+ dev->pdata.pins.gpio_di = GPIO_INVALID;
-+ dev->pdata.pins.gpio_do = GPIO_INVALID;
-+ dev->pdata.pins.gpio_clk = GPIO_INVALID;
-+ dev->pdata.pins.gpio_cs = GPIO_INVALID;
-+ dev->pdata.pins.cs_activelow = 1;
-+ dev->pdata.mode = SPI_MODE_0;
-+ dev->pdata.no_spi_delay = 0;
-+ dev->pdata.max_bus_speed = 5000000; /* 5 MHz */
-+
-+ return &(dev->item);
-+}
-+
-+static void gpiommc_drop_item(struct config_group *group,
-+ struct config_item *item)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+
-+ gpiommc_do_unregister(dev);
-+ kfree(dev);
-+}
-+
-+static struct configfs_group_operations gpiommc_ct_group_ops = {
-+ .make_item = gpiommc_make_item,
-+ .drop_item = gpiommc_drop_item,
-+};
-+
-+static struct config_item_type gpiommc_ci_type = {
-+ .ct_group_ops = &gpiommc_ct_group_ops,
-+ .ct_owner = THIS_MODULE,
-+};
-+
-+static struct configfs_subsystem gpiommc_subsys = {
-+ .su_group = {
-+ .cg_item = {
-+ .ci_namebuf = GPIOMMC_PLATDEV_NAME,
-+ .ci_type = &gpiommc_ci_type,
-+ },
-+ },
-+ .su_mutex = __MUTEX_INITIALIZER(gpiommc_subsys.su_mutex),
-+};
-+
-+#endif /* CONFIG_GPIOMMC_CONFIGFS */
-+
-+static struct platform_driver gpiommc_plat_driver = {
-+ .probe = gpiommc_probe,
-+ .remove = gpiommc_remove,
-+ .driver = {
-+ .name = GPIOMMC_PLATDEV_NAME,
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+int gpiommc_next_id(void)
-+{
-+ static atomic_t counter = ATOMIC_INIT(-1);
-+
-+ return atomic_inc_return(&counter);
-+}
-+EXPORT_SYMBOL(gpiommc_next_id);
-+
-+static int __init gpiommc_modinit(void)
-+{
-+ int err;
-+
-+ err = platform_driver_register(&gpiommc_plat_driver);
-+ if (err)
-+ return err;
-+
-+#ifdef CONFIG_GPIOMMC_CONFIGFS
-+ config_group_init(&gpiommc_subsys.su_group);
-+ err = configfs_register_subsystem(&gpiommc_subsys);
-+ if (err) {
-+ platform_driver_unregister(&gpiommc_plat_driver);
-+ return err;
-+ }
-+#endif /* CONFIG_GPIOMMC_CONFIGFS */
-+
-+ return 0;
-+}
-+module_init(gpiommc_modinit);
-+
-+static void __exit gpiommc_modexit(void)
-+{
-+#ifdef CONFIG_GPIOMMC_CONFIGFS
-+ configfs_unregister_subsystem(&gpiommc_subsys);
-+#endif
-+ platform_driver_unregister(&gpiommc_plat_driver);
-+}
-+module_exit(gpiommc_modexit);
---- a/drivers/mmc/host/Kconfig
-+++ b/drivers/mmc/host/Kconfig
-@@ -130,3 +130,27 @@ config MMC_SPI
-
- If unsure, or if your system has no SPI master driver, say N.
-
-+config GPIOMMC
-+ tristate "MMC/SD over GPIO-based SPI"
-+ depends on MMC && MMC_SPI && SPI_GPIO
-+ help
-+ This driver hooks up the mmc_spi and spi_gpio modules so that
-+ MMC/SD cards can be used on a GPIO based bus by bitbanging
-+ the SPI protocol in software.
-+
-+ This driver provides a configfs interface to dynamically create
-+ and destroy GPIO-based MMC/SD card devices. It also provides
-+ a platform device interface API.
-+ See Documentation/gpiommc.txt for details.
-+
-+ The module will be called gpiommc.
-+
-+ If unsure, say N.
-+
-+config GPIOMMC_CONFIGFS
-+ bool
-+ depends on GPIOMMC && CONFIGFS_FS
-+ default y
-+ help
-+ This option automatically enables configfs support for gpiommc
-+ if configfs is available.
---- a/drivers/mmc/host/Makefile
-+++ b/drivers/mmc/host/Makefile
-@@ -17,4 +17,4 @@ obj-$(CONFIG_MMC_OMAP) += omap.o
- obj-$(CONFIG_MMC_AT91) += at91_mci.o
- obj-$(CONFIG_MMC_TIFM_SD) += tifm_sd.o
- obj-$(CONFIG_MMC_SPI) += mmc_spi.o
--
-+obj-$(CONFIG_GPIOMMC) += gpiommc.o
---- /dev/null
-+++ b/include/linux/mmc/gpiommc.h
-@@ -0,0 +1,69 @@
-+/*
-+ * Device driver for MMC/SD cards driven over a GPIO bus.
-+ *
-+ * Licensed under the GNU/GPL version 2.
-+ */
-+#ifndef LINUX_GPIOMMC_H_
-+#define LINUX_GPIOMMC_H_
-+
-+#include <linux/types.h>
-+
-+
-+#define GPIOMMC_MAX_NAMELEN 15
-+#define GPIOMMC_MAX_NAMELEN_STR __stringify(GPIOMMC_MAX_NAMELEN)
-+
-+/**
-+ * struct gpiommc_pins - Hardware pin assignments
-+ *
-+ * @gpio_di: The GPIO number of the DATA IN pin
-+ * @gpio_do: The GPIO number of the DATA OUT pin
-+ * @gpio_clk: The GPIO number of the CLOCK pin
-+ * @gpio_cs: The GPIO number of the CHIPSELECT pin
-+ * @cs_activelow: If true, the chip is considered selected if @gpio_cs is low.
-+ */
-+struct gpiommc_pins {
-+ unsigned int gpio_di;
-+ unsigned int gpio_do;
-+ unsigned int gpio_clk;
-+ unsigned int gpio_cs;
-+ bool cs_activelow;
-+};
-+
-+/**
-+ * struct gpiommc_platform_data - Platform data for a MMC-over-SPI-GPIO device.
-+ *
-+ * @name: The unique name string of the device.
-+ * @pins: The hardware pin assignments.
-+ * @mode: The hardware mode. This is either SPI_MODE_0,
-+ * SPI_MODE_1, SPI_MODE_2 or SPI_MODE_3. See the SPI documentation.
-+ * @no_spi_delay: Do not use delays in the lowlevel SPI bitbanging code.
-+ * This is not standards compliant, but may be required for some
-+ * embedded machines to gain reasonable speed.
-+ * @max_bus_speed: The maximum speed of the SPI bus, in Hertz.
-+ */
-+struct gpiommc_platform_data {
-+ char name[GPIOMMC_MAX_NAMELEN + 1];
-+ struct gpiommc_pins pins;
-+ u8 mode;
-+ bool no_spi_delay;
-+ unsigned int max_bus_speed;
-+};
-+
-+/**
-+ * GPIOMMC_PLATDEV_NAME - The platform device name string.
-+ *
-+ * The name string that has to be used for platform_device_alloc
-+ * when allocating a gpiommc device.
-+ */
-+#define GPIOMMC_PLATDEV_NAME "gpiommc"
-+
-+/**
-+ * gpiommc_next_id - Get another platform device ID number.
-+ *
-+ * This returns the next platform device ID number that has to be used
-+ * for platform_device_alloc. The ID is opaque and should not be used for
-+ * anything else.
-+ */
-+int gpiommc_next_id(void);
-+
-+#endif /* LINUX_GPIOMMC_H_ */
---- /dev/null
-+++ b/Documentation/gpiommc.txt
-@@ -0,0 +1,97 @@
-+GPIOMMC - Driver for an MMC/SD card on a bitbanging GPIO SPI bus
-+================================================================
-+
-+The gpiommc module hooks up the mmc_spi and spi_gpio modules for running an
-+MMC or SD card on GPIO pins.
-+
-+Two interfaces for registering a new MMC/SD card device are provided:
-+A static platform-device based mechanism and a dynamic configfs based interface.
-+
-+
-+Registering devices via platform-device
-+=======================================
-+
-+The platform-device interface is used for registering MMC/SD devices that are
-+part of the hardware platform. This is most useful only for embedded machines
-+with MMC/SD devices statically connected to the platform GPIO bus.
-+
-+The data structures are declared in <linux/mmc/gpiommc.h>.
-+
-+To register a new device, define an instance of struct gpiommc_platform_data.
-+This structure holds any information about how the device is hooked up to the
-+GPIO pins and what hardware modes the device supports. See the docbook-style
-+documentation in the header file for more information on the struct fields.
-+
-+Then allocate a new instance of a platform device by doing:
-+
-+ pdev = platform_device_alloc(GPIOMMC_PLATDEV_NAME, gpiommc_next_id());
-+
-+This will allocate the platform device data structures and hook it up to the
-+gpiommc driver.
-+Then add the gpiommc_platform_data to the platform device.
-+
-+ err = platform_device_add_data(pdev, pdata, sizeof(struct gpiommc_platform_data));
-+
-+You may free the local instance of struct gpiommc_platform_data now. (So the
-+struct may be allocated on the stack, too).
-+Now simply register the platform device.
-+
-+ err = platform_device_add(pdev);
-+
-+Done. The gpiommc probe routine will be invoked now and you should see a kernel
-+log message for the added device.
-+
-+
-+Registering devices via configfs
-+================================
-+
-+MMC/SD cards connected via GPIO often are a pretty dynamic thing, as for example
-+selfmade hacks for soldering an MMC/SD card to standard GPIO pins on embedded
-+hardware are a common situation.
-+So we provide a dynamic interface to conveniently handle adding and removing
-+devices from userspace, without the need to recompile the kernel.
-+
-+The "gpiommc" subdirectory at the configfs mountpoint is used for handling
-+the dynamic configuration.
-+
-+To create a new device, it must first be allocated with mkdir.
-+The following command will allocate a device named "my_mmc":
-+ mkdir /config/gpiommc/my_mmc
-+
-+There are several configuration files available in the new
-+/config/gpiommc/my_mmc/ directory:
-+
-+gpio_data_in = The SPI data-IN GPIO pin number.
-+gpio_data_out = The SPI data-OUT GPIO pin number.
-+gpio_clock = The SPI Clock GPIO pin number.
-+gpio_chipselect = The SPI Chipselect GPIO pin number.
-+gpio_chipselect_activelow = Boolean. If 0, Chipselect is active-HIGH.
-+ If 1, Chipselect is active-LOW.
-+spi_mode = The SPI data mode. Can be 0-3.
-+spi_delay = Enable all delays in the lowlevel bitbanging.
-+max_bus_speed = The maximum SPI bus speed. In Hertz.
-+
-+register = Not a configuration parameter.
-+ Used to register the configured card
-+ with the kernel.
-+
-+The device must first get configured and then registered by writing "1" to
-+the "register" file.
-+The configuration parameters "gpio_data_in", "gpio_data_out", "gpio_clock"
-+and "gpio_chipselect" are essential and _must_ be configured before writing
-+"1" to the "register" file. The registration will fail, otherwise.
-+
-+The default values for the other parameters are:
-+gpio_chipselect_activelow = 1 (CS active-LOW)
-+spi_mode = 0 (SPI_MODE_0)
-+spi_delay = 1 (enabled)
-+max_bus_speed = 5000000 (5 Mhz)
-+
-+Configuration values can not be changed after registration. To unregister
-+the device, write a "0" to the "register" file. The configuration can be
-+changed again after unregistering.
-+
-+To completely remove the device, simply rmdir the directory
-+(/config/gpiommc/my_mmc in this example).
-+There's no need to first unregister the device before removing it. That will
-+be done automatically.
+++ /dev/null
-The gpiommc configfs context structure needs locking, as configfs
-does not lock access between files.
-
---- a/drivers/mmc/host/gpiommc.c
-+++ b/drivers/mmc/host/gpiommc.c
-@@ -140,6 +140,8 @@ struct gpiommc_configfs_device {
- struct platform_device *pdev;
- /* The configuration */
- struct gpiommc_platform_data pdata;
-+ /* Mutex to protect this structure */
-+ struct mutex mutex;
- };
-
- #define GPIO_INVALID -1
-@@ -230,6 +232,8 @@ static ssize_t gpiommc_config_attr_show(
- unsigned int gpio;
- int err = 0;
-
-+ mutex_lock(&dev->mutex);
-+
- if (attr == &gpiommc_attr_DI) {
- gpio = dev->pdata.pins.gpio_di;
- if (gpio == GPIO_INVALID)
-@@ -290,6 +294,8 @@ static ssize_t gpiommc_config_attr_show(
- WARN_ON(1);
- err = -ENOSYS;
- out:
-+ mutex_unlock(&dev->mutex);
-+
- return err ? err : count;
- }
-
-@@ -349,6 +355,8 @@ static ssize_t gpiommc_config_attr_store
- int err = -EINVAL;
- unsigned long data;
-
-+ mutex_lock(&dev->mutex);
-+
- if (attr == &gpiommc_attr_register) {
- err = strict_strtoul(page, 10, &data);
- if (err)
-@@ -474,6 +482,8 @@ static ssize_t gpiommc_config_attr_store
- WARN_ON(1);
- err = -ENOSYS;
- out:
-+ mutex_unlock(&dev->mutex);
-+
- return err ? err : count;
- }
-
-@@ -510,6 +520,7 @@ static struct config_item *gpiommc_make_
- if (!dev)
- return NULL;
-
-+ mutex_init(&dev->mutex);
- config_item_init_type_name(&dev->item, name,
- &gpiommc_dev_ci_type);
-
+++ /dev/null
-From a.othieno@bluewin.ch Tue Oct 11 07:50:21 2005
-From: Arthur Othieno <a.othieno@bluewin.ch>
-Subject: Big-endian I/O memory accessors.
-Date: Tue, 11 Oct 2005 07:50:21 +1000
-X-Patchwork-ID: 2759
-
-From: Arthur Othieno <a.othieno@bluewin.ch>
-
-I/O memory accessors. Big endian version. For those busses/devices
-that do export big-endian I/O memory.
-
-Of notable relevance/reference:
-
- http://lwn.net/Articles/132804/
- http://ozlabs.org/pipermail/linuxppc-embedded/2005-August/019798.html
- http://ozlabs.org/pipermail/linuxppc-embedded/2005-August/019752.html
-
-Signed-off-by: Arthur Othieno <a.othieno@bluewin.ch>
----
-
-Paulus,
-
-A similar patch for ppc64 made it upstream with your big ppc64 merge.
-This one is still sitting in http://patchwork.ozlabs.org/linuxppc/
-and didn't make it with the ppc32 equivalent. Thanks.
-
-
- include/asm-ppc/io.h | 20 ++++++++++++++++++++
- 1 file changed, 20 insertions(+)
-
-
----
---- a/include/asm-ppc/io.h
-+++ b/include/asm-ppc/io.h
-@@ -413,11 +413,21 @@ static inline unsigned int ioread16(void
- return readw(addr);
- }
-
-+static inline unsigned int ioread16be(void __iomem *addr)
-+{
-+ return in_be16(addr);
-+}
-+
- static inline unsigned int ioread32(void __iomem *addr)
- {
- return readl(addr);
- }
-
-+static inline unsigned int ioread32be(void __iomem *addr)
-+{
-+ return in_be32(addr);
-+}
-+
- static inline void iowrite8(u8 val, void __iomem *addr)
- {
- writeb(val, addr);
-@@ -428,11 +438,21 @@ static inline void iowrite16(u16 val, vo
- writew(val, addr);
- }
-
-+static inline void iowrite16be(u16 val, void __iomem *addr)
-+{
-+ out_be16(addr, val);
-+}
-+
- static inline void iowrite32(u32 val, void __iomem *addr)
- {
- writel(val, addr);
- }
-
-+static inline void iowrite32be(u32 val, void __iomem *addr)
-+{
-+ out_be32(addr, val);
-+}
-+
- static inline void ioread8_rep(void __iomem *addr, void *dst, unsigned long count)
- {
- _insb(addr, dst, count);
+++ /dev/null
---- a/arch/arm/tools/mach-types
-+++ b/arch/arm/tools/mach-types
-@@ -12,7 +12,7 @@
- #
- # http://www.arm.linux.org.uk/developer/machines/?action=new
- #
--# Last update: Sat Jan 26 14:45:34 2008
-+# Last update: Sat Apr 19 15:13:28 2008
- #
- # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
- #
-@@ -381,13 +381,13 @@ ks8695p ARCH_KS8695P KS8695P 363
- se4000 ARCH_SE4000 SE4000 364
- quadriceps ARCH_QUADRICEPS QUADRICEPS 365
- bronco ARCH_BRONCO BRONCO 366
--esl_wireless_tab ARCH_ESL_WIRELESS_TABLETESL_WIRELESS_TABLET 367
-+esl_wireless_tab ARCH_ESL_WIRELESS_TAB ESL_WIRELESS_TAB 367
- esl_sofcomp ARCH_ESL_SOFCOMP ESL_SOFCOMP 368
- s5c7375 ARCH_S5C7375 S5C7375 369
- spearhead ARCH_SPEARHEAD SPEARHEAD 370
- pantera ARCH_PANTERA PANTERA 371
- prayoglite ARCH_PRAYOGLITE PRAYOGLITE 372
--gumstix ARCH_GUMSTIK GUMSTIK 373
-+gumstix ARCH_GUMSTIX GUMSTIX 373
- rcube ARCH_RCUBE RCUBE 374
- rea_olv ARCH_REA_OLV REA_OLV 375
- pxa_iphone ARCH_PXA_IPHONE PXA_IPHONE 376
-@@ -1463,7 +1463,7 @@ artemis MACH_ARTEMIS ARTEMIS 1462
- htctitan MACH_HTCTITAN HTCTITAN 1463
- qranium MACH_QRANIUM QRANIUM 1464
- adx_wsc2 MACH_ADX_WSC2 ADX_WSC2 1465
--adx_medinet MACH_ADX_MEDINET ADX_MEDINET 1466
-+adx_medcom MACH_ADX_MEDINET ADX_MEDINET 1466
- bboard MACH_BBOARD BBOARD 1467
- cambria MACH_CAMBRIA CAMBRIA 1468
- mt7xxx MACH_MT7XXX MT7XXX 1469
-@@ -1611,3 +1611,112 @@ kb9263 MACH_KB9263 KB9263 1612
- mt7108 MACH_MT7108 MT7108 1613
- smtr2440 MACH_SMTR2440 SMTR2440 1614
- manao MACH_MANAO MANAO 1615
-+cm_x300 MACH_CM_X300 CM_X300 1616
-+gulfstream_kp MACH_GULFSTREAM_KP GULFSTREAM_KP 1617
-+lanreadyfn522 MACH_LANREADYFN522 LANREADYFN522 1618
-+arma37 MACH_ARMA37 ARMA37 1619
-+mendel MACH_MENDEL MENDEL 1620
-+pelco_iliad MACH_PELCO_ILIAD PELCO_ILIAD 1621
-+unit2p MACH_UNIT2P UNIT2P 1622
-+inc20otter MACH_INC20OTTER INC20OTTER 1623
-+at91sam9g20ek MACH_AT91SAM9G20EK AT91SAM9G20EK 1624
-+sc_ge2 MACH_STORCENTER STORCENTER 1625
-+smdk6410 MACH_SMDK6410 SMDK6410 1626
-+u300 MACH_U300 U300 1627
-+u500 MACH_U500 U500 1628
-+ds9260 MACH_DS9260 DS9260 1629
-+riverrock MACH_RIVERROCK RIVERROCK 1630
-+scibath MACH_SCIBATH SCIBATH 1631
-+at91sam7se MACH_AT91SAM7SE512EK AT91SAM7SE512EK 1632
-+wrt350n_v2 MACH_WRT350N_V2 WRT350N_V2 1633
-+multimedia MACH_MULTIMEDIA MULTIMEDIA 1634
-+marvin MACH_MARVIN MARVIN 1635
-+x500 MACH_X500 X500 1636
-+awlug4lcu MACH_AWLUG4LCU AWLUG4LCU 1637
-+palermoc MACH_PALERMOC PALERMOC 1638
-+omap_ldp MACH_OMAP_LDP OMAP_LDP 1639
-+ip500 MACH_IP500 IP500 1640
-+mx35ads MACH_MACH_MX35ADS MACH_MX35ADS 1641
-+ase2 MACH_ASE2 ASE2 1642
-+mx35evb MACH_MX35EVB MX35EVB 1643
-+aml_m8050 MACH_AML_M8050 AML_M8050 1644
-+mx35_3ds MACH_MX35_3DS MX35_3DS 1645
-+mars MACH_MARS MARS 1646
-+ntosd_644xa MACH_NTOSD_644XA NTOSD_644XA 1647
-+badger MACH_BADGER BADGER 1648
-+trizeps4wl MACH_TRIZEPS4WL TRIZEPS4WL 1649
-+trizeps5 MACH_TRIZEPS5 TRIZEPS5 1650
-+marlin MACH_MARLIN MARLIN 1651
-+ts7800 MACH_TS7800 TS7800 1652
-+hpipaq214 MACH_HPIPAQ214 HPIPAQ214 1653
-+at572d940dcm MACH_AT572D940DCM AT572D940DCM 1654
-+ne1board MACH_NE1BOARD NE1BOARD 1655
-+zante MACH_ZANTE ZANTE 1656
-+sffsdr MACH_SFFSDR SFFSDR 1657
-+tw2662 MACH_TW2662 TW2662 1658
-+vf10xx MACH_VF10XX VF10XX 1659
-+zoran43xx MACH_ZORAN43XX ZORAN43XX 1660
-+sonix926 MACH_SONIX926 SONIX926 1661
-+celestialsemi MACH_CELESTIALSEMI CELESTIALSEMI 1662
-+cc9m2443 MACH_CC9M2443 CC9M2443 1663
-+tw5334 MACH_TW5334 TW5334 1664
-+omap_htcartemis MACH_HTCARTEMIS HTCARTEMIS 1665
-+nal_hlite MACH_NAL_HLITE NAL_HLITE 1666
-+htcvogue MACH_HTCVOGUE HTCVOGUE 1667
-+smartweb MACH_SMARTWEB SMARTWEB 1668
-+mv86xx MACH_MV86XX MV86XX 1669
-+mv87xx MACH_MV87XX MV87XX 1670
-+songyoungho MACH_SONGYOUNGHO SONGYOUNGHO 1671
-+younghotema MACH_YOUNGHOTEMA YOUNGHOTEMA 1672
-+pcm037 MACH_PCM037 PCM037 1673
-+mmvp MACH_MMVP MMVP 1674
-+mmap MACH_MMAP MMAP 1675
-+ptid2410 MACH_PTID2410 PTID2410 1676
-+james_926 MACH_JAMES_926 JAMES_926 1677
-+fm6000 MACH_FM6000 FM6000 1678
-+db88f6281_bp MACH_DB88F6281_BP DB88F6281_BP 1680
-+rd88f6192_nas MACH_RD88F6192_NAS RD88F6192_NAS 1681
-+rd88f6281 MACH_RD88F6281 RD88F6281 1682
-+db78x00_bp MACH_DB78X00_BP DB78X00_BP 1683
-+smdk2416 MACH_SMDK2416 SMDK2416 1685
-+oce_spider_si MACH_OCE_SPIDER_SI OCE_SPIDER_SI 1686
-+oce_spider_sk MACH_OCE_SPIDER_SK OCE_SPIDER_SK 1687
-+rovern6 MACH_ROVERN6 ROVERN6 1688
-+pelco_evolution MACH_PELCO_EVOLUTION PELCO_EVOLUTION 1689
-+wbd111 MACH_WBD111 WBD111 1690
-+elaracpe MACH_ELARACPE ELARACPE 1691
-+mabv3 MACH_MABV3 MABV3 1692
-+mv2120 MACH_MV2120 MV2120 1693
-+csb737 MACH_CSB737 CSB737 1695
-+mx51_3ds MACH_MX51_3DS MX51_3DS 1696
-+g900 MACH_G900 G900 1697
-+apf27 MACH_APF27 APF27 1698
-+ggus2000 MACH_GGUS2000 GGUS2000 1699
-+omap_2430_mimic MACH_OMAP_2430_MIMIC OMAP_2430_MIMIC 1700
-+imx27lite MACH_IMX27LITE IMX27LITE 1701
-+almex MACH_ALMEX ALMEX 1702
-+control MACH_CONTROL CONTROL 1703
-+mba2410 MACH_MBA2410 MBA2410 1704
-+volcano MACH_VOLCANO VOLCANO 1705
-+zenith MACH_ZENITH ZENITH 1706
-+muchip MACH_MUCHIP MUCHIP 1707
-+magellan MACH_MAGELLAN MAGELLAN 1708
-+usb_a9260 MACH_USB_A9260 USB_A9260 1709
-+usb_a9263 MACH_USB_A9263 USB_A9263 1710
-+qil_a9260 MACH_QIL_A9260 QIL_A9260 1711
-+cme9210 MACH_CME9210 CME9210 1712
-+hczh4 MACH_HCZH4 HCZH4 1713
-+spearbasic MACH_SPEARBASIC SPEARBASIC 1714
-+dep2440 MACH_DEP2440 DEP2440 1715
-+hdl_gxr MACH_HDL_GXR HDL_GXR 1716
-+hdl_gt MACH_HDL_GT HDL_GT 1717
-+hdl_4g MACH_HDL_4G HDL_4G 1718
-+s3c6000 MACH_S3C6000 S3C6000 1719
-+mmsp2_mdk MACH_MMSP2_MDK MMSP2_MDK 1720
-+mpx220 MACH_MPX220 MPX220 1721
-+kzm_arm11_01 MACH_KZM_ARM11_01 KZM_ARM11_01 1722
-+htc_polaris MACH_HTC_POLARIS HTC_POLARIS 1723
-+htc_kaiser MACH_HTC_KAISER HTC_KAISER 1724
-+lg_ks20 MACH_LG_KS20 LG_KS20 1725
-+hhgps MACH_HHGPS HHGPS 1726
-+nokia_n810_wimax MACH_NOKIA_N810_WIMAX NOKIA_N810_WIMAX 1727
+++ /dev/null
-From: Guennadi Liakhovetski <g.liakhovetski@pengutronix.de>
-Date: Mon, 28 Apr 2008 09:14:44 +0000 (-0700)
-Subject: gpiolib: better rmmod infrastructure
-X-Git-Tag: v2.6.26-rc1~851
-X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=438d8908b379b6322fc3b28d45c9ebdddf58bc20
-
-gpiolib: better rmmod infrastructure
-
-As long as one or more GPIOs on a gpio chip are used its driver should not be
-unloaded. The existing mechanism (gpiochip_remove failure) doesn't address
-that, since rmmod can no longer be made to fail by having the cleanup code
-report errors. Module usecounts are the solution.
-
-Assuming standard "initialize struct to zero" policies, this change won't
-affect SOC platform drivers. However, drivers for external chips (on I2C and
-SPI busses) should be updated if they can be built as modules.
-
-Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@pengutronix.de>
-[ gpio_ensure_requested() needs to update module usecounts too ]
-Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
----
-
---- a/drivers/gpio/gpiolib.c
-+++ b/drivers/gpio/gpiolib.c
-@@ -68,6 +68,9 @@ static void gpio_ensure_requested(struct
- if (test_and_set_bit(FLAG_REQUESTED, &desc->flags) == 0) {
- pr_warning("GPIO-%d autorequested\n", (int)(desc - gpio_desc));
- desc_set_label(desc, "[auto]");
-+ if (!try_module_get(desc->chip->owner))
-+ pr_err("GPIO-%d: module can't be gotten \n",
-+ (int)(desc - gpio_desc));
- }
- }
-
-@@ -177,6 +180,9 @@ int gpio_request(unsigned gpio, const ch
- if (desc->chip == NULL)
- goto done;
-
-+ if (!try_module_get(desc->chip->owner))
-+ goto done;
-+
- /* NOTE: gpio_request() can be called in early boot,
- * before IRQs are enabled.
- */
-@@ -184,8 +190,10 @@ int gpio_request(unsigned gpio, const ch
- if (test_and_set_bit(FLAG_REQUESTED, &desc->flags) == 0) {
- desc_set_label(desc, label ? : "?");
- status = 0;
-- } else
-+ } else {
- status = -EBUSY;
-+ module_put(desc->chip->owner);
-+ }
-
- done:
- if (status)
-@@ -209,9 +217,10 @@ void gpio_free(unsigned gpio)
- spin_lock_irqsave(&gpio_lock, flags);
-
- desc = &gpio_desc[gpio];
-- if (desc->chip && test_and_clear_bit(FLAG_REQUESTED, &desc->flags))
-+ if (desc->chip && test_and_clear_bit(FLAG_REQUESTED, &desc->flags)) {
- desc_set_label(desc, NULL);
-- else
-+ module_put(desc->chip->owner);
-+ } else
- WARN_ON(extra_checks);
-
- spin_unlock_irqrestore(&gpio_lock, flags);
---- a/include/asm-generic/gpio.h
-+++ b/include/asm-generic/gpio.h
-@@ -17,6 +17,7 @@
- #endif
-
- struct seq_file;
-+struct module;
-
- /**
- * struct gpio_chip - abstract a GPIO controller
-@@ -48,6 +49,7 @@ struct seq_file;
- */
- struct gpio_chip {
- char *label;
-+ struct module *owner;
-
- int (*direction_input)(struct gpio_chip *chip,
- unsigned offset);
+++ /dev/null
-From: Guennadi Liakhovetski <g.liakhovetski@pengutronix.de>
-Date: Mon, 28 Apr 2008 09:14:46 +0000 (-0700)
-Subject: gpio: define gpio_is_valid()
-X-Git-Tag: v2.6.26-rc1~849
-X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=e6de1808f8ebfeb7e49f3c5a30cb8f2032beb287
-
-gpio: define gpio_is_valid()
-
-Introduce a gpio_is_valid() predicate; use it in gpiolib.
-
-Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@pengutronix.de>
- [ use inline function; follow the gpio_* naming convention;
- work without gpiolib; all programming interfaces need docs ]
-Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
----
-
---- a/Documentation/gpio.txt
-+++ b/Documentation/gpio.txt
-@@ -107,6 +107,16 @@ type of GPIO controller, and on one part
- The numbers need not be contiguous; either of those platforms could also
- use numbers 2000-2063 to identify GPIOs in a bank of I2C GPIO expanders.
-
-+If you want to initialize a structure with an invalid GPIO number, use
-+some negative number (perhaps "-EINVAL"); that will never be valid. To
-+test if a number could reference a GPIO, you may use this predicate:
-+
-+ int gpio_is_valid(int number);
-+
-+A number that's not valid will be rejected by calls which may request
-+or free GPIOs (see below). Other numbers may also be rejected; for
-+example, a number might be valid but unused on a given board.
-+
- Whether a platform supports multiple GPIO controllers is currently a
- platform-specific implementation issue.
-
---- a/drivers/gpio/gpiolib.c
-+++ b/drivers/gpio/gpiolib.c
-@@ -99,7 +99,7 @@ int gpiochip_add(struct gpio_chip *chip)
- * dynamic allocation. We don't currently support that.
- */
-
-- if (chip->base < 0 || (chip->base + chip->ngpio) >= ARCH_NR_GPIOS) {
-+ if (chip->base < 0 || !gpio_is_valid(chip->base + chip->ngpio)) {
- status = -EINVAL;
- goto fail;
- }
-@@ -174,7 +174,7 @@ int gpio_request(unsigned gpio, const ch
-
- spin_lock_irqsave(&gpio_lock, flags);
-
-- if (gpio >= ARCH_NR_GPIOS)
-+ if (!gpio_is_valid(gpio))
- goto done;
- desc = &gpio_desc[gpio];
- if (desc->chip == NULL)
-@@ -209,7 +209,7 @@ void gpio_free(unsigned gpio)
- unsigned long flags;
- struct gpio_desc *desc;
-
-- if (gpio >= ARCH_NR_GPIOS) {
-+ if (!gpio_is_valid(gpio)) {
- WARN_ON(extra_checks);
- return;
- }
-@@ -245,7 +245,7 @@ const char *gpiochip_is_requested(struct
- {
- unsigned gpio = chip->base + offset;
-
-- if (gpio >= ARCH_NR_GPIOS || gpio_desc[gpio].chip != chip)
-+ if (!gpio_is_valid(gpio) || gpio_desc[gpio].chip != chip)
- return NULL;
- if (test_bit(FLAG_REQUESTED, &gpio_desc[gpio].flags) == 0)
- return NULL;
-@@ -276,7 +276,7 @@ int gpio_direction_input(unsigned gpio)
-
- spin_lock_irqsave(&gpio_lock, flags);
-
-- if (gpio >= ARCH_NR_GPIOS)
-+ if (!gpio_is_valid(gpio))
- goto fail;
- chip = desc->chip;
- if (!chip || !chip->get || !chip->direction_input)
-@@ -314,7 +314,7 @@ int gpio_direction_output(unsigned gpio,
-
- spin_lock_irqsave(&gpio_lock, flags);
-
-- if (gpio >= ARCH_NR_GPIOS)
-+ if (!gpio_is_valid(gpio))
- goto fail;
- chip = desc->chip;
- if (!chip || !chip->set || !chip->direction_output)
-@@ -531,7 +531,7 @@ static int gpiolib_show(struct seq_file
-
- /* REVISIT this isn't locked against gpio_chip removal ... */
-
-- for (gpio = 0; gpio < ARCH_NR_GPIOS; gpio++) {
-+ for (gpio = 0; gpio_is_valid(gpio); gpio++) {
- if (chip == gpio_desc[gpio].chip)
- continue;
- chip = gpio_desc[gpio].chip;
---- a/include/asm-generic/gpio.h
-+++ b/include/asm-generic/gpio.h
-@@ -16,6 +16,12 @@
- #define ARCH_NR_GPIOS 256
- #endif
-
-+static inline int gpio_is_valid(int number)
-+{
-+ /* only some non-negative numbers are valid */
-+ return ((unsigned)number) < ARCH_NR_GPIOS;
-+}
-+
- struct seq_file;
- struct module;
-
-@@ -99,6 +105,16 @@ extern int __gpio_cansleep(unsigned gpio
-
- #else
-
-+static inline int __gpio_is_valid(int number)
-+{
-+ /* only non-negative numbers are valid */
-+ return number >= 0;
-+}
-+
-+#ifndef gpio_is_valid
-+#define gpio_is_valid __gpio_is_valid
-+#endif
-+
- /* platforms that don't directly support access to GPIOs through I2C, SPI,
- * or other blocking infrastructure can use these wrappers.
- */
+++ /dev/null
-From: Anton Vorontsov <avorontsov@ru.mvista.com>
-Date: Mon, 28 Apr 2008 09:14:46 +0000 (-0700)
-Subject: gpiolib: dynamic gpio number allocation
-X-Git-Tag: v2.6.26-rc1~848
-X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=8d0aab2f16c4fa170f32e7a74a52cd0122bbafef
-
-gpiolib: dynamic gpio number allocation
-
-If gpio_chip->base is negative during registration, gpiolib performs dynamic
-base allocation. This is useful for devices that aren't always present, such
-as GPIOs on hotplugged devices rather than mainboards. (This behavior was
-previously specified but not implemented.)
-
-To avoid using any numbers that may have been explicitly assigned but not yet
-registered, this dynamic allocation assigns GPIO numbers from the biggest
-number on down, instead of from the smallest on up.
-
-Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
-Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
----
-
---- a/drivers/gpio/gpiolib.c
-+++ b/drivers/gpio/gpiolib.c
-@@ -80,6 +80,33 @@ static inline struct gpio_chip *gpio_to_
- return gpio_desc[gpio].chip;
- }
-
-+/* dynamic allocation of GPIOs, e.g. on a hotplugged device */
-+static int gpiochip_find_base(int ngpio)
-+{
-+ int i;
-+ int spare = 0;
-+ int base = -ENOSPC;
-+
-+ for (i = ARCH_NR_GPIOS - 1; i >= 0 ; i--) {
-+ struct gpio_chip *chip = gpio_desc[i].chip;
-+
-+ if (!chip) {
-+ spare++;
-+ if (spare == ngpio) {
-+ base = i;
-+ break;
-+ }
-+ } else {
-+ spare = 0;
-+ i -= chip->ngpio - 1;
-+ }
-+ }
-+
-+ if (gpio_is_valid(base))
-+ pr_debug("%s: found new base at %d\n", __func__, base);
-+ return base;
-+}
-+
- /**
- * gpiochip_add() - register a gpio_chip
- * @chip: the chip to register, with chip->base initialized
-@@ -88,38 +115,49 @@ static inline struct gpio_chip *gpio_to_
- * Returns a negative errno if the chip can't be registered, such as
- * because the chip->base is invalid or already associated with a
- * different chip. Otherwise it returns zero as a success code.
-+ *
-+ * If chip->base is negative, this requests dynamic assignment of
-+ * a range of valid GPIOs.
- */
- int gpiochip_add(struct gpio_chip *chip)
- {
- unsigned long flags;
- int status = 0;
- unsigned id;
-+ int base = chip->base;
-
-- /* NOTE chip->base negative is reserved to mean a request for
-- * dynamic allocation. We don't currently support that.
-- */
--
-- if (chip->base < 0 || !gpio_is_valid(chip->base + chip->ngpio)) {
-+ if ((!gpio_is_valid(base) || !gpio_is_valid(base + chip->ngpio))
-+ && base >= 0) {
- status = -EINVAL;
- goto fail;
- }
-
- spin_lock_irqsave(&gpio_lock, flags);
-
-+ if (base < 0) {
-+ base = gpiochip_find_base(chip->ngpio);
-+ if (base < 0) {
-+ status = base;
-+ goto fail_unlock;
-+ }
-+ chip->base = base;
-+ }
-+
- /* these GPIO numbers must not be managed by another gpio_chip */
-- for (id = chip->base; id < chip->base + chip->ngpio; id++) {
-+ for (id = base; id < base + chip->ngpio; id++) {
- if (gpio_desc[id].chip != NULL) {
- status = -EBUSY;
- break;
- }
- }
- if (status == 0) {
-- for (id = chip->base; id < chip->base + chip->ngpio; id++) {
-+ for (id = base; id < base + chip->ngpio; id++) {
- gpio_desc[id].chip = chip;
- gpio_desc[id].flags = 0;
- }
- }
-
-+fail_unlock:
- spin_unlock_irqrestore(&gpio_lock, flags);
- fail:
- /* failures here can mean systems won't boot... */
+++ /dev/null
-From: Anton Vorontsov <avorontsov@ru.mvista.com>
-Date: Mon, 28 Apr 2008 09:14:47 +0000 (-0700)
-Subject: gpiochip_reserve()
-X-Git-Tag: v2.6.26-rc1~847
-X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=169b6a7a6e91e1ea32136681b475cbaf2074bf35
-
-gpiochip_reserve()
-
-Add a new function gpiochip_reserve() to reserve ranges of gpios that platform
-code has pre-allocated. That is, this marks gpio numbers which will be
-claimed by drivers that haven't yet been loaded, and thus are not available
-for dynamic gpio number allocation.
-
-[akpm@linux-foundation.org: remove unneeded __must_check]
-[david-b@pacbell.net: don't export gpiochip_reserve (section fix)]
-Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
-Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
----
-
---- a/drivers/gpio/gpiolib.c
-+++ b/drivers/gpio/gpiolib.c
-@@ -43,6 +43,7 @@ struct gpio_desc {
- /* flag symbols are bit numbers */
- #define FLAG_REQUESTED 0
- #define FLAG_IS_OUT 1
-+#define FLAG_RESERVED 2
-
- #ifdef CONFIG_DEBUG_FS
- const char *label;
-@@ -88,9 +89,10 @@ static int gpiochip_find_base(int ngpio)
- int base = -ENOSPC;
-
- for (i = ARCH_NR_GPIOS - 1; i >= 0 ; i--) {
-- struct gpio_chip *chip = gpio_desc[i].chip;
-+ struct gpio_desc *desc = &gpio_desc[i];
-+ struct gpio_chip *chip = desc->chip;
-
-- if (!chip) {
-+ if (!chip && !test_bit(FLAG_RESERVED, &desc->flags)) {
- spare++;
- if (spare == ngpio) {
- base = i;
-@@ -98,7 +100,8 @@ static int gpiochip_find_base(int ngpio)
- }
- } else {
- spare = 0;
-- i -= chip->ngpio - 1;
-+ if (chip)
-+ i -= chip->ngpio - 1;
- }
- }
-
-@@ -108,6 +111,47 @@ static int gpiochip_find_base(int ngpio)
- }
-
- /**
-+ * gpiochip_reserve() - reserve range of gpios to use with platform code only
-+ * @start: starting gpio number
-+ * @ngpio: number of gpios to reserve
-+ * Context: platform init, potentially before irqs or kmalloc will work
-+ *
-+ * Returns a negative errno if any gpio within the range is already reserved
-+ * or registered, else returns zero as a success code. Use this function
-+ * to mark a range of gpios as unavailable for dynamic gpio number allocation,
-+ * for example because its driver support is not yet loaded.
-+ */
-+int __init gpiochip_reserve(int start, int ngpio)
-+{
-+ int ret = 0;
-+ unsigned long flags;
-+ int i;
-+
-+ if (!gpio_is_valid(start) || !gpio_is_valid(start + ngpio))
-+ return -EINVAL;
-+
-+ spin_lock_irqsave(&gpio_lock, flags);
-+
-+ for (i = start; i < start + ngpio; i++) {
-+ struct gpio_desc *desc = &gpio_desc[i];
-+
-+ if (desc->chip || test_bit(FLAG_RESERVED, &desc->flags)) {
-+ ret = -EBUSY;
-+ goto err;
-+ }
-+
-+ set_bit(FLAG_RESERVED, &desc->flags);
-+ }
-+
-+ pr_debug("%s: reserved gpios from %d to %d\n",
-+ __func__, start, start + ngpio - 1);
-+err:
-+ spin_unlock_irqrestore(&gpio_lock, flags);
-+
-+ return ret;
-+}
-+
-+/**
- * gpiochip_add() - register a gpio_chip
- * @chip: the chip to register, with chip->base initialized
- * Context: potentially before irqs or kmalloc will work
---- a/include/asm-generic/gpio.h
-+++ b/include/asm-generic/gpio.h
-@@ -74,6 +74,7 @@ struct gpio_chip {
-
- extern const char *gpiochip_is_requested(struct gpio_chip *chip,
- unsigned offset);
-+extern int __init __must_check gpiochip_reserve(int start, int ngpio);
-
- /* add/remove chips */
- extern int gpiochip_add(struct gpio_chip *chip);
+++ /dev/null
-From: Trent Piepho <xyzzy@speakeasy.org>
-Date: Fri, 23 May 2008 20:04:44 +0000 (-0700)
-Subject: gpiolib: fix off by one errors
-X-Git-Tag: v2.6.26-rc4~31
-X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=bff5fda972dc23bd1806a47c2098ae173585d013
-
-gpiolib: fix off by one errors
-
-The last gpio belonging to a chip is chip->base + chip->ngpios - 1. Some
-places in the code, but not all, forgot the critical minus one.
-
-Signed-off-by: Trent Piepho <xyzzy@speakeasy.org>
-Acked-by: David Brownell <dbrownell@users.sourceforge.net>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
----
-
---- a/drivers/gpio/gpiolib.c
-+++ b/drivers/gpio/gpiolib.c
-@@ -127,7 +127,7 @@ int __init gpiochip_reserve(int start, i
- unsigned long flags;
- int i;
-
-- if (!gpio_is_valid(start) || !gpio_is_valid(start + ngpio))
-+ if (!gpio_is_valid(start) || !gpio_is_valid(start + ngpio - 1))
- return -EINVAL;
-
- spin_lock_irqsave(&gpio_lock, flags);
-@@ -170,7 +170,7 @@ int gpiochip_add(struct gpio_chip *chip)
- unsigned id;
- int base = chip->base;
-
-- if ((!gpio_is_valid(base) || !gpio_is_valid(base + chip->ngpio))
-+ if ((!gpio_is_valid(base) || !gpio_is_valid(base + chip->ngpio - 1))
- && base >= 0) {
- status = -EINVAL;
- goto fail;
-@@ -207,7 +207,7 @@ fail:
- /* failures here can mean systems won't boot... */
- if (status)
- pr_err("gpiochip_add: gpios %d..%d (%s) not registered\n",
-- chip->base, chip->base + chip->ngpio,
-+ chip->base, chip->base + chip->ngpio - 1,
- chip->label ? : "generic");
- return status;
- }
+++ /dev/null
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -593,3 +593,6 @@ config CRYPTO_LZO
- source "drivers/crypto/Kconfig"
-
- endif # if CRYPTO
-+
-+source "crypto/ocf/Kconfig"
-+
---- a/crypto/Makefile
-+++ b/crypto/Makefile
-@@ -65,6 +65,8 @@ obj-$(CONFIG_CRYPTO_LZO) += lzo.o
-
- obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o
-
-+obj-$(CONFIG_OCF_OCF) += ocf/
-+
- #
- # generic algorithms and the async_tx api
- #
---- a/drivers/char/random.c
-+++ b/drivers/char/random.c
-@@ -129,6 +129,9 @@
- * unsigned int value);
- * void add_interrupt_randomness(int irq);
- *
-+ * void random_input_words(__u32 *buf, size_t wordcount, int ent_count)
-+ * int random_input_wait(void);
-+ *
- * add_input_randomness() uses the input layer interrupt timing, as well as
- * the event type information from the hardware.
- *
-@@ -140,6 +143,13 @@
- * a better measure, since the timing of the disk interrupts are more
- * unpredictable.
- *
-+ * random_input_words() just provides a raw block of entropy to the input
-+ * pool, such as from a hardware entropy generator.
-+ *
-+ * random_input_wait() suspends the caller until such time as the
-+ * entropy pool falls below the write threshold, and returns a count of how
-+ * much entropy (in bits) is needed to sustain the pool.
-+ *
- * All of these routines try to estimate how many bits of randomness a
- * particular randomness source. They do this by keeping track of the
- * first and second order deltas of the event timings.
-@@ -669,6 +679,61 @@ void add_disk_randomness(struct gendisk
- }
- #endif
-
-+/*
-+ * random_input_words - add bulk entropy to pool
-+ *
-+ * @buf: buffer to add
-+ * @wordcount: number of __u32 words to add
-+ * @ent_count: total amount of entropy (in bits) to credit
-+ *
-+ * this provides bulk input of entropy to the input pool
-+ *
-+ */
-+void random_input_words(__u32 *buf, size_t wordcount, int ent_count)
-+{
-+ add_entropy_words(&input_pool, buf, wordcount);
-+
-+ credit_entropy_store(&input_pool, ent_count);
-+
-+ DEBUG_ENT("crediting %d bits => %d\n",
-+ ent_count, input_pool.entropy_count);
-+ /*
-+ * Wake up waiting processes if we have enough
-+ * entropy.
-+ */
-+ if (input_pool.entropy_count >= random_read_wakeup_thresh)
-+ wake_up_interruptible(&random_read_wait);
-+}
-+EXPORT_SYMBOL(random_input_words);
-+
-+/*
-+ * random_input_wait - wait until random needs entropy
-+ *
-+ * this function sleeps until the /dev/random subsystem actually
-+ * needs more entropy, and then return the amount of entropy
-+ * that it would be nice to have added to the system.
-+ */
-+int random_input_wait(void)
-+{
-+ int count;
-+
-+ wait_event_interruptible(random_write_wait,
-+ input_pool.entropy_count < random_write_wakeup_thresh);
-+
-+ count = random_write_wakeup_thresh - input_pool.entropy_count;
-+
-+ /* likely we got woken up due to a signal */
-+ if (count <= 0) count = random_read_wakeup_thresh;
-+
-+ DEBUG_ENT("requesting %d bits from input_wait()er %d<%d\n",
-+ count,
-+ input_pool.entropy_count, random_write_wakeup_thresh);
-+
-+ return count;
-+}
-+EXPORT_SYMBOL(random_input_wait);
-+
-+
- #define EXTRACT_SIZE 10
-
- /*********************************************************************
---- a/fs/fcntl.c
-+++ b/fs/fcntl.c
-@@ -202,6 +202,7 @@ asmlinkage long sys_dup(unsigned int fil
- ret = dupfd(file, 0, 0);
- return ret;
- }
-+EXPORT_SYMBOL(sys_dup);
-
- #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | FASYNC | O_DIRECT | O_NOATIME)
-
---- a/include/linux/miscdevice.h
-+++ b/include/linux/miscdevice.h
-@@ -12,6 +12,7 @@
- #define APOLLO_MOUSE_MINOR 7
- #define PC110PAD_MINOR 9
- /*#define ADB_MOUSE_MINOR 10 FIXME OBSOLETE */
-+#define CRYPTODEV_MINOR 70 /* /dev/crypto */
- #define WATCHDOG_MINOR 130 /* Watchdog timer */
- #define TEMP_MINOR 131 /* Temperature Sensor */
- #define RTC_MINOR 135
---- a/include/linux/random.h
-+++ b/include/linux/random.h
-@@ -8,6 +8,7 @@
- #define _LINUX_RANDOM_H
-
- #include <linux/ioctl.h>
-+#include <linux/types.h> /* for __u32 in user space */
-
- /* ioctl()'s for the random number generator */
-
-@@ -32,6 +33,30 @@
- /* Clear the entropy pool and associated counters. (Superuser only.) */
- #define RNDCLEARPOOL _IO( 'R', 0x06 )
-
-+#ifdef CONFIG_FIPS_RNG
-+
-+/* Size of seed value - equal to AES blocksize */
-+#define AES_BLOCK_SIZE_BYTES 16
-+#define SEED_SIZE_BYTES AES_BLOCK_SIZE_BYTES
-+/* Size of AES key */
-+#define KEY_SIZE_BYTES 16
-+
-+/* ioctl() structure used by FIPS 140-2 Tests */
-+struct rand_fips_test {
-+ unsigned char key[KEY_SIZE_BYTES]; /* Input */
-+ unsigned char datetime[SEED_SIZE_BYTES]; /* Input */
-+ unsigned char seed[SEED_SIZE_BYTES]; /* Input */
-+ unsigned char result[SEED_SIZE_BYTES]; /* Output */
-+};
-+
-+/* FIPS 140-2 RNG Variable Seed Test. (Superuser only.) */
-+#define RNDFIPSVST _IOWR('R', 0x10, struct rand_fips_test)
-+
-+/* FIPS 140-2 RNG Monte Carlo Test. (Superuser only.) */
-+#define RNDFIPSMCT _IOWR('R', 0x11, struct rand_fips_test)
-+
-+#endif /* #ifdef CONFIG_FIPS_RNG */
-+
- struct rand_pool_info {
- int entropy_count;
- int buf_size;
-@@ -48,6 +73,10 @@ extern void add_input_randomness(unsigne
- unsigned int value);
- extern void add_interrupt_randomness(int irq);
-
-+extern void random_input_words(__u32 *buf, size_t wordcount, int ent_count);
-+extern int random_input_wait(void);
-+#define HAS_RANDOM_INPUT_WAIT 1
-+
- extern void get_random_bytes(void *buf, int nbytes);
- void generate_random_uuid(unsigned char uuid_out[16]);
-
+++ /dev/null
---- a/crypto/ocf/cryptosoft.c
-+++ b/crypto/ocf/cryptosoft.c
-@@ -47,7 +47,7 @@
- #include <linux/mm.h>
- #include <linux/skbuff.h>
- #include <linux/random.h>
--#include <asm/scatterlist.h>
-+#include <linux/scatterlist.h>
-
- #include <cryptodev.h>
- #include <uio.h>
+++ /dev/null
---- a/drivers/usb/serial/sierra.c
-+++ b/drivers/usb/serial/sierra.c
-@@ -166,14 +166,19 @@ static struct usb_device_id id_table []
- { USB_DEVICE(0x1199, 0x6815) }, /* Sierra Wireless MC8775 */
- { USB_DEVICE(0x03f0, 0x1e1d) }, /* HP hs2300 a.k.a MC8775 */
- { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */
-+ { USB_DEVICE(0x1199, 0x6821) }, /* Sierra Wireless AirCard 875U */
- { USB_DEVICE(0x1199, 0x6832) }, /* Sierra Wireless MC8780*/
- { USB_DEVICE(0x1199, 0x6833) }, /* Sierra Wireless MC8781*/
-+ { USB_DEVICE(0x1199, 0x683B), .driver_info = DEVICE_1_PORT }, /* Sierra Wireless MC8785 Composite*/
-+ { USB_DEVICE(0x1199, 0x683C), .driver_info = DEVICE_1_PORT }, /* Sierra Wireless MC8790 Composite*/
- { USB_DEVICE(0x1199, 0x6850) }, /* Sierra Wireless AirCard 880 */
- { USB_DEVICE(0x1199, 0x6851) }, /* Sierra Wireless AirCard 881 */
- { USB_DEVICE(0x1199, 0x6852) }, /* Sierra Wireless AirCard 880 E */
- { USB_DEVICE(0x1199, 0x6853) }, /* Sierra Wireless AirCard 881 E */
- { USB_DEVICE(0x1199, 0x6855) }, /* Sierra Wireless AirCard 880 U */
- { USB_DEVICE(0x1199, 0x6856) }, /* Sierra Wireless AirCard 881 U */
-+ { USB_DEVICE(0x1199, 0x6859), .driver_info = DEVICE_1_PORT }, /* Sierra Wireless AirCard 885 E */
-+ { USB_DEVICE(0x1199, 0x685A), .driver_info = DEVICE_1_PORT }, /* Sierra Wireless AirCard 885 E */
-
- { USB_DEVICE(0x1199, 0x6468) }, /* Sierra Wireless MP3G - EVDO */
- { USB_DEVICE(0x1199, 0x6469) }, /* Sierra Wireless MP3G - UMTS/HSPA */
+++ /dev/null
---- a/init/main.c
-+++ b/init/main.c
-@@ -797,10 +797,7 @@ static int noinline init_post(void)
- printk(KERN_WARNING "Failed to execute %s. Attempting "
- "defaults...\n", execute_command);
- }
-- run_init_process("/sbin/init");
-- run_init_process("/etc/init");
-- run_init_process("/bin/init");
-- run_init_process("/bin/sh");
-+ run_init_process("/etc/preinit");
-
- panic("No init found. Try passing init= option to kernel.");
- }
+++ /dev/null
-From 6c4419d997d4431bb62e73475cd6b084e83efbd1 Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Tue, 22 Sep 2009 19:25:24 +0100
-Subject: [PATCH] Squashfs: move zlib decompression wrapper code into a separate file
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/Makefile | 2 +-
- fs/squashfs/block.c | 74 ++----------------------------
- fs/squashfs/squashfs.h | 4 ++
- fs/squashfs/zlib_wrapper.c | 109 ++++++++++++++++++++++++++++++++++++++++++++
- 4 files changed, 118 insertions(+), 71 deletions(-)
- create mode 100644 fs/squashfs/zlib_wrapper.c
-
---- a/fs/squashfs/Makefile
-+++ b/fs/squashfs/Makefile
-@@ -4,4 +4,4 @@
-
- obj-$(CONFIG_SQUASHFS) += squashfs.o
- squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
--squashfs-y += namei.o super.o symlink.o
-+squashfs-y += namei.o super.o symlink.o zlib_wrapper.o
---- a/fs/squashfs/block.c
-+++ b/fs/squashfs/block.c
-@@ -29,7 +29,6 @@
- #include <linux/fs.h>
- #include <linux/vfs.h>
- #include <linux/slab.h>
--#include <linux/mutex.h>
- #include <linux/string.h>
- #include <linux/buffer_head.h>
- #include <linux/zlib.h>
-@@ -153,72 +152,10 @@ int squashfs_read_data(struct super_bloc
- }
-
- if (compressed) {
-- int zlib_err = 0, zlib_init = 0;
--
-- /*
-- * Uncompress block.
-- */
--
-- mutex_lock(&msblk->read_data_mutex);
--
-- msblk->stream.avail_out = 0;
-- msblk->stream.avail_in = 0;
--
-- bytes = length;
-- do {
-- if (msblk->stream.avail_in == 0 && k < b) {
-- avail = min(bytes, msblk->devblksize - offset);
-- bytes -= avail;
-- wait_on_buffer(bh[k]);
-- if (!buffer_uptodate(bh[k]))
-- goto release_mutex;
--
-- if (avail == 0) {
-- offset = 0;
-- put_bh(bh[k++]);
-- continue;
-- }
--
-- msblk->stream.next_in = bh[k]->b_data + offset;
-- msblk->stream.avail_in = avail;
-- offset = 0;
-- }
--
-- if (msblk->stream.avail_out == 0 && page < pages) {
-- msblk->stream.next_out = buffer[page++];
-- msblk->stream.avail_out = PAGE_CACHE_SIZE;
-- }
--
-- if (!zlib_init) {
-- zlib_err = zlib_inflateInit(&msblk->stream);
-- if (zlib_err != Z_OK) {
-- ERROR("zlib_inflateInit returned"
-- " unexpected result 0x%x,"
-- " srclength %d\n", zlib_err,
-- srclength);
-- goto release_mutex;
-- }
-- zlib_init = 1;
-- }
--
-- zlib_err = zlib_inflate(&msblk->stream, Z_SYNC_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");
-- goto release_mutex;
-- }
--
-- zlib_err = zlib_inflateEnd(&msblk->stream);
-- if (zlib_err != Z_OK) {
-- ERROR("zlib_inflate error, data probably corrupt\n");
-- goto release_mutex;
-- }
-- length = msblk->stream.total_out;
-- mutex_unlock(&msblk->read_data_mutex);
-+ length = zlib_uncompress(msblk, buffer, bh, b, offset, length,
-+ srclength, pages);
-+ if (length < 0)
-+ goto read_failure;
- } else {
- /*
- * Block is uncompressed.
-@@ -255,9 +192,6 @@ int squashfs_read_data(struct super_bloc
- kfree(bh);
- return length;
-
--release_mutex:
-- mutex_unlock(&msblk->read_data_mutex);
--
- block_release:
- for (; k < b; k++)
- put_bh(bh[k]);
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -70,6 +70,10 @@ extern struct inode *squashfs_iget(struc
- unsigned int);
- extern int squashfs_read_inode(struct inode *, long long);
-
-+/* zlib_wrapper.c */
-+extern int zlib_uncompress(struct squashfs_sb_info *, void **,
-+ struct buffer_head **, int, int, int, int, int);
-+
- /*
- * Inodes and files operations
- */
---- /dev/null
-+++ b/fs/squashfs/zlib_wrapper.c
-@@ -0,0 +1,109 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-+ * Phillip Lougher <phillip@lougher.demon.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,
-+ * 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+ *
-+ * zlib_wrapper.c
-+ */
-+
-+
-+#include <linux/mutex.h>
-+#include <linux/buffer_head.h>
-+#include <linux/zlib.h>
-+
-+#include "squashfs_fs.h"
-+#include "squashfs_fs_sb.h"
-+#include "squashfs_fs_i.h"
-+#include "squashfs.h"
-+
-+int zlib_uncompress(struct squashfs_sb_info *msblk, void **buffer,
-+ struct buffer_head **bh, int b, int offset, int length, int srclength,
-+ int pages)
-+{
-+ int zlib_err = 0, zlib_init = 0;
-+ int avail, bytes, k = 0, page = 0;
-+
-+ mutex_lock(&msblk->read_data_mutex);
-+
-+ msblk->stream.avail_out = 0;
-+ msblk->stream.avail_in = 0;
-+
-+ bytes = length;
-+ do {
-+ if (msblk->stream.avail_in == 0 && k < b) {
-+ avail = min(bytes, msblk->devblksize - offset);
-+ bytes -= avail;
-+ wait_on_buffer(bh[k]);
-+ if (!buffer_uptodate(bh[k]))
-+ goto release_mutex;
-+
-+ if (avail == 0) {
-+ offset = 0;
-+ put_bh(bh[k++]);
-+ continue;
-+ }
-+
-+ msblk->stream.next_in = bh[k]->b_data + offset;
-+ msblk->stream.avail_in = avail;
-+ offset = 0;
-+ }
-+
-+ if (msblk->stream.avail_out == 0 && page < pages) {
-+ msblk->stream.next_out = buffer[page++];
-+ msblk->stream.avail_out = PAGE_CACHE_SIZE;
-+ }
-+
-+ if (!zlib_init) {
-+ zlib_err = zlib_inflateInit(&msblk->stream);
-+ if (zlib_err != Z_OK) {
-+ ERROR("zlib_inflateInit returned unexpected "
-+ "result 0x%x, srclength %d\n",
-+ zlib_err, srclength);
-+ goto release_mutex;
-+ }
-+ zlib_init = 1;
-+ }
-+
-+ zlib_err = zlib_inflate(&msblk->stream, Z_SYNC_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");
-+ goto release_mutex;
-+ }
-+
-+ zlib_err = zlib_inflateEnd(&msblk->stream);
-+ if (zlib_err != Z_OK) {
-+ ERROR("zlib_inflate error, data probably corrupt\n");
-+ goto release_mutex;
-+ }
-+
-+ mutex_unlock(&msblk->read_data_mutex);
-+ return msblk->stream.total_out;
-+
-+release_mutex:
-+ mutex_unlock(&msblk->read_data_mutex);
-+
-+ for (; k < b; k++)
-+ put_bh(bh[k]);
-+
-+ return -EIO;
-+}
+++ /dev/null
-From 37c44e85fd49676ec15ccaeea065662c1fbcda7d Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Wed, 23 Sep 2009 19:04:49 +0100
-Subject: [PATCH] Squashfs: Factor out remaining zlib dependencies into separate wrapper file
-
-Move zlib buffer init/destroy code into separate wrapper file. Also
-make zlib z_stream field a void * removing the need to include zlib.h
-for most files.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/block.c | 1 -
- fs/squashfs/cache.c | 1 -
- fs/squashfs/dir.c | 1 -
- fs/squashfs/export.c | 1 -
- fs/squashfs/file.c | 1 -
- fs/squashfs/fragment.c | 1 -
- fs/squashfs/id.c | 1 -
- fs/squashfs/inode.c | 1 -
- fs/squashfs/namei.c | 1 -
- fs/squashfs/squashfs.h | 2 +
- fs/squashfs/squashfs_fs_sb.h | 2 +-
- fs/squashfs/super.c | 14 +++------
- fs/squashfs/symlink.c | 1 -
- fs/squashfs/zlib_wrapper.c | 56 ++++++++++++++++++++++++++++++++---------
- 14 files changed, 51 insertions(+), 33 deletions(-)
-
---- a/fs/squashfs/block.c
-+++ b/fs/squashfs/block.c
-@@ -31,7 +31,6 @@
- #include <linux/slab.h>
- #include <linux/string.h>
- #include <linux/buffer_head.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/cache.c
-+++ b/fs/squashfs/cache.c
-@@ -51,7 +51,6 @@
- #include <linux/sched.h>
- #include <linux/spinlock.h>
- #include <linux/wait.h>
--#include <linux/zlib.h>
- #include <linux/pagemap.h>
-
- #include "squashfs_fs.h"
---- a/fs/squashfs/dir.c
-+++ b/fs/squashfs/dir.c
-@@ -30,7 +30,6 @@
- #include <linux/fs.h>
- #include <linux/vfs.h>
- #include <linux/slab.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/export.c
-+++ b/fs/squashfs/export.c
-@@ -39,7 +39,6 @@
- #include <linux/vfs.h>
- #include <linux/dcache.h>
- #include <linux/exportfs.h>
--#include <linux/zlib.h>
- #include <linux/slab.h>
-
- #include "squashfs_fs.h"
---- a/fs/squashfs/file.c
-+++ b/fs/squashfs/file.c
-@@ -47,7 +47,6 @@
- #include <linux/string.h>
- #include <linux/pagemap.h>
- #include <linux/mutex.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/fragment.c
-+++ b/fs/squashfs/fragment.c
-@@ -36,7 +36,6 @@
- #include <linux/fs.h>
- #include <linux/vfs.h>
- #include <linux/slab.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/id.c
-+++ b/fs/squashfs/id.c
-@@ -34,7 +34,6 @@
- #include <linux/fs.h>
- #include <linux/vfs.h>
- #include <linux/slab.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/inode.c
-+++ b/fs/squashfs/inode.c
-@@ -40,7 +40,6 @@
-
- #include <linux/fs.h>
- #include <linux/vfs.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/namei.c
-+++ b/fs/squashfs/namei.c
-@@ -57,7 +57,6 @@
- #include <linux/slab.h>
- #include <linux/string.h>
- #include <linux/dcache.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -71,6 +71,8 @@ extern struct inode *squashfs_iget(struc
- extern int squashfs_read_inode(struct inode *, long long);
-
- /* zlib_wrapper.c */
-+extern void *zlib_init(void);
-+extern void zlib_free(void *);
- extern int zlib_uncompress(struct squashfs_sb_info *, void **,
- struct buffer_head **, int, int, int, int, int);
-
---- a/fs/squashfs/squashfs_fs_sb.h
-+++ b/fs/squashfs/squashfs_fs_sb.h
-@@ -64,7 +64,7 @@ struct squashfs_sb_info {
- struct mutex read_data_mutex;
- struct mutex meta_index_mutex;
- struct meta_index *meta_index;
-- z_stream stream;
-+ void *stream;
- __le64 *inode_lookup_table;
- u64 inode_table;
- u64 directory_table;
---- a/fs/squashfs/super.c
-+++ b/fs/squashfs/super.c
-@@ -35,7 +35,6 @@
- #include <linux/pagemap.h>
- #include <linux/init.h>
- #include <linux/module.h>
--#include <linux/zlib.h>
- #include <linux/magic.h>
-
- #include "squashfs_fs.h"
-@@ -87,12 +86,9 @@ static int squashfs_fill_super(struct su
- }
- msblk = sb->s_fs_info;
-
-- msblk->stream.workspace = kmalloc(zlib_inflate_workspacesize(),
-- GFP_KERNEL);
-- if (msblk->stream.workspace == NULL) {
-- ERROR("Failed to allocate zlib workspace\n");
-+ msblk->stream = zlib_init();
-+ if (msblk->stream == NULL)
- goto failure;
-- }
-
- sblk = kzalloc(sizeof(*sblk), GFP_KERNEL);
- if (sblk == NULL) {
-@@ -292,17 +288,17 @@ failed_mount:
- squashfs_cache_delete(msblk->block_cache);
- squashfs_cache_delete(msblk->fragment_cache);
- squashfs_cache_delete(msblk->read_page);
-+ zlib_free(msblk->stream);
- kfree(msblk->inode_lookup_table);
- kfree(msblk->fragment_index);
- kfree(msblk->id_table);
-- kfree(msblk->stream.workspace);
- kfree(sb->s_fs_info);
- sb->s_fs_info = NULL;
- kfree(sblk);
- return err;
-
- failure:
-- kfree(msblk->stream.workspace);
-+ zlib_free(msblk->stream);
- kfree(sb->s_fs_info);
- sb->s_fs_info = NULL;
- return -ENOMEM;
-@@ -346,10 +342,10 @@ static void squashfs_put_super(struct su
- squashfs_cache_delete(sbi->block_cache);
- squashfs_cache_delete(sbi->fragment_cache);
- squashfs_cache_delete(sbi->read_page);
-+ zlib_free(sbi->stream);
- kfree(sbi->id_table);
- kfree(sbi->fragment_index);
- kfree(sbi->meta_index);
-- kfree(sbi->stream.workspace);
- kfree(sb->s_fs_info);
- sb->s_fs_info = NULL;
- }
---- a/fs/squashfs/symlink.c
-+++ b/fs/squashfs/symlink.c
-@@ -36,7 +36,6 @@
- #include <linux/slab.h>
- #include <linux/string.h>
- #include <linux/pagemap.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/zlib_wrapper.c
-+++ b/fs/squashfs/zlib_wrapper.c
-@@ -31,21 +31,51 @@
- #include "squashfs_fs_i.h"
- #include "squashfs.h"
-
-+void *zlib_init()
-+{
-+ z_stream *stream = kmalloc(sizeof(z_stream), GFP_KERNEL);
-+ if (stream == NULL)
-+ goto failed;
-+ stream->workspace = kmalloc(zlib_inflate_workspacesize(),
-+ GFP_KERNEL);
-+ if (stream->workspace == NULL)
-+ goto failed;
-+
-+ return stream;
-+
-+failed:
-+ ERROR("Failed to allocate zlib workspace\n");
-+ kfree(stream);
-+ return NULL;
-+}
-+
-+
-+void zlib_free(void *strm)
-+{
-+ z_stream *stream = strm;
-+
-+ if (stream)
-+ kfree(stream->workspace);
-+ kfree(stream);
-+}
-+
-+
- int zlib_uncompress(struct squashfs_sb_info *msblk, void **buffer,
- struct buffer_head **bh, int b, int offset, int length, int srclength,
- int pages)
- {
- int zlib_err = 0, zlib_init = 0;
- int avail, bytes, k = 0, page = 0;
-+ z_stream *stream = msblk->stream;
-
- mutex_lock(&msblk->read_data_mutex);
-
-- msblk->stream.avail_out = 0;
-- msblk->stream.avail_in = 0;
-+ stream->avail_out = 0;
-+ stream->avail_in = 0;
-
- bytes = length;
- do {
-- if (msblk->stream.avail_in == 0 && k < b) {
-+ if (stream->avail_in == 0 && k < b) {
- avail = min(bytes, msblk->devblksize - offset);
- bytes -= avail;
- wait_on_buffer(bh[k]);
-@@ -58,18 +88,18 @@ int zlib_uncompress(struct squashfs_sb_i
- continue;
- }
-
-- msblk->stream.next_in = bh[k]->b_data + offset;
-- msblk->stream.avail_in = avail;
-+ stream->next_in = bh[k]->b_data + offset;
-+ stream->avail_in = avail;
- offset = 0;
- }
-
-- if (msblk->stream.avail_out == 0 && page < pages) {
-- msblk->stream.next_out = buffer[page++];
-- msblk->stream.avail_out = PAGE_CACHE_SIZE;
-+ if (stream->avail_out == 0 && page < pages) {
-+ stream->next_out = buffer[page++];
-+ stream->avail_out = PAGE_CACHE_SIZE;
- }
-
- if (!zlib_init) {
-- zlib_err = zlib_inflateInit(&msblk->stream);
-+ zlib_err = zlib_inflateInit(stream);
- if (zlib_err != Z_OK) {
- ERROR("zlib_inflateInit returned unexpected "
- "result 0x%x, srclength %d\n",
-@@ -79,9 +109,9 @@ int zlib_uncompress(struct squashfs_sb_i
- zlib_init = 1;
- }
-
-- zlib_err = zlib_inflate(&msblk->stream, Z_SYNC_FLUSH);
-+ zlib_err = zlib_inflate(stream, Z_SYNC_FLUSH);
-
-- if (msblk->stream.avail_in == 0 && k < b)
-+ if (stream->avail_in == 0 && k < b)
- put_bh(bh[k++]);
- } while (zlib_err == Z_OK);
-
-@@ -90,14 +120,14 @@ int zlib_uncompress(struct squashfs_sb_i
- goto release_mutex;
- }
-
-- zlib_err = zlib_inflateEnd(&msblk->stream);
-+ zlib_err = zlib_inflateEnd(stream);
- if (zlib_err != Z_OK) {
- ERROR("zlib_inflate error, data probably corrupt\n");
- goto release_mutex;
- }
-
- mutex_unlock(&msblk->read_data_mutex);
-- return msblk->stream.total_out;
-+ return stream->total_out;
-
- release_mutex:
- mutex_unlock(&msblk->read_data_mutex);
+++ /dev/null
-From 327fbf47a419befc6bff74f3ca42d2b6f0841903 Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Tue, 6 Oct 2009 04:04:15 +0100
-Subject: [PATCH] Squashfs: add a decompressor framework
-
-This adds a decompressor framework which allows multiple compression
-algorithms to be cleanly supported.
-
-Also update zlib wrapper and other code to use the new framework.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/Makefile | 2 +-
- fs/squashfs/block.c | 6 ++--
- fs/squashfs/decompressor.c | 58 ++++++++++++++++++++++++++++++++++++++++++
- fs/squashfs/decompressor.h | 55 +++++++++++++++++++++++++++++++++++++++
- fs/squashfs/squashfs.h | 14 +++++-----
- fs/squashfs/squashfs_fs_sb.h | 41 +++++++++++++++--------------
- fs/squashfs/super.c | 45 ++++++++++++++++++-------------
- fs/squashfs/zlib_wrapper.c | 17 ++++++++++--
- 8 files changed, 185 insertions(+), 53 deletions(-)
- create mode 100644 fs/squashfs/decompressor.c
- create mode 100644 fs/squashfs/decompressor.h
-
---- a/fs/squashfs/Makefile
-+++ b/fs/squashfs/Makefile
-@@ -4,4 +4,4 @@
-
- obj-$(CONFIG_SQUASHFS) += squashfs.o
- squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
--squashfs-y += namei.o super.o symlink.o zlib_wrapper.o
-+squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o
---- a/fs/squashfs/block.c
-+++ b/fs/squashfs/block.c
-@@ -36,7 +36,7 @@
- #include "squashfs_fs_sb.h"
- #include "squashfs_fs_i.h"
- #include "squashfs.h"
--
-+#include "decompressor.h"
- /*
- * Read the metadata block length, this is stored in the first two
- * bytes of the metadata block.
-@@ -151,8 +151,8 @@ int squashfs_read_data(struct super_bloc
- }
-
- if (compressed) {
-- length = zlib_uncompress(msblk, buffer, bh, b, offset, length,
-- srclength, pages);
-+ length = squashfs_decompress(msblk, buffer, bh, b, offset,
-+ length, srclength, pages);
- if (length < 0)
- goto read_failure;
- } else {
---- /dev/null
-+++ b/fs/squashfs/decompressor.c
-@@ -0,0 +1,58 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-+ * Phillip Lougher <phillip@lougher.demon.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,
-+ * 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+ *
-+ * decompressor.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/mutex.h>
-+#include <linux/buffer_head.h>
-+
-+#include "squashfs_fs.h"
-+#include "squashfs_fs_sb.h"
-+#include "squashfs_fs_i.h"
-+#include "decompressor.h"
-+#include "squashfs.h"
-+
-+/*
-+ * This file (and decompressor.h) implements a decompressor framework for
-+ * Squashfs, allowing multiple decompressors to be easily supported
-+ */
-+
-+static const struct squashfs_decompressor squashfs_unknown_comp_ops = {
-+ NULL, NULL, NULL, 0, "unknown", 0
-+};
-+
-+static const struct squashfs_decompressor *decompressor[] = {
-+ &squashfs_zlib_comp_ops,
-+ &squashfs_unknown_comp_ops
-+};
-+
-+
-+const struct squashfs_decompressor *squashfs_lookup_decompressor(int id)
-+{
-+ int i;
-+
-+ for (i = 0; decompressor[i]->id; i++)
-+ if (id == decompressor[i]->id)
-+ break;
-+
-+ return decompressor[i];
-+}
---- /dev/null
-+++ b/fs/squashfs/decompressor.h
-@@ -0,0 +1,55 @@
-+#ifndef DECOMPRESSOR_H
-+#define DECOMPRESSOR_H
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-+ * Phillip Lougher <phillip@lougher.demon.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,
-+ * 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+ *
-+ * decompressor.h
-+ */
-+
-+struct squashfs_decompressor {
-+ void *(*init)(void);
-+ void (*free)(void *);
-+ int (*decompress)(struct squashfs_sb_info *, void **,
-+ struct buffer_head **, int, int, int, int, int);
-+ int id;
-+ char *name;
-+ int supported;
-+};
-+
-+static inline void *squashfs_decompressor_init(struct squashfs_sb_info *msblk)
-+{
-+ return msblk->decompressor->init();
-+}
-+
-+static inline void squashfs_decompressor_free(struct squashfs_sb_info *msblk,
-+ void *s)
-+{
-+ if (msblk->decompressor)
-+ msblk->decompressor->free(s);
-+}
-+
-+static inline int squashfs_decompress(struct squashfs_sb_info *msblk,
-+ void **buffer, struct buffer_head **bh, int b, int offset, int length,
-+ int srclength, int pages)
-+{
-+ return msblk->decompressor->decompress(msblk, buffer, bh, b, offset,
-+ length, srclength, pages);
-+}
-+#endif
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -51,6 +51,9 @@ extern struct squashfs_cache_entry *squa
- u64, int);
- extern int squashfs_read_table(struct super_block *, void *, u64, int);
-
-+/* decompressor.c */
-+extern const struct squashfs_decompressor *squashfs_lookup_decompressor(int);
-+
- /* export.c */
- extern __le64 *squashfs_read_inode_lookup_table(struct super_block *, u64,
- unsigned int);
-@@ -70,14 +73,8 @@ extern struct inode *squashfs_iget(struc
- unsigned int);
- extern int squashfs_read_inode(struct inode *, long long);
-
--/* zlib_wrapper.c */
--extern void *zlib_init(void);
--extern void zlib_free(void *);
--extern int zlib_uncompress(struct squashfs_sb_info *, void **,
-- struct buffer_head **, int, int, int, int, int);
--
- /*
-- * Inodes and files operations
-+ * Inodes, files and decompressor operations
- */
-
- /* dir.c */
-@@ -94,3 +91,6 @@ extern const struct inode_operations squ
-
- /* symlink.c */
- extern const struct address_space_operations squashfs_symlink_aops;
-+
-+/* zlib_wrapper.c */
-+extern const struct squashfs_decompressor squashfs_zlib_comp_ops;
---- a/fs/squashfs/squashfs_fs_sb.h
-+++ b/fs/squashfs/squashfs_fs_sb.h
-@@ -52,25 +52,26 @@ struct squashfs_cache_entry {
- };
-
- struct squashfs_sb_info {
-- int devblksize;
-- int devblksize_log2;
-- struct squashfs_cache *block_cache;
-- struct squashfs_cache *fragment_cache;
-- struct squashfs_cache *read_page;
-- int next_meta_index;
-- __le64 *id_table;
-- __le64 *fragment_index;
-- unsigned int *fragment_index_2;
-- struct mutex read_data_mutex;
-- struct mutex meta_index_mutex;
-- struct meta_index *meta_index;
-- void *stream;
-- __le64 *inode_lookup_table;
-- u64 inode_table;
-- u64 directory_table;
-- unsigned int block_size;
-- unsigned short block_log;
-- long long bytes_used;
-- unsigned int inodes;
-+ const struct squashfs_decompressor *decompressor;
-+ int devblksize;
-+ int devblksize_log2;
-+ struct squashfs_cache *block_cache;
-+ struct squashfs_cache *fragment_cache;
-+ struct squashfs_cache *read_page;
-+ int next_meta_index;
-+ __le64 *id_table;
-+ __le64 *fragment_index;
-+ unsigned int *fragment_index_2;
-+ struct mutex read_data_mutex;
-+ struct mutex meta_index_mutex;
-+ struct meta_index *meta_index;
-+ void *stream;
-+ __le64 *inode_lookup_table;
-+ u64 inode_table;
-+ u64 directory_table;
-+ unsigned int block_size;
-+ unsigned short block_log;
-+ long long bytes_used;
-+ unsigned int inodes;
- };
- #endif
---- a/fs/squashfs/super.c
-+++ b/fs/squashfs/super.c
-@@ -41,27 +41,35 @@
- #include "squashfs_fs_sb.h"
- #include "squashfs_fs_i.h"
- #include "squashfs.h"
-+#include "decompressor.h"
-
- static struct file_system_type squashfs_fs_type;
- static struct super_operations squashfs_super_ops;
-
--static int supported_squashfs_filesystem(short major, short minor, short comp)
-+static const struct squashfs_decompressor *supported_squashfs_filesystem(short
-+ major, short minor, short id)
- {
-+ const struct squashfs_decompressor *decompressor;
-+
- if (major < SQUASHFS_MAJOR) {
- ERROR("Major/Minor mismatch, older Squashfs %d.%d "
- "filesystems are unsupported\n", major, minor);
-- return -EINVAL;
-+ return NULL;
- } else if (major > SQUASHFS_MAJOR || minor > SQUASHFS_MINOR) {
- ERROR("Major/Minor mismatch, trying to mount newer "
- "%d.%d filesystem\n", major, minor);
- ERROR("Please update your kernel\n");
-- return -EINVAL;
-+ return NULL;
- }
-
-- if (comp != ZLIB_COMPRESSION)
-- return -EINVAL;
-+ decompressor = squashfs_lookup_decompressor(id);
-+ if (!decompressor->supported) {
-+ ERROR("Filesystem uses \"%s\" compression. This is not "
-+ "supported\n", decompressor->name);
-+ return NULL;
-+ }
-
-- return 0;
-+ return decompressor;
- }
-
-
-@@ -86,10 +94,6 @@ static int squashfs_fill_super(struct su
- }
- msblk = sb->s_fs_info;
-
-- msblk->stream = zlib_init();
-- if (msblk->stream == NULL)
-- goto failure;
--
- sblk = kzalloc(sizeof(*sblk), GFP_KERNEL);
- if (sblk == NULL) {
- ERROR("Failed to allocate squashfs_super_block\n");
-@@ -116,25 +120,25 @@ static int squashfs_fill_super(struct su
- goto failed_mount;
- }
-
-+ err = -EINVAL;
-+
- /* Check it is a SQUASHFS superblock */
- sb->s_magic = le32_to_cpu(sblk->s_magic);
- if (sb->s_magic != SQUASHFS_MAGIC) {
- if (!silent)
- ERROR("Can't find a SQUASHFS superblock on %s\n",
- bdevname(sb->s_bdev, b));
-- err = -EINVAL;
- goto failed_mount;
- }
-
-- /* Check the MAJOR & MINOR versions and compression type */
-- err = supported_squashfs_filesystem(le16_to_cpu(sblk->s_major),
-+ /* Check the MAJOR & MINOR versions and lookup compression type */
-+ msblk->decompressor = supported_squashfs_filesystem(
-+ le16_to_cpu(sblk->s_major),
- le16_to_cpu(sblk->s_minor),
- le16_to_cpu(sblk->compression));
-- if (err < 0)
-+ if (msblk->decompressor == NULL)
- goto failed_mount;
-
-- err = -EINVAL;
--
- /*
- * Check if there's xattrs in the filesystem. These are not
- * supported in this version, so warn that they will be ignored.
-@@ -201,6 +205,10 @@ static int squashfs_fill_super(struct su
-
- err = -ENOMEM;
-
-+ msblk->stream = squashfs_decompressor_init(msblk);
-+ if (msblk->stream == NULL)
-+ goto failed_mount;
-+
- msblk->block_cache = squashfs_cache_init("metadata",
- SQUASHFS_CACHED_BLKS, SQUASHFS_METADATA_SIZE);
- if (msblk->block_cache == NULL)
-@@ -288,7 +296,7 @@ failed_mount:
- squashfs_cache_delete(msblk->block_cache);
- squashfs_cache_delete(msblk->fragment_cache);
- squashfs_cache_delete(msblk->read_page);
-- zlib_free(msblk->stream);
-+ squashfs_decompressor_free(msblk, msblk->stream);
- kfree(msblk->inode_lookup_table);
- kfree(msblk->fragment_index);
- kfree(msblk->id_table);
-@@ -298,7 +306,6 @@ failed_mount:
- return err;
-
- failure:
-- zlib_free(msblk->stream);
- kfree(sb->s_fs_info);
- sb->s_fs_info = NULL;
- return -ENOMEM;
-@@ -342,7 +349,7 @@ static void squashfs_put_super(struct su
- squashfs_cache_delete(sbi->block_cache);
- squashfs_cache_delete(sbi->fragment_cache);
- squashfs_cache_delete(sbi->read_page);
-- zlib_free(sbi->stream);
-+ squashfs_decompressor_free(sbi, sbi->stream);
- kfree(sbi->id_table);
- kfree(sbi->fragment_index);
- kfree(sbi->meta_index);
---- a/fs/squashfs/zlib_wrapper.c
-+++ b/fs/squashfs/zlib_wrapper.c
-@@ -30,8 +30,9 @@
- #include "squashfs_fs_sb.h"
- #include "squashfs_fs_i.h"
- #include "squashfs.h"
-+#include "decompressor.h"
-
--void *zlib_init()
-+static void *zlib_init(void)
- {
- z_stream *stream = kmalloc(sizeof(z_stream), GFP_KERNEL);
- if (stream == NULL)
-@@ -50,7 +51,7 @@ failed:
- }
-
-
--void zlib_free(void *strm)
-+static void zlib_free(void *strm)
- {
- z_stream *stream = strm;
-
-@@ -60,7 +61,7 @@ void zlib_free(void *strm)
- }
-
-
--int zlib_uncompress(struct squashfs_sb_info *msblk, void **buffer,
-+static int zlib_uncompress(struct squashfs_sb_info *msblk, void **buffer,
- struct buffer_head **bh, int b, int offset, int length, int srclength,
- int pages)
- {
-@@ -137,3 +138,13 @@ release_mutex:
-
- return -EIO;
- }
-+
-+const struct squashfs_decompressor squashfs_zlib_comp_ops = {
-+ .init = zlib_init,
-+ .free = zlib_free,
-+ .decompress = zlib_uncompress,
-+ .id = ZLIB_COMPRESSION,
-+ .name = "zlib",
-+ .supported = 1
-+};
-+
+++ /dev/null
-From 1885ca0a1973944684f252094a703b7c80dfc974 Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Wed, 14 Oct 2009 03:58:11 +0100
-Subject: [PATCH] Squashfs: add decompressor entries for lzma and lzo
-
-Add knowledge of lzma/lzo compression formats to the decompressor
-framework. For now these are added as unsupported. Without
-these entries lzma/lzo compressed filesystems will be flagged as
-having unknown compression which is undesirable.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/decompressor.c | 10 ++++++++++
- fs/squashfs/squashfs_fs.h | 4 +++-
- 2 files changed, 13 insertions(+), 1 deletions(-)
-
---- a/fs/squashfs/decompressor.c
-+++ b/fs/squashfs/decompressor.c
-@@ -36,12 +36,22 @@
- * Squashfs, allowing multiple decompressors to be easily supported
- */
-
-+static const struct squashfs_decompressor squashfs_lzma_unsupported_comp_ops = {
-+ NULL, NULL, NULL, LZMA_COMPRESSION, "lzma", 0
-+};
-+
-+static const struct squashfs_decompressor squashfs_lzo_unsupported_comp_ops = {
-+ NULL, NULL, NULL, LZO_COMPRESSION, "lzo", 0
-+};
-+
- static const struct squashfs_decompressor squashfs_unknown_comp_ops = {
- NULL, NULL, NULL, 0, "unknown", 0
- };
-
- static const struct squashfs_decompressor *decompressor[] = {
- &squashfs_zlib_comp_ops,
-+ &squashfs_lzma_unsupported_comp_ops,
-+ &squashfs_lzo_unsupported_comp_ops,
- &squashfs_unknown_comp_ops
- };
-
---- a/fs/squashfs/squashfs_fs.h
-+++ b/fs/squashfs/squashfs_fs.h
-@@ -211,7 +211,9 @@ struct meta_index {
- /*
- * definitions for structures on disk
- */
--#define ZLIB_COMPRESSION 1
-+#define ZLIB_COMPRESSION 1
-+#define LZMA_COMPRESSION 2
-+#define LZO_COMPRESSION 3
-
- struct squashfs_super_block {
- __le32 s_magic;
+++ /dev/null
-From 5f393ede3ddb5dd4cc2a9f243182fac45f1ce10b Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Wed, 14 Oct 2009 04:07:54 +0100
-Subject: [PATCH] Squashfs: add an extra parameter to the decompressor init function
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/decompressor.h | 4 ++--
- fs/squashfs/zlib_wrapper.c | 2 +-
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
---- a/fs/squashfs/decompressor.h
-+++ b/fs/squashfs/decompressor.h
-@@ -24,7 +24,7 @@
- */
-
- struct squashfs_decompressor {
-- void *(*init)(void);
-+ void *(*init)(struct squashfs_sb_info *);
- void (*free)(void *);
- int (*decompress)(struct squashfs_sb_info *, void **,
- struct buffer_head **, int, int, int, int, int);
-@@ -35,7 +35,7 @@ struct squashfs_decompressor {
-
- static inline void *squashfs_decompressor_init(struct squashfs_sb_info *msblk)
- {
-- return msblk->decompressor->init();
-+ return msblk->decompressor->init(msblk);
- }
-
- static inline void squashfs_decompressor_free(struct squashfs_sb_info *msblk,
---- a/fs/squashfs/zlib_wrapper.c
-+++ b/fs/squashfs/zlib_wrapper.c
-@@ -32,7 +32,7 @@
- #include "squashfs.h"
- #include "decompressor.h"
-
--static void *zlib_init(void)
-+static void *zlib_init(struct squashfs_sb_info *dummy)
- {
- z_stream *stream = kmalloc(sizeof(z_stream), GFP_KERNEL);
- if (stream == NULL)
+++ /dev/null
-From f49e1efdd179d54e814ff2a8e8f469496583062c Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Tue, 20 Oct 2009 10:54:36 +0100
-Subject: [PATCH] Squashfs: add LZMA compression
-
-Add support for LZMA compressed filesystems. This is an initial
-implementation.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/Kconfig | 5 ++
- fs/squashfs/Makefile | 1 +
- fs/squashfs/decompressor.c | 4 +
- fs/squashfs/lzma_wrapper.c | 151 ++++++++++++++++++++++++++++++++++++++++++++
- fs/squashfs/squashfs.h | 3 +
- 5 files changed, 164 insertions(+), 0 deletions(-)
- create mode 100644 fs/squashfs/lzma_wrapper.c
-
---- a/fs/squashfs/Kconfig
-+++ b/fs/squashfs/Kconfig
-@@ -26,6 +26,11 @@ config SQUASHFS
-
- If unsure, say N.
-
-+config SQUASHFS_LZMA
-+ bool "Include support for LZMA compressed file systems"
-+ depends on SQUASHFS
-+ select DECOMPRESS_LZMA
-+
- config SQUASHFS_EMBEDDED
-
- bool "Additional option for memory-constrained systems"
---- a/fs/squashfs/Makefile
-+++ b/fs/squashfs/Makefile
-@@ -5,3 +5,4 @@
- obj-$(CONFIG_SQUASHFS) += squashfs.o
- squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
- squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o
-+squashfs-$(CONFIG_SQUASHFS_LZMA) += lzma_wrapper.o
---- a/fs/squashfs/decompressor.c
-+++ b/fs/squashfs/decompressor.c
-@@ -50,7 +50,11 @@ static const struct squashfs_decompresso
-
- static const struct squashfs_decompressor *decompressor[] = {
- &squashfs_zlib_comp_ops,
-+#ifdef CONFIG_SQUASHFS_LZMA
-+ &squashfs_lzma_comp_ops,
-+#else
- &squashfs_lzma_unsupported_comp_ops,
-+#endif
- &squashfs_lzo_unsupported_comp_ops,
- &squashfs_unknown_comp_ops
- };
---- /dev/null
-+++ b/fs/squashfs/lzma_wrapper.c
-@@ -0,0 +1,151 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-+ * Phillip Lougher <phillip@lougher.demon.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,
-+ * 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+ *
-+ * lzma_wrapper.c
-+ */
-+
-+#include <asm/unaligned.h>
-+#include <linux/buffer_head.h>
-+#include <linux/mutex.h>
-+#include <linux/vmalloc.h>
-+#include <linux/decompress/unlzma.h>
-+
-+#include "squashfs_fs.h"
-+#include "squashfs_fs_sb.h"
-+#include "squashfs_fs_i.h"
-+#include "squashfs.h"
-+#include "decompressor.h"
-+
-+struct squashfs_lzma {
-+ void *input;
-+ void *output;
-+};
-+
-+/* decompress_unlzma.c is currently non re-entrant... */
-+DEFINE_MUTEX(lzma_mutex);
-+
-+/* decompress_unlzma.c doesn't provide any context in its callbacks... */
-+static int lzma_error;
-+
-+static void error(char *m)
-+{
-+ ERROR("unlzma error: %s\n", m);
-+ lzma_error = 1;
-+}
-+
-+
-+static void *lzma_init(struct squashfs_sb_info *msblk)
-+{
-+ struct squashfs_lzma *stream = kzalloc(sizeof(*stream), GFP_KERNEL);
-+ if (stream == NULL)
-+ goto failed;
-+ stream->input = vmalloc(msblk->block_size);
-+ if (stream->input == NULL)
-+ goto failed;
-+ stream->output = vmalloc(msblk->block_size);
-+ if (stream->output == NULL)
-+ goto failed2;
-+
-+ return stream;
-+
-+failed2:
-+ vfree(stream->input);
-+failed:
-+ ERROR("failed to allocate lzma workspace\n");
-+ kfree(stream);
-+ return NULL;
-+}
-+
-+
-+static void lzma_free(void *strm)
-+{
-+ struct squashfs_lzma *stream = strm;
-+
-+ if (stream) {
-+ vfree(stream->input);
-+ vfree(stream->output);
-+ }
-+ kfree(stream);
-+}
-+
-+
-+static int lzma_uncompress(struct squashfs_sb_info *msblk, void **buffer,
-+ struct buffer_head **bh, int b, int offset, int length, int srclength,
-+ int pages)
-+{
-+ struct squashfs_lzma *stream = msblk->stream;
-+ void *buff = stream->input;
-+ int avail, i, bytes = length, res;
-+
-+ mutex_lock(&lzma_mutex);
-+
-+ for (i = 0; i < b; i++) {
-+ wait_on_buffer(bh[i]);
-+ if (!buffer_uptodate(bh[i]))
-+ goto block_release;
-+
-+ avail = min(bytes, msblk->devblksize - offset);
-+ memcpy(buff, bh[i]->b_data + offset, avail);
-+ buff += avail;
-+ bytes -= avail;
-+ offset = 0;
-+ put_bh(bh[i]);
-+ }
-+
-+ lzma_error = 0;
-+ res = unlzma(stream->input, length, NULL, NULL, stream->output, NULL,
-+ error);
-+ if (res || lzma_error)
-+ goto failed;
-+
-+ /* uncompressed size is stored in the LZMA header (5 byte offset) */
-+ res = bytes = get_unaligned_le32(stream->input + 5);
-+ for (i = 0, buff = stream->output; bytes && i < pages; i++) {
-+ avail = min_t(int, bytes, PAGE_CACHE_SIZE);
-+ memcpy(buffer[i], buff, avail);
-+ buff += avail;
-+ bytes -= avail;
-+ }
-+ if (bytes)
-+ goto failed;
-+
-+ mutex_unlock(&lzma_mutex);
-+ return res;
-+
-+block_release:
-+ for (; i < b; i++)
-+ put_bh(bh[i]);
-+
-+failed:
-+ mutex_unlock(&lzma_mutex);
-+
-+ ERROR("lzma decompression failed, data probably corrupt\n");
-+ return -EIO;
-+}
-+
-+const struct squashfs_decompressor squashfs_lzma_comp_ops = {
-+ .init = lzma_init,
-+ .free = lzma_free,
-+ .decompress = lzma_uncompress,
-+ .id = LZMA_COMPRESSION,
-+ .name = "lzma",
-+ .supported = 1
-+};
-+
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -94,3 +94,6 @@ extern const struct address_space_operat
-
- /* zlib_wrapper.c */
- extern const struct squashfs_decompressor squashfs_zlib_comp_ops;
-+
-+/* lzma wrapper.c */
-+extern const struct squashfs_decompressor squashfs_lzma_comp_ops;
+++ /dev/null
-From fdf23ed283bc6ef5c25076ce2065f892120ff556 Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Thu, 22 Oct 2009 04:57:38 +0100
-Subject: [PATCH] Squashfs: Make unlzma available to non initramfs/initrd code
-
-Add a config option DECOMPRESS_LZMA_NEEDED which allows subsystems to
-specify they need the unlzma code. Normally decompress_unlzma.c is
-compiled with __init and unlzma is not exported to modules.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/Kconfig | 1 +
- include/linux/decompress/bunzip2_mm.h | 12 ++++++++++++
- include/linux/decompress/inflate_mm.h | 12 ++++++++++++
- include/linux/decompress/mm.h | 3 ---
- include/linux/decompress/unlzma_mm.h | 20 ++++++++++++++++++++
- lib/Kconfig | 3 +++
- lib/decompress_bunzip2.c | 1 +
- lib/decompress_inflate.c | 1 +
- lib/decompress_unlzma.c | 5 ++++-
- 9 files changed, 54 insertions(+), 4 deletions(-)
- create mode 100644 include/linux/decompress/bunzip2_mm.h
- create mode 100644 include/linux/decompress/inflate_mm.h
- create mode 100644 include/linux/decompress/unlzma_mm.h
-
---- a/fs/squashfs/Kconfig
-+++ b/fs/squashfs/Kconfig
-@@ -30,6 +30,7 @@ config SQUASHFS_LZMA
- bool "Include support for LZMA compressed file systems"
- depends on SQUASHFS
- select DECOMPRESS_LZMA
-+ select DECOMPRESS_LZMA_NEEDED
-
- config SQUASHFS_EMBEDDED
-
---- /dev/null
-+++ b/include/linux/decompress/bunzip2_mm.h
-@@ -0,0 +1,12 @@
-+#ifndef BUNZIP2_MM_H
-+#define BUNZIP2_MM_H
-+
-+#ifdef STATIC
-+/* Code active when included from pre-boot environment: */
-+#define INIT
-+#else
-+/* Compile for initramfs/initrd code only */
-+#define INIT __init
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/include/linux/decompress/inflate_mm.h
-@@ -0,0 +1,12 @@
-+#ifndef INFLATE_MM_H
-+#define INFLATE_MM_H
-+
-+#ifdef STATIC
-+/* Code active when included from pre-boot environment: */
-+#define INIT
-+#else
-+/* Compile for initramfs/initrd code only */
-+#define INIT __init
-+#endif
-+
-+#endif
---- a/include/linux/decompress/mm.h
-+++ b/include/linux/decompress/mm.h
-@@ -53,8 +53,6 @@ static void free(void *where)
-
- #define set_error_fn(x)
-
--#define INIT
--
- #else /* STATIC */
-
- /* Code active when compiled standalone for use when loading ramdisk: */
-@@ -77,7 +75,6 @@ static void free(void *where)
- static void(*error)(char *m);
- #define set_error_fn(x) error = x;
-
--#define INIT __init
- #define STATIC
-
- #include <linux/init.h>
---- /dev/null
-+++ b/include/linux/decompress/unlzma_mm.h
-@@ -0,0 +1,20 @@
-+#ifndef UNLZMA_MM_H
-+#define UNLZMA_MM_H
-+
-+#ifdef STATIC
-+
-+/* Code active when included from pre-boot environment: */
-+#define INIT
-+
-+#elif defined(CONFIG_DECOMPRESS_LZMA_NEEDED)
-+
-+/* Make it available to non initramfs/initrd code */
-+#define INIT
-+#include <linux/module.h>
-+#else
-+
-+/* Compile for initramfs/initrd code only */
-+#define INIT __init
-+#endif
-+
-+#endif
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -117,6 +117,9 @@ config DECOMPRESS_BZIP2
- config DECOMPRESS_LZMA
- tristate
-
-+config DECOMPRESS_LZMA_NEEDED
-+ boolean
-+
- #
- # Generic allocator support is selected if needed
- #
---- a/lib/decompress_bunzip2.c
-+++ b/lib/decompress_bunzip2.c
-@@ -52,6 +52,7 @@
- #include <linux/slab.h>
- #endif /* STATIC */
-
-+#include <linux/decompress/bunzip2_mm.h>
- #include <linux/decompress/mm.h>
-
- #ifndef INT_MAX
---- a/lib/decompress_inflate.c
-+++ b/lib/decompress_inflate.c
-@@ -23,6 +23,7 @@
-
- #endif /* STATIC */
-
-+#include <linux/decompress/inflate_mm.h>
- #include <linux/decompress/mm.h>
-
- #define GZIP_IOBUF_SIZE (16*1024)
---- a/lib/decompress_unlzma.c
-+++ b/lib/decompress_unlzma.c
-@@ -36,6 +36,7 @@
- #include <linux/slab.h>
- #endif /* STATIC */
-
-+#include <linux/decompress/unlzma_mm.h>
- #include <linux/decompress/mm.h>
-
- #define MIN(a, b) (((a) < (b)) ? (a) : (b))
-@@ -523,7 +524,7 @@ static inline void INIT process_bit1(str
-
-
-
--STATIC inline int INIT unlzma(unsigned char *buf, int in_len,
-+STATIC int INIT unlzma(unsigned char *buf, int in_len,
- int(*fill)(void*, unsigned int),
- int(*flush)(void*, unsigned int),
- unsigned char *output,
-@@ -656,4 +657,6 @@ STATIC int INIT decompress(unsigned char
- {
- return unlzma(buf, in_len - 4, fill, flush, output, posp, error_fn);
- }
-+#elif defined(CONFIG_DECOMPRESS_LZMA_NEEDED)
-+EXPORT_SYMBOL(unlzma);
- #endif
+++ /dev/null
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -121,6 +121,8 @@
- #endif
- .endm
-
-+ j kernel_entry
-+ nop
- #ifndef CONFIG_NO_EXCEPT_FILL
- /*
- * Reserved space for exception handlers.
+++ /dev/null
---- a/Makefile
-+++ b/Makefile
-@@ -521,7 +521,7 @@ all: vmlinux
- ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
- KBUILD_CFLAGS += -Os
- else
--KBUILD_CFLAGS += -O2
-+KBUILD_CFLAGS += -O2 -fno-reorder-blocks -fno-tree-ch
- endif
-
- include $(srctree)/arch/$(SRCARCH)/Makefile
-@@ -559,6 +559,9 @@ endif
- NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
- CHECKFLAGS += $(NOSTDINC_FLAGS)
-
-+# improve gcc optimization
-+CFLAGS += $(call cc-option,-funit-at-a-time,)
-+
- # warn about C99 declaration after statement
- KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
-
+++ /dev/null
---- a/arch/mips/include/asm/system.h
-+++ b/arch/mips/include/asm/system.h
-@@ -187,7 +187,7 @@ extern __u64 __xchg_u64_unsupported_on_3
- if something tries to do an invalid xchg(). */
- extern void __xchg_called_with_bad_pointer(void);
-
--static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-+static __always_inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
- {
- switch (size) {
- case 4:
+++ /dev/null
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -51,6 +51,7 @@
- #define SST49LF040B 0x0050
- #define SST49LF008A 0x005a
- #define AT49BV6416 0x00d6
-+#define MANUFACTURER_SAMSUNG 0x00ec
-
- static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
- static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
-@@ -375,12 +376,19 @@ struct mtd_info *cfi_cmdset_0002(struct
-
- if (extp->MajorVersion != '1' ||
- (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
-- printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query "
-- "version %c.%c.\n", extp->MajorVersion,
-- extp->MinorVersion);
-- kfree(extp);
-- kfree(mtd);
-- return NULL;
-+ if (cfi->mfr == MANUFACTURER_SAMSUNG &&
-+ (extp->MajorVersion == '3' && extp->MinorVersion == '3')) {
-+ printk(KERN_NOTICE " Newer Samsung flash detected, "
-+ "should be compatibile with Amd/Fujitsu.\n");
-+ }
-+ else {
-+ printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query "
-+ "version %c.%c.\n", extp->MajorVersion,
-+ extp->MinorVersion);
-+ kfree(extp);
-+ kfree(mtd);
-+ return NULL;
-+ }
- }
-
- /* Install our own private info structure */
+++ /dev/null
---- /dev/null
-+++ b/arch/mips/include/asm/mips_machine.h
-@@ -0,0 +1,47 @@
-+/*
-+ * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.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.
-+ *
-+ */
-+
-+#ifndef __ASM_MIPS_MACHINE_H
-+#define __ASM_MIPS_MACHINE_H
-+
-+#include <linux/init.h>
-+#include <linux/list.h>
-+
-+struct mips_machine {
-+ unsigned long mach_type;
-+ void (*mach_setup)(void);
-+ char *mach_name;
-+ struct list_head list;
-+};
-+
-+void mips_machine_register(struct mips_machine *) __init;
-+void mips_machine_setup(unsigned long machtype) __init;
-+void mips_machine_set_name(char *name) __init;
-+
-+extern char *mips_machine_name;
-+
-+#define MIPS_MACHINE(_type, _name, _setup) \
-+static char machine_name_##_type[] __initdata = _name; \
-+static struct mips_machine machine_##_type __initdata = \
-+{ \
-+ .mach_type = _type, \
-+ .mach_name = machine_name_##_type, \
-+ .mach_setup = _setup, \
-+}; \
-+ \
-+static int __init register_machine_##_type(void) \
-+{ \
-+ mips_machine_register(&machine_##_type); \
-+ return 0; \
-+} \
-+ \
-+pure_initcall(register_machine_##_type)
-+
-+#endif /* __ASM_MIPS_MACHINE_H */
-+
---- /dev/null
-+++ b/arch/mips/kernel/mips_machine.c
-@@ -0,0 +1,74 @@
-+/*
-+ * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.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.
-+ *
-+ */
-+#include <linux/mm.h>
-+
-+#include <asm/mips_machine.h>
-+#include <asm/bootinfo.h>
-+
-+static struct list_head mips_machines __initdata =
-+ LIST_HEAD_INIT(mips_machines);
-+
-+char *mips_machine_name = "Unknown";
-+
-+static struct mips_machine * __init mips_machine_find(unsigned long machtype)
-+{
-+ struct list_head *this;
-+
-+ list_for_each(this, &mips_machines) {
-+ struct mips_machine *mach;
-+
-+ mach = list_entry(this, struct mips_machine, list);
-+ if (mach->mach_type == machtype)
-+ return mach;
-+ }
-+
-+ return NULL;
-+}
-+
-+void __init mips_machine_register(struct mips_machine *mach)
-+{
-+ list_add_tail(&mach->list, &mips_machines);
-+}
-+
-+void __init mips_machine_set_name(char *name)
-+{
-+ unsigned int len;
-+ char *p;
-+
-+ if (name == NULL)
-+ return;
-+
-+ len = strlen(name);
-+ p = kmalloc(len + 1, GFP_KERNEL);
-+ if (p) {
-+ strncpy(p, name, len);
-+ p[len] = '\0';
-+ mips_machine_name = p;
-+ } else {
-+ printk(KERN_WARNING "MIPS: no memory for machine_name\n");
-+ }
-+}
-+
-+void __init mips_machine_setup(unsigned long machtype)
-+{
-+ struct mips_machine *mach;
-+
-+ mach = mips_machine_find(machtype);
-+ if (!mach) {
-+ printk(KERN_ALERT "MIPS: no machine registered for "
-+ "machtype %lu\n", machtype);
-+ return;
-+ }
-+
-+ mips_machine_set_name(mach->mach_name);
-+ printk(KERN_INFO "MIPS: machine is %s\n", mips_machine_name);
-+
-+ if (mach->mach_setup)
-+ mach->mach_setup();
-+}
---- a/arch/mips/kernel/Makefile
-+++ b/arch/mips/kernel/Makefile
-@@ -87,6 +87,7 @@ obj-$(CONFIG_GPIO_TXX9) += gpio_txx9.o
-
- obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
- obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
-+obj-$(CONFIG_MIPS_MACHINE) += mips_machine.o
-
- CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi)
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -837,6 +837,9 @@ config MIPS_DISABLE_OBSOLETE_IDE
- config SYNC_R4K
- bool
-
-+config MIPS_MACHINE
-+ def_bool n
-+
- config NO_IOPORT
- def_bool n
-
---- a/arch/mips/kernel/proc.c
-+++ b/arch/mips/kernel/proc.c
-@@ -12,6 +12,7 @@
- #include <asm/cpu-features.h>
- #include <asm/mipsregs.h>
- #include <asm/processor.h>
-+#include <asm/mips_machine.h>
-
- unsigned int vced_count, vcei_count;
-
-@@ -31,8 +32,12 @@ static int show_cpuinfo(struct seq_file
- /*
- * For the first processor also print the system type
- */
-- if (n == 0)
-+ if (n == 0) {
- seq_printf(m, "system type\t\t: %s\n", get_system_type());
-+#ifdef CONFIG_MIPS_MACHINE
-+ seq_printf(m, "machine\t\t\t: %s\n", mips_machine_name);
-+#endif
-+ }
-
- seq_printf(m, "processor\t\t: %ld\n", n);
- sprintf(fmt, "cpu model\t\t: %%s V%%d.%%d%s\n",
+++ /dev/null
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -840,6 +840,10 @@ config SYNC_R4K
- config MIPS_MACHINE
- def_bool n
-
-+config IMAGE_CMDLINE_HACK
-+ bool "OpenWrt specific image command line hack"
-+ default n
-+
- config NO_IOPORT
- def_bool n
-
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -143,6 +143,12 @@ FEXPORT(__kernel_entry)
- j kernel_entry
- #endif
-
-+#ifdef CONFIG_IMAGE_CMDLINE_HACK
-+ .ascii "CMDLINE:"
-+EXPORT(__image_cmdline)
-+ .fill 0x400
-+#endif /* CONFIG_IMAGE_CMDLINE_HACK */
-+
- __REF
-
- NESTED(kernel_entry, 16, sp) # kernel entry point
+++ /dev/null
---- a/arch/mips/include/asm/thread_info.h
-+++ b/arch/mips/include/asm/thread_info.h
-@@ -83,6 +83,7 @@ register struct thread_info *__current_t
- #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
- #define THREAD_MASK (THREAD_SIZE - 1UL)
-
-+#if 0
- #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR
-
- #ifdef CONFIG_DEBUG_STACK_USAGE
-@@ -99,6 +100,7 @@ register struct thread_info *__current_t
- #endif
-
- #define free_thread_info(info) kfree(info)
-+#endif
-
- #endif /* !__ASSEMBLY__ */
-
+++ /dev/null
-MIPS: allow disabling the kernel FPU emulator
-
-This patch allows turning off the in-kernel Algorithmics
-FPU emulator support, which allows one to save a couple of
-precious blocks on an embedded system.
-
-Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -825,6 +825,17 @@ config I8259
- config MIPS_BONITO64
- bool
-
-+config MIPS_FPU_EMU
-+ bool "Enable FPU emulation"
-+ default y
-+ help
-+ This option allows building a kernel with or without the Algorithmics
-+ FPU emulator enabled. Turning off this option results in a kernel which
-+ does not catch floating operations exceptions. Make sure that your toolchain
-+ is configured to enable software floating point emulation in that case.
-+
-+ If unsure say Y here.
-+
- config MIPS_MSC
- bool
-
---- a/arch/mips/math-emu/Makefile
-+++ b/arch/mips/math-emu/Makefile
-@@ -2,12 +2,14 @@
- # Makefile for the Linux/MIPS kernel FPU emulation.
- #
-
--obj-y := cp1emu.o ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
-+obj-y := kernel_linkage.o dsemul.o cp1emu.o
-+
-+obj-$(CONFIG_MIPS_FPU_EMU) += ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
- ieee754xcpt.o dp_frexp.o dp_modf.o dp_div.o dp_mul.o dp_sub.o \
- dp_add.o dp_fsp.o dp_cmp.o dp_logb.o dp_scalb.o dp_simple.o \
- dp_tint.o dp_fint.o dp_tlong.o dp_flong.o sp_frexp.o sp_modf.o \
- sp_div.o sp_mul.o sp_sub.o sp_add.o sp_fdp.o sp_cmp.o sp_logb.o \
- sp_scalb.o sp_simple.o sp_tint.o sp_fint.o sp_tlong.o sp_flong.o \
-- dp_sqrt.o sp_sqrt.o kernel_linkage.o dsemul.o
-+ dp_sqrt.o sp_sqrt.o
-
- EXTRA_CFLAGS += -Werror
---- a/arch/mips/math-emu/cp1emu.c
-+++ b/arch/mips/math-emu/cp1emu.c
-@@ -56,6 +56,12 @@
- #endif
- #define __mips 4
-
-+/* Further private data for which no space exists in mips_fpu_struct */
-+
-+struct mips_fpu_emulator_stats fpuemustats;
-+
-+#ifdef CONFIG_MIPS_FPU_EMU
-+
- /* Function which emulates a floating point instruction. */
-
- static int fpu_emu(struct pt_regs *, struct mips_fpu_struct *,
-@@ -66,10 +72,6 @@ static int fpux_emu(struct pt_regs *,
- struct mips_fpu_struct *, mips_instruction);
- #endif
-
--/* Further private data for which no space exists in mips_fpu_struct */
--
--struct mips_fpu_emulator_stats fpuemustats;
--
- /* Control registers */
-
- #define FPCREG_RID 0 /* $0 = revision id */
-@@ -1273,6 +1275,13 @@ int fpu_emulator_cop1Handler(struct pt_r
-
- return sig;
- }
-+#else
-+int fpu_emulator_cop1Handler(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
-+ int has_fpu)
-+{
-+ return 0;
-+}
-+#endif /* CONFIG_MIPS_FPU_EMU */
-
- #ifdef CONFIG_DEBUG_FS
- extern struct dentry *mips_debugfs_dir;
---- a/arch/mips/math-emu/dsemul.c
-+++ b/arch/mips/math-emu/dsemul.c
-@@ -109,6 +109,7 @@ int mips_dsemul(struct pt_regs *regs, mi
- return SIGILL; /* force out of emulation loop */
- }
-
-+#ifdef CONFIG_MIPS_FPU_EMU
- int do_dsemulret(struct pt_regs *xcp)
- {
- struct emuframe __user *fr;
-@@ -165,3 +166,9 @@ int do_dsemulret(struct pt_regs *xcp)
-
- return 1;
- }
-+#else
-+int do_dsemulret(struct pt_regs *xcp)
-+{
-+ return 0;
-+}
-+#endif /* CONFIG_MIPS_FPU_EMU */
---- a/arch/mips/math-emu/kernel_linkage.c
-+++ b/arch/mips/math-emu/kernel_linkage.c
-@@ -29,6 +29,7 @@
-
- #define SIGNALLING_NAN 0x7ff800007ff80000LL
-
-+#ifdef CONFIG_MIPS_FPU_EMU
- void fpu_emulator_init_fpu(void)
- {
- static int first = 1;
-@@ -112,4 +113,36 @@ int fpu_emulator_restore_context32(struc
-
- return err;
- }
--#endif
-+#endif /* CONFIG_64BIT */
-+#else
-+
-+void fpu_emulator_init_fpu(void)
-+{
-+ printk(KERN_INFO "FPU emulator disabled, make sure your toolchain"
-+ "was compiled with software floating point support (soft-float)\n");
-+ return;
-+}
-+
-+int fpu_emulator_save_context(struct sigcontext __user *sc)
-+{
-+ return 0;
-+}
-+
-+int fpu_emulator_restore_context(struct sigcontext __user *sc)
-+{
-+ return 0;
-+}
-+
-+int fpu_emulator_save_context32(struct sigcontext32 __user *sc)
-+{
-+ return 0;
-+}
-+
-+int fpu_emulator_restore_context32(struct sigcontext32 __user *sc)
-+{
-+ return 0;
-+}
-+
-+#ifdef CONFIG_64BIT
-+#endif /* CONFIG_64BIT */
-+#endif /* CONFIG_MIPS_FPU_EMU */
+++ /dev/null
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -83,7 +83,7 @@ all-$(CONFIG_BOOT_ELF64) := $(vmlinux-64
- cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
- cflags-y += -msoft-float
- LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
--MODFLAGS += -mlong-calls
-+MODFLAGS += -mno-long-calls
-
- cflags-y += -ffreestanding
-
---- a/arch/mips/include/asm/module.h
-+++ b/arch/mips/include/asm/module.h
-@@ -9,6 +9,11 @@ struct mod_arch_specific {
- struct list_head dbe_list;
- const struct exception_table_entry *dbe_start;
- const struct exception_table_entry *dbe_end;
-+
-+ void *phys_plt_tbl;
-+ void *virt_plt_tbl;
-+ unsigned int phys_plt_offset;
-+ unsigned int virt_plt_offset;
- };
-
- typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */
---- a/arch/mips/kernel/module.c
-+++ b/arch/mips/kernel/module.c
-@@ -43,6 +43,117 @@ static struct mips_hi16 *mips_hi16_list;
- static LIST_HEAD(dbe_list);
- static DEFINE_SPINLOCK(dbe_lock);
-
-+/*
-+ * Get the potential max trampolines size required of the init and
-+ * non-init sections. Only used if we cannot find enough contiguous
-+ * physically mapped memory to put the module into.
-+ */
-+static unsigned int
-+get_plt_size(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
-+ const char *secstrings, unsigned int symindex, bool is_init)
-+{
-+ unsigned long ret = 0;
-+ unsigned int i, j;
-+ Elf_Sym *syms;
-+
-+ /* Everything marked ALLOC (this includes the exported symbols) */
-+ for (i = 1; i < hdr->e_shnum; ++i) {
-+ unsigned int info = sechdrs[i].sh_info;
-+
-+ if (sechdrs[i].sh_type != SHT_REL
-+ && sechdrs[i].sh_type != SHT_RELA)
-+ continue;
-+
-+ /* Not a valid relocation section? */
-+ if (info >= hdr->e_shnum)
-+ continue;
-+
-+ /* Don't bother with non-allocated sections */
-+ if (!(sechdrs[info].sh_flags & SHF_ALLOC))
-+ continue;
-+
-+ /* If it's called *.init*, and we're not init, we're
-+ not interested */
-+ if ((strstr(secstrings + sechdrs[i].sh_name, ".init") != 0)
-+ != is_init)
-+ continue;
-+
-+ syms = (Elf_Sym *) sechdrs[symindex].sh_addr;
-+ if (sechdrs[i].sh_type == SHT_REL) {
-+ Elf_Mips_Rel *rel = (void *) sechdrs[i].sh_addr;
-+ unsigned int size = sechdrs[i].sh_size / sizeof(*rel);
-+
-+ for (j = 0; j < size; ++j) {
-+ Elf_Sym *sym;
-+
-+ if (ELF_MIPS_R_TYPE(rel[j]) != R_MIPS_26)
-+ continue;
-+
-+ sym = syms + ELF_MIPS_R_SYM(rel[j]);
-+ if (!is_init && sym->st_shndx != SHN_UNDEF)
-+ continue;
-+
-+ ret += 4 * sizeof(int);
-+ }
-+ } else {
-+ Elf_Mips_Rela *rela = (void *) sechdrs[i].sh_addr;
-+ unsigned int size = sechdrs[i].sh_size / sizeof(*rela);
-+
-+ for (j = 0; j < size; ++j) {
-+ Elf_Sym *sym;
-+
-+ if (ELF_MIPS_R_TYPE(rela[j]) != R_MIPS_26)
-+ continue;
-+
-+ sym = syms + ELF_MIPS_R_SYM(rela[j]);
-+ if (!is_init && sym->st_shndx != SHN_UNDEF)
-+ continue;
-+
-+ ret += 4 * sizeof(int);
-+ }
-+ }
-+ }
-+
-+ return ret;
-+}
-+
-+#ifndef MODULE_START
-+static void *alloc_phys(unsigned long size)
-+{
-+ unsigned order;
-+ struct page *page;
-+ struct page *p;
-+
-+ size = PAGE_ALIGN(size);
-+ order = get_order(size);
-+
-+ page = alloc_pages(GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN |
-+ __GFP_THISNODE, order);
-+ if (!page)
-+ return NULL;
-+
-+ split_page(page, order);
-+
-+ for (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p)
-+ __free_page(p);
-+
-+ return page_address(page);
-+}
-+#endif
-+
-+static void free_phys(void *ptr, unsigned long size)
-+{
-+ struct page *page;
-+ struct page *end;
-+
-+ page = virt_to_page(ptr);
-+ end = page + (PAGE_ALIGN(size) >> PAGE_SHIFT);
-+
-+ for (; page < end; ++page)
-+ __free_page(page);
-+}
-+
-+
- void *module_alloc(unsigned long size)
- {
- #ifdef MODULE_START
-@@ -58,21 +169,99 @@ void *module_alloc(unsigned long size)
-
- return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL);
- #else
-+ void *ptr;
-+
- if (size == 0)
- return NULL;
-- return vmalloc(size);
-+
-+ ptr = alloc_phys(size);
-+
-+ /* If we failed to allocate physically contiguous memory,
-+ * fall back to regular vmalloc. The module loader code will
-+ * create jump tables to handle long jumps */
-+ if (!ptr)
-+ return vmalloc(size);
-+
-+ return ptr;
-+#endif
-+}
-+
-+static inline bool is_phys_addr(void *ptr)
-+{
-+#ifdef CONFIG_64BIT
-+ return (KSEGX((unsigned long)ptr) == CKSEG0);
-+#else
-+ return (KSEGX(ptr) == KSEG0);
- #endif
- }
-
- /* Free memory returned from module_alloc */
- void module_free(struct module *mod, void *module_region)
- {
-- vfree(module_region);
-+ if (is_phys_addr(module_region)) {
-+ if (mod->module_init == module_region)
-+ free_phys(module_region, mod->init_size);
-+ else if (mod->module_core == module_region)
-+ free_phys(module_region, mod->core_size);
-+ else
-+ BUG();
-+ } else {
-+ vfree(module_region);
-+ }
-+}
-+
-+static void *__module_alloc(int size, bool phys)
-+{
-+ void *ptr;
-+
-+ if (phys)
-+ ptr = kmalloc(size, GFP_KERNEL);
-+ else
-+ ptr = vmalloc(size);
-+ return ptr;
-+}
-+
-+static void __module_free(void *ptr)
-+{
-+ if (is_phys_addr(ptr))
-+ kfree(ptr);
-+ else
-+ vfree(ptr);
- }
-
- int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
- char *secstrings, struct module *mod)
- {
-+ unsigned int symindex = 0;
-+ unsigned int core_size, init_size;
-+ int i;
-+
-+ for (i = 1; i < hdr->e_shnum; i++)
-+ if (sechdrs[i].sh_type == SHT_SYMTAB)
-+ symindex = i;
-+
-+ core_size = get_plt_size(hdr, sechdrs, secstrings, symindex, false);
-+ init_size = get_plt_size(hdr, sechdrs, secstrings, symindex, true);
-+
-+ mod->arch.phys_plt_offset = 0;
-+ mod->arch.virt_plt_offset = 0;
-+ mod->arch.phys_plt_tbl = NULL;
-+ mod->arch.virt_plt_tbl = NULL;
-+
-+ if ((core_size + init_size) == 0)
-+ return 0;
-+
-+ mod->arch.phys_plt_tbl = __module_alloc(core_size + init_size, 1);
-+ if (!mod->arch.phys_plt_tbl)
-+ return -ENOMEM;
-+
-+ mod->arch.virt_plt_tbl = __module_alloc(core_size + init_size, 0);
-+ if (!mod->arch.virt_plt_tbl) {
-+ __module_free(mod->arch.phys_plt_tbl);
-+ mod->arch.phys_plt_tbl = NULL;
-+ return -ENOMEM;
-+ }
-+
- return 0;
- }
-
-@@ -95,28 +284,36 @@ static int apply_r_mips_32_rela(struct m
- return 0;
- }
-
--static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
-+static Elf_Addr add_plt_entry_to(unsigned *plt_offset,
-+ void *start, Elf_Addr v)
- {
-- if (v % 4) {
-- pr_err("module %s: dangerous R_MIPS_26 REL relocation\n",
-- me->name);
-- return -ENOEXEC;
-- }
-+ unsigned *tramp = start + *plt_offset;
-+ *plt_offset += 4 * sizeof(int);
-
-- if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
-- printk(KERN_ERR
-- "module %s: relocation overflow\n",
-- me->name);
-- return -ENOEXEC;
-- }
-+ /* adjust carry for addiu */
-+ if (v & 0x00008000)
-+ v += 0x10000;
-
-- *location = (*location & ~0x03ffffff) |
-- ((*location + (v >> 2)) & 0x03ffffff);
-+ tramp[0] = 0x3c190000 | (v >> 16); /* lui t9, hi16 */
-+ tramp[1] = 0x27390000 | (v & 0xffff); /* addiu t9, t9, lo16 */
-+ tramp[2] = 0x03200008; /* jr t9 */
-+ tramp[3] = 0x00000000; /* nop */
-
-- return 0;
-+ return (Elf_Addr) tramp;
- }
-
--static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v)
-+static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v)
-+{
-+ if (is_phys_addr(location))
-+ return add_plt_entry_to(&me->arch.phys_plt_offset,
-+ me->arch.phys_plt_tbl, v);
-+ else
-+ return add_plt_entry_to(&me->arch.virt_plt_offset,
-+ me->arch.virt_plt_tbl, v);
-+
-+}
-+
-+static int set_r_mips_26(struct module *me, u32 *location, u32 ofs, Elf_Addr v)
- {
- if (v % 4) {
- pr_err("module %s: dangerous R_MIPS_26 RELArelocation\n",
-@@ -125,17 +322,31 @@ static int apply_r_mips_26_rela(struct m
- }
-
- if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
-- printk(KERN_ERR
-+ v = add_plt_entry(me, location, v + (ofs << 2));
-+ if (!v) {
-+ printk(KERN_ERR
- "module %s: relocation overflow\n",
- me->name);
-- return -ENOEXEC;
-+ return -ENOEXEC;
-+ }
-+ ofs = 0;
- }
-
-- *location = (*location & ~0x03ffffff) | ((v >> 2) & 0x03ffffff);
-+ *location = (*location & ~0x03ffffff) | ((ofs + (v >> 2)) & 0x03ffffff);
-
- return 0;
- }
-
-+static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
-+{
-+ return set_r_mips_26(me, location, *location & 0x03ffffff, v);
-+}
-+
-+static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v)
-+{
-+ return set_r_mips_26(me, location, 0, v);
-+}
-+
- static int apply_r_mips_hi16_rel(struct module *me, u32 *location, Elf_Addr v)
- {
- struct mips_hi16 *n;
-@@ -400,11 +611,32 @@ int module_finalize(const Elf_Ehdr *hdr,
- list_add(&me->arch.dbe_list, &dbe_list);
- spin_unlock_irq(&dbe_lock);
- }
-+
-+ /* Get rid of the fixup trampoline if we're running the module
-+ * from physically mapped address space */
-+ if (me->arch.phys_plt_offset == 0) {
-+ __module_free(me->arch.phys_plt_tbl);
-+ me->arch.phys_plt_tbl = NULL;
-+ }
-+ if (me->arch.virt_plt_offset == 0) {
-+ __module_free(me->arch.virt_plt_tbl);
-+ me->arch.virt_plt_tbl = NULL;
-+ }
-+
- return 0;
- }
-
- void module_arch_cleanup(struct module *mod)
- {
-+ if (mod->arch.phys_plt_tbl) {
-+ __module_free(mod->arch.phys_plt_tbl);
-+ mod->arch.phys_plt_tbl = NULL;
-+ }
-+ if (mod->arch.virt_plt_tbl) {
-+ __module_free(mod->arch.virt_plt_tbl);
-+ mod->arch.virt_plt_tbl = NULL;
-+ }
-+
- spin_lock_irq(&dbe_lock);
- list_del(&mod->arch.dbe_list);
- spin_unlock_irq(&dbe_lock);
+++ /dev/null
---- a/include/asm-generic/vmlinux.lds.h
-+++ b/include/asm-generic/vmlinux.lds.h
-@@ -55,6 +55,27 @@
- #define LOAD_OFFSET 0
- #endif
-
-+#ifndef SYMTAB_KEEP_STR
-+#define SYMTAB_KEEP_STR *(__ksymtab_strings.*)
-+#define SYMTAB_DISCARD_STR
-+#else
-+#define SYMTAB_DISCARD_STR *(__ksymtab_strings.*)
-+#endif
-+
-+#ifndef SYMTAB_KEEP
-+#define SYMTAB_KEEP *(__ksymtab.*)
-+#define SYMTAB_DISCARD
-+#else
-+#define SYMTAB_DISCARD *(__ksymtab.*)
-+#endif
-+
-+#ifndef SYMTAB_KEEP_GPL
-+#define SYMTAB_KEEP_GPL *(__ksymtab_gpl.*)
-+#define SYMTAB_DISCARD_GPL
-+#else
-+#define SYMTAB_DISCARD_GPL *(__ksymtab_gpl.*)
-+#endif
-+
- #ifndef VMLINUX_SYMBOL
- #define VMLINUX_SYMBOL(_sym_) _sym_
- #endif
-@@ -256,35 +277,35 @@
- /* Kernel symbol table: Normal symbols */ \
- __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab) = .; \
-- *(__ksymtab) \
-+ SYMTAB_KEEP \
- VMLINUX_SYMBOL(__stop___ksymtab) = .; \
- } \
- \
- /* Kernel symbol table: GPL-only symbols */ \
- __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \
-- *(__ksymtab_gpl) \
-+ SYMTAB_KEEP_GPL \
- VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \
- } \
- \
- /* Kernel symbol table: Normal unused symbols */ \
- __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \
-- *(__ksymtab_unused) \
-+ *(__ksymtab_unused.*) \
- VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \
- } \
- \
- /* Kernel symbol table: GPL-only unused symbols */ \
- __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \
-- *(__ksymtab_unused_gpl) \
-+ *(__ksymtab_unused_gpl.*) \
- VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \
- } \
- \
- /* Kernel symbol table: GPL-future-only symbols */ \
- __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \
-- *(__ksymtab_gpl_future) \
-+ *(__ksymtab_gpl_future.*) \
- VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \
- } \
- \
-@@ -325,7 +346,13 @@
- \
- /* Kernel symbol table: strings */ \
- __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
-- *(__ksymtab_strings) \
-+ SYMTAB_KEEP_STR \
-+ } \
-+ \
-+ /DISCARD/ : { \
-+ SYMTAB_DISCARD \
-+ SYMTAB_DISCARD_GPL \
-+ SYMTAB_DISCARD_STR \
- } \
- \
- /* __*init sections */ \
---- a/include/linux/module.h
-+++ b/include/linux/module.h
-@@ -188,16 +188,24 @@ void *__symbol_get_gpl(const char *symbo
- #define __CRC_SYMBOL(sym, sec)
- #endif
-
-+#ifdef MODULE
-+#define __EXPORT_SUFFIX(sym)
-+#else
-+#define __EXPORT_SUFFIX(sym) "." #sym
-+#endif
-+
- /* For every exported symbol, place a struct in the __ksymtab section */
- #define __EXPORT_SYMBOL(sym, sec) \
- extern typeof(sym) sym; \
- __CRC_SYMBOL(sym, sec) \
- static const char __kstrtab_##sym[] \
-- __attribute__((section("__ksymtab_strings"), aligned(1))) \
-+ __attribute__((section("__ksymtab_strings" \
-+ __EXPORT_SUFFIX(sym)), aligned(1))) \
- = MODULE_SYMBOL_PREFIX #sym; \
- static const struct kernel_symbol __ksymtab_##sym \
- __used \
-- __attribute__((section("__ksymtab" sec), unused)) \
-+ __attribute__((section("__ksymtab" sec \
-+ __EXPORT_SUFFIX(sym)), unused)) \
- = { (unsigned long)&sym, __kstrtab_##sym }
-
- #define EXPORT_SYMBOL(sym) \
---- a/arch/arm/kernel/vmlinux.lds.S
-+++ b/arch/arm/kernel/vmlinux.lds.S
-@@ -79,26 +79,6 @@ SECTIONS
- #endif
- }
-
-- /DISCARD/ : { /* Exit code and data */
-- EXIT_TEXT
-- EXIT_DATA
-- *(.exitcall.exit)
-- *(.ARM.exidx.exit.text)
-- *(.ARM.extab.exit.text)
--#ifndef CONFIG_HOTPLUG_CPU
-- *(.ARM.exidx.cpuexit.text)
-- *(.ARM.extab.cpuexit.text)
--#endif
--#ifndef CONFIG_HOTPLUG
-- *(.ARM.exidx.devexit.text)
-- *(.ARM.extab.devexit.text)
--#endif
--#ifndef CONFIG_MMU
-- *(.fixup)
-- *(__ex_table)
--#endif
-- }
--
- .text : { /* Real text segment */
- _text = .; /* Text and read-only data */
- __exception_text_start = .;
-@@ -205,6 +185,28 @@ SECTIONS
- __bss_stop = .;
- _end = .;
- }
-+
-+ /DISCARD/ : { /* Exit code and data */
-+ EXIT_TEXT
-+ EXIT_DATA
-+ *(.discard)
-+ *(.exitcall.exit)
-+ *(.ARM.exidx.exit.text)
-+ *(.ARM.extab.exit.text)
-+#ifndef CONFIG_HOTPLUG_CPU
-+ *(.ARM.exidx.cpuexit.text)
-+ *(.ARM.extab.cpuexit.text)
-+#endif
-+#ifndef CONFIG_HOTPLUG
-+ *(.ARM.exidx.devexit.text)
-+ *(.ARM.extab.devexit.text)
-+#endif
-+#ifndef CONFIG_MMU
-+ *(.fixup)
-+ *(__ex_table)
-+#endif
-+ }
-+
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
---- a/arch/powerpc/kernel/vmlinux.lds.S
-+++ b/arch/powerpc/kernel/vmlinux.lds.S
-@@ -37,12 +37,6 @@ jiffies = jiffies_64 + 4;
- #endif
- SECTIONS
- {
-- /* Sections to be discarded. */
-- /DISCARD/ : {
-- *(.exitcall.exit)
-- EXIT_DATA
-- }
--
- . = KERNELBASE;
-
- /*
-@@ -295,6 +289,12 @@ SECTIONS
- __bss_stop = .;
- }
-
-+ /* Sections to be discarded. */
-+ /DISCARD/ : {
-+ *(.exitcall.exit)
-+ EXIT_DATA
-+ }
-+
- . = ALIGN(PAGE_SIZE);
- _end = . ;
- PROVIDE32 (end = .);
+++ /dev/null
---- a/arch/arm/kernel/module.c
-+++ b/arch/arm/kernel/module.c
-@@ -120,6 +120,10 @@ apply_relocate(Elf32_Shdr *sechdrs, cons
- return -ENOEXEC;
- }
-
-+ if ((IS_ERR_VALUE(sym->st_value) || !sym->st_value) &&
-+ ELF_ST_BIND(sym->st_info) == STB_WEAK)
-+ continue;
-+
- loc = dstsec->sh_addr + rel->r_offset;
-
- switch (ELF32_R_TYPE(rel->r_info)) {
+++ /dev/null
---- a/drivers/pci/Kconfig
-+++ b/drivers/pci/Kconfig
-@@ -51,6 +51,12 @@ config PCI_STUB
-
- When in doubt, say N.
-
-+config PCI_DISABLE_COMMON_QUIRKS
-+ bool "PCI disable common quirks"
-+ depends on PCI
-+ help
-+ If you don't know what to do here, say N.
-+
- config HT_IRQ
- bool "Interrupts on hypertransport devices"
- default y
---- a/drivers/pci/quirks.c
-+++ b/drivers/pci/quirks.c
-@@ -98,6 +98,7 @@ static void __devinit quirk_resource_ali
- }
- DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, quirk_resource_alignment);
-
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
- /* The Mellanox Tavor device gives false positive parity errors
- * Mark this device with a broken_parity_status, to allow
- * PCI scanning code to "skip" this now blacklisted device.
-@@ -1867,7 +1868,9 @@ static void __devinit fixup_rev1_53c810(
- }
- }
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810);
-+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */
-
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
- /* Enable 1k I/O space granularity on the Intel P64H2 */
- static void __devinit quirk_p64h2_1k_io(struct pci_dev *dev)
- {
-@@ -2498,6 +2501,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x150d, quirk_i82576_sriov);
-
- #endif /* CONFIG_PCI_IOV */
-+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */
-
- static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,
- struct pci_fixup *end)
+++ /dev/null
-GCC 4.4.x looks to be adding support for generating out-of-line register
-saves/restores based on:
-
-http://gcc.gnu.org/ml/gcc-patches/2008-04/msg01678.html
-
-This breaks the kernel build as we'd have to link with libgcc to get the
-implementation of the register save/restores.
-
-To workaround this issue, we just stole the save/restore code from gcc
-and simplified it down for our needs (integer only). We only do this if
-PPC32 as gcc makes believe the linker on ppc64 will deal with this and
-only if CONFIG_CC_OPTIMIZE_FOR_SIZE is set (thus -Os).
-
-Signed-off-by: Kumar Gala <[EMAIL PROTECTED]>
----
-
-If someone using cutting edge toolchains for ppc64 could test and make
-sure if we enable CONFIG_CC_OPTIMIZE_FOR_SIZE things work that would be
-nice.
-
-- k
-
- arch/powerpc/kernel/misc_32.S | 77 +++++++++++++++++++++++++++
- arch/powerpc/kernel/ppc_ksyms.c | 111 +++++++++++++++++++++++++++++++++++++++
- 2 files changed, 188 insertions(+), 0 deletions(-)
-
---- a/arch/powerpc/kernel/misc_32.S
-+++ b/arch/powerpc/kernel/misc_32.S
-@@ -813,3 +813,80 @@ relocate_new_kernel_end:
- relocate_new_kernel_size:
- .long relocate_new_kernel_end - relocate_new_kernel
- #endif
-+
-+#if defined(CONFIG_PPC32) && defined(CONFIG_CC_OPTIMIZE_FOR_SIZE)
-+/* Routines for saving integer registers, called by the compiler. */
-+/* Called with r11 pointing to the stack header word of the caller of the */
-+/* function, just beyond the end of the integer save area. */
-+
-+_GLOBAL(_savegpr_14) stw 14,-72(11) /* save gp registers */
-+_GLOBAL(_savegpr_15) stw 15,-68(11)
-+_GLOBAL(_savegpr_16) stw 16,-64(11)
-+_GLOBAL(_savegpr_17) stw 17,-60(11)
-+_GLOBAL(_savegpr_18) stw 18,-56(11)
-+_GLOBAL(_savegpr_19) stw 19,-52(11)
-+_GLOBAL(_savegpr_20) stw 20,-48(11)
-+_GLOBAL(_savegpr_21) stw 21,-44(11)
-+_GLOBAL(_savegpr_22) stw 22,-40(11)
-+_GLOBAL(_savegpr_23) stw 23,-36(11)
-+_GLOBAL(_savegpr_24) stw 24,-32(11)
-+_GLOBAL(_savegpr_25) stw 25,-28(11)
-+_GLOBAL(_savegpr_26) stw 26,-24(11)
-+_GLOBAL(_savegpr_27) stw 27,-20(11)
-+_GLOBAL(_savegpr_28) stw 28,-16(11)
-+_GLOBAL(_savegpr_29) stw 29,-12(11)
-+_GLOBAL(_savegpr_30) stw 30,-8(11)
-+_GLOBAL(_savegpr_31) stw 31,-4(11)
-+ blr
-+
-+/* Routines for restoring integer registers, called by the compiler. */
-+/* Called with r11 pointing to the stack header word of the caller of the */
-+/* function, just beyond the end of the integer restore area. */
-+
-+_GLOBAL(_restgpr_14) lwz 14,-72(11) /* restore gp registers */
-+_GLOBAL(_restgpr_15) lwz 15,-68(11)
-+_GLOBAL(_restgpr_16) lwz 16,-64(11)
-+_GLOBAL(_restgpr_17) lwz 17,-60(11)
-+_GLOBAL(_restgpr_18) lwz 18,-56(11)
-+_GLOBAL(_restgpr_19) lwz 19,-52(11)
-+_GLOBAL(_restgpr_20) lwz 20,-48(11)
-+_GLOBAL(_restgpr_21) lwz 21,-44(11)
-+_GLOBAL(_restgpr_22) lwz 22,-40(11)
-+_GLOBAL(_restgpr_23) lwz 23,-36(11)
-+_GLOBAL(_restgpr_24) lwz 24,-32(11)
-+_GLOBAL(_restgpr_25) lwz 25,-28(11)
-+_GLOBAL(_restgpr_26) lwz 26,-24(11)
-+_GLOBAL(_restgpr_27) lwz 27,-20(11)
-+_GLOBAL(_restgpr_28) lwz 28,-16(11)
-+_GLOBAL(_restgpr_29) lwz 29,-12(11)
-+_GLOBAL(_restgpr_30) lwz 30,-8(11)
-+_GLOBAL(_restgpr_31) lwz 31,-4(11)
-+ blr
-+
-+/* Routines for restoring integer registers, called by the compiler. */
-+/* Called with r11 pointing to the stack header word of the caller of the */
-+/* function, just beyond the end of the integer restore area. */
-+
-+_GLOBAL(_restgpr_14_x) lwz 14,-72(11) /* restore gp registers */
-+_GLOBAL(_restgpr_15_x) lwz 15,-68(11)
-+_GLOBAL(_restgpr_16_x) lwz 16,-64(11)
-+_GLOBAL(_restgpr_17_x) lwz 17,-60(11)
-+_GLOBAL(_restgpr_18_x) lwz 18,-56(11)
-+_GLOBAL(_restgpr_19_x) lwz 19,-52(11)
-+_GLOBAL(_restgpr_20_x) lwz 20,-48(11)
-+_GLOBAL(_restgpr_21_x) lwz 21,-44(11)
-+_GLOBAL(_restgpr_22_x) lwz 22,-40(11)
-+_GLOBAL(_restgpr_23_x) lwz 23,-36(11)
-+_GLOBAL(_restgpr_24_x) lwz 24,-32(11)
-+_GLOBAL(_restgpr_25_x) lwz 25,-28(11)
-+_GLOBAL(_restgpr_26_x) lwz 26,-24(11)
-+_GLOBAL(_restgpr_27_x) lwz 27,-20(11)
-+_GLOBAL(_restgpr_28_x) lwz 28,-16(11)
-+_GLOBAL(_restgpr_29_x) lwz 29,-12(11)
-+_GLOBAL(_restgpr_30_x) lwz 30,-8(11)
-+_GLOBAL(_restgpr_31_x) lwz 0,4(11)
-+ lwz 31,-4(11)
-+ mtlr 0
-+ mr 1,11
-+ blr
-+#endif
---- a/arch/powerpc/kernel/ppc_ksyms.c
-+++ b/arch/powerpc/kernel/ppc_ksyms.c
-@@ -188,3 +188,114 @@ EXPORT_SYMBOL(__mtdcr);
- EXPORT_SYMBOL(__mfdcr);
- #endif
- EXPORT_SYMBOL(empty_zero_page);
-+
-+#if defined(CONFIG_PPC32) && defined(CONFIG_CC_OPTIMIZE_FOR_SIZE)
-+void _savegpr_14(void);
-+void _savegpr_15(void);
-+void _savegpr_16(void);
-+void _savegpr_17(void);
-+void _savegpr_18(void);
-+void _savegpr_19(void);
-+void _savegpr_20(void);
-+void _savegpr_21(void);
-+void _savegpr_22(void);
-+void _savegpr_23(void);
-+void _savegpr_24(void);
-+void _savegpr_25(void);
-+void _savegpr_26(void);
-+void _savegpr_27(void);
-+void _savegpr_28(void);
-+void _savegpr_29(void);
-+void _savegpr_30(void);
-+void _savegpr_31(void);
-+void _restgpr_14(void);
-+void _restgpr_15(void);
-+void _restgpr_16(void);
-+void _restgpr_17(void);
-+void _restgpr_18(void);
-+void _restgpr_19(void);
-+void _restgpr_20(void);
-+void _restgpr_21(void);
-+void _restgpr_22(void);
-+void _restgpr_23(void);
-+void _restgpr_24(void);
-+void _restgpr_25(void);
-+void _restgpr_26(void);
-+void _restgpr_27(void);
-+void _restgpr_28(void);
-+void _restgpr_29(void);
-+void _restgpr_30(void);
-+void _restgpr_31(void);
-+void _restgpr_14_x(void);
-+void _restgpr_15_x(void);
-+void _restgpr_16_x(void);
-+void _restgpr_17_x(void);
-+void _restgpr_18_x(void);
-+void _restgpr_19_x(void);
-+void _restgpr_20_x(void);
-+void _restgpr_21_x(void);
-+void _restgpr_22_x(void);
-+void _restgpr_23_x(void);
-+void _restgpr_24_x(void);
-+void _restgpr_25_x(void);
-+void _restgpr_26_x(void);
-+void _restgpr_27_x(void);
-+void _restgpr_28_x(void);
-+void _restgpr_29_x(void);
-+void _restgpr_30_x(void);
-+void _restgpr_31_x(void);
-+EXPORT_SYMBOL(_savegpr_14);
-+EXPORT_SYMBOL(_savegpr_15);
-+EXPORT_SYMBOL(_savegpr_16);
-+EXPORT_SYMBOL(_savegpr_17);
-+EXPORT_SYMBOL(_savegpr_18);
-+EXPORT_SYMBOL(_savegpr_19);
-+EXPORT_SYMBOL(_savegpr_20);
-+EXPORT_SYMBOL(_savegpr_21);
-+EXPORT_SYMBOL(_savegpr_22);
-+EXPORT_SYMBOL(_savegpr_23);
-+EXPORT_SYMBOL(_savegpr_24);
-+EXPORT_SYMBOL(_savegpr_25);
-+EXPORT_SYMBOL(_savegpr_26);
-+EXPORT_SYMBOL(_savegpr_27);
-+EXPORT_SYMBOL(_savegpr_28);
-+EXPORT_SYMBOL(_savegpr_29);
-+EXPORT_SYMBOL(_savegpr_30);
-+EXPORT_SYMBOL(_savegpr_31);
-+EXPORT_SYMBOL(_restgpr_14);
-+EXPORT_SYMBOL(_restgpr_15);
-+EXPORT_SYMBOL(_restgpr_16);
-+EXPORT_SYMBOL(_restgpr_17);
-+EXPORT_SYMBOL(_restgpr_18);
-+EXPORT_SYMBOL(_restgpr_19);
-+EXPORT_SYMBOL(_restgpr_20);
-+EXPORT_SYMBOL(_restgpr_21);
-+EXPORT_SYMBOL(_restgpr_22);
-+EXPORT_SYMBOL(_restgpr_23);
-+EXPORT_SYMBOL(_restgpr_24);
-+EXPORT_SYMBOL(_restgpr_25);
-+EXPORT_SYMBOL(_restgpr_26);
-+EXPORT_SYMBOL(_restgpr_27);
-+EXPORT_SYMBOL(_restgpr_28);
-+EXPORT_SYMBOL(_restgpr_29);
-+EXPORT_SYMBOL(_restgpr_30);
-+EXPORT_SYMBOL(_restgpr_31);
-+EXPORT_SYMBOL(_restgpr_14_x);
-+EXPORT_SYMBOL(_restgpr_15_x);
-+EXPORT_SYMBOL(_restgpr_16_x);
-+EXPORT_SYMBOL(_restgpr_17_x);
-+EXPORT_SYMBOL(_restgpr_18_x);
-+EXPORT_SYMBOL(_restgpr_19_x);
-+EXPORT_SYMBOL(_restgpr_20_x);
-+EXPORT_SYMBOL(_restgpr_21_x);
-+EXPORT_SYMBOL(_restgpr_22_x);
-+EXPORT_SYMBOL(_restgpr_23_x);
-+EXPORT_SYMBOL(_restgpr_24_x);
-+EXPORT_SYMBOL(_restgpr_25_x);
-+EXPORT_SYMBOL(_restgpr_26_x);
-+EXPORT_SYMBOL(_restgpr_27_x);
-+EXPORT_SYMBOL(_restgpr_28_x);
-+EXPORT_SYMBOL(_restgpr_29_x);
-+EXPORT_SYMBOL(_restgpr_30_x);
-+EXPORT_SYMBOL(_restgpr_31_x);
-+#endif /* CONFIG_PPC32 && CONFIG_CC_OPTIMIZE_FOR_SIZE */
+++ /dev/null
---- a/arch/mips/kernel/Makefile
-+++ b/arch/mips/kernel/Makefile
-@@ -4,6 +4,8 @@
-
- CPPFLAGS_vmlinux.lds := $(KBUILD_CFLAGS)
-
-+CPPFLAGS_vmlinux.lds := $(KBUILD_CFLAGS) $(EXTRA_LDSFLAGS)
-+
- extra-y := head.o init_task.o vmlinux.lds
-
- obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \
+++ /dev/null
-From 2fa4341074cd02fb39aa23410740764948755635 Mon Sep 17 00:00:00 2001
-From: Albin Tonnerre <albin.tonnerre@free-electrons.com>
-Date: Wed, 23 Sep 2009 15:57:38 -0700
-Subject: [PATCH] include/linux/unaligned/{l,b}e_byteshift.h: fix usage for compressed kernels
-
-When unaligned accesses are required for uncompressing a kernel (such as
-for LZO decompression on ARM in a patch that follows), including
-<linux/kernel.h> causes issues as it brings in a lot of things that are
-not available in the decompression environment.
-
-linux/kernel.h brings at least:
-extern int console_printk[];
-extern const char hex_asc[];
-which causes errors at link-time as they are not available when
-compiling the pre-boot environement. There are also a few others:
-
- arch/arm/boot/compressed/misc.o: In function `valid_user_regs':
- arch/arm/include/asm/ptrace.h:158: undefined reference to `elf_hwcap'
- arch/arm/boot/compressed/misc.o: In function `console_silent':
- include/linux/kernel.h:292: undefined reference to `console_printk'
- arch/arm/boot/compressed/misc.o: In function `console_verbose':
- include/linux/kernel.h:297: undefined reference to `console_printk'
- arch/arm/boot/compressed/misc.o: In function `pack_hex_byte':
- include/linux/kernel.h:360: undefined reference to `hex_asc'
- arch/arm/boot/compressed/misc.o: In function `hweight_long':
- include/linux/bitops.h:45: undefined reference to `hweight32'
- arch/arm/boot/compressed/misc.o: In function `__cmpxchg_local_generic':
- include/asm-generic/cmpxchg-local.h:21: undefined reference to `wrong_size_cmpxchg'
- include/asm-generic/cmpxchg-local.h:42: undefined reference to `wrong_size_cmpxchg'
- arch/arm/boot/compressed/misc.o: In function `__xchg':
- arch/arm/include/asm/system.h:309: undefined reference to `__bad_xchg'
-
-However, those files apparently use nothing from <linux/kernel.h>, all
-they need is the declaration of types such as u32 or u64, so
-<linux/types.h> should be enough
-
-Signed-off-by: Albin Tonnerre <albin.tonnerre@free-electrons.com>
-Cc: Sam Ravnborg <sam@ravnborg.org>
-Cc: Russell King <rmk@arm.linux.org.uk>
-Cc: Ingo Molnar <mingo@elte.hu>
-Cc: Thomas Gleixner <tglx@linutronix.de>
-Cc: "H. Peter Anvin" <hpa@zytor.com>
-Cc: Phillip Lougher <phillip@lougher.demon.co.uk>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
----
- include/linux/unaligned/be_byteshift.h | 2 +-
- include/linux/unaligned/le_byteshift.h | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
---- a/include/linux/unaligned/be_byteshift.h
-+++ b/include/linux/unaligned/be_byteshift.h
-@@ -1,7 +1,7 @@
- #ifndef _LINUX_UNALIGNED_BE_BYTESHIFT_H
- #define _LINUX_UNALIGNED_BE_BYTESHIFT_H
-
--#include <linux/kernel.h>
-+#include <linux/types.h>
-
- static inline u16 __get_unaligned_be16(const u8 *p)
- {
---- a/include/linux/unaligned/le_byteshift.h
-+++ b/include/linux/unaligned/le_byteshift.h
-@@ -1,7 +1,7 @@
- #ifndef _LINUX_UNALIGNED_LE_BYTESHIFT_H
- #define _LINUX_UNALIGNED_LE_BYTESHIFT_H
-
--#include <linux/kernel.h>
-+#include <linux/types.h>
-
- static inline u16 __get_unaligned_le16(const u8 *p)
- {
+++ /dev/null
---- /dev/null
-+++ b/include/linux/decompress/unlzo.h
-@@ -0,0 +1,10 @@
-+#ifndef DECOMPRESS_UNLZO_H
-+#define DECOMPRESS_UNLZO_H
-+
-+int unlzo(unsigned char *inbuf, int len,
-+ int(*fill)(void*, unsigned int),
-+ int(*flush)(void*, unsigned int),
-+ unsigned char *output,
-+ int *pos,
-+ void(*error)(char *x));
-+#endif
---- a/init/Kconfig
-+++ b/init/Kconfig
-@@ -115,10 +115,13 @@ config HAVE_KERNEL_BZIP2
- config HAVE_KERNEL_LZMA
- bool
-
-+config HAVE_KERNEL_LZO
-+ bool
-+
- choice
- prompt "Kernel compression mode"
- default KERNEL_GZIP
-- depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA
-+ depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA || HAVE_KERNEL_LZO
- help
- The linux kernel is a kind of self-extracting executable.
- Several compression algorithms are available, which differ
-@@ -141,9 +144,8 @@ config KERNEL_GZIP
- bool "Gzip"
- depends on HAVE_KERNEL_GZIP
- help
-- The old and tried gzip compression. Its compression ratio is
-- the poorest among the 3 choices; however its speed (both
-- compression and decompression) is the fastest.
-+ The old and tried gzip compression. It provides a good balance
-+ between compression ratio and decompression speed.
-
- config KERNEL_BZIP2
- bool "Bzip2"
-@@ -164,6 +166,14 @@ config KERNEL_LZMA
- two. Compression is slowest. The kernel size is about 33%
- smaller with LZMA in comparison to gzip.
-
-+config KERNEL_LZO
-+ bool "LZO"
-+ depends on HAVE_KERNEL_LZO
-+ help
-+ Its compression ratio is the poorest among the 4. The kernel
-+ size is about about 10% bigger than gzip; however its speed
-+ (both compression and decompression) is the fastest.
-+
- endchoice
-
- config SWAP
---- /dev/null
-+++ b/lib/decompress_unlzo.c
-@@ -0,0 +1,208 @@
-+/*
-+ * LZO decompressor for the Linux kernel. Code borrowed from the lzo
-+ * implementation by Markus Franz Xaver Johannes Oberhumer.
-+ *
-+ * Linux kernel adaptation:
-+ * Copyright (C) 2009
-+ * Albin Tonnerre, Free Electrons <albin.tonnerre@free-electrons.com>
-+ *
-+ * Original code:
-+ * Copyright (C) 1996-2005 Markus Franz Xaver Johannes Oberhumer
-+ * All Rights Reserved.
-+ *
-+ * lzop and the LZO library are free software; you can redistribute them
-+ * and/or modify them 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; see the file COPYING.
-+ * If not, write to the Free Software Foundation, Inc.,
-+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * Markus F.X.J. Oberhumer
-+ * <markus@oberhumer.com>
-+ * http://www.oberhumer.com/opensource/lzop/
-+ */
-+
-+#ifdef STATIC
-+#include "lzo/lzo1x_decompress.c"
-+#else
-+#include <linux/slab.h>
-+#include <linux/decompress/unlzo.h>
-+#endif
-+
-+#include <linux/types.h>
-+#include <linux/lzo.h>
-+#include <linux/decompress/mm.h>
-+
-+#include <linux/compiler.h>
-+#include <asm/unaligned.h>
-+
-+static const unsigned char lzop_magic[] =
-+ { 0x89, 0x4c, 0x5a, 0x4f, 0x00, 0x0d, 0x0a, 0x1a, 0x0a };
-+
-+#define LZO_BLOCK_SIZE (256*1024l)
-+#define HEADER_HAS_FILTER 0x00000800L
-+
-+STATIC inline int INIT parse_header(u8 *input, u8 *skip)
-+{
-+ int l;
-+ u8 *parse = input;
-+ u8 level = 0;
-+ u16 version;
-+
-+ /* read magic: 9 first bits */
-+ for (l = 0; l < 9; l++) {
-+ if (*parse++ != lzop_magic[l])
-+ return 0;
-+ }
-+ /* get version (2bytes), skip library version (2),
-+ * 'need to be extracted' version (2) and
-+ * method (1) */
-+ version = get_unaligned_be16(parse);
-+ parse += 7;
-+ if (version >= 0x0940)
-+ level = *parse++;
-+ if (get_unaligned_be32(parse) & HEADER_HAS_FILTER)
-+ parse += 8; /* flags + filter info */
-+ else
-+ parse += 4; /* flags */
-+
-+ /* skip mode and mtime_low */
-+ parse += 8;
-+ if (version >= 0x0940)
-+ parse += 4; /* skip mtime_high */
-+
-+ l = *parse++;
-+ /* don't care about the file name, and skip checksum */
-+ parse += l + 4;
-+
-+ *skip = parse - input;
-+ return 1;
-+}
-+
-+STATIC inline int INIT unlzo(u8 *input, int in_len,
-+ int (*fill) (void *, unsigned int),
-+ int (*flush) (void *, unsigned int),
-+ u8 *output, int *posp,
-+ void (*error_fn) (char *x))
-+{
-+ u8 skip = 0, r = 0;
-+ u32 src_len, dst_len;
-+ size_t tmp;
-+ u8 *in_buf, *in_buf_save, *out_buf;
-+ int obytes_processed = 0;
-+
-+ set_error_fn(error_fn);
-+
-+ if (output)
-+ out_buf = output;
-+ else if (!flush) {
-+ error("NULL output pointer and no flush function provided");
-+ goto exit;
-+ } else {
-+ out_buf = malloc(LZO_BLOCK_SIZE);
-+ if (!out_buf) {
-+ error("Could not allocate output buffer");
-+ goto exit;
-+ }
-+ }
-+
-+ if (input && fill) {
-+ error("Both input pointer and fill function provided, don't know what to do");
-+ goto exit_1;
-+ } else if (input)
-+ in_buf = input;
-+ else if (!fill || !posp) {
-+ error("NULL input pointer and missing position pointer or fill function");
-+ goto exit_1;
-+ } else {
-+ in_buf = malloc(lzo1x_worst_compress(LZO_BLOCK_SIZE));
-+ if (!in_buf) {
-+ error("Could not allocate input buffer");
-+ goto exit_1;
-+ }
-+ }
-+ in_buf_save = in_buf;
-+
-+ if (posp)
-+ *posp = 0;
-+
-+ if (fill)
-+ fill(in_buf, lzo1x_worst_compress(LZO_BLOCK_SIZE));
-+
-+ if (!parse_header(input, &skip)) {
-+ error("invalid header");
-+ goto exit_2;
-+ }
-+ in_buf += skip;
-+
-+ if (posp)
-+ *posp = skip;
-+
-+ for (;;) {
-+ /* read uncompressed block size */
-+ dst_len = get_unaligned_be32(in_buf);
-+ in_buf += 4;
-+
-+ /* exit if last block */
-+ if (dst_len == 0) {
-+ if (posp)
-+ *posp += 4;
-+ break;
-+ }
-+
-+ if (dst_len > LZO_BLOCK_SIZE) {
-+ error("dest len longer than block size");
-+ goto exit_2;
-+ }
-+
-+ /* read compressed block size, and skip block checksum info */
-+ src_len = get_unaligned_be32(in_buf);
-+ in_buf += 8;
-+
-+ if (src_len <= 0 || src_len > dst_len) {
-+ error("file corrupted");
-+ goto exit_2;
-+ }
-+
-+ /* decompress */
-+ tmp = dst_len;
-+ r = lzo1x_decompress_safe((u8 *) in_buf, src_len, out_buf, &tmp);
-+
-+ if (r != LZO_E_OK || dst_len != tmp) {
-+ error("Compressed data violation");
-+ goto exit_2;
-+ }
-+
-+ obytes_processed += dst_len;
-+ if (flush)
-+ flush(out_buf, dst_len);
-+ if (output)
-+ out_buf += dst_len;
-+ if (posp)
-+ *posp += src_len + 12;
-+ if (fill) {
-+ in_buf = in_buf_save;
-+ fill(in_buf, lzo1x_worst_compress(LZO_BLOCK_SIZE));
-+ } else
-+ in_buf += src_len;
-+ }
-+
-+exit_2:
-+ if (!input)
-+ free(in_buf);
-+exit_1:
-+ if (!output)
-+ free(out_buf);
-+exit:
-+ return obytes_processed;
-+}
-+
-+#define decompress unlzo
---- a/lib/lzo/lzo1x_decompress.c
-+++ b/lib/lzo/lzo1x_decompress.c
-@@ -11,11 +11,13 @@
- * Richard Purdie <rpurdie@openedhand.com>
- */
-
-+#ifndef STATIC
- #include <linux/module.h>
- #include <linux/kernel.h>
--#include <linux/lzo.h>
--#include <asm/byteorder.h>
-+#endif
-+
- #include <asm/unaligned.h>
-+#include <linux/lzo.h>
- #include "lzodefs.h"
-
- #define HAVE_IP(x, ip_end, ip) ((size_t)(ip_end - ip) < (x))
-@@ -244,9 +246,10 @@ lookbehind_overrun:
- *out_len = op - out;
- return LZO_E_LOOKBEHIND_OVERRUN;
- }
--
-+#ifndef STATIC
- EXPORT_SYMBOL_GPL(lzo1x_decompress_safe);
-
- MODULE_LICENSE("GPL");
- MODULE_DESCRIPTION("LZO1X Decompressor");
-
-+#endif
---- a/scripts/Makefile.lib
-+++ b/scripts/Makefile.lib
-@@ -230,3 +230,8 @@ quiet_cmd_lzma = LZMA $@
- cmd_lzma = (cat $(filter-out FORCE,$^) | \
- lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
- (rm -f $@ ; false)
-+
-+quiet_cmd_lzo = LZO $@
-+cmd_lzo = (cat $(filter-out FORCE,$^) | \
-+ lzop -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
-+ (rm -f $@ ; false)
+++ /dev/null
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -18,6 +18,8 @@ config ARM
- select HAVE_KRETPROBES if (HAVE_KPROBES)
- select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
- select HAVE_GENERIC_DMA_COHERENT
-+ select HAVE_KERNEL_GZIP
-+ select HAVE_KERNEL_LZO
- help
- The ARM series is a line of low-power-consumption RISC chip designs
- licensed by ARM Ltd and targeted at embedded applications and
---- a/arch/arm/boot/compressed/Makefile
-+++ b/arch/arm/boot/compressed/Makefile
-@@ -63,8 +63,12 @@ endif
-
- SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
-
--targets := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
-- head.o misc.o $(OBJS)
-+suffix_$(CONFIG_KERNEL_GZIP) = gzip
-+suffix_$(CONFIG_KERNEL_LZO) = lzo
-+
-+targets := vmlinux vmlinux.lds \
-+ piggy.$(suffix_y) piggy.$(suffix_y).o \
-+ font.o font.c head.o misc.o $(OBJS)
-
- ifeq ($(CONFIG_FUNCTION_TRACER),y)
- ORIG_CFLAGS := $(KBUILD_CFLAGS)
-@@ -87,22 +91,31 @@ endif
- ifneq ($(PARAMS_PHYS),)
- LDFLAGS_vmlinux += --defsym params_phys=$(PARAMS_PHYS)
- endif
--LDFLAGS_vmlinux += -p --no-undefined -X \
-- $(shell $(CC) $(KBUILD_CFLAGS) --print-libgcc-file-name) -T
-+# ?
-+LDFLAGS_vmlinux += -p
-+# Report unresolved symbol references
-+LDFLAGS_vmlinux += --no-undefined
-+# Delete all temporary local symbols
-+LDFLAGS_vmlinux += -X
-+# Next argument is a linker script
-+LDFLAGS_vmlinux += -T
-+
-+# For __aeabi_uidivmod
-+lib1funcs = $(srctree)/arch/$(SRCARCH)/lib/lib1funcs.o
-
- # Don't allow any static data in misc.o, which
- # would otherwise mess up our GOT table
- CFLAGS_misc.o := -Dstatic=
-
--$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \
-- $(addprefix $(obj)/, $(OBJS)) FORCE
-+$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \
-+ $(addprefix $(obj)/, $(OBJS)) $(lib1funcs) FORCE
- $(call if_changed,ld)
- @:
-
--$(obj)/piggy.gz: $(obj)/../Image FORCE
-- $(call if_changed,gzip)
-+$(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE
-+ $(call if_changed,$(suffix_y))
-
--$(obj)/piggy.o: $(obj)/piggy.gz FORCE
-+$(obj)/piggy.$(suffix_y).o: $(obj)/piggy.$(suffix_y) FORCE
-
- CFLAGS_font.o := -Dstatic=
-
---- a/arch/arm/boot/compressed/misc.c
-+++ b/arch/arm/boot/compressed/misc.c
-@@ -18,10 +18,15 @@
-
- unsigned int __machine_arch_type;
-
-+#define _LINUX_STRING_H_
-+
- #include <linux/compiler.h> /* for inline */
- #include <linux/types.h> /* for size_t */
- #include <linux/stddef.h> /* for NULL */
- #include <asm/string.h>
-+#include <linux/linkage.h>
-+
-+#include <asm/unaligned.h>
-
- #ifdef STANDALONE_DEBUG
- #define putstr printf
-@@ -188,34 +193,8 @@ static inline __ptr_t memcpy(__ptr_t __d
- /*
- * gzip delarations
- */
--#define OF(args) args
- #define STATIC static
-
--typedef unsigned char uch;
--typedef unsigned short ush;
--typedef unsigned long ulg;
--
--#define WSIZE 0x8000 /* Window size must be at least 32k, */
-- /* and a power of two */
--
--static uch *inbuf; /* input buffer */
--static uch window[WSIZE]; /* Sliding window buffer */
--
--static unsigned insize; /* valid bytes in inbuf */
--static unsigned inptr; /* index of next byte to be processed in inbuf */
--static unsigned outcnt; /* bytes in output buffer */
--
--/* gzip flag byte */
--#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
--#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
--#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
--#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
--#define COMMENT 0x10 /* bit 4 set: file comment present */
--#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
--#define RESERVED 0xC0 /* bit 6,7: reserved */
--
--#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf())
--
- /* Diagnostic functions */
- #ifdef DEBUG
- # define Assert(cond,msg) {if(!(cond)) error(msg);}
-@@ -233,24 +212,20 @@ static unsigned outcnt; /* bytes in out
- # define Tracecv(c,x)
- #endif
-
--static int fill_inbuf(void);
--static void flush_window(void);
- static void error(char *m);
-
- extern char input_data[];
- extern char input_data_end[];
-
--static uch *output_data;
--static ulg output_ptr;
--static ulg bytes_out;
-+static unsigned char *output_data;
-+static unsigned long output_ptr;
-
- static void error(char *m);
-
- static void putstr(const char *);
-
--extern int end;
--static ulg free_mem_ptr;
--static ulg free_mem_end_ptr;
-+static unsigned long free_mem_ptr;
-+static unsigned long free_mem_end_ptr;
-
- #ifdef STANDALONE_DEBUG
- #define NO_INFLATE_MALLOC
-@@ -258,46 +233,13 @@ static ulg free_mem_end_ptr;
-
- #define ARCH_HAS_DECOMP_WDOG
-
--#include "../../../../lib/inflate.c"
--
--/* ===========================================================================
-- * Fill the input buffer. This is called only when the buffer is empty
-- * and at least one byte is really needed.
-- */
--int fill_inbuf(void)
--{
-- if (insize != 0)
-- error("ran out of input data");
--
-- inbuf = input_data;
-- insize = &input_data_end[0] - &input_data[0];
--
-- inptr = 1;
-- return inbuf[0];
--}
-+#ifdef CONFIG_KERNEL_GZIP
-+#include "../../../../lib/decompress_inflate.c"
-+#endif
-
--/* ===========================================================================
-- * Write the output window window[0..outcnt-1] and update crc and bytes_out.
-- * (Used for the decompressed data only.)
-- */
--void flush_window(void)
--{
-- ulg c = crc;
-- unsigned n;
-- uch *in, *out, ch;
--
-- in = window;
-- out = &output_data[output_ptr];
-- for (n = 0; n < outcnt; n++) {
-- ch = *out++ = *in++;
-- c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
-- }
-- crc = c;
-- bytes_out += (ulg)outcnt;
-- output_ptr += (ulg)outcnt;
-- outcnt = 0;
-- putstr(".");
--}
-+#ifdef CONFIG_KERNEL_LZO
-+#include "../../../../lib/decompress_unlzo.c"
-+#endif
-
- #ifndef arch_error
- #define arch_error(x)
-@@ -314,22 +256,33 @@ static void error(char *x)
- while(1); /* Halt */
- }
-
-+asmlinkage void __div0(void)
-+{
-+ error("Attempting division by 0!");
-+}
-+
- #ifndef STANDALONE_DEBUG
-
--ulg
--decompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p,
-- int arch_id)
-+unsigned long
-+decompress_kernel(unsigned long output_start, unsigned long free_mem_ptr_p,
-+ unsigned long free_mem_ptr_end_p,
-+ int arch_id)
- {
-- output_data = (uch *)output_start; /* Points to kernel start */
-+ unsigned char *tmp;
-+
-+ output_data = (unsigned char *)output_start;
- free_mem_ptr = free_mem_ptr_p;
- free_mem_end_ptr = free_mem_ptr_end_p;
- __machine_arch_type = arch_id;
-
- arch_decomp_setup();
-
-- makecrc();
-+ tmp = (unsigned char *) (((unsigned long)input_data_end) - 4);
-+ output_ptr = get_unaligned_le32(tmp);
-+
- putstr("Uncompressing Linux...");
-- gunzip();
-+ decompress(input_data, input_data_end - input_data,
-+ NULL, NULL, output_data, NULL, error);
- putstr(" done, booting the kernel.\n");
- return output_ptr;
- }
-@@ -341,11 +294,10 @@ int main()
- {
- output_data = output_buffer;
-
-- makecrc();
- putstr("Uncompressing Linux...");
-- gunzip();
-+ decompress(input_data, input_data_end - input_data,
-+ NULL, NULL, output_data, NULL, error);
- putstr("done.\n");
- return 0;
- }
- #endif
--
---- a/arch/arm/boot/compressed/piggy.S
-+++ /dev/null
-@@ -1,6 +0,0 @@
-- .section .piggydata,#alloc
-- .globl input_data
--input_data:
-- .incbin "arch/arm/boot/compressed/piggy.gz"
-- .globl input_data_end
--input_data_end:
---- /dev/null
-+++ b/arch/arm/boot/compressed/piggy.gzip.S
-@@ -0,0 +1,6 @@
-+ .section .piggydata,#alloc
-+ .globl input_data
-+input_data:
-+ .incbin "arch/arm/boot/compressed/piggy.gzip"
-+ .globl input_data_end
-+input_data_end:
---- /dev/null
-+++ b/arch/arm/boot/compressed/piggy.lzo.S
-@@ -0,0 +1,6 @@
-+ .section .piggydata,#alloc
-+ .globl input_data
-+input_data:
-+ .incbin "arch/arm/boot/compressed/piggy.lzo"
-+ .globl input_data_end
-+input_data_end:
+++ /dev/null
---- a/arch/x86/Kconfig
-+++ b/arch/x86/Kconfig
-@@ -49,6 +49,7 @@ config X86
- select HAVE_KERNEL_GZIP
- select HAVE_KERNEL_BZIP2
- select HAVE_KERNEL_LZMA
-+ select HAVE_KERNEL_LZO
- select HAVE_ARCH_KMEMCHECK
-
- config OUTPUT_FORMAT
---- a/arch/x86/boot/compressed/Makefile
-+++ b/arch/x86/boot/compressed/Makefile
-@@ -4,7 +4,7 @@
- # create a compressed vmlinux image from the original vmlinux
- #
-
--targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma head_$(BITS).o misc.o piggy.o
-+targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma vmlinux.bin.lzo head_$(BITS).o misc.o piggy.o
-
- KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2
- KBUILD_CFLAGS += -fno-strict-aliasing -fPIC
-@@ -48,10 +48,13 @@ $(obj)/vmlinux.bin.bz2: $(vmlinux.bin.al
- $(call if_changed,bzip2)
- $(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE
- $(call if_changed,lzma)
-+$(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE
-+ $(call if_changed,lzo)
-
- suffix-$(CONFIG_KERNEL_GZIP) := gz
- suffix-$(CONFIG_KERNEL_BZIP2) := bz2
- suffix-$(CONFIG_KERNEL_LZMA) := lzma
-+suffix-$(CONFIG_KERNEL_LZO) := lzo
-
- quiet_cmd_mkpiggy = MKPIGGY $@
- cmd_mkpiggy = $(obj)/mkpiggy $< > $@ || ( rm -f $@ ; false )
---- a/arch/x86/boot/compressed/misc.c
-+++ b/arch/x86/boot/compressed/misc.c
-@@ -162,6 +162,10 @@ static int lines, cols;
- #include "../../../../lib/decompress_unlzma.c"
- #endif
-
-+#ifdef CONFIG_KERNEL_LZO
-+#include "../../../../lib/decompress_unlzo.c"
-+#endif
-+
- static void scroll(void)
- {
- int i;
+++ /dev/null
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -120,6 +120,10 @@ config DECOMPRESS_LZMA
- config DECOMPRESS_LZMA_NEEDED
- boolean
-
-+config DECOMPRESS_LZO
-+ select LZO_DECOMPRESS
-+ tristate
-+
- #
- # Generic allocator support is selected if needed
- #
---- a/lib/Makefile
-+++ b/lib/Makefile
-@@ -69,6 +69,7 @@ obj-$(CONFIG_LZO_DECOMPRESS) += lzo/
- lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o
- lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o
- lib-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o
-+lib-$(CONFIG_DECOMPRESS_LZO) += decompress_unlzo.o
-
- obj-$(CONFIG_TEXTSEARCH) += textsearch.o
- obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o
---- a/lib/decompress.c
-+++ b/lib/decompress.c
-@@ -9,6 +9,7 @@
- #include <linux/decompress/bunzip2.h>
- #include <linux/decompress/unlzma.h>
- #include <linux/decompress/inflate.h>
-+#include <linux/decompress/unlzo.h>
-
- #include <linux/types.h>
- #include <linux/string.h>
-@@ -22,6 +23,9 @@
- #ifndef CONFIG_DECOMPRESS_LZMA
- # define unlzma NULL
- #endif
-+#ifndef CONFIG_DECOMPRESS_LZO
-+# define unlzo NULL
-+#endif
-
- static const struct compress_format {
- unsigned char magic[2];
-@@ -32,6 +36,7 @@ static const struct compress_format {
- { {037, 0236}, "gzip", gunzip },
- { {0x42, 0x5a}, "bzip2", bunzip2 },
- { {0x5d, 0x00}, "lzma", unlzma },
-+ { {0x89, 0x4c}, "lzo", unlzo },
- { {0, 0}, NULL, NULL }
- };
-
---- a/usr/Kconfig
-+++ b/usr/Kconfig
-@@ -72,6 +72,15 @@ config RD_LZMA
- Support loading of a LZMA encoded initial ramdisk or cpio buffer
- If unsure, say N.
-
-+config RD_LZO
-+ bool "Support initial ramdisks compressed using LZO" if EMBEDDED
-+ default !EMBEDDED
-+ depends on BLK_DEV_INITRD && HAVE_KERNEL_LZO
-+ select DECOMPRESS_LZO
-+ help
-+ Support loading of a LZO encoded initial ramdisk or cpio buffer
-+ If unsure, say N.
-+
- choice
- prompt "Built-in initramfs compression mode" if INITRAMFS_SOURCE!=""
- help
-@@ -108,16 +117,15 @@ config INITRAMFS_COMPRESSION_GZIP
- bool "Gzip"
- depends on RD_GZIP
- help
-- The old and tried gzip compression. Its compression ratio is
-- the poorest among the 3 choices; however its speed (both
-- compression and decompression) is the fastest.
-+ The old and tried gzip compression. It provides a good balance
-+ between compression ratio and decompression speed.
-
- config INITRAMFS_COMPRESSION_BZIP2
- bool "Bzip2"
- depends on RD_BZIP2
- help
- Its compression ratio and speed is intermediate.
-- Decompression speed is slowest among the three. The initramfs
-+ Decompression speed is slowest among the four. The initramfs
- size is about 10% smaller with bzip2, in comparison to gzip.
- Bzip2 uses a large amount of memory. For modern kernels you
- will need at least 8MB RAM or more for booting.
-@@ -128,7 +136,15 @@ config INITRAMFS_COMPRESSION_LZMA
- help
- The most recent compression algorithm.
- Its ratio is best, decompression speed is between the other
-- two. Compression is slowest. The initramfs size is about 33%
-+ three. Compression is slowest. The initramfs size is about 33%
- smaller with LZMA in comparison to gzip.
-
-+config INITRAMFS_COMPRESSION_LZO
-+ bool "LZO"
-+ depends on RD_LZO
-+ help
-+ Its compression ratio is the poorest among the four. The kernel
-+ size is about about 10% bigger than gzip; however its speed
-+ (both compression and decompression) is the fastest.
-+
- endchoice
+++ /dev/null
-From d0f226a0f104c7d1da1d215b8013359273e39e18 Mon Sep 17 00:00:00 2001
-From: Albin Tonnerre <albin.tonnerre@free-electrons.com>
-Date: Fri, 16 Oct 2009 16:17:22 +0200
-Subject: [PATCH] Add LZMA decompression on ARM
-
-
-Signed-off-by: Albin Tonnerre <albin.tonnerre@free-electrons.com>
----
- arch/arm/Kconfig | 1 +
- arch/arm/boot/compressed/Makefile | 1 +
- arch/arm/boot/compressed/misc.c | 4 ++++
- arch/arm/boot/compressed/piggy.lzma.S | 6 ++++++
- 4 files changed, 12 insertions(+), 0 deletions(-)
- create mode 100644 arch/arm/boot/compressed/piggy.lzma.S
-
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -20,6 +20,7 @@ config ARM
- select HAVE_GENERIC_DMA_COHERENT
- select HAVE_KERNEL_GZIP
- select HAVE_KERNEL_LZO
-+ select HAVE_KERNEL_LZMA
- help
- The ARM series is a line of low-power-consumption RISC chip designs
- licensed by ARM Ltd and targeted at embedded applications and
---- a/arch/arm/boot/compressed/Makefile
-+++ b/arch/arm/boot/compressed/Makefile
-@@ -65,6 +65,7 @@ SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/
-
- suffix_$(CONFIG_KERNEL_GZIP) = gzip
- suffix_$(CONFIG_KERNEL_LZO) = lzo
-+suffix_$(CONFIG_KERNEL_LZMA) = lzma
-
- targets := vmlinux vmlinux.lds \
- piggy.$(suffix_y) piggy.$(suffix_y).o \
---- a/arch/arm/boot/compressed/misc.c
-+++ b/arch/arm/boot/compressed/misc.c
-@@ -237,6 +237,10 @@ static unsigned long free_mem_end_ptr;
- #include "../../../../lib/decompress_inflate.c"
- #endif
-
-+#ifdef CONFIG_KERNEL_LZMA
-+#include "../../../../lib/decompress_unlzma.c"
-+#endif
-+
- #ifdef CONFIG_KERNEL_LZO
- #include "../../../../lib/decompress_unlzo.c"
- #endif
---- /dev/null
-+++ b/arch/arm/boot/compressed/piggy.lzma.S
-@@ -0,0 +1,6 @@
-+ .section .piggydata,#alloc
-+ .globl input_data
-+input_data:
-+ .incbin "arch/arm/boot/compressed/piggy.lzma"
-+ .globl input_data_end
-+input_data_end:
+++ /dev/null
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -14,6 +14,7 @@
- #include <linux/list.h>
- #include <linux/init.h>
- #include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
- #include <linux/buffer_head.h>
- #include <linux/mutex.h>
- #include <linux/mount.h>
-@@ -232,10 +233,11 @@ static void block2mtd_free_device(struct
-
-
- /* FIXME: ensure that mtd->size % erase_size == 0 */
--static struct block2mtd_dev *add_device(char *devname, int erase_size)
-+static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
- {
- struct block_device *bdev;
- struct block2mtd_dev *dev;
-+ struct mtd_partition *part;
- char *name;
-
- if (!devname)
-@@ -273,17 +275,17 @@ static struct block2mtd_dev *add_device(
-
- mutex_init(&dev->write_mutex);
-
-- /* Setup the MTD structure */
-- /* make the name contain the block device in */
-- name = kmalloc(sizeof("block2mtd: ") + strlen(devname) + 1,
-- GFP_KERNEL);
-+ if (!mtdname)
-+ mtdname = devname;
-+
-+ name = kmalloc(strlen(mtdname) + 1, GFP_KERNEL);
- if (!name)
- goto devinit_err;
-
-- sprintf(name, "block2mtd: %s", devname);
-+ strcpy(name, mtdname);
- dev->mtd.name = name;
-
-- dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
-+ dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK & ~(erase_size - 1);
- dev->mtd.erasesize = erase_size;
- dev->mtd.writesize = 1;
- dev->mtd.type = MTD_RAM;
-@@ -296,14 +298,17 @@ static struct block2mtd_dev *add_device(
- dev->mtd.priv = dev;
- dev->mtd.owner = THIS_MODULE;
-
-- if (add_mtd_device(&dev->mtd)) {
-+ part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
-+ part->name = dev->mtd.name;
-+ part->offset = 0;
-+ part->size = dev->mtd.size;
-+ if (add_mtd_partitions(&dev->mtd, part, 1)) {
- /* Device didnt get added, so free the entry */
- goto devinit_err;
- }
- list_add(&dev->list, &blkmtd_device_list);
- INFO("mtd%d: [%s] erase_size = %dKiB [%d]", dev->mtd.index,
-- dev->mtd.name + strlen("block2mtd: "),
-- dev->mtd.erasesize >> 10, dev->mtd.erasesize);
-+ mtdname, dev->mtd.erasesize >> 10, dev->mtd.erasesize);
- return dev;
-
- devinit_err:
-@@ -376,9 +381,9 @@ static char block2mtd_paramline[80 + 12]
-
- static int block2mtd_setup2(const char *val)
- {
-- char buf[80 + 12]; /* 80 for device, 12 for erase size */
-+ char buf[80 + 12 + 80]; /* 80 for device, 12 for erase size, 80 for name */
- char *str = buf;
-- char *token[2];
-+ char *token[3];
- char *name;
- size_t erase_size = PAGE_SIZE;
- int i, ret;
-@@ -389,7 +394,7 @@ static int block2mtd_setup2(const char *
- strcpy(str, val);
- kill_final_newline(str);
-
-- for (i = 0; i < 2; i++)
-+ for (i = 0; i < 3; i++)
- token[i] = strsep(&str, ",");
-
- if (str)
-@@ -408,8 +413,10 @@ static int block2mtd_setup2(const char *
- parse_err("illegal erase size");
- }
- }
-+ if (token[2] && (strlen(token[2]) + 1 > 80))
-+ parse_err("mtd device name too long");
-
-- add_device(name, erase_size);
-+ add_device(name, erase_size, token[2]);
-
- return 0;
- }
-@@ -443,7 +450,7 @@ static int block2mtd_setup(const char *v
-
-
- module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
--MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>]\"");
-+MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>]]\"");
-
- static int __init block2mtd_init(void)
- {
+++ /dev/null
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -53,6 +53,16 @@ config MTD_TESTS
- should normally be compiled as kernel modules. The modules perform
- various checks and verifications when loaded.
-
-+config MTD_ROOTFS_ROOT_DEV
-+ bool "Automatically set 'rootfs' partition to be root filesystem"
-+ depends on MTD_PARTITIONS
-+ default y
-+
-+config MTD_ROOTFS_SPLIT
-+ bool "Automatically split 'rootfs' partition for squashfs"
-+ depends on MTD_PARTITIONS
-+ default y
-+
- config MTD_REDBOOT_PARTS
- tristate "RedBoot partition table parsing"
- depends on MTD_PARTITIONS
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -18,6 +18,8 @@
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/partitions.h>
- #include <linux/mtd/compatmac.h>
-+#include <linux/root_dev.h>
-+#include <linux/magic.h>
-
- /* Our partition linked list */
- static LIST_HEAD(mtd_partitions);
-@@ -35,7 +37,7 @@ struct mtd_part {
- * the pointer to that structure with this macro.
- */
- #define PART(x) ((struct mtd_part *)(x))
--
-+#define IS_PART(mtd) (mtd->read == part_read)
-
- /*
- * MTD methods which simply translate the effective address and pass through
-@@ -502,6 +504,150 @@ out_register:
- return slave;
- }
-
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+#define ROOTFS_SPLIT_NAME "rootfs_data"
-+#define ROOTFS_REMOVED_NAME "<removed>"
-+
-+struct squashfs_super_block {
-+ __le32 s_magic;
-+ __le32 pad0[9];
-+ __le64 bytes_used;
-+};
-+
-+
-+static int split_squashfs(struct mtd_info *master, int offset, int *split_offset)
-+{
-+ struct squashfs_super_block sb;
-+ int len, ret;
-+
-+ ret = master->read(master, offset, sizeof(sb), &len, (void *) &sb);
-+ if (ret || (len != sizeof(sb))) {
-+ printk(KERN_ALERT "split_squashfs: error occured while reading "
-+ "from \"%s\"\n", master->name);
-+ return -EINVAL;
-+ }
-+
-+ if (SQUASHFS_MAGIC != le32_to_cpu(sb.s_magic) ) {
-+ printk(KERN_ALERT "split_squashfs: no squashfs found in \"%s\"\n",
-+ master->name);
-+ *split_offset = 0;
-+ return 0;
-+ }
-+
-+ if (le64_to_cpu((sb.bytes_used)) <= 0) {
-+ printk(KERN_ALERT "split_squashfs: squashfs is empty in \"%s\"\n",
-+ master->name);
-+ *split_offset = 0;
-+ return 0;
-+ }
-+
-+ len = (u32) le64_to_cpu(sb.bytes_used);
-+ len += (offset & 0x000fffff);
-+ len += (master->erasesize - 1);
-+ len &= ~(master->erasesize - 1);
-+ len -= (offset & 0x000fffff);
-+ *split_offset = offset + len;
-+
-+ return 0;
-+}
-+
-+static int split_rootfs_data(struct mtd_info *master, struct mtd_info *rpart, const struct mtd_partition *part)
-+{
-+ struct mtd_partition *dpart;
-+ struct mtd_part *slave = NULL;
-+ int split_offset = 0;
-+ int ret;
-+
-+ ret = split_squashfs(master, part->offset, &split_offset);
-+ if (ret)
-+ return ret;
-+
-+ if (split_offset <= 0)
-+ return 0;
-+
-+ dpart = kmalloc(sizeof(*part)+sizeof(ROOTFS_SPLIT_NAME)+1, GFP_KERNEL);
-+ if (dpart == NULL) {
-+ printk(KERN_INFO "split_squashfs: no memory for partition \"%s\"\n",
-+ ROOTFS_SPLIT_NAME);
-+ return -ENOMEM;
-+ }
-+
-+ memcpy(dpart, part, sizeof(*part));
-+ dpart->name = (unsigned char *)&dpart[1];
-+ strcpy(dpart->name, ROOTFS_SPLIT_NAME);
-+
-+ dpart->size -= split_offset - dpart->offset;
-+ dpart->offset = split_offset;
-+
-+ if (dpart == NULL)
-+ return 1;
-+
-+ printk(KERN_INFO "mtd: partition \"%s\" created automatically, ofs=%llX, len=%llX \n",
-+ ROOTFS_SPLIT_NAME, dpart->offset, dpart->size);
-+
-+ slave = add_one_partition(master, dpart, 0, split_offset);
-+ if (!slave) {
-+ kfree(dpart);
-+ return -ENOMEM;
-+ }
-+ rpart->split = &slave->mtd;
-+
-+ return 0;
-+}
-+
-+static int refresh_rootfs_split(struct mtd_info *mtd)
-+{
-+ struct mtd_partition tpart;
-+ struct mtd_part *part;
-+ char *name;
-+ //int index = 0;
-+ int offset, size;
-+ int ret;
-+
-+ part = PART(mtd);
-+
-+ /* check for the new squashfs offset first */
-+ ret = split_squashfs(part->master, part->offset, &offset);
-+ if (ret)
-+ return ret;
-+
-+ if ((offset > 0) && !mtd->split) {
-+ printk(KERN_INFO "%s: creating new split partition for \"%s\"\n", __func__, mtd->name);
-+ /* if we don't have a rootfs split partition, create a new one */
-+ tpart.name = (char *) mtd->name;
-+ tpart.size = mtd->size;
-+ tpart.offset = part->offset;
-+
-+ return split_rootfs_data(part->master, &part->mtd, &tpart);
-+ } else if ((offset > 0) && mtd->split) {
-+ /* update the offsets of the existing partition */
-+ size = mtd->size + part->offset - offset;
-+
-+ part = PART(mtd->split);
-+ part->offset = offset;
-+ part->mtd.size = size;
-+ printk(KERN_INFO "%s: %s partition \"" ROOTFS_SPLIT_NAME "\", offset: 0x%06x (0x%06x)\n",
-+ __func__, (!strcmp(part->mtd.name, ROOTFS_SPLIT_NAME) ? "updating" : "creating"),
-+ (u32) part->offset, (u32) part->mtd.size);
-+ name = kmalloc(sizeof(ROOTFS_SPLIT_NAME) + 1, GFP_KERNEL);
-+ strcpy(name, ROOTFS_SPLIT_NAME);
-+ part->mtd.name = name;
-+ } else if ((offset <= 0) && mtd->split) {
-+ printk(KERN_INFO "%s: removing partition \"%s\"\n", __func__, mtd->split->name);
-+
-+ /* mark existing partition as removed */
-+ part = PART(mtd->split);
-+ name = kmalloc(sizeof(ROOTFS_SPLIT_NAME) + 1, GFP_KERNEL);
-+ strcpy(name, ROOTFS_REMOVED_NAME);
-+ part->mtd.name = name;
-+ part->offset = 0;
-+ part->mtd.size = 0;
-+ }
-+
-+ return 0;
-+}
-+#endif /* CONFIG_MTD_ROOTFS_SPLIT */
-+
- /*
- * This function, given a master MTD object and a partition table, creates
- * and registers slave MTD objects which are bound to the master according to
-@@ -517,7 +663,7 @@ int add_mtd_partitions(struct mtd_info *
- {
- struct mtd_part *slave;
- uint64_t cur_offset = 0;
-- int i;
-+ int i, ret;
-
- printk(KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name);
-
-@@ -525,6 +671,21 @@ int add_mtd_partitions(struct mtd_info *
- slave = add_one_partition(master, parts + i, i, cur_offset);
- if (!slave)
- return -ENOMEM;
-+
-+ if (!strcmp(parts[i].name, "rootfs")) {
-+#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV
-+ if (ROOT_DEV == 0) {
-+ printk(KERN_NOTICE "mtd: partition \"rootfs\" "
-+ "set to be root filesystem\n");
-+ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, slave->mtd.index);
-+ }
-+#endif
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+ ret = split_rootfs_data(master, &slave->mtd, &parts[i]);
-+ /* if (ret == 0)
-+ j++; */
-+#endif
-+ }
- cur_offset = slave->offset + slave->mtd.size;
- }
-
-@@ -532,6 +693,32 @@ int add_mtd_partitions(struct mtd_info *
- }
- EXPORT_SYMBOL(add_mtd_partitions);
-
-+int refresh_mtd_partitions(struct mtd_info *mtd)
-+{
-+ int ret = 0;
-+
-+ if (IS_PART(mtd)) {
-+ struct mtd_part *part;
-+ struct mtd_info *master;
-+
-+ part = PART(mtd);
-+ master = part->master;
-+ if (master->refresh_device)
-+ ret = master->refresh_device(master);
-+ }
-+
-+ if (!ret && mtd->refresh_device)
-+ ret = mtd->refresh_device(mtd);
-+
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+ if (!ret && IS_PART(mtd) && !strcmp(mtd->name, "rootfs"))
-+ refresh_rootfs_split(mtd);
-+#endif
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(refresh_mtd_partitions);
-+
- static DEFINE_SPINLOCK(part_parser_lock);
- static LIST_HEAD(part_parsers);
-
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -29,6 +29,8 @@ struct block2mtd_dev {
- struct block_device *blkdev;
- struct mtd_info mtd;
- struct mutex write_mutex;
-+ rwlock_t bdev_mutex;
-+ char devname[0];
- };
-
-
-@@ -81,6 +83,12 @@ static int block2mtd_erase(struct mtd_in
- size_t len = instr->len;
- int err;
-
-+ read_lock(&dev->bdev_mutex);
-+ if (!dev->blkdev) {
-+ err = -EINVAL;
-+ goto done;
-+ }
-+
- instr->state = MTD_ERASING;
- mutex_lock(&dev->write_mutex);
- err = _block2mtd_erase(dev, from, len);
-@@ -93,6 +101,10 @@ static int block2mtd_erase(struct mtd_in
-
- instr->state = MTD_ERASE_DONE;
- mtd_erase_callback(instr);
-+
-+done:
-+ read_unlock(&dev->bdev_mutex);
-+
- return err;
- }
-
-@@ -104,10 +116,14 @@ static int block2mtd_read(struct mtd_inf
- struct page *page;
- int index = from >> PAGE_SHIFT;
- int offset = from & (PAGE_SIZE-1);
-- int cpylen;
-+ int cpylen, err = 0;
-+
-+ read_lock(&dev->bdev_mutex);
-+ if (!dev->blkdev || (from > mtd->size)) {
-+ err = -EINVAL;
-+ goto done;
-+ }
-
-- if (from > mtd->size)
-- return -EINVAL;
- if (from + len > mtd->size)
- len = mtd->size - from;
-
-@@ -122,10 +138,14 @@ static int block2mtd_read(struct mtd_inf
- len = len - cpylen;
-
- page = page_read(dev->blkdev->bd_inode->i_mapping, index);
-- if (!page)
-- return -ENOMEM;
-- if (IS_ERR(page))
-- return PTR_ERR(page);
-+ if (!page) {
-+ err = -ENOMEM;
-+ goto done;
-+ }
-+ if (IS_ERR(page)) {
-+ err = PTR_ERR(page);
-+ goto done;
-+ }
-
- memcpy(buf, page_address(page) + offset, cpylen);
- page_cache_release(page);
-@@ -136,7 +156,10 @@ static int block2mtd_read(struct mtd_inf
- offset = 0;
- index++;
- }
-- return 0;
-+
-+done:
-+ read_unlock(&dev->bdev_mutex);
-+ return err;
- }
-
-
-@@ -188,12 +211,22 @@ static int block2mtd_write(struct mtd_in
- size_t *retlen, const u_char *buf)
- {
- struct block2mtd_dev *dev = mtd->priv;
-- int err;
-+ int err = 0;
-+
-+ read_lock(&dev->bdev_mutex);
-+ if (!dev->blkdev) {
-+ err = -EINVAL;
-+ goto done;
-+ }
-
- if (!len)
-- return 0;
-- if (to >= mtd->size)
-- return -ENOSPC;
-+ goto done;
-+
-+ if (to >= mtd->size) {
-+ err = -ENOSPC;
-+ goto done;
-+ }
-+
- if (to + len > mtd->size)
- len = mtd->size - to;
-
-@@ -202,6 +235,9 @@ static int block2mtd_write(struct mtd_in
- mutex_unlock(&dev->write_mutex);
- if (err > 0)
- err = 0;
-+
-+done:
-+ read_unlock(&dev->bdev_mutex);
- return err;
- }
-
-@@ -210,52 +246,29 @@ static int block2mtd_write(struct mtd_in
- static void block2mtd_sync(struct mtd_info *mtd)
- {
- struct block2mtd_dev *dev = mtd->priv;
-- sync_blockdev(dev->blkdev);
-- return;
--}
--
--
--static void block2mtd_free_device(struct block2mtd_dev *dev)
--{
-- if (!dev)
-- return;
--
-- kfree(dev->mtd.name);
-
-- if (dev->blkdev) {
-- invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
-- 0, -1);
-- close_bdev_exclusive(dev->blkdev, FMODE_READ|FMODE_WRITE);
-- }
-+ read_lock(&dev->bdev_mutex);
-+ if (dev->blkdev)
-+ sync_blockdev(dev->blkdev);
-+ read_unlock(&dev->bdev_mutex);
-
-- kfree(dev);
-+ return;
- }
-
-
--/* FIXME: ensure that mtd->size % erase_size == 0 */
--static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
-+static int _open_bdev(struct block2mtd_dev *dev)
- {
- struct block_device *bdev;
-- struct block2mtd_dev *dev;
-- struct mtd_partition *part;
-- char *name;
--
-- if (!devname)
-- return NULL;
--
-- dev = kzalloc(sizeof(struct block2mtd_dev), GFP_KERNEL);
-- if (!dev)
-- return NULL;
-
- /* Get a handle on the device */
-- bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, NULL);
-+ bdev = open_bdev_exclusive(dev->devname, FMODE_READ|FMODE_WRITE, NULL);
- #ifndef MODULE
- if (IS_ERR(bdev)) {
-
- /* We might not have rootfs mounted at this point. Try
- to resolve the device name by other means. */
-
-- dev_t devt = name_to_dev_t(devname);
-+ dev_t devt = name_to_dev_t(dev->devname);
- if (devt) {
- bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
- }
-@@ -263,17 +276,98 @@ static struct block2mtd_dev *add_device(
- #endif
-
- if (IS_ERR(bdev)) {
-- ERROR("error: cannot open device %s", devname);
-- goto devinit_err;
-+ ERROR("error: cannot open device %s", dev->devname);
-+ return 1;
- }
- dev->blkdev = bdev;
-
- if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) {
- ERROR("attempting to use an MTD device as a block device");
-- goto devinit_err;
-+ return 1;
- }
-
-+ return 0;
-+}
-+
-+static void _close_bdev(struct block2mtd_dev *dev)
-+{
-+ struct block_device *bdev;
-+
-+ if (!dev->blkdev)
-+ return;
-+
-+ bdev = dev->blkdev;
-+ invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, 0, -1);
-+ close_bdev_exclusive(dev->blkdev, FMODE_READ|FMODE_WRITE);
-+ dev->blkdev = NULL;
-+}
-+
-+static void block2mtd_free_device(struct block2mtd_dev *dev)
-+{
-+ if (!dev)
-+ return;
-+
-+ kfree(dev->mtd.name);
-+ _close_bdev(dev);
-+ kfree(dev);
-+}
-+
-+
-+static int block2mtd_refresh(struct mtd_info *mtd)
-+{
-+ struct block2mtd_dev *dev = mtd->priv;
-+ struct block_device *bdev;
-+ dev_t devt;
-+ int err = 0;
-+
-+ /* no other mtd function can run at this point */
-+ write_lock(&dev->bdev_mutex);
-+
-+ /* get the device number for the whole disk */
-+ devt = MKDEV(MAJOR(dev->blkdev->bd_dev), 0);
-+
-+ /* close the old block device */
-+ _close_bdev(dev);
-+
-+ /* open the whole disk, issue a partition rescan, then */
-+ bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
-+ if (!bdev || !bdev->bd_disk)
-+ err = -EINVAL;
-+#ifndef CONFIG_MTD_BLOCK2MTD_MODULE
-+ else
-+ err = rescan_partitions(bdev->bd_disk, bdev);
-+#endif
-+ if (bdev)
-+ close_bdev_exclusive(bdev, FMODE_READ|FMODE_WRITE);
-+
-+ /* try to open the partition block device again */
-+ _open_bdev(dev);
-+ write_unlock(&dev->bdev_mutex);
-+
-+ return err;
-+}
-+
-+/* FIXME: ensure that mtd->size % erase_size == 0 */
-+static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname)
-+{
-+ struct block2mtd_dev *dev;
-+ struct mtd_partition *part;
-+ char *name;
-+
-+ if (!devname)
-+ return NULL;
-+
-+ dev = kzalloc(sizeof(struct block2mtd_dev) + strlen(devname) + 1, GFP_KERNEL);
-+ if (!dev)
-+ return NULL;
-+
-+ strcpy(dev->devname, devname);
-+
-+ if (_open_bdev(dev))
-+ goto devinit_err;
-+
- mutex_init(&dev->write_mutex);
-+ rwlock_init(&dev->bdev_mutex);
-
- if (!mtdname)
- mtdname = devname;
-@@ -297,6 +391,7 @@ static struct block2mtd_dev *add_device(
- dev->mtd.read = block2mtd_read;
- dev->mtd.priv = dev;
- dev->mtd.owner = THIS_MODULE;
-+ dev->mtd.refresh_device = block2mtd_refresh;
-
- part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
- part->name = dev->mtd.name;
---- a/drivers/mtd/mtdchar.c
-+++ b/drivers/mtd/mtdchar.c
-@@ -18,6 +18,7 @@
-
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/compatmac.h>
-+#include <linux/mtd/partitions.h>
-
- #include <asm/uaccess.h>
-
-@@ -814,6 +815,13 @@ static int mtd_ioctl(struct inode *inode
- file->f_pos = 0;
- break;
- }
-+#ifdef CONFIG_MTD_PARTITIONS
-+ case MTDREFRESH:
-+ {
-+ ret = refresh_mtd_partitions(mtd);
-+ break;
-+ }
-+#endif
-
- default:
- ret = -ENOTTY;
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -101,6 +101,7 @@ struct mtd_oob_ops {
- uint8_t *oobbuf;
- };
-
-+struct mtd_info;
- struct mtd_info {
- u_char type;
- uint32_t flags;
-@@ -241,6 +242,9 @@ struct mtd_info {
- struct device dev;
- int usecount;
-
-+ int (*refresh_device)(struct mtd_info *mtd);
-+ struct mtd_info *split;
-+
- /* If the driver is something smart, like UBI, it may need to maintain
- * its own reference counting. The below functions are only for driver.
- * The driver may register its callbacks. These callbacks are not
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -34,12 +34,14 @@
- * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK).
- */
-
-+struct mtd_partition;
- struct mtd_partition {
- char *name; /* identifier string */
- uint64_t size; /* partition size */
- uint64_t offset; /* offset within the master MTD space */
- uint32_t mask_flags; /* master MTD flags to mask out for this partition */
- struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/
-+ int (*refresh_partition)(struct mtd_info *);
- };
-
- #define MTDPART_OFS_NXTBLK (-2)
-@@ -51,6 +53,7 @@ struct mtd_info;
-
- int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
- int del_mtd_partitions(struct mtd_info *);
-+int refresh_mtd_partitions(struct mtd_info *);
-
- /*
- * Functions dealing with the various ways of partitioning the space
---- a/include/mtd/mtd-abi.h
-+++ b/include/mtd/mtd-abi.h
-@@ -110,6 +110,7 @@ struct otp_info {
- #define MEMERASE64 _IOW('M', 20, struct erase_info_user64)
- #define MEMWRITEOOB64 _IOWR('M', 21, struct mtd_oob_buf64)
- #define MEMREADOOB64 _IOWR('M', 22, struct mtd_oob_buf64)
-+#define MTDREFRESH _IO('M', 23)
-
- /*
- * Obsolete legacy interface. Keep it in order not to break userspace
+++ /dev/null
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -268,6 +268,7 @@ static int _open_bdev(struct block2mtd_d
- /* We might not have rootfs mounted at this point. Try
- to resolve the device name by other means. */
-
-+ wait_for_device_probe();
- dev_t devt = name_to_dev_t(dev->devname);
- if (devt) {
- bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
+++ /dev/null
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -249,14 +249,21 @@ static int parse_redboot_partitions(stru
- #endif
- names += strlen(names)+1;
-
--#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
- if(fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_base) {
-- i++;
-- parts[i].offset = parts[i-1].size + parts[i-1].offset;
-- parts[i].size = fl->next->img->flash_base - parts[i].offset;
-- parts[i].name = nullname;
-- }
-+ if (!strcmp(parts[i].name, "rootfs")) {
-+ parts[i].size = fl->next->img->flash_base;
-+ parts[i].size &= ~(master->erasesize - 1);
-+ parts[i].size -= parts[i].offset;
-+#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
-+ nrparts--;
-+ } else {
-+ i++;
-+ parts[i].offset = parts[i-1].size + parts[i-1].offset;
-+ parts[i].size = fl->next->img->flash_base - parts[i].offset;
-+ parts[i].name = nullname;
- #endif
-+ }
-+ }
- tmp_fl = fl;
- fl = fl->next;
- kfree(tmp_fl);
+++ /dev/null
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -11,6 +11,8 @@
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/partitions.h>
-
-+#define BOARD_CONFIG_PART "boardconfig"
-+
- struct fis_image_desc {
- unsigned char name[16]; // Null terminated name
- uint32_t flash_base; // Address within FLASH of image
-@@ -41,6 +43,7 @@ static int parse_redboot_partitions(stru
- struct mtd_partition **pparts,
- unsigned long fis_origin)
- {
-+ unsigned long max_offset = 0;
- int nrparts = 0;
- struct fis_image_desc *buf;
- struct mtd_partition *parts;
-@@ -209,14 +212,14 @@ static int parse_redboot_partitions(stru
- }
- }
- #endif
-- parts = kzalloc(sizeof(*parts)*nrparts + nulllen + namelen, GFP_KERNEL);
-+ parts = kzalloc(sizeof(*parts) * (nrparts + 1) + nulllen + namelen + sizeof(BOARD_CONFIG_PART), GFP_KERNEL);
-
- if (!parts) {
- ret = -ENOMEM;
- goto out;
- }
-
-- nullname = (char *)&parts[nrparts];
-+ nullname = (char *)&parts[nrparts + 1];
- #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
- if (nulllen > 0) {
- strcpy(nullname, nullstring);
-@@ -235,6 +238,8 @@ static int parse_redboot_partitions(stru
- }
- #endif
- for ( ; i<nrparts; i++) {
-+ if(max_offset < buf[i].flash_base + buf[i].size)
-+ max_offset = buf[i].flash_base + buf[i].size;
- parts[i].size = fl->img->size;
- parts[i].offset = fl->img->flash_base;
- parts[i].name = names;
-@@ -268,6 +273,14 @@ static int parse_redboot_partitions(stru
- fl = fl->next;
- kfree(tmp_fl);
- }
-+ if(master->size - max_offset >= master->erasesize)
-+ {
-+ parts[nrparts].size = master->size - max_offset;
-+ parts[nrparts].offset = max_offset;
-+ parts[nrparts].name = names;
-+ strcpy(names, BOARD_CONFIG_PART);
-+ nrparts++;
-+ }
- ret = nrparts;
- *pparts = parts;
- out:
+++ /dev/null
---- a/include/linux/mtd/nand.h
-+++ b/include/linux/mtd/nand.h
-@@ -575,6 +575,7 @@ struct platform_nand_chip {
- int chip_delay;
- unsigned int options;
- const char **part_probe_types;
-+ int (*chip_fixup)(struct mtd_info *mtd);
- void (*set_parts)(uint64_t size,
- struct platform_nand_chip *chip);
- void *priv;
---- a/drivers/mtd/nand/plat_nand.c
-+++ b/drivers/mtd/nand/plat_nand.c
-@@ -80,7 +80,18 @@ static int __devinit plat_nand_probe(str
- }
-
- /* Scan to find existance of the device */
-- if (nand_scan(&data->mtd, 1)) {
-+ if (nand_scan_ident(&data->mtd, 1)) {
-+ res = -ENXIO;
-+ goto out;
-+ }
-+
-+ if (pdata->chip.chip_fixup) {
-+ res = pdata->chip.chip_fixup(&data->mtd);
-+ if (res)
-+ goto out;
-+ }
-+
-+ if (nand_scan_tail(&data->mtd)) {
- res = -ENXIO;
- goto out;
- }
+++ /dev/null
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -181,6 +181,22 @@ config MTD_AR7_PARTS
- ---help---
- TI AR7 partitioning support
-
-+config MTD_MYLOADER_PARTS
-+ tristate "MyLoader partition parsing"
-+ depends on MTD_PARTITIONS && (ADM5120 || ATHEROS_AR231X || ATHEROS_AR71XX)
-+ ---help---
-+ MyLoader is a bootloader which allows the user to define partitions
-+ in flash devices, by putting a table in the second erase block
-+ on the device, similar to a partition table. This table gives the
-+ offsets and lengths of the user defined partitions.
-+
-+ If you need code which can detect and parse these tables, and
-+ register MTD 'partitions' corresponding to each image detected,
-+ enable this option.
-+
-+ You will still need the parsing functions to be called by the driver
-+ for your particular device. It won't happen automatically.
-+
- comment "User Modules And Translation Layers"
-
- config MTD_CHAR
---- a/drivers/mtd/Makefile
-+++ b/drivers/mtd/Makefile
-@@ -13,6 +13,7 @@ obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdli
- obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
- obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o
- obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
-+obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
-
- # 'Users' - code which presents functionality to userspace.
- obj-$(CONFIG_MTD_CHAR) += mtdchar.o
+++ /dev/null
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -33,6 +33,7 @@
- * Note: writeable partitions require their size and offset be
- * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK).
- */
-+struct mtd_info;
-
- struct mtd_partition;
- struct mtd_partition {
-@@ -49,7 +50,6 @@ struct mtd_partition {
- #define MTDPART_SIZ_FULL (0)
-
-
--struct mtd_info;
-
- int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
- int del_mtd_partitions(struct mtd_info *);
+++ /dev/null
---- a/drivers/mtd/nand/nand_ecc.c
-+++ b/drivers/mtd/nand/nand_ecc.c
-@@ -492,8 +492,7 @@ int nand_correct_data(struct mtd_info *m
- if ((bitsperbyte[b0] + bitsperbyte[b1] + bitsperbyte[b2]) == 1)
- return 1; /* error in ecc data; no action needed */
-
-- printk(KERN_ERR "uncorrectable error : ");
-- return -1;
-+ return -EBADMSG;
- }
- EXPORT_SYMBOL(nand_correct_data);
-
+++ /dev/null
---- /dev/null
-+++ b/include/linux/netfilter/xt_layer7.h
-@@ -0,0 +1,13 @@
-+#ifndef _XT_LAYER7_H
-+#define _XT_LAYER7_H
-+
-+#define MAX_PATTERN_LEN 8192
-+#define MAX_PROTOCOL_LEN 256
-+
-+struct xt_layer7_info {
-+ char protocol[MAX_PROTOCOL_LEN];
-+ char pattern[MAX_PATTERN_LEN];
-+ u_int8_t invert;
-+};
-+
-+#endif /* _XT_LAYER7_H */
---- a/include/net/netfilter/nf_conntrack.h
-+++ b/include/net/netfilter/nf_conntrack.h
-@@ -116,6 +116,22 @@ struct nf_conn {
- u_int32_t secmark;
- #endif
-
-+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || \
-+ defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+ struct {
-+ /*
-+ * e.g. "http". NULL before decision. "unknown" after decision
-+ * if no match.
-+ */
-+ char *app_proto;
-+ /*
-+ * application layer data so far. NULL after match decision.
-+ */
-+ char *app_data;
-+ unsigned int app_data_len;
-+ } layer7;
-+#endif
-+
- /* Storage reserved for other modules: */
- union nf_conntrack_proto proto;
-
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -858,6 +858,27 @@ config NETFILTER_XT_MATCH_STATE
-
- To compile it as a module, choose M here. If unsure, say N.
-
-+config NETFILTER_XT_MATCH_LAYER7
-+ tristate '"layer7" match support'
-+ depends on NETFILTER_XTABLES
-+ depends on EXPERIMENTAL && (IP_NF_CONNTRACK || NF_CONNTRACK)
-+ depends on NF_CT_ACCT
-+ help
-+ Say Y if you want to be able to classify connections (and their
-+ packets) based on regular expression matching of their application
-+ layer data. This is one way to classify applications such as
-+ peer-to-peer filesharing systems that do not always use the same
-+ port.
-+
-+ To compile it as a module, choose M here. If unsure, say N.
-+
-+config NETFILTER_XT_MATCH_LAYER7_DEBUG
-+ bool 'Layer 7 debugging output'
-+ depends on NETFILTER_XT_MATCH_LAYER7
-+ help
-+ Say Y to get lots of debugging output.
-+
-+
- config NETFILTER_XT_MATCH_STATISTIC
- tristate '"statistic" match support'
- depends on NETFILTER_ADVANCED
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -89,6 +89,7 @@ obj-$(CONFIG_NETFILTER_XT_MATCH_RECENT)
- obj-$(CONFIG_NETFILTER_XT_MATCH_SCTP) += xt_sctp.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_SOCKET) += xt_socket.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STATE) += xt_state.o
-+obj-$(CONFIG_NETFILTER_XT_MATCH_LAYER7) += xt_layer7.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STATISTIC) += xt_statistic.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STRING) += xt_string.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_TCPMSS) += xt_tcpmss.o
---- a/net/netfilter/nf_conntrack_core.c
-+++ b/net/netfilter/nf_conntrack_core.c
-@@ -200,6 +200,14 @@ destroy_conntrack(struct nf_conntrack *n
- * too. */
- nf_ct_remove_expectations(ct);
-
-+ #if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+ if(ct->layer7.app_proto)
-+ kfree(ct->layer7.app_proto);
-+ if(ct->layer7.app_data)
-+ kfree(ct->layer7.app_data);
-+ #endif
-+
-+
- /* We overload first tuple to link into unconfirmed list. */
- if (!nf_ct_is_confirmed(ct)) {
- BUG_ON(hlist_nulls_unhashed(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode));
---- a/net/netfilter/nf_conntrack_standalone.c
-+++ b/net/netfilter/nf_conntrack_standalone.c
-@@ -171,6 +171,12 @@ static int ct_seq_show(struct seq_file *
- goto release;
- #endif
-
-+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+ if(ct->layer7.app_proto &&
-+ seq_printf(s, "l7proto=%s ", ct->layer7.app_proto))
-+ return -ENOSPC;
-+#endif
-+
- if (seq_printf(s, "use=%u\n", atomic_read(&ct->ct_general.use)))
- goto release;
-
---- /dev/null
-+++ b/net/netfilter/regexp/regexp.c
-@@ -0,0 +1,1197 @@
-+/*
-+ * regcomp and regexec -- regsub and regerror are elsewhere
-+ * @(#)regexp.c 1.3 of 18 April 87
-+ *
-+ * Copyright (c) 1986 by University of Toronto.
-+ * Written by Henry Spencer. Not derived from licensed software.
-+ *
-+ * Permission is granted to anyone to use this software for any
-+ * purpose on any computer system, and to redistribute it freely,
-+ * subject to the following restrictions:
-+ *
-+ * 1. The author is not responsible for the consequences of use of
-+ * this software, no matter how awful, even if they arise
-+ * from defects in it.
-+ *
-+ * 2. The origin of this software must not be misrepresented, either
-+ * by explicit claim or by omission.
-+ *
-+ * 3. Altered versions must be plainly marked as such, and must not
-+ * be misrepresented as being the original software.
-+ *
-+ * Beware that some of this code is subtly aware of the way operator
-+ * precedence is structured in regular expressions. Serious changes in
-+ * regular-expression syntax might require a total rethink.
-+ *
-+ * This code was modified by Ethan Sommer to work within the kernel
-+ * (it now uses kmalloc etc..)
-+ *
-+ * Modified slightly by Matthew Strait to use more modern C.
-+ */
-+
-+#include "regexp.h"
-+#include "regmagic.h"
-+
-+/* added by ethan and matt. Lets it work in both kernel and user space.
-+(So iptables can use it, for instance.) Yea, it goes both ways... */
-+#if __KERNEL__
-+ #define malloc(foo) kmalloc(foo,GFP_ATOMIC)
-+#else
-+ #define printk(format,args...) printf(format,##args)
-+#endif
-+
-+void regerror(char * s)
-+{
-+ printk("<3>Regexp: %s\n", s);
-+ /* NOTREACHED */
-+}
-+
-+/*
-+ * The "internal use only" fields in regexp.h are present to pass info from
-+ * compile to execute that permits the execute phase to run lots faster on
-+ * simple cases. They are:
-+ *
-+ * regstart char that must begin a match; '\0' if none obvious
-+ * reganch is the match anchored (at beginning-of-line only)?
-+ * regmust string (pointer into program) that match must include, or NULL
-+ * regmlen length of regmust string
-+ *
-+ * Regstart and reganch permit very fast decisions on suitable starting points
-+ * for a match, cutting down the work a lot. Regmust permits fast rejection
-+ * of lines that cannot possibly match. The regmust tests are costly enough
-+ * that regcomp() supplies a regmust only if the r.e. contains something
-+ * potentially expensive (at present, the only such thing detected is * or +
-+ * at the start of the r.e., which can involve a lot of backup). Regmlen is
-+ * supplied because the test in regexec() needs it and regcomp() is computing
-+ * it anyway.
-+ */
-+
-+/*
-+ * Structure for regexp "program". This is essentially a linear encoding
-+ * of a nondeterministic finite-state machine (aka syntax charts or
-+ * "railroad normal form" in parsing technology). Each node is an opcode
-+ * plus a "next" pointer, possibly plus an operand. "Next" pointers of
-+ * all nodes except BRANCH implement concatenation; a "next" pointer with
-+ * a BRANCH on both ends of it is connecting two alternatives. (Here we
-+ * have one of the subtle syntax dependencies: an individual BRANCH (as
-+ * opposed to a collection of them) is never concatenated with anything
-+ * because of operator precedence.) The operand of some types of node is
-+ * a literal string; for others, it is a node leading into a sub-FSM. In
-+ * particular, the operand of a BRANCH node is the first node of the branch.
-+ * (NB this is *not* a tree structure: the tail of the branch connects
-+ * to the thing following the set of BRANCHes.) The opcodes are:
-+ */
-+
-+/* definition number opnd? meaning */
-+#define END 0 /* no End of program. */
-+#define BOL 1 /* no Match "" at beginning of line. */
-+#define EOL 2 /* no Match "" at end of line. */
-+#define ANY 3 /* no Match any one character. */
-+#define ANYOF 4 /* str Match any character in this string. */
-+#define ANYBUT 5 /* str Match any character not in this string. */
-+#define BRANCH 6 /* node Match this alternative, or the next... */
-+#define BACK 7 /* no Match "", "next" ptr points backward. */
-+#define EXACTLY 8 /* str Match this string. */
-+#define NOTHING 9 /* no Match empty string. */
-+#define STAR 10 /* node Match this (simple) thing 0 or more times. */
-+#define PLUS 11 /* node Match this (simple) thing 1 or more times. */
-+#define OPEN 20 /* no Mark this point in input as start of #n. */
-+ /* OPEN+1 is number 1, etc. */
-+#define CLOSE 30 /* no Analogous to OPEN. */
-+
-+/*
-+ * Opcode notes:
-+ *
-+ * BRANCH The set of branches constituting a single choice are hooked
-+ * together with their "next" pointers, since precedence prevents
-+ * anything being concatenated to any individual branch. The
-+ * "next" pointer of the last BRANCH in a choice points to the
-+ * thing following the whole choice. This is also where the
-+ * final "next" pointer of each individual branch points; each
-+ * branch starts with the operand node of a BRANCH node.
-+ *
-+ * BACK Normal "next" pointers all implicitly point forward; BACK
-+ * exists to make loop structures possible.
-+ *
-+ * STAR,PLUS '?', and complex '*' and '+', are implemented as circular
-+ * BRANCH structures using BACK. Simple cases (one character
-+ * per match) are implemented with STAR and PLUS for speed
-+ * and to minimize recursive plunges.
-+ *
-+ * OPEN,CLOSE ...are numbered at compile time.
-+ */
-+
-+/*
-+ * A node is one char of opcode followed by two chars of "next" pointer.
-+ * "Next" pointers are stored as two 8-bit pieces, high order first. The
-+ * value is a positive offset from the opcode of the node containing it.
-+ * An operand, if any, simply follows the node. (Note that much of the
-+ * code generation knows about this implicit relationship.)
-+ *
-+ * Using two bytes for the "next" pointer is vast overkill for most things,
-+ * but allows patterns to get big without disasters.
-+ */
-+#define OP(p) (*(p))
-+#define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377))
-+#define OPERAND(p) ((p) + 3)
-+
-+/*
-+ * See regmagic.h for one further detail of program structure.
-+ */
-+
-+
-+/*
-+ * Utility definitions.
-+ */
-+#ifndef CHARBITS
-+#define UCHARAT(p) ((int)*(unsigned char *)(p))
-+#else
-+#define UCHARAT(p) ((int)*(p)&CHARBITS)
-+#endif
-+
-+#define FAIL(m) { regerror(m); return(NULL); }
-+#define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?')
-+#define META "^$.[()|?+*\\"
-+
-+/*
-+ * Flags to be passed up and down.
-+ */
-+#define HASWIDTH 01 /* Known never to match null string. */
-+#define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */
-+#define SPSTART 04 /* Starts with * or +. */
-+#define WORST 0 /* Worst case. */
-+
-+/*
-+ * Global work variables for regcomp().
-+ */
-+struct match_globals {
-+char *reginput; /* String-input pointer. */
-+char *regbol; /* Beginning of input, for ^ check. */
-+char **regstartp; /* Pointer to startp array. */
-+char **regendp; /* Ditto for endp. */
-+char *regparse; /* Input-scan pointer. */
-+int regnpar; /* () count. */
-+char regdummy;
-+char *regcode; /* Code-emit pointer; ®dummy = don't. */
-+long regsize; /* Code size. */
-+};
-+
-+/*
-+ * Forward declarations for regcomp()'s friends.
-+ */
-+#ifndef STATIC
-+#define STATIC static
-+#endif
-+STATIC char *reg(struct match_globals *g, int paren,int *flagp);
-+STATIC char *regbranch(struct match_globals *g, int *flagp);
-+STATIC char *regpiece(struct match_globals *g, int *flagp);
-+STATIC char *regatom(struct match_globals *g, int *flagp);
-+STATIC char *regnode(struct match_globals *g, char op);
-+STATIC char *regnext(struct match_globals *g, char *p);
-+STATIC void regc(struct match_globals *g, char b);
-+STATIC void reginsert(struct match_globals *g, char op, char *opnd);
-+STATIC void regtail(struct match_globals *g, char *p, char *val);
-+STATIC void regoptail(struct match_globals *g, char *p, char *val);
-+
-+
-+__kernel_size_t my_strcspn(const char *s1,const char *s2)
-+{
-+ char *scan1;
-+ char *scan2;
-+ int count;
-+
-+ count = 0;
-+ for (scan1 = (char *)s1; *scan1 != '\0'; scan1++) {
-+ for (scan2 = (char *)s2; *scan2 != '\0';) /* ++ moved down. */
-+ if (*scan1 == *scan2++)
-+ return(count);
-+ count++;
-+ }
-+ return(count);
-+}
-+
-+/*
-+ - regcomp - compile a regular expression into internal code
-+ *
-+ * We can't allocate space until we know how big the compiled form will be,
-+ * but we can't compile it (and thus know how big it is) until we've got a
-+ * place to put the code. So we cheat: we compile it twice, once with code
-+ * generation turned off and size counting turned on, and once "for real".
-+ * This also means that we don't allocate space until we are sure that the
-+ * thing really will compile successfully, and we never have to move the
-+ * code and thus invalidate pointers into it. (Note that it has to be in
-+ * one piece because free() must be able to free it all.)
-+ *
-+ * Beware that the optimization-preparation code in here knows about some
-+ * of the structure of the compiled regexp.
-+ */
-+regexp *
-+regcomp(char *exp,int *patternsize)
-+{
-+ register regexp *r;
-+ register char *scan;
-+ register char *longest;
-+ register int len;
-+ int flags;
-+ struct match_globals g;
-+
-+ /* commented out by ethan
-+ extern char *malloc();
-+ */
-+
-+ if (exp == NULL)
-+ FAIL("NULL argument");
-+
-+ /* First pass: determine size, legality. */
-+ g.regparse = exp;
-+ g.regnpar = 1;
-+ g.regsize = 0L;
-+ g.regcode = &g.regdummy;
-+ regc(&g, MAGIC);
-+ if (reg(&g, 0, &flags) == NULL)
-+ return(NULL);
-+
-+ /* Small enough for pointer-storage convention? */
-+ if (g.regsize >= 32767L) /* Probably could be 65535L. */
-+ FAIL("regexp too big");
-+
-+ /* Allocate space. */
-+ *patternsize=sizeof(regexp) + (unsigned)g.regsize;
-+ r = (regexp *)malloc(sizeof(regexp) + (unsigned)g.regsize);
-+ if (r == NULL)
-+ FAIL("out of space");
-+
-+ /* Second pass: emit code. */
-+ g.regparse = exp;
-+ g.regnpar = 1;
-+ g.regcode = r->program;
-+ regc(&g, MAGIC);
-+ if (reg(&g, 0, &flags) == NULL)
-+ return(NULL);
-+
-+ /* Dig out information for optimizations. */
-+ r->regstart = '\0'; /* Worst-case defaults. */
-+ r->reganch = 0;
-+ r->regmust = NULL;
-+ r->regmlen = 0;
-+ scan = r->program+1; /* First BRANCH. */
-+ if (OP(regnext(&g, scan)) == END) { /* Only one top-level choice. */
-+ scan = OPERAND(scan);
-+
-+ /* Starting-point info. */
-+ if (OP(scan) == EXACTLY)
-+ r->regstart = *OPERAND(scan);
-+ else if (OP(scan) == BOL)
-+ r->reganch++;
-+
-+ /*
-+ * If there's something expensive in the r.e., find the
-+ * longest literal string that must appear and make it the
-+ * regmust. Resolve ties in favor of later strings, since
-+ * the regstart check works with the beginning of the r.e.
-+ * and avoiding duplication strengthens checking. Not a
-+ * strong reason, but sufficient in the absence of others.
-+ */
-+ if (flags&SPSTART) {
-+ longest = NULL;
-+ len = 0;
-+ for (; scan != NULL; scan = regnext(&g, scan))
-+ if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) {
-+ longest = OPERAND(scan);
-+ len = strlen(OPERAND(scan));
-+ }
-+ r->regmust = longest;
-+ r->regmlen = len;
-+ }
-+ }
-+
-+ return(r);
-+}
-+
-+/*
-+ - reg - regular expression, i.e. main body or parenthesized thing
-+ *
-+ * Caller must absorb opening parenthesis.
-+ *
-+ * Combining parenthesis handling with the base level of regular expression
-+ * is a trifle forced, but the need to tie the tails of the branches to what
-+ * follows makes it hard to avoid.
-+ */
-+static char *
-+reg(struct match_globals *g, int paren, int *flagp /* Parenthesized? */ )
-+{
-+ register char *ret;
-+ register char *br;
-+ register char *ender;
-+ register int parno = 0; /* 0 makes gcc happy */
-+ int flags;
-+
-+ *flagp = HASWIDTH; /* Tentatively. */
-+
-+ /* Make an OPEN node, if parenthesized. */
-+ if (paren) {
-+ if (g->regnpar >= NSUBEXP)
-+ FAIL("too many ()");
-+ parno = g->regnpar;
-+ g->regnpar++;
-+ ret = regnode(g, OPEN+parno);
-+ } else
-+ ret = NULL;
-+
-+ /* Pick up the branches, linking them together. */
-+ br = regbranch(g, &flags);
-+ if (br == NULL)
-+ return(NULL);
-+ if (ret != NULL)
-+ regtail(g, ret, br); /* OPEN -> first. */
-+ else
-+ ret = br;
-+ if (!(flags&HASWIDTH))
-+ *flagp &= ~HASWIDTH;
-+ *flagp |= flags&SPSTART;
-+ while (*g->regparse == '|') {
-+ g->regparse++;
-+ br = regbranch(g, &flags);
-+ if (br == NULL)
-+ return(NULL);
-+ regtail(g, ret, br); /* BRANCH -> BRANCH. */
-+ if (!(flags&HASWIDTH))
-+ *flagp &= ~HASWIDTH;
-+ *flagp |= flags&SPSTART;
-+ }
-+
-+ /* Make a closing node, and hook it on the end. */
-+ ender = regnode(g, (paren) ? CLOSE+parno : END);
-+ regtail(g, ret, ender);
-+
-+ /* Hook the tails of the branches to the closing node. */
-+ for (br = ret; br != NULL; br = regnext(g, br))
-+ regoptail(g, br, ender);
-+
-+ /* Check for proper termination. */
-+ if (paren && *g->regparse++ != ')') {
-+ FAIL("unmatched ()");
-+ } else if (!paren && *g->regparse != '\0') {
-+ if (*g->regparse == ')') {
-+ FAIL("unmatched ()");
-+ } else
-+ FAIL("junk on end"); /* "Can't happen". */
-+ /* NOTREACHED */
-+ }
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regbranch - one alternative of an | operator
-+ *
-+ * Implements the concatenation operator.
-+ */
-+static char *
-+regbranch(struct match_globals *g, int *flagp)
-+{
-+ register char *ret;
-+ register char *chain;
-+ register char *latest;
-+ int flags;
-+
-+ *flagp = WORST; /* Tentatively. */
-+
-+ ret = regnode(g, BRANCH);
-+ chain = NULL;
-+ while (*g->regparse != '\0' && *g->regparse != '|' && *g->regparse != ')') {
-+ latest = regpiece(g, &flags);
-+ if (latest == NULL)
-+ return(NULL);
-+ *flagp |= flags&HASWIDTH;
-+ if (chain == NULL) /* First piece. */
-+ *flagp |= flags&SPSTART;
-+ else
-+ regtail(g, chain, latest);
-+ chain = latest;
-+ }
-+ if (chain == NULL) /* Loop ran zero times. */
-+ (void) regnode(g, NOTHING);
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regpiece - something followed by possible [*+?]
-+ *
-+ * Note that the branching code sequences used for ? and the general cases
-+ * of * and + are somewhat optimized: they use the same NOTHING node as
-+ * both the endmarker for their branch list and the body of the last branch.
-+ * It might seem that this node could be dispensed with entirely, but the
-+ * endmarker role is not redundant.
-+ */
-+static char *
-+regpiece(struct match_globals *g, int *flagp)
-+{
-+ register char *ret;
-+ register char op;
-+ register char *next;
-+ int flags;
-+
-+ ret = regatom(g, &flags);
-+ if (ret == NULL)
-+ return(NULL);
-+
-+ op = *g->regparse;
-+ if (!ISMULT(op)) {
-+ *flagp = flags;
-+ return(ret);
-+ }
-+
-+ if (!(flags&HASWIDTH) && op != '?')
-+ FAIL("*+ operand could be empty");
-+ *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH);
-+
-+ if (op == '*' && (flags&SIMPLE))
-+ reginsert(g, STAR, ret);
-+ else if (op == '*') {
-+ /* Emit x* as (x&|), where & means "self". */
-+ reginsert(g, BRANCH, ret); /* Either x */
-+ regoptail(g, ret, regnode(g, BACK)); /* and loop */
-+ regoptail(g, ret, ret); /* back */
-+ regtail(g, ret, regnode(g, BRANCH)); /* or */
-+ regtail(g, ret, regnode(g, NOTHING)); /* null. */
-+ } else if (op == '+' && (flags&SIMPLE))
-+ reginsert(g, PLUS, ret);
-+ else if (op == '+') {
-+ /* Emit x+ as x(&|), where & means "self". */
-+ next = regnode(g, BRANCH); /* Either */
-+ regtail(g, ret, next);
-+ regtail(g, regnode(g, BACK), ret); /* loop back */
-+ regtail(g, next, regnode(g, BRANCH)); /* or */
-+ regtail(g, ret, regnode(g, NOTHING)); /* null. */
-+ } else if (op == '?') {
-+ /* Emit x? as (x|) */
-+ reginsert(g, BRANCH, ret); /* Either x */
-+ regtail(g, ret, regnode(g, BRANCH)); /* or */
-+ next = regnode(g, NOTHING); /* null. */
-+ regtail(g, ret, next);
-+ regoptail(g, ret, next);
-+ }
-+ g->regparse++;
-+ if (ISMULT(*g->regparse))
-+ FAIL("nested *?+");
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regatom - the lowest level
-+ *
-+ * Optimization: gobbles an entire sequence of ordinary characters so that
-+ * it can turn them into a single node, which is smaller to store and
-+ * faster to run. Backslashed characters are exceptions, each becoming a
-+ * separate node; the code is simpler that way and it's not worth fixing.
-+ */
-+static char *
-+regatom(struct match_globals *g, int *flagp)
-+{
-+ register char *ret;
-+ int flags;
-+
-+ *flagp = WORST; /* Tentatively. */
-+
-+ switch (*g->regparse++) {
-+ case '^':
-+ ret = regnode(g, BOL);
-+ break;
-+ case '$':
-+ ret = regnode(g, EOL);
-+ break;
-+ case '.':
-+ ret = regnode(g, ANY);
-+ *flagp |= HASWIDTH|SIMPLE;
-+ break;
-+ case '[': {
-+ register int class;
-+ register int classend;
-+
-+ if (*g->regparse == '^') { /* Complement of range. */
-+ ret = regnode(g, ANYBUT);
-+ g->regparse++;
-+ } else
-+ ret = regnode(g, ANYOF);
-+ if (*g->regparse == ']' || *g->regparse == '-')
-+ regc(g, *g->regparse++);
-+ while (*g->regparse != '\0' && *g->regparse != ']') {
-+ if (*g->regparse == '-') {
-+ g->regparse++;
-+ if (*g->regparse == ']' || *g->regparse == '\0')
-+ regc(g, '-');
-+ else {
-+ class = UCHARAT(g->regparse-2)+1;
-+ classend = UCHARAT(g->regparse);
-+ if (class > classend+1)
-+ FAIL("invalid [] range");
-+ for (; class <= classend; class++)
-+ regc(g, class);
-+ g->regparse++;
-+ }
-+ } else
-+ regc(g, *g->regparse++);
-+ }
-+ regc(g, '\0');
-+ if (*g->regparse != ']')
-+ FAIL("unmatched []");
-+ g->regparse++;
-+ *flagp |= HASWIDTH|SIMPLE;
-+ }
-+ break;
-+ case '(':
-+ ret = reg(g, 1, &flags);
-+ if (ret == NULL)
-+ return(NULL);
-+ *flagp |= flags&(HASWIDTH|SPSTART);
-+ break;
-+ case '\0':
-+ case '|':
-+ case ')':
-+ FAIL("internal urp"); /* Supposed to be caught earlier. */
-+ break;
-+ case '?':
-+ case '+':
-+ case '*':
-+ FAIL("?+* follows nothing");
-+ break;
-+ case '\\':
-+ if (*g->regparse == '\0')
-+ FAIL("trailing \\");
-+ ret = regnode(g, EXACTLY);
-+ regc(g, *g->regparse++);
-+ regc(g, '\0');
-+ *flagp |= HASWIDTH|SIMPLE;
-+ break;
-+ default: {
-+ register int len;
-+ register char ender;
-+
-+ g->regparse--;
-+ len = my_strcspn((const char *)g->regparse, (const char *)META);
-+ if (len <= 0)
-+ FAIL("internal disaster");
-+ ender = *(g->regparse+len);
-+ if (len > 1 && ISMULT(ender))
-+ len--; /* Back off clear of ?+* operand. */
-+ *flagp |= HASWIDTH;
-+ if (len == 1)
-+ *flagp |= SIMPLE;
-+ ret = regnode(g, EXACTLY);
-+ while (len > 0) {
-+ regc(g, *g->regparse++);
-+ len--;
-+ }
-+ regc(g, '\0');
-+ }
-+ break;
-+ }
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regnode - emit a node
-+ */
-+static char * /* Location. */
-+regnode(struct match_globals *g, char op)
-+{
-+ register char *ret;
-+ register char *ptr;
-+
-+ ret = g->regcode;
-+ if (ret == &g->regdummy) {
-+ g->regsize += 3;
-+ return(ret);
-+ }
-+
-+ ptr = ret;
-+ *ptr++ = op;
-+ *ptr++ = '\0'; /* Null "next" pointer. */
-+ *ptr++ = '\0';
-+ g->regcode = ptr;
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regc - emit (if appropriate) a byte of code
-+ */
-+static void
-+regc(struct match_globals *g, char b)
-+{
-+ if (g->regcode != &g->regdummy)
-+ *g->regcode++ = b;
-+ else
-+ g->regsize++;
-+}
-+
-+/*
-+ - reginsert - insert an operator in front of already-emitted operand
-+ *
-+ * Means relocating the operand.
-+ */
-+static void
-+reginsert(struct match_globals *g, char op, char* opnd)
-+{
-+ register char *src;
-+ register char *dst;
-+ register char *place;
-+
-+ if (g->regcode == &g->regdummy) {
-+ g->regsize += 3;
-+ return;
-+ }
-+
-+ src = g->regcode;
-+ g->regcode += 3;
-+ dst = g->regcode;
-+ while (src > opnd)
-+ *--dst = *--src;
-+
-+ place = opnd; /* Op node, where operand used to be. */
-+ *place++ = op;
-+ *place++ = '\0';
-+ *place++ = '\0';
-+}
-+
-+/*
-+ - regtail - set the next-pointer at the end of a node chain
-+ */
-+static void
-+regtail(struct match_globals *g, char *p, char *val)
-+{
-+ register char *scan;
-+ register char *temp;
-+ register int offset;
-+
-+ if (p == &g->regdummy)
-+ return;
-+
-+ /* Find last node. */
-+ scan = p;
-+ for (;;) {
-+ temp = regnext(g, scan);
-+ if (temp == NULL)
-+ break;
-+ scan = temp;
-+ }
-+
-+ if (OP(scan) == BACK)
-+ offset = scan - val;
-+ else
-+ offset = val - scan;
-+ *(scan+1) = (offset>>8)&0377;
-+ *(scan+2) = offset&0377;
-+}
-+
-+/*
-+ - regoptail - regtail on operand of first argument; nop if operandless
-+ */
-+static void
-+regoptail(struct match_globals *g, char *p, char *val)
-+{
-+ /* "Operandless" and "op != BRANCH" are synonymous in practice. */
-+ if (p == NULL || p == &g->regdummy || OP(p) != BRANCH)
-+ return;
-+ regtail(g, OPERAND(p), val);
-+}
-+
-+/*
-+ * regexec and friends
-+ */
-+
-+
-+/*
-+ * Forwards.
-+ */
-+STATIC int regtry(struct match_globals *g, regexp *prog, char *string);
-+STATIC int regmatch(struct match_globals *g, char *prog);
-+STATIC int regrepeat(struct match_globals *g, char *p);
-+
-+#ifdef DEBUG
-+int regnarrate = 0;
-+void regdump();
-+STATIC char *regprop(char *op);
-+#endif
-+
-+/*
-+ - regexec - match a regexp against a string
-+ */
-+int
-+regexec(regexp *prog, char *string)
-+{
-+ register char *s;
-+ struct match_globals g;
-+
-+ /* Be paranoid... */
-+ if (prog == NULL || string == NULL) {
-+ printk("<3>Regexp: NULL parameter\n");
-+ return(0);
-+ }
-+
-+ /* Check validity of program. */
-+ if (UCHARAT(prog->program) != MAGIC) {
-+ printk("<3>Regexp: corrupted program\n");
-+ return(0);
-+ }
-+
-+ /* If there is a "must appear" string, look for it. */
-+ if (prog->regmust != NULL) {
-+ s = string;
-+ while ((s = strchr(s, prog->regmust[0])) != NULL) {
-+ if (strncmp(s, prog->regmust, prog->regmlen) == 0)
-+ break; /* Found it. */
-+ s++;
-+ }
-+ if (s == NULL) /* Not present. */
-+ return(0);
-+ }
-+
-+ /* Mark beginning of line for ^ . */
-+ g.regbol = string;
-+
-+ /* Simplest case: anchored match need be tried only once. */
-+ if (prog->reganch)
-+ return(regtry(&g, prog, string));
-+
-+ /* Messy cases: unanchored match. */
-+ s = string;
-+ if (prog->regstart != '\0')
-+ /* We know what char it must start with. */
-+ while ((s = strchr(s, prog->regstart)) != NULL) {
-+ if (regtry(&g, prog, s))
-+ return(1);
-+ s++;
-+ }
-+ else
-+ /* We don't -- general case. */
-+ do {
-+ if (regtry(&g, prog, s))
-+ return(1);
-+ } while (*s++ != '\0');
-+
-+ /* Failure. */
-+ return(0);
-+}
-+
-+/*
-+ - regtry - try match at specific point
-+ */
-+static int /* 0 failure, 1 success */
-+regtry(struct match_globals *g, regexp *prog, char *string)
-+{
-+ register int i;
-+ register char **sp;
-+ register char **ep;
-+
-+ g->reginput = string;
-+ g->regstartp = prog->startp;
-+ g->regendp = prog->endp;
-+
-+ sp = prog->startp;
-+ ep = prog->endp;
-+ for (i = NSUBEXP; i > 0; i--) {
-+ *sp++ = NULL;
-+ *ep++ = NULL;
-+ }
-+ if (regmatch(g, prog->program + 1)) {
-+ prog->startp[0] = string;
-+ prog->endp[0] = g->reginput;
-+ return(1);
-+ } else
-+ return(0);
-+}
-+
-+/*
-+ - regmatch - main matching routine
-+ *
-+ * Conceptually the strategy is simple: check to see whether the current
-+ * node matches, call self recursively to see whether the rest matches,
-+ * and then act accordingly. In practice we make some effort to avoid
-+ * recursion, in particular by going through "ordinary" nodes (that don't
-+ * need to know whether the rest of the match failed) by a loop instead of
-+ * by recursion.
-+ */
-+static int /* 0 failure, 1 success */
-+regmatch(struct match_globals *g, char *prog)
-+{
-+ register char *scan = prog; /* Current node. */
-+ char *next; /* Next node. */
-+
-+#ifdef DEBUG
-+ if (scan != NULL && regnarrate)
-+ fprintf(stderr, "%s(\n", regprop(scan));
-+#endif
-+ while (scan != NULL) {
-+#ifdef DEBUG
-+ if (regnarrate)
-+ fprintf(stderr, "%s...\n", regprop(scan));
-+#endif
-+ next = regnext(g, scan);
-+
-+ switch (OP(scan)) {
-+ case BOL:
-+ if (g->reginput != g->regbol)
-+ return(0);
-+ break;
-+ case EOL:
-+ if (*g->reginput != '\0')
-+ return(0);
-+ break;
-+ case ANY:
-+ if (*g->reginput == '\0')
-+ return(0);
-+ g->reginput++;
-+ break;
-+ case EXACTLY: {
-+ register int len;
-+ register char *opnd;
-+
-+ opnd = OPERAND(scan);
-+ /* Inline the first character, for speed. */
-+ if (*opnd != *g->reginput)
-+ return(0);
-+ len = strlen(opnd);
-+ if (len > 1 && strncmp(opnd, g->reginput, len) != 0)
-+ return(0);
-+ g->reginput += len;
-+ }
-+ break;
-+ case ANYOF:
-+ if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) == NULL)
-+ return(0);
-+ g->reginput++;
-+ break;
-+ case ANYBUT:
-+ if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) != NULL)
-+ return(0);
-+ g->reginput++;
-+ break;
-+ case NOTHING:
-+ case BACK:
-+ break;
-+ case OPEN+1:
-+ case OPEN+2:
-+ case OPEN+3:
-+ case OPEN+4:
-+ case OPEN+5:
-+ case OPEN+6:
-+ case OPEN+7:
-+ case OPEN+8:
-+ case OPEN+9: {
-+ register int no;
-+ register char *save;
-+
-+ no = OP(scan) - OPEN;
-+ save = g->reginput;
-+
-+ if (regmatch(g, next)) {
-+ /*
-+ * Don't set startp if some later
-+ * invocation of the same parentheses
-+ * already has.
-+ */
-+ if (g->regstartp[no] == NULL)
-+ g->regstartp[no] = save;
-+ return(1);
-+ } else
-+ return(0);
-+ }
-+ break;
-+ case CLOSE+1:
-+ case CLOSE+2:
-+ case CLOSE+3:
-+ case CLOSE+4:
-+ case CLOSE+5:
-+ case CLOSE+6:
-+ case CLOSE+7:
-+ case CLOSE+8:
-+ case CLOSE+9:
-+ {
-+ register int no;
-+ register char *save;
-+
-+ no = OP(scan) - CLOSE;
-+ save = g->reginput;
-+
-+ if (regmatch(g, next)) {
-+ /*
-+ * Don't set endp if some later
-+ * invocation of the same parentheses
-+ * already has.
-+ */
-+ if (g->regendp[no] == NULL)
-+ g->regendp[no] = save;
-+ return(1);
-+ } else
-+ return(0);
-+ }
-+ break;
-+ case BRANCH: {
-+ register char *save;
-+
-+ if (OP(next) != BRANCH) /* No choice. */
-+ next = OPERAND(scan); /* Avoid recursion. */
-+ else {
-+ do {
-+ save = g->reginput;
-+ if (regmatch(g, OPERAND(scan)))
-+ return(1);
-+ g->reginput = save;
-+ scan = regnext(g, scan);
-+ } while (scan != NULL && OP(scan) == BRANCH);
-+ return(0);
-+ /* NOTREACHED */
-+ }
-+ }
-+ break;
-+ case STAR:
-+ case PLUS: {
-+ register char nextch;
-+ register int no;
-+ register char *save;
-+ register int min;
-+
-+ /*
-+ * Lookahead to avoid useless match attempts
-+ * when we know what character comes next.
-+ */
-+ nextch = '\0';
-+ if (OP(next) == EXACTLY)
-+ nextch = *OPERAND(next);
-+ min = (OP(scan) == STAR) ? 0 : 1;
-+ save = g->reginput;
-+ no = regrepeat(g, OPERAND(scan));
-+ while (no >= min) {
-+ /* If it could work, try it. */
-+ if (nextch == '\0' || *g->reginput == nextch)
-+ if (regmatch(g, next))
-+ return(1);
-+ /* Couldn't or didn't -- back up. */
-+ no--;
-+ g->reginput = save + no;
-+ }
-+ return(0);
-+ }
-+ break;
-+ case END:
-+ return(1); /* Success! */
-+ break;
-+ default:
-+ printk("<3>Regexp: memory corruption\n");
-+ return(0);
-+ break;
-+ }
-+
-+ scan = next;
-+ }
-+
-+ /*
-+ * We get here only if there's trouble -- normally "case END" is
-+ * the terminating point.
-+ */
-+ printk("<3>Regexp: corrupted pointers\n");
-+ return(0);
-+}
-+
-+/*
-+ - regrepeat - repeatedly match something simple, report how many
-+ */
-+static int
-+regrepeat(struct match_globals *g, char *p)
-+{
-+ register int count = 0;
-+ register char *scan;
-+ register char *opnd;
-+
-+ scan = g->reginput;
-+ opnd = OPERAND(p);
-+ switch (OP(p)) {
-+ case ANY:
-+ count = strlen(scan);
-+ scan += count;
-+ break;
-+ case EXACTLY:
-+ while (*opnd == *scan) {
-+ count++;
-+ scan++;
-+ }
-+ break;
-+ case ANYOF:
-+ while (*scan != '\0' && strchr(opnd, *scan) != NULL) {
-+ count++;
-+ scan++;
-+ }
-+ break;
-+ case ANYBUT:
-+ while (*scan != '\0' && strchr(opnd, *scan) == NULL) {
-+ count++;
-+ scan++;
-+ }
-+ break;
-+ default: /* Oh dear. Called inappropriately. */
-+ printk("<3>Regexp: internal foulup\n");
-+ count = 0; /* Best compromise. */
-+ break;
-+ }
-+ g->reginput = scan;
-+
-+ return(count);
-+}
-+
-+/*
-+ - regnext - dig the "next" pointer out of a node
-+ */
-+static char*
-+regnext(struct match_globals *g, char *p)
-+{
-+ register int offset;
-+
-+ if (p == &g->regdummy)
-+ return(NULL);
-+
-+ offset = NEXT(p);
-+ if (offset == 0)
-+ return(NULL);
-+
-+ if (OP(p) == BACK)
-+ return(p-offset);
-+ else
-+ return(p+offset);
-+}
-+
-+#ifdef DEBUG
-+
-+STATIC char *regprop();
-+
-+/*
-+ - regdump - dump a regexp onto stdout in vaguely comprehensible form
-+ */
-+void
-+regdump(regexp *r)
-+{
-+ register char *s;
-+ register char op = EXACTLY; /* Arbitrary non-END op. */
-+ register char *next;
-+ /* extern char *strchr(); */
-+
-+
-+ s = r->program + 1;
-+ while (op != END) { /* While that wasn't END last time... */
-+ op = OP(s);
-+ printf("%2d%s", s-r->program, regprop(s)); /* Where, what. */
-+ next = regnext(s);
-+ if (next == NULL) /* Next ptr. */
-+ printf("(0)");
-+ else
-+ printf("(%d)", (s-r->program)+(next-s));
-+ s += 3;
-+ if (op == ANYOF || op == ANYBUT || op == EXACTLY) {
-+ /* Literal string, where present. */
-+ while (*s != '\0') {
-+ putchar(*s);
-+ s++;
-+ }
-+ s++;
-+ }
-+ putchar('\n');
-+ }
-+
-+ /* Header fields of interest. */
-+ if (r->regstart != '\0')
-+ printf("start `%c' ", r->regstart);
-+ if (r->reganch)
-+ printf("anchored ");
-+ if (r->regmust != NULL)
-+ printf("must have \"%s\"", r->regmust);
-+ printf("\n");
-+}
-+
-+/*
-+ - regprop - printable representation of opcode
-+ */
-+static char *
-+regprop(char *op)
-+{
-+#define BUFLEN 50
-+ register char *p;
-+ static char buf[BUFLEN];
-+
-+ strcpy(buf, ":");
-+
-+ switch (OP(op)) {
-+ case BOL:
-+ p = "BOL";
-+ break;
-+ case EOL:
-+ p = "EOL";
-+ break;
-+ case ANY:
-+ p = "ANY";
-+ break;
-+ case ANYOF:
-+ p = "ANYOF";
-+ break;
-+ case ANYBUT:
-+ p = "ANYBUT";
-+ break;
-+ case BRANCH:
-+ p = "BRANCH";
-+ break;
-+ case EXACTLY:
-+ p = "EXACTLY";
-+ break;
-+ case NOTHING:
-+ p = "NOTHING";
-+ break;
-+ case BACK:
-+ p = "BACK";
-+ break;
-+ case END:
-+ p = "END";
-+ break;
-+ case OPEN+1:
-+ case OPEN+2:
-+ case OPEN+3:
-+ case OPEN+4:
-+ case OPEN+5:
-+ case OPEN+6:
-+ case OPEN+7:
-+ case OPEN+8:
-+ case OPEN+9:
-+ snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "OPEN%d", OP(op)-OPEN);
-+ p = NULL;
-+ break;
-+ case CLOSE+1:
-+ case CLOSE+2:
-+ case CLOSE+3:
-+ case CLOSE+4:
-+ case CLOSE+5:
-+ case CLOSE+6:
-+ case CLOSE+7:
-+ case CLOSE+8:
-+ case CLOSE+9:
-+ snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "CLOSE%d", OP(op)-CLOSE);
-+ p = NULL;
-+ break;
-+ case STAR:
-+ p = "STAR";
-+ break;
-+ case PLUS:
-+ p = "PLUS";
-+ break;
-+ default:
-+ printk("<3>Regexp: corrupted opcode\n");
-+ break;
-+ }
-+ if (p != NULL)
-+ strncat(buf, p, BUFLEN-strlen(buf));
-+ return(buf);
-+}
-+#endif
-+
-+
---- /dev/null
-+++ b/net/netfilter/regexp/regexp.h
-@@ -0,0 +1,41 @@
-+/*
-+ * Definitions etc. for regexp(3) routines.
-+ *
-+ * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof],
-+ * not the System V one.
-+ */
-+
-+#ifndef REGEXP_H
-+#define REGEXP_H
-+
-+
-+/*
-+http://www.opensource.apple.com/darwinsource/10.3/expect-1/expect/expect.h ,
-+which contains a version of this library, says:
-+
-+ *
-+ * NSUBEXP must be at least 10, and no greater than 117 or the parser
-+ * will not work properly.
-+ *
-+
-+However, it looks rather like this library is limited to 10. If you think
-+otherwise, let us know.
-+*/
-+
-+#define NSUBEXP 10
-+typedef struct regexp {
-+ char *startp[NSUBEXP];
-+ char *endp[NSUBEXP];
-+ char regstart; /* Internal use only. */
-+ char reganch; /* Internal use only. */
-+ char *regmust; /* Internal use only. */
-+ int regmlen; /* Internal use only. */
-+ char program[1]; /* Unwarranted chumminess with compiler. */
-+} regexp;
-+
-+regexp * regcomp(char *exp, int *patternsize);
-+int regexec(regexp *prog, char *string);
-+void regsub(regexp *prog, char *source, char *dest);
-+void regerror(char *s);
-+
-+#endif
---- /dev/null
-+++ b/net/netfilter/regexp/regmagic.h
-@@ -0,0 +1,5 @@
-+/*
-+ * The first byte of the regexp internal "program" is actually this magic
-+ * number; the start node begins in the second byte.
-+ */
-+#define MAGIC 0234
---- /dev/null
-+++ b/net/netfilter/regexp/regsub.c
-@@ -0,0 +1,95 @@
-+/*
-+ * regsub
-+ * @(#)regsub.c 1.3 of 2 April 86
-+ *
-+ * Copyright (c) 1986 by University of Toronto.
-+ * Written by Henry Spencer. Not derived from licensed software.
-+ *
-+ * Permission is granted to anyone to use this software for any
-+ * purpose on any computer system, and to redistribute it freely,
-+ * subject to the following restrictions:
-+ *
-+ * 1. The author is not responsible for the consequences of use of
-+ * this software, no matter how awful, even if they arise
-+ * from defects in it.
-+ *
-+ * 2. The origin of this software must not be misrepresented, either
-+ * by explicit claim or by omission.
-+ *
-+ * 3. Altered versions must be plainly marked as such, and must not
-+ * be misrepresented as being the original software.
-+ *
-+ *
-+ * This code was modified by Ethan Sommer to work within the kernel
-+ * (it now uses kmalloc etc..)
-+ *
-+ */
-+#include "regexp.h"
-+#include "regmagic.h"
-+#include <linux/string.h>
-+
-+
-+#ifndef CHARBITS
-+#define UCHARAT(p) ((int)*(unsigned char *)(p))
-+#else
-+#define UCHARAT(p) ((int)*(p)&CHARBITS)
-+#endif
-+
-+#if 0
-+//void regerror(char * s)
-+//{
-+// printk("regexp(3): %s", s);
-+// /* NOTREACHED */
-+//}
-+#endif
-+
-+/*
-+ - regsub - perform substitutions after a regexp match
-+ */
-+void
-+regsub(regexp * prog, char * source, char * dest)
-+{
-+ register char *src;
-+ register char *dst;
-+ register char c;
-+ register int no;
-+ register int len;
-+
-+ /* Not necessary and gcc doesn't like it -MLS */
-+ /*extern char *strncpy();*/
-+
-+ if (prog == NULL || source == NULL || dest == NULL) {
-+ regerror("NULL parm to regsub");
-+ return;
-+ }
-+ if (UCHARAT(prog->program) != MAGIC) {
-+ regerror("damaged regexp fed to regsub");
-+ return;
-+ }
-+
-+ src = source;
-+ dst = dest;
-+ while ((c = *src++) != '\0') {
-+ if (c == '&')
-+ no = 0;
-+ else if (c == '\\' && '0' <= *src && *src <= '9')
-+ no = *src++ - '0';
-+ else
-+ no = -1;
-+
-+ if (no < 0) { /* Ordinary character. */
-+ if (c == '\\' && (*src == '\\' || *src == '&'))
-+ c = *src++;
-+ *dst++ = c;
-+ } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) {
-+ len = prog->endp[no] - prog->startp[no];
-+ (void) strncpy(dst, prog->startp[no], len);
-+ dst += len;
-+ if (len != 0 && *(dst-1) == '\0') { /* strncpy hit NUL. */
-+ regerror("damaged match string");
-+ return;
-+ }
-+ }
-+ }
-+ *dst++ = '\0';
-+}
---- /dev/null
-+++ b/net/netfilter/xt_layer7.c
-@@ -0,0 +1,666 @@
-+/*
-+ Kernel module to match application layer (OSI layer 7) data in connections.
-+
-+ http://l7-filter.sf.net
-+
-+ (C) 2003-2009 Matthew Strait and Ethan Sommer.
-+
-+ 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.
-+ http://www.gnu.org/licenses/gpl.txt
-+
-+ Based on ipt_string.c (C) 2000 Emmanuel Roger <winfield@freegates.be>,
-+ xt_helper.c (C) 2002 Harald Welte and cls_layer7.c (C) 2003 Matthew Strait,
-+ Ethan Sommer, Justin Levandoski.
-+*/
-+
-+#include <linux/spinlock.h>
-+#include <linux/version.h>
-+#include <net/ip.h>
-+#include <net/tcp.h>
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter.h>
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_core.h>
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
-+#include <net/netfilter/nf_conntrack_extend.h>
-+#include <net/netfilter/nf_conntrack_acct.h>
-+#endif
-+#include <linux/netfilter/x_tables.h>
-+#include <linux/netfilter/xt_layer7.h>
-+#include <linux/ctype.h>
-+#include <linux/proc_fs.h>
-+
-+#include "regexp/regexp.c"
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Matthew Strait <quadong@users.sf.net>, Ethan Sommer <sommere@users.sf.net>");
-+MODULE_DESCRIPTION("iptables application layer match module");
-+MODULE_ALIAS("ipt_layer7");
-+MODULE_VERSION("2.21");
-+
-+static int maxdatalen = 2048; // this is the default
-+module_param(maxdatalen, int, 0444);
-+MODULE_PARM_DESC(maxdatalen, "maximum bytes of data looked at by l7-filter");
-+#ifdef CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG
-+ #define DPRINTK(format,args...) printk(format,##args)
-+#else
-+ #define DPRINTK(format,args...)
-+#endif
-+
-+/* Number of packets whose data we look at.
-+This can be modified through /proc/net/layer7_numpackets */
-+static int num_packets = 10;
-+
-+static struct pattern_cache {
-+ char * regex_string;
-+ regexp * pattern;
-+ struct pattern_cache * next;
-+} * first_pattern_cache = NULL;
-+
-+DEFINE_SPINLOCK(l7_lock);
-+
-+static int total_acct_packets(struct nf_conn *ct)
-+{
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 26)
-+ BUG_ON(ct == NULL);
-+ return (ct->counters[IP_CT_DIR_ORIGINAL].packets + ct->counters[IP_CT_DIR_REPLY].packets);
-+#else
-+ struct nf_conn_counter *acct;
-+
-+ BUG_ON(ct == NULL);
-+ acct = nf_conn_acct_find(ct);
-+ if (!acct)
-+ return 0;
-+ return (acct[IP_CT_DIR_ORIGINAL].packets + acct[IP_CT_DIR_REPLY].packets);
-+#endif
-+}
-+
-+#ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
-+/* Converts an unfriendly string into a friendly one by
-+replacing unprintables with periods and all whitespace with " ". */
-+static char * friendly_print(unsigned char * s)
-+{
-+ char * f = kmalloc(strlen(s) + 1, GFP_ATOMIC);
-+ int i;
-+
-+ if(!f) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "friendly_print, bailing.\n");
-+ return NULL;
-+ }
-+
-+ for(i = 0; i < strlen(s); i++){
-+ if(isprint(s[i]) && s[i] < 128) f[i] = s[i];
-+ else if(isspace(s[i])) f[i] = ' ';
-+ else f[i] = '.';
-+ }
-+ f[i] = '\0';
-+ return f;
-+}
-+
-+static char dec2hex(int i)
-+{
-+ switch (i) {
-+ case 0 ... 9:
-+ return (i + '0');
-+ break;
-+ case 10 ... 15:
-+ return (i - 10 + 'a');
-+ break;
-+ default:
-+ if (net_ratelimit())
-+ printk("layer7: Problem in dec2hex\n");
-+ return '\0';
-+ }
-+}
-+
-+static char * hex_print(unsigned char * s)
-+{
-+ char * g = kmalloc(strlen(s)*3 + 1, GFP_ATOMIC);
-+ int i;
-+
-+ if(!g) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in hex_print, "
-+ "bailing.\n");
-+ return NULL;
-+ }
-+
-+ for(i = 0; i < strlen(s); i++) {
-+ g[i*3 ] = dec2hex(s[i]/16);
-+ g[i*3 + 1] = dec2hex(s[i]%16);
-+ g[i*3 + 2] = ' ';
-+ }
-+ g[i*3] = '\0';
-+
-+ return g;
-+}
-+#endif // DEBUG
-+
-+/* Use instead of regcomp. As we expect to be seeing the same regexps over and
-+over again, it make sense to cache the results. */
-+static regexp * compile_and_cache(const char * regex_string,
-+ const char * protocol)
-+{
-+ struct pattern_cache * node = first_pattern_cache;
-+ struct pattern_cache * last_pattern_cache = first_pattern_cache;
-+ struct pattern_cache * tmp;
-+ unsigned int len;
-+
-+ while (node != NULL) {
-+ if (!strcmp(node->regex_string, regex_string))
-+ return node->pattern;
-+
-+ last_pattern_cache = node;/* points at the last non-NULL node */
-+ node = node->next;
-+ }
-+
-+ /* If we reach the end of the list, then we have not yet cached
-+ the pattern for this regex. Let's do that now.
-+ Be paranoid about running out of memory to avoid list corruption. */
-+ tmp = kmalloc(sizeof(struct pattern_cache), GFP_ATOMIC);
-+
-+ if(!tmp) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "compile_and_cache, bailing.\n");
-+ return NULL;
-+ }
-+
-+ tmp->regex_string = kmalloc(strlen(regex_string) + 1, GFP_ATOMIC);
-+ tmp->pattern = kmalloc(sizeof(struct regexp), GFP_ATOMIC);
-+ tmp->next = NULL;
-+
-+ if(!tmp->regex_string || !tmp->pattern) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "compile_and_cache, bailing.\n");
-+ kfree(tmp->regex_string);
-+ kfree(tmp->pattern);
-+ kfree(tmp);
-+ return NULL;
-+ }
-+
-+ /* Ok. The new node is all ready now. */
-+ node = tmp;
-+
-+ if(first_pattern_cache == NULL) /* list is empty */
-+ first_pattern_cache = node; /* make node the beginning */
-+ else
-+ last_pattern_cache->next = node; /* attach node to the end */
-+
-+ /* copy the string and compile the regex */
-+ len = strlen(regex_string);
-+ DPRINTK("About to compile this: \"%s\"\n", regex_string);
-+ node->pattern = regcomp((char *)regex_string, &len);
-+ if ( !node->pattern ) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: Error compiling regexp "
-+ "\"%s\" (%s)\n",
-+ regex_string, protocol);
-+ /* pattern is now cached as NULL, so we won't try again. */
-+ }
-+
-+ strcpy(node->regex_string, regex_string);
-+ return node->pattern;
-+}
-+
-+static int can_handle(const struct sk_buff *skb)
-+{
-+ if(!ip_hdr(skb)) /* not IP */
-+ return 0;
-+ if(ip_hdr(skb)->protocol != IPPROTO_TCP &&
-+ ip_hdr(skb)->protocol != IPPROTO_UDP &&
-+ ip_hdr(skb)->protocol != IPPROTO_ICMP)
-+ return 0;
-+ return 1;
-+}
-+
-+/* Returns offset the into the skb->data that the application data starts */
-+static int app_data_offset(const struct sk_buff *skb)
-+{
-+ /* In case we are ported somewhere (ebtables?) where ip_hdr(skb)
-+ isn't set, this can be gotten from 4*(skb->data[0] & 0x0f) as well. */
-+ int ip_hl = 4*ip_hdr(skb)->ihl;
-+
-+ if( ip_hdr(skb)->protocol == IPPROTO_TCP ) {
-+ /* 12 == offset into TCP header for the header length field.
-+ Can't get this with skb->h.th->doff because the tcphdr
-+ struct doesn't get set when routing (this is confirmed to be
-+ true in Netfilter as well as QoS.) */
-+ int tcp_hl = 4*(skb->data[ip_hl + 12] >> 4);
-+
-+ return ip_hl + tcp_hl;
-+ } else if( ip_hdr(skb)->protocol == IPPROTO_UDP ) {
-+ return ip_hl + 8; /* UDP header is always 8 bytes */
-+ } else if( ip_hdr(skb)->protocol == IPPROTO_ICMP ) {
-+ return ip_hl + 8; /* ICMP header is 8 bytes */
-+ } else {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: tried to handle unknown "
-+ "protocol!\n");
-+ return ip_hl + 8; /* something reasonable */
-+ }
-+}
-+
-+/* handles whether there's a match when we aren't appending data anymore */
-+static int match_no_append(struct nf_conn * conntrack,
-+ struct nf_conn * master_conntrack,
-+ enum ip_conntrack_info ctinfo,
-+ enum ip_conntrack_info master_ctinfo,
-+ const struct xt_layer7_info * info)
-+{
-+ /* If we're in here, throw the app data away */
-+ if(master_conntrack->layer7.app_data != NULL) {
-+
-+ #ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
-+ if(!master_conntrack->layer7.app_proto) {
-+ char * f =
-+ friendly_print(master_conntrack->layer7.app_data);
-+ char * g =
-+ hex_print(master_conntrack->layer7.app_data);
-+ DPRINTK("\nl7-filter gave up after %d bytes "
-+ "(%d packets):\n%s\n",
-+ strlen(f), total_acct_packets(master_conntrack), f);
-+ kfree(f);
-+ DPRINTK("In hex: %s\n", g);
-+ kfree(g);
-+ }
-+ #endif
-+
-+ kfree(master_conntrack->layer7.app_data);
-+ master_conntrack->layer7.app_data = NULL; /* don't free again */
-+ }
-+
-+ if(master_conntrack->layer7.app_proto){
-+ /* Here child connections set their .app_proto (for /proc) */
-+ if(!conntrack->layer7.app_proto) {
-+ conntrack->layer7.app_proto =
-+ kmalloc(strlen(master_conntrack->layer7.app_proto)+1,
-+ GFP_ATOMIC);
-+ if(!conntrack->layer7.app_proto){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory "
-+ "in match_no_append, "
-+ "bailing.\n");
-+ return 1;
-+ }
-+ strcpy(conntrack->layer7.app_proto,
-+ master_conntrack->layer7.app_proto);
-+ }
-+
-+ return (!strcmp(master_conntrack->layer7.app_proto,
-+ info->protocol));
-+ }
-+ else {
-+ /* If not classified, set to "unknown" to distinguish from
-+ connections that are still being tested. */
-+ master_conntrack->layer7.app_proto =
-+ kmalloc(strlen("unknown")+1, GFP_ATOMIC);
-+ if(!master_conntrack->layer7.app_proto){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "match_no_append, bailing.\n");
-+ return 1;
-+ }
-+ strcpy(master_conntrack->layer7.app_proto, "unknown");
-+ return 0;
-+ }
-+}
-+
-+/* add the new app data to the conntrack. Return number of bytes added. */
-+static int add_data(struct nf_conn * master_conntrack,
-+ char * app_data, int appdatalen)
-+{
-+ int length = 0, i;
-+ int oldlength = master_conntrack->layer7.app_data_len;
-+
-+ /* This is a fix for a race condition by Deti Fliegl. However, I'm not
-+ clear on whether the race condition exists or whether this really
-+ fixes it. I might just be being dense... Anyway, if it's not really
-+ a fix, all it does is waste a very small amount of time. */
-+ if(!master_conntrack->layer7.app_data) return 0;
-+
-+ /* Strip nulls. Make everything lower case (our regex lib doesn't
-+ do case insensitivity). Add it to the end of the current data. */
-+ for(i = 0; i < maxdatalen-oldlength-1 &&
-+ i < appdatalen; i++) {
-+ if(app_data[i] != '\0') {
-+ /* the kernel version of tolower mungs 'upper ascii' */
-+ master_conntrack->layer7.app_data[length+oldlength] =
-+ isascii(app_data[i])?
-+ tolower(app_data[i]) : app_data[i];
-+ length++;
-+ }
-+ }
-+
-+ master_conntrack->layer7.app_data[length+oldlength] = '\0';
-+ master_conntrack->layer7.app_data_len = length + oldlength;
-+
-+ return length;
-+}
-+
-+/* taken from drivers/video/modedb.c */
-+static int my_atoi(const char *s)
-+{
-+ int val = 0;
-+
-+ for (;; s++) {
-+ switch (*s) {
-+ case '0'...'9':
-+ val = 10*val+(*s-'0');
-+ break;
-+ default:
-+ return val;
-+ }
-+ }
-+}
-+
-+/* write out num_packets to userland. */
-+static int layer7_read_proc(char* page, char ** start, off_t off, int count,
-+ int* eof, void * data)
-+{
-+ if(num_packets > 99 && net_ratelimit())
-+ printk(KERN_ERR "layer7: NOT REACHED. num_packets too big\n");
-+
-+ page[0] = num_packets/10 + '0';
-+ page[1] = num_packets%10 + '0';
-+ page[2] = '\n';
-+ page[3] = '\0';
-+
-+ *eof=1;
-+
-+ return 3;
-+}
-+
-+/* Read in num_packets from userland */
-+static int layer7_write_proc(struct file* file, const char* buffer,
-+ unsigned long count, void *data)
-+{
-+ char * foo = kmalloc(count, GFP_ATOMIC);
-+
-+ if(!foo){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory, bailing. "
-+ "num_packets unchanged.\n");
-+ return count;
-+ }
-+
-+ if(copy_from_user(foo, buffer, count)) {
-+ return -EFAULT;
-+ }
-+
-+
-+ num_packets = my_atoi(foo);
-+ kfree (foo);
-+
-+ /* This has an arbitrary limit to make the math easier. I'm lazy.
-+ But anyway, 99 is a LOT! If you want more, you're doing it wrong! */
-+ if(num_packets > 99) {
-+ printk(KERN_WARNING "layer7: num_packets can't be > 99.\n");
-+ num_packets = 99;
-+ } else if(num_packets < 1) {
-+ printk(KERN_WARNING "layer7: num_packets can't be < 1.\n");
-+ num_packets = 1;
-+ }
-+
-+ return count;
-+}
-+
-+static bool
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+match(const struct sk_buff *skbin, const struct xt_match_param *par)
-+#else
-+match(const struct sk_buff *skbin,
-+ const struct net_device *in,
-+ const struct net_device *out,
-+ const struct xt_match *match,
-+ const void *matchinfo,
-+ int offset,
-+ unsigned int protoff,
-+ bool *hotdrop)
-+#endif
-+{
-+ /* sidestep const without getting a compiler warning... */
-+ struct sk_buff * skb = (struct sk_buff *)skbin;
-+
-+ const struct xt_layer7_info * info =
-+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+ par->matchinfo;
-+ #else
-+ matchinfo;
-+ #endif
-+
-+ enum ip_conntrack_info master_ctinfo, ctinfo;
-+ struct nf_conn *master_conntrack, *conntrack;
-+ unsigned char * app_data;
-+ unsigned int pattern_result, appdatalen;
-+ regexp * comppattern;
-+
-+ /* Be paranoid/incompetent - lock the entire match function. */
-+ spin_lock_bh(&l7_lock);
-+
-+ if(!can_handle(skb)){
-+ DPRINTK("layer7: This is some protocol I can't handle.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+
-+ /* Treat parent & all its children together as one connection, except
-+ for the purpose of setting conntrack->layer7.app_proto in the actual
-+ connection. This makes /proc/net/ip_conntrack more satisfying. */
-+ if(!(conntrack = nf_ct_get(skb, &ctinfo)) ||
-+ !(master_conntrack=nf_ct_get(skb,&master_ctinfo))){
-+ DPRINTK("layer7: couldn't get conntrack.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+
-+ /* Try to get a master conntrack (and its master etc) for FTP, etc. */
-+ while (master_ct(master_conntrack) != NULL)
-+ master_conntrack = master_ct(master_conntrack);
-+
-+ /* if we've classified it or seen too many packets */
-+ if(total_acct_packets(master_conntrack) > num_packets ||
-+ master_conntrack->layer7.app_proto) {
-+
-+ pattern_result = match_no_append(conntrack, master_conntrack,
-+ ctinfo, master_ctinfo, info);
-+
-+ /* skb->cb[0] == seen. Don't do things twice if there are
-+ multiple l7 rules. I'm not sure that using cb for this purpose
-+ is correct, even though it says "put your private variables
-+ there". But it doesn't look like it is being used for anything
-+ else in the skbs that make it here. */
-+ skb->cb[0] = 1; /* marking it seen here's probably irrelevant */
-+
-+ spin_unlock_bh(&l7_lock);
-+ return (pattern_result ^ info->invert);
-+ }
-+
-+ if(skb_is_nonlinear(skb)){
-+ if(skb_linearize(skb) != 0){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: failed to linearize "
-+ "packet, bailing.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+ }
-+
-+ /* now that the skb is linearized, it's safe to set these. */
-+ app_data = skb->data + app_data_offset(skb);
-+ appdatalen = skb_tail_pointer(skb) - app_data;
-+
-+ /* the return value gets checked later, when we're ready to use it */
-+ comppattern = compile_and_cache(info->pattern, info->protocol);
-+
-+ /* On the first packet of a connection, allocate space for app data */
-+ if(total_acct_packets(master_conntrack) == 1 && !skb->cb[0] &&
-+ !master_conntrack->layer7.app_data){
-+ master_conntrack->layer7.app_data =
-+ kmalloc(maxdatalen, GFP_ATOMIC);
-+ if(!master_conntrack->layer7.app_data){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "match, bailing.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+
-+ master_conntrack->layer7.app_data[0] = '\0';
-+ }
-+
-+ /* Can be here, but unallocated, if numpackets is increased near
-+ the beginning of a connection */
-+ if(master_conntrack->layer7.app_data == NULL){
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert; /* unmatched */
-+ }
-+
-+ if(!skb->cb[0]){
-+ int newbytes;
-+ newbytes = add_data(master_conntrack, app_data, appdatalen);
-+
-+ if(newbytes == 0) { /* didn't add any data */
-+ skb->cb[0] = 1;
-+ /* Didn't match before, not going to match now */
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+ }
-+
-+ /* If looking for "unknown", then never match. "Unknown" means that
-+ we've given up; we're still trying with these packets. */
-+ if(!strcmp(info->protocol, "unknown")) {
-+ pattern_result = 0;
-+ /* If looking for "unset", then always match. "Unset" means that we
-+ haven't yet classified the connection. */
-+ } else if(!strcmp(info->protocol, "unset")) {
-+ pattern_result = 2;
-+ DPRINTK("layer7: matched unset: not yet classified "
-+ "(%d/%d packets)\n",
-+ total_acct_packets(master_conntrack), num_packets);
-+ /* If the regexp failed to compile, don't bother running it */
-+ } else if(comppattern &&
-+ regexec(comppattern, master_conntrack->layer7.app_data)){
-+ DPRINTK("layer7: matched %s\n", info->protocol);
-+ pattern_result = 1;
-+ } else pattern_result = 0;
-+
-+ if(pattern_result == 1) {
-+ master_conntrack->layer7.app_proto =
-+ kmalloc(strlen(info->protocol)+1, GFP_ATOMIC);
-+ if(!master_conntrack->layer7.app_proto){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "match, bailing.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return (pattern_result ^ info->invert);
-+ }
-+ strcpy(master_conntrack->layer7.app_proto, info->protocol);
-+ } else if(pattern_result > 1) { /* cleanup from "unset" */
-+ pattern_result = 1;
-+ }
-+
-+ /* mark the packet seen */
-+ skb->cb[0] = 1;
-+
-+ spin_unlock_bh(&l7_lock);
-+ return (pattern_result ^ info->invert);
-+}
-+
-+// load nf_conntrack_ipv4
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+static bool check(const struct xt_mtchk_param *par)
-+{
-+ if (nf_ct_l3proto_try_module_get(par->match->family) < 0) {
-+ printk(KERN_WARNING "can't load conntrack support for "
-+ "proto=%d\n", par->match->family);
-+#else
-+static bool check(const char *tablename, const void *inf,
-+ const struct xt_match *match, void *matchinfo,
-+ unsigned int hook_mask)
-+{
-+ if (nf_ct_l3proto_try_module_get(match->family) < 0) {
-+ printk(KERN_WARNING "can't load conntrack support for "
-+ "proto=%d\n", match->family);
-+#endif
-+ return 0;
-+ }
-+ return 1;
-+}
-+
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+ static void destroy(const struct xt_mtdtor_param *par)
-+ {
-+ nf_ct_l3proto_module_put(par->match->family);
-+ }
-+#else
-+ static void destroy(const struct xt_match *match, void *matchinfo)
-+ {
-+ nf_ct_l3proto_module_put(match->family);
-+ }
-+#endif
-+
-+static struct xt_match xt_layer7_match[] __read_mostly = {
-+{
-+ .name = "layer7",
-+ .family = AF_INET,
-+ .checkentry = check,
-+ .match = match,
-+ .destroy = destroy,
-+ .matchsize = sizeof(struct xt_layer7_info),
-+ .me = THIS_MODULE
-+}
-+};
-+
-+static void layer7_cleanup_proc(void)
-+{
-+ remove_proc_entry("layer7_numpackets", init_net.proc_net);
-+}
-+
-+/* register the proc file */
-+static void layer7_init_proc(void)
-+{
-+ struct proc_dir_entry* entry;
-+ entry = create_proc_entry("layer7_numpackets", 0644, init_net.proc_net);
-+ entry->read_proc = layer7_read_proc;
-+ entry->write_proc = layer7_write_proc;
-+}
-+
-+static int __init xt_layer7_init(void)
-+{
-+ need_conntrack();
-+
-+ layer7_init_proc();
-+ if(maxdatalen < 1) {
-+ printk(KERN_WARNING "layer7: maxdatalen can't be < 1, "
-+ "using 1\n");
-+ maxdatalen = 1;
-+ }
-+ /* This is not a hard limit. It's just here to prevent people from
-+ bringing their slow machines to a grinding halt. */
-+ else if(maxdatalen > 65536) {
-+ printk(KERN_WARNING "layer7: maxdatalen can't be > 65536, "
-+ "using 65536\n");
-+ maxdatalen = 65536;
-+ }
-+ return xt_register_matches(xt_layer7_match,
-+ ARRAY_SIZE(xt_layer7_match));
-+}
-+
-+static void __exit xt_layer7_fini(void)
-+{
-+ layer7_cleanup_proc();
-+ xt_unregister_matches(xt_layer7_match, ARRAY_SIZE(xt_layer7_match));
-+}
-+
-+module_init(xt_layer7_init);
-+module_exit(xt_layer7_fini);
+++ /dev/null
---- a/include/linux/netfilter/xt_layer7.h
-+++ b/include/linux/netfilter/xt_layer7.h
-@@ -8,6 +8,7 @@ struct xt_layer7_info {
- char protocol[MAX_PROTOCOL_LEN];
- char pattern[MAX_PATTERN_LEN];
- u_int8_t invert;
-+ u_int8_t pkt;
- };
-
- #endif /* _XT_LAYER7_H */
---- a/net/netfilter/xt_layer7.c
-+++ b/net/netfilter/xt_layer7.c
-@@ -314,33 +314,35 @@ static int match_no_append(struct nf_con
- }
-
- /* add the new app data to the conntrack. Return number of bytes added. */
--static int add_data(struct nf_conn * master_conntrack,
-- char * app_data, int appdatalen)
-+static int add_datastr(char *target, int offset, char *app_data, int len)
- {
- int length = 0, i;
-- int oldlength = master_conntrack->layer7.app_data_len;
--
-- /* This is a fix for a race condition by Deti Fliegl. However, I'm not
-- clear on whether the race condition exists or whether this really
-- fixes it. I might just be being dense... Anyway, if it's not really
-- a fix, all it does is waste a very small amount of time. */
-- if(!master_conntrack->layer7.app_data) return 0;
-+ if (!target) return 0;
-
- /* Strip nulls. Make everything lower case (our regex lib doesn't
- do case insensitivity). Add it to the end of the current data. */
-- for(i = 0; i < maxdatalen-oldlength-1 &&
-- i < appdatalen; i++) {
-+ for(i = 0; i < maxdatalen-offset-1 && i < len; i++) {
- if(app_data[i] != '\0') {
- /* the kernel version of tolower mungs 'upper ascii' */
-- master_conntrack->layer7.app_data[length+oldlength] =
-+ target[length+offset] =
- isascii(app_data[i])?
- tolower(app_data[i]) : app_data[i];
- length++;
- }
- }
-+ target[length+offset] = '\0';
-+
-+ return length;
-+}
-+
-+/* add the new app data to the conntrack. Return number of bytes added. */
-+static int add_data(struct nf_conn * master_conntrack,
-+ char * app_data, int appdatalen)
-+{
-+ int length;
-
-- master_conntrack->layer7.app_data[length+oldlength] = '\0';
-- master_conntrack->layer7.app_data_len = length + oldlength;
-+ length = add_datastr(master_conntrack->layer7.app_data, master_conntrack->layer7.app_data_len, app_data, appdatalen);
-+ master_conntrack->layer7.app_data_len += length;
-
- return length;
- }
-@@ -438,7 +440,7 @@ match(const struct sk_buff *skbin,
-
- enum ip_conntrack_info master_ctinfo, ctinfo;
- struct nf_conn *master_conntrack, *conntrack;
-- unsigned char * app_data;
-+ unsigned char *app_data, *tmp_data;
- unsigned int pattern_result, appdatalen;
- regexp * comppattern;
-
-@@ -466,8 +468,8 @@ match(const struct sk_buff *skbin,
- master_conntrack = master_ct(master_conntrack);
-
- /* if we've classified it or seen too many packets */
-- if(total_acct_packets(master_conntrack) > num_packets ||
-- master_conntrack->layer7.app_proto) {
-+ if(!info->pkt && (total_acct_packets(master_conntrack) > num_packets ||
-+ master_conntrack->layer7.app_proto)) {
-
- pattern_result = match_no_append(conntrack, master_conntrack,
- ctinfo, master_ctinfo, info);
-@@ -500,6 +502,25 @@ match(const struct sk_buff *skbin,
- /* the return value gets checked later, when we're ready to use it */
- comppattern = compile_and_cache(info->pattern, info->protocol);
-
-+ if (info->pkt) {
-+ tmp_data = kmalloc(maxdatalen, GFP_ATOMIC);
-+ if(!tmp_data){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in match, bailing.\n");
-+ return info->invert;
-+ }
-+
-+ tmp_data[0] = '\0';
-+ add_datastr(tmp_data, 0, app_data, appdatalen);
-+ pattern_result = ((comppattern && regexec(comppattern, tmp_data)) ? 1 : 0);
-+
-+ kfree(tmp_data);
-+ tmp_data = NULL;
-+ spin_unlock_bh(&l7_lock);
-+
-+ return (pattern_result ^ info->invert);
-+ }
-+
- /* On the first packet of a connection, allocate space for app data */
- if(total_acct_packets(master_conntrack) == 1 && !skb->cb[0] &&
- !master_conntrack->layer7.app_data){
+++ /dev/null
---- a/include/linux/netfilter_ipv4/ip_tables.h
-+++ b/include/linux/netfilter_ipv4/ip_tables.h
-@@ -62,6 +62,7 @@ struct ipt_ip {
- #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */
- #define IPT_F_GOTO 0x02 /* Set if jump is a goto */
- #define IPT_F_MASK 0x03 /* All possible flag bits mask. */
-+#define IPT_F_NO_DEF_MATCH 0x80 /* Internal: no default match rules present */
-
- /* Values for "inv" field in struct ipt_ip. */
- #define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -87,6 +87,9 @@ ip_packet_match(const struct iphdr *ip,
-
- #define FWINV(bool, invflg) ((bool) ^ !!(ipinfo->invflags & (invflg)))
-
-+ if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
-+ return true;
-+
- if (FWINV((ip->saddr&ipinfo->smsk.s_addr) != ipinfo->src.s_addr,
- IPT_INV_SRCIP)
- || FWINV((ip->daddr&ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr,
-@@ -137,13 +140,35 @@ ip_packet_match(const struct iphdr *ip,
- return false;
- }
-
-+#undef FWINV
- return true;
- }
-
- static bool
--ip_checkentry(const struct ipt_ip *ip)
-+ip_checkentry(struct ipt_ip *ip)
- {
-- if (ip->flags & ~IPT_F_MASK) {
-+#define FWINV(bool, invflg) ((bool) || (ip->invflags & (invflg)))
-+
-+ if (FWINV(ip->smsk.s_addr, IPT_INV_SRCIP) ||
-+ FWINV(ip->dmsk.s_addr, IPT_INV_DSTIP))
-+ goto has_match_rules;
-+
-+ if (FWINV(!!((const unsigned long *)ip->iniface_mask)[0],
-+ IPT_INV_VIA_IN) ||
-+ FWINV(!!((const unsigned long *)ip->outiface_mask)[0],
-+ IPT_INV_VIA_OUT))
-+ goto has_match_rules;
-+
-+ if (FWINV(ip->proto, IPT_INV_PROTO))
-+ goto has_match_rules;
-+
-+ if (FWINV(ip->flags&IPT_F_FRAG, IPT_INV_FRAG))
-+ goto has_match_rules;
-+
-+ ip->flags |= IPT_F_NO_DEF_MATCH;
-+
-+has_match_rules:
-+ if (ip->flags & ~(IPT_F_MASK|IPT_F_NO_DEF_MATCH)) {
- duprintf("Unknown flag bits set: %08X\n",
- ip->flags & ~IPT_F_MASK);
- return false;
-@@ -153,6 +178,8 @@ ip_checkentry(const struct ipt_ip *ip)
- ip->invflags & ~IPT_INV_MASK);
- return false;
- }
-+
-+#undef FWINV
- return true;
- }
-
-@@ -200,7 +227,6 @@ unconditional(const struct ipt_ip *ip)
- return 0;
-
- return 1;
--#undef FWINV
- }
-
- #if defined(CONFIG_NETFILTER_XT_TARGET_TRACE) || \
-@@ -326,8 +352,28 @@ ipt_do_table(struct sk_buff *skb,
- struct xt_match_param mtpar;
- struct xt_target_param tgpar;
-
-- /* Initialization */
- ip = ip_hdr(skb);
-+
-+ IP_NF_ASSERT(table->valid_hooks & (1 << hook));
-+ xt_info_rdlock_bh();
-+ private = table->private;
-+ table_base = private->entries[smp_processor_id()];
-+ e = get_entry(table_base, private->hook_entry[hook]);
-+
-+ if (e->target_offset <= sizeof(struct ipt_entry) &&
-+ (e->ip.flags & IPT_F_NO_DEF_MATCH)) {
-+ struct ipt_entry_target *t = ipt_get_target(e);
-+ if (!t->u.kernel.target->target) {
-+ int v = ((struct ipt_standard_target *)t)->verdict;
-+ if ((v < 0) && (v != IPT_RETURN)) {
-+ ADD_COUNTER(e->counters, ntohs(ip->tot_len), 1);
-+ xt_info_rdunlock_bh();
-+ return (unsigned)(-v) - 1;
-+ }
-+ }
-+ }
-+
-+ /* Initialization */
- datalen = skb->len - ip->ihl * 4;
- indev = in ? in->name : nulldevname;
- outdev = out ? out->name : nulldevname;
-@@ -345,13 +391,6 @@ ipt_do_table(struct sk_buff *skb,
- mtpar.family = tgpar.family = NFPROTO_IPV4;
- mtpar.hooknum = tgpar.hooknum = hook;
-
-- IP_NF_ASSERT(table->valid_hooks & (1 << hook));
-- xt_info_rdlock_bh();
-- private = table->private;
-- table_base = private->entries[smp_processor_id()];
--
-- e = get_entry(table_base, private->hook_entry[hook]);
--
- /* For return from builtin chain */
- back = get_entry(table_base, private->underflow[hook]);
-
-@@ -978,6 +1017,7 @@ copy_entries_to_user(unsigned int total_
- unsigned int i;
- const struct ipt_entry_match *m;
- const struct ipt_entry_target *t;
-+ u8 flags;
-
- e = (struct ipt_entry *)(loc_cpu_entry + off);
- if (copy_to_user(userptr + off
-@@ -988,6 +1028,14 @@ copy_entries_to_user(unsigned int total_
- goto free_counters;
- }
-
-+ flags = e->ip.flags & ~IPT_F_NO_DEF_MATCH;
-+ if (copy_to_user(userptr + off
-+ + offsetof(struct ipt_entry, ip.flags),
-+ &flags, sizeof(flags)) != 0) {
-+ ret = -EFAULT;
-+ goto free_counters;
-+ }
-+
- for (i = sizeof(struct ipt_entry);
- i < e->target_offset;
- i += m->u.match_size) {
+++ /dev/null
---- /dev/null
-+++ b/drivers/net/imq.c
-@@ -0,0 +1,571 @@
-+/*
-+ * Pseudo-driver for the intermediate queue device.
-+ *
-+ * 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.
-+ *
-+ * Authors: Patrick McHardy, <kaber@trash.net>
-+ *
-+ * The first version was written by Martin Devera, <devik@cdi.cz>
-+ *
-+ * Credits: Jan Rafaj <imq2t@cedric.vabo.cz>
-+ * - Update patch to 2.4.21
-+ * Sebastian Strollo <sstrollo@nortelnetworks.com>
-+ * - Fix "Dead-loop on netdevice imq"-issue
-+ * Marcel Sebek <sebek64@post.cz>
-+ * - Update to 2.6.2-rc1
-+ *
-+ * After some time of inactivity there is a group taking care
-+ * of IMQ again: http://www.linuximq.net
-+ *
-+ *
-+ * 2004/06/30 - New version of IMQ patch to kernels <=2.6.7
-+ * including the following changes:
-+ *
-+ * - Correction of ipv6 support "+"s issue (Hasso Tepper)
-+ * - Correction of imq_init_devs() issue that resulted in
-+ * kernel OOPS unloading IMQ as module (Norbert Buchmuller)
-+ * - Addition of functionality to choose number of IMQ devices
-+ * during kernel config (Andre Correa)
-+ * - Addition of functionality to choose how IMQ hooks on
-+ * PRE and POSTROUTING (after or before NAT) (Andre Correa)
-+ * - Cosmetic corrections (Norbert Buchmuller) (Andre Correa)
-+ *
-+ *
-+ * 2005/12/16 - IMQ versions between 2.6.7 and 2.6.13 were
-+ * released with almost no problems. 2.6.14-x was released
-+ * with some important changes: nfcache was removed; After
-+ * some weeks of trouble we figured out that some IMQ fields
-+ * in skb were missing in skbuff.c - skb_clone and copy_skb_header.
-+ * These functions are correctly patched by this new patch version.
-+ *
-+ * Thanks for all who helped to figure out all the problems with
-+ * 2.6.14.x: Patrick McHardy, Rune Kock, VeNoMouS, Max CtRiX,
-+ * Kevin Shanahan, Richard Lucassen, Valery Dachev (hopefully
-+ * I didn't forget anybody). I apologize again for my lack of time.
-+ *
-+ *
-+ * 2008/06/17 - 2.6.25 - Changed imq.c to use qdisc_run() instead
-+ * of qdisc_restart() and moved qdisc_run() to tasklet to avoid
-+ * recursive locking. New initialization routines to fix 'rmmod' not
-+ * working anymore. Used code from ifb.c. (Jussi Kivilinna)
-+ *
-+ * 2008/08/06 - 2.6.26 - (JK)
-+ * - Replaced tasklet with 'netif_schedule()'.
-+ * - Cleaned up and added comments for imq_nf_queue().
-+ *
-+ * 2009/04/12
-+ * - Add skb_save_cb/skb_restore_cb helper functions for backuping
-+ * control buffer. This is needed because qdisc-layer on kernels
-+ * 2.6.27 and newer overwrite control buffer. (Jussi Kivilinna)
-+ * - Add better locking for IMQ device. Hopefully this will solve
-+ * SMP issues. (Jussi Kivilinna)
-+ * - Port to 2.6.27
-+ * - Port to 2.6.28
-+ * - Port to 2.6.29 + fix rmmod not working
-+ *
-+ * 2009/04/20 - (Jussi Kivilinna)
-+ * - Use netdevice feature flags to avoid extra packet handling
-+ * by core networking layer and possibly increase performance.
-+ *
-+ * Also, many thanks to pablo Sebastian Greco for making the initial
-+ * patch and to those who helped the testing.
-+ *
-+ * More info at: http://www.linuximq.net/ (Andre Correa)
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/moduleparam.h>
-+#include <linux/list.h>
-+#include <linux/skbuff.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/rtnetlink.h>
-+#include <linux/if_arp.h>
-+#include <linux/netfilter.h>
-+#include <linux/netfilter_ipv4.h>
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ #include <linux/netfilter_ipv6.h>
-+#endif
-+#include <linux/imq.h>
-+#include <net/pkt_sched.h>
-+#include <net/netfilter/nf_queue.h>
-+
-+static nf_hookfn imq_nf_hook;
-+
-+static struct nf_hook_ops imq_ingress_ipv4 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET,
-+ .hooknum = NF_INET_PRE_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ .priority = NF_IP_PRI_MANGLE + 1
-+#else
-+ .priority = NF_IP_PRI_NAT_DST + 1
-+#endif
-+};
-+
-+static struct nf_hook_ops imq_egress_ipv4 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET,
-+ .hooknum = NF_INET_POST_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_AA) || defined(CONFIG_IMQ_BEHAVIOR_BA)
-+ .priority = NF_IP_PRI_LAST
-+#else
-+ .priority = NF_IP_PRI_NAT_SRC - 1
-+#endif
-+};
-+
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+static struct nf_hook_ops imq_ingress_ipv6 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET6,
-+ .hooknum = NF_INET_PRE_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ .priority = NF_IP6_PRI_MANGLE + 1
-+#else
-+ .priority = NF_IP6_PRI_NAT_DST + 1
-+#endif
-+};
-+
-+static struct nf_hook_ops imq_egress_ipv6 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET6,
-+ .hooknum = NF_INET_POST_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_AA) || defined(CONFIG_IMQ_BEHAVIOR_BA)
-+ .priority = NF_IP6_PRI_LAST
-+#else
-+ .priority = NF_IP6_PRI_NAT_SRC - 1
-+#endif
-+};
-+#endif
-+
-+#if defined(CONFIG_IMQ_NUM_DEVS)
-+static unsigned int numdevs = CONFIG_IMQ_NUM_DEVS;
-+#else
-+static unsigned int numdevs = IMQ_MAX_DEVS;
-+#endif
-+
-+static DEFINE_SPINLOCK(imq_nf_queue_lock);
-+
-+static struct net_device *imq_devs_cache[IMQ_MAX_DEVS];
-+
-+
-+static struct net_device_stats *imq_get_stats(struct net_device *dev)
-+{
-+ return &dev->stats;
-+}
-+
-+/* called for packets kfree'd in qdiscs at places other than enqueue */
-+static void imq_skb_destructor(struct sk_buff *skb)
-+{
-+ struct nf_queue_entry *entry = skb->nf_queue_entry;
-+
-+ if (entry) {
-+ nf_queue_entry_release_refs(entry);
-+ kfree(entry);
-+ }
-+
-+ skb_restore_cb(skb); /* kfree backup */
-+}
-+
-+static void imq_nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
-+{
-+ int status;
-+
-+ if (!entry->next_outfn) {
-+ spin_lock_bh(&imq_nf_queue_lock);
-+ nf_reinject(entry, verdict);
-+ spin_unlock_bh(&imq_nf_queue_lock);
-+ return;
-+ }
-+
-+ rcu_read_lock();
-+ local_bh_disable();
-+ status = entry->next_outfn(entry, entry->next_queuenum);
-+ local_bh_enable();
-+ if (status < 0) {
-+ nf_queue_entry_release_refs(entry);
-+ kfree_skb(entry->skb);
-+ kfree(entry);
-+ }
-+
-+ rcu_read_unlock();
-+}
-+
-+static int imq_dev_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+ dev->stats.tx_bytes += skb->len;
-+ dev->stats.tx_packets++;
-+
-+ skb->imq_flags = 0;
-+ skb->destructor = NULL;
-+
-+ skb_restore_cb(skb); /* restore skb->cb */
-+
-+ dev->trans_start = jiffies;
-+ imq_nf_reinject(skb->nf_queue_entry, NF_ACCEPT);
-+ return 0;
-+}
-+
-+static int imq_nf_queue(struct nf_queue_entry *entry, unsigned queue_num)
-+{
-+ struct net_device *dev;
-+ struct sk_buff *skb_orig, *skb, *skb_shared;
-+ struct Qdisc *q;
-+ struct netdev_queue *txq;
-+ int users, index;
-+ int retval = -EINVAL;
-+
-+ index = entry->skb->imq_flags & IMQ_F_IFMASK;
-+ if (unlikely(index > numdevs - 1)) {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING
-+ "IMQ: invalid device specified, highest is %u\n",
-+ numdevs - 1);
-+ retval = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* check for imq device by index from cache */
-+ dev = imq_devs_cache[index];
-+ if (unlikely(!dev)) {
-+ char buf[8];
-+
-+ /* get device by name and cache result */
-+ snprintf(buf, sizeof(buf), "imq%d", index);
-+ dev = dev_get_by_name(&init_net, buf);
-+ if (!dev) {
-+ /* not found ?!*/
-+ BUG();
-+ retval = -ENODEV;
-+ goto out;
-+ }
-+
-+ imq_devs_cache[index] = dev;
-+ dev_put(dev);
-+ }
-+
-+ if (unlikely(!(dev->flags & IFF_UP))) {
-+ entry->skb->imq_flags = 0;
-+ imq_nf_reinject(entry, NF_ACCEPT);
-+ retval = 0;
-+ goto out;
-+ }
-+ dev->last_rx = jiffies;
-+
-+ skb = entry->skb;
-+ skb_orig = NULL;
-+
-+ /* skb has owner? => make clone */
-+ if (unlikely(skb->destructor)) {
-+ skb_orig = skb;
-+ skb = skb_clone(skb, GFP_ATOMIC);
-+ if (!skb) {
-+ retval = -ENOMEM;
-+ goto out;
-+ }
-+ entry->skb = skb;
-+ }
-+
-+ skb->nf_queue_entry = entry;
-+
-+ dev->stats.rx_bytes += skb->len;
-+ dev->stats.rx_packets++;
-+
-+ txq = dev_pick_tx(dev, skb);
-+
-+ q = rcu_dereference(txq->qdisc);
-+ if (unlikely(!q->enqueue))
-+ goto packet_not_eaten_by_imq_dev;
-+
-+ spin_lock_bh(qdisc_lock(q));
-+
-+ users = atomic_read(&skb->users);
-+
-+ skb_shared = skb_get(skb); /* increase reference count by one */
-+ skb_save_cb(skb_shared); /* backup skb->cb, as qdisc layer will
-+ overwrite it */
-+ qdisc_enqueue_root(skb_shared, q); /* might kfree_skb */
-+
-+ if (likely(atomic_read(&skb_shared->users) == users + 1)) {
-+ kfree_skb(skb_shared); /* decrease reference count by one */
-+
-+ skb->destructor = &imq_skb_destructor;
-+
-+ /* cloned? */
-+ if (skb_orig)
-+ kfree_skb(skb_orig); /* free original */
-+
-+ spin_unlock_bh(qdisc_lock(q));
-+
-+ /* schedule qdisc dequeue */
-+ __netif_schedule(q);
-+
-+ retval = 0;
-+ goto out;
-+ } else {
-+ skb_restore_cb(skb_shared); /* restore skb->cb */
-+ /* qdisc dropped packet and decreased skb reference count of
-+ * skb, so we don't really want to and try refree as that would
-+ * actually destroy the skb. */
-+ spin_unlock_bh(qdisc_lock(q));
-+ goto packet_not_eaten_by_imq_dev;
-+ }
-+
-+packet_not_eaten_by_imq_dev:
-+ /* cloned? restore original */
-+ if (skb_orig) {
-+ kfree_skb(skb);
-+ entry->skb = skb_orig;
-+ }
-+ retval = -1;
-+out:
-+ return retval;
-+}
-+
-+static struct nf_queue_handler nfqh = {
-+ .name = "imq",
-+ .outfn = imq_nf_queue,
-+};
-+
-+static unsigned int imq_nf_hook(unsigned int hook, struct sk_buff *pskb,
-+ const struct net_device *indev,
-+ const struct net_device *outdev,
-+ int (*okfn)(struct sk_buff *))
-+{
-+ if (pskb->imq_flags & IMQ_F_ENQUEUE)
-+ return NF_QUEUE;
-+
-+ return NF_ACCEPT;
-+}
-+
-+static int imq_close(struct net_device *dev)
-+{
-+ netif_stop_queue(dev);
-+ return 0;
-+}
-+
-+static int imq_open(struct net_device *dev)
-+{
-+ netif_start_queue(dev);
-+ return 0;
-+}
-+
-+static const struct net_device_ops imq_netdev_ops = {
-+ .ndo_open = imq_open,
-+ .ndo_stop = imq_close,
-+ .ndo_start_xmit = imq_dev_xmit,
-+ .ndo_get_stats = imq_get_stats,
-+};
-+
-+static void imq_setup(struct net_device *dev)
-+{
-+ dev->netdev_ops = &imq_netdev_ops;
-+ dev->type = ARPHRD_VOID;
-+ dev->mtu = 16000;
-+ dev->tx_queue_len = 11000;
-+ dev->flags = IFF_NOARP;
-+ dev->features = NETIF_F_SG | NETIF_F_FRAGLIST |
-+ NETIF_F_GSO | NETIF_F_HW_CSUM |
-+ NETIF_F_HIGHDMA;
-+}
-+
-+static int imq_validate(struct nlattr *tb[], struct nlattr *data[])
-+{
-+ int ret = 0;
-+
-+ if (tb[IFLA_ADDRESS]) {
-+ if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN) {
-+ ret = -EINVAL;
-+ goto end;
-+ }
-+ if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS]))) {
-+ ret = -EADDRNOTAVAIL;
-+ goto end;
-+ }
-+ }
-+ return 0;
-+end:
-+ printk(KERN_WARNING "IMQ: imq_validate failed (%d)\n", ret);
-+ return ret;
-+}
-+
-+static struct rtnl_link_ops imq_link_ops __read_mostly = {
-+ .kind = "imq",
-+ .priv_size = 0,
-+ .setup = imq_setup,
-+ .validate = imq_validate,
-+};
-+
-+static int __init imq_init_hooks(void)
-+{
-+ int err;
-+
-+ nf_register_queue_imq_handler(&nfqh);
-+
-+ err = nf_register_hook(&imq_ingress_ipv4);
-+ if (err)
-+ goto err1;
-+
-+ err = nf_register_hook(&imq_egress_ipv4);
-+ if (err)
-+ goto err2;
-+
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ err = nf_register_hook(&imq_ingress_ipv6);
-+ if (err)
-+ goto err3;
-+
-+ err = nf_register_hook(&imq_egress_ipv6);
-+ if (err)
-+ goto err4;
-+#endif
-+
-+ return 0;
-+
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+err4:
-+ nf_unregister_hook(&imq_ingress_ipv6);
-+err3:
-+ nf_unregister_hook(&imq_egress_ipv4);
-+#endif
-+err2:
-+ nf_unregister_hook(&imq_ingress_ipv4);
-+err1:
-+ nf_unregister_queue_imq_handler();
-+ return err;
-+}
-+
-+static int __init imq_init_one(int index)
-+{
-+ struct net_device *dev;
-+ int ret;
-+
-+ dev = alloc_netdev(0, "imq%d", imq_setup);
-+ if (!dev)
-+ return -ENOMEM;
-+
-+ ret = dev_alloc_name(dev, dev->name);
-+ if (ret < 0)
-+ goto fail;
-+
-+ dev->rtnl_link_ops = &imq_link_ops;
-+ ret = register_netdevice(dev);
-+ if (ret < 0)
-+ goto fail;
-+
-+ return 0;
-+fail:
-+ free_netdev(dev);
-+ return ret;
-+}
-+
-+static int __init imq_init_devs(void)
-+{
-+ int err, i;
-+
-+ if (numdevs < 1 || numdevs > IMQ_MAX_DEVS) {
-+ printk(KERN_ERR "IMQ: numdevs has to be betweed 1 and %u\n",
-+ IMQ_MAX_DEVS);
-+ return -EINVAL;
-+ }
-+
-+ rtnl_lock();
-+ err = __rtnl_link_register(&imq_link_ops);
-+
-+ for (i = 0; i < numdevs && !err; i++)
-+ err = imq_init_one(i);
-+
-+ if (err) {
-+ __rtnl_link_unregister(&imq_link_ops);
-+ memset(imq_devs_cache, 0, sizeof(imq_devs_cache));
-+ }
-+ rtnl_unlock();
-+
-+ return err;
-+}
-+
-+static int __init imq_init_module(void)
-+{
-+ int err;
-+
-+#if defined(CONFIG_IMQ_NUM_DEVS)
-+ BUILD_BUG_ON(CONFIG_IMQ_NUM_DEVS > 16);
-+ BUILD_BUG_ON(CONFIG_IMQ_NUM_DEVS < 2);
-+ BUILD_BUG_ON(CONFIG_IMQ_NUM_DEVS - 1 > IMQ_F_IFMASK);
-+#endif
-+
-+ err = imq_init_devs();
-+ if (err) {
-+ printk(KERN_ERR "IMQ: Error trying imq_init_devs(net)\n");
-+ return err;
-+ }
-+
-+ err = imq_init_hooks();
-+ if (err) {
-+ printk(KERN_ERR "IMQ: Error trying imq_init_hooks()\n");
-+ rtnl_link_unregister(&imq_link_ops);
-+ memset(imq_devs_cache, 0, sizeof(imq_devs_cache));
-+ return err;
-+ }
-+
-+ printk(KERN_INFO "IMQ driver loaded successfully.\n");
-+
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ printk(KERN_INFO "\tHooking IMQ before NAT on PREROUTING.\n");
-+#else
-+ printk(KERN_INFO "\tHooking IMQ after NAT on PREROUTING.\n");
-+#endif
-+#if defined(CONFIG_IMQ_BEHAVIOR_AB) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ printk(KERN_INFO "\tHooking IMQ before NAT on POSTROUTING.\n");
-+#else
-+ printk(KERN_INFO "\tHooking IMQ after NAT on POSTROUTING.\n");
-+#endif
-+
-+ return 0;
-+}
-+
-+static void __exit imq_unhook(void)
-+{
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ nf_unregister_hook(&imq_ingress_ipv6);
-+ nf_unregister_hook(&imq_egress_ipv6);
-+#endif
-+ nf_unregister_hook(&imq_ingress_ipv4);
-+ nf_unregister_hook(&imq_egress_ipv4);
-+
-+ nf_unregister_queue_imq_handler();
-+}
-+
-+static void __exit imq_cleanup_devs(void)
-+{
-+ rtnl_link_unregister(&imq_link_ops);
-+ memset(imq_devs_cache, 0, sizeof(imq_devs_cache));
-+}
-+
-+static void __exit imq_exit_module(void)
-+{
-+ imq_unhook();
-+ imq_cleanup_devs();
-+ printk(KERN_INFO "IMQ driver unloaded successfully.\n");
-+}
-+
-+module_init(imq_init_module);
-+module_exit(imq_exit_module);
-+
-+module_param(numdevs, int, 0);
-+MODULE_PARM_DESC(numdevs, "number of IMQ devices (how many imq* devices will "
-+ "be created)");
-+MODULE_AUTHOR("http://www.linuximq.net");
-+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See "
-+ "http://www.linuximq.net/ for more information.");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS_RTNL_LINK("imq");
-+
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -109,6 +109,129 @@ config EQUALIZER
- To compile this driver as a module, choose M here: the module
- will be called eql. If unsure, say N.
-
-+config IMQ
-+ tristate "IMQ (intermediate queueing device) support"
-+ depends on NETDEVICES && NETFILTER
-+ ---help---
-+ The IMQ device(s) is used as placeholder for QoS queueing
-+ disciplines. Every packet entering/leaving the IP stack can be
-+ directed through the IMQ device where it's enqueued/dequeued to the
-+ attached qdisc. This allows you to treat network devices as classes
-+ and distribute bandwidth among them. Iptables is used to specify
-+ through which IMQ device, if any, packets travel.
-+
-+ More information at: http://www.linuximq.net/
-+
-+ To compile this driver as a module, choose M here: the module
-+ will be called imq. If unsure, say N.
-+
-+choice
-+ prompt "IMQ behavior (PRE/POSTROUTING)"
-+ depends on IMQ
-+ default IMQ_BEHAVIOR_AB
-+ help
-+
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ IMQ can work in any of the following ways:
-+
-+ PREROUTING | POSTROUTING
-+ -----------------|-------------------
-+ #1 After NAT | After NAT
-+ #2 After NAT | Before NAT
-+ #3 Before NAT | After NAT
-+ #4 Before NAT | Before NAT
-+
-+ The default behavior is to hook before NAT on PREROUTING
-+ and after NAT on POSTROUTING (#3).
-+
-+ This settings are specially usefull when trying to use IMQ
-+ to shape NATed clients.
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_AA
-+ bool "IMQ AA"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: After NAT
-+ POSTROUTING: After NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_AB
-+ bool "IMQ AB"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: After NAT
-+ POSTROUTING: Before NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_BA
-+ bool "IMQ BA"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: Before NAT
-+ POSTROUTING: After NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_BB
-+ bool "IMQ BB"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: Before NAT
-+ POSTROUTING: Before NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+endchoice
-+
-+config IMQ_NUM_DEVS
-+
-+ int "Number of IMQ devices"
-+ range 2 16
-+ depends on IMQ
-+ default "16"
-+ help
-+
-+ This settings defines how many IMQ devices will be
-+ created.
-+
-+ The default value is 16.
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
- config TUN
- tristate "Universal TUN/TAP device driver support"
- select CRC32
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -160,6 +160,7 @@ obj-$(CONFIG_SLHC) += slhc.o
- obj-$(CONFIG_XEN_NETDEV_FRONTEND) += xen-netfront.o
-
- obj-$(CONFIG_DUMMY) += dummy.o
-+obj-$(CONFIG_IMQ) += imq.o
- obj-$(CONFIG_IFB) += ifb.o
- obj-$(CONFIG_MACVLAN) += macvlan.o
- obj-$(CONFIG_DE600) += de600.o
---- /dev/null
-+++ b/include/linux/imq.h
-@@ -0,0 +1,13 @@
-+#ifndef _IMQ_H
-+#define _IMQ_H
-+
-+/* IFMASK (16 device indexes, 0 to 15) and flag(s) fit in 5 bits */
-+#define IMQ_F_BITS 5
-+
-+#define IMQ_F_IFMASK 0x0f
-+#define IMQ_F_ENQUEUE 0x10
-+
-+#define IMQ_MAX_DEVS (IMQ_F_IFMASK + 1)
-+
-+#endif /* _IMQ_H */
-+
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ipt_IMQ.h
-@@ -0,0 +1,10 @@
-+#ifndef _IPT_IMQ_H
-+#define _IPT_IMQ_H
-+
-+/* Backwards compatibility for old userspace */
-+#include <linux/netfilter/xt_IMQ.h>
-+
-+#define ipt_imq_info xt_imq_info
-+
-+#endif /* _IPT_IMQ_H */
-+
---- /dev/null
-+++ b/include/linux/netfilter_ipv6/ip6t_IMQ.h
-@@ -0,0 +1,10 @@
-+#ifndef _IP6T_IMQ_H
-+#define _IP6T_IMQ_H
-+
-+/* Backwards compatibility for old userspace */
-+#include <linux/netfilter/xt_IMQ.h>
-+
-+#define ip6t_imq_info xt_imq_info
-+
-+#endif /* _IP6T_IMQ_H */
-+
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -29,6 +29,9 @@
- #include <linux/rcupdate.h>
- #include <linux/dmaengine.h>
- #include <linux/hrtimer.h>
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+#include <linux/imq.h>
-+#endif
-
- /* Don't change this without changing skb_csum_unnecessary! */
- #define CHECKSUM_NONE 0
-@@ -331,6 +334,9 @@ struct sk_buff {
- * first. This is owned by whoever has the skb queued ATM.
- */
- char cb[48];
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ void *cb_next;
-+#endif
-
- unsigned int len,
- data_len;
-@@ -363,6 +369,9 @@ struct sk_buff {
- struct nf_conntrack *nfct;
- struct sk_buff *nfct_reasm;
- #endif
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ struct nf_queue_entry *nf_queue_entry;
-+#endif
- #ifdef CONFIG_BRIDGE_NETFILTER
- struct nf_bridge_info *nf_bridge;
- #endif
-@@ -386,6 +395,9 @@ struct sk_buff {
- kmemcheck_bitfield_end(flags2);
-
- /* 0/13/14 bit hole */
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ __u8 imq_flags:IMQ_F_BITS;
-+#endif
-
- #ifdef CONFIG_NET_DMA
- dma_cookie_t dma_cookie;
-@@ -441,6 +453,12 @@ static inline struct rtable *skb_rtable(
- return (struct rtable *)skb_dst(skb);
- }
-
-+
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+extern int skb_save_cb(struct sk_buff *skb);
-+extern int skb_restore_cb(struct sk_buff *skb);
-+#endif
-+
- extern void kfree_skb(struct sk_buff *skb);
- extern void consume_skb(struct sk_buff *skb);
- extern void __kfree_skb(struct sk_buff *skb);
-@@ -1976,6 +1994,10 @@ static inline void __nf_copy(struct sk_b
- dst->nfct_reasm = src->nfct_reasm;
- nf_conntrack_get_reasm(src->nfct_reasm);
- #endif
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ dst->imq_flags = src->imq_flags;
-+ dst->nf_queue_entry = src->nf_queue_entry;
-+#endif
- #ifdef CONFIG_BRIDGE_NETFILTER
- dst->nf_bridge = src->nf_bridge;
- nf_bridge_get(src->nf_bridge);
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -96,6 +96,9 @@
- #include <net/net_namespace.h>
- #include <net/sock.h>
- #include <linux/rtnetlink.h>
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+#include <linux/imq.h>
-+#endif
- #include <linux/proc_fs.h>
- #include <linux/seq_file.h>
- #include <linux/stat.h>
-@@ -1687,7 +1690,11 @@ int dev_hard_start_xmit(struct sk_buff *
- int rc;
-
- if (likely(!skb->next)) {
-- if (!list_empty(&ptype_all))
-+ if (!list_empty(&ptype_all)
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ && !(skb->imq_flags & IMQ_F_ENQUEUE)
-+#endif
-+ )
- dev_queue_xmit_nit(skb, dev);
-
- if (netif_needs_gso(dev, skb)) {
-@@ -1772,8 +1779,7 @@ u16 skb_tx_hash(const struct net_device
- }
- EXPORT_SYMBOL(skb_tx_hash);
-
--static struct netdev_queue *dev_pick_tx(struct net_device *dev,
-- struct sk_buff *skb)
-+struct netdev_queue *dev_pick_tx(struct net_device *dev, struct sk_buff *skb)
- {
- const struct net_device_ops *ops = dev->netdev_ops;
- u16 queue_index = 0;
-@@ -1786,6 +1792,7 @@ static struct netdev_queue *dev_pick_tx(
- skb_set_queue_mapping(skb, queue_index);
- return netdev_get_tx_queue(dev, queue_index);
- }
-+EXPORT_SYMBOL(dev_pick_tx);
-
- /**
- * dev_queue_xmit - transmit a buffer
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -1102,6 +1102,7 @@ extern int dev_alloc_name(struct net_de
- extern int dev_open(struct net_device *dev);
- extern int dev_close(struct net_device *dev);
- extern void dev_disable_lro(struct net_device *dev);
-+extern struct netdev_queue *dev_pick_tx(struct net_device *dev, struct sk_buff *skb);
- extern int dev_queue_xmit(struct sk_buff *skb);
- extern int register_netdevice(struct net_device *dev);
- extern void unregister_netdevice(struct net_device *dev);
---- /dev/null
-+++ b/include/linux/netfilter/xt_IMQ.h
-@@ -0,0 +1,9 @@
-+#ifndef _XT_IMQ_H
-+#define _XT_IMQ_H
-+
-+struct xt_imq_info {
-+ unsigned int todev; /* target imq device */
-+};
-+
-+#endif /* _XT_IMQ_H */
-+
---- a/include/net/netfilter/nf_queue.h
-+++ b/include/net/netfilter/nf_queue.h
-@@ -13,6 +13,12 @@ struct nf_queue_entry {
- struct net_device *indev;
- struct net_device *outdev;
- int (*okfn)(struct sk_buff *);
-+
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ int (*next_outfn)(struct nf_queue_entry *entry,
-+ unsigned int queuenum);
-+ unsigned int next_queuenum;
-+#endif
- };
-
- #define nf_queue_entry_reroute(x) ((void *)x + sizeof(struct nf_queue_entry))
-@@ -30,5 +36,11 @@ extern int nf_unregister_queue_handler(u
- const struct nf_queue_handler *qh);
- extern void nf_unregister_queue_handlers(const struct nf_queue_handler *qh);
- extern void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict);
-+extern void nf_queue_entry_release_refs(struct nf_queue_entry *entry);
-+
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+extern void nf_register_queue_imq_handler(const struct nf_queue_handler *qh);
-+extern void nf_unregister_queue_imq_handler(void);
-+#endif
-
- #endif /* _NF_QUEUE_H */
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
-@@ -72,6 +72,9 @@
-
- static struct kmem_cache *skbuff_head_cache __read_mostly;
- static struct kmem_cache *skbuff_fclone_cache __read_mostly;
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+static struct kmem_cache *skbuff_cb_store_cache __read_mostly;
-+#endif
-
- static void sock_pipe_buf_release(struct pipe_inode_info *pipe,
- struct pipe_buffer *buf)
-@@ -91,6 +94,80 @@ static int sock_pipe_buf_steal(struct pi
- return 1;
- }
-
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+/* Control buffer save/restore for IMQ devices */
-+struct skb_cb_table {
-+ void *cb_next;
-+ atomic_t refcnt;
-+ char cb[48];
-+};
-+
-+static DEFINE_SPINLOCK(skb_cb_store_lock);
-+
-+int skb_save_cb(struct sk_buff *skb)
-+{
-+ struct skb_cb_table *next;
-+
-+ next = kmem_cache_alloc(skbuff_cb_store_cache, GFP_ATOMIC);
-+ if (!next)
-+ return -ENOMEM;
-+
-+ BUILD_BUG_ON(sizeof(skb->cb) != sizeof(next->cb));
-+
-+ memcpy(next->cb, skb->cb, sizeof(skb->cb));
-+ next->cb_next = skb->cb_next;
-+
-+ atomic_set(&next->refcnt, 1);
-+
-+ skb->cb_next = next;
-+ return 0;
-+}
-+EXPORT_SYMBOL(skb_save_cb);
-+
-+int skb_restore_cb(struct sk_buff *skb)
-+{
-+ struct skb_cb_table *next;
-+
-+ if (!skb->cb_next)
-+ return 0;
-+
-+ next = skb->cb_next;
-+
-+ BUILD_BUG_ON(sizeof(skb->cb) != sizeof(next->cb));
-+
-+ memcpy(skb->cb, next->cb, sizeof(skb->cb));
-+ skb->cb_next = next->cb_next;
-+
-+ spin_lock(&skb_cb_store_lock);
-+
-+ if (atomic_dec_and_test(&next->refcnt)) {
-+ kmem_cache_free(skbuff_cb_store_cache, next);
-+ }
-+
-+ spin_unlock(&skb_cb_store_lock);
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL(skb_restore_cb);
-+
-+static void skb_copy_stored_cb(struct sk_buff *new, struct sk_buff *old)
-+{
-+ struct skb_cb_table *next;
-+
-+ if (!old->cb_next) {
-+ new->cb_next = 0;
-+ return;
-+ }
-+
-+ spin_lock(&skb_cb_store_lock);
-+
-+ next = old->cb_next;
-+ atomic_inc(&next->refcnt);
-+ new->cb_next = next;
-+
-+ spin_unlock(&skb_cb_store_lock);
-+}
-+#endif
-
- /* Pipe buffer operations for a socket. */
- static struct pipe_buf_operations sock_pipe_buf_ops = {
-@@ -398,6 +475,15 @@ static void skb_release_head_state(struc
- WARN_ON(in_irq());
- skb->destructor(skb);
- }
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ /* This should not happen. When it does, avoid memleak by restoring
-+ the chain of cb-backups. */
-+ while(skb->cb_next != NULL) {
-+ printk(KERN_WARNING "kfree_skb: skb->cb_next: %08x\n",
-+ skb->cb_next);
-+ skb_restore_cb(skb);
-+ }
-+#endif
- #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
- nf_conntrack_put(skb->nfct);
- nf_conntrack_put_reasm(skb->nfct_reasm);
-@@ -535,6 +621,9 @@ static void __copy_skb_header(struct sk_
- new->sp = secpath_get(old->sp);
- #endif
- memcpy(new->cb, old->cb, sizeof(old->cb));
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ skb_copy_stored_cb(new, old);
-+#endif
- new->csum = old->csum;
- new->local_df = old->local_df;
- new->pkt_type = old->pkt_type;
-@@ -2779,6 +2868,13 @@ void __init skb_init(void)
- 0,
- SLAB_HWCACHE_ALIGN|SLAB_PANIC,
- NULL);
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ skbuff_cb_store_cache = kmem_cache_create("skbuff_cb_store_cache",
-+ sizeof(struct skb_cb_table),
-+ 0,
-+ SLAB_HWCACHE_ALIGN|SLAB_PANIC,
-+ NULL);
-+#endif
- }
-
- /**
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -396,6 +396,18 @@ config NETFILTER_XT_TARGET_LED
- For more information on the LEDs available on your system, see
- Documentation/leds-class.txt
-
-+config NETFILTER_XT_TARGET_IMQ
-+ tristate '"IMQ" target support'
-+ depends on NETFILTER_XTABLES
-+ depends on IP_NF_MANGLE || IP6_NF_MANGLE
-+ select IMQ
-+ default m if NETFILTER_ADVANCED=n
-+ help
-+ This option adds a `IMQ' target which is used to specify if and
-+ to which imq device packets should get enqueued/dequeued.
-+
-+ To compile it as a module, choose M here. If unsure, say N.
-+
- config NETFILTER_XT_TARGET_MARK
- tristate '"MARK" target support'
- default m if NETFILTER_ADVANCED=n
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -46,6 +46,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CONNMAR
- obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_HL) += xt_HL.o
-+obj-$(CONFIG_NETFILTER_XT_TARGET_IMQ) += xt_IMQ.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_MARK) += xt_MARK.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_NFLOG) += xt_NFLOG.o
---- a/net/netfilter/nf_queue.c
-+++ b/net/netfilter/nf_queue.c
-@@ -20,6 +20,26 @@ static const struct nf_queue_handler *qu
-
- static DEFINE_MUTEX(queue_handler_mutex);
-
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+static const struct nf_queue_handler *queue_imq_handler;
-+
-+void nf_register_queue_imq_handler(const struct nf_queue_handler *qh)
-+{
-+ mutex_lock(&queue_handler_mutex);
-+ rcu_assign_pointer(queue_imq_handler, qh);
-+ mutex_unlock(&queue_handler_mutex);
-+}
-+EXPORT_SYMBOL(nf_register_queue_imq_handler);
-+
-+void nf_unregister_queue_imq_handler(void)
-+{
-+ mutex_lock(&queue_handler_mutex);
-+ rcu_assign_pointer(queue_imq_handler, NULL);
-+ mutex_unlock(&queue_handler_mutex);
-+}
-+EXPORT_SYMBOL(nf_unregister_queue_imq_handler);
-+#endif
-+
- /* return EBUSY when somebody else is registered, return EEXIST if the
- * same handler is registered, return 0 in case of success. */
- int nf_register_queue_handler(u_int8_t pf, const struct nf_queue_handler *qh)
-@@ -80,7 +100,7 @@ void nf_unregister_queue_handlers(const
- }
- EXPORT_SYMBOL_GPL(nf_unregister_queue_handlers);
-
--static void nf_queue_entry_release_refs(struct nf_queue_entry *entry)
-+void nf_queue_entry_release_refs(struct nf_queue_entry *entry)
- {
- /* Release those devices we held, or Alexey will kill me. */
- if (entry->indev)
-@@ -100,6 +120,7 @@ static void nf_queue_entry_release_refs(
- /* Drop reference to owner of hook which queued us. */
- module_put(entry->elem->owner);
- }
-+EXPORT_SYMBOL_GPL(nf_queue_entry_release_refs);
-
- /*
- * Any packet that leaves via this function must come back
-@@ -121,12 +142,26 @@ static int __nf_queue(struct sk_buff *sk
- #endif
- const struct nf_afinfo *afinfo;
- const struct nf_queue_handler *qh;
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ const struct nf_queue_handler *qih = NULL;
-+#endif
-
- /* QUEUE == DROP if noone is waiting, to be safe. */
- rcu_read_lock();
-
- qh = rcu_dereference(queue_handler[pf]);
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ if (pf == PF_INET || pf == PF_INET6)
-+#else
-+ if (pf == PF_INET)
-+#endif
-+ qih = rcu_dereference(queue_imq_handler);
-+
-+ if (!qh && !qih)
-+#else /* !IMQ */
- if (!qh)
-+#endif
- goto err_unlock;
-
- afinfo = nf_get_afinfo(pf);
-@@ -145,6 +180,10 @@ static int __nf_queue(struct sk_buff *sk
- .indev = indev,
- .outdev = outdev,
- .okfn = okfn,
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ .next_outfn = qh ? qh->outfn : NULL,
-+ .next_queuenum = queuenum,
-+#endif
- };
-
- /* If it's going away, ignore hook. */
-@@ -170,8 +209,19 @@ static int __nf_queue(struct sk_buff *sk
- }
- #endif
- afinfo->saveroute(skb, entry);
-+
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ if (qih) {
-+ status = qih->outfn(entry, queuenum);
-+ goto imq_skip_queue;
-+ }
-+#endif
-+
- status = qh->outfn(entry, queuenum);
-
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+imq_skip_queue:
-+#endif
- rcu_read_unlock();
-
- if (status < 0) {
---- /dev/null
-+++ b/net/netfilter/xt_IMQ.c
-@@ -0,0 +1,73 @@
-+/*
-+ * This target marks packets to be enqueued to an imq device
-+ */
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter/x_tables.h>
-+#include <linux/netfilter/xt_IMQ.h>
-+#include <linux/imq.h>
-+
-+static unsigned int imq_target(struct sk_buff *pskb,
-+ const struct xt_target_param *par)
-+{
-+ const struct xt_imq_info *mr = par->targinfo;
-+
-+ pskb->imq_flags = (mr->todev & IMQ_F_IFMASK) | IMQ_F_ENQUEUE;
-+
-+ return XT_CONTINUE;
-+}
-+
-+static bool imq_checkentry(const struct xt_tgchk_param *par)
-+{
-+ struct xt_imq_info *mr = par->targinfo;
-+
-+ if (mr->todev > IMQ_MAX_DEVS - 1) {
-+ printk(KERN_WARNING
-+ "IMQ: invalid device specified, highest is %u\n",
-+ IMQ_MAX_DEVS - 1);
-+ return 0;
-+ }
-+
-+ return 1;
-+}
-+
-+static struct xt_target xt_imq_reg[] __read_mostly = {
-+ {
-+ .name = "IMQ",
-+ .family = AF_INET,
-+ .checkentry = imq_checkentry,
-+ .target = imq_target,
-+ .targetsize = sizeof(struct xt_imq_info),
-+ .table = "mangle",
-+ .me = THIS_MODULE
-+ },
-+ {
-+ .name = "IMQ",
-+ .family = AF_INET6,
-+ .checkentry = imq_checkentry,
-+ .target = imq_target,
-+ .targetsize = sizeof(struct xt_imq_info),
-+ .table = "mangle",
-+ .me = THIS_MODULE
-+ },
-+};
-+
-+static int __init imq_init(void)
-+{
-+ return xt_register_targets(xt_imq_reg, ARRAY_SIZE(xt_imq_reg));
-+}
-+
-+static void __exit imq_fini(void)
-+{
-+ xt_unregister_targets(xt_imq_reg, ARRAY_SIZE(xt_imq_reg));
-+}
-+
-+module_init(imq_init);
-+module_exit(imq_fini);
-+
-+MODULE_AUTHOR("http://www.linuximq.net");
-+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See http://www.linuximq.net/ for more information.");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS("ipt_IMQ");
-+MODULE_ALIAS("ip6t_IMQ");
-+
+++ /dev/null
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -160,7 +160,6 @@ config NF_CONNTRACK_FTP
-
- config NF_CONNTRACK_H323
- tristate "H.323 protocol support"
-- depends on (IPV6 || IPV6=n)
- depends on NETFILTER_ADVANCED
- help
- H.323 is a VoIP signalling protocol from ITU-T. As one of the most
-@@ -505,7 +504,6 @@ config NETFILTER_XT_TARGET_SECMARK
-
- config NETFILTER_XT_TARGET_TCPMSS
- tristate '"TCPMSS" target support'
-- depends on (IPV6 || IPV6=n)
- default m if NETFILTER_ADVANCED=n
- ---help---
- This option adds a `TCPMSS' target, which allows you to alter the
+++ /dev/null
---- /dev/null
-+++ b/include/linux/netfilter/nf_conntrack_rtsp.h
-@@ -0,0 +1,63 @@
-+/*
-+ * RTSP extension for IP connection tracking.
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_conntrack_irc.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.
-+ */
-+#ifndef _IP_CONNTRACK_RTSP_H
-+#define _IP_CONNTRACK_RTSP_H
-+
-+//#define IP_NF_RTSP_DEBUG 1
-+#define IP_NF_RTSP_VERSION "0.6.21"
-+
-+#ifdef __KERNEL__
-+/* port block types */
-+typedef enum {
-+ pb_single, /* client_port=x */
-+ pb_range, /* client_port=x-y */
-+ pb_discon /* client_port=x/y (rtspbis) */
-+} portblock_t;
-+
-+/* We record seq number and length of rtsp headers here, all in host order. */
-+
-+/*
-+ * This structure is per expected connection. It is a member of struct
-+ * ip_conntrack_expect. The TCP SEQ for the conntrack expect is stored
-+ * there and we are expected to only store the length of the data which
-+ * needs replaced. If a packet contains multiple RTSP messages, we create
-+ * one expected connection per message.
-+ *
-+ * We use these variables to mark the entire header block. This may seem
-+ * like overkill, but the nature of RTSP requires it. A header may appear
-+ * multiple times in a message. We must treat two Transport headers the
-+ * same as one Transport header with two entries.
-+ */
-+struct ip_ct_rtsp_expect
-+{
-+ u_int32_t len; /* length of header block */
-+ portblock_t pbtype; /* Type of port block that was requested */
-+ u_int16_t loport; /* Port that was requested, low or first */
-+ u_int16_t hiport; /* Port that was requested, high or second */
-+#if 0
-+ uint method; /* RTSP method */
-+ uint cseq; /* CSeq from request */
-+#endif
-+};
-+
-+extern unsigned int (*nf_nat_rtsp_hook)(struct sk_buff *skb,
-+ enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen,
-+ struct ip_ct_rtsp_expect *prtspexp,
-+ struct nf_conntrack_expect *exp);
-+
-+extern void (*nf_nat_rtsp_hook_expectfn)(struct nf_conn *ct, struct nf_conntrack_expect *exp);
-+
-+#define RTSP_PORT 554
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _IP_CONNTRACK_RTSP_H */
---- /dev/null
-+++ b/include/linux/netfilter_helpers.h
-@@ -0,0 +1,133 @@
-+/*
-+ * Helpers for netfiler modules. This file provides implementations for basic
-+ * functions such as strncasecmp(), etc.
-+ *
-+ * gcc will warn for defined but unused functions, so we only include the
-+ * functions requested. The following macros are used:
-+ * NF_NEED_STRNCASECMP nf_strncasecmp()
-+ * NF_NEED_STRTOU16 nf_strtou16()
-+ * NF_NEED_STRTOU32 nf_strtou32()
-+ */
-+#ifndef _NETFILTER_HELPERS_H
-+#define _NETFILTER_HELPERS_H
-+
-+/* Only include these functions for kernel code. */
-+#ifdef __KERNEL__
-+
-+#include <linux/ctype.h>
-+#define iseol(c) ( (c) == '\r' || (c) == '\n' )
-+
-+/*
-+ * The standard strncasecmp()
-+ */
-+#ifdef NF_NEED_STRNCASECMP
-+static int
-+nf_strncasecmp(const char* s1, const char* s2, u_int32_t len)
-+{
-+ if (s1 == NULL || s2 == NULL)
-+ {
-+ if (s1 == NULL && s2 == NULL)
-+ {
-+ return 0;
-+ }
-+ return (s1 == NULL) ? -1 : 1;
-+ }
-+ while (len > 0 && tolower(*s1) == tolower(*s2))
-+ {
-+ len--;
-+ s1++;
-+ s2++;
-+ }
-+ return ( (len == 0) ? 0 : (tolower(*s1) - tolower(*s2)) );
-+}
-+#endif /* NF_NEED_STRNCASECMP */
-+
-+/*
-+ * Parse a string containing a 16-bit unsigned integer.
-+ * Returns the number of chars used, or zero if no number is found.
-+ */
-+#ifdef NF_NEED_STRTOU16
-+static int
-+nf_strtou16(const char* pbuf, u_int16_t* pval)
-+{
-+ int n = 0;
-+
-+ *pval = 0;
-+ while (isdigit(pbuf[n]))
-+ {
-+ *pval = (*pval * 10) + (pbuf[n] - '0');
-+ n++;
-+ }
-+
-+ return n;
-+}
-+#endif /* NF_NEED_STRTOU16 */
-+
-+/*
-+ * Parse a string containing a 32-bit unsigned integer.
-+ * Returns the number of chars used, or zero if no number is found.
-+ */
-+#ifdef NF_NEED_STRTOU32
-+static int
-+nf_strtou32(const char* pbuf, u_int32_t* pval)
-+{
-+ int n = 0;
-+
-+ *pval = 0;
-+ while (pbuf[n] >= '0' && pbuf[n] <= '9')
-+ {
-+ *pval = (*pval * 10) + (pbuf[n] - '0');
-+ n++;
-+ }
-+
-+ return n;
-+}
-+#endif /* NF_NEED_STRTOU32 */
-+
-+/*
-+ * Given a buffer and length, advance to the next line and mark the current
-+ * line.
-+ */
-+#ifdef NF_NEED_NEXTLINE
-+static int
-+nf_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
-+{
-+ uint off = *poff;
-+ uint physlen = 0;
-+
-+ if (off >= len)
-+ {
-+ return 0;
-+ }
-+
-+ while (p[off] != '\n')
-+ {
-+ if (len-off <= 1)
-+ {
-+ return 0;
-+ }
-+
-+ physlen++;
-+ off++;
-+ }
-+
-+ /* if we saw a crlf, physlen needs adjusted */
-+ if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
-+ {
-+ physlen--;
-+ }
-+
-+ /* advance past the newline */
-+ off++;
-+
-+ *plineoff = *poff;
-+ *plinelen = physlen;
-+ *poff = off;
-+
-+ return 1;
-+}
-+#endif /* NF_NEED_NEXTLINE */
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NETFILTER_HELPERS_H */
---- /dev/null
-+++ b/include/linux/netfilter_mime.h
-@@ -0,0 +1,89 @@
-+/*
-+ * MIME functions for netfilter modules. This file provides implementations
-+ * for basic MIME parsing. MIME headers are used in many protocols, such as
-+ * HTTP, RTSP, SIP, etc.
-+ *
-+ * gcc will warn for defined but unused functions, so we only include the
-+ * functions requested. The following macros are used:
-+ * NF_NEED_MIME_NEXTLINE nf_mime_nextline()
-+ */
-+#ifndef _NETFILTER_MIME_H
-+#define _NETFILTER_MIME_H
-+
-+/* Only include these functions for kernel code. */
-+#ifdef __KERNEL__
-+
-+#include <linux/ctype.h>
-+
-+/*
-+ * Given a buffer and length, advance to the next line and mark the current
-+ * line. If the current line is empty, *plinelen will be set to zero. If
-+ * not, it will be set to the actual line length (including CRLF).
-+ *
-+ * 'line' in this context means logical line (includes LWS continuations).
-+ * Returns 1 on success, 0 on failure.
-+ */
-+#ifdef NF_NEED_MIME_NEXTLINE
-+static int
-+nf_mime_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
-+{
-+ uint off = *poff;
-+ uint physlen = 0;
-+ int is_first_line = 1;
-+
-+ if (off >= len)
-+ {
-+ return 0;
-+ }
-+
-+ do
-+ {
-+ while (p[off] != '\n')
-+ {
-+ if (len-off <= 1)
-+ {
-+ return 0;
-+ }
-+
-+ physlen++;
-+ off++;
-+ }
-+
-+ /* if we saw a crlf, physlen needs adjusted */
-+ if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
-+ {
-+ physlen--;
-+ }
-+
-+ /* advance past the newline */
-+ off++;
-+
-+ /* check for an empty line */
-+ if (physlen == 0)
-+ {
-+ break;
-+ }
-+
-+ /* check for colon on the first physical line */
-+ if (is_first_line)
-+ {
-+ is_first_line = 0;
-+ if (memchr(p+(*poff), ':', physlen) == NULL)
-+ {
-+ return 0;
-+ }
-+ }
-+ }
-+ while (p[off] == ' ' || p[off] == '\t');
-+
-+ *plineoff = *poff;
-+ *plinelen = (physlen == 0) ? 0 : (off - *poff);
-+ *poff = off;
-+
-+ return 1;
-+}
-+#endif /* NF_NEED_MIME_NEXTLINE */
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NETFILTER_MIME_H */
---- a/net/ipv4/netfilter/Makefile
-+++ b/net/ipv4/netfilter/Makefile
-@@ -26,6 +26,7 @@ obj-$(CONFIG_NF_NAT_AMANDA) += nf_nat_am
- obj-$(CONFIG_NF_NAT_FTP) += nf_nat_ftp.o
- obj-$(CONFIG_NF_NAT_H323) += nf_nat_h323.o
- obj-$(CONFIG_NF_NAT_IRC) += nf_nat_irc.o
-+obj-$(CONFIG_NF_NAT_RTSP) += nf_nat_rtsp.o
- obj-$(CONFIG_NF_NAT_PPTP) += nf_nat_pptp.o
- obj-$(CONFIG_NF_NAT_SIP) += nf_nat_sip.o
- obj-$(CONFIG_NF_NAT_SNMP_BASIC) += nf_nat_snmp_basic.o
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -267,6 +267,16 @@ config NF_CONNTRACK_TFTP
-
- To compile it as a module, choose M here. If unsure, say N.
-
-+config NF_CONNTRACK_RTSP
-+ tristate "RTSP protocol support"
-+ depends on NF_CONNTRACK
-+ help
-+ Support the RTSP protocol. This allows UDP transports to be setup
-+ properly, including RTP and RDT.
-+
-+ If you want to compile it as a module, say 'M' here and read
-+ Documentation/modules.txt. If unsure, say 'Y'.
-+
- config NF_CT_NETLINK
- tristate 'Connection tracking netlink interface'
- select NETFILTER_NETLINK
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -33,6 +33,7 @@ obj-$(CONFIG_NF_CONNTRACK_PPTP) += nf_co
- obj-$(CONFIG_NF_CONNTRACK_SANE) += nf_conntrack_sane.o
- obj-$(CONFIG_NF_CONNTRACK_SIP) += nf_conntrack_sip.o
- obj-$(CONFIG_NF_CONNTRACK_TFTP) += nf_conntrack_tftp.o
-+obj-$(CONFIG_NF_CONNTRACK_RTSP) += nf_conntrack_rtsp.o
-
- # transparent proxy support
- obj-$(CONFIG_NETFILTER_TPROXY) += nf_tproxy_core.o
---- a/net/ipv4/netfilter/Kconfig
-+++ b/net/ipv4/netfilter/Kconfig
-@@ -257,6 +257,11 @@ config NF_NAT_IRC
- depends on NF_CONNTRACK && NF_NAT
- default NF_NAT && NF_CONNTRACK_IRC
-
-+config NF_NAT_RTSP
-+ tristate
-+ depends on IP_NF_IPTABLES && NF_CONNTRACK && NF_NAT
-+ default NF_NAT && NF_CONNTRACK_RTSP
-+
- config NF_NAT_TFTP
- tristate
- depends on NF_CONNTRACK && NF_NAT
---- /dev/null
-+++ b/net/netfilter/nf_conntrack_rtsp.c
-@@ -0,0 +1,517 @@
-+/*
-+ * RTSP extension for IP connection tracking
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_conntrack_irc.c
-+ *
-+ * 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.
-+ *
-+ * Module load syntax:
-+ * insmod nf_conntrack_rtsp.o ports=port1,port2,...port<MAX_PORTS>
-+ * max_outstanding=n setup_timeout=secs
-+ *
-+ * If no ports are specified, the default will be port 554.
-+ *
-+ * With max_outstanding you can define the maximum number of not yet
-+ * answered SETUP requests per RTSP session (default 8).
-+ * With setup_timeout you can specify how long the system waits for
-+ * an expected data channel (default 300 seconds).
-+ *
-+ * 2005-02-13: Harald Welte <laforge at netfilter.org>
-+ * - port to 2.6
-+ * - update to recent post-2.6.11 api changes
-+ * 2006-09-14: Steven Van Acker <deepstar at singularity.be>
-+ * - removed calls to NAT code from conntrack helper: NAT no longer needed to use rtsp-conntrack
-+ * 2007-04-18: Michael Guntsche <mike at it-loops.com>
-+ * - Port to new NF API
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/netfilter.h>
-+#include <linux/ip.h>
-+#include <linux/inet.h>
-+#include <net/tcp.h>
-+
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_expect.h>
-+#include <net/netfilter/nf_conntrack_helper.h>
-+#include <linux/netfilter/nf_conntrack_rtsp.h>
-+
-+#define NF_NEED_STRNCASECMP
-+#define NF_NEED_STRTOU16
-+#define NF_NEED_STRTOU32
-+#define NF_NEED_NEXTLINE
-+#include <linux/netfilter_helpers.h>
-+#define NF_NEED_MIME_NEXTLINE
-+#include <linux/netfilter_mime.h>
-+
-+#include <linux/ctype.h>
-+#define MAX_SIMUL_SETUP 8 /* XXX: use max_outstanding */
-+#define INFOP(fmt, args...) printk(KERN_INFO "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#if 0
-+#define DEBUGP(fmt, args...) printk(KERN_DEBUG "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#else
-+#define DEBUGP(fmt, args...)
-+#endif
-+
-+#define MAX_PORTS 8
-+static int ports[MAX_PORTS];
-+static int num_ports = 0;
-+static int max_outstanding = 8;
-+static unsigned int setup_timeout = 300;
-+
-+MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
-+MODULE_DESCRIPTION("RTSP connection tracking module");
-+MODULE_LICENSE("GPL");
-+module_param_array(ports, int, &num_ports, 0400);
-+MODULE_PARM_DESC(ports, "port numbers of RTSP servers");
-+module_param(max_outstanding, int, 0400);
-+MODULE_PARM_DESC(max_outstanding, "max number of outstanding SETUP requests per RTSP session");
-+module_param(setup_timeout, int, 0400);
-+MODULE_PARM_DESC(setup_timeout, "timeout on for unestablished data channels");
-+
-+static char *rtsp_buffer;
-+static DEFINE_SPINLOCK(rtsp_buffer_lock);
-+
-+unsigned int (*nf_nat_rtsp_hook)(struct sk_buff *skb,
-+ enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen,struct ip_ct_rtsp_expect* prtspexp,
-+ struct nf_conntrack_expect *exp);
-+void (*nf_nat_rtsp_hook_expectfn)(struct nf_conn *ct, struct nf_conntrack_expect *exp);
-+
-+EXPORT_SYMBOL_GPL(nf_nat_rtsp_hook);
-+
-+/*
-+ * Max mappings we will allow for one RTSP connection (for RTP, the number
-+ * of allocated ports is twice this value). Note that SMIL burns a lot of
-+ * ports so keep this reasonably high. If this is too low, you will see a
-+ * lot of "no free client map entries" messages.
-+ */
-+#define MAX_PORT_MAPS 16
-+
-+/*** default port list was here in the masq code: 554, 3030, 4040 ***/
-+
-+#define SKIP_WSPACE(ptr,len,off) while(off < len && isspace(*(ptr+off))) { off++; }
-+
-+/*
-+ * Parse an RTSP packet.
-+ *
-+ * Returns zero if parsing failed.
-+ *
-+ * Parameters:
-+ * IN ptcp tcp data pointer
-+ * IN tcplen tcp data len
-+ * IN/OUT ptcpoff points to current tcp offset
-+ * OUT phdrsoff set to offset of rtsp headers
-+ * OUT phdrslen set to length of rtsp headers
-+ * OUT pcseqoff set to offset of CSeq header
-+ * OUT pcseqlen set to length of CSeq header
-+ */
-+static int
-+rtsp_parse_message(char* ptcp, uint tcplen, uint* ptcpoff,
-+ uint* phdrsoff, uint* phdrslen,
-+ uint* pcseqoff, uint* pcseqlen,
-+ uint* transoff, uint* translen)
-+{
-+ uint entitylen = 0;
-+ uint lineoff;
-+ uint linelen;
-+
-+ if (!nf_nextline(ptcp, tcplen, ptcpoff, &lineoff, &linelen))
-+ return 0;
-+
-+ *phdrsoff = *ptcpoff;
-+ while (nf_mime_nextline(ptcp, tcplen, ptcpoff, &lineoff, &linelen)) {
-+ if (linelen == 0) {
-+ if (entitylen > 0)
-+ *ptcpoff += min(entitylen, tcplen - *ptcpoff);
-+ break;
-+ }
-+ if (lineoff+linelen > tcplen) {
-+ INFOP("!! overrun !!\n");
-+ break;
-+ }
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "CSeq:", 5) == 0) {
-+ *pcseqoff = lineoff;
-+ *pcseqlen = linelen;
-+ }
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0) {
-+ *transoff = lineoff;
-+ *translen = linelen;
-+ }
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "Content-Length:", 15) == 0) {
-+ uint off = lineoff+15;
-+ SKIP_WSPACE(ptcp+lineoff, linelen, off);
-+ nf_strtou32(ptcp+off, &entitylen);
-+ }
-+ }
-+ *phdrslen = (*ptcpoff) - (*phdrsoff);
-+
-+ return 1;
-+}
-+
-+/*
-+ * Find lo/hi client ports (if any) in transport header
-+ * In:
-+ * ptcp, tcplen = packet
-+ * tranoff, tranlen = buffer to search
-+ *
-+ * Out:
-+ * pport_lo, pport_hi = lo/hi ports (host endian)
-+ *
-+ * Returns nonzero if any client ports found
-+ *
-+ * Note: it is valid (and expected) for the client to request multiple
-+ * transports, so we need to parse the entire line.
-+ */
-+static int
-+rtsp_parse_transport(char* ptran, uint tranlen,
-+ struct ip_ct_rtsp_expect* prtspexp)
-+{
-+ int rc = 0;
-+ uint off = 0;
-+
-+ if (tranlen < 10 || !iseol(ptran[tranlen-1]) ||
-+ nf_strncasecmp(ptran, "Transport:", 10) != 0) {
-+ INFOP("sanity check failed\n");
-+ return 0;
-+ }
-+
-+ DEBUGP("tran='%.*s'\n", (int)tranlen, ptran);
-+ off += 10;
-+ SKIP_WSPACE(ptran, tranlen, off);
-+
-+ /* Transport: tran;field;field=val,tran;field;field=val,... */
-+ while (off < tranlen) {
-+ const char* pparamend;
-+ uint nextparamoff;
-+
-+ pparamend = memchr(ptran+off, ',', tranlen-off);
-+ pparamend = (pparamend == NULL) ? ptran+tranlen : pparamend+1;
-+ nextparamoff = pparamend-ptran;
-+
-+ while (off < nextparamoff) {
-+ const char* pfieldend;
-+ uint nextfieldoff;
-+
-+ pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+ nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+ if (strncmp(ptran+off, "client_port=", 12) == 0) {
-+ u_int16_t port;
-+ uint numlen;
-+
-+ off += 12;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ if (prtspexp->loport != 0 && prtspexp->loport != port)
-+ DEBUGP("multiple ports found, port %hu ignored\n", port);
-+ else {
-+ DEBUGP("lo port found : %hu\n", port);
-+ prtspexp->loport = prtspexp->hiport = port;
-+ if (ptran[off] == '-') {
-+ off++;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ prtspexp->pbtype = pb_range;
-+ prtspexp->hiport = port;
-+
-+ // If we have a range, assume rtp:
-+ // loport must be even, hiport must be loport+1
-+ if ((prtspexp->loport & 0x0001) != 0 ||
-+ prtspexp->hiport != prtspexp->loport+1) {
-+ DEBUGP("incorrect range: %hu-%hu, correcting\n",
-+ prtspexp->loport, prtspexp->hiport);
-+ prtspexp->loport &= 0xfffe;
-+ prtspexp->hiport = prtspexp->loport+1;
-+ }
-+ } else if (ptran[off] == '/') {
-+ off++;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ prtspexp->pbtype = pb_discon;
-+ prtspexp->hiport = port;
-+ }
-+ rc = 1;
-+ }
-+ }
-+
-+ /*
-+ * Note we don't look for the destination parameter here.
-+ * If we are using NAT, the NAT module will handle it. If not,
-+ * and the client is sending packets elsewhere, the expectation
-+ * will quietly time out.
-+ */
-+
-+ off = nextfieldoff;
-+ }
-+
-+ off = nextparamoff;
-+ }
-+
-+ return rc;
-+}
-+
-+void expected(struct nf_conn *ct, struct nf_conntrack_expect *exp)
-+{
-+ if(nf_nat_rtsp_hook_expectfn) {
-+ nf_nat_rtsp_hook_expectfn(ct,exp);
-+ }
-+}
-+
-+/*** conntrack functions ***/
-+
-+/* outbound packet: client->server */
-+
-+static inline int
-+help_out(struct sk_buff *skb, unsigned char *rb_ptr, unsigned int datalen,
-+ struct nf_conn *ct, enum ip_conntrack_info ctinfo)
-+{
-+ struct ip_ct_rtsp_expect expinfo;
-+
-+ int dir = CTINFO2DIR(ctinfo); /* = IP_CT_DIR_ORIGINAL */
-+ //struct tcphdr* tcph = (void*)iph + iph->ihl * 4;
-+ //uint tcplen = pktlen - iph->ihl * 4;
-+ char* pdata = rb_ptr;
-+ //uint datalen = tcplen - tcph->doff * 4;
-+ uint dataoff = 0;
-+ int ret = NF_ACCEPT;
-+
-+ struct nf_conntrack_expect *exp;
-+
-+ __be16 be_loport;
-+
-+ memset(&expinfo, 0, sizeof(expinfo));
-+
-+ while (dataoff < datalen) {
-+ uint cmdoff = dataoff;
-+ uint hdrsoff = 0;
-+ uint hdrslen = 0;
-+ uint cseqoff = 0;
-+ uint cseqlen = 0;
-+ uint transoff = 0;
-+ uint translen = 0;
-+ uint off;
-+
-+ if (!rtsp_parse_message(pdata, datalen, &dataoff,
-+ &hdrsoff, &hdrslen,
-+ &cseqoff, &cseqlen,
-+ &transoff, &translen))
-+ break; /* not a valid message */
-+
-+ if (strncmp(pdata+cmdoff, "SETUP ", 6) != 0)
-+ continue; /* not a SETUP message */
-+ DEBUGP("found a setup message\n");
-+
-+ off = 0;
-+ if(translen) {
-+ rtsp_parse_transport(pdata+transoff, translen, &expinfo);
-+ }
-+
-+ if (expinfo.loport == 0) {
-+ DEBUGP("no udp transports found\n");
-+ continue; /* no udp transports found */
-+ }
-+
-+ DEBUGP("udp transport found, ports=(%d,%hu,%hu)\n",
-+ (int)expinfo.pbtype, expinfo.loport, expinfo.hiport);
-+
-+ exp = nf_ct_expect_alloc(ct);
-+ if (!exp) {
-+ ret = NF_DROP;
-+ goto out;
-+ }
-+
-+ be_loport = htons(expinfo.loport);
-+
-+ nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
-+ ct->tuplehash[!dir].tuple.src.l3num,
-+ &ct->tuplehash[!dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3,
-+ IPPROTO_UDP, NULL, &be_loport);
-+
-+ exp->master = ct;
-+
-+ exp->expectfn = expected;
-+ exp->flags = 0;
-+
-+ if (expinfo.pbtype == pb_range) {
-+ DEBUGP("Changing expectation mask to handle multiple ports\n");
-+ exp->mask.src.u.udp.port = 0xfffe;
-+ }
-+
-+ DEBUGP("expect_related %u.%u.%u.%u:%u-%u.%u.%u.%u:%u\n",
-+ NIPQUAD(exp->tuple.src.u3.ip),
-+ ntohs(exp->tuple.src.u.udp.port),
-+ NIPQUAD(exp->tuple.dst.u3.ip),
-+ ntohs(exp->tuple.dst.u.udp.port));
-+
-+ if (nf_nat_rtsp_hook)
-+ /* pass the request off to the nat helper */
-+ ret = nf_nat_rtsp_hook(skb, ctinfo, hdrsoff, hdrslen, &expinfo, exp);
-+ else if (nf_ct_expect_related(exp) != 0) {
-+ INFOP("nf_ct_expect_related failed\n");
-+ ret = NF_DROP;
-+ }
-+ nf_ct_expect_put(exp);
-+ goto out;
-+ }
-+out:
-+
-+ return ret;
-+}
-+
-+
-+static inline int
-+help_in(struct sk_buff *skb, size_t pktlen,
-+ struct nf_conn* ct, enum ip_conntrack_info ctinfo)
-+{
-+ return NF_ACCEPT;
-+}
-+
-+static int help(struct sk_buff *skb, unsigned int protoff,
-+ struct nf_conn *ct, enum ip_conntrack_info ctinfo)
-+{
-+ struct tcphdr _tcph, *th;
-+ unsigned int dataoff, datalen;
-+ char *rb_ptr;
-+ int ret = NF_DROP;
-+
-+ /* Until there's been traffic both ways, don't look in packets. */
-+ if (ctinfo != IP_CT_ESTABLISHED &&
-+ ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) {
-+ DEBUGP("conntrackinfo = %u\n", ctinfo);
-+ return NF_ACCEPT;
-+ }
-+
-+ /* Not whole TCP header? */
-+ th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph);
-+
-+ if (!th)
-+ return NF_ACCEPT;
-+
-+ /* No data ? */
-+ dataoff = protoff + th->doff*4;
-+ datalen = skb->len - dataoff;
-+ if (dataoff >= skb->len)
-+ return NF_ACCEPT;
-+
-+ spin_lock_bh(&rtsp_buffer_lock);
-+ rb_ptr = skb_header_pointer(skb, dataoff,
-+ skb->len - dataoff, rtsp_buffer);
-+ BUG_ON(rb_ptr == NULL);
-+
-+#if 0
-+ /* Checksum invalid? Ignore. */
-+ /* FIXME: Source route IP option packets --RR */
-+ if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr,
-+ csum_partial((char*)tcph, tcplen, 0)))
-+ {
-+ DEBUGP("bad csum: %p %u %u.%u.%u.%u %u.%u.%u.%u\n",
-+ tcph, tcplen, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr));
-+ return NF_ACCEPT;
-+ }
-+#endif
-+
-+ switch (CTINFO2DIR(ctinfo)) {
-+ case IP_CT_DIR_ORIGINAL:
-+ ret = help_out(skb, rb_ptr, datalen, ct, ctinfo);
-+ break;
-+ case IP_CT_DIR_REPLY:
-+ DEBUGP("IP_CT_DIR_REPLY\n");
-+ /* inbound packet: server->client */
-+ ret = NF_ACCEPT;
-+ break;
-+ }
-+
-+ spin_unlock_bh(&rtsp_buffer_lock);
-+
-+ return ret;
-+}
-+
-+static struct nf_conntrack_helper rtsp_helpers[MAX_PORTS];
-+static char rtsp_names[MAX_PORTS][10];
-+static struct nf_conntrack_expect_policy rtsp_expect_policy;
-+
-+/* This function is intentionally _NOT_ defined as __exit */
-+static void
-+fini(void)
-+{
-+ int i;
-+ for (i = 0; i < num_ports; i++) {
-+ DEBUGP("unregistering port %d\n", ports[i]);
-+ nf_conntrack_helper_unregister(&rtsp_helpers[i]);
-+ }
-+ kfree(rtsp_buffer);
-+}
-+
-+static int __init
-+init(void)
-+{
-+ int i, ret;
-+ struct nf_conntrack_helper *hlpr;
-+ char *tmpname;
-+
-+ printk("nf_conntrack_rtsp v" IP_NF_RTSP_VERSION " loading\n");
-+
-+ if (max_outstanding < 1) {
-+ printk("nf_conntrack_rtsp: max_outstanding must be a positive integer\n");
-+ return -EBUSY;
-+ }
-+ if (setup_timeout < 0) {
-+ printk("nf_conntrack_rtsp: setup_timeout must be a positive integer\n");
-+ return -EBUSY;
-+ }
-+
-+ rtsp_expect_policy.max_expected = max_outstanding;
-+ rtsp_expect_policy.timeout = setup_timeout;
-+
-+ rtsp_buffer = kmalloc(65536, GFP_KERNEL);
-+ if (!rtsp_buffer)
-+ return -ENOMEM;
-+
-+ /* If no port given, default to standard rtsp port */
-+ if (ports[0] == 0) {
-+ ports[0] = RTSP_PORT;
-+ }
-+
-+ for (i = 0; (i < MAX_PORTS) && ports[i]; i++) {
-+ hlpr = &rtsp_helpers[i];
-+ memset(hlpr, 0, sizeof(struct nf_conntrack_helper));
-+ hlpr->tuple.src.u.tcp.port = htons(ports[i]);
-+ hlpr->tuple.dst.protonum = IPPROTO_TCP;
-+ hlpr->expect_policy = &rtsp_expect_policy;
-+ hlpr->me = THIS_MODULE;
-+ hlpr->help = help;
-+
-+ tmpname = &rtsp_names[i][0];
-+ if (ports[i] == RTSP_PORT) {
-+ sprintf(tmpname, "rtsp");
-+ } else {
-+ sprintf(tmpname, "rtsp-%d", i);
-+ }
-+ hlpr->name = tmpname;
-+
-+ DEBUGP("port #%d: %d\n", i, ports[i]);
-+
-+ ret = nf_conntrack_helper_register(hlpr);
-+
-+ if (ret) {
-+ printk("nf_conntrack_rtsp: ERROR registering port %d\n", ports[i]);
-+ fini();
-+ return -EBUSY;
-+ }
-+ num_ports++;
-+ }
-+ return 0;
-+}
-+
-+module_init(init);
-+module_exit(fini);
-+
-+EXPORT_SYMBOL(nf_nat_rtsp_hook_expectfn);
-+
---- /dev/null
-+++ b/net/ipv4/netfilter/nf_nat_rtsp.c
-@@ -0,0 +1,496 @@
-+/*
-+ * RTSP extension for TCP NAT alteration
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_nat_irc.c
-+ *
-+ * 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.
-+ *
-+ * Module load syntax:
-+ * insmod nf_nat_rtsp.o ports=port1,port2,...port<MAX_PORTS>
-+ * stunaddr=<address>
-+ * destaction=[auto|strip|none]
-+ *
-+ * If no ports are specified, the default will be port 554 only.
-+ *
-+ * stunaddr specifies the address used to detect that a client is using STUN.
-+ * If this address is seen in the destination parameter, it is assumed that
-+ * the client has already punched a UDP hole in the firewall, so we don't
-+ * mangle the client_port. If none is specified, it is autodetected. It
-+ * only needs to be set if you have multiple levels of NAT. It should be
-+ * set to the external address that the STUN clients detect. Note that in
-+ * this case, it will not be possible for clients to use UDP with servers
-+ * between the NATs.
-+ *
-+ * If no destaction is specified, auto is used.
-+ * destaction=auto: strip destination parameter if it is not stunaddr.
-+ * destaction=strip: always strip destination parameter (not recommended).
-+ * destaction=none: do not touch destination parameter (not recommended).
-+ */
-+
-+#include <linux/module.h>
-+#include <net/tcp.h>
-+#include <net/netfilter/nf_nat_helper.h>
-+#include <net/netfilter/nf_nat_rule.h>
-+#include <linux/netfilter/nf_conntrack_rtsp.h>
-+#include <net/netfilter/nf_conntrack_expect.h>
-+
-+#include <linux/inet.h>
-+#include <linux/ctype.h>
-+#define NF_NEED_STRNCASECMP
-+#define NF_NEED_STRTOU16
-+#include <linux/netfilter_helpers.h>
-+#define NF_NEED_MIME_NEXTLINE
-+#include <linux/netfilter_mime.h>
-+
-+#define INFOP(fmt, args...) printk(KERN_INFO "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#if 0
-+#define DEBUGP(fmt, args...) printk(KERN_DEBUG "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#else
-+#define DEBUGP(fmt, args...)
-+#endif
-+
-+#define MAX_PORTS 8
-+#define DSTACT_AUTO 0
-+#define DSTACT_STRIP 1
-+#define DSTACT_NONE 2
-+
-+static char* stunaddr = NULL;
-+static char* destaction = NULL;
-+
-+static u_int32_t extip = 0;
-+static int dstact = 0;
-+
-+MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
-+MODULE_DESCRIPTION("RTSP network address translation module");
-+MODULE_LICENSE("GPL");
-+module_param(stunaddr, charp, 0644);
-+MODULE_PARM_DESC(stunaddr, "Address for detecting STUN");
-+module_param(destaction, charp, 0644);
-+MODULE_PARM_DESC(destaction, "Action for destination parameter (auto/strip/none)");
-+
-+#define SKIP_WSPACE(ptr,len,off) while(off < len && isspace(*(ptr+off))) { off++; }
-+
-+/*** helper functions ***/
-+
-+static void
-+get_skb_tcpdata(struct sk_buff* skb, char** pptcpdata, uint* ptcpdatalen)
-+{
-+ struct iphdr* iph = ip_hdr(skb);
-+ struct tcphdr* tcph = (void *)iph + ip_hdrlen(skb);
-+
-+ *pptcpdata = (char*)tcph + tcph->doff*4;
-+ *ptcpdatalen = ((char*)skb_transport_header(skb) + skb->len) - *pptcpdata;
-+}
-+
-+/*** nat functions ***/
-+
-+/*
-+ * Mangle the "Transport:" header:
-+ * - Replace all occurences of "client_port=<spec>"
-+ * - Handle destination parameter
-+ *
-+ * In:
-+ * ct, ctinfo = conntrack context
-+ * skb = packet
-+ * tranoff = Transport header offset from TCP data
-+ * tranlen = Transport header length (incl. CRLF)
-+ * rport_lo = replacement low port (host endian)
-+ * rport_hi = replacement high port (host endian)
-+ *
-+ * Returns packet size difference.
-+ *
-+ * Assumes that a complete transport header is present, ending with CR or LF
-+ */
-+static int
-+rtsp_mangle_tran(enum ip_conntrack_info ctinfo,
-+ struct nf_conntrack_expect* exp,
-+ struct ip_ct_rtsp_expect* prtspexp,
-+ struct sk_buff* skb, uint tranoff, uint tranlen)
-+{
-+ char* ptcp;
-+ uint tcplen;
-+ char* ptran;
-+ char rbuf1[16]; /* Replacement buffer (one port) */
-+ uint rbuf1len; /* Replacement len (one port) */
-+ char rbufa[16]; /* Replacement buffer (all ports) */
-+ uint rbufalen; /* Replacement len (all ports) */
-+ u_int32_t newip;
-+ u_int16_t loport, hiport;
-+ uint off = 0;
-+ uint diff; /* Number of bytes we removed */
-+
-+ struct nf_conn *ct = exp->master;
-+ struct nf_conntrack_tuple *t;
-+
-+ char szextaddr[15+1];
-+ uint extaddrlen;
-+ int is_stun;
-+
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ ptran = ptcp+tranoff;
-+
-+ if (tranoff+tranlen > tcplen || tcplen-tranoff < tranlen ||
-+ tranlen < 10 || !iseol(ptran[tranlen-1]) ||
-+ nf_strncasecmp(ptran, "Transport:", 10) != 0)
-+ {
-+ INFOP("sanity check failed\n");
-+ return 0;
-+ }
-+ off += 10;
-+ SKIP_WSPACE(ptcp+tranoff, tranlen, off);
-+
-+ newip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip;
-+ t = &exp->tuple;
-+ t->dst.u3.ip = newip;
-+
-+ extaddrlen = extip ? sprintf(szextaddr, "%u.%u.%u.%u", NIPQUAD(extip))
-+ : sprintf(szextaddr, "%u.%u.%u.%u", NIPQUAD(newip));
-+ DEBUGP("stunaddr=%s (%s)\n", szextaddr, (extip?"forced":"auto"));
-+
-+ rbuf1len = rbufalen = 0;
-+ switch (prtspexp->pbtype)
-+ {
-+ case pb_single:
-+ for (loport = prtspexp->loport; loport != 0; loport++) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(loport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ DEBUGP("using port %hu\n", loport);
-+ break;
-+ }
-+ }
-+ if (loport != 0)
-+ {
-+ rbuf1len = sprintf(rbuf1, "%hu", loport);
-+ rbufalen = sprintf(rbufa, "%hu", loport);
-+ }
-+ break;
-+ case pb_range:
-+ for (loport = prtspexp->loport; loport != 0; loport += 2) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(loport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ hiport = loport + ~exp->mask.src.u.udp.port;
-+ DEBUGP("using ports %hu-%hu\n", loport, hiport);
-+ break;
-+ }
-+ }
-+ if (loport != 0)
-+ {
-+ rbuf1len = sprintf(rbuf1, "%hu", loport);
-+ rbufalen = sprintf(rbufa, "%hu-%hu", loport, loport+1);
-+ }
-+ break;
-+ case pb_discon:
-+ for (loport = prtspexp->loport; loport != 0; loport++) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(loport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ DEBUGP("using port %hu (1 of 2)\n", loport);
-+ break;
-+ }
-+ }
-+ for (hiport = prtspexp->hiport; hiport != 0; hiport++) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(hiport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ DEBUGP("using port %hu (2 of 2)\n", hiport);
-+ break;
-+ }
-+ }
-+ if (loport != 0 && hiport != 0)
-+ {
-+ rbuf1len = sprintf(rbuf1, "%hu", loport);
-+ if (hiport == loport+1)
-+ {
-+ rbufalen = sprintf(rbufa, "%hu-%hu", loport, hiport);
-+ }
-+ else
-+ {
-+ rbufalen = sprintf(rbufa, "%hu/%hu", loport, hiport);
-+ }
-+ }
-+ break;
-+ }
-+
-+ if (rbuf1len == 0)
-+ {
-+ return 0; /* cannot get replacement port(s) */
-+ }
-+
-+ /* Transport: tran;field;field=val,tran;field;field=val,... */
-+ while (off < tranlen)
-+ {
-+ uint saveoff;
-+ const char* pparamend;
-+ uint nextparamoff;
-+
-+ pparamend = memchr(ptran+off, ',', tranlen-off);
-+ pparamend = (pparamend == NULL) ? ptran+tranlen : pparamend+1;
-+ nextparamoff = pparamend-ptcp;
-+
-+ /*
-+ * We pass over each param twice. On the first pass, we look for a
-+ * destination= field. It is handled by the security policy. If it
-+ * is present, allowed, and equal to our external address, we assume
-+ * that STUN is being used and we leave the client_port= field alone.
-+ */
-+ is_stun = 0;
-+ saveoff = off;
-+ while (off < nextparamoff)
-+ {
-+ const char* pfieldend;
-+ uint nextfieldoff;
-+
-+ pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+ nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+ if (dstact != DSTACT_NONE && strncmp(ptran+off, "destination=", 12) == 0)
-+ {
-+ if (strncmp(ptran+off+12, szextaddr, extaddrlen) == 0)
-+ {
-+ is_stun = 1;
-+ }
-+ if (dstact == DSTACT_STRIP || (dstact == DSTACT_AUTO && !is_stun))
-+ {
-+ diff = nextfieldoff-off;
-+ if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
-+ off, diff, NULL, 0))
-+ {
-+ /* mangle failed, all we can do is bail */
-+ nf_ct_unexpect_related(exp);
-+ return 0;
-+ }
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ ptran = ptcp+tranoff;
-+ tranlen -= diff;
-+ nextparamoff -= diff;
-+ nextfieldoff -= diff;
-+ }
-+ }
-+
-+ off = nextfieldoff;
-+ }
-+ if (is_stun)
-+ {
-+ continue;
-+ }
-+ off = saveoff;
-+ while (off < nextparamoff)
-+ {
-+ const char* pfieldend;
-+ uint nextfieldoff;
-+
-+ pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+ nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+ if (strncmp(ptran+off, "client_port=", 12) == 0)
-+ {
-+ u_int16_t port;
-+ uint numlen;
-+ uint origoff;
-+ uint origlen;
-+ char* rbuf = rbuf1;
-+ uint rbuflen = rbuf1len;
-+
-+ off += 12;
-+ origoff = (ptran-ptcp)+off;
-+ origlen = 0;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ origlen += numlen;
-+ if (port != prtspexp->loport)
-+ {
-+ DEBUGP("multiple ports found, port %hu ignored\n", port);
-+ }
-+ else
-+ {
-+ if (ptran[off] == '-' || ptran[off] == '/')
-+ {
-+ off++;
-+ origlen++;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ origlen += numlen;
-+ rbuf = rbufa;
-+ rbuflen = rbufalen;
-+ }
-+
-+ /*
-+ * note we cannot just memcpy() if the sizes are the same.
-+ * the mangle function does skb resizing, checks for a
-+ * cloned skb, and updates the checksums.
-+ *
-+ * parameter 4 below is offset from start of tcp data.
-+ */
-+ diff = origlen-rbuflen;
-+ if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
-+ origoff, origlen, rbuf, rbuflen))
-+ {
-+ /* mangle failed, all we can do is bail */
-+ nf_ct_unexpect_related(exp);
-+ return 0;
-+ }
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ ptran = ptcp+tranoff;
-+ tranlen -= diff;
-+ nextparamoff -= diff;
-+ nextfieldoff -= diff;
-+ }
-+ }
-+
-+ off = nextfieldoff;
-+ }
-+
-+ off = nextparamoff;
-+ }
-+
-+ return 1;
-+}
-+
-+static uint
-+help_out(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen, struct ip_ct_rtsp_expect* prtspexp,
-+ struct nf_conntrack_expect* exp)
-+{
-+ char* ptcp;
-+ uint tcplen;
-+ uint hdrsoff;
-+ uint hdrslen;
-+ uint lineoff;
-+ uint linelen;
-+ uint off;
-+
-+ //struct iphdr* iph = (struct iphdr*)skb->nh.iph;
-+ //struct tcphdr* tcph = (struct tcphdr*)((void*)iph + iph->ihl*4);
-+
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ hdrsoff = matchoff;//exp->seq - ntohl(tcph->seq);
-+ hdrslen = matchlen;
-+ off = hdrsoff;
-+ DEBUGP("NAT rtsp help_out\n");
-+
-+ while (nf_mime_nextline(ptcp, hdrsoff+hdrslen, &off, &lineoff, &linelen))
-+ {
-+ if (linelen == 0)
-+ {
-+ break;
-+ }
-+ if (off > hdrsoff+hdrslen)
-+ {
-+ INFOP("!! overrun !!");
-+ break;
-+ }
-+ DEBUGP("hdr: len=%u, %.*s", linelen, (int)linelen, ptcp+lineoff);
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0)
-+ {
-+ uint oldtcplen = tcplen;
-+ DEBUGP("hdr: Transport\n");
-+ if (!rtsp_mangle_tran(ctinfo, exp, prtspexp, skb, lineoff, linelen))
-+ {
-+ DEBUGP("hdr: Transport mangle failed");
-+ break;
-+ }
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ hdrslen -= (oldtcplen-tcplen);
-+ off -= (oldtcplen-tcplen);
-+ lineoff -= (oldtcplen-tcplen);
-+ linelen -= (oldtcplen-tcplen);
-+ DEBUGP("rep: len=%u, %.*s", linelen, (int)linelen, ptcp+lineoff);
-+ }
-+ }
-+
-+ return NF_ACCEPT;
-+}
-+
-+static unsigned int
-+help(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen, struct ip_ct_rtsp_expect* prtspexp,
-+ struct nf_conntrack_expect* exp)
-+{
-+ int dir = CTINFO2DIR(ctinfo);
-+ int rc = NF_ACCEPT;
-+
-+ switch (dir)
-+ {
-+ case IP_CT_DIR_ORIGINAL:
-+ rc = help_out(skb, ctinfo, matchoff, matchlen, prtspexp, exp);
-+ break;
-+ case IP_CT_DIR_REPLY:
-+ DEBUGP("unmangle ! %u\n", ctinfo);
-+ /* XXX: unmangle */
-+ rc = NF_ACCEPT;
-+ break;
-+ }
-+ //UNLOCK_BH(&ip_rtsp_lock);
-+
-+ return rc;
-+}
-+
-+static void expected(struct nf_conn* ct, struct nf_conntrack_expect *exp)
-+{
-+ struct nf_nat_multi_range_compat mr;
-+ u_int32_t newdstip, newsrcip, newip;
-+
-+ struct nf_conn *master = ct->master;
-+
-+ newdstip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+ newsrcip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+ //FIXME (how to port that ?)
-+ //code from 2.4 : newip = (HOOK2MANIP(hooknum) == IP_NAT_MANIP_SRC) ? newsrcip : newdstip;
-+ newip = newdstip;
-+
-+ DEBUGP("newsrcip=%u.%u.%u.%u, newdstip=%u.%u.%u.%u, newip=%u.%u.%u.%u\n",
-+ NIPQUAD(newsrcip), NIPQUAD(newdstip), NIPQUAD(newip));
-+
-+ mr.rangesize = 1;
-+ // We don't want to manip the per-protocol, just the IPs.
-+ mr.range[0].flags = IP_NAT_RANGE_MAP_IPS;
-+ mr.range[0].min_ip = mr.range[0].max_ip = newip;
-+
-+ nf_nat_setup_info(ct, &mr.range[0], IP_NAT_MANIP_DST);
-+}
-+
-+
-+static void __exit fini(void)
-+{
-+ nf_nat_rtsp_hook = NULL;
-+ nf_nat_rtsp_hook_expectfn = NULL;
-+ synchronize_net();
-+}
-+
-+static int __init init(void)
-+{
-+ printk("nf_nat_rtsp v" IP_NF_RTSP_VERSION " loading\n");
-+
-+ BUG_ON(nf_nat_rtsp_hook);
-+ nf_nat_rtsp_hook = help;
-+ nf_nat_rtsp_hook_expectfn = &expected;
-+
-+ if (stunaddr != NULL)
-+ extip = in_aton(stunaddr);
-+
-+ if (destaction != NULL) {
-+ if (strcmp(destaction, "auto") == 0)
-+ dstact = DSTACT_AUTO;
-+
-+ if (strcmp(destaction, "strip") == 0)
-+ dstact = DSTACT_STRIP;
-+
-+ if (strcmp(destaction, "none") == 0)
-+ dstact = DSTACT_NONE;
-+ }
-+
-+ return 0;
-+}
-+
-+module_init(init);
-+module_exit(fini);
+++ /dev/null
---- a/include/linux/pkt_sched.h
-+++ b/include/linux/pkt_sched.h
-@@ -182,8 +182,37 @@ struct tc_sfq_xstats
- *
- * The only reason for this is efficiency, it is possible
- * to change these parameters in compile time.
-+ *
-+ * If you need to play with these values, use esfq instead.
- */
-
-+/* ESFQ section */
-+
-+enum
-+{
-+ /* traditional */
-+ TCA_SFQ_HASH_CLASSIC,
-+ TCA_SFQ_HASH_DST,
-+ TCA_SFQ_HASH_SRC,
-+ TCA_SFQ_HASH_FWMARK,
-+ /* conntrack */
-+ TCA_SFQ_HASH_CTORIGDST,
-+ TCA_SFQ_HASH_CTORIGSRC,
-+ TCA_SFQ_HASH_CTREPLDST,
-+ TCA_SFQ_HASH_CTREPLSRC,
-+ TCA_SFQ_HASH_CTNATCHG,
-+};
-+
-+struct tc_esfq_qopt
-+{
-+ unsigned quantum; /* Bytes per round allocated to flow */
-+ int perturb_period; /* Period of hash perturbation */
-+ __u32 limit; /* Maximal packets in queue */
-+ unsigned divisor; /* Hash divisor */
-+ unsigned flows; /* Maximal number of flows */
-+ unsigned hash_kind; /* Hash function to use for flow identification */
-+};
-+
- /* RED section */
-
- enum
---- a/net/sched/Kconfig
-+++ b/net/sched/Kconfig
-@@ -137,6 +137,37 @@ config NET_SCH_SFQ
- To compile this code as a module, choose M here: the
- module will be called sch_sfq.
-
-+config NET_SCH_ESFQ
-+ tristate "Enhanced Stochastic Fairness Queueing (ESFQ)"
-+ ---help---
-+ Say Y here if you want to use the Enhanced Stochastic Fairness
-+ Queueing (ESFQ) packet scheduling algorithm for some of your network
-+ devices or as a leaf discipline for a classful qdisc such as HTB or
-+ CBQ (see the top of <file:net/sched/sch_esfq.c> for details and
-+ references to the SFQ algorithm).
-+
-+ This is an enchanced SFQ version which allows you to control some
-+ hardcoded values in the SFQ scheduler.
-+
-+ ESFQ also adds control of the hash function used to identify packet
-+ flows. The original SFQ discipline hashes by connection; ESFQ add
-+ several other hashing methods, such as by src IP or by dst IP, which
-+ can be more fair to users in some networking situations.
-+
-+ To compile this code as a module, choose M here: the
-+ module will be called sch_esfq.
-+
-+config NET_SCH_ESFQ_NFCT
-+ bool "Connection Tracking Hash Types"
-+ depends on NET_SCH_ESFQ && NF_CONNTRACK
-+ ---help---
-+ Say Y here to enable support for hashing based on netfilter connection
-+ tracking information. This is useful for a router that is also using
-+ NAT to connect privately-addressed hosts to the Internet. If you want
-+ to provide fair distribution of upstream bandwidth, ESFQ must use
-+ connection tracking information, since all outgoing packets will share
-+ the same source address.
-+
- config NET_SCH_TEQL
- tristate "True Link Equalizer (TEQL)"
- ---help---
---- a/net/sched/Makefile
-+++ b/net/sched/Makefile
-@@ -24,6 +24,7 @@ obj-$(CONFIG_NET_SCH_GRED) += sch_gred.o
- obj-$(CONFIG_NET_SCH_INGRESS) += sch_ingress.o
- obj-$(CONFIG_NET_SCH_DSMARK) += sch_dsmark.o
- obj-$(CONFIG_NET_SCH_SFQ) += sch_sfq.o
-+obj-$(CONFIG_NET_SCH_ESFQ) += sch_esfq.o
- obj-$(CONFIG_NET_SCH_TBF) += sch_tbf.o
- obj-$(CONFIG_NET_SCH_TEQL) += sch_teql.o
- obj-$(CONFIG_NET_SCH_PRIO) += sch_prio.o
---- /dev/null
-+++ b/net/sched/sch_esfq.c
-@@ -0,0 +1,702 @@
-+/*
-+ * net/sched/sch_esfq.c Extended Stochastic Fairness Queueing discipline.
-+ *
-+ * 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.
-+ *
-+ * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
-+ *
-+ * Changes: Alexander Atanasov, <alex@ssi.bg>
-+ * Added dynamic depth,limit,divisor,hash_kind options.
-+ * Added dst and src hashes.
-+ *
-+ * Alexander Clouter, <alex@digriz.org.uk>
-+ * Ported ESFQ to Linux 2.6.
-+ *
-+ * Corey Hickey, <bugfood-c@fatooh.org>
-+ * Maintenance of the Linux 2.6 port.
-+ * Added fwmark hash (thanks to Robert Kurjata).
-+ * Added usage of jhash.
-+ * Added conntrack support.
-+ * Added ctnatchg hash (thanks to Ben Pfountz).
-+ */
-+
-+#include <linux/module.h>
-+#include <asm/uaccess.h>
-+#include <asm/system.h>
-+#include <linux/bitops.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/jiffies.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/socket.h>
-+#include <linux/sockios.h>
-+#include <linux/in.h>
-+#include <linux/errno.h>
-+#include <linux/interrupt.h>
-+#include <linux/if_ether.h>
-+#include <linux/inet.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/notifier.h>
-+#include <linux/init.h>
-+#include <net/ip.h>
-+#include <net/netlink.h>
-+#include <linux/ipv6.h>
-+#include <net/route.h>
-+#include <linux/skbuff.h>
-+#include <net/sock.h>
-+#include <net/pkt_sched.h>
-+#include <linux/jhash.h>
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+#include <net/netfilter/nf_conntrack.h>
-+#endif
-+
-+/* Stochastic Fairness Queuing algorithm.
-+ For more comments look at sch_sfq.c.
-+ The difference is that you can change limit, depth,
-+ hash table size and choose alternate hash types.
-+
-+ classic: same as in sch_sfq.c
-+ dst: destination IP address
-+ src: source IP address
-+ fwmark: netfilter mark value
-+ ctorigdst: original destination IP address
-+ ctorigsrc: original source IP address
-+ ctrepldst: reply destination IP address
-+ ctreplsrc: reply source IP
-+
-+*/
-+
-+#define ESFQ_HEAD 0
-+#define ESFQ_TAIL 1
-+
-+/* This type should contain at least SFQ_DEPTH*2 values */
-+typedef unsigned int esfq_index;
-+
-+struct esfq_head
-+{
-+ esfq_index next;
-+ esfq_index prev;
-+};
-+
-+struct esfq_sched_data
-+{
-+/* Parameters */
-+ int perturb_period;
-+ unsigned quantum; /* Allotment per round: MUST BE >= MTU */
-+ int limit;
-+ unsigned depth;
-+ unsigned hash_divisor;
-+ unsigned hash_kind;
-+/* Variables */
-+ struct timer_list perturb_timer;
-+ int perturbation;
-+ esfq_index tail; /* Index of current slot in round */
-+ esfq_index max_depth; /* Maximal depth */
-+
-+ esfq_index *ht; /* Hash table */
-+ esfq_index *next; /* Active slots link */
-+ short *allot; /* Current allotment per slot */
-+ unsigned short *hash; /* Hash value indexed by slots */
-+ struct sk_buff_head *qs; /* Slot queue */
-+ struct esfq_head *dep; /* Linked list of slots, indexed by depth */
-+};
-+
-+/* This contains the info we will hash. */
-+struct esfq_packet_info
-+{
-+ u32 proto; /* protocol or port */
-+ u32 src; /* source from packet header */
-+ u32 dst; /* destination from packet header */
-+ u32 ctorigsrc; /* original source from conntrack */
-+ u32 ctorigdst; /* original destination from conntrack */
-+ u32 ctreplsrc; /* reply source from conntrack */
-+ u32 ctrepldst; /* reply destination from conntrack */
-+ u32 mark; /* netfilter mark (fwmark) */
-+};
-+
-+static __inline__ unsigned esfq_jhash_1word(struct esfq_sched_data *q,u32 a)
-+{
-+ return jhash_1word(a, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static __inline__ unsigned esfq_jhash_2words(struct esfq_sched_data *q, u32 a, u32 b)
-+{
-+ return jhash_2words(a, b, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static __inline__ unsigned esfq_jhash_3words(struct esfq_sched_data *q, u32 a, u32 b, u32 c)
-+{
-+ return jhash_3words(a, b, c, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static unsigned esfq_hash(struct esfq_sched_data *q, struct sk_buff *skb)
-+{
-+ struct esfq_packet_info info;
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+ enum ip_conntrack_info ctinfo;
-+ struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
-+#endif
-+
-+ switch (skb->protocol) {
-+ case __constant_htons(ETH_P_IP):
-+ {
-+ struct iphdr *iph = ip_hdr(skb);
-+ info.dst = iph->daddr;
-+ info.src = iph->saddr;
-+ if (!(iph->frag_off&htons(IP_MF|IP_OFFSET)) &&
-+ (iph->protocol == IPPROTO_TCP ||
-+ iph->protocol == IPPROTO_UDP ||
-+ iph->protocol == IPPROTO_SCTP ||
-+ iph->protocol == IPPROTO_DCCP ||
-+ iph->protocol == IPPROTO_ESP))
-+ info.proto = *(((u32*)iph) + iph->ihl);
-+ else
-+ info.proto = iph->protocol;
-+ break;
-+ }
-+ case __constant_htons(ETH_P_IPV6):
-+ {
-+ struct ipv6hdr *iph = ipv6_hdr(skb);
-+ /* Hash ipv6 addresses into a u32. This isn't ideal,
-+ * but the code is simple. */
-+ info.dst = jhash2(iph->daddr.s6_addr32, 4, q->perturbation);
-+ info.src = jhash2(iph->saddr.s6_addr32, 4, q->perturbation);
-+ if (iph->nexthdr == IPPROTO_TCP ||
-+ iph->nexthdr == IPPROTO_UDP ||
-+ iph->nexthdr == IPPROTO_SCTP ||
-+ iph->nexthdr == IPPROTO_DCCP ||
-+ iph->nexthdr == IPPROTO_ESP)
-+ info.proto = *(u32*)&iph[1];
-+ else
-+ info.proto = iph->nexthdr;
-+ break;
-+ }
-+ default:
-+ info.dst = (u32)(unsigned long)skb_dst(skb);
-+ info.src = (u32)(unsigned long)skb->sk;
-+ info.proto = skb->protocol;
-+ }
-+
-+ info.mark = skb->mark;
-+
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+ /* defaults if there is no conntrack info */
-+ info.ctorigsrc = info.src;
-+ info.ctorigdst = info.dst;
-+ info.ctreplsrc = info.dst;
-+ info.ctrepldst = info.src;
-+ /* collect conntrack info */
-+ if (ct && ct != &nf_conntrack_untracked) {
-+ if (skb->protocol == __constant_htons(ETH_P_IP)) {
-+ info.ctorigsrc = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+ info.ctorigdst = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip;
-+ info.ctreplsrc = ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip;
-+ info.ctrepldst = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip;
-+ }
-+ else if (skb->protocol == __constant_htons(ETH_P_IPV6)) {
-+ /* Again, hash ipv6 addresses into a single u32. */
-+ info.ctorigsrc = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip6, 4, q->perturbation);
-+ info.ctorigdst = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip6, 4, q->perturbation);
-+ info.ctreplsrc = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip6, 4, q->perturbation);
-+ info.ctrepldst = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip6, 4, q->perturbation);
-+ }
-+
-+ }
-+#endif
-+
-+ switch(q->hash_kind) {
-+ case TCA_SFQ_HASH_CLASSIC:
-+ return esfq_jhash_3words(q, info.dst, info.src, info.proto);
-+ case TCA_SFQ_HASH_DST:
-+ return esfq_jhash_1word(q, info.dst);
-+ case TCA_SFQ_HASH_SRC:
-+ return esfq_jhash_1word(q, info.src);
-+ case TCA_SFQ_HASH_FWMARK:
-+ return esfq_jhash_1word(q, info.mark);
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+ case TCA_SFQ_HASH_CTORIGDST:
-+ return esfq_jhash_1word(q, info.ctorigdst);
-+ case TCA_SFQ_HASH_CTORIGSRC:
-+ return esfq_jhash_1word(q, info.ctorigsrc);
-+ case TCA_SFQ_HASH_CTREPLDST:
-+ return esfq_jhash_1word(q, info.ctrepldst);
-+ case TCA_SFQ_HASH_CTREPLSRC:
-+ return esfq_jhash_1word(q, info.ctreplsrc);
-+ case TCA_SFQ_HASH_CTNATCHG:
-+ {
-+ if (info.ctorigdst == info.ctreplsrc)
-+ return esfq_jhash_1word(q, info.ctorigsrc);
-+ return esfq_jhash_1word(q, info.ctreplsrc);
-+ }
-+#endif
-+ default:
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "ESFQ: Unknown hash method. Falling back to classic.\n");
-+ }
-+ return esfq_jhash_3words(q, info.dst, info.src, info.proto);
-+}
-+
-+static inline void esfq_link(struct esfq_sched_data *q, esfq_index x)
-+{
-+ esfq_index p, n;
-+ int d = q->qs[x].qlen + q->depth;
-+
-+ p = d;
-+ n = q->dep[d].next;
-+ q->dep[x].next = n;
-+ q->dep[x].prev = p;
-+ q->dep[p].next = q->dep[n].prev = x;
-+}
-+
-+static inline void esfq_dec(struct esfq_sched_data *q, esfq_index x)
-+{
-+ esfq_index p, n;
-+
-+ n = q->dep[x].next;
-+ p = q->dep[x].prev;
-+ q->dep[p].next = n;
-+ q->dep[n].prev = p;
-+
-+ if (n == p && q->max_depth == q->qs[x].qlen + 1)
-+ q->max_depth--;
-+
-+ esfq_link(q, x);
-+}
-+
-+static inline void esfq_inc(struct esfq_sched_data *q, esfq_index x)
-+{
-+ esfq_index p, n;
-+ int d;
-+
-+ n = q->dep[x].next;
-+ p = q->dep[x].prev;
-+ q->dep[p].next = n;
-+ q->dep[n].prev = p;
-+ d = q->qs[x].qlen;
-+ if (q->max_depth < d)
-+ q->max_depth = d;
-+
-+ esfq_link(q, x);
-+}
-+
-+static unsigned int esfq_drop(struct Qdisc *sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_index d = q->max_depth;
-+ struct sk_buff *skb;
-+ unsigned int len;
-+
-+ /* Queue is full! Find the longest slot and
-+ drop a packet from it */
-+
-+ if (d > 1) {
-+ esfq_index x = q->dep[d+q->depth].next;
-+ skb = q->qs[x].prev;
-+ len = skb->len;
-+ __skb_unlink(skb, &q->qs[x]);
-+ kfree_skb(skb);
-+ esfq_dec(q, x);
-+ sch->q.qlen--;
-+ sch->qstats.drops++;
-+ sch->qstats.backlog -= len;
-+ return len;
-+ }
-+
-+ if (d == 1) {
-+ /* It is difficult to believe, but ALL THE SLOTS HAVE LENGTH 1. */
-+ d = q->next[q->tail];
-+ q->next[q->tail] = q->next[d];
-+ q->allot[q->next[d]] += q->quantum;
-+ skb = q->qs[d].prev;
-+ len = skb->len;
-+ __skb_unlink(skb, &q->qs[d]);
-+ kfree_skb(skb);
-+ esfq_dec(q, d);
-+ sch->q.qlen--;
-+ q->ht[q->hash[d]] = q->depth;
-+ sch->qstats.drops++;
-+ sch->qstats.backlog -= len;
-+ return len;
-+ }
-+
-+ return 0;
-+}
-+
-+static void esfq_q_enqueue(struct sk_buff *skb, struct esfq_sched_data *q, unsigned int end)
-+{
-+ unsigned hash = esfq_hash(q, skb);
-+ unsigned depth = q->depth;
-+ esfq_index x;
-+
-+ x = q->ht[hash];
-+ if (x == depth) {
-+ q->ht[hash] = x = q->dep[depth].next;
-+ q->hash[x] = hash;
-+ }
-+
-+ if (end == ESFQ_TAIL)
-+ __skb_queue_tail(&q->qs[x], skb);
-+ else
-+ __skb_queue_head(&q->qs[x], skb);
-+
-+ esfq_inc(q, x);
-+ if (q->qs[x].qlen == 1) { /* The flow is new */
-+ if (q->tail == depth) { /* It is the first flow */
-+ q->tail = x;
-+ q->next[x] = x;
-+ q->allot[x] = q->quantum;
-+ } else {
-+ q->next[x] = q->next[q->tail];
-+ q->next[q->tail] = x;
-+ q->tail = x;
-+ }
-+ }
-+}
-+
-+static int esfq_enqueue(struct sk_buff *skb, struct Qdisc* sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_q_enqueue(skb, q, ESFQ_TAIL);
-+ sch->qstats.backlog += skb->len;
-+ if (++sch->q.qlen < q->limit-1) {
-+ sch->bstats.bytes += skb->len;
-+ sch->bstats.packets++;
-+ return 0;
-+ }
-+
-+ sch->qstats.drops++;
-+ esfq_drop(sch);
-+ return NET_XMIT_CN;
-+}
-+
-+static struct sk_buff *esfq_peek(struct Qdisc* sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_index a;
-+
-+ /* No active slots */
-+ if (q->tail == q->depth)
-+ return NULL;
-+
-+ a = q->next[q->tail];
-+ return skb_peek(&q->qs[a]);
-+}
-+
-+static struct sk_buff *esfq_q_dequeue(struct esfq_sched_data *q)
-+{
-+ struct sk_buff *skb;
-+ unsigned depth = q->depth;
-+ esfq_index a, old_a;
-+
-+ /* No active slots */
-+ if (q->tail == depth)
-+ return NULL;
-+
-+ a = old_a = q->next[q->tail];
-+
-+ /* Grab packet */
-+ skb = __skb_dequeue(&q->qs[a]);
-+ esfq_dec(q, a);
-+
-+ /* Is the slot empty? */
-+ if (q->qs[a].qlen == 0) {
-+ q->ht[q->hash[a]] = depth;
-+ a = q->next[a];
-+ if (a == old_a) {
-+ q->tail = depth;
-+ return skb;
-+ }
-+ q->next[q->tail] = a;
-+ q->allot[a] += q->quantum;
-+ } else if ((q->allot[a] -= skb->len) <= 0) {
-+ q->tail = a;
-+ a = q->next[a];
-+ q->allot[a] += q->quantum;
-+ }
-+
-+ return skb;
-+}
-+
-+static struct sk_buff *esfq_dequeue(struct Qdisc* sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ struct sk_buff *skb;
-+
-+ skb = esfq_q_dequeue(q);
-+ if (skb == NULL)
-+ return NULL;
-+ sch->q.qlen--;
-+ sch->qstats.backlog -= skb->len;
-+ return skb;
-+}
-+
-+static void esfq_q_destroy(struct esfq_sched_data *q)
-+{
-+ del_timer(&q->perturb_timer);
-+ if(q->ht)
-+ kfree(q->ht);
-+ if(q->dep)
-+ kfree(q->dep);
-+ if(q->next)
-+ kfree(q->next);
-+ if(q->allot)
-+ kfree(q->allot);
-+ if(q->hash)
-+ kfree(q->hash);
-+ if(q->qs)
-+ kfree(q->qs);
-+}
-+
-+static void esfq_destroy(struct Qdisc *sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_q_destroy(q);
-+}
-+
-+
-+static void esfq_reset(struct Qdisc* sch)
-+{
-+ struct sk_buff *skb;
-+
-+ while ((skb = esfq_dequeue(sch)) != NULL)
-+ kfree_skb(skb);
-+}
-+
-+static void esfq_perturbation(unsigned long arg)
-+{
-+ struct Qdisc *sch = (struct Qdisc*)arg;
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+
-+ q->perturbation = net_random()&0x1F;
-+
-+ if (q->perturb_period) {
-+ q->perturb_timer.expires = jiffies + q->perturb_period;
-+ add_timer(&q->perturb_timer);
-+ }
-+}
-+
-+static unsigned int esfq_check_hash(unsigned int kind)
-+{
-+ switch (kind) {
-+ case TCA_SFQ_HASH_CTORIGDST:
-+ case TCA_SFQ_HASH_CTORIGSRC:
-+ case TCA_SFQ_HASH_CTREPLDST:
-+ case TCA_SFQ_HASH_CTREPLSRC:
-+ case TCA_SFQ_HASH_CTNATCHG:
-+#ifndef CONFIG_NET_SCH_ESFQ_NFCT
-+ {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "ESFQ: Conntrack hash types disabled in kernel config. Falling back to classic.\n");
-+ return TCA_SFQ_HASH_CLASSIC;
-+ }
-+#endif
-+ case TCA_SFQ_HASH_CLASSIC:
-+ case TCA_SFQ_HASH_DST:
-+ case TCA_SFQ_HASH_SRC:
-+ case TCA_SFQ_HASH_FWMARK:
-+ return kind;
-+ default:
-+ {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "ESFQ: Unknown hash type. Falling back to classic.\n");
-+ return TCA_SFQ_HASH_CLASSIC;
-+ }
-+ }
-+}
-+
-+static int esfq_q_init(struct esfq_sched_data *q, struct nlattr *opt)
-+{
-+ struct tc_esfq_qopt *ctl = nla_data(opt);
-+ esfq_index p = ~0U/2;
-+ int i;
-+
-+ if (opt && opt->nla_len < nla_attr_size(sizeof(*ctl)))
-+ return -EINVAL;
-+
-+ q->perturbation = 0;
-+ q->hash_kind = TCA_SFQ_HASH_CLASSIC;
-+ q->max_depth = 0;
-+ if (opt == NULL) {
-+ q->perturb_period = 0;
-+ q->hash_divisor = 1024;
-+ q->tail = q->limit = q->depth = 128;
-+
-+ } else {
-+ struct tc_esfq_qopt *ctl = nla_data(opt);
-+ if (ctl->quantum)
-+ q->quantum = ctl->quantum;
-+ q->perturb_period = ctl->perturb_period*HZ;
-+ q->hash_divisor = ctl->divisor ? : 1024;
-+ q->tail = q->limit = q->depth = ctl->flows ? : 128;
-+
-+ if ( q->depth > p - 1 )
-+ return -EINVAL;
-+
-+ if (ctl->limit)
-+ q->limit = min_t(u32, ctl->limit, q->depth);
-+
-+ if (ctl->hash_kind) {
-+ q->hash_kind = esfq_check_hash(ctl->hash_kind);
-+ }
-+ }
-+
-+ q->ht = kmalloc(q->hash_divisor*sizeof(esfq_index), GFP_KERNEL);
-+ if (!q->ht)
-+ goto err_case;
-+ q->dep = kmalloc((1+q->depth*2)*sizeof(struct esfq_head), GFP_KERNEL);
-+ if (!q->dep)
-+ goto err_case;
-+ q->next = kmalloc(q->depth*sizeof(esfq_index), GFP_KERNEL);
-+ if (!q->next)
-+ goto err_case;
-+ q->allot = kmalloc(q->depth*sizeof(short), GFP_KERNEL);
-+ if (!q->allot)
-+ goto err_case;
-+ q->hash = kmalloc(q->depth*sizeof(unsigned short), GFP_KERNEL);
-+ if (!q->hash)
-+ goto err_case;
-+ q->qs = kmalloc(q->depth*sizeof(struct sk_buff_head), GFP_KERNEL);
-+ if (!q->qs)
-+ goto err_case;
-+
-+ for (i=0; i< q->hash_divisor; i++)
-+ q->ht[i] = q->depth;
-+ for (i=0; i<q->depth; i++) {
-+ skb_queue_head_init(&q->qs[i]);
-+ q->dep[i+q->depth].next = i+q->depth;
-+ q->dep[i+q->depth].prev = i+q->depth;
-+ }
-+
-+ for (i=0; i<q->depth; i++)
-+ esfq_link(q, i);
-+ return 0;
-+err_case:
-+ esfq_q_destroy(q);
-+ return -ENOBUFS;
-+}
-+
-+static int esfq_init(struct Qdisc *sch, struct nlattr *opt)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ int err;
-+
-+ q->quantum = psched_mtu(qdisc_dev(sch)); /* default */
-+ if ((err = esfq_q_init(q, opt)))
-+ return err;
-+
-+ init_timer(&q->perturb_timer);
-+ q->perturb_timer.data = (unsigned long)sch;
-+ q->perturb_timer.function = esfq_perturbation;
-+ if (q->perturb_period) {
-+ q->perturb_timer.expires = jiffies + q->perturb_period;
-+ add_timer(&q->perturb_timer);
-+ }
-+
-+ return 0;
-+}
-+
-+static int esfq_change(struct Qdisc *sch, struct nlattr *opt)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ struct esfq_sched_data new;
-+ struct sk_buff *skb;
-+ int err;
-+
-+ /* set up new queue */
-+ memset(&new, 0, sizeof(struct esfq_sched_data));
-+ new.quantum = psched_mtu(qdisc_dev(sch)); /* default */
-+ if ((err = esfq_q_init(&new, opt)))
-+ return err;
-+
-+ /* copy all packets from the old queue to the new queue */
-+ sch_tree_lock(sch);
-+ while ((skb = esfq_q_dequeue(q)) != NULL)
-+ esfq_q_enqueue(skb, &new, ESFQ_TAIL);
-+
-+ /* clean up the old queue */
-+ esfq_q_destroy(q);
-+
-+ /* copy elements of the new queue into the old queue */
-+ q->perturb_period = new.perturb_period;
-+ q->quantum = new.quantum;
-+ q->limit = new.limit;
-+ q->depth = new.depth;
-+ q->hash_divisor = new.hash_divisor;
-+ q->hash_kind = new.hash_kind;
-+ q->tail = new.tail;
-+ q->max_depth = new.max_depth;
-+ q->ht = new.ht;
-+ q->dep = new.dep;
-+ q->next = new.next;
-+ q->allot = new.allot;
-+ q->hash = new.hash;
-+ q->qs = new.qs;
-+
-+ /* finish up */
-+ if (q->perturb_period) {
-+ q->perturb_timer.expires = jiffies + q->perturb_period;
-+ add_timer(&q->perturb_timer);
-+ } else {
-+ q->perturbation = 0;
-+ }
-+ sch_tree_unlock(sch);
-+ return 0;
-+}
-+
-+static int esfq_dump(struct Qdisc *sch, struct sk_buff *skb)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ unsigned char *b = skb_tail_pointer(skb);
-+ struct tc_esfq_qopt opt;
-+
-+ opt.quantum = q->quantum;
-+ opt.perturb_period = q->perturb_period/HZ;
-+
-+ opt.limit = q->limit;
-+ opt.divisor = q->hash_divisor;
-+ opt.flows = q->depth;
-+ opt.hash_kind = q->hash_kind;
-+
-+ NLA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt);
-+
-+ return skb->len;
-+
-+nla_put_failure:
-+ nlmsg_trim(skb, b);
-+ return -1;
-+}
-+
-+static struct Qdisc_ops esfq_qdisc_ops =
-+{
-+ .next = NULL,
-+ .cl_ops = NULL,
-+ .id = "esfq",
-+ .priv_size = sizeof(struct esfq_sched_data),
-+ .enqueue = esfq_enqueue,
-+ .dequeue = esfq_dequeue,
-+ .peek = esfq_peek,
-+ .drop = esfq_drop,
-+ .init = esfq_init,
-+ .reset = esfq_reset,
-+ .destroy = esfq_destroy,
-+ .change = esfq_change,
-+ .dump = esfq_dump,
-+ .owner = THIS_MODULE,
-+};
-+
-+static int __init esfq_module_init(void)
-+{
-+ return register_qdisc(&esfq_qdisc_ops);
-+}
-+static void __exit esfq_module_exit(void)
-+{
-+ unregister_qdisc(&esfq_qdisc_ops);
-+}
-+module_init(esfq_module_init)
-+module_exit(esfq_module_exit)
-+MODULE_LICENSE("GPL");
+++ /dev/null
---- a/include/linux/jhash.h
-+++ b/include/linux/jhash.h
-@@ -3,80 +3,95 @@
-
- /* jhash.h: Jenkins hash support.
- *
-- * Copyright (C) 1996 Bob Jenkins (bob_jenkins@burtleburtle.net)
-+ * Copyright (C) 2006. Bob Jenkins (bob_jenkins@burtleburtle.net)
- *
- * http://burtleburtle.net/bob/hash/
- *
- * These are the credits from Bob's sources:
- *
-- * lookup2.c, by Bob Jenkins, December 1996, Public Domain.
-- * hash(), hash2(), hash3, and mix() are externally useful functions.
-- * Routines to test the hash are included if SELF_TEST is defined.
-- * You can use this free for any purpose. It has no warranty.
-+ * lookup3.c, by Bob Jenkins, May 2006, Public Domain.
- *
-- * Copyright (C) 2003 David S. Miller (davem@redhat.com)
-+ * These are functions for producing 32-bit hashes for hash table lookup.
-+ * hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
-+ * are externally useful functions. Routines to test the hash are included
-+ * if SELF_TEST is defined. You can use this free for any purpose. It's in
-+ * the public domain. It has no warranty.
-+ *
-+ * Copyright (C) 2009 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu)
- *
- * I've modified Bob's hash to be useful in the Linux kernel, and
-- * any bugs present are surely my fault. -DaveM
-+ * any bugs present are my fault. Jozsef
- */
-
--/* NOTE: Arguments are modified. */
--#define __jhash_mix(a, b, c) \
-+#define __rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
-+
-+/* __jhash_mix - mix 3 32-bit values reversibly. */
-+#define __jhash_mix(a,b,c) \
-+{ \
-+ a -= c; a ^= __rot(c, 4); c += b; \
-+ b -= a; b ^= __rot(a, 6); a += c; \
-+ c -= b; c ^= __rot(b, 8); b += a; \
-+ a -= c; a ^= __rot(c,16); c += b; \
-+ b -= a; b ^= __rot(a,19); a += c; \
-+ c -= b; c ^= __rot(b, 4); b += a; \
-+}
-+
-+/* __jhash_final - final mixing of 3 32-bit values (a,b,c) into c */
-+#define __jhash_final(a,b,c) \
- { \
-- a -= b; a -= c; a ^= (c>>13); \
-- b -= c; b -= a; b ^= (a<<8); \
-- c -= a; c -= b; c ^= (b>>13); \
-- a -= b; a -= c; a ^= (c>>12); \
-- b -= c; b -= a; b ^= (a<<16); \
-- c -= a; c -= b; c ^= (b>>5); \
-- a -= b; a -= c; a ^= (c>>3); \
-- b -= c; b -= a; b ^= (a<<10); \
-- c -= a; c -= b; c ^= (b>>15); \
-+ c ^= b; c -= __rot(b,14); \
-+ a ^= c; a -= __rot(c,11); \
-+ b ^= a; b -= __rot(a,25); \
-+ c ^= b; c -= __rot(b,16); \
-+ a ^= c; a -= __rot(c,4); \
-+ b ^= a; b -= __rot(a,14); \
-+ c ^= b; c -= __rot(b,24); \
- }
-
--/* The golden ration: an arbitrary value */
--#define JHASH_GOLDEN_RATIO 0x9e3779b9
-+/* An arbitrary initial parameter */
-+#define JHASH_GOLDEN_RATIO 0xdeadbeef
-
- /* The most generic version, hashes an arbitrary sequence
- * of bytes. No alignment or length assumptions are made about
-- * the input key.
-+ * the input key. The result depends on endianness.
- */
- static inline u32 jhash(const void *key, u32 length, u32 initval)
- {
-- u32 a, b, c, len;
-+ u32 a,b,c;
- const u8 *k = key;
-
-- len = length;
-- a = b = JHASH_GOLDEN_RATIO;
-- c = initval;
--
-- while (len >= 12) {
-- a += (k[0] +((u32)k[1]<<8) +((u32)k[2]<<16) +((u32)k[3]<<24));
-- b += (k[4] +((u32)k[5]<<8) +((u32)k[6]<<16) +((u32)k[7]<<24));
-- c += (k[8] +((u32)k[9]<<8) +((u32)k[10]<<16)+((u32)k[11]<<24));
--
-- __jhash_mix(a,b,c);
-+ /* Set up the internal state */
-+ a = b = c = JHASH_GOLDEN_RATIO + length + initval;
-
-+ /* all but the last block: affect some 32 bits of (a,b,c) */
-+ while (length > 12) {
-+ a += (k[0] + ((u32)k[1]<<8) + ((u32)k[2]<<16) + ((u32)k[3]<<24));
-+ b += (k[4] + ((u32)k[5]<<8) + ((u32)k[6]<<16) + ((u32)k[7]<<24));
-+ c += (k[8] + ((u32)k[9]<<8) + ((u32)k[10]<<16) + ((u32)k[11]<<24));
-+ __jhash_mix(a, b, c);
-+ length -= 12;
- k += 12;
-- len -= 12;
- }
-
-- c += length;
-- switch (len) {
-- case 11: c += ((u32)k[10]<<24);
-- case 10: c += ((u32)k[9]<<16);
-- case 9 : c += ((u32)k[8]<<8);
-- case 8 : b += ((u32)k[7]<<24);
-- case 7 : b += ((u32)k[6]<<16);
-- case 6 : b += ((u32)k[5]<<8);
-+ /* last block: affect all 32 bits of (c) */
-+ /* all the case statements fall through */
-+ switch (length) {
-+ case 12: c += (u32)k[11]<<24;
-+ case 11: c += (u32)k[10]<<16;
-+ case 10: c += (u32)k[9]<<8;
-+ case 9 : c += k[8];
-+ case 8 : b += (u32)k[7]<<24;
-+ case 7 : b += (u32)k[6]<<16;
-+ case 6 : b += (u32)k[5]<<8;
- case 5 : b += k[4];
-- case 4 : a += ((u32)k[3]<<24);
-- case 3 : a += ((u32)k[2]<<16);
-- case 2 : a += ((u32)k[1]<<8);
-+ case 4 : a += (u32)k[3]<<24;
-+ case 3 : a += (u32)k[2]<<16;
-+ case 2 : a += (u32)k[1]<<8;
- case 1 : a += k[0];
-- };
--
-- __jhash_mix(a,b,c);
-+ __jhash_final(a, b, c);
-+ case 0 :
-+ break;
-+ }
-
- return c;
- }
-@@ -86,58 +101,57 @@ static inline u32 jhash(const void *key,
- */
- static inline u32 jhash2(const u32 *k, u32 length, u32 initval)
- {
-- u32 a, b, c, len;
-+ u32 a, b, c;
-
-- a = b = JHASH_GOLDEN_RATIO;
-- c = initval;
-- len = length;
-+ /* Set up the internal state */
-+ a = b = c = JHASH_GOLDEN_RATIO + (length<<2) + initval;
-
-- while (len >= 3) {
-+ /* handle most of the key */
-+ while (length > 3) {
- a += k[0];
- b += k[1];
- c += k[2];
- __jhash_mix(a, b, c);
-- k += 3; len -= 3;
-+ length -= 3;
-+ k += 3;
- }
-
-- c += length * 4;
--
-- switch (len) {
-- case 2 : b += k[1];
-- case 1 : a += k[0];
-- };
--
-- __jhash_mix(a,b,c);
-+ /* handle the last 3 u32's */
-+ /* all the case statements fall through */
-+ switch (length) {
-+ case 3: c += k[2];
-+ case 2: b += k[1];
-+ case 1: a += k[0];
-+ __jhash_final(a, b, c);
-+ case 0: /* case 0: nothing left to add */
-+ break;
-+ }
-
- return c;
- }
-
--
- /* A special ultra-optimized versions that knows they are hashing exactly
- * 3, 2 or 1 word(s).
-- *
-- * NOTE: In partilar the "c += length; __jhash_mix(a,b,c);" normally
-- * done at the end is not done here.
- */
- static inline u32 jhash_3words(u32 a, u32 b, u32 c, u32 initval)
- {
-- a += JHASH_GOLDEN_RATIO;
-- b += JHASH_GOLDEN_RATIO;
-- c += initval;
-+ a += JHASH_GOLDEN_RATIO + initval;
-+ b += JHASH_GOLDEN_RATIO + initval;
-+ c += JHASH_GOLDEN_RATIO + initval;
-
-- __jhash_mix(a, b, c);
-+ __jhash_final(a, b, c);
-
- return c;
- }
-
- static inline u32 jhash_2words(u32 a, u32 b, u32 initval)
- {
-- return jhash_3words(a, b, 0, initval);
-+ return jhash_3words(0, a, b, initval);
- }
-
- static inline u32 jhash_1word(u32 a, u32 initval)
- {
-- return jhash_3words(a, 0, 0, initval);
-+ return jhash_3words(0, 0, a, initval);
- }
-
- #endif /* _LINUX_JHASH_H */
+++ /dev/null
---- a/arch/mips/include/asm/string.h
-+++ b/arch/mips/include/asm/string.h
-@@ -133,11 +133,44 @@ strncmp(__const__ char *__cs, __const__
-
- #define __HAVE_ARCH_MEMSET
- extern void *memset(void *__s, int __c, size_t __count);
-+#define memset(__s, __c, len) \
-+({ \
-+ size_t __len = (len); \
-+ void *__ret; \
-+ if (__builtin_constant_p(len) && __len >= 64) \
-+ __ret = memset((__s), (__c), __len); \
-+ else \
-+ __ret = __builtin_memset((__s), (__c), __len); \
-+ __ret; \
-+})
-
- #define __HAVE_ARCH_MEMCPY
- extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
-+#define memcpy(dst, src, len) \
-+({ \
-+ size_t __len = (len); \
-+ void *__ret; \
-+ if (__builtin_constant_p(len) && __len >= 64) \
-+ __ret = memcpy((dst), (src), __len); \
-+ else \
-+ __ret = __builtin_memcpy((dst), (src), __len); \
-+ __ret; \
-+})
-
- #define __HAVE_ARCH_MEMMOVE
- extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
-+#define memmove(dst, src, len) \
-+({ \
-+ size_t __len = (len); \
-+ void *__ret; \
-+ if (__builtin_constant_p(len) && __len >= 64) \
-+ __ret = memmove((dst), (src), __len); \
-+ else \
-+ __ret = __builtin_memmove((dst), (src), __len); \
-+ __ret; \
-+})
-+
-+#define __HAVE_ARCH_MEMCMP
-+#define memcmp(src1, src2, len) __builtin_memcmp((src1), (src2), (len))
-
- #endif /* _ASM_STRING_H */
---- a/arch/mips/lib/Makefile
-+++ b/arch/mips/lib/Makefile
-@@ -3,7 +3,7 @@
- #
-
- lib-y += csum_partial.o delay.o memcpy.o memcpy-inatomic.o memset.o \
-- strlen_user.o strncpy_user.o strnlen_user.o uncached.o
-+ strlen_user.o strncpy_user.o strnlen_user.o uncached.o memcmp.o
-
- obj-y += iomap.o
- obj-$(CONFIG_PCI) += iomap-pci.o
---- /dev/null
-+++ b/arch/mips/lib/memcmp.c
-@@ -0,0 +1,22 @@
-+/*
-+ * copied from linux/lib/string.c
-+ *
-+ * Copyright (C) 1991, 1992 Linus Torvalds
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/string.h>
-+
-+#undef memcmp
-+int memcmp(const void *cs, const void *ct, size_t count)
-+{
-+ const unsigned char *su1, *su2;
-+ int res = 0;
-+
-+ for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
-+ if ((res = *su1 - *su2) != 0)
-+ break;
-+ return res;
-+}
-+EXPORT_SYMBOL(memcmp);
-+
+++ /dev/null
---- a/include/linux/slab.h
-+++ b/include/linux/slab.h
-@@ -124,8 +124,8 @@ int kmem_ptr_validate(struct kmem_cache
- * to do various tricks to work around compiler limitations in order to
- * ensure proper constant folding.
- */
--#define KMALLOC_SHIFT_HIGH ((MAX_ORDER + PAGE_SHIFT - 1) <= 25 ? \
-- (MAX_ORDER + PAGE_SHIFT - 1) : 25)
-+#define KMALLOC_SHIFT_HIGH ((MAX_ORDER + PAGE_SHIFT - 1) <= 17 ? \
-+ (MAX_ORDER + PAGE_SHIFT - 1) : 17)
-
- #define KMALLOC_MAX_SIZE (1UL << KMALLOC_SHIFT_HIGH)
- #define KMALLOC_MAX_ORDER (KMALLOC_SHIFT_HIGH - PAGE_SHIFT)
+++ /dev/null
---- a/fs/jffs2/build.c
-+++ b/fs/jffs2/build.c
-@@ -111,6 +111,17 @@ static int jffs2_build_filesystem(struct
- dbg_fsbuild("scanned flash completely\n");
- jffs2_dbg_dump_block_lists_nolock(c);
-
-+ if (c->flags & (1 << 7)) {
-+ printk("%s(): unlocking the mtd device... ", __func__);
-+ if (c->mtd->unlock)
-+ c->mtd->unlock(c->mtd, 0, c->mtd->size);
-+ printk("done.\n");
-+
-+ printk("%s(): erasing all blocks after the end marker... ", __func__);
-+ jffs2_erase_pending_blocks(c, -1);
-+ printk("done.\n");
-+ }
-+
- dbg_fsbuild("pass 1 starting\n");
- c->flags |= JFFS2_SB_FLAG_BUILDING;
- /* Now scan the directory tree, increasing nlink according to every dirent found. */
---- a/fs/jffs2/scan.c
-+++ b/fs/jffs2/scan.c
-@@ -72,7 +72,7 @@ static int file_dirty(struct jffs2_sb_in
- return ret;
- if ((ret = jffs2_scan_dirty_space(c, jeb, jeb->free_size)))
- return ret;
-- /* Turned wasted size into dirty, since we apparently
-+ /* Turned wasted size into dirty, since we apparently
- think it's recoverable now. */
- jeb->dirty_size += jeb->wasted_size;
- c->dirty_size += jeb->wasted_size;
-@@ -144,8 +144,11 @@ int jffs2_scan_medium(struct jffs2_sb_in
- /* reset summary info for next eraseblock scan */
- jffs2_sum_reset_collected(s);
-
-- ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
-- buf_size, s);
-+ if (c->flags & (1 << 7))
-+ ret = BLK_STATE_ALLFF;
-+ else
-+ ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
-+ buf_size, s);
-
- if (ret < 0)
- goto out;
-@@ -400,7 +403,7 @@ static int jffs2_scan_xref_node(struct j
- if (!ref)
- return -ENOMEM;
-
-- /* BEFORE jffs2_build_xattr_subsystem() called,
-+ /* BEFORE jffs2_build_xattr_subsystem() called,
- * and AFTER xattr_ref is marked as a dead xref,
- * ref->xid is used to store 32bit xid, xd is not used
- * ref->ino is used to store 32bit inode-number, ic is not used
-@@ -473,7 +476,7 @@ static int jffs2_scan_eraseblock (struct
- struct jffs2_sum_marker *sm;
- void *sumptr = NULL;
- uint32_t sumlen;
--
-+
- if (!buf_size) {
- /* XIP case. Just look, point at the summary if it's there */
- sm = (void *)buf + c->sector_size - sizeof(*sm);
-@@ -489,9 +492,9 @@ static int jffs2_scan_eraseblock (struct
- buf_len = sizeof(*sm);
-
- /* Read as much as we want into the _end_ of the preallocated buffer */
-- err = jffs2_fill_scan_buf(c, buf + buf_size - buf_len,
-+ err = jffs2_fill_scan_buf(c, buf + buf_size - buf_len,
- jeb->offset + c->sector_size - buf_len,
-- buf_len);
-+ buf_len);
- if (err)
- return err;
-
-@@ -510,9 +513,9 @@ static int jffs2_scan_eraseblock (struct
- }
- if (buf_len < sumlen) {
- /* Need to read more so that the entire summary node is present */
-- err = jffs2_fill_scan_buf(c, sumptr,
-+ err = jffs2_fill_scan_buf(c, sumptr,
- jeb->offset + c->sector_size - sumlen,
-- sumlen - buf_len);
-+ sumlen - buf_len);
- if (err)
- return err;
- }
-@@ -525,7 +528,7 @@ static int jffs2_scan_eraseblock (struct
-
- if (buf_size && sumlen > buf_size)
- kfree(sumptr);
-- /* If it returns with a real error, bail.
-+ /* If it returns with a real error, bail.
- If it returns positive, that's a block classification
- (i.e. BLK_STATE_xxx) so return that too.
- If it returns zero, fall through to full scan. */
-@@ -546,6 +549,17 @@ static int jffs2_scan_eraseblock (struct
- return err;
- }
-
-+ if ((buf[0] == 0xde) &&
-+ (buf[1] == 0xad) &&
-+ (buf[2] == 0xc0) &&
-+ (buf[3] == 0xde)) {
-+ /* end of filesystem. erase everything after this point */
-+ printk("%s(): End of filesystem marker found at 0x%x\n", __func__, jeb->offset);
-+ c->flags |= (1 << 7);
-+
-+ return BLK_STATE_ALLFF;
-+ }
-+
- /* We temporarily use 'ofs' as a pointer into the buffer/jeb */
- ofs = 0;
-
-@@ -671,7 +685,7 @@ scan_more:
- scan_end = buf_len;
- goto more_empty;
- }
--
-+
- /* See how much more there is to read in this eraseblock... */
- buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
- if (!buf_len) {
-@@ -907,7 +921,7 @@ scan_more:
-
- D1(printk(KERN_DEBUG "Block at 0x%08x: free 0x%08x, dirty 0x%08x, unchecked 0x%08x, used 0x%08x, wasted 0x%08x\n",
- jeb->offset,jeb->free_size, jeb->dirty_size, jeb->unchecked_size, jeb->used_size, jeb->wasted_size));
--
-+
- /* mark_node_obsolete can add to wasted !! */
- if (jeb->wasted_size) {
- jeb->dirty_size += jeb->wasted_size;
+++ /dev/null
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -1387,11 +1387,18 @@ static inline int skb_network_offset(con
- *
- * Various parts of the networking layer expect at least 32 bytes of
- * headroom, you should not reduce this.
-+ *
-+ * This has been changed to 64 to acommodate for routing between ethernet
-+ * and wireless, but only for new allocations
- */
- #ifndef NET_SKB_PAD
- #define NET_SKB_PAD 32
- #endif
-
-+#ifndef NET_SKB_PAD_ALLOC
-+#define NET_SKB_PAD_ALLOC 64
-+#endif
-+
- extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
-
- static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
-@@ -1481,9 +1488,9 @@ static inline void __skb_queue_purge(str
- static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
- gfp_t gfp_mask)
- {
-- struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD, gfp_mask);
-+ struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD_ALLOC, gfp_mask);
- if (likely(skb))
-- skb_reserve(skb, NET_SKB_PAD);
-+ skb_reserve(skb, NET_SKB_PAD_ALLOC);
- return skb;
- }
-
-@@ -1556,7 +1563,7 @@ static inline int __skb_cow(struct sk_bu
- delta = headroom - skb_headroom(skb);
-
- if (delta || cloned)
-- return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD), 0,
-+ return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD_ALLOC), 0,
- GFP_ATOMIC);
- return 0;
- }
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
-@@ -336,9 +336,9 @@ struct sk_buff *__netdev_alloc_skb(struc
- int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1;
- struct sk_buff *skb;
-
-- skb = __alloc_skb(length + NET_SKB_PAD, gfp_mask, 0, node);
-+ skb = __alloc_skb(length + NET_SKB_PAD_ALLOC, gfp_mask, 0, node);
- if (likely(skb)) {
-- skb_reserve(skb, NET_SKB_PAD);
-+ skb_reserve(skb, NET_SKB_PAD_ALLOC);
- skb->dev = dev;
- }
- return skb;
+++ /dev/null
---- /dev/null
-+++ b/include/asm-powerpc/segment.h
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_SEGMENT_H
-+#define _ASM_SEGMENT_H
-+
-+/* Only here because we have some old header files that expect it.. */
-+
-+#endif /* _ASM_SEGMENT_H */
+++ /dev/null
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -178,6 +178,7 @@ source "fs/ubifs/Kconfig"
- source "fs/cramfs/Kconfig"
- source "fs/squashfs/Kconfig"
- source "fs/freevxfs/Kconfig"
-+source "fs/mini_fo/Kconfig"
- source "fs/minix/Kconfig"
- source "fs/omfs/Kconfig"
- source "fs/hpfs/Kconfig"
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -77,6 +77,7 @@ obj-$(CONFIG_SQUASHFS) += squashfs/
- obj-y += ramfs/
- obj-$(CONFIG_HUGETLBFS) += hugetlbfs/
- obj-$(CONFIG_CODA_FS) += coda/
-+obj-$(CONFIG_MINI_FO) += mini_fo/
- obj-$(CONFIG_MINIX_FS) += minix/
- obj-$(CONFIG_FAT_FS) += fat/
- obj-$(CONFIG_BFS_FS) += bfs/
---- /dev/null
-+++ b/fs/mini_fo/aux.c
-@@ -0,0 +1,577 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+/* check if file exists in storage */
-+int exists_in_storage(dentry_t *dentry)
-+{
-+ check_mini_fo_dentry(dentry);
-+ if(dtost(dentry) == MODIFIED || dtost(dentry) == CREATED || dtost(dentry) == DEL_REWRITTEN)
-+ return 1;
-+ return 0;
-+}
-+
-+/* check if dentry is in an existing state */
-+int is_mini_fo_existant(dentry_t *dentry)
-+{
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) == DELETED || dtost(dentry) == NON_EXISTANT)
-+ return 0;
-+ else
-+ return 1;
-+}
-+
-+/*
-+ * This function will create a negative storage dentry for
-+ * dentry, what is required for many create like options.
-+ * It will create the storage structure if necessary.
-+ */
-+int get_neg_sto_dentry(dentry_t *dentry)
-+{
-+ int err = 0;
-+ unsigned int len;
-+ const unsigned char *name;
-+
-+ if(!dentry ||
-+ !dtopd(dentry) ||
-+ !(dtost(dentry) == UNMODIFIED ||
-+ dtost(dentry) == NON_EXISTANT ||
-+ dtost(dentry) == DELETED)) {
-+ printk(KERN_CRIT "mini_fo: get_neg_sto_dentry: invalid dentry passed.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ /* Have we got a neg. dentry already? */
-+ if(dtohd2(dentry)) {
-+ err = 0;
-+ goto out;
-+ }
-+ if(dtost(dentry->d_parent) == UNMODIFIED) {
-+ /* build sto struct */
-+ err = build_sto_structure(dentry->d_parent->d_parent, dentry->d_parent);
-+ if(err ||
-+ dtost(dentry->d_parent) != MODIFIED) {
-+ printk(KERN_CRIT "mini_fo: get_neg_sto_dentry: ERROR building sto structure.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ }
-+
-+ len = dentry->d_name.len;
-+ name = dentry->d_name.name;
-+
-+ dtohd2(dentry) =
-+ lookup_one_len(name, dtohd2(dentry->d_parent), len);
-+
-+ out:
-+ return err;
-+}
-+
-+int check_mini_fo_dentry(dentry_t *dentry)
-+{
-+ ASSERT(dentry != NULL);
-+ ASSERT(dtopd(dentry) != NULL);
-+ ASSERT((dtohd(dentry) != NULL) || (dtohd2(dentry) != NULL));
-+
-+/* if(dtost(dentry) == MODIFIED) { */
-+/* ASSERT(dentry->d_inode != NULL); */
-+/* ASSERT(dtohd(dentry) != NULL); */
-+/* ASSERT(dtohd(dentry)->d_inode != NULL); */
-+/* ASSERT(dtohd2(dentry) != NULL); */
-+/* ASSERT(dtohd2(dentry)->d_inode != NULL); */
-+/* } */
-+/* else if(dtost(dentry) == UNMODIFIED) { */
-+/* ASSERT(dentry->d_inode != NULL); */
-+/* ASSERT( */
-+/* } */
-+ return 0;
-+}
-+
-+int check_mini_fo_file(file_t *file)
-+{
-+ ASSERT(file != NULL);
-+ ASSERT(ftopd(file) != NULL);
-+ ASSERT(file->f_dentry != NULL);
-+
-+ /* violent checking, check depending of state and type
-+ * if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {}
-+ */
-+ ASSERT((ftohf(file) != NULL) || (ftohf2(file) != NULL));
-+ return 0;
-+}
-+
-+int check_mini_fo_inode(inode_t *inode)
-+{
-+ ASSERT(inode != NULL);
-+ ASSERT(itopd(inode) != NULL);
-+ ASSERT((itohi(inode) != NULL) || (itohi2(inode) != NULL));
-+ return 0;
-+}
-+
-+/*
-+ * will walk a base path as provided by get_mini_fo_bpath and return
-+ * the (hopefully ;-) ) positive dentry of the renamed base dir.
-+ *
-+ * This does some work of path_init.
-+ */
-+dentry_t *bpath_walk(super_block_t *sb, char *bpath)
-+{
-+ int err;
-+ struct vfsmount *mnt;
-+ struct nameidata nd;
-+
-+ /* be paranoid */
-+ if(!bpath || bpath[0] != '/') {
-+ printk(KERN_CRIT "mini_fo: bpath_walk: Invalid string.\n");
-+ return NULL;
-+ }
-+ if(!sb || !stopd(sb)) {
-+ printk(KERN_CRIT "mini_fo: bpath_walk: Invalid sb.\n");
-+ return NULL;
-+ }
-+
-+ /* fix this: how do I reach this lock?
-+ * read_lock(¤t->fs->lock); */
-+ mnt = mntget(stopd(sb)->hidden_mnt);
-+ /* read_unlock(¤t->fs->lock); */
-+
-+ err = vfs_path_lookup(mnt->mnt_root, mnt, bpath+1, 0, &nd);
-+
-+ /* validate */
-+ if (err || !nd.dentry || !nd.dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: bpath_walk: path_walk failed.\n");
-+ return NULL;
-+ }
-+ return nd.dentry;
-+}
-+
-+
-+/* returns the full path of the basefile incl. its name */
-+int get_mini_fo_bpath(dentry_t *dentry, char **bpath, int *bpath_len)
-+{
-+ char *buf_walker;
-+ int len = 0;
-+ dentry_t *sky_walker;
-+
-+ if(!dentry || !dtohd(dentry)) {
-+ printk(KERN_CRIT "mini_fo: get_mini_fo_bpath: invalid dentry passed.\n");
-+ return -1;
-+ }
-+ sky_walker = dtohd(dentry);
-+
-+ do {
-+ len += sky_walker->d_name.len + 1 ; /* 1 for '/' */
-+ sky_walker = sky_walker->d_parent;
-+ } while(sky_walker != stopd(dentry->d_inode->i_sb)->base_dir_dentry);
-+
-+ /* 1 to oil the loop */
-+ *bpath = (char*) kmalloc(len + 1, GFP_KERNEL);
-+ if(!*bpath) {
-+ printk(KERN_CRIT "mini_fo: get_mini_fo_bpath: out of mem.\n");
-+ return -1;
-+ }
-+ buf_walker = *bpath+len; /* put it on last char */
-+ *buf_walker = '\n';
-+ sky_walker = dtohd(dentry);
-+
-+ do {
-+ buf_walker -= sky_walker->d_name.len;
-+ strncpy(buf_walker,
-+ sky_walker->d_name.name,
-+ sky_walker->d_name.len);
-+ *(--buf_walker) = '/';
-+ sky_walker = sky_walker->d_parent;
-+ } while(sky_walker != stopd(dentry->d_inode->i_sb)->base_dir_dentry);
-+
-+ /* bpath_len doesn't count newline! */
-+ *bpath_len = len;
-+ return 0;
-+}
-+
-+int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
-+ dentry_t *src_dentry, struct vfsmount *src_mnt)
-+{
-+ void *buf;
-+ mm_segment_t old_fs;
-+ file_t *tgt_file;
-+ file_t *src_file;
-+ int bytes, len, tmp, err;
-+ err = 0;
-+
-+ if(!(tgt_dentry->d_inode && src_dentry->d_inode)) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, neg. dentry passed.\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ dget(tgt_dentry);
-+ dget(src_dentry);
-+ mntget(tgt_mnt);
-+ mntget(src_mnt);
-+
-+ /* open file write only */
-+ tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1);
-+ if(!tgt_file || IS_ERR(tgt_file)) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening target file.\n");
-+ err = PTR_ERR(tgt_file);
-+ goto out_err;
-+ }
-+
-+ /* open file read only */
-+ src_file = dentry_open(src_dentry, src_mnt, 0x0);
-+ if(!src_file || IS_ERR(src_file)) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening source file.\n");
-+ err = PTR_ERR(src_file);
-+
-+ /* close target file */
-+ fput(tgt_file);
-+ goto out_err;
-+ }
-+
-+ /* check if the filesystem(s) support read respective write */
-+ if(!src_file->f_op->read || !tgt_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, no fs read or write support.\n");
-+ err = -EPERM;
-+ goto out_close;
-+ }
-+
-+ /* allocate a page for transfering the data */
-+ buf = (void *) __get_free_page(GFP_KERNEL);
-+ if(!buf) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, out of kernel mem.\n");
-+ goto out_err;
-+ }
-+
-+ tgt_file->f_pos = 0;
-+ src_file->f_pos = 0;
-+
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* Doing this I assume that a read operation will return a full
-+ * buffer while there is still data to read, and a less than
-+ * full buffer when all data has been read.
-+ */
-+ bytes = len = PAGE_SIZE;
-+ while(bytes == len) {
-+ bytes = src_file->f_op->read(src_file, buf, len,
-+ &src_file->f_pos);
-+ tmp = tgt_file->f_op->write(tgt_file, buf, bytes,
-+ &tgt_file->f_pos);
-+ if(tmp != bytes) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR writing.\n");
-+ goto out_close_unset;
-+ }
-+ }
-+
-+ free_page((unsigned long) buf);
-+ set_fs(old_fs);
-+ fput(tgt_file);
-+ fput(src_file);
-+ goto out;
-+
-+ out_close_unset:
-+ free_page((unsigned long) buf);
-+ set_fs(old_fs);
-+
-+ out_close:
-+ fput(tgt_file);
-+ fput(src_file);
-+
-+ out_err:
-+ dput(tgt_dentry);
-+ dput(src_dentry);
-+
-+ /* mk: not sure if this need to be done */
-+ mntput(tgt_mnt);
-+ mntput(src_mnt);
-+
-+ out:
-+ return err;
-+}
-+
-+/* mk:
-+ * ndl (no-duplicate list) stuff
-+ * This is used in mini_fo_readdir, to save the storage directory contents
-+ * and later when reading base, match them against the list in order
-+ * to avoid duplicates.
-+ */
-+
-+/* add a file specified by name and len to the ndl
-+ * Return values: 0 on success, <0 on failure.
-+ */
-+int ndl_add_entry(struct readdir_data *rd, const char *name, int len)
-+{
-+ struct ndl_entry *tmp_entry;
-+
-+ tmp_entry = (struct ndl_entry *)
-+ kmalloc(sizeof(struct ndl_entry), GFP_KERNEL);
-+ if(!tmp_entry) {
-+ printk(KERN_CRIT "mini_fo: ndl_add_entry: out of mem.\n");
-+ return -ENOMEM;
-+ }
-+ tmp_entry->name = (char*) kmalloc(len, GFP_KERNEL);
-+ if(!tmp_entry->name) {
-+ printk(KERN_CRIT "mini_fo: ndl_add_entry: out of mem.\n");
-+ return -ENOMEM;
-+ }
-+ strncpy(tmp_entry->name, name, len);
-+ tmp_entry->len = len;
-+
-+ list_add(&tmp_entry->list, &rd->ndl_list);
-+ rd->ndl_size++;
-+ return 0;
-+}
-+
-+/* delete all list entries and free memory */
-+void ndl_put_list(struct readdir_data *rd)
-+{
-+ struct list_head *tmp;
-+ struct ndl_entry *tmp_entry;
-+
-+ if(rd->ndl_size <= 0)
-+ return;
-+ while(!list_empty(&rd->ndl_list)) {
-+ tmp = rd->ndl_list.next;
-+ list_del(tmp);
-+ tmp_entry = list_entry(tmp, struct ndl_entry, list);
-+ kfree(tmp_entry->name);
-+ kfree(tmp_entry);
-+ }
-+ rd->ndl_size = 0;
-+}
-+
-+/* Check if a file specified by name and len is in the ndl
-+ * Return value: 0 if not in list, 1 if file is found in ndl.
-+ */
-+int ndl_check_entry(struct readdir_data *rd, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct ndl_entry *tmp_entry;
-+
-+ if(rd->ndl_size <= 0)
-+ return 0;
-+
-+ list_for_each(tmp, &rd->ndl_list) {
-+ tmp_entry = list_entry(tmp, struct ndl_entry, list);
-+ if(tmp_entry->len != len)
-+ continue;
-+ if(!strncmp(tmp_entry->name, name, len))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/* mk:
-+ * Recursive function to create corresponding directorys in the storage fs.
-+ * The function will build the storage directorys up to dentry.
-+ */
-+int build_sto_structure(dentry_t *dir, dentry_t *dentry)
-+{
-+ int err;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ if(dentry->d_parent != dir) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: invalid parameter or meta data corruption [1].\n");
-+ return 1;
-+ }
-+
-+ if(dtost(dir) != MODIFIED) {
-+ err = build_sto_structure(dir->d_parent, dentry->d_parent);
-+ if(err)
-+ return err;
-+ }
-+
-+ /* ok, coming back again. */
-+ check_mini_fo_dentry(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(!hidden_sto_dentry) {
-+ /*
-+ * This is the case after creating the first
-+ * hidden_sto_dentry.
-+ * After one negative storage_dentry, all pointers to
-+ * hidden_storage dentries are set to NULL. We need to
-+ * create the negative dentry before we create the storage
-+ * file.
-+ */
-+ unsigned int len;
-+ const unsigned char *name;
-+ len = dtohd(dentry)->d_name.len;
-+ name = dtohd(dentry)->d_name.name;
-+ hidden_sto_dentry = lookup_one_len(name, dtohd2(dir), len);
-+ dtohd2(dentry) = hidden_sto_dentry;
-+ }
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ /* lets be safe */
-+ if(dtohd2(dir) != hidden_sto_dir_dentry) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: invalid parameter or meta data corruption [2].\n");
-+ return 1;
-+ }
-+
-+ /* check for errors in lock_parent */
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if(IS_ERR(hidden_sto_dir_dentry)) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: lock_parent failed.\n");
-+ return err;
-+ }
-+
-+ err = vfs_mkdir(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dir->d_inode->i_mode);
-+
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: failed to create storage dir [1].\n");
-+ /* was: unlock_dir(dir); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&dir->d_inode->i_mutex);
-+#else
-+ up(&dir->d_inode->i_sem);
-+#endif
-+ dput(dir);
-+ return err;
-+ }
-+
-+ /* everything ok! */
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: failed to create storage dir [2].\n");
-+ /* was: unlock_dir(dir); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&dir->d_inode->i_mutex);
-+#else
-+ up(&dir->d_inode->i_sem);
-+#endif
-+ dput(dir);
-+ return 1;
-+ }
-+
-+ /* interpose the new inode and set new state */
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ dtopd(dentry)->state = MODIFIED;
-+
-+ /* initalize the wol list */
-+ itopd(dentry->d_inode)->deleted_list_size = -1;
-+ itopd(dentry->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(dentry);
-+
-+ fist_copy_attr_all(dentry->d_inode, itohi2(dentry->d_inode));
-+ fist_copy_attr_timesizes(dir->d_inode,
-+ hidden_sto_dir_dentry->d_inode);
-+ dir->d_inode->i_nlink++;
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ return 0;
-+}
-+
-+
-+#if 0 /* unused */
-+
-+/*
-+ * Read "len" bytes from "filename" into "buf".
-+ * "buf" is in kernel space.
-+ */
-+int
-+mini_fo_read_file(const char *filename, void *buf, int len)
-+{
-+ file_t *filp;
-+ mm_segment_t oldfs;
-+ int bytes;
-+ /* Chroot? Maybe NULL isn't right here */
-+ filp = filp_open(filename, O_RDONLY, 0);
-+ if (!filp || IS_ERR(filp)) {
-+ printk("mini_fo_read_file err %d\n", (int) PTR_ERR(filp));
-+ return -1; /* or do something else */
-+ }
-+
-+ if (!filp->f_op->read)
-+ return -2; /* file(system) doesn't allow reads */
-+
-+ /* now read len bytes from offset 0 */
-+ filp->f_pos = 0; /* start offset */
-+ oldfs = get_fs();
-+ set_fs(KERNEL_DS);
-+ bytes = filp->f_op->read(filp, buf, len, &filp->f_pos);
-+ set_fs(oldfs);
-+
-+ /* close the file */
-+ fput(filp);
-+
-+ return bytes;
-+}
-+
-+
-+
-+/*
-+ * Write "len" bytes from "buf" to "filename"
-+ * "buf" is in kernel space.
-+ */
-+int
-+mini_fo_write_file(const char *filename, void *buf, int len)
-+{
-+ file_t *filp;
-+ mm_segment_t oldfs;
-+ int bytes;
-+ /* Chroot? Maybe NULL isn't right here */
-+ filp = filp_open(filename, O_RDWR|O_CREAT, 0640);
-+ if (!filp || IS_ERR(filp)) {
-+ printk("mini_fo_write_file err %d\n", (int) PTR_ERR(filp));
-+ return -1; /* or do something else */
-+ }
-+
-+ if (!filp->f_op->write)
-+ return -2; /* file(system) doesn't allow writes */
-+
-+ /* now write len bytes from offset 0 */
-+ filp->f_pos = 0; /* start offset */
-+ oldfs = get_fs();
-+ set_fs(KERNEL_DS);
-+ bytes = filp->f_op->write(filp, buf, len, &filp->f_pos);
-+ set_fs(oldfs);
-+
-+ /* close the file */
-+ fput(filp);
-+
-+ return bytes;
-+}
-+
-+#endif /* unused */
-+
---- /dev/null
-+++ b/fs/mini_fo/ChangeLog
-@@ -0,0 +1,281 @@
-+2006-01-24 Markus Klotzbuecher <mk@mary.denx.de>
-+
-+ * Add tons of ugly ifdefs to Ed L. Cashin's mutex patch to
-+ retain backwards compatibility.
-+
-+2006-01-24 Ed L. Cashin <ecashin@coraid.com>
-+
-+ * Support for the new mutex infrastructure
-+ (7892f2f48d165a34b0b8130c8a195dfd807b8cb6)
-+
-+2005-10-15 Markus Klotzbuecher <mk@localhost.localdomain>
-+
-+ * Bugfix for a serious memory leak in mini_fo_follow_link.
-+
-+2005-09-21 Markus Klotzbuecher <mk@mary>
-+
-+ * new release 0.6.1
-+
-+ * fix of a compiler warning due to changes in 2.6.13
-+
-+2005-09-21 Klaus Wenninger <klaus.wenninger@siemens.com>
-+
-+ * file.c: readdir: fix for a bug that caused directory entries
-+ to show up twice when using storage filesystems such as
-+ minixfs or pramfs.
-+
-+2005-06-30 Eric Lammerts <eric@lammerts.org>
-+
-+ * fix for an oops when overwriting a binary thats beeing
-+ executed.
-+
-+2005-06-09 <mk@mary>
-+
-+ * Renamed overlay to mini_fo-overlay.
-+
-+ * Added mini_fo-merge script to allow merging of storage and base
-+ after making modifications.
-+
-+2005-05-22 root <mk@mary>
-+
-+ * Added overlay script that allows to easily mount mini_fo ontop
-+ of a given base directory
-+
-+2005-05-10 <mk@mary>
-+
-+ * inode.c: xattr functions return -EOPNOSUPP instead of
-+ -ENOSUPP, what confuses "ls -l"
-+
-+ * Changed license from LGPL to GPL.
-+
-+2005-05-08 root <mk@mary>
-+
-+ * Makefile: clean it up and added make install and make
-+ uninstall.
-+
-+2005-05-06 <mk@mary>
-+
-+ * merged devel branch back to main. [v0-6-0-pre3]
-+
-+ * removed unused files print.c and fist_ioctl. [devel-0-0-18]
-+
-+ * ioctl: removed fist_ioctl stuff, that is not needed for
-+ now.
-+
-+2005-05-03 <mk@mary>
-+
-+ * file.c: simplified mini_fo_open and mini_fo_setattr using
-+ new state changing functions. [devel-0-0-17]
-+
-+ * inode.c: Fixed getattr state bug (see below) in 2.4 function
-+ mini_fo_inode revalidate.
-+
-+ * inode.c: found an other bug in mini_fo_getattr. States are not
-+ reliable in this function, as a file can be opened, unlinked and
-+ the getattr function called. This results in a deleted dentry
-+ with an inode. Fix is to ignore states and simply use the inode
-+ available.
-+
-+2005-04-29 <mk@mary>
-+
-+ * file.c: Bugfix and cleanup in fasync and fsync. [devel-0-0-16]
-+
-+ * file.c: do not use mini_fo_lock so the generic version is
-+ used (I guess).
-+
-+ * inode.c: getattr, never call getattr on lower files, as this
-+ will cause the inum to change.
-+
-+ * inode.c: rename_reg_file renamed to rename_nondir, as it
-+ doesn't matter as long it't not a dir. Removed all
-+ rename_dev_file etc.
-+
-+ * tagged as devel-0-0-15
-+
-+ * inode.c: added support for chosing support for extended
-+ attrs at compile time by XATTR define in mini_fo.h .
-+
-+ * inode.c: fixed mini_fo_getattr to use mini_fo inode and not
-+ lower again, what avoids inode number changes that confused
-+ rm again. This is the proper solution.
-+
-+2005-04-24 <mk@mary>
-+
-+ * all files: updated Copyright notive to 2005. [devel-0-0-14]
-+
-+ * inode.c: fixed mini_fo_getattr to not change the inode
-+ number, even if lower files change.
-+
-+ * super.c: fixed a bug that caused deleted base file to show
-+ up suddenly after some time, or after creating a special
-+ file. The problem was that after some time or after special
-+ file creating sync_sb_inodes is called by the vfs, that
-+ called our mini_fo_put_inode. There was (wrongly) called
-+ __meta_put_lists, that nuked the lists, although the inode
-+ was going to continue its life. Moving __meta_put_lists to
-+ mini_fo_clear_inode, where an inode is really destroyed,
-+ solved the problem.
-+
-+
-+2005-04-23 <mk@mary>
-+
-+ * state.c, aux.c: more cleaning up and
-+ simplifications. [devel-0-0-13]
-+
-+ * inode.c: implemented mini_fo_getattr, that was required for
-+ 2.6 because inode_revalidate has been remove there, and the
-+ old "du" bug returned.
-+
-+
-+2005-04-20 <mk@mary>
-+
-+ * aux.c: get_neg_sto_dentry(): allow to be called for dentries
-+ in state UNMODIFIED, NON_EXISTANT _and_ DELETED.
-+
-+2005-04-19 <mk@mary>
-+
-+ * Fixed a bug under 2.6 that caused files deleted via mini_fo
-+ not to be deleted properly and therefore the fs filled up
-+ untill no memory was left. [devel-0-0-12]
-+
-+ * Added basic hard link support. This means that creating
-+ hardlinks will work, but existing ones will be treated as
-+ individual files. [devel-0-0-11]
-+
-+2005-04-17 <mk@mary>
-+
-+ * Bugfixes
-+
-+2005-04-13 root <mk@mary>
-+
-+ * Added file state.c for the state transition
-+ functions. Doesn't work very well yet, though...
-+
-+2005-04-12 <mk@mary>
-+
-+ * Porting to 2.6 started, which is easier than expected, also
-+ due to Olivier previous work.
-+
-+2005-04-08 <mk@mary>
-+
-+ * Fixed the bug that caused du to return invalid sizes of
-+ directory trees. The problem was that
-+ mini_fo_inode_revalidate didn't always copy the attributes
-+ from the base inode properly.
-+
-+2005-04-01 Markus Klotzbuecher <mk@chasey>
-+
-+ * Merged devel branch back to main trunk and updated the
-+ RELEASE notes. This will be 0-6-0-pre1.
-+
-+2005-03-31 Markus Klotzbuecher <mk@chasey>
-+
-+ * Fixed some bugs in rename_reg_file, that only showed up in
-+ the kernel compile test. Kernel compiles cleanly ontop of
-+ mini_fo, now also make mrproper etc. work. Seems pretty stable.
-+
-+2005-03-28 Markus Klotzbuecher <mk@chasey>
-+
-+ * Many, many directory renaming bugfixes and a lot of other
-+ cleanup. Dir renaming seems to work relatively stable.
-+
-+2005-03-22 Markus Klotzbuecher <mk@chasey>
-+
-+ * Finished implementing lightweight directory renaming. Some
-+ basic testing indicates it works fine.
-+ Next is to implement testcases for the testsuite and confirm
-+ everything is really working ok.
-+
-+2005-03-18 Markus Klotzbuecher <mk@chasey>
-+
-+ * Finished implementing meta.c stuff required for directory
-+ renaming.
-+
-+2005-03-17 Markus Klotzbuecher <mk@chasey>
-+
-+ * Fixed all compile warnings + an extremly old bug that
-+ somehow crept in while reworking the wol stuff to the META
-+ system. Turning on -Werror again... :-)
-+
-+ * Fixed some bugs in the new rename_reg_file function.
-+
-+ * Rewrote mini_fo rename and split it into several
-+ subfunctions, that handle the different types
-+ seperately. Rewrote the regular file function aswell, as it
-+ was implemented somewhat inefficient.
-+
-+2005-03-16 Markus Klotzbuecher <mk@chasey>
-+
-+ * Implemented new META subsystem, removed old WOL stuff in favor
-+ if it.
-+
-+ * After some basic testing everything seems ok...
-+
-+2005-03-11 Markus Klotzbuecher <mk@chasey>
-+
-+ * Renaming a non regular file caused trouble because I always
-+ tried to copy the contents. Now I only do this for regular
-+ files. mini_fo_rename still isn't implemented properly, renaming
-+ of device files, symlinks etc. results in a empty regular file
-+ instead of the proper type.
-+
-+ * Directory renaming suddenly works! What a surprise! I guess
-+ this is because renaming is implemented as making a copy and
-+ removing the original. Still this might not work
-+ everywhere...
-+
-+2005-03-09 Markus Klotzbuecher <mk@chasey>
-+
-+ * Bugfix, when a mini_fo directory that exists in storage
-+ (state: MODIFIED, CREATED and DEL_REWRITTEN) is deleted, a
-+ possibly existing WOL file contained in it needs to be
-+ deleted too.
-+
-+ * Starting cleanup: defined state names in order to get rid of
-+ the state numbers.
-+
-+2005-03-08 Markus Klotzbuecher <mk@chasey>
-+
-+ * Makefile fix, fist_ioctl was built against wrong sources if ARCH=um
-+
-+ * Fixed a bug in dentry.c, mini_fo_d_hash. In state 4 =
-+ DEL_REWRITTEN the hash was calculated from the base dentry,
-+ which was wrong and and caused assertions in
-+ __mini_fo_hidden_dentry to fail.
-+
-+2005-02-21 <mk@mary>
-+
-+ * Implemented directory deleting (inode.c)
-+
-+ * main.c: made mini_fo_parse_options a little more robust.
-+
-+2004-12-22 <mk@mary>
-+
-+ * Makefile cleanup and uml stuff, removed unneccessary files
-+
-+ * Created a new and hopefully more informative README
-+
-+ * CHANGELOG: created a new CHANGELOG and added old entries reversely
-+
-+
-+2004-10-24 Gleb Natapov <gleb@nbase.co.il>
-+
-+ * Fix: owner and group where not correctly copied from base to
-+ storage.
-+
-+
-+2004-10-05 Gleb Natapov <gleb@nbase.co.il>
-+
-+ * Implementation of fsync, fasync and lock mini_fo functions.
-+
-+
-+2004-09-29 Bob Lee <bob@pantasys.com>
-+
-+ * Fix of a serious pointer bug
-+
-+
-+2004-09-28 Gleb Natapov <gleb@nbase.co.il>
-+
-+ * Implementation of mini_fo_mknod and mini_fo_rename, support
-+ for device files.
-+
---- /dev/null
-+++ b/fs/mini_fo/dentry.c
-@@ -0,0 +1,244 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+/*
-+ * THIS IS A BOOLEAN FUNCTION: returns 1 if valid, 0 otherwise.
-+ */
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_d_revalidate(dentry_t *dentry, struct nameidata *nd)
-+#else
-+mini_fo_d_revalidate(dentry_t *dentry, int flags)
-+#endif
-+{
-+ int err1 = 1; /* valid = 1, invalid = 0 */
-+ int err2 = 1;
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ hidden_dentry = dtohd(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(hidden_dentry &&
-+ hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_revalidate) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err1 = hidden_dentry->d_op->d_revalidate(hidden_dentry, nd);
-+#else
-+ err1 = hidden_dentry->d_op->d_revalidate(hidden_dentry, flags);
-+#endif
-+ }
-+ if(hidden_sto_dentry &&
-+ hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_revalidate) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err2 = hidden_sto_dentry->d_op->d_revalidate(hidden_sto_dentry,
-+ nd);
-+#else
-+ err2 = hidden_sto_dentry->d_op->d_revalidate(hidden_sto_dentry,
-+ flags);
-+#endif
-+ }
-+
-+ /* mk: if one of the lower level dentries are valid,
-+ * the mini_fo dentry is too.
-+ */
-+ return (err1 || err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_d_hash(dentry_t *dentry, qstr_t *name)
-+{
-+ int err = 0;
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+ /* hidden_dentry = mini_fo_hidden_dentry(dentry);
-+ * hidden_sto_dentry = mini_fo_hidden_sto_dentry(dentry); */
-+
-+ /* state 1, 3, 4, 5: build the hash for the storage dentry */
-+ if((dtopd(dentry)->state == MODIFIED) ||
-+ (dtopd(dentry)->state == CREATED) ||
-+ (dtopd(dentry)->state == DEL_REWRITTEN) ||
-+ (dtopd(dentry)->state == DELETED)) {
-+ hidden_sto_dentry = dtohd2(dentry);
-+ if(hidden_sto_dentry &&
-+ hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_hash) {
-+ err = hidden_sto_dentry->d_op->d_hash(hidden_sto_dentry, name);
-+ }
-+ goto out;
-+ }
-+ /* state 2: build the hash for the base dentry */
-+ if(dtopd(dentry)->state == UNMODIFIED) {
-+ hidden_dentry = dtohd(dentry);
-+ if(hidden_dentry &&
-+ hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_hash) {
-+ err = hidden_dentry->d_op->d_hash(hidden_dentry, name);
-+ }
-+ goto out;
-+ }
-+ /* state 6: build hash for the dentry that exists */
-+ if(dtopd(dentry)->state == NON_EXISTANT) {
-+ hidden_sto_dentry = dtohd2(dentry);
-+ if(hidden_sto_dentry &&
-+ hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_hash) {
-+ err = hidden_sto_dentry->d_op->d_hash(hidden_sto_dentry, name);
-+ goto out;
-+ }
-+ hidden_dentry = dtohd(dentry);
-+ if(hidden_dentry &&
-+ hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_hash) {
-+ err = hidden_dentry->d_op->d_hash(hidden_dentry, name);
-+ goto out;
-+ }
-+ }
-+
-+ printk(KERN_CRIT "mini_fo: d_hash: invalid state detected.\n");
-+
-+ out:
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_d_compare(dentry_t *dentry, qstr_t *a, qstr_t *b)
-+{
-+ int err;
-+ dentry_t *hidden_dentry=NULL;
-+
-+ /* hidden_dentry = mini_fo_hidden_dentry(dentry); */
-+ if(dtohd2(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else if(dtohd(dentry))
-+ hidden_dentry = dtohd(dentry);
-+
-+ if (hidden_dentry && hidden_dentry->d_op && hidden_dentry->d_op->d_compare) {
-+ err = hidden_dentry->d_op->d_compare(hidden_dentry, a, b);
-+ } else {
-+ err = ((a->len != b->len) || memcmp(a->name, b->name, b->len));
-+ }
-+
-+ return err;
-+}
-+
-+
-+int
-+mini_fo_d_delete(dentry_t *dentry)
-+{
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+ int err = 0;
-+
-+ /* this could be a negative dentry, so check first */
-+ if (!dtopd(dentry)) {
-+ printk(KERN_CRIT "mini_fo_d_delete: negative dentry passed.\n");
-+ goto out;
-+ }
-+ hidden_dentry = dtohd(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(hidden_dentry) {
-+ if(hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_delete) {
-+ err = hidden_dentry->d_op->d_delete(hidden_dentry);
-+ }
-+ }
-+ if(hidden_sto_dentry) {
-+ if(hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_delete) {
-+ err = hidden_sto_dentry->d_op->d_delete(hidden_sto_dentry);
-+ }
-+ }
-+
-+ out:
-+ return err;
-+}
-+
-+
-+void
-+mini_fo_d_release(dentry_t *dentry)
-+{
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+
-+ /* this could be a negative dentry, so check first */
-+ if (!dtopd(dentry)) {
-+ printk(KERN_CRIT "mini_fo_d_release: no private data.\n");
-+ goto out;
-+ }
-+ hidden_dentry = dtohd(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(hidden_dentry) {
-+ /* decrement hidden dentry's counter and free its inode */
-+ dput(hidden_dentry);
-+ }
-+ if(hidden_sto_dentry) {
-+ /* decrement hidden dentry's counter and free its inode */
-+ dput(hidden_sto_dentry);
-+ }
-+
-+ /* free private data (mini_fo_dentry_info) here */
-+ kfree(dtopd(dentry));
-+ __dtopd(dentry) = NULL; /* just to be safe */
-+ out:
-+ return;
-+}
-+
-+
-+/*
-+ * we don't really need mini_fo_d_iput, because dentry_iput will call iput() if
-+ * mini_fo_d_iput is not defined. We left this implemented for ease of
-+ * tracing/debugging.
-+ */
-+void
-+mini_fo_d_iput(dentry_t *dentry, inode_t *inode)
-+{
-+ iput(inode);
-+}
-+
-+
-+struct dentry_operations mini_fo_dops = {
-+ d_revalidate: mini_fo_d_revalidate,
-+ d_hash: mini_fo_d_hash,
-+ d_compare: mini_fo_d_compare,
-+ d_release: mini_fo_d_release,
-+ d_delete: mini_fo_d_delete,
-+ d_iput: mini_fo_d_iput,
-+};
---- /dev/null
-+++ b/fs/mini_fo/file.c
-@@ -0,0 +1,713 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+#define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1))
-+
-+/*******************
-+ * File Operations *
-+ *******************/
-+
-+STATIC loff_t
-+mini_fo_llseek(file_t *file, loff_t offset, int origin)
-+{
-+ loff_t err;
-+ file_t *hidden_file = NULL;
-+
-+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+ /* Check if trying to llseek from a directory */
-+ err = -EISDIR;
-+ goto out;
-+ }
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ /* always set hidden position to this one */
-+ hidden_file->f_pos = file->f_pos;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ memcpy(&(hidden_file->f_ra),
-+ &(file->f_ra),
-+ sizeof(struct file_ra_state));
-+#else
-+ if (file->f_reada) { /* update readahead information if needed */
-+ hidden_file->f_reada = file->f_reada;
-+ hidden_file->f_ramax = file->f_ramax;
-+ hidden_file->f_raend = file->f_raend;
-+ hidden_file->f_ralen = file->f_ralen;
-+ hidden_file->f_rawin = file->f_rawin;
-+ }
-+#endif
-+ if (hidden_file->f_op && hidden_file->f_op->llseek)
-+ err = hidden_file->f_op->llseek(hidden_file, offset, origin);
-+ else
-+ err = generic_file_llseek(hidden_file, offset, origin);
-+
-+ if (err < 0)
-+ goto out;
-+
-+ if (err != file->f_pos) {
-+ file->f_pos = err;
-+ // ION maybe this?
-+ // file->f_pos = hidden_file->f_pos;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ file->f_reada = 0;
-+#endif
-+ file->f_version++;
-+ }
-+
-+ out:
-+ return err;
-+}
-+
-+
-+/* mk: fanout capable */
-+STATIC ssize_t
-+mini_fo_read(file_t *file, char *buf, size_t count, loff_t *ppos)
-+{
-+ int err = -EINVAL;
-+ file_t *hidden_file = NULL;
-+ loff_t pos = *ppos;
-+
-+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+ /* Check if trying to read from a directory */
-+ /* printk(KERN_CRIT "mini_fo_read: ERROR: trying to read data from a directory.\n"); */
-+ err = -EISDIR;
-+ goto out;
-+ }
-+
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ if (!hidden_file->f_op || !hidden_file->f_op->read)
-+ goto out;
-+
-+ err = hidden_file->f_op->read(hidden_file, buf, count, &pos);
-+ *ppos = pos;
-+
-+ if (err >= 0) {
-+ /* atime should also be updated for reads of size zero or more */
-+ fist_copy_attr_atime(file->f_dentry->d_inode,
-+ hidden_file->f_dentry->d_inode);
-+ }
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ /*
-+ * MAJOR HACK
-+ * because pread() does not have any way to tell us that it is
-+ * our caller, then we don't know for sure if we have to update
-+ * the file positions. This hack relies on read() having passed us
-+ * the "real" pointer of its struct file's f_pos field.
-+ */
-+ if (ppos == &file->f_pos)
-+ hidden_file->f_pos = *ppos = pos;
-+ if (hidden_file->f_reada) { /* update readahead information if needed */
-+ file->f_reada = hidden_file->f_reada;
-+ file->f_ramax = hidden_file->f_ramax;
-+ file->f_raend = hidden_file->f_raend;
-+ file->f_ralen = hidden_file->f_ralen;
-+ file->f_rawin = hidden_file->f_rawin;
-+ }
-+#else
-+ memcpy(&(file->f_ra),&(hidden_file->f_ra),sizeof(struct file_ra_state));
-+#endif
-+
-+ out:
-+ return err;
-+}
-+
-+
-+/* this mini_fo_write() does not modify data pages! */
-+STATIC ssize_t
-+mini_fo_write(file_t *file, const char *buf, size_t count, loff_t *ppos)
-+{
-+ int err = -EINVAL;
-+ file_t *hidden_file = NULL;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ loff_t pos = *ppos;
-+
-+ /* mk: fan out: */
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ /* This is bad! We have no storage file to write to. This
-+ * should never happen because if a file is opened for
-+ * writing, a copy should have been made earlier.
-+ */
-+ printk(KERN_CRIT "mini_fo: write : ERROR, no storage file to write.\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ }
-+
-+ inode = file->f_dentry->d_inode;
-+ hidden_inode = itohi2(inode);
-+ if(!hidden_inode) {
-+ printk(KERN_CRIT "mini_fo: write: no sto inode found, not good.\n");
-+ goto out;
-+ }
-+
-+ if (!hidden_file->f_op || !hidden_file->f_op->write)
-+ goto out;
-+
-+ /* adjust for append -- seek to the end of the file */
-+ if (file->f_flags & O_APPEND)
-+ pos = inode->i_size;
-+
-+ err = hidden_file->f_op->write(hidden_file, buf, count, &pos);
-+
-+ /*
-+ * copy ctime and mtime from lower layer attributes
-+ * atime is unchanged for both layers
-+ */
-+ if (err >= 0)
-+ fist_copy_attr_times(inode, hidden_inode);
-+
-+ *ppos = pos;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ /*
-+ * XXX: MAJOR HACK
-+ *
-+ * because pwrite() does not have any way to tell us that it is
-+ * our caller, then we don't know for sure if we have to update
-+ * the file positions. This hack relies on write() having passed us
-+ * the "real" pointer of its struct file's f_pos field.
-+ */
-+ if (ppos == &file->f_pos)
-+ hidden_file->f_pos = *ppos = pos;
-+#endif
-+ /* update this inode's size */
-+ if (pos > inode->i_size)
-+ inode->i_size = pos;
-+
-+ out:
-+ return err;
-+}
-+
-+/* Global variable to hold a file_t pointer.
-+ * This serves to allow mini_fo_filldir function to know which file is
-+ * beeing read, which is required for two reasons:
-+ *
-+ * - be able to call wol functions in order to avoid listing deleted
-+ * base files.
-+ * - if we're reading a directory which is in state 1, we need to
-+ * maintain a list (in mini_fo_filldir) of which files allready
-+ * have been copied to userspace,to detect files existing in base
-+ * and storage and not list them twice.
-+ */
-+filldir_t mini_fo_filldir_orig;
-+file_t *mini_fo_filldir_file;
-+
-+/* mainly copied from fs/readdir.c */
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_filldir(void * __buf, const char * name, int namlen, loff_t offset,
-+ u64 ino, unsigned int d_type)
-+#else
-+mini_fo_filldir(void * __buf, const char * name, int namlen, loff_t offset,
-+ ino_t ino, unsigned int d_type)
-+#endif
-+{
-+ struct getdents_callback * buf = (struct getdents_callback *) __buf;
-+ file_t* file = mini_fo_filldir_file;
-+
-+ /* In theses states we filter meta files in storage (WOL) */
-+ if(file && (dtopd(file->f_dentry)->state == MODIFIED ||
-+ dtopd(file->f_dentry)->state == CREATED ||
-+ dtopd(file->f_dentry)->state == DEL_REWRITTEN)) {
-+
-+ int tmp = strlen(META_FILENAME);
-+ if(tmp == namlen) {
-+ if(!strncmp(name, META_FILENAME, namlen))
-+ return 0;
-+ }
-+ }
-+
-+ /* check if we are merging the contents of storage and base */
-+ if(file && dtopd(file->f_dentry)->state == MODIFIED) {
-+ /* check if we are still reading storage contents, if
-+ * yes, we just save the name of the file for duplicate
-+ * checking later. */
-+
-+ if(!ftopd(file)->rd.sto_done) {
-+ /* put file into ndl list */
-+ if(ndl_add_entry(&ftopd(file)->rd, name, namlen))
-+ printk(KERN_CRIT "mini_fo_filldir: Error adding to ndl.\n");
-+ } else {
-+ /* check if file has been deleted */
-+ if(meta_check_d_entry(file->f_dentry, name, namlen))
-+ return 0;
-+
-+ /* do duplicate checking */
-+ if(ndl_check_entry(&ftopd(file)->rd, name, namlen))
-+ return 0;
-+ }
-+ }
-+
-+ return mini_fo_filldir_orig(buf, name, namlen, offset, ino, d_type);
-+}
-+
-+
-+STATIC int
-+mini_fo_readdir(file_t *file, void *dirent, filldir_t filldir)
-+{
-+ int err = 0;/* mk: ??? -ENOTDIR; */
-+ file_t *hidden_file = NULL;
-+ file_t *hidden_sto_file = NULL;
-+ inode_t *inode;
-+ struct getdents_callback *buf;
-+ int oldcount;
-+
-+#if defined(FIST_FILTER_NAME) || defined(FIST_FILTER_SCA)
-+ struct mini_fo_getdents_callback buf;
-+#endif /* FIST_FILTER_NAME || FIST_FILTER_SCA */
-+
-+ buf = (struct getdents_callback *) dirent;
-+ oldcount = buf->count;
-+ inode = file->f_dentry->d_inode;
-+ mini_fo_filldir_file = file;
-+ mini_fo_filldir_orig = filldir;
-+
-+ ftopd(file)->rd.sto_done = 0;
-+ do {
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_sto_file = ftohf2(file);
-+ err = vfs_readdir(hidden_sto_file, mini_fo_filldir, dirent);
-+ file->f_pos = hidden_sto_file->f_pos;
-+ if (err > 0)
-+ fist_copy_attr_atime(inode, hidden_sto_file->f_dentry->d_inode);
-+ /* not finshed yet, we'll be called again */
-+ if (buf->count != oldcount)
-+ break;
-+ }
-+
-+ ftopd(file)->rd.sto_done = 1;
-+
-+ if(ftohf(file)) {
-+ hidden_file = ftohf(file);
-+ err = vfs_readdir(hidden_file, mini_fo_filldir, dirent);
-+ file->f_pos = hidden_file->f_pos;
-+ if (err > 0)
-+ fist_copy_attr_atime(inode, hidden_file->f_dentry->d_inode);
-+ }
-+
-+ }
-+ } while (0);
-+
-+ /* mk:
-+ * we need to check if all the directory data has been copied to userspace,
-+ * or if we will be called again by userspace to complete the operation.
-+ */
-+ if(buf->count == oldcount) {
-+ ndl_put_list(&ftopd(file)->rd);
-+ }
-+
-+ /* unset this, safe */
-+ mini_fo_filldir_file = NULL;
-+ return err;
-+}
-+
-+
-+STATIC unsigned int
-+mini_fo_poll(file_t *file, poll_table *wait)
-+{
-+ unsigned int mask = DEFAULT_POLLMASK;
-+ file_t *hidden_file = NULL;
-+
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ if (!hidden_file->f_op || !hidden_file->f_op->poll)
-+ goto out;
-+
-+ mask = hidden_file->f_op->poll(hidden_file, wait);
-+
-+ out:
-+ return mask;
-+}
-+
-+/* FIST-LITE special version of mmap */
-+STATIC int
-+mini_fo_mmap(file_t *file, vm_area_t *vma)
-+{
-+ int err = 0;
-+ file_t *hidden_file = NULL;
-+
-+ /* fanout capability */
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ ASSERT(hidden_file != NULL);
-+ ASSERT(hidden_file->f_op != NULL);
-+ ASSERT(hidden_file->f_op->mmap != NULL);
-+
-+ vma->vm_file = hidden_file;
-+ err = hidden_file->f_op->mmap(hidden_file, vma);
-+ get_file(hidden_file); /* make sure it doesn't get freed on us */
-+ fput(file); /* no need to keep extra ref on ours */
-+
-+ return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_open(inode_t *inode, file_t *file)
-+{
-+ int err = 0;
-+ int hidden_flags;
-+ file_t *hidden_file = NULL;
-+ dentry_t *hidden_dentry = NULL;
-+
-+ /* fanout stuff */
-+ file_t *hidden_sto_file = NULL;
-+ dentry_t *hidden_sto_dentry = NULL;
-+
-+ __ftopd(file) =
-+ kmalloc(sizeof(struct mini_fo_file_info), GFP_KERNEL);
-+ if (!ftopd(file)) {
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+
-+ /* init the readdir_helper structure */
-+ INIT_LIST_HEAD(&ftopd(file)->rd.ndl_list);
-+ ftopd(file)->rd.ndl_size = 0;
-+
-+ /* In certain paths this could stay uninitalized and cause trouble */
-+ ftohf(file) = NULL;
-+ ftohf2(file) = NULL;
-+ hidden_flags = file->f_flags;
-+
-+ /* create storage files? */
-+ if(dtost(file->f_dentry) == UNMODIFIED) {
-+ if(!IS_WRITE_FLAG(file->f_flags)) {
-+ hidden_dentry = dtohd(file->f_dentry);
-+ dget(hidden_dentry);
-+ /* dentry_open will decrement mnt refcnt if err.
-+ * otherwise fput() will do an mntput() for us upon file close. */
-+ mntget(stopd(inode->i_sb)->hidden_mnt);
-+ hidden_file = dentry_open(hidden_dentry,
-+ stopd(inode->i_sb)->hidden_mnt,
-+ hidden_flags);
-+ if (IS_ERR(hidden_file)) {
-+ err = PTR_ERR(hidden_file);
-+ dput(hidden_dentry);
-+ goto out;
-+ }
-+ ftohf(file) = hidden_file; /* link two files */
-+ goto out;
-+ }
-+ else {
-+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+ err = dir_unmod_to_mod(file->f_dentry);
-+ } else
-+ err = nondir_unmod_to_mod(file->f_dentry, 1);
-+
-+ if (err) {
-+ printk("mini_fo_open: ERROR creating storage file.\n");
-+ goto out;
-+ }
-+ }
-+ }
-+ hidden_sto_dentry = dtohd2(file->f_dentry);
-+ dget(hidden_sto_dentry);
-+
-+ if(dtopd(file->f_dentry)->state == MODIFIED) {
-+ /* Directorys are special, interpose on both lower level files */
-+ if(S_ISDIR(itohi(inode)->i_mode)) {
-+ /* check for invalid file types of lower level files */
-+ if(!(S_ISDIR(itohi(inode)->i_mode) && S_ISDIR(itohi2(inode)->i_mode))) {
-+ printk(KERN_CRIT "mini_fo_open: meta data corruption detected.\n");
-+ dput(hidden_sto_dentry);
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* lower level directorys are ok, open the base file */
-+ hidden_dentry = dtohd(file->f_dentry);
-+ dget(hidden_dentry);
-+
-+ mntget(stopd(inode->i_sb)->hidden_mnt);
-+ hidden_file = dentry_open(hidden_dentry,
-+ stopd(inode->i_sb)->hidden_mnt,
-+ hidden_flags);
-+ if (IS_ERR(hidden_file)) {
-+ err = PTR_ERR(hidden_file);
-+ dput(hidden_dentry);
-+ dput(hidden_sto_dentry);
-+ goto out;
-+ }
-+ ftohf(file) = hidden_file; /* link the two files */
-+ }
-+ }
-+
-+ if(!exists_in_storage(file->f_dentry)) {
-+ printk(KERN_CRIT "mini_fo_open: invalid file state detected.\n");
-+ err = -EINVAL;
-+ dput(hidden_sto_dentry);
-+
-+ /* If the base file has been opened, we need to close it here */
-+ if(ftohf(file)) {
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ hidden_file->f_op->flush(hidden_file, NULL);
-+#else
-+ hidden_file->f_op->flush(hidden_file);
-+#endif
-+ dput(hidden_dentry);
-+ }
-+ goto out;
-+ }
-+
-+ /* ok, now we can safely open the storage file */
-+ mntget(stopd(inode->i_sb)->hidden_mnt2);
-+ hidden_sto_file = dentry_open(hidden_sto_dentry,
-+ stopd(inode->i_sb)->hidden_mnt2,
-+ hidden_flags);
-+
-+ /* dentry_open dputs the dentry if it fails */
-+ if (IS_ERR(hidden_sto_file)) {
-+ err = PTR_ERR(hidden_sto_file);
-+ /* close base file if open */
-+ if(ftohf(file)) {
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ hidden_file->f_op->flush(hidden_file, NULL);
-+#else
-+ hidden_file->f_op->flush(hidden_file);
-+#endif
-+ dput(hidden_dentry);
-+ }
-+ goto out;
-+ }
-+ ftohf2(file) = hidden_sto_file; /* link storage file */
-+
-+ out:
-+ if (err < 0 && ftopd(file)) {
-+ kfree(ftopd(file));
-+ }
-+ return err;
-+}
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_flush(file_t *file, fl_owner_t id)
-+#else
-+mini_fo_flush(file_t *file)
-+#endif
-+{
-+ int err1 = 0; /* assume ok (see open.c:close_fp) */
-+ int err2 = 0;
-+ file_t *hidden_file = NULL;
-+
-+ check_mini_fo_file(file);
-+
-+ /* mk: we don't do any state checking here, as its not worth the time.
-+ * Just flush the lower level files if they exist.
-+ */
-+ if(ftopd(file) != NULL) {
-+ if(ftohf(file) != NULL) {
-+ hidden_file = ftohf(file);
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ err1 = hidden_file->f_op->flush(hidden_file, id);
-+#else
-+ err1 = hidden_file->f_op->flush(hidden_file);
-+#endif
-+ }
-+ if(ftohf2(file) != NULL) {
-+ hidden_file = ftohf2(file);
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ err2 = hidden_file->f_op->flush(hidden_file, id);
-+#else
-+ err2 = hidden_file->f_op->flush(hidden_file);
-+#endif
-+ }
-+ }
-+ return (err1 | err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_release(inode_t *inode, file_t *file)
-+{
-+ int err = 0;
-+ file_t *hidden_file = NULL;
-+
-+ if (ftopd(file) != NULL) {
-+ if(ftohf(file)) {
-+ hidden_file = ftohf(file);
-+ fput(hidden_file);
-+ }
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ fput(hidden_file);
-+ }
-+ kfree(ftopd(file));
-+ }
-+ return err;
-+}
-+
-+STATIC int
-+mini_fo_fsync(file_t *file, dentry_t *dentry, int datasync)
-+{
-+ int err1 = 0;
-+ int err2 = 0;
-+ file_t *hidden_file = NULL;
-+ dentry_t *hidden_dentry;
-+
-+ check_mini_fo_file(file);
-+
-+ if ((hidden_file = ftohf(file)) != NULL) {
-+ hidden_dentry = dtohd(dentry);
-+ if (hidden_file->f_op && hidden_file->f_op->fsync) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ err1 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ }
-+
-+ if ((hidden_file = ftohf2(file)) != NULL) {
-+ hidden_dentry = dtohd2(dentry);
-+ if (hidden_file->f_op && hidden_file->f_op->fsync) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ err2 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ }
-+ else
-+ goto err;
-+
-+err:
-+ return (err1 || err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_fasync(int fd, file_t *file, int flag)
-+{
-+ int err1 = 0;
-+ int err2 = 0;
-+
-+ file_t *hidden_file = NULL;
-+
-+ check_mini_fo_file(file);
-+
-+ if((hidden_file = ftohf(file)) != NULL) {
-+ err1 = hidden_file->f_op->fasync(fd, hidden_file, flag);
-+ }
-+ if((hidden_file = ftohf2(file)) != NULL) {
-+ err2 = hidden_file->f_op->fasync(fd, hidden_file, flag);
-+ }
-+
-+ return (err1 || err2);
-+}
-+
-+
-+
-+struct file_operations mini_fo_dir_fops =
-+ {
-+ read: generic_read_dir,
-+ write: mini_fo_write,
-+ readdir: mini_fo_readdir,
-+ poll: mini_fo_poll,
-+ /* ioctl: mini_fo_ioctl, */
-+ mmap: mini_fo_mmap,
-+ open: mini_fo_open,
-+ flush: mini_fo_flush,
-+ release: mini_fo_release,
-+ fsync: mini_fo_fsync,
-+ fasync: mini_fo_fasync,
-+ /* not needed lock: mini_fo_lock, */
-+ /* not needed: readv */
-+ /* not needed: writev */
-+ /* not implemented: sendpage */
-+ /* not implemented: get_unmapped_area */
-+ };
-+
-+struct file_operations mini_fo_main_fops =
-+ {
-+ llseek: mini_fo_llseek,
-+ read: mini_fo_read,
-+ write: mini_fo_write,
-+ readdir: mini_fo_readdir,
-+ poll: mini_fo_poll,
-+ /* ioctl: mini_fo_ioctl, */
-+ mmap: mini_fo_mmap,
-+ open: mini_fo_open,
-+ flush: mini_fo_flush,
-+ release: mini_fo_release,
-+ fsync: mini_fo_fsync,
-+ fasync: mini_fo_fasync,
-+ /* not needed: lock: mini_fo_lock, */
-+ /* not needed: readv */
-+ /* not needed: writev */
-+ /* not implemented: sendpage */
-+ /* not implemented: get_unmapped_area */
-+ };
---- /dev/null
-+++ b/fs/mini_fo/fist.h
-@@ -0,0 +1,252 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifndef __FIST_H_
-+#define __FIST_H_
-+
-+/*
-+ * KERNEL ONLY CODE:
-+ */
-+#ifdef __KERNEL__
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
-+#include <linux/autoconf.h>
-+#else
-+#include <linux/config.h>
-+#endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+#ifdef CONFIG_MODVERSIONS
-+# define MODVERSIONS
-+# include <linux/modversions.h>
-+#endif /* CONFIG_MODVERSIONS */
-+#endif /* KERNEL_VERSION < 2.6.0 */
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/string.h>
-+#include <linux/stat.h>
-+#include <linux/errno.h>
-+#include <linux/wait.h>
-+#include <linux/limits.h>
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+#include <linux/locks.h>
-+#else
-+#include <linux/buffer_head.h>
-+#include <linux/pagemap.h>
-+#include <linux/namei.h>
-+#include <linux/module.h>
-+#include <linux/mount.h>
-+#include <linux/page-flags.h>
-+#include <linux/writeback.h>
-+#include <linux/statfs.h>
-+#endif
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/file.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <linux/poll.h>
-+#include <linux/list.h>
-+#include <linux/init.h>
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)
-+#include <linux/xattr.h>
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#include <linux/security.h>
-+#endif
-+
-+#include <linux/swap.h>
-+
-+#include <asm/system.h>
-+/* #include <asm/segment.h> */
-+#include <asm/mman.h>
-+#include <linux/seq_file.h>
-+
-+/*
-+ * MACROS:
-+ */
-+
-+/* those mapped to ATTR_* were copied from linux/fs.h */
-+#define FA_MODE ATTR_MODE
-+#define FA_UID ATTR_UID
-+#define FA_GID ATTR_GID
-+#define FA_SIZE ATTR_SIZE
-+#define FA_ATIME ATTR_ATIME
-+#define FA_MTIME ATTR_MTIME
-+#define FA_CTIME ATTR_CTIME
-+#define FA_ATIME_SET ATTR_ATIME_SET
-+#define FA_MTIME_SET ATTR_MTIME_SET
-+#define FA_FORCE ATTR_FORCE
-+#define FA_ATTR_FLAGS ATTR_ATTR_FLAG
-+
-+/* must be greater than all other ATTR_* flags! */
-+#define FA_NLINK 2048
-+#define FA_BLKSIZE 4096
-+#define FA_BLOCKS 8192
-+#define FA_TIMES (FA_ATIME|FA_MTIME|FA_CTIME)
-+#define FA_ALL 0
-+
-+/* macros to manage changes between kernels */
-+#define INODE_DATA(i) (&(i)->i_data)
-+
-+#define MIN(x,y) ((x < y) ? (x) : (y))
-+#define MAX(x,y) ((x > y) ? (x) : (y))
-+#define MAXPATHLEN PATH_MAX
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5)
-+# define lookup_one_len(a,b,c) lookup_one(a,b)
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) */
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8)
-+# define generic_file_llseek default_llseek
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8) */
-+
-+#ifndef SEEK_SET
-+# define SEEK_SET 0
-+#endif /* not SEEK_SET */
-+
-+#ifndef SEEK_CUR
-+# define SEEK_CUR 1
-+#endif /* not SEEK_CUR */
-+
-+#ifndef SEEK_END
-+# define SEEK_END 2
-+#endif /* not SEEK_END */
-+
-+#ifndef DEFAULT_POLLMASK
-+# define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)
-+#endif /* not DEFAULT_POLLMASK */
-+
-+/* XXX: fix this so fistgen generates kfree() code directly */
-+#define kfree_s(a,b) kfree(a)
-+
-+/*
-+ * TYPEDEFS:
-+ */
-+typedef struct dentry dentry_t;
-+typedef struct file file_t;
-+typedef struct inode inode_t;
-+typedef inode_t vnode_t;
-+typedef struct page page_t;
-+typedef struct qstr qstr_t;
-+typedef struct super_block super_block_t;
-+typedef super_block_t vfs_t;
-+typedef struct vm_area_struct vm_area_t;
-+
-+
-+/*
-+ * EXTERNALS:
-+ */
-+
-+#define FPPF(str,page) printk("PPF %s 0x%x/%d: Lck:%d Err:%d Ref:%d Upd:%d Other::%d:%d:%d:%d:\n", \
-+ str, \
-+ (int) page, \
-+ (int) page->index, \
-+ (PageLocked(page) ? 1 : 0), \
-+ (PageError(page) ? 1 : 0), \
-+ (PageReferenced(page) ? 1 : 0), \
-+ (Page_Uptodate(page) ? 1 : 0), \
-+ (PageDecrAfter(page) ? 1 : 0), \
-+ (PageSlab(page) ? 1 : 0), \
-+ (PageSwapCache(page) ? 1 : 0), \
-+ (PageReserved(page) ? 1 : 0) \
-+ )
-+#define EZKDBG printk("EZK %s:%d:%s\n",__FILE__,__LINE__,__FUNCTION__)
-+#if 0
-+# define EZKDBG1 printk("EZK %s:%d\n",__FILE__,__LINE__)
-+#else
-+# define EZKDBG1
-+#endif
-+
-+extern int fist_get_debug_value(void);
-+extern int fist_set_debug_value(int val);
-+#if 0 /* mini_fo doesn't need these */
-+extern void fist_dprint_internal(int level, char *str,...);
-+extern void fist_print_dentry(char *str, const dentry_t *dentry);
-+extern void fist_print_inode(char *str, const inode_t *inode);
-+extern void fist_print_file(char *str, const file_t *file);
-+extern void fist_print_buffer_flags(char *str, struct buffer_head *buffer);
-+extern void fist_print_page_flags(char *str, page_t *page);
-+extern void fist_print_page_bytes(char *str, page_t *page);
-+extern void fist_print_pte_flags(char *str, const page_t *page);
-+extern void fist_checkinode(inode_t *inode, char *msg);
-+extern void fist_print_sb(char *str, const super_block_t *sb);
-+
-+/* §$% by mk: special debug functions */
-+extern void fist_mk_print_dentry(char *str, const dentry_t *dentry);
-+extern void fist_mk_print_inode(char *str, const inode_t *inode);
-+
-+extern char *add_indent(void);
-+extern char *del_indent(void);
-+#endif/* mini_fo doesn't need these */
-+
-+
-+#define STATIC
-+#define ASSERT(EX) \
-+do { \
-+ if (!(EX)) { \
-+ printk(KERN_CRIT "ASSERTION FAILED: %s at %s:%d (%s)\n", #EX, \
-+ __FILE__, __LINE__, __FUNCTION__); \
-+ (*((char *)0))=0; \
-+ } \
-+} while (0)
-+/* same ASSERT, but tell me who was the caller of the function */
-+#define ASSERT2(EX) \
-+do { \
-+ if (!(EX)) { \
-+ printk(KERN_CRIT "ASSERTION FAILED (caller): %s at %s:%d (%s)\n", #EX, \
-+ file, line, func); \
-+ (*((char *)0))=0; \
-+ } \
-+} while (0)
-+
-+#if 0 /* mini_fo doesn't need these */
-+#define dprintk(format, args...) printk(KERN_DEBUG format, ##args)
-+#define fist_dprint(level, str, args...) fist_dprint_internal(level, KERN_DEBUG str, ## args)
-+#define print_entry_location() fist_dprint(4, "%sIN: %s %s:%d\n", add_indent(), __FUNCTION__, __FILE__, __LINE__)
-+#define print_exit_location() fist_dprint(4, "%s OUT: %s %s:%d\n", del_indent(), __FUNCTION__, __FILE__, __LINE__)
-+#define print_exit_status(status) fist_dprint(4, "%s OUT: %s %s:%d, STATUS: %d\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, status)
-+#define print_exit_pointer(status) \
-+do { \
-+ if (IS_ERR(status)) \
-+ fist_dprint(4, "%s OUT: %s %s:%d, RESULT: %ld\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, PTR_ERR(status)); \
-+ else \
-+ fist_dprint(4, "%s OUT: %s %s:%d, RESULT: 0x%x\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, PTR_ERR(status)); \
-+} while (0)
-+#endif/* mini_fo doesn't need these */
-+
-+#endif /* __KERNEL__ */
-+
-+
-+/*
-+ * DEFINITIONS FOR USER AND KERNEL CODE:
-+ * (Note: ioctl numbers 1--9 are reserved for fistgen, the rest
-+ * are auto-generated automatically based on the user's .fist file.)
-+ */
-+# define FIST_IOCTL_GET_DEBUG_VALUE _IOR(0x15, 1, int)
-+# define FIST_IOCTL_SET_DEBUG_VALUE _IOW(0x15, 2, int)
-+
-+#endif /* not __FIST_H_ */
---- /dev/null
-+++ b/fs/mini_fo/inode.c
-@@ -0,0 +1,1564 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd)
-+#else
-+mini_fo_create(inode_t *dir, dentry_t *dentry, int mode)
-+#endif
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = create_sto_reg_file(dentry, mode, nd);
-+#else
-+ err = create_sto_reg_file(dentry, mode);
-+#endif
-+ check_mini_fo_dentry(dentry);
-+ return err;
-+}
-+
-+
-+STATIC dentry_t *
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_lookup(inode_t *dir, dentry_t *dentry, struct nameidata* nd)
-+#else
-+mini_fo_lookup(inode_t *dir, dentry_t *dentry)
-+#endif
-+{
-+ int err = 0;
-+ dentry_t *hidden_dir_dentry;
-+ dentry_t *hidden_dentry = NULL;
-+
-+ dentry_t *hidden_sto_dir_dentry;
-+ dentry_t *hidden_sto_dentry = NULL;
-+
-+ /* whiteout flag */
-+ int del_flag = 0;
-+ char *bpath = NULL;
-+
-+ const char *name;
-+ unsigned int namelen;
-+
-+ /* Don't allow lookups of META-files */
-+ namelen = strlen(META_FILENAME);
-+ if(namelen == dentry->d_name.len) {
-+ if(!strncmp(dentry->d_name.name, META_FILENAME, namelen)) {
-+ err = -ENOENT;
-+ goto out;
-+ }
-+ }
-+
-+ hidden_dir_dentry = dtohd(dentry->d_parent);
-+ hidden_sto_dir_dentry = dtohd2(dentry->d_parent);
-+
-+ name = dentry->d_name.name;
-+ namelen = dentry->d_name.len;
-+
-+ /* must initialize dentry operations */
-+ dentry->d_op = &mini_fo_dops;
-+
-+ /* setup the del_flag */
-+ del_flag = __meta_check_d_entry(dir, name, namelen);
-+ bpath = __meta_check_r_entry(dir, name, namelen);
-+
-+ /* perform the lookups of base and storage files:
-+ *
-+ * This caused some serious trouble, as a lookup_one_len passing
-+ * a negative dentry oopses. Solution is to only do the lookup
-+ * if the dentry is positive, else we set it to NULL
-+ * More trouble, who said a *_dir_dentry can't be NULL?
-+ */
-+ if(bpath) {
-+ /* Cross-Interposing (C), yeah! */
-+ hidden_dentry = bpath_walk(dir->i_sb, bpath);
-+ if(!hidden_dentry || !hidden_dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo_lookup: bpath_walk failed.\n");
-+ err= -EINVAL;
-+ goto out;
-+ }
-+
-+ /* this can be set up safely without fear of spaghetti
-+ * interposing as it is only used for copying times */
-+ hidden_dir_dentry = hidden_dentry->d_parent;
-+ kfree(bpath);
-+ }
-+ else if(hidden_dir_dentry && hidden_dir_dentry->d_inode)
-+ hidden_dentry =
-+ lookup_one_len(name, hidden_dir_dentry, namelen);
-+ else
-+ hidden_dentry = NULL;
-+
-+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+ hidden_sto_dentry =
-+ lookup_one_len(name, hidden_sto_dir_dentry, namelen);
-+ else
-+ hidden_sto_dentry = NULL;
-+
-+ /* catch error in lookup */
-+ if (IS_ERR(hidden_dentry) || IS_ERR(hidden_sto_dentry)) {
-+ /* mk: we need to call dput on the dentry, whose
-+ * lookup_one_len operation failed, in order to avoid
-+ * unmount trouble.
-+ */
-+ if(IS_ERR(hidden_dentry)) {
-+ printk(KERN_CRIT "mini_fo_lookup: ERR from base dentry, lookup failed.\n");
-+ err = PTR_ERR(hidden_dentry);
-+ } else {
-+ dput(hidden_dentry);
-+ }
-+ if(IS_ERR(hidden_sto_dentry)) {
-+ printk(KERN_CRIT "mini_fo_lookup: ERR from storage dentry, lookup failed.\n");
-+ err = PTR_ERR(hidden_sto_dentry);
-+ } else {
-+ dput(hidden_sto_dentry);
-+ }
-+ goto out;
-+ }
-+
-+ /* allocate dentry private data */
-+ __dtopd(dentry) = (struct mini_fo_dentry_info *)
-+ kmalloc(sizeof(struct mini_fo_dentry_info), GFP_KERNEL);
-+
-+ if (!dtopd(dentry)) {
-+ err = -ENOMEM;
-+ goto out_dput;
-+ }
-+
-+ /* check for different states of the mini_fo file to be looked up. */
-+
-+ /* state 1, file has been modified */
-+ if(hidden_dentry && hidden_sto_dentry &&
-+ hidden_dentry->d_inode && hidden_sto_dentry->d_inode && !del_flag) {
-+
-+ /* update parent directory's atime */
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = MODIFIED;
-+ dtohd(dentry) = hidden_dentry;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ err = mini_fo_tri_interpose(hidden_dentry,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state1).\n");
-+ goto out_free;
-+ }
-+ goto out;
-+ }
-+ /* state 2, file is unmodified */
-+ if(hidden_dentry && hidden_dentry->d_inode && !del_flag) {
-+
-+ fist_copy_attr_atime(dir, hidden_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = UNMODIFIED;
-+ dtohd(dentry) = hidden_dentry;
-+ dtohd2(dentry) = hidden_sto_dentry; /* could be negative */
-+
-+ err = mini_fo_tri_interpose(hidden_dentry,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state2).\n");
-+ goto out_free;
-+ }
-+ goto out;
-+ }
-+ /* state 3, file has been newly created */
-+ if(hidden_sto_dentry && hidden_sto_dentry->d_inode && !del_flag) {
-+
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+ dtopd(dentry)->state = CREATED;
-+ dtohd(dentry) = hidden_dentry; /* could be negative */
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ err = mini_fo_tri_interpose(hidden_dentry,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state3).\n");
-+ goto out_free;
-+ }
-+ goto out;
-+ }
-+
-+ /* state 4, file has deleted and created again. */
-+ if(hidden_dentry && hidden_sto_dentry &&
-+ hidden_dentry->d_inode &&
-+ hidden_sto_dentry->d_inode && del_flag) {
-+
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+ dtopd(dentry)->state = DEL_REWRITTEN;
-+ dtohd(dentry) = NULL;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ err = mini_fo_tri_interpose(NULL,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state4).\n");
-+ goto out_free;
-+ }
-+ /* We will never need this dentry again, as the file has been
-+ * deleted from base */
-+ dput(hidden_dentry);
-+ goto out;
-+ }
-+ /* state 5, file has been deleted in base */
-+ if(hidden_dentry && hidden_sto_dentry &&
-+ hidden_dentry->d_inode &&
-+ !hidden_sto_dentry->d_inode && del_flag) {
-+
-+ /* check which parents atime we need for updating */
-+ if(hidden_sto_dir_dentry->d_inode)
-+ fist_copy_attr_atime(dir,
-+ hidden_sto_dir_dentry->d_inode);
-+ else
-+ fist_copy_attr_atime(dir,
-+ hidden_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = DELETED;
-+ dtohd(dentry) = NULL;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ /* add negative dentry to dcache to speed up lookups */
-+ d_add(dentry, NULL);
-+ dput(hidden_dentry);
-+ goto out;
-+ }
-+ /* state 6, file does not exist */
-+ if(((hidden_dentry && !hidden_dentry->d_inode) ||
-+ (hidden_sto_dentry && !hidden_sto_dentry->d_inode)) && !del_flag)
-+ {
-+ /* check which parents atime we need for updating */
-+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+ else
-+ fist_copy_attr_atime(dir, hidden_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = NON_EXISTANT;
-+ dtohd(dentry) = hidden_dentry;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+ d_add(dentry, NULL);
-+ goto out;
-+ }
-+
-+ /* if we get to here, were in an invalid state. bad. */
-+ printk(KERN_CRIT "mini_fo_lookup: ERROR, meta data corruption detected.\n");
-+
-+ /* end state checking */
-+ out_free:
-+ d_drop(dentry); /* so that our bad dentry will get destroyed */
-+ kfree(dtopd(dentry));
-+ __dtopd(dentry) = NULL; /* be safe */
-+
-+ out_dput:
-+ if(hidden_dentry)
-+ dput(hidden_dentry);
-+ if(hidden_sto_dentry)
-+ dput(hidden_sto_dentry); /* drops usage count and marks for release */
-+
-+ out:
-+ /* initalize wol if file exists and is directory */
-+ if(dentry->d_inode) {
-+ if(S_ISDIR(dentry->d_inode->i_mode)) {
-+ itopd(dentry->d_inode)->deleted_list_size = -1;
-+ itopd(dentry->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(dentry);
-+ }
-+ }
-+ return ERR_PTR(err);
-+}
-+
-+
-+STATIC int
-+mini_fo_link(dentry_t *old_dentry, inode_t *dir, dentry_t *new_dentry)
-+{
-+ int err;
-+ dentry_t *hidden_old_dentry;
-+ dentry_t *hidden_new_dentry;
-+ dentry_t *hidden_dir_dentry;
-+
-+
-+ check_mini_fo_dentry(old_dentry);
-+ check_mini_fo_dentry(new_dentry);
-+ check_mini_fo_inode(dir);
-+
-+ /* no links to directorys and existing targets target allowed */
-+ if(S_ISDIR(old_dentry->d_inode->i_mode) ||
-+ is_mini_fo_existant(new_dentry)) {
-+ err = -EPERM;
-+ goto out;
-+ }
-+
-+ /* bring it directly from unmod to del_rew */
-+ if(dtost(old_dentry) == UNMODIFIED) {
-+ err = nondir_unmod_to_mod(old_dentry, 1);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ err = meta_add_d_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ dput(dtohd(old_dentry));
-+ dtohd(old_dentry) = NULL;
-+ dtost(old_dentry) = DEL_REWRITTEN;
-+ }
-+
-+ err = get_neg_sto_dentry(new_dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ hidden_old_dentry = dtohd2(old_dentry);
-+ hidden_new_dentry = dtohd2(new_dentry);
-+
-+ dget(hidden_old_dentry);
-+ dget(hidden_new_dentry);
-+
-+ /* was: hidden_dir_dentry = lock_parent(hidden_new_dentry); */
-+ hidden_dir_dentry = dget(hidden_new_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = vfs_link(hidden_old_dentry,
-+ hidden_dir_dentry->d_inode,
-+ hidden_new_dentry);
-+ if (err || !hidden_new_dentry->d_inode)
-+ goto out_lock;
-+
-+ dtost(new_dentry) = CREATED;
-+ err = mini_fo_tri_interpose(NULL, hidden_new_dentry, new_dentry, dir->i_sb, 0);
-+ if (err)
-+ goto out_lock;
-+
-+ fist_copy_attr_timesizes(dir, hidden_new_dentry->d_inode);
-+ /* propagate number of hard-links */
-+ old_dentry->d_inode->i_nlink = itohi2(old_dentry->d_inode)->i_nlink;
-+
-+ out_lock:
-+ /* was: unlock_dir(hidden_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_dir_dentry);
-+
-+ dput(hidden_new_dentry);
-+ dput(hidden_old_dentry);
-+ if (!new_dentry->d_inode)
-+ d_drop(new_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_unlink(inode_t *dir, dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ dget(dentry);
-+ if(dtopd(dentry)->state == MODIFIED) {
-+ err = nondir_mod_to_del(dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == UNMODIFIED) {
-+ err = nondir_unmod_to_del(dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == CREATED) {
-+ err = nondir_creat_to_del(dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == DEL_REWRITTEN) {
-+ err = nondir_del_rew_to_del(dentry);
-+ goto out;
-+ }
-+
-+ printk(KERN_CRIT "mini_fo_unlink: ERROR, invalid state detected.\n");
-+
-+ out:
-+ fist_copy_attr_times(dir, itohi2(dentry->d_parent->d_inode));
-+
-+ if(!err) {
-+ /* is this causing my pain? d_delete(dentry); */
-+ d_drop(dentry);
-+ }
-+
-+ dput(dentry);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_symlink(inode_t *dir, dentry_t *dentry, const char *symname)
-+{
-+ int err=0;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ umode_t mode;
-+#endif
-+
-+ /* Fail if the symlink file exists */
-+ if(!(dtost(dentry) == DELETED ||
-+ dtost(dentry) == NON_EXISTANT)) {
-+ err = -EEXIST;
-+ goto out;
-+ }
-+
-+ err = get_neg_sto_dentry(dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ dget(hidden_sto_dentry);
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ mode = S_IALLUGO;
-+ err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry, symname, mode);
-+#else
-+ err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ symname);
-+#endif
-+ if (err || !hidden_sto_dentry->d_inode)
-+ goto out_lock;
-+
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ } else if(dtost(dentry) == NON_EXISTANT) {
-+ dtost(dentry) = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ dput(hidden_sto_dentry);
-+ if (!dentry->d_inode)
-+ d_drop(dentry);
-+ out:
-+ return err;
-+}
-+
-+STATIC int
-+mini_fo_mkdir(inode_t *dir, dentry_t *dentry, int mode)
-+{
-+ int err;
-+
-+ err = create_sto_dir(dentry, mode);
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_rmdir(inode_t *dir, dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+ dentry_t *meta_dentry;
-+ inode_t *hidden_sto_dir = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+ check_mini_fo_inode(dir);
-+
-+ dget(dentry);
-+ if(dtopd(dentry)->state == MODIFIED) {
-+ /* XXX: disabled, because it does not bother to check files on
-+ * the original filesystem - just a hack, but better than simply
-+ * removing it without testing */
-+ err = -EINVAL;
-+ goto out;
-+
-+ hidden_sto_dir = itohi2(dir);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was:hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* Delete an old WOL file contained in the storage dir */
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ hidden_sto_dentry,
-+ strlen(META_FILENAME));
-+ if(meta_dentry->d_inode) {
-+ err = vfs_unlink(hidden_sto_dentry->d_inode, meta_dentry);
-+ dput(meta_dentry);
-+ if(!err)
-+ d_delete(meta_dentry);
-+ }
-+
-+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+ dput(dtohd(dentry));
-+
-+ dtohd(dentry) = NULL;
-+ dtopd(dentry)->state = DELETED;
-+
-+ /* carefull with R files */
-+ if( __meta_is_r_entry(dir,
-+ dentry->d_name.name,
-+ dentry->d_name.len) == 1) {
-+ err = meta_remove_r_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: rmdir: meta_remove_r_entry failed.\n");
-+ goto out;
-+ }
-+ }
-+ else {
-+ /* ok, add deleted file to META */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+ }
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == UNMODIFIED) {
-+ /* XXX: simply adding it to the delete list here is fscking dangerous!
-+ * as a temporary hack, i will disable rmdir on unmodified directories
-+ * for now.
-+ */
-+ err = -EINVAL;
-+ goto out;
-+
-+ err = get_neg_sto_dentry(dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* dput base dentry, this will relase the inode and free the
-+ * dentry, as we will never need it again. */
-+ dput(dtohd(dentry));
-+ dtohd(dentry) = NULL;
-+ dtopd(dentry)->state = DELETED;
-+
-+ /* add deleted file to META-file */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == CREATED) {
-+ hidden_sto_dir = itohi2(dir);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* Delete an old WOL file contained in the storage dir */
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ hidden_sto_dentry,
-+ strlen(META_FILENAME));
-+ if(meta_dentry->d_inode) {
-+ /* is this necessary? dget(meta_dentry); */
-+ err = vfs_unlink(hidden_sto_dentry->d_inode,
-+ meta_dentry);
-+ dput(meta_dentry);
-+ if(!err)
-+ d_delete(meta_dentry);
-+ }
-+
-+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+ dtopd(dentry)->state = NON_EXISTANT;
-+
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == DEL_REWRITTEN) {
-+ hidden_sto_dir = itohi2(dir);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* Delete an old WOL file contained in the storage dir */
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ hidden_sto_dentry,
-+ strlen(META_FILENAME));
-+ if(meta_dentry->d_inode) {
-+ /* is this necessary? dget(meta_dentry); */
-+ err = vfs_unlink(hidden_sto_dentry->d_inode,
-+ meta_dentry);
-+ dput(meta_dentry);
-+ if(!err)
-+ d_delete(meta_dentry);
-+ }
-+
-+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+ dtopd(dentry)->state = DELETED;
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ goto out;
-+ }
-+
-+ printk(KERN_CRIT "mini_fo_rmdir: ERROR, invalid state detected.\n");
-+
-+ out:
-+ if(!err) {
-+ d_drop(dentry);
-+ }
-+
-+ fist_copy_attr_times(dir, itohi2(dentry->d_parent->d_inode));
-+ dput(dentry);
-+
-+ return err;
-+}
-+
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_mknod(inode_t *dir, dentry_t *dentry, int mode, dev_t dev)
-+#else
-+mini_fo_mknod(inode_t *dir, dentry_t *dentry, int mode, int dev)
-+#endif
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ err = create_sto_nod(dentry, mode, dev);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo_mknod: creating sto nod failed.\n");
-+ err = -EINVAL;
-+ }
-+
-+ check_mini_fo_dentry(dentry);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_rename(inode_t *old_dir, dentry_t *old_dentry,
-+ inode_t *new_dir, dentry_t *new_dentry)
-+{
-+ /* dispatch */
-+ if(S_ISDIR(old_dentry->d_inode->i_mode))
-+ return rename_directory(old_dir, old_dentry, new_dir, new_dentry);
-+ return rename_nondir(old_dir, old_dentry, new_dir, new_dentry);
-+
-+}
-+
-+int rename_directory(inode_t *old_dir, dentry_t *old_dentry,
-+ inode_t *new_dir, dentry_t *new_dentry)
-+{
-+ int err, bpath_len;
-+ char *bpath;
-+
-+ dentry_t *hidden_old_dentry;
-+ dentry_t *hidden_new_dentry;
-+ dentry_t *hidden_old_dir_dentry;
-+ dentry_t *hidden_new_dir_dentry;
-+
-+ err = 0;
-+ bpath = NULL;
-+ bpath_len = 0;
-+
-+ /* this is a test, chuck out if it works */
-+ if(!(dtopd(new_dentry)->state == DELETED ||
-+ dtopd(new_dentry)->state == NON_EXISTANT)) {
-+ printk(KERN_CRIT "mini_fo: rename_directory: \
-+ uh, ah, new_dentry not negative.\n");
-+ /* return -1; */
-+ }
-+
-+ /* state = UNMODIFIED */
-+ if(dtopd(old_dentry)->state == UNMODIFIED) {
-+ err = dir_unmod_to_mod(old_dentry);
-+ if (err)
-+ goto out;
-+ }
-+
-+ /* state = MODIFIED */
-+ if(dtopd(old_dentry)->state == MODIFIED) {
-+ bpath = meta_check_r_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if(bpath) {
-+ err = meta_remove_r_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: rename_directory:\
-+ meta_remove_r_entry \
-+ failed.\n");
-+ goto out;
-+ }
-+ err = meta_add_r_entry(new_dentry->d_parent,
-+ bpath,
-+ strlen(bpath),
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+ kfree(bpath);
-+ }
-+ else {/* wol it */
-+ err = meta_add_d_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if (err)
-+ goto out;
-+ /* put it on rename list */
-+ err = get_mini_fo_bpath(old_dentry,
-+ &bpath,
-+ &bpath_len);
-+ if (err)
-+ goto out;
-+ err = meta_add_r_entry(new_dentry->d_parent,
-+ bpath, bpath_len,
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+ if (err)
-+ goto out;
-+ }
-+ /* no state change, MODIFIED stays MODIFIED */
-+ }
-+ /* state = CREATED */
-+ if(dtopd(old_dentry)->state == CREATED ||
-+ dtopd(old_dentry)->state == DEL_REWRITTEN) {
-+ if(dtohd(old_dentry))
-+ dput(dtohd(old_dentry));
-+
-+ if(dtopd(new_dentry)->state == DELETED) {
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ dtohd(old_dentry) = NULL;
-+ }
-+ else if(dtopd(new_dentry)->state == NON_EXISTANT) {
-+ dtopd(old_dentry)->state = CREATED;
-+ /* steal new dentry's neg. base dentry */
-+ dtohd(old_dentry) = dtohd(new_dentry);
-+ dtohd(new_dentry) = NULL;
-+ }
-+ }
-+ if(dtopd(new_dentry)->state == UNMODIFIED ||
-+ dtopd(new_dentry)->state == NON_EXISTANT) {
-+ err = get_neg_sto_dentry(new_dentry);
-+ if(err)
-+ goto out;
-+ }
-+
-+ /* now move sto file */
-+ hidden_old_dentry = dtohd2(old_dentry);
-+ hidden_new_dentry = dtohd2(new_dentry);
-+
-+ dget(hidden_old_dentry);
-+ dget(hidden_new_dentry);
-+
-+ hidden_old_dir_dentry = dget(hidden_old_dentry->d_parent);
-+ hidden_new_dir_dentry = dget(hidden_new_dentry->d_parent);
-+ double_lock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+
-+ err = vfs_rename(hidden_old_dir_dentry->d_inode, hidden_old_dentry,
-+ hidden_new_dir_dentry->d_inode, hidden_new_dentry);
-+ if(err)
-+ goto out_lock;
-+
-+ fist_copy_attr_all(new_dir, hidden_new_dir_dentry->d_inode);
-+ if (new_dir != old_dir)
-+ fist_copy_attr_all(old_dir,
-+ hidden_old_dir_dentry->d_inode);
-+
-+ out_lock:
-+ /* double_unlock will dput the new/old parent dentries
-+ * whose refcnts were incremented via get_parent above. */
-+ double_unlock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+ dput(hidden_new_dentry);
-+ dput(hidden_old_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+int rename_nondir(inode_t *old_dir, dentry_t *old_dentry,
-+ inode_t *new_dir, dentry_t *new_dentry)
-+{
-+ int err=0;
-+
-+ check_mini_fo_dentry(old_dentry);
-+ check_mini_fo_dentry(new_dentry);
-+ check_mini_fo_inode(old_dir);
-+ check_mini_fo_inode(new_dir);
-+
-+ /* state: UNMODIFIED */
-+ if(dtost(old_dentry) == UNMODIFIED) {
-+ err = nondir_unmod_to_mod(old_dentry, 1);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ }
-+
-+ /* the easy states */
-+ if(exists_in_storage(old_dentry)) {
-+
-+ dentry_t *hidden_old_dentry;
-+ dentry_t *hidden_new_dentry;
-+ dentry_t *hidden_old_dir_dentry;
-+ dentry_t *hidden_new_dir_dentry;
-+
-+ /* if old file is MODIFIED, add it to the deleted_list */
-+ if(dtopd(old_dentry)->state == MODIFIED) {
-+ meta_add_d_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+
-+ dput(dtohd(old_dentry));
-+ }
-+ /* if old file is CREATED, we only release the base dentry */
-+ if(dtopd(old_dentry)->state == CREATED) {
-+ if(dtohd(old_dentry))
-+ dput(dtohd(old_dentry));
-+ }
-+
-+ /* now setup the new states (depends on new_dentry state) */
-+ /* new dentry state = MODIFIED */
-+ if(dtopd(new_dentry)->state == MODIFIED) {
-+ meta_add_d_entry(new_dentry->d_parent,
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+
-+ /* new dentry will be d_put'ed later by the vfs
-+ * so don't do it here
-+ * dput(dtohd(new_dentry));
-+ */
-+ dtohd(old_dentry) = NULL;
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ }
-+ /* new dentry state = UNMODIFIED */
-+ else if(dtopd(new_dentry)->state == UNMODIFIED) {
-+ if(get_neg_sto_dentry(new_dentry))
-+ return -EINVAL;
-+
-+ meta_add_d_entry(new_dentry->d_parent,
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+
-+ /* is this right??? */
-+ /*dput(dtohd(new_dentry));*/
-+ dtohd(old_dentry) = NULL;
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ }
-+ /* new dentry state = CREATED */
-+ else if(dtopd(new_dentry)->state == CREATED) {
-+ /* we keep the neg. base dentry (if exists) */
-+ dtohd(old_dentry) = dtohd(new_dentry);
-+ /* ...and set it to Null, or we'll get
-+ * dcache.c:345 if it gets dput twice... */
-+ dtohd(new_dentry) = NULL;
-+ dtopd(old_dentry)->state = CREATED;
-+ }
-+ /* new dentry state = NON_EXISTANT */
-+ else if(dtopd(new_dentry)->state == NON_EXISTANT) {
-+ if(get_neg_sto_dentry(new_dentry))
-+ return -EINVAL;
-+
-+ /* we keep the neg. base dentry (if exists) */
-+ dtohd(old_dentry) = dtohd(new_dentry);
-+ /* ...and set it to Null, or we'll get
-+ * Dr. dcache.c:345 if it gets dput twice... */
-+ dtohd(new_dentry) = NULL;
-+ dtopd(old_dentry)->state = CREATED;
-+ }
-+ /* new dentry state = DEL_REWRITTEN or DELETED */
-+ else if(dtopd(new_dentry)->state == DEL_REWRITTEN ||
-+ dtopd(new_dentry)->state == DELETED) {
-+ dtohd(old_dentry) = NULL;
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ }
-+ else { /* not possible, uhh, ahh */
-+ printk(KERN_CRIT
-+ "mini_fo: rename_reg_file: invalid state detected [1].\n");
-+ return -1;
-+ }
-+
-+ /* now we definitely have a sto file */
-+ hidden_old_dentry = dtohd2(old_dentry);
-+ hidden_new_dentry = dtohd2(new_dentry);
-+
-+ dget(hidden_old_dentry);
-+ dget(hidden_new_dentry);
-+
-+ hidden_old_dir_dentry = dget(hidden_old_dentry->d_parent);
-+ hidden_new_dir_dentry = dget(hidden_new_dentry->d_parent);
-+ double_lock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+
-+ err = vfs_rename(hidden_old_dir_dentry->d_inode,
-+ hidden_old_dentry,
-+ hidden_new_dir_dentry->d_inode,
-+ hidden_new_dentry);
-+ if(err)
-+ goto out_lock;
-+
-+ fist_copy_attr_all(new_dir, hidden_new_dir_dentry->d_inode);
-+ if (new_dir != old_dir)
-+ fist_copy_attr_all(old_dir, hidden_old_dir_dentry->d_inode);
-+
-+ out_lock:
-+ /* double_unlock will dput the new/old parent dentries
-+ * whose refcnts were incremented via get_parent above.
-+ */
-+ double_unlock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+ dput(hidden_new_dentry);
-+ dput(hidden_old_dentry);
-+ out:
-+ return err;
-+ }
-+ else { /* invalid state */
-+ printk(KERN_CRIT "mini_fo: rename_reg_file: ERROR: invalid state detected [2].\n");
-+ return -1;
-+ }
-+}
-+
-+
-+STATIC int
-+mini_fo_readlink(dentry_t *dentry, char *buf, int bufsiz)
-+{
-+ int err=0;
-+ dentry_t *hidden_dentry = NULL;
-+
-+ if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+ hidden_dentry = dtohd2(dentry);
-+ } else if(dtohd(dentry) && dtohd(dentry)->d_inode) {
-+ hidden_dentry = dtohd(dentry);
-+ } else {
-+ goto out;
-+ }
-+
-+ if (!hidden_dentry->d_inode->i_op ||
-+ !hidden_dentry->d_inode->i_op->readlink) {
-+ err = -EINVAL; goto out;
-+ }
-+
-+ err = hidden_dentry->d_inode->i_op->readlink(hidden_dentry,
-+ buf,
-+ bufsiz);
-+ if (err > 0)
-+ fist_copy_attr_atime(dentry->d_inode, hidden_dentry->d_inode);
-+
-+ out:
-+ return err;
-+}
-+
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+static int mini_fo_follow_link(dentry_t *dentry, struct nameidata *nd)
-+#else
-+static void* mini_fo_follow_link(dentry_t *dentry, struct nameidata *nd)
-+#endif
-+{
-+ char *buf;
-+ int len = PAGE_SIZE, err;
-+ mm_segment_t old_fs;
-+
-+ /* in 2.6 this is freed by mini_fo_put_link called by __do_follow_link */
-+ buf = kmalloc(len, GFP_KERNEL);
-+ if (!buf) {
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+
-+ /* read the symlink, and then we will follow it */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+ err = dentry->d_inode->i_op->readlink(dentry, buf, len);
-+ set_fs(old_fs);
-+ if (err < 0) {
-+ kfree(buf);
-+ buf = NULL;
-+ goto out;
-+ }
-+ buf[err] = 0;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ nd_set_link(nd, buf);
-+ err = 0;
-+#else
-+ err = vfs_follow_link(nd, buf);
-+#endif
-+
-+ out:
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ kfree(buf);
-+#endif
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+ return err;
-+#else
-+ return ERR_PTR(err);
-+#endif
-+}
-+
-+STATIC
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+void mini_fo_put_link(struct dentry *dentry, struct nameidata *nd)
-+#else
-+void mini_fo_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
-+#endif
-+{
-+ char *link;
-+ link = nd_get_link(nd);
-+ kfree(link);
-+}
-+#endif
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_permission(inode_t *inode, int mask, struct nameidata *nd)
-+#else
-+mini_fo_permission(inode_t *inode, int mask)
-+#endif
-+{
-+ inode_t *hidden_inode;
-+ int mode;
-+ int err;
-+
-+ if(itohi2(inode)) {
-+ hidden_inode = itohi2(inode);
-+ } else {
-+ hidden_inode = itohi(inode);
-+ }
-+ mode = inode->i_mode;
-+
-+ /* not really needed, as permission handles everything:
-+ * err = vfs_permission(inode, mask);
-+ * if (err)
-+ * goto out;
-+ */
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = permission(hidden_inode, mask, nd);
-+#else
-+ err = permission(hidden_inode, mask);
-+#endif
-+
-+ /* out: */
-+ return err;
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+STATIC int
-+mini_fo_inode_revalidate(dentry_t *dentry)
-+{
-+ int err = 0;
-+ dentry_t *hidden_dentry;
-+ inode_t *hidden_inode;
-+
-+ ASSERT(dentry->d_inode);
-+ ASSERT(itopd(dentry->d_inode));
-+
-+ if(itohi2(dentry->d_inode)) {
-+ hidden_dentry = dtohd2(dentry);
-+ hidden_inode = hidden_dentry->d_inode;
-+ } else if(itohi(dentry->d_inode)) {
-+ hidden_dentry = dtohd(dentry);
-+ hidden_inode = hidden_dentry->d_inode;
-+ } else {
-+ printk(KERN_CRIT "mini_fo_inode_revalidate: ERROR, invalid state detected.\n");
-+ err = -ENOENT;
-+ goto out;
-+ }
-+ if (hidden_inode && hidden_inode->i_op && hidden_inode->i_op->revalidate){
-+ err = hidden_inode->i_op->revalidate(hidden_dentry);
-+ if (err)
-+ goto out;
-+ }
-+ fist_copy_attr_all(dentry->d_inode, hidden_inode);
-+ out:
-+ return err;
-+}
-+#endif
-+
-+STATIC int
-+mini_fo_setattr(dentry_t *dentry, struct iattr *ia)
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(!is_mini_fo_existant(dentry)) {
-+ printk(KERN_CRIT "mini_fo_setattr: ERROR, invalid state detected [1].\n");
-+ goto out;
-+ }
-+
-+ if(dtost(dentry) == UNMODIFIED) {
-+ if(!IS_COPY_FLAG(ia->ia_valid))
-+ goto out; /* we ignore these changes to base */
-+
-+ if(S_ISDIR(dentry->d_inode->i_mode)) {
-+ err = dir_unmod_to_mod(dentry);
-+ } else {
-+ /* we copy contents if file is not beeing truncated */
-+ if(S_ISREG(dentry->d_inode->i_mode) &&
-+ !(ia->ia_size == 0 && (ia->ia_valid & ATTR_SIZE))) {
-+ err = nondir_unmod_to_mod(dentry, 1);
-+ } else
-+ err = nondir_unmod_to_mod(dentry, 0);
-+ }
-+ if(err) {
-+ err = -EINVAL;
-+ printk(KERN_CRIT "mini_fo_setattr: ERROR changing states.\n");
-+ goto out;
-+ }
-+ }
-+ if(!exists_in_storage(dentry)) {
-+ printk(KERN_CRIT "mini_fo_setattr: ERROR, invalid state detected [2].\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ ASSERT(dentry->d_inode);
-+ ASSERT(dtohd2(dentry));
-+ ASSERT(itopd(dentry->d_inode));
-+ ASSERT(itohi2(dentry->d_inode));
-+
-+ err = notify_change(dtohd2(dentry), ia);
-+ fist_copy_attr_all(dentry->d_inode, itohi2(dentry->d_inode));
-+ out:
-+ return err;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+STATIC int
-+mini_fo_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
-+{
-+ int err = 0;
-+ dentry_t *hidden_dentry;
-+
-+ ASSERT(dentry->d_inode);
-+ ASSERT(itopd(dentry->d_inode));
-+
-+ if(itohi2(dentry->d_inode)) {
-+ hidden_dentry = dtohd2(dentry);
-+ } else if(itohi(dentry->d_inode)) {
-+ hidden_dentry = dtohd(dentry);
-+ } else {
-+ printk(KERN_CRIT "mini_fo_getattr: ERROR, invalid state detected.\n");
-+ err = -ENOENT;
-+ goto out;
-+ }
-+ fist_copy_attr_all(dentry->d_inode, hidden_dentry->d_inode);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ generic_fillattr(dentry->d_inode, stat);
-+ if (!stat->blksize) {
-+ struct super_block *s = hidden_dentry->d_inode->i_sb;
-+ unsigned blocks;
-+ blocks = (stat->size+s->s_blocksize-1) >> s->s_blocksize_bits;
-+ stat->blocks = (s->s_blocksize / 512) * blocks;
-+ stat->blksize = s->s_blocksize;
-+ }
-+ out:
-+ return err;
-+}
-+#endif
-+
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+#if 0 /* no xattr_alloc() and xattr_free() */
-+/* This is lifted from fs/xattr.c */
-+static void *
-+xattr_alloc(size_t size, size_t limit)
-+{
-+ void *ptr;
-+
-+ if (size > limit)
-+ return ERR_PTR(-E2BIG);
-+
-+ if (!size) /* size request, no buffer is needed */
-+ return NULL;
-+ else if (size <= PAGE_SIZE)
-+ ptr = kmalloc((unsigned long) size, GFP_KERNEL);
-+ else
-+ ptr = vmalloc((unsigned long) size);
-+ if (!ptr)
-+ return ERR_PTR(-ENOMEM);
-+ return ptr;
-+}
-+
-+static void
-+xattr_free(void *ptr, size_t size)
-+{
-+ if (!size) /* size request, no buffer was needed */
-+ return;
-+ else if (size <= PAGE_SIZE)
-+ kfree(ptr);
-+ else
-+ vfree(ptr);
-+}
-+#endif /* no xattr_alloc() and xattr_free() */
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_getxattr(struct dentry *dentry, const char *name, void *value, size_t size) {
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+ /* Define these anyway so we don't need as much ifdef'ed code. */
-+ char *encoded_name = NULL;
-+ char *encoded_value = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->getxattr) {
-+ encoded_name = (char *)name;
-+ encoded_value = (char *)value;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->getxattr(hidden_dentry, encoded_name, encoded_value, size);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21) \
-+ && LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,23)) \
-+ || LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
-+mini_fo_setxattr(struct dentry *dentry, const char *name,
-+ const void *value, size_t size, int flags)
-+#else
-+mini_fo_setxattr(struct dentry *dentry, const char *name,
-+ void *value, size_t size, int flags)
-+#endif
-+
-+{
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+
-+ /* Define these anyway, so we don't have as much ifdef'ed code. */
-+ char *encoded_value = NULL;
-+ char *encoded_name = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->setxattr) {
-+ encoded_name = (char *)name;
-+ encoded_value = (char *)value;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->setxattr(hidden_dentry, encoded_name, encoded_value, size, flags);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_removexattr(struct dentry *dentry, const char *name) {
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+ char *encoded_name;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->removexattr) {
-+ encoded_name = (char *)name;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->removexattr(hidden_dentry, encoded_name);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_listxattr(struct dentry *dentry, char *list, size_t size) {
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+ char *encoded_list = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->listxattr) {
-+ encoded_list = list;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->listxattr(hidden_dentry, encoded_list, size);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+# endif /* defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) */
-+
-+struct inode_operations mini_fo_symlink_iops =
-+ {
-+ readlink: mini_fo_readlink,
-+ follow_link: mini_fo_follow_link,
-+ /* mk: permission: mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ revalidate: mini_fo_inode_revalidate,
-+#endif
-+ setattr: mini_fo_setattr,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ getattr: mini_fo_getattr,
-+ put_link: mini_fo_put_link,
-+#endif
-+
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+ setxattr: mini_fo_setxattr,
-+ getxattr: mini_fo_getxattr,
-+ listxattr: mini_fo_listxattr,
-+ removexattr: mini_fo_removexattr
-+# endif /* defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) */
-+ };
-+
-+struct inode_operations mini_fo_dir_iops =
-+ {
-+ create: mini_fo_create,
-+ lookup: mini_fo_lookup,
-+ link: mini_fo_link,
-+ unlink: mini_fo_unlink,
-+ symlink: mini_fo_symlink,
-+ mkdir: mini_fo_mkdir,
-+ rmdir: mini_fo_rmdir,
-+ mknod: mini_fo_mknod,
-+ rename: mini_fo_rename,
-+ /* no readlink/follow_link for non-symlinks */
-+ // off because we have setattr
-+ // truncate: mini_fo_truncate,
-+ /* mk:permission: mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ revalidate: mini_fo_inode_revalidate,
-+#endif
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ getattr: mini_fo_getattr,
-+#endif
-+ setattr: mini_fo_setattr,
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+ setxattr: mini_fo_setxattr,
-+ getxattr: mini_fo_getxattr,
-+ listxattr: mini_fo_listxattr,
-+ removexattr: mini_fo_removexattr
-+# endif /* XATTR && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) */
-+ };
-+
-+struct inode_operations mini_fo_main_iops =
-+ {
-+ /* permission: mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ revalidate: mini_fo_inode_revalidate,
-+#endif
-+ setattr: mini_fo_setattr,
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ getattr: mini_fo_getattr,
-+#endif
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+ setxattr: mini_fo_setxattr,
-+ getxattr: mini_fo_getxattr,
-+ listxattr: mini_fo_listxattr,
-+ removexattr: mini_fo_removexattr
-+# endif /* XATTR && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) */
-+ };
---- /dev/null
-+++ b/fs/mini_fo/main.c
-@@ -0,0 +1,423 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+#include <linux/module.h>
-+
-+/* This definition must only appear after we include <linux/module.h> */
-+#ifndef MODULE_LICENSE
-+# define MODULE_LICENSE(bison)
-+#endif /* not MODULE_LICENSE */
-+
-+/*
-+ * This is the mini_fo tri interpose function, which extends the
-+ * functionality of the regular interpose by interposing a higher
-+ * level inode on top of two lower level ones: the base filesystem
-+ * inode and the storage filesystem inode.
-+ *
-+ * sb we pass is mini_fo's super_block
-+ */
-+int
-+mini_fo_tri_interpose(dentry_t *hidden_dentry,
-+ dentry_t *hidden_sto_dentry,
-+ dentry_t *dentry, super_block_t *sb, int flag)
-+{
-+ inode_t *hidden_inode = NULL;
-+ inode_t *hidden_sto_inode = NULL; /* store corresponding storage inode */
-+ int err = 0;
-+ inode_t *inode;
-+
-+ /* Pointer to hidden_sto_inode if exists, else to hidden_inode.
-+ * This is used to copy the attributes of the correct inode. */
-+ inode_t *master_inode;
-+
-+ if(hidden_dentry)
-+ hidden_inode = hidden_dentry->d_inode;
-+ if(hidden_sto_dentry)
-+ hidden_sto_inode = hidden_sto_dentry->d_inode;
-+
-+ ASSERT(dentry->d_inode == NULL);
-+
-+ /* mk: One of the inodes associated with the dentrys is likely to
-+ * be NULL, so carefull:
-+ */
-+ ASSERT((hidden_inode != NULL) || (hidden_sto_inode != NULL));
-+
-+ if(hidden_sto_inode)
-+ master_inode = hidden_sto_inode;
-+ else
-+ master_inode = hidden_inode;
-+
-+ /*
-+ * We allocate our new inode below, by calling iget.
-+ * iget will call our read_inode which will initialize some
-+ * of the new inode's fields
-+ */
-+
-+ /*
-+ * original: inode = iget(sb, hidden_inode->i_ino);
-+ */
-+ inode = iget(sb, iunique(sb, 25));
-+ if (!inode) {
-+ err = -EACCES; /* should be impossible??? */
-+ goto out;
-+ }
-+
-+ /*
-+ * interpose the inode if not already interposed
-+ * this is possible if the inode is being reused
-+ * XXX: what happens if we get_empty_inode() but there's another already?
-+ * for now, ASSERT() that this can't happen; fix later.
-+ */
-+ if (itohi(inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo_tri_interpose: itohi(inode) != NULL.\n");
-+ }
-+ if (itohi2(inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo_tri_interpose: itohi2(inode) != NULL.\n");
-+ }
-+
-+ /* mk: Carefull, igrab can't handle NULL inodes (ok, why should it?), so
-+ * we need to check here:
-+ */
-+ if(hidden_inode)
-+ itohi(inode) = igrab(hidden_inode);
-+ else
-+ itohi(inode) = NULL;
-+
-+ if(hidden_sto_inode)
-+ itohi2(inode) = igrab(hidden_sto_inode);
-+ else
-+ itohi2(inode) = NULL;
-+
-+
-+ /* Use different set of inode ops for symlinks & directories*/
-+ if (S_ISLNK(master_inode->i_mode))
-+ inode->i_op = &mini_fo_symlink_iops;
-+ else if (S_ISDIR(master_inode->i_mode))
-+ inode->i_op = &mini_fo_dir_iops;
-+
-+ /* Use different set of file ops for directories */
-+ if (S_ISDIR(master_inode->i_mode))
-+ inode->i_fop = &mini_fo_dir_fops;
-+
-+ /* properly initialize special inodes */
-+ if (S_ISBLK(master_inode->i_mode) || S_ISCHR(master_inode->i_mode) ||
-+ S_ISFIFO(master_inode->i_mode) || S_ISSOCK(master_inode->i_mode)) {
-+ init_special_inode(inode, master_inode->i_mode, master_inode->i_rdev);
-+ }
-+
-+ /* Fix our inode's address operations to that of the lower inode */
-+ if (inode->i_mapping->a_ops != master_inode->i_mapping->a_ops) {
-+ inode->i_mapping->a_ops = master_inode->i_mapping->a_ops;
-+ }
-+
-+ /* only (our) lookup wants to do a d_add */
-+ if (flag)
-+ d_add(dentry, inode);
-+ else
-+ d_instantiate(dentry, inode);
-+
-+ ASSERT(dtopd(dentry) != NULL);
-+
-+ /* all well, copy inode attributes */
-+ fist_copy_attr_all(inode, master_inode);
-+
-+ out:
-+ return err;
-+}
-+
-+/* parse mount options "base=" and "sto=" */
-+dentry_t *
-+mini_fo_parse_options(super_block_t *sb, char *options)
-+{
-+ dentry_t *hidden_root = ERR_PTR(-EINVAL);
-+ dentry_t *hidden_root2 = ERR_PTR(-EINVAL);
-+ struct nameidata nd, nd2;
-+ char *name, *tmp, *end;
-+ int err = 0;
-+
-+ /* We don't want to go off the end of our arguments later on. */
-+ for (end = options; *end; end++);
-+
-+ while (options < end) {
-+ tmp = options;
-+ while (*tmp && *tmp != ',')
-+ tmp++;
-+ *tmp = '\0';
-+ if (!strncmp("base=", options, 5)) {
-+ name = options + 5;
-+ printk(KERN_INFO "mini_fo: using base directory: %s\n", name);
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ if (path_init(name, LOOKUP_FOLLOW, &nd))
-+ err = path_walk(name, &nd);
-+#else
-+ err = path_lookup(name, LOOKUP_FOLLOW, &nd);
-+#endif
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: error accessing hidden directory '%s'\n", name);
-+ hidden_root = ERR_PTR(err);
-+ goto out;
-+ }
-+ hidden_root = nd.dentry;
-+ stopd(sb)->base_dir_dentry = nd.dentry;
-+ stopd(sb)->hidden_mnt = nd.mnt;
-+
-+ } else if(!strncmp("sto=", options, 4)) {
-+ /* parse the storage dir */
-+ name = options + 4;
-+ printk(KERN_INFO "mini_fo: using storage directory: %s\n", name);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ if(path_init(name, LOOKUP_FOLLOW, &nd2))
-+ err = path_walk(name, &nd2);
-+#else
-+ err = path_lookup(name, LOOKUP_FOLLOW, &nd2);
-+#endif
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: error accessing hidden storage directory '%s'\n", name);
-+
-+ hidden_root2 = ERR_PTR(err);
-+ goto out;
-+ }
-+ hidden_root2 = nd2.dentry;
-+ stopd(sb)->storage_dir_dentry = nd2.dentry;
-+ stopd(sb)->hidden_mnt2 = nd2.mnt;
-+ stohs2(sb) = hidden_root2->d_sb;
-+
-+ /* validate storage dir, this is done in
-+ * mini_fo_read_super for the base directory.
-+ */
-+ if (IS_ERR(hidden_root2)) {
-+ printk(KERN_WARNING "mini_fo_parse_options: storage dentry lookup failed (err = %ld)\n", PTR_ERR(hidden_root2));
-+ goto out;
-+ }
-+ if (!hidden_root2->d_inode) {
-+ printk(KERN_WARNING "mini_fo_parse_options: no storage dir to interpose on.\n");
-+ goto out;
-+ }
-+ stohs2(sb) = hidden_root2->d_sb;
-+ } else {
-+ printk(KERN_WARNING "mini_fo: unrecognized option '%s'\n", options);
-+ hidden_root = ERR_PTR(-EINVAL);
-+ goto out;
-+ }
-+ options = tmp + 1;
-+ }
-+
-+ out:
-+ if(IS_ERR(hidden_root2))
-+ return hidden_root2;
-+ return hidden_root;
-+}
-+
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+static int
-+#else
-+super_block_t *
-+#endif
-+mini_fo_read_super(super_block_t *sb, void *raw_data, int silent)
-+{
-+ dentry_t *hidden_root;
-+ int err = 0;
-+
-+ if (!raw_data) {
-+ printk(KERN_WARNING "mini_fo_read_super: missing argument\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ /*
-+ * Allocate superblock private data
-+ */
-+ __stopd(sb) = kmalloc(sizeof(struct mini_fo_sb_info), GFP_KERNEL);
-+ if (!stopd(sb)) {
-+ printk(KERN_WARNING "%s: out of memory\n", __FUNCTION__);
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+ stohs(sb) = NULL;
-+
-+ hidden_root = mini_fo_parse_options(sb, raw_data);
-+ if (IS_ERR(hidden_root)) {
-+ printk(KERN_WARNING "mini_fo_read_super: lookup_dentry failed (err = %ld)\n", PTR_ERR(hidden_root));
-+ err = PTR_ERR(hidden_root);
-+ goto out_free;
-+ }
-+ if (!hidden_root->d_inode) {
-+ printk(KERN_WARNING "mini_fo_read_super: no directory to interpose on\n");
-+ goto out_free;
-+ }
-+ stohs(sb) = hidden_root->d_sb;
-+
-+ /*
-+ * Linux 2.4.2-ac3 and beyond has code in
-+ * mm/filemap.c:generic_file_write() that requires sb->s_maxbytes
-+ * to be populated. If not set, all write()s under that sb will
-+ * return 0.
-+ *
-+ * Linux 2.4.4+ automatically sets s_maxbytes to MAX_NON_LFS;
-+ * the filesystem should override it only if it supports LFS.
-+ */
-+ /* non-SCA code is good to go with LFS */
-+ sb->s_maxbytes = hidden_root->d_sb->s_maxbytes;
-+
-+ sb->s_op = &mini_fo_sops;
-+ /*
-+ * we can't use d_alloc_root if we want to use
-+ * our own interpose function unchanged,
-+ * so we simply replicate *most* of the code in d_alloc_root here
-+ */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ sb->s_root = d_alloc(NULL, &(const struct qstr) { "/", 1, 0 });
-+#else
-+ sb->s_root = d_alloc(NULL, &(const struct qstr){hash: 0, name: "/", len : 1});
-+#endif
-+ if (IS_ERR(sb->s_root)) {
-+ printk(KERN_WARNING "mini_fo_read_super: d_alloc failed\n");
-+ err = -ENOMEM;
-+ goto out_dput;
-+ }
-+
-+ sb->s_root->d_op = &mini_fo_dops;
-+ sb->s_root->d_sb = sb;
-+ sb->s_root->d_parent = sb->s_root;
-+
-+ /* link the upper and lower dentries */
-+ __dtopd(sb->s_root) = (struct mini_fo_dentry_info *)
-+ kmalloc(sizeof(struct mini_fo_dentry_info), GFP_KERNEL);
-+ if (!dtopd(sb->s_root)) {
-+ err = -ENOMEM;
-+ goto out_dput2;
-+ }
-+ dtopd(sb->s_root)->state = MODIFIED;
-+ dtohd(sb->s_root) = hidden_root;
-+
-+ /* fanout relevant, interpose on storage root dentry too */
-+ dtohd2(sb->s_root) = stopd(sb)->storage_dir_dentry;
-+
-+ /* ...and call tri-interpose to interpose root dir inodes
-+ * if (mini_fo_interpose(hidden_root, sb->s_root, sb, 0))
-+ */
-+ if(mini_fo_tri_interpose(hidden_root, dtohd2(sb->s_root), sb->s_root, sb, 0))
-+ goto out_dput2;
-+
-+ /* initalize the wol list */
-+ itopd(sb->s_root->d_inode)->deleted_list_size = -1;
-+ itopd(sb->s_root->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(sb->s_root);
-+
-+ goto out;
-+
-+ out_dput2:
-+ dput(sb->s_root);
-+ out_dput:
-+ dput(hidden_root);
-+ dput(dtohd2(sb->s_root)); /* release the hidden_sto_dentry too */
-+ out_free:
-+ kfree(stopd(sb));
-+ __stopd(sb) = NULL;
-+ out:
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ return err;
-+#else
-+ if (err) {
-+ return ERR_PTR(err);
-+ } else {
-+ return sb;
-+ }
-+#endif
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+static int mini_fo_get_sb(struct file_system_type *fs_type,
-+ int flags, const char *dev_name,
-+ void *raw_data, struct vfsmount *mnt)
-+{
-+ return get_sb_nodev(fs_type, flags, raw_data, mini_fo_read_super, mnt);
-+}
-+#else
-+static struct super_block *mini_fo_get_sb(struct file_system_type *fs_type,
-+ int flags, const char *dev_name,
-+ void *raw_data)
-+{
-+ return get_sb_nodev(fs_type, flags, raw_data, mini_fo_read_super);
-+}
-+#endif
-+
-+void mini_fo_kill_block_super(struct super_block *sb)
-+{
-+ generic_shutdown_super(sb);
-+ /*
-+ * XXX: BUG: Halcrow: Things get unstable sometime after this point:
-+ * lib/rwsem-spinlock.c:127: spin_is_locked on uninitialized
-+ * fs/fs-writeback.c:402: spin_lock(fs/super.c:a0381828) already
-+ * locked by fs/fs-writeback.c/402
-+ *
-+ * Apparently, someone's not releasing a lock on sb_lock...
-+ */
-+}
-+
-+static struct file_system_type mini_fo_fs_type = {
-+ .owner = THIS_MODULE,
-+ .name = "mini_fo",
-+ .get_sb = mini_fo_get_sb,
-+ .kill_sb = mini_fo_kill_block_super,
-+ .fs_flags = 0,
-+};
-+
-+
-+#else
-+static DECLARE_FSTYPE(mini_fo_fs_type, "mini_fo", mini_fo_read_super, 0);
-+#endif
-+
-+static int __init init_mini_fo_fs(void)
-+{
-+ printk("Registering mini_fo version $Id$\n");
-+ return register_filesystem(&mini_fo_fs_type);
-+}
-+static void __exit exit_mini_fo_fs(void)
-+{
-+ printk("Unregistering mini_fo version $Id$\n");
-+ unregister_filesystem(&mini_fo_fs_type);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+EXPORT_NO_SYMBOLS;
-+#endif
-+
-+MODULE_AUTHOR("Erez Zadok <ezk@cs.sunysb.edu>");
-+MODULE_DESCRIPTION("FiST-generated mini_fo filesystem");
-+MODULE_LICENSE("GPL");
-+
-+/* MODULE_PARM(fist_debug_var, "i"); */
-+/* MODULE_PARM_DESC(fist_debug_var, "Debug level"); */
-+
-+module_init(init_mini_fo_fs)
-+module_exit(exit_mini_fo_fs)
---- /dev/null
-+++ b/fs/mini_fo/Makefile
-@@ -0,0 +1,17 @@
-+#
-+# Makefile for mini_fo 2.4 and 2.6 Linux kernels
-+#
-+# Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+#
-+# 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.
-+#
-+
-+obj-$(CONFIG_MINI_FO) := mini_fo.o
-+mini_fo-objs := meta.o dentry.o file.o inode.o main.o super.o state.o aux.o
-+
-+# dependencies
-+${mini_fo-objs}: mini_fo.h fist.h
-+
---- /dev/null
-+++ b/fs/mini_fo/meta.c
-@@ -0,0 +1,1000 @@
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+int meta_build_lists(dentry_t *dentry)
-+{
-+ struct mini_fo_inode_info *inode_info;
-+
-+ dentry_t *meta_dentry = 0;
-+ file_t *meta_file = 0;
-+ mm_segment_t old_fs;
-+ void *buf;
-+
-+ int bytes, len;
-+ struct vfsmount *meta_mnt;
-+ char *entry;
-+
-+ inode_info = itopd(dentry->d_inode);
-+ if(!(inode_info->deleted_list_size == -1 &&
-+ inode_info->renamed_list_size == -1)) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ Error, list(s) not virgin.\n");
-+ return -1;
-+ }
-+
-+ /* init our meta lists */
-+ INIT_LIST_HEAD(&inode_info->deleted_list);
-+ inode_info->deleted_list_size = 0;
-+
-+ INIT_LIST_HEAD(&inode_info->renamed_list);
-+ inode_info->renamed_list_size = 0;
-+
-+ /* might there be a META-file? */
-+ if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen(META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ dput(meta_dentry);
-+ goto out_ok;
-+ }
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
-+
-+ /* open META-file for reading */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x0);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ ERROR opening META file.\n");
-+ goto out_err;
-+ }
-+
-+ /* check if fs supports reading */
-+ if(!meta_file->f_op->read) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ ERROR, fs does not support reading.\n");
-+ goto out_err_close;
-+ }
-+
-+ /* allocate a page for transfering the data */
-+ buf = (void *) __get_free_page(GFP_KERNEL);
-+ if(!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ ERROR, out of mem.\n");
-+ goto out_err_close;
-+ }
-+ meta_file->f_pos = 0;
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+ do {
-+ char *c;
-+ bytes = meta_file->f_op->read(meta_file, buf, PAGE_SIZE, &meta_file->f_pos);
-+ if(bytes == PAGE_SIZE) {
-+ /* trim a cut off filename and adjust f_pos to get it next time */
-+ for(c = (char*) buf+PAGE_SIZE;
-+ *c != '\n';
-+ c--, bytes--, meta_file->f_pos--);
-+ }
-+ entry = (char *) buf;
-+ while(entry < (char *) buf+bytes) {
-+
-+ char *old_path;
-+ char *dir_name;
-+ int old_len, new_len;
-+
-+ /* len without '\n'*/
-+ len = (int) (strchr(entry, '\n') - entry);
-+ switch (*entry) {
-+ case 'D':
-+ /* format: "D filename" */
-+ meta_list_add_d_entry(dentry,
-+ entry+2,
-+ len-2);
-+ break;
-+ case 'R':
-+ /* format: "R path/xy/dir newDir" */
-+ old_path = entry+2;
-+ dir_name = strchr(old_path, ' ') + 1;
-+ old_len = dir_name - old_path - 1;
-+ new_len = ((int) entry) + len - ((int ) dir_name);
-+ meta_list_add_r_entry(dentry,
-+ old_path,
-+ old_len,
-+ dir_name,
-+ new_len);
-+ break;
-+ default:
-+ /* unknown entry type detected */
-+ break;
-+ }
-+ entry += len+1;
-+ }
-+
-+ } while(meta_file->f_pos < meta_dentry->d_inode->i_size);
-+
-+ free_page((unsigned long) buf);
-+ set_fs(old_fs);
-+ fput(meta_file);
-+ }
-+ goto out_ok;
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out_err:
-+ mntput(meta_mnt);
-+ dput(meta_dentry);
-+ return -1;
-+ out_ok:
-+ return 1; /* check this!!! inode_info->wol_size; */
-+}
-+
-+/* cleanups up all lists and free's the mem by dentry */
-+int meta_put_lists(dentry_t *dentry)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk("mini_fo: meta_put_lists: invalid dentry passed.\n");
-+ return -1;
-+ }
-+ return __meta_put_lists(dentry->d_inode);
-+}
-+
-+/* cleanups up all lists and free's the mem by inode */
-+int __meta_put_lists(inode_t *inode)
-+{
-+ int err = 0;
-+ if(!inode || !itopd(inode)) {
-+ printk("mini_fo: __meta_put_lists: invalid inode passed.\n");
-+ return -1;
-+ }
-+ err = __meta_put_d_list(inode);
-+ err |= __meta_put_r_list(inode);
-+ return err;
-+}
-+
-+int meta_sync_lists(dentry_t *dentry)
-+{
-+ int err = 0;
-+ if(!dentry || !dentry->d_inode) {
-+ printk("mini_fo: meta_sync_lists: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ err = meta_sync_d_list(dentry, 0);
-+ err |= meta_sync_r_list(dentry, 1);
-+ return err;
-+}
-+
-+
-+/* remove all D entries from the renamed list and free the mem */
-+int __meta_put_d_list(inode_t *inode)
-+{
-+ struct list_head *tmp;
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: __meta_put_d_list: \
-+ invalid inode passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(inode);
-+
-+ /* nuke the DELETED-list */
-+ if(inode_info->deleted_list_size <= 0)
-+ return 0;
-+
-+ while(!list_empty(&inode_info->deleted_list)) {
-+ tmp = inode_info->deleted_list.next;
-+ list_del(tmp);
-+ del_entry = list_entry(tmp, struct deleted_entry, list);
-+ kfree(del_entry->name);
-+ kfree(del_entry);
-+ }
-+ inode_info->deleted_list_size = 0;
-+
-+ return 0;
-+}
-+
-+/* remove all R entries from the renamed list and free the mem */
-+int __meta_put_r_list(inode_t *inode)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: meta_put_r_list: invalid inode.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(inode);
-+
-+ /* nuke the RENAMED-list */
-+ if(inode_info->renamed_list_size <= 0)
-+ return 0;
-+
-+ while(!list_empty(&inode_info->renamed_list)) {
-+ tmp = inode_info->renamed_list.next;
-+ list_del(tmp);
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ kfree(ren_entry->new_name);
-+ kfree(ren_entry->old_name);
-+ kfree(ren_entry);
-+ }
-+ inode_info->renamed_list_size = 0;
-+
-+ return 0;
-+}
-+
-+int meta_add_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ int err = 0;
-+ err = meta_list_add_d_entry(dentry, name, len);
-+ err |= meta_write_d_entry(dentry,name,len);
-+ return err;
-+}
-+
-+/* add a D entry to the deleted list */
-+int meta_list_add_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_d_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->deleted_list_size < 0)
-+ return -1;
-+
-+ del_entry = (struct deleted_entry *)
-+ kmalloc(sizeof(struct deleted_entry), GFP_KERNEL);
-+ del_entry->name = (char*) kmalloc(len, GFP_KERNEL);
-+ if(!del_entry || !del_entry->name) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_d_entry: \
-+ out of mem.\n");
-+ kfree(del_entry->name);
-+ kfree(del_entry);
-+ return -ENOMEM;
-+ }
-+
-+ strncpy(del_entry->name, name, len);
-+ del_entry->len = len;
-+
-+ list_add(&del_entry->list, &inode_info->deleted_list);
-+ inode_info->deleted_list_size++;
-+ return 0;
-+}
-+
-+int meta_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len)
-+{
-+ int err = 0;
-+ err = meta_list_add_r_entry(dentry,
-+ old_name, old_len,
-+ new_name, new_len);
-+ err |= meta_write_r_entry(dentry,
-+ old_name, old_len,
-+ new_name, new_len);
-+ return err;
-+}
-+
-+/* add a R entry to the renamed list */
-+int meta_list_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len)
-+{
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_r_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->renamed_list_size < 0)
-+ return -1;
-+
-+ ren_entry = (struct renamed_entry *)
-+ kmalloc(sizeof(struct renamed_entry), GFP_KERNEL);
-+ ren_entry->old_name = (char*) kmalloc(old_len, GFP_KERNEL);
-+ ren_entry->new_name = (char*) kmalloc(new_len, GFP_KERNEL);
-+
-+ if(!ren_entry || !ren_entry->old_name || !ren_entry->new_name) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_r_entry: \
-+ out of mem.\n");
-+ kfree(ren_entry->new_name);
-+ kfree(ren_entry->old_name);
-+ kfree(ren_entry);
-+ return -ENOMEM;
-+ }
-+
-+ strncpy(ren_entry->old_name, old_name, old_len);
-+ ren_entry->old_len = old_len;
-+ strncpy(ren_entry->new_name, new_name, new_len);
-+ ren_entry->new_len = new_len;
-+
-+ list_add(&ren_entry->list, &inode_info->renamed_list);
-+ inode_info->renamed_list_size++;
-+ return 0;
-+}
-+
-+
-+int meta_remove_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ int err = 0;
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT
-+ "mini_fo: meta_remove_r_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+
-+ err = meta_list_remove_r_entry(dentry, name, len);
-+ err |= meta_sync_lists(dentry);
-+ return err;
-+}
-+
-+int meta_list_remove_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT
-+ "mini_fo: meta_list_remove_r_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ return __meta_list_remove_r_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_list_remove_r_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode))
-+ printk(KERN_CRIT
-+ "mini_fo: __meta_list_remove_r_entry: \
-+ invalid inode passed.\n");
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->renamed_list_size < 0)
-+ return -1;
-+ if(inode_info->renamed_list_size == 0)
-+ return 1;
-+
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ if(ren_entry->new_len != len)
-+ continue;
-+
-+ if(!strncmp(ren_entry->new_name, name, len)) {
-+ list_del(tmp);
-+ kfree(ren_entry->new_name);
-+ kfree(ren_entry->old_name);
-+ kfree(ren_entry);
-+ inode_info->renamed_list_size--;
-+ return 0;
-+ }
-+ }
-+ return 1;
-+}
-+
-+
-+/* append a single D entry to the meta file */
-+int meta_write_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ dentry_t *meta_dentry = 0;
-+ file_t *meta_file = 0;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err;
-+ struct vfsmount *meta_mnt = 0;
-+ char *buf;
-+
-+ err = 0;
-+
-+ if(itopd(dentry->d_inode)->deleted_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ if(dtopd(dentry)->state == UNMODIFIED) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry), strlen (META_FILENAME));
-+
-+ /* We need to create a META-file */
-+ if(!meta_dentry->d_inode) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry,
-+ S_IRUSR | S_IWUSR,
-+ NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry,
-+ S_IRUSR | S_IWUSR);
-+#endif
-+ }
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ ERROR opening meta file.\n");
-+ mntput(meta_mnt); /* $%& is this necessary? */
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* size: len for name, 1 for \n and 2 for "D " */
-+ buf = (char *) kmalloc(len+3, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ out of mem.\n");
-+ return -ENOMEM;
-+ }
-+
-+ buf[0] = 'D';
-+ buf[1] = ' ';
-+ strncpy(buf+2, name, len);
-+ buf[len+2] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf, len+3,
-+ &meta_file->f_pos);
-+ if(bytes != len+3) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ ERROR writing.\n");
-+ err = -1;
-+ }
-+ kfree(buf);
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+}
-+
-+/* append a single R entry to the meta file */
-+int meta_write_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len)
-+{
-+ dentry_t *meta_dentry = 0;
-+ file_t *meta_file = 0;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err, buf_len;
-+ struct vfsmount *meta_mnt = 0;
-+ char *buf;
-+
-+
-+ err = 0;
-+
-+ if(itopd(dentry->d_inode)->renamed_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* build the storage structure? */
-+ if(dtopd(dentry)->state == UNMODIFIED) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen (META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+ }
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+ ERROR opening meta file.\n");
-+ mntput(meta_mnt);
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* size: 2 for "R ", old_len+new_len for names, 1 blank+1 \n */
-+ buf_len = old_len + new_len + 4;
-+ buf = (char *) kmalloc(buf_len, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: out of mem.\n");
-+ return -ENOMEM;
-+ }
-+
-+ buf[0] = 'R';
-+ buf[1] = ' ';
-+ strncpy(buf + 2, old_name, old_len);
-+ buf[old_len + 2] = ' ';
-+ strncpy(buf + old_len + 3, new_name, new_len);
-+ buf[buf_len -1] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf, buf_len, &meta_file->f_pos);
-+ if(bytes != buf_len) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: ERROR writing.\n");
-+ err = -1;
-+ }
-+
-+ kfree(buf);
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+}
-+
-+/* sync D list to disk, append data if app_flag is 1 */
-+/* check the meta_mnt, which seems not to be used (properly) */
-+
-+int meta_sync_d_list(dentry_t *dentry, int app_flag)
-+{
-+ dentry_t *meta_dentry;
-+ file_t *meta_file;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err;
-+ struct vfsmount *meta_mnt;
-+ char *buf;
-+
-+ struct list_head *tmp;
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ err = 0;
-+ meta_file=0;
-+ meta_mnt=0;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ invalid inode passed.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->deleted_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* ok, there is something to sync */
-+
-+ /* build the storage structure? */
-+ if(!dtohd2(dentry) && !itohi2(dentry->d_inode)) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen(META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+ app_flag = 0;
-+ }
-+ /* need we truncate the meta file? */
-+ if(!app_flag) {
-+ struct iattr newattrs;
-+ newattrs.ia_size = 0;
-+ newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ down(&meta_dentry->d_inode->i_sem);
-+#endif
-+ err = notify_change(meta_dentry, &newattrs);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ up(&meta_dentry->d_inode->i_sem);
-+#endif
-+
-+ if(err || meta_dentry->d_inode->i_size != 0) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR truncating meta file.\n");
-+ goto out_err_close;
-+ }
-+ }
-+
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR opening meta file.\n");
-+ /* we don't mntget so we dont't mntput (for now)
-+ * mntput(meta_mnt);
-+ */
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* here we go... */
-+ list_for_each(tmp, &inode_info->deleted_list) {
-+ del_entry = list_entry(tmp, struct deleted_entry, list);
-+
-+ /* size: len for name, 1 for \n and 2 for "D " */
-+ buf = (char *) kmalloc(del_entry->len+3, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ out of mem.\n");
-+ return -ENOMEM;
-+ }
-+
-+ buf[0] = 'D';
-+ buf[1] = ' ';
-+ strncpy(buf+2, del_entry->name, del_entry->len);
-+ buf[del_entry->len+2] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf,
-+ del_entry->len+3,
-+ &meta_file->f_pos);
-+ if(bytes != del_entry->len+3) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR writing.\n");
-+ err |= -1;
-+ }
-+ kfree(buf);
-+ }
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+
-+}
-+
-+int meta_sync_r_list(dentry_t *dentry, int app_flag)
-+{
-+ dentry_t *meta_dentry;
-+ file_t *meta_file;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err, buf_len;
-+ struct vfsmount *meta_mnt;
-+ char *buf;
-+
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ err = 0;
-+ meta_file=0;
-+ meta_mnt=0;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ invalid dentry passed.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->deleted_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* ok, there is something to sync */
-+
-+ /* build the storage structure? */
-+ if(!dtohd2(dentry) && !itohi2(dentry->d_inode)) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen(META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+ app_flag = 0;
-+ }
-+ /* need we truncate the meta file? */
-+ if(!app_flag) {
-+ struct iattr newattrs;
-+ newattrs.ia_size = 0;
-+ newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ down(&meta_dentry->d_inode->i_sem);
-+#endif
-+ err = notify_change(meta_dentry, &newattrs);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ up(&meta_dentry->d_inode->i_sem);
-+#endif
-+ if(err || meta_dentry->d_inode->i_size != 0) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR truncating meta file.\n");
-+ goto out_err_close;
-+ }
-+ }
-+
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR opening meta file.\n");
-+ /* we don't mntget so we dont't mntput (for now)
-+ * mntput(meta_mnt);
-+ */
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* here we go... */
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ /* size:
-+ * 2 for "R ", old_len+new_len for names, 1 blank+1 \n */
-+ buf_len = ren_entry->old_len + ren_entry->new_len + 4;
-+ buf = (char *) kmalloc(buf_len, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ out of mem.\n");
-+ return -ENOMEM;
-+ }
-+ buf[0] = 'R';
-+ buf[1] = ' ';
-+ strncpy(buf + 2, ren_entry->old_name, ren_entry->old_len);
-+ buf[ren_entry->old_len + 2] = ' ';
-+ strncpy(buf + ren_entry->old_len + 3,
-+ ren_entry->new_name, ren_entry->new_len);
-+ buf[buf_len - 1] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf,
-+ buf_len, &meta_file->f_pos);
-+ if(bytes != buf_len) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR writing.\n");
-+ err |= -1;
-+ }
-+ kfree(buf);
-+ }
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+}
-+
-+int meta_check_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode)
-+ printk(KERN_CRIT "mini_fo: meta_check_d_dentry: \
-+ invalid dentry passed.\n");
-+ return __meta_check_d_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_check_d_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode))
-+ printk(KERN_CRIT "mini_fo: __meta_check_d_dentry: \
-+ invalid inode passed.\n");
-+
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->deleted_list_size <= 0)
-+ return 0;
-+
-+ list_for_each(tmp, &inode_info->deleted_list) {
-+ del_entry = list_entry(tmp, struct deleted_entry, list);
-+ if(del_entry->len != len)
-+ continue;
-+
-+ if(!strncmp(del_entry->name, name, len))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/*
-+ * check if file has been renamed and return path to orig. base dir.
-+ * Implements no error return values so far, what of course sucks.
-+ * String is null terminated.'
-+ */
-+char* meta_check_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry: \
-+ invalid dentry passed.\n");
-+ return NULL;
-+ }
-+ return __meta_check_r_entry(dentry->d_inode, name, len);
-+}
-+
-+char* __meta_check_r_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+ char *old_path;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry: \
-+ invalid inode passed.\n");
-+ return NULL;
-+ }
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->renamed_list_size <= 0)
-+ return NULL;
-+
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ if(ren_entry->new_len != len)
-+ continue;
-+
-+ if(!strncmp(ren_entry->new_name, name, len)) {
-+ old_path = (char *)
-+ kmalloc(ren_entry->old_len+1, GFP_KERNEL);
-+ strncpy(old_path,
-+ ren_entry->old_name,
-+ ren_entry->old_len);
-+ old_path[ren_entry->old_len]='\0';
-+ return old_path;
-+ }
-+ }
-+ return NULL;
-+}
-+
-+/*
-+ * This version only checks if entry exists and return:
-+ * 1 if exists,
-+ * 0 if not,
-+ * -1 if error.
-+ */
-+int meta_is_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry [2]: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ return __meta_is_r_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_is_r_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry [2]: \
-+ invalid inode passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->renamed_list_size <= 0)
-+ return -1;
-+
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ if(ren_entry->new_len != len)
-+ continue;
-+
-+ if(!strncmp(ren_entry->new_name, name, len))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
---- /dev/null
-+++ b/fs/mini_fo/mini_fo.h
-@@ -0,0 +1,510 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifndef __MINI_FO_H_
-+#define __MINI_FO_H_
-+
-+#ifdef __KERNEL__
-+
-+/* META stuff */
-+#define META_FILENAME "META_dAfFgHE39ktF3HD2sr"
-+
-+/* use xattrs? */
-+#define XATTR
-+
-+/* File attributes that when changed, result in a file beeing copied to storage */
-+#define COPY_FLAGS ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_SIZE
-+
-+/*
-+ * mini_fo filestates
-+ */
-+#define MODIFIED 1
-+#define UNMODIFIED 2
-+#define CREATED 3
-+#define DEL_REWRITTEN 4
-+#define DELETED 5
-+#define NON_EXISTANT 6
-+
-+/* fist file systems superblock magic */
-+# define MINI_FO_SUPER_MAGIC 0xf15f
-+
-+/*
-+ * STRUCTURES:
-+ */
-+
-+/* mini_fo inode data in memory */
-+struct mini_fo_inode_info {
-+ inode_t *wii_inode;
-+ inode_t *wii_inode2; /* pointer to storage inode */
-+
-+ /* META-data lists */
-+ /* deleted list, ex wol */
-+ struct list_head deleted_list;
-+ int deleted_list_size;
-+
-+ /* renamed list */
-+ struct list_head renamed_list;
-+ int renamed_list_size;
-+
-+ /* add other lists here ... */
-+};
-+
-+/* mini_fo dentry data in memory */
-+struct mini_fo_dentry_info {
-+ dentry_t *wdi_dentry;
-+ dentry_t *wdi_dentry2; /* pointer to storage dentry */
-+ unsigned int state; /* state of the mini_fo dentry */
-+};
-+
-+
-+/* mini_fo super-block data in memory */
-+struct mini_fo_sb_info {
-+ super_block_t *wsi_sb, *wsi_sb2; /* mk: might point to the same sb */
-+ struct vfsmount *hidden_mnt, *hidden_mnt2;
-+ dentry_t *base_dir_dentry;
-+ dentry_t *storage_dir_dentry;
-+ ;
-+};
-+
-+/* readdir_data, readdir helper struct */
-+struct readdir_data {
-+ struct list_head ndl_list; /* linked list head ptr */
-+ int ndl_size; /* list size */
-+ int sto_done; /* flag to show that the storage dir entries have
-+ * all been read an now follow base entries */
-+};
-+
-+/* file private data. */
-+struct mini_fo_file_info {
-+ struct file *wfi_file;
-+ struct file *wfi_file2; /* pointer to storage file */
-+ struct readdir_data rd;
-+};
-+
-+/* struct ndl_entry */
-+struct ndl_entry {
-+ struct list_head list;
-+ char *name;
-+ int len;
-+};
-+
-+/********************************
-+ * META-data structures
-+ ********************************/
-+
-+/* deleted entry */
-+struct deleted_entry {
-+ struct list_head list;
-+ char *name;
-+ int len;
-+};
-+
-+/* renamed entry */
-+struct renamed_entry {
-+ struct list_head list;
-+ char *old_name; /* old directory with full path */
-+ int old_len; /* length of above string */
-+ char *new_name; /* new directory name */
-+ int new_len; /* length of above string */
-+};
-+
-+/* attr_change entry */
-+struct attr_change_entry {
-+ struct list_head list;
-+ char *name;
-+ int len;
-+};
-+
-+/* link entry */
-+struct link_entry {
-+ struct list_head list;
-+ int links_moved;
-+ int inum_base;
-+ int inum_sto;
-+ char *weird_name;
-+ int weird_name_len;
-+};
-+
-+
-+/* Some other stuff required for mini_fo_filldir64, copied from
-+ * fs/readdir.c
-+ */
-+
-+#define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1))
-+#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
-+
-+
-+struct linux_dirent64 {
-+ u64 d_ino;
-+ s64 d_off;
-+ unsigned short d_reclen;
-+ unsigned char d_type;
-+ char d_name[0];
-+};
-+
-+
-+struct getdents_callback64 {
-+ struct linux_dirent64 * current_dir;
-+ struct linux_dirent64 * previous;
-+ int count;
-+ int error;
-+};
-+
-+struct linux_dirent {
-+ unsigned long d_ino;
-+ unsigned long d_off;
-+ unsigned short d_reclen;
-+ char d_name[1];
-+};
-+
-+struct getdents_callback {
-+ struct linux_dirent * current_dir;
-+ struct linux_dirent * previous;
-+ int count;
-+ int error;
-+};
-+
-+
-+/*
-+ * MACROS:
-+ */
-+
-+/* file TO private_data */
-+# define ftopd(file) ((struct mini_fo_file_info *)((file)->private_data))
-+# define __ftopd(file) ((file)->private_data)
-+/* file TO hidden_file */
-+# define ftohf(file) ((ftopd(file))->wfi_file)
-+# define ftohf2(file) ((ftopd(file))->wfi_file2)
-+
-+/* inode TO private_data */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+# define itopd(ino) ((struct mini_fo_inode_info *)(ino)->i_private)
-+# define __itopd(ino) ((ino)->i_private)
-+#else
-+# define itopd(ino) ((struct mini_fo_inode_info *)(ino)->u.generic_ip)
-+# define __itopd(ino) ((ino)->u.generic_ip)
-+#endif
-+/* inode TO hidden_inode */
-+# define itohi(ino) (itopd(ino)->wii_inode)
-+# define itohi2(ino) (itopd(ino)->wii_inode2)
-+
-+/* superblock TO private_data */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+# define stopd(super) ((struct mini_fo_sb_info *)(super)->s_fs_info)
-+# define __stopd(super) ((super)->s_fs_info)
-+#else
-+# define stopd(super) ((struct mini_fo_sb_info *)(super)->u.generic_sbp)
-+# define __stopd(super) ((super)->u.generic_sbp)
-+#endif
-+
-+/* unused? # define vfs2priv stopd */
-+/* superblock TO hidden_superblock */
-+
-+# define stohs(super) (stopd(super)->wsi_sb)
-+# define stohs2(super) (stopd(super)->wsi_sb2)
-+
-+/* dentry TO private_data */
-+# define dtopd(dentry) ((struct mini_fo_dentry_info *)(dentry)->d_fsdata)
-+# define __dtopd(dentry) ((dentry)->d_fsdata)
-+/* dentry TO hidden_dentry */
-+# define dtohd(dent) (dtopd(dent)->wdi_dentry)
-+# define dtohd2(dent) (dtopd(dent)->wdi_dentry2)
-+
-+/* dentry to state */
-+# define dtost(dent) (dtopd(dent)->state)
-+# define sbt(sb) ((sb)->s_type->name)
-+
-+#define IS_WRITE_FLAG(flag) (flag & (O_RDWR | O_WRONLY | O_APPEND))
-+#define IS_COPY_FLAG(flag) (flag & (COPY_FLAGS))
-+
-+/* macros to simplify non-SCA code */
-+# define MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages)
-+# define MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages)
-+# define FREE_PAGE_POINTERS(hidden_pages, num)
-+# define FREE_PAGEDATA_POINTERS(hidden_pages_data, num)
-+# define FOR_EACH_PAGE
-+# define CURRENT_HIDDEN_PAGE hidden_page
-+# define CURRENT_HIDDEN_PAGEDATA hidden_page_data
-+# define CURRENT_HIDDEN_PAGEINDEX page->index
-+
-+/*
-+ * EXTERNALS:
-+ */
-+extern struct file_operations mini_fo_main_fops;
-+extern struct file_operations mini_fo_dir_fops;
-+extern struct inode_operations mini_fo_main_iops;
-+extern struct inode_operations mini_fo_dir_iops;
-+extern struct inode_operations mini_fo_symlink_iops;
-+extern struct super_operations mini_fo_sops;
-+extern struct dentry_operations mini_fo_dops;
-+extern struct vm_operations_struct mini_fo_shared_vmops;
-+extern struct vm_operations_struct mini_fo_private_vmops;
-+extern struct address_space_operations mini_fo_aops;
-+
-+#if 0 /* unused by mini_fo */
-+extern int mini_fo_interpose(dentry_t *hidden_dentry, dentry_t *this_dentry, super_block_t *sb, int flag);
-+#if defined(FIST_FILTER_DATA) || defined(FIST_FILTER_SCA)
-+extern page_t *mini_fo_get1page(file_t *file, int index);
-+extern int mini_fo_fill_zeros(file_t *file, page_t *page, unsigned from);
-+# endif /* FIST_FILTER_DATA || FIST_FILTER_SCA */
-+
-+
-+# define mini_fo_hidden_dentry(d) __mini_fo_hidden_dentry(__FILE__,__FUNCTION__,__LINE__,(d))
-+# define mini_fo_hidden_sto_dentry(d) __mini_fo_hidden_sto_dentry(__FILE__,__FUNCTION__,__LINE__,(d))
-+
-+extern dentry_t *__mini_fo_hidden_dentry(char *file, char *func, int line, dentry_t *this_dentry);
-+extern dentry_t *__mini_fo_hidden_sto_dentry(char *file, char *func, int line, dentry_t *this_dentry);
-+
-+extern int mini_fo_read_file(const char *filename, void *buf, int len);
-+extern int mini_fo_write_file(const char *filename, void *buf, int len);
-+extern dentry_t *fist_lookup(dentry_t *dir, const char *name, vnode_t **out, uid_t uid, gid_t gid);
-+#endif /* unused by mini_fo */
-+
-+/* state transition functions */
-+extern int nondir_unmod_to_mod(dentry_t *dentry, int cp_flag);
-+extern int nondir_del_rew_to_del(dentry_t *dentry);
-+extern int nondir_creat_to_del(dentry_t *dentry);
-+extern int nondir_mod_to_del(dentry_t *dentry);
-+extern int nondir_unmod_to_del(dentry_t *dentry);
-+
-+extern int dir_unmod_to_mod(dentry_t *dentry);
-+
-+/* rename specials */
-+extern int rename_directory(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry);
-+extern int rename_nondir(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry);
-+
-+/* misc stuff */
-+extern int mini_fo_tri_interpose(dentry_t *hidden_dentry,
-+ dentry_t *hidden_sto_dentry,
-+ dentry_t *dentry,
-+ super_block_t *sb, int flag);
-+
-+extern int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
-+ dentry_t *src_dentry, struct vfsmount *src_mnt);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd);
-+
-+extern int create_sto_nod(dentry_t *dentry, int mode, dev_t dev);
-+extern int create_sto_reg_file(dentry_t *dentry, int mode, struct nameidata *nd);
-+#else
-+extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode);
-+
-+extern int create_sto_nod(dentry_t *dentry, int mode, int dev);
-+extern int create_sto_reg_file(dentry_t *dentry, int mode);
-+#endif
-+
-+extern int create_sto_dir(dentry_t *dentry, int mode);
-+
-+extern int exists_in_storage(dentry_t *dentry);
-+extern int is_mini_fo_existant(dentry_t *dentry);
-+extern int get_neg_sto_dentry(dentry_t *dentry);
-+extern int build_sto_structure(dentry_t *dir, dentry_t *dentry);
-+extern int get_mini_fo_bpath(dentry_t *dentry, char **bpath, int *bpath_len);
-+extern dentry_t *bpath_walk(super_block_t *sb, char *bpath);
-+extern int bpath_put(dentry_t *dentry);
-+
-+/* check_mini_fo types functions */
-+extern int check_mini_fo_dentry(dentry_t *dentry);
-+extern int check_mini_fo_file(file_t *file);
-+extern int check_mini_fo_inode(inode_t *inode);
-+
-+/* General meta functions, can be called from outside of meta.c */
-+extern int meta_build_lists(dentry_t *dentry);
-+extern int meta_put_lists(dentry_t *dentry);
-+extern int __meta_put_lists(inode_t *inode);
-+
-+extern int meta_add_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int meta_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len);
-+
-+extern int meta_remove_r_entry(dentry_t *dentry, const char *name, int len);
-+
-+extern int meta_check_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int __meta_check_d_entry(inode_t *inode, const char *name, int len);
-+
-+extern char* meta_check_r_entry(dentry_t *dentry, const char *name, int len);
-+extern char* __meta_check_r_entry(inode_t *inode, const char *name, int len);
-+extern int meta_is_r_entry(dentry_t *dentry, const char *name, int len);
-+extern int __meta_is_r_entry(inode_t *inode, const char *name, int len);
-+
-+/* Specific meta functions, should be called only inside meta.c */
-+extern int __meta_put_d_list(inode_t *inode);
-+extern int __meta_put_r_list(inode_t *inode);
-+
-+extern int meta_list_add_d_entry(dentry_t *dentry,
-+ const char *name, int len);
-+extern int meta_list_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len);
-+
-+extern int meta_list_remove_r_entry(dentry_t *dentry,
-+ const char *name, int len);
-+
-+extern int __meta_list_remove_r_entry(inode_t *inode,
-+ const char *name, int len);
-+
-+extern int meta_write_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int meta_write_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len);
-+
-+extern int meta_sync_lists(dentry_t *dentry);
-+extern int meta_sync_d_list(dentry_t *dentry, int app_flag);
-+extern int meta_sync_r_list(dentry_t *dentry, int app_flag);
-+
-+/* ndl stuff */
-+extern int ndl_add_entry(struct readdir_data *rd, const char *name, int len);
-+extern void ndl_put_list(struct readdir_data *rd);
-+extern int ndl_check_entry(struct readdir_data *rd,
-+ const char *name, int len);
-+
-+
-+# define copy_inode_size(dst, src) \
-+ dst->i_size = src->i_size; \
-+ dst->i_blocks = src->i_blocks;
-+
-+static inline void
-+fist_copy_attr_atime(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_atime = src->i_atime;
-+}
-+static inline void
-+fist_copy_attr_times(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_atime = src->i_atime;
-+ dest->i_mtime = src->i_mtime;
-+ dest->i_ctime = src->i_ctime;
-+}
-+static inline void
-+fist_copy_attr_timesizes(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_atime = src->i_atime;
-+ dest->i_mtime = src->i_mtime;
-+ dest->i_ctime = src->i_ctime;
-+ copy_inode_size(dest, src);
-+}
-+static inline void
-+fist_copy_attr_all(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_mode = src->i_mode;
-+ dest->i_nlink = src->i_nlink;
-+ dest->i_uid = src->i_uid;
-+ dest->i_gid = src->i_gid;
-+ dest->i_rdev = src->i_rdev;
-+ dest->i_atime = src->i_atime;
-+ dest->i_mtime = src->i_mtime;
-+ dest->i_ctime = src->i_ctime;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+ dest->i_blksize = src->i_blksize;
-+#endif
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,12)
-+ dest->i_blkbits = src->i_blkbits;
-+# endif /* linux 2.4.12 and newer */
-+ copy_inode_size(dest, src);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ dest->i_attr_flags = src->i_attr_flags;
-+#else
-+ dest->i_flags = src->i_flags;
-+#endif
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+/* copied from linux/fs.h */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+static inline void double_lock(struct dentry *d1, struct dentry *d2)
-+{
-+ struct mutex *m1 = &d1->d_inode->i_mutex;
-+ struct mutex *m2 = &d2->d_inode->i_mutex;
-+ if (m1 != m2) {
-+ if ((unsigned long) m1 < (unsigned long) m2) {
-+ struct mutex *tmp = m2;
-+ m2 = m1; m1 = tmp;
-+ }
-+ mutex_lock(m1);
-+ }
-+ mutex_lock(m2);
-+}
-+
-+static inline void double_unlock(struct dentry *d1, struct dentry *d2)
-+{
-+ struct mutex *m1 = &d1->d_inode->i_mutex;
-+ struct mutex *m2 = &d2->d_inode->i_mutex;
-+ mutex_unlock(m1);
-+ if (m1 != m2)
-+ mutex_unlock(m2);
-+ dput(d1);
-+ dput(d2);
-+}
-+
-+#else
-+static inline void double_down(struct semaphore *s1, struct semaphore *s2)
-+{
-+ if (s1 != s2) {
-+ if ((unsigned long) s1 < (unsigned long) s2) {
-+ struct semaphore *tmp = s2;
-+ s2 = s1; s1 = tmp;
-+ }
-+ down(s1);
-+ }
-+ down(s2);
-+}
-+
-+static inline void double_up(struct semaphore *s1, struct semaphore *s2)
-+{
-+ up(s1);
-+ if (s1 != s2)
-+ up(s2);
-+}
-+
-+static inline void double_lock(struct dentry *d1, struct dentry *d2)
-+{
-+ double_down(&d1->d_inode->i_sem, &d2->d_inode->i_sem);
-+}
-+
-+static inline void double_unlock(struct dentry *d1, struct dentry *d2)
-+{
-+ double_up(&d1->d_inode->i_sem,&d2->d_inode->i_sem);
-+ dput(d1);
-+ dput(d2);
-+}
-+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) */
-+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
-+#endif /* __KERNEL__ */
-+
-+/*
-+ * Definitions for user and kernel code
-+ */
-+
-+/* ioctls */
-+
-+#endif /* not __MINI_FO_H_ */
---- /dev/null
-+++ b/fs/mini_fo/mini_fo-merge
-@@ -0,0 +1,180 @@
-+#!/bin/bash
-+#
-+# Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.de>
-+# 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.
-+#
-+
-+BASE=
-+STO=
-+HELP=
-+DRYRUN=
-+VERBOSE=
-+TMP="/tmp/"
-+META_NAME="META_dAfFgHE39ktF3HD2sr"
-+SKIP_DEL_LIST="skip-delete-list.mini_fo-merge"
-+
-+COMMAND=
-+exec_command()
-+{
-+ if [ x$DRYRUN == "xset" ]; then
-+ echo " would run: $COMMAND"
-+ elif ! [ x$DRYRUN == "xset" ]; then
-+ if [ x$VERBOSE == "xset" ]; then
-+ echo " running: $COMMAND"
-+ fi
-+ eval $COMMAND
-+ fi
-+}
-+
-+usage()
-+{
-+cat <<EOF
-+
-+USAGE: $0 -b <base dir> -s <storage dir>
-+Version 0.1
-+
-+This script merges the contents of a mini_fo storage file system back
-+to the base file system.
-+
-+!!! Warning: This will modify the base filesystem and can destroy data
-+ if used wrongly.
-+
-+Options:
-+ -b <base dir>
-+ the directory of the base file system.
-+
-+ -s <storage dir>
-+ the directory of the storage file system.
-+
-+ -d dry run, will not change anything and print the commands that
-+ would be executed.
-+
-+ -t tmp dir for storing temporary file. default: $TMP
-+
-+ -v show what operations are performed.
-+
-+ -h displays this message.
-+
-+EOF
-+}
-+
-+# parse parameters
-+while getopts hdvt:b:s: OPTS
-+ do
-+ case $OPTS in
-+ h) HELP="set";;
-+ d) DRYRUN="set";;
-+ v) VERBOSE="set";;
-+ b) BASE="$OPTARG";;
-+ s) STO="$OPTARG";;
-+ t) TMP="$OPTARG";;
-+ ?) usage
-+ exit 1;;
-+ esac
-+done
-+
-+if [ "x$HELP" == "xset" ]; then
-+ usage
-+ exit -1
-+fi
-+
-+if ! [ -d "$BASE" ] || ! [ -d "$STO" ]; then
-+ echo -e "$0:\n Error, -s and/or -b argument missing. type $0 -h for help."
-+ exit -1;
-+fi
-+
-+# get full paths
-+pushd $STO; STO=`pwd`; popd
-+pushd $BASE; BASE=`pwd`; popd
-+TMP=${TMP%/}
-+
-+
-+cat<<EOF
-+###############################################################################
-+# mini_fo-merge
-+#
-+# base dir: $BASE
-+# storage dir: $STO
-+# meta filename: $META_NAME
-+# dry run: $DRYRUN
-+# verbose: $VERBOSE
-+# tmp files: $TMP
-+###############################################################################
-+
-+EOF
-+
-+rm $TMP/$SKIP_DEL_LIST
-+
-+# first process all renamed dirs
-+echo "Merging renamed directories..."
-+pushd $STO &> /dev/null
-+find . -name $META_NAME -type f -print0 | xargs -0 -e grep -e '^R ' | tr -s ':R' ' ' | while read ENTRY; do
-+ echo "entry: $ENTRY"
-+ META_FILE=`echo $ENTRY | cut -d ' ' -f 1`
-+ OLD_B_DIR=`echo $ENTRY | cut -d ' ' -f 2 | sed -e 's/\///'`
-+ NEW_NAME=`echo $ENTRY | cut -d ' ' -f 3`
-+ NEW_B_DIR=`echo $META_FILE | sed -e "s/$META_NAME/$NEW_NAME/" | sed -e 's/^\.\///'`
-+ echo "META_FILE: $META_FILE"
-+ echo "OLD_B_DIR: $OLD_B_DIR"
-+ echo "NEW_NAME: $NEW_NAME"
-+ echo "NEW_B_DIR: $NEW_B_DIR"
-+
-+ pushd $BASE &> /dev/null
-+ # remove an existing dir in storage
-+ COMMAND="rm -rf $NEW_B_DIR"; exec_command
-+ COMMAND="cp -R $OLD_B_DIR $NEW_B_DIR"; exec_command
-+ echo ""
-+ popd &> /dev/null
-+
-+ # remember this dir to exclude it from deleting later
-+ echo $NEW_B_DIR >> $TMP/$SKIP_DEL_LIST
-+done
-+
-+# delete all whiteouted files from base
-+echo -e "\nDeleting whiteout'ed files from base file system..."
-+find . -name $META_NAME -type f -print0 | xargs -0 -e grep -e '^D ' | sed -e 's/:D//' | while read ENTRY; do
-+ META_FILE=`echo $ENTRY | cut -d ' ' -f 1`
-+ DEL_NAME=`echo $ENTRY | cut -d ' ' -f 2`
-+ DEL_FILE=`echo $META_FILE | sed -e "s/$META_NAME/$DEL_NAME/" | sed -e 's/^\.\///'`
-+ grep -x $DEL_FILE $TMP/$SKIP_DEL_LIST &> /dev/null
-+ if [ $? -ne 0 ]; then
-+ pushd $BASE &> /dev/null
-+ COMMAND="rm -rf $DEL_FILE"; exec_command
-+ popd &> /dev/null
-+ else
-+ echo " excluding: $DEL_FILE as in skip-del-list."
-+ fi
-+done
-+
-+# create all dirs and update permissions
-+echo -e "\nSetting up directory structures in base file system..."
-+find . -type d | sed -e 's/^\.\///' | while read DIR; do
-+ PERMS=`stat -c %a $DIR`
-+ DIR_UID=`stat -c %u $DIR`
-+ DIR_GID=`stat -c %g $DIR`
-+ pushd $BASE &> /dev/null
-+ if ! [ -d $DIR ]; then
-+ COMMAND="mkdir -p $DIR"; exec_command
-+ fi
-+ COMMAND="chmod $PERMS $DIR"; exec_command
-+ COMMAND="chown $DIR_UID:$DIR_GID $DIR"; exec_command
-+ popd &> /dev/null
-+done
-+
-+# merge all non-directory files
-+echo -e "\nMerging all non-directory files...."
-+for i in b c p f l s; do
-+ find . -type $i | sed -e 's/^\.\///' | grep -v "$META_NAME" | while read FILE; do
-+ pushd $BASE #&> /dev/null
-+ COMMAND="cp -df $STO/$FILE $BASE/$FILE"; exec_command
-+ popd &> /dev/null
-+ done
-+done
-+popd &> /dev/null
-+
-+#rm $TMP/$SKIP_DEL_LIST
-+
-+echo "Done!"
---- /dev/null
-+++ b/fs/mini_fo/mini_fo-overlay
-@@ -0,0 +1,130 @@
-+#!/bin/bash
-+#
-+# Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.de>
-+# 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.
-+#
-+
-+HELP=
-+SUFF=
-+MNTP=
-+MNT_DIR="/mnt"
-+STO=
-+STO_DIR="/tmp"
-+BASE=
-+
-+usage()
-+{
-+cat <<EOF
-+
-+Usage: $0 [-s suffix] [-d sto_dir_dir] [-m mount point] base_dir
-+Version 0.1
-+
-+This script overlays the given base directory using the mini_fo file
-+system. If only the base directory base_dir is given, $0
-+will use a storage directory called "sto-<base_dir_name>" in $STO_DIR,
-+and mount point "mini_fo-<base_dir_dir>" in $MNT_DIR.
-+
-+Options:
-+ -s <suffix>
-+ add given suffix to storage directory and the mount
-+ point. This is usefull for overlaying one base directory
-+ several times and avoiding conflicts with storage directory
-+ names and mount points.
-+
-+ -d <sto_dir_dir>
-+ change the directory in which the storage directory will be
-+ created (default is currently "$STO_DIR".
-+
-+ -m <mount point>
-+ use an alternative directory to create the mini_fo
-+ mountpoint (default is currently "$MNT_DIR".
-+
-+ -h displays this message.
-+
-+EOF
-+exit 1;
-+}
-+
-+while getopts hm:s:d: OPTS
-+ do
-+ case $OPTS in
-+ s) SUFF="$OPTARG";;
-+ d) STO_DIR="$OPTARG";;
-+ m) MNT_DIR="$OPTARG";;
-+ h) HELP="set";;
-+ ?) usage
-+ exit 1;;
-+ esac
-+done
-+shift $(($OPTIND - 1))
-+
-+BASE="$1"
-+
-+if [ "x$HELP" == "xset" ]; then
-+ usage
-+ exit -1
-+fi
-+
-+# fix suffix
-+if [ "x$SUFF" != "x" ]; then
-+ SUFF="-$SUFF"
-+fi
-+
-+# kill trailing slashes
-+MNT_DIR=${MNT_DIR%/}
-+STO_DIR=${STO_DIR%/}
-+BASE=${BASE%/}
-+
-+
-+if ! [ -d "$BASE" ]; then
-+ echo "invalid base dir $BASE, run $0 -h for help."
-+ exit -1
-+fi
-+
-+# check opts
-+if ! [ -d "$MNT_DIR" ]; then
-+ echo "invalid mount dir $MNT_DIR, run $0 -h for help."
-+ exit -1
-+fi
-+
-+if ! [ -d "$STO_DIR" ]; then
-+ echo "invalid sto_dir_dir $STO_DIR, run $0 -h for help."
-+ exit -1
-+fi
-+
-+MNTP="$MNT_DIR/mini_fo-`basename $BASE`$SUFF"
-+STO="$STO_DIR/sto-`basename $BASE`$SUFF"
-+
-+# create the mount point if it doesn't exist
-+mkdir -p $MNTP
-+if [ $? -ne 0 ]; then
-+ echo "Error, failed to create mount point $MNTP"
-+fi
-+
-+mkdir -p $STO
-+if [ $? -ne 0 ]; then
-+ echo "Error, failed to create storage dir $STO"
-+fi
-+
-+# check if fs is already mounted
-+mount | grep mini_fo | grep $MNTP &> /dev/null
-+if [ $? -eq 0 ]; then
-+ echo "Error, existing mini_fo mount at $MNTP."
-+ exit -1
-+fi
-+
-+mount | grep mini_fo | grep $STO &> /dev/null
-+if [ $? -eq 0 ]; then
-+ echo "Error, $STO seems to be used already."
-+ exit -1
-+fi
-+
-+# mount
-+mount -t mini_fo -o base=$BASE,sto=$STO $BASE $MNTP
-+
-+if [ $? -ne 0 ]; then
-+ echo "Error, mounting failed, maybe no permisson to mount?"
-+fi
---- /dev/null
-+++ b/fs/mini_fo/mmap.c
-@@ -0,0 +1,637 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+#ifdef FIST_COUNT_WRITES
-+/* for counting writes in the middle vs. regular writes */
-+unsigned long count_writes = 0, count_writes_middle = 0;
-+#endif /* FIST_COUNT_WRITES */
-+
-+/* forward declaration of commit write and prepare write */
-+STATIC int mini_fo_commit_write(file_t *file, page_t *page, unsigned from, unsigned to);
-+STATIC int mini_fo_prepare_write(file_t *file, page_t *page, unsigned from, unsigned to);
-+
-+
-+/*
-+ * Function for handling creation of holes when lseek-ing past the
-+ * end of the file and then writing some data.
-+ */
-+int
-+mini_fo_fill_zeros(file_t* file, page_t *page, unsigned from)
-+{
-+ int err = 0;
-+ dentry_t *dentry = file->f_dentry;
-+ inode_t *inode = dentry->d_inode;
-+ page_t *tmp_page;
-+ int index;
-+
-+ print_entry_location();
-+
-+ for (index = inode->i_size >> PAGE_CACHE_SHIFT; index < page->index; index++) {
-+ tmp_page = mini_fo_get1page(file, index);
-+ if (IS_ERR(tmp_page)) {
-+ err = PTR_ERR(tmp_page);
-+ goto out;
-+ }
-+
-+ /*
-+ * zero out rest of the contents of the page between the appropriate
-+ * offsets.
-+ */
-+ memset((char*)page_address(tmp_page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, PAGE_CACHE_SIZE - (inode->i_size & ~PAGE_CACHE_MASK));
-+
-+ if (! (err = mini_fo_prepare_write(file, tmp_page, 0, PAGE_CACHE_SIZE)))
-+ err = mini_fo_commit_write(file, tmp_page, 0, PAGE_CACHE_SIZE);
-+
-+ page_cache_release(tmp_page);
-+ if (err < 0)
-+ goto out;
-+ if (current->need_resched)
-+ schedule();
-+ }
-+
-+ /* zero out appropriate parts of last page */
-+
-+ /*
-+ * if the encoding type is block, then adjust the 'from' (where the
-+ * zeroing will start) offset appropriately
-+ */
-+ from = from & (~(FIST_ENCODING_BLOCKSIZE - 1));
-+
-+ if ((from - (inode->i_size & ~PAGE_CACHE_MASK)) > 0) {
-+
-+ memset((char*)page_address(page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, from - (inode->i_size & ~PAGE_CACHE_MASK));
-+ if (! (err = mini_fo_prepare_write(file, page, 0, PAGE_CACHE_SIZE)))
-+ err = mini_fo_commit_write(file, page, 0, PAGE_CACHE_SIZE);
-+
-+ if (err < 0)
-+ goto out;
-+ if (current->need_resched)
-+ schedule();
-+ }
-+
-+ out:
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_writepage(page_t *page)
-+{
-+ int err = -EIO;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ page_t *hidden_page;
-+ char *kaddr, *hidden_kaddr;
-+
-+ print_entry_location();
-+
-+ inode = page->mapping->host;
-+ hidden_inode = itohi(inode);
-+
-+ /*
-+ * writepage is called when shared mmap'ed files need to write
-+ * their pages, while prepare/commit_write are called from the
-+ * non-paged write() interface. (However, in 2.3 the two interfaces
-+ * share the same cache, while in 2.2 they didn't.)
-+ *
-+ * So we pretty much have to duplicate much of what commit_write does.
-+ */
-+
-+ /* find lower page (returns a locked page) */
-+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+ if (!hidden_page)
-+ goto out;
-+
-+ /* get page address, and encode it */
-+ kaddr = (char *) kmap(page);
-+ hidden_kaddr = (char*) kmap(hidden_page);
-+ mini_fo_encode_block(kaddr, hidden_kaddr, PAGE_CACHE_SIZE, inode, inode->i_sb, page->index);
-+ /* if encode_block could fail, then return error */
-+ kunmap(page);
-+ kunmap(hidden_page);
-+
-+ /* call lower writepage (expects locked page) */
-+ err = hidden_inode->i_mapping->a_ops->writepage(hidden_page);
-+
-+ /*
-+ * update mtime and ctime of lower level file system
-+ * mini_fo' mtime and ctime are updated by generic_file_write
-+ */
-+ hidden_inode->i_mtime = hidden_inode->i_ctime = CURRENT_TIME;
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,1)
-+ UnlockPage(hidden_page); /* b/c grab_cache_page locked it */
-+# endif /* kernel older than 2.4.1 */
-+ page_cache_release(hidden_page); /* b/c grab_cache_page increased refcnt */
-+
-+ if (err)
-+ ClearPageUptodate(page);
-+ else
-+ SetPageUptodate(page);
-+ out:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,1)
-+ UnlockPage(page);
-+# endif /* kernel 2.4.1 and newer */
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+/*
-+ * get one page from cache or lower f/s, return error otherwise.
-+ * returns unlocked, up-to-date page (if ok), with increased refcnt.
-+ */
-+page_t *
-+mini_fo_get1page(file_t *file, int index)
-+{
-+ page_t *page;
-+ dentry_t *dentry;
-+ inode_t *inode;
-+ struct address_space *mapping;
-+ int err;
-+
-+ print_entry_location();
-+
-+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+ inode = dentry->d_inode;
-+ mapping = inode->i_mapping;
-+
-+ fist_dprint(8, "%s: read page index %d pid %d\n", __FUNCTION__, index, current->pid);
-+ if (index < 0) {
-+ printk("%s BUG: index=%d\n", __FUNCTION__, index);
-+ page = ERR_PTR(-EIO);
-+ goto out;
-+ }
-+ page = read_cache_page(mapping,
-+ index,
-+ (filler_t *) mapping->a_ops->readpage,
-+ (void *) file);
-+ if (IS_ERR(page))
-+ goto out;
-+ wait_on_page(page);
-+ if (!Page_Uptodate(page)) {
-+ lock_page(page);
-+ err = mapping->a_ops->readpage(file, page);
-+ if (err) {
-+ page = ERR_PTR(err);
-+ goto out;
-+ }
-+ wait_on_page(page);
-+ if (!Page_Uptodate(page)) {
-+ page = ERR_PTR(-EIO);
-+ goto out;
-+ }
-+ }
-+
-+ out:
-+ print_exit_pointer(page);
-+ return page;
-+}
-+
-+
-+/*
-+ * get one page from cache or lower f/s, return error otherwise.
-+ * similar to get1page, but doesn't guarantee that it will return
-+ * an unlocked page.
-+ */
-+page_t *
-+mini_fo_get1page_cached(file_t *file, int index)
-+{
-+ page_t *page;
-+ dentry_t *dentry;
-+ inode_t *inode;
-+ struct address_space *mapping;
-+ int err;
-+
-+ print_entry_location();
-+
-+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+ inode = dentry->d_inode;
-+ mapping = inode->i_mapping;
-+
-+ fist_dprint(8, "%s: read page index %d pid %d\n", __FUNCTION__, index, current->pid);
-+ if (index < 0) {
-+ printk("%s BUG: index=%d\n", __FUNCTION__, index);
-+ page = ERR_PTR(-EIO);
-+ goto out;
-+ }
-+ page = read_cache_page(mapping,
-+ index,
-+ (filler_t *) mapping->a_ops->readpage,
-+ (void *) file);
-+ if (IS_ERR(page))
-+ goto out;
-+
-+ out:
-+ print_exit_pointer(page);
-+ return page;
-+}
-+
-+
-+/*
-+ * readpage is called from generic_page_read and the fault handler.
-+ * If your file system uses generic_page_read for the read op, it
-+ * must implement readpage.
-+ *
-+ * Readpage expects a locked page, and must unlock it.
-+ */
-+STATIC int
-+mini_fo_do_readpage(file_t *file, page_t *page)
-+{
-+ int err = -EIO;
-+ dentry_t *dentry;
-+ file_t *hidden_file = NULL;
-+ dentry_t *hidden_dentry;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ char *page_data;
-+ page_t *hidden_page;
-+ char *hidden_page_data;
-+ int real_size;
-+
-+ print_entry_location();
-+
-+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+ if (ftopd(file) != NULL)
-+ hidden_file = ftohf(file);
-+ hidden_dentry = dtohd(dentry);
-+ inode = dentry->d_inode;
-+ hidden_inode = itohi(inode);
-+
-+ fist_dprint(7, "%s: requesting page %d from file %s\n", __FUNCTION__, page->index, dentry->d_name.name);
-+
-+ MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages);
-+ MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages);
-+ FOR_EACH_PAGE
-+ CURRENT_HIDDEN_PAGE = NULL;
-+
-+ /* find lower page (returns a locked page) */
-+ FOR_EACH_PAGE {
-+ fist_dprint(8, "%s: Current page index = %d\n", __FUNCTION__, CURRENT_HIDDEN_PAGEINDEX);
-+ CURRENT_HIDDEN_PAGE = read_cache_page(hidden_inode->i_mapping,
-+ CURRENT_HIDDEN_PAGEINDEX,
-+ (filler_t *) hidden_inode->i_mapping->a_ops->readpage,
-+ (void *) hidden_file);
-+ if (IS_ERR(CURRENT_HIDDEN_PAGE)) {
-+ err = PTR_ERR(CURRENT_HIDDEN_PAGE);
-+ CURRENT_HIDDEN_PAGE = NULL;
-+ goto out_release;
-+ }
-+ }
-+
-+ /*
-+ * wait for the page data to show up
-+ * (signaled by readpage as unlocking the page)
-+ */
-+ FOR_EACH_PAGE {
-+ wait_on_page(CURRENT_HIDDEN_PAGE);
-+ if (!Page_Uptodate(CURRENT_HIDDEN_PAGE)) {
-+ /*
-+ * call readpage() again if we returned from wait_on_page with a
-+ * page that's not up-to-date; that can happen when a partial
-+ * page has a few buffers which are ok, but not the whole
-+ * page.
-+ */
-+ lock_page(CURRENT_HIDDEN_PAGE);
-+ err = hidden_inode->i_mapping->a_ops->readpage(hidden_file,
-+ CURRENT_HIDDEN_PAGE);
-+ if (err) {
-+ CURRENT_HIDDEN_PAGE = NULL;
-+ goto out_release;
-+ }
-+ wait_on_page(CURRENT_HIDDEN_PAGE);
-+ if (!Page_Uptodate(CURRENT_HIDDEN_PAGE)) {
-+ err = -EIO;
-+ goto out_release;
-+ }
-+ }
-+ }
-+
-+ /* map pages, get their addresses */
-+ page_data = (char *) kmap(page);
-+ FOR_EACH_PAGE
-+ CURRENT_HIDDEN_PAGEDATA = (char *) kmap(CURRENT_HIDDEN_PAGE);
-+
-+ /* if decode_block could fail, then return error */
-+ err = 0;
-+ real_size = hidden_inode->i_size - (page->index << PAGE_CACHE_SHIFT);
-+ if (real_size <= 0)
-+ memset(page_data, 0, PAGE_CACHE_SIZE);
-+ else if (real_size < PAGE_CACHE_SIZE) {
-+ mini_fo_decode_block(hidden_page_data, page_data, real_size, inode, inode->i_sb, page->index);
-+ memset(page_data + real_size, 0, PAGE_CACHE_SIZE - real_size);
-+ } else
-+ mini_fo_decode_block(hidden_page_data, page_data, PAGE_CACHE_SIZE, inode, inode->i_sb, page->index);
-+
-+ FOR_EACH_PAGE
-+ kunmap(CURRENT_HIDDEN_PAGE);
-+ kunmap(page);
-+
-+ out_release:
-+ FOR_EACH_PAGE
-+ if (CURRENT_HIDDEN_PAGE)
-+ page_cache_release(CURRENT_HIDDEN_PAGE); /* undo read_cache_page */
-+
-+ FREE_PAGE_POINTERS(hidden_pages, num_hidden_pages);
-+ FREE_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages);
-+
-+ out:
-+ if (err == 0)
-+ SetPageUptodate(page);
-+ else
-+ ClearPageUptodate(page);
-+
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_readpage(file_t *file, page_t *page)
-+{
-+ int err;
-+ print_entry_location();
-+
-+ err = mini_fo_do_readpage(file, page);
-+
-+ /*
-+ * we have to unlock our page, b/c we _might_ have gotten a locked page.
-+ * but we no longer have to wakeup on our page here, b/c UnlockPage does
-+ * it
-+ */
-+ UnlockPage(page);
-+
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_prepare_write(file_t *file, page_t *page, unsigned from, unsigned to)
-+{
-+ int err = 0;
-+
-+ print_entry_location();
-+
-+ /*
-+ * we call kmap(page) only here, and do the kunmap
-+ * and the actual downcalls, including unlockpage and uncache
-+ * in commit_write.
-+ */
-+ kmap(page);
-+
-+ /* fast path for whole page writes */
-+ if (from == 0 && to == PAGE_CACHE_SIZE)
-+ goto out;
-+ /* read the page to "revalidate" our data */
-+ /* call the helper function which doesn't unlock the page */
-+ if (!Page_Uptodate(page))
-+ err = mini_fo_do_readpage(file, page);
-+
-+ out:
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_commit_write(file_t *file, page_t *page, unsigned from, unsigned to)
-+{
-+ int err = -ENOMEM;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ page_t *hidden_page;
-+ file_t *hidden_file = NULL;
-+ loff_t pos;
-+ unsigned bytes = to - from;
-+ unsigned hidden_from, hidden_to, hidden_bytes;
-+
-+ print_entry_location();
-+
-+ inode = page->mapping->host; /* CPW: Moved below print_entry_location */
-+ hidden_inode = itohi(inode);
-+
-+ ASSERT(file != NULL);
-+ /*
-+ * here we have a kmapped page, with data from the user copied
-+ * into it. we need to encode_block it, and then call the lower
-+ * commit_write. We also need to simulate same behavior of
-+ * generic_file_write, and call prepare_write on the lower f/s first.
-+ */
-+#ifdef FIST_COUNT_WRITES
-+ count_writes++;
-+# endif /* FIST_COUNT_WRITES */
-+
-+ /* this is append and/or extend -- we can't have holes so fill them in */
-+ if (page->index > (hidden_inode->i_size >> PAGE_CACHE_SHIFT)) {
-+ page_t *tmp_page;
-+ int index;
-+ for (index = hidden_inode->i_size >> PAGE_CACHE_SHIFT; index < page->index; index++) {
-+ tmp_page = mini_fo_get1page(file, index);
-+ if (IS_ERR(tmp_page)) {
-+ err = PTR_ERR(tmp_page);
-+ goto out;
-+ }
-+ /* zero out the contents of the page at the appropriate offsets */
-+ memset((char*)page_address(tmp_page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, PAGE_CACHE_SIZE - (inode->i_size & ~PAGE_CACHE_MASK));
-+ if (!(err = mini_fo_prepare_write(file, tmp_page, 0, PAGE_CACHE_SIZE)))
-+ err = mini_fo_commit_write(file, tmp_page, 0, PAGE_CACHE_SIZE);
-+ page_cache_release(tmp_page);
-+ if (err < 0)
-+ goto out;
-+ if (current->need_resched)
-+ schedule();
-+ }
-+ }
-+
-+ if (ftopd(file) != NULL)
-+ hidden_file = ftohf(file);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_inode->i_mutex);
-+#else
-+ down(&hidden_inode->i_sem);
-+#endif
-+ /* find lower page (returns a locked page) */
-+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+ if (!hidden_page)
-+ goto out;
-+
-+#if FIST_ENCODING_BLOCKSIZE > 1
-+# error encoding_blocksize greater than 1 is not yet supported
-+# endif /* FIST_ENCODING_BLOCKSIZE > 1 */
-+
-+ hidden_from = from & (~(FIST_ENCODING_BLOCKSIZE - 1));
-+ hidden_to = ((to + FIST_ENCODING_BLOCKSIZE - 1) & (~(FIST_ENCODING_BLOCKSIZE - 1)));
-+ if ((page->index << PAGE_CACHE_SHIFT) + to > hidden_inode->i_size) {
-+
-+ /*
-+ * if this call to commit_write had introduced holes and the code
-+ * for handling holes was invoked, then the beginning of this page
-+ * must be zeroed out
-+ * zero out bytes from 'size_of_file%pagesize' to 'from'.
-+ */
-+ if ((hidden_from - (inode->i_size & ~PAGE_CACHE_MASK)) > 0)
-+ memset((char*)page_address(page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, hidden_from - (inode->i_size & ~PAGE_CACHE_MASK));
-+
-+ }
-+ hidden_bytes = hidden_to - hidden_from;
-+
-+ /* call lower prepare_write */
-+ err = -EINVAL;
-+ if (hidden_inode->i_mapping &&
-+ hidden_inode->i_mapping->a_ops &&
-+ hidden_inode->i_mapping->a_ops->prepare_write)
-+ err = hidden_inode->i_mapping->a_ops->prepare_write(hidden_file,
-+ hidden_page,
-+ hidden_from,
-+ hidden_to);
-+ if (err)
-+ /* don't leave locked pages behind, esp. on an ENOSPC */
-+ goto out_unlock;
-+
-+ fist_dprint(8, "%s: encoding %d bytes\n", __FUNCTION__, hidden_bytes);
-+ mini_fo_encode_block((char *) page_address(page) + hidden_from, (char*) page_address(hidden_page) + hidden_from, hidden_bytes, inode, inode->i_sb, page->index);
-+ /* if encode_block could fail, then goto unlock and return error */
-+
-+ /* call lower commit_write */
-+ err = hidden_inode->i_mapping->a_ops->commit_write(hidden_file,
-+ hidden_page,
-+ hidden_from,
-+ hidden_to);
-+
-+ if (err < 0)
-+ goto out_unlock;
-+
-+ err = bytes; /* convert error to no. of bytes */
-+
-+ inode->i_blocks = hidden_inode->i_blocks;
-+ /* we may have to update i_size */
-+ pos = (page->index << PAGE_CACHE_SHIFT) + to;
-+ if (pos > inode->i_size)
-+ inode->i_size = pos;
-+
-+ /*
-+ * update mtime and ctime of lower level file system
-+ * mini_fo' mtime and ctime are updated by generic_file_write
-+ */
-+ hidden_inode->i_mtime = hidden_inode->i_ctime = CURRENT_TIME;
-+
-+ mark_inode_dirty_sync(inode);
-+
-+ out_unlock:
-+ UnlockPage(hidden_page);
-+ page_cache_release(hidden_page);
-+ kunmap(page); /* kmap was done in prepare_write */
-+ out:
-+ /* we must set our page as up-to-date */
-+ if (err < 0)
-+ ClearPageUptodate(page);
-+ else
-+ SetPageUptodate(page);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_inode->i_mutex);
-+#else
-+ up(&hidden_inode->i_sem);
-+#endif
-+ print_exit_status(err);
-+ return err; /* assume all is ok */
-+}
-+
-+
-+STATIC int
-+mini_fo_bmap(struct address_space *mapping, long block)
-+{
-+ int err = 0;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+
-+ print_entry_location();
-+
-+ inode = (inode_t *) mapping->host;
-+ hidden_inode = itohi(inode);
-+
-+ if (hidden_inode->i_mapping->a_ops->bmap)
-+ err = hidden_inode->i_mapping->a_ops->bmap(hidden_inode->i_mapping, block);
-+ print_exit_location();
-+ return err;
-+}
-+
-+
-+/*
-+ * This function is copied verbatim from mm/filemap.c.
-+ * XXX: It should be simply moved to some header file instead -- bug Al about it!
-+ */
-+static inline int sync_page(struct page *page)
-+{
-+ struct address_space *mapping = page->mapping;
-+
-+ if (mapping && mapping->a_ops && mapping->a_ops->sync_page)
-+ return mapping->a_ops->sync_page(page);
-+ return 0;
-+}
-+
-+
-+/*
-+ * XXX: we may not need this function if not FIST_FILTER_DATA.
-+ * FIXME: for FIST_FILTER_SCA, get all lower pages and sync them each.
-+ */
-+STATIC int
-+mini_fo_sync_page(page_t *page)
-+{
-+ int err = 0;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ page_t *hidden_page;
-+
-+ print_entry_location();
-+
-+ inode = page->mapping->host; /* CPW: Moved below print_entry_location */
-+ hidden_inode = itohi(inode);
-+
-+ /* find lower page (returns a locked page) */
-+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+ if (!hidden_page)
-+ goto out;
-+
-+ err = sync_page(hidden_page);
-+
-+ UnlockPage(hidden_page); /* b/c grab_cache_page locked it */
-+ page_cache_release(hidden_page); /* b/c grab_cache_page increased refcnt */
-+
-+ out:
-+ print_exit_status(err);
-+ return err;
-+}
---- /dev/null
-+++ b/fs/mini_fo/README
-@@ -0,0 +1,163 @@
-+README for the mini_fo overlay file system
-+=========================================
-+
-+
-+WHAT IS MINI_FO?
-+----------------
-+
-+mini_fo is a virtual kernel file system that can make read-only
-+file systems writable. This is done by redirecting modifying operations
-+to a writeable location called "storage directory", and leaving the
-+original data in the "base directory" untouched. When reading, the
-+file system merges the modifed and original data so that only the
-+newest versions will appear. This occurs transparently to the user,
-+who can access the data like on any other read-write file system.
-+
-+Base and storage directories may be located on the same or on
-+different partitions and may be of different file system types. While
-+the storage directory obviously needs to be writable, the base may or
-+may not be writable, what doesn't matter as it will no be modified
-+anyway.
-+
-+
-+WHAT IS GOOD FOR?
-+-----------------
-+
-+The primary purpose of the mini_fo file system is to allow easy
-+software updates to embedded systems, that often store their root
-+file system in a read-only flash file system, but there are many
-+more as for example sandboxing, or for allowing live-cds to
-+permanently store information.
-+
-+
-+BUILDING
-+--------
-+This should be simple. Adjust the Makefile to point to the correct
-+kernel headers you want to build the module for. Then:
-+
-+ # make
-+
-+should build "mini_fo.o" for a 2.4 kernel or "mini_fo.ko" for a 2.6
-+kernel.
-+
-+If you are building the module for you current kernel, you can install
-+the module (as root):
-+
-+ # make install
-+
-+or uninstall with
-+
-+ # make uninstall
-+
-+
-+USING THE FILE SYSTEM
-+--------------------
-+
-+the general mount syntax is:
-+
-+ mount -t mini_fo -o base=<base directory>,sto=<storage directory>\
-+ <base directory> <mount point>
-+
-+Example:
-+
-+You have mounted a cdrom to /mnt/cdrom and want to modifiy some files
-+on it:
-+
-+load the module (as root)
-+
-+ # insmod mini_fo.o for a 2.4 kernel or
-+
-+ # insmod mini_fo.ko for a 2.6 kernel
-+
-+
-+create a storage dir in tmp and a mountpoint for mini_fo:
-+
-+ # mkdir /tmp/sto
-+ # mkdir /mnt/mini_fo
-+
-+and mount the mini_fo file system:
-+
-+ # mount -t mini_fo -o base=/mnt/cdrom,sto=/tmp/sto /mnt/cdrom /mnt/mini_fo
-+
-+
-+Now the data stored on the cd can be accessed via the mini_fo
-+mountpoint just like any read-write file system, files can be modified
-+and deleted, new ones can be created and so on. When done unmount the
-+file system:
-+
-+ # unmount /mnt/mini_fo
-+
-+Note that if the file system is mounted again using the same storage
-+file system, of course it will appear in the modified state again. If
-+you remount it using an new empty storage directory, it will be
-+unmodified. Therefore by executing:
-+
-+ # cd /tmp/sto
-+ # rm -rf *
-+
-+you can nuke all the changes you made to the original file system. But
-+ remember NEVER do this while the mini_fo file system is mounted!
-+
-+
-+Alternatively you can use the mini_fo-overlay bash script, that
-+simplifies managing mini_fo mounts. See TOOLS Section.
-+
-+
-+TOOLS
-+-----
-+
-+mini_fo-merge (experimental):
-+
-+This is a bash script that will merge changes contained in the storage
-+directory back to the base directory. This allows mini_fo to function
-+as a cache file system by overlaying a slow (network, ...) file system
-+and using a fast (ramdisk, ...) as storage. When done, changes can be
-+merged back to the (slow) base with mini_fo-merge. See "mini_fo-merge
-+-h" for details.
-+
-+It can be usefull for merging changes back after a successfull test
-+(patches, software updates...)
-+
-+
-+mini_fo-overlay:
-+
-+This bash script simplifies managing one or more mini_fo mounts. For
-+overlaying a directory called "basedir1", you can just call:
-+
-+ # mini_fo-overlay basedir1
-+
-+This will mount mini_fo with "basedir1" as base, "/tmp/sto-basedir1/"
-+as storage to "/mnt/mini_fo-basedir1/". It has more options though,
-+type "mini_fo-overlay -h" for details.
-+
-+
-+DOCUMENTATION, REPORTING BUGS, GETTING HELP
-+-------------------------------------------
-+
-+Please visit the mini_fo project page at:
-+
-+http://www.denx.de/twiki/bin/view/Know/MiniFOHome
-+
-+
-+WARNINGS
-+--------
-+
-+Never modify the base or the storage directorys while the mini_fo
-+file system is mounted, or you might crash you system. Simply accessing
-+and reading should not cause any trouble.
-+
-+Exporting a mini_fo mount point via NFS has not been tested, and may
-+or may not work.
-+
-+Check the RELEASE_NOTES for details on bugs and features.
-+
-+
-+
-+Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+
-+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.
-+
-+
---- /dev/null
-+++ b/fs/mini_fo/RELEASE_NOTES
-@@ -0,0 +1,111 @@
-+Release: mini_fo-0.6.1 (v0-6-1)
-+Date: 21.09.2005
-+
-+
-+Changes:
-+--------
-+v0-6-1:
-+
-+- bugfixes (see ChangeLog)
-+
-+- two helper scripts "mini_fo_merge" and "mini_fo_overlay" (see
-+ README for details).
-+
-+v0-6-0:
-+
-+- Support for 2.4 and 2.6 (see Makefile)
-+
-+- Partial hard link support (creating works as expected, but already
-+ existing links in the base file system will be treated as if they
-+ were individual files).
-+
-+- Various bugfixes and cleanups.
-+
-+
-+v0-6-0-pre1:
-+
-+- This is mini_fo-0-6-0-pre1! This release is a complete rewrite of
-+ many vital mini_fo parts such as the old whiteout list code which
-+ has been replaced by the new META subsystem.
-+
-+- Light weight directory renaming implemented. This means if a
-+ directory is renamed via the mini_fo filesystem this will no longer
-+ result in a complete copy in storage, instead only one empty
-+ directory will be created. All base filed contained in the original
-+ directory stay there until modified.
-+
-+- Special files (creating, renaming, deleting etc.) now working.
-+
-+- Many bugfixes and cleanup, mini_fo is now a lot more stable.
-+
-+
-+v0-5-10:
-+
-+- Final release of the 0-5-* versions. Next will be a complete rewrite
-+ of many features. This release contains several bugfixes related to
-+ directory renaming.
-+
-+
-+v0-5-10-pre6:
-+
-+- Lots of cleanup and several bugfixes related to directory deleting
-+
-+- Directory renaming suddenly works, what is most likely due to the
-+ fact tha that "mv" is smart: if the classic rename doesn't work it
-+ will assume that source and target file are on different fs and will
-+ copy the directory and try to remove the source directory. Until
-+ directory removing wasn't implemented, it would fail to do this and
-+ rollback.
-+ So, directory renaming works for now, but it doesn't yet do what you
-+ would expect from a overlay fs, so use with care.
-+
-+
-+v0-5-10-pre5:
-+
-+- implemented directory deleting
-+- made parsing of mount options more stable
-+- New format of mount options! (See README)
-+- I can't reproduce the unknown panic with 2.4.25 anymore, so I'll
-+ happily assume it never existed!
-+
-+
-+Implemented features:
-+---------------------
-+
-+- creating hard links (see BUGS on already existing hard links)
-+- lightweight directory renaming
-+- renaming device files, pipes, sockets, etc.
-+- creating, renaming, deleting of special files
-+- deleting directorys
-+- general directory reading (simple "ls" )
-+- creating files in existing directorys
-+- creating directorys
-+- renaming files.
-+- reading and writing files (involves opening)
-+- appending to files (creates copy in storage)
-+- deleting files
-+- llseek works too, what allows editors to work
-+- persistency (a deleted file stay deleted over remounts)
-+- use of symbolic links
-+- creating of device files
-+
-+
-+Not (yet) implemented features:
-+-------------------------------
-+
-+- full hard link support.
-+
-+
-+
-+BUGS:
-+-----
-+
-+Hard links in the base file system will be treated as individual
-+files, not as links to one inode.
-+
-+The main problem with hard links isn't allowing to create them, but
-+their pure existence. If you modify a base hard link, the changes made
-+will only show up on this link, the other link will remain in the
-+original state. I hope to fix this someday. Please note that this does
-+not effect the special hard links '.' and '..', that are handled
-+seperately by the lower fs.
---- /dev/null
-+++ b/fs/mini_fo/state.c
-@@ -0,0 +1,620 @@
-+/*
-+ * Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+/* create the storage file, setup new states */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+int create_sto_reg_file(dentry_t *dentry, int mode, struct nameidata *nd)
-+#else
-+int create_sto_reg_file(dentry_t *dentry, int mode)
-+#endif
-+{
-+ int err = 0;
-+ inode_t *dir;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ if(exists_in_storage(dentry)) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: wrong type or state.\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR getting neg. sto dentry.\n");
-+ goto out;
-+ }
-+
-+ dir = dentry->d_parent->d_inode;
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* lock parent */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ mode, nd);
-+#else
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ mode);
-+#endif
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR creating sto file.\n");
-+ goto out_lock;
-+ }
-+
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR creating sto file [2].\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+
-+ /* interpose the new inode */
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == NON_EXISTANT) {
-+ dtost(dentry) = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == UNMODIFIED) {
-+ dtost(dentry) = MODIFIED;
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ }
-+ fist_copy_attr_timesizes(dentry->d_parent->d_inode,
-+ hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+/* create the sto dir, setup states */
-+int create_sto_dir(dentry_t *dentry, int mode)
-+{
-+ int err = 0;
-+ inode_t *dir;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ /* had to take the "!S_ISDIR(mode))" check out, because it failed */
-+ if(exists_in_storage(dentry)) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: wrong type or state.\\
-+n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ err = get_neg_sto_dentry(dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ dir = dentry->d_parent->d_inode;
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+ err = vfs_mkdir(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ mode);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR creating sto dir.\n");
-+ goto out_lock;
-+ }
-+
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR creating sto dir [2].\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+
-+ /* interpose the new inode */
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtopd(dentry)->state == NON_EXISTANT) {
-+ dtopd(dentry)->state = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtopd(dentry)->state == UNMODIFIED) {
-+ dtopd(dentry)->state = MODIFIED;
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR, invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ }
-+
-+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ /* initalize the wol list */
-+ itopd(dentry->d_inode)->deleted_list_size = -1;
-+ itopd(dentry->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(dentry);
-+
-+
-+ out_lock:
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+int create_sto_nod(dentry_t *dentry, int mode, dev_t dev)
-+#else
-+int create_sto_nod(dentry_t *dentry, int mode, int dev)
-+#endif
-+{
-+ int err = 0;
-+ inode_t *dir;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ if(exists_in_storage(dentry)) {
-+ err = -EEXIST;
-+ goto out;
-+ }
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_nod: ERROR getting neg. sto dentry.\n");
-+ goto out;
-+ }
-+
-+ dir = dentry->d_parent->d_inode;
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* lock parent */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+ err = vfs_mknod(hidden_sto_dir_dentry->d_inode, hidden_sto_dentry, mode, dev);
-+ if(err)
-+ goto out_lock;
-+
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: create_sto_nod: creating storage inode failed [1].\n");
-+ err = -EINVAL; /* return something indicating failure */
-+ goto out_lock;
-+ }
-+
-+ /* interpose the new inode */
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == NON_EXISTANT) {
-+ dtost(dentry) = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == UNMODIFIED) {
-+ dtost(dentry) = MODIFIED;
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: create_sto_nod: error, invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ }
-+
-+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+
-+/* unimplemented (and possibly not usefull):
-+
-+ nondir-del_to_del_rew
-+ nondir-non_exist_to_creat
-+
-+ dir-unmod_to_del
-+ dir-mod_to_del
-+ dir-creat_to_del
-+ dir-del_rew_to_del
-+ dir-del_to_del_rew
-+ dir-non_exist_to_creat
-+*/
-+
-+
-+/* bring a file of any type from state UNMODIFIED to MODIFIED */
-+int nondir_unmod_to_mod(dentry_t *dentry, int cp_flag)
-+{
-+ int err = 0;
-+ struct vfsmount *tgt_mnt;
-+ struct vfsmount *src_mnt;
-+ dentry_t *tgt_dentry;
-+ dentry_t *src_dentry;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if((dtost(dentry) != UNMODIFIED) ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR getting neg. sto dentry.\n");
-+ goto out;
-+ }
-+
-+ /* create sto file */
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* lock parent */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+ /* handle different types of nondirs */
-+ if(S_ISCHR(dentry->d_inode->i_mode) ||
-+ S_ISBLK(dentry->d_inode->i_mode)) {
-+ err = vfs_mknod(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dtohd(dentry)->d_inode->i_mode,
-+ dtohd(dentry)->d_inode->i_rdev);
-+ }
-+
-+ else if(S_ISREG(dentry->d_inode->i_mode)) {
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dtohd(dentry)->d_inode->i_mode, NULL);
-+#else
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dtohd(dentry)->d_inode->i_mode);
-+#endif
-+ }
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR creating sto file.\n");
-+ goto out_lock;
-+ }
-+
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR, invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+
-+ fist_copy_attr_timesizes(dentry->d_parent->d_inode,
-+ hidden_sto_dir_dentry->d_inode);
-+ dtost(dentry) = MODIFIED;
-+
-+ /* copy contents if regular file and cp_flag = 1 */
-+ if((cp_flag == 1) && S_ISREG(dentry->d_inode->i_mode)) {
-+
-+ /* unlock first */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ dput(hidden_sto_dir_dentry);
-+
-+ tgt_dentry = dtohd2(dentry);
-+ tgt_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ src_dentry = dtohd(dentry);
-+ src_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt;
-+
-+ err = mini_fo_cp_cont(tgt_dentry, tgt_mnt,
-+ src_dentry, src_mnt);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR copying contents.\n");
-+ }
-+ goto out;
-+ }
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+/* this function is currently identical to nondir_creat_to_del */
-+int nondir_del_rew_to_del(dentry_t *dentry)
-+{
-+ return nondir_creat_to_del(dentry);
-+}
-+
-+int nondir_creat_to_del(dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ inode_t *hidden_sto_dir_inode;
-+ dentry_t *hidden_sto_dir_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ /* for now this function serves for both state DEL_REWRITTEN and
-+ * CREATED */
-+ if(!(dtost(dentry) == CREATED || (dtost(dentry) == DEL_REWRITTEN)) ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_mod_to_del/del_rew_to_del: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ hidden_sto_dir_inode = itohi2(dentry->d_parent->d_inode);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* avoid destroying the hidden inode if the file is in use */
-+ dget(hidden_sto_dentry);
-+ err = vfs_unlink(hidden_sto_dir_inode, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+ dtost(dentry) = NON_EXISTANT;
-+
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+int nondir_mod_to_del(dentry_t *dentry)
-+{
-+ int err;
-+ dentry_t *hidden_sto_dentry;
-+ inode_t *hidden_sto_dir_inode;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) != MODIFIED ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_mod_to_del: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ hidden_sto_dir_inode = itohi2(dentry->d_parent->d_inode);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* avoid destroying the hidden inode if the file is in use */
-+ dget(hidden_sto_dentry);
-+ err = vfs_unlink(hidden_sto_dir_inode, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+ /* dput base dentry, this will relase the inode and free the
-+ * dentry, as we will never need it again. */
-+ dput(dtohd(dentry));
-+ dtohd(dentry) = NULL;
-+ dtost(dentry) = DELETED;
-+
-+ /* add deleted file to META-file */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+int nondir_unmod_to_del(dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) != UNMODIFIED ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_del: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* next we have to get a negative dentry for the storage file */
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if(err)
-+ goto out;
-+
-+ /* add deleted file to META lists */
-+ err = meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+
-+ if(err)
-+ goto out;
-+
-+ /* dput base dentry, this will relase the inode and free the
-+ * dentry, as we will never need it again. */
-+ dput(dtohd(dentry));
-+ dtohd(dentry) = NULL;
-+ dtost(dentry) = DELETED;
-+
-+ out:
-+ return err;
-+}
-+
-+/* bring a dir from state UNMODIFIED to MODIFIED */
-+int dir_unmod_to_mod(dentry_t *dentry)
-+{
-+ int err;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) != UNMODIFIED ||
-+ !S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: dir_unmod_to_mod: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* this creates our dir incl. sto. structure */
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: dir_unmod_to_mod: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ out:
-+ return err;
-+}
-+
---- /dev/null
-+++ b/fs/mini_fo/super.c
-@@ -0,0 +1,281 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+STATIC void
-+mini_fo_read_inode(inode_t *inode)
-+{
-+ static struct address_space_operations mini_fo_empty_aops;
-+
-+ __itopd(inode) = kmalloc(sizeof(struct mini_fo_inode_info), GFP_KERNEL);
-+ if (!itopd(inode)) {
-+ printk("<0>%s:%s:%d: No kernel memory!\n", __FILE__, __FUNCTION__, __LINE__);
-+ ASSERT(NULL);
-+ }
-+ itohi(inode) = NULL;
-+ itohi2(inode) = NULL;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ inode->i_version++;
-+#else
-+ inode->i_version = ++event; /* increment inode version */
-+#endif
-+ inode->i_op = &mini_fo_main_iops;
-+ inode->i_fop = &mini_fo_main_fops;
-+#if 0
-+ /*
-+ * XXX: To export a file system via NFS, it has to have the
-+ * FS_REQUIRES_DEV flag, so turn it on. But should we inherit it from
-+ * the lower file system, or can we allow our file system to be exported
-+ * even if the lower one cannot be natively exported.
-+ */
-+ inode->i_sb->s_type->fs_flags |= FS_REQUIRES_DEV;
-+ /*
-+ * OK, the above was a hack, which is now turned off because it may
-+ * cause a panic/oops on some systems. The correct way to export a
-+ * "nodev" filesystem is via using nfs-utils > 1.0 and the "fsid=" export
-+ * parameter, which requires 2.4.20 or later.
-+ */
-+#endif
-+ /* I don't think ->a_ops is ever allowed to be NULL */
-+ inode->i_mapping->a_ops = &mini_fo_empty_aops;
-+}
-+
-+
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+/*
-+ * No need to call write_inode() on the lower inode, as it
-+ * will have been marked 'dirty' anyway. But we might need
-+ * to write some of our own stuff to disk.
-+ */
-+STATIC void
-+mini_fo_write_inode(inode_t *inode, int sync)
-+{
-+ print_entry_location();
-+ print_exit_location();
-+}
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+
-+
-+STATIC void
-+mini_fo_put_inode(inode_t *inode)
-+{
-+ /*
-+ * This is really funky stuff:
-+ * Basically, if i_count == 1, iput will then decrement it and this inode will be destroyed.
-+ * It is currently holding a reference to the hidden inode.
-+ * Therefore, it needs to release that reference by calling iput on the hidden inode.
-+ * iput() _will_ do it for us (by calling our clear_inode), but _only_ if i_nlink == 0.
-+ * The problem is, NFS keeps i_nlink == 1 for silly_rename'd files.
-+ * So we must for our i_nlink to 0 here to trick iput() into calling our clear_inode.
-+ */
-+ if (atomic_read(&inode->i_count) == 1)
-+ inode->i_nlink = 0;
-+}
-+
-+
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+/*
-+ * we now define delete_inode, because there are two VFS paths that may
-+ * destroy an inode: one of them calls clear inode before doing everything
-+ * else that's needed, and the other is fine. This way we truncate the inode
-+ * size (and its pages) and then clear our own inode, which will do an iput
-+ * on our and the lower inode.
-+ */
-+STATIC void
-+mini_fo_delete_inode(inode_t *inode)
-+{
-+ print_entry_location();
-+
-+ fist_checkinode(inode, "mini_fo_delete_inode IN");
-+ inode->i_size = 0; /* every f/s seems to do that */
-+ clear_inode(inode);
-+
-+ print_exit_location();
-+}
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+
-+
-+/* final actions when unmounting a file system */
-+STATIC void
-+mini_fo_put_super(super_block_t *sb)
-+{
-+ if (stopd(sb)) {
-+ mntput(stopd(sb)->hidden_mnt);
-+ mntput(stopd(sb)->hidden_mnt2);
-+
-+ /* mk: no! dput(stopd(sb)->base_dir_dentry);
-+ dput(stopd(sb)->storage_dir_dentry); */
-+
-+ kfree(stopd(sb));
-+ __stopd(sb) = NULL;
-+ }
-+}
-+
-+
-+#ifdef NOT_NEEDED
-+/*
-+ * This is called in do_umount before put_super.
-+ * The superblock lock is not held yet.
-+ * We probably do not need to define this or call write_super
-+ * on the hidden_sb, because sync_supers() will get to hidden_sb
-+ * sooner or later. But it is also called from file_fsync()...
-+ */
-+STATIC void
-+mini_fo_write_super(super_block_t *sb)
-+{
-+ return;
-+}
-+#endif /* NOT_NEEDED */
-+
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_statfs(struct dentry *d, struct kstatfs *buf)
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_statfs(super_block_t *sb, struct kstatfs *buf)
-+#else
-+mini_fo_statfs(super_block_t *sb, struct statfs *buf)
-+#endif
-+{
-+ int err = 0;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ struct dentry *hidden_d;
-+
-+ hidden_d = dtohd(d);
-+ err = vfs_statfs(hidden_d, buf);
-+#else
-+ super_block_t *hidden_sb;
-+
-+ hidden_sb = stohs(sb);
-+ err = vfs_statfs(hidden_sb, buf);
-+#endif
-+
-+ return err;
-+}
-+
-+
-+/*
-+ * XXX: not implemented. This is not allowed yet.
-+ * Should we call this on the hidden_sb? Probably not.
-+ */
-+STATIC int
-+mini_fo_remount_fs(super_block_t *sb, int *flags, char *data)
-+{
-+ //printk(KERN_CRIT "mini_fo_remount_fs: WARNING, this function is umimplemented.\n");
-+ return -ENOSYS;
-+}
-+
-+
-+/*
-+ * Called by iput() when the inode reference count reached zero
-+ * and the inode is not hashed anywhere. Used to clear anything
-+ * that needs to be, before the inode is completely destroyed and put
-+ * on the inode free list.
-+ */
-+STATIC void
-+mini_fo_clear_inode(inode_t *inode)
-+{
-+ /*
-+ * Decrement a reference to a hidden_inode, which was incremented
-+ * by our read_inode when it was created initially.
-+ */
-+
-+ /* release the wol_list */
-+ if(S_ISDIR(inode->i_mode)) {
-+ __meta_put_lists(inode);
-+ }
-+
-+ /* mk: fan out fun */
-+ if(itohi(inode))
-+ iput(itohi(inode));
-+ if(itohi2(inode))
-+ iput(itohi2(inode));
-+
-+ // XXX: why this assertion fails?
-+ // because it doesn't like us
-+ // ASSERT((inode->i_state & I_DIRTY) == 0);
-+ kfree(itopd(inode));
-+ __itopd(inode) = NULL;
-+}
-+
-+
-+/*
-+ * Called in do_umount() if the MNT_FORCE flag was used and this
-+ * function is defined. See comment in linux/fs/super.c:do_umount().
-+ * Used only in nfs, to kill any pending RPC tasks, so that subsequent
-+ * code can actually succeed and won't leave tasks that need handling.
-+ *
-+ * PS. I wonder if this is somehow useful to undo damage that was
-+ * left in the kernel after a user level file server (such as amd)
-+ * dies.
-+ */
-+STATIC void
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_umount_begin(struct vfsmount *mnt, int flags)
-+{
-+ struct vfsmount *hidden_mnt;
-+
-+ hidden_mnt = stopd(mnt->mnt_sb)->hidden_mnt;
-+
-+ if (hidden_mnt->mnt_sb->s_op->umount_begin)
-+ hidden_mnt->mnt_sb->s_op->umount_begin(hidden_mnt, flags);
-+
-+}
-+#else
-+mini_fo_umount_begin(super_block_t *sb)
-+{
-+ super_block_t *hidden_sb;
-+
-+ hidden_sb = stohs(sb);
-+
-+ if (hidden_sb->s_op->umount_begin)
-+ hidden_sb->s_op->umount_begin(hidden_sb);
-+
-+}
-+#endif
-+
-+
-+struct super_operations mini_fo_sops =
-+{
-+ read_inode: mini_fo_read_inode,
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+ write_inode: mini_fo_write_inode,
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+ put_inode: mini_fo_put_inode,
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+ delete_inode: mini_fo_delete_inode,
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+ put_super: mini_fo_put_super,
-+ statfs: mini_fo_statfs,
-+ remount_fs: mini_fo_remount_fs,
-+ clear_inode: mini_fo_clear_inode,
-+ umount_begin: mini_fo_umount_begin,
-+};
---- /dev/null
-+++ b/fs/mini_fo/Kconfig
-@@ -0,0 +1,3 @@
-+config MINI_FO
-+ tristate "Mini fanout overlay filesystem"
-+
+++ /dev/null
---- a/fs/mini_fo/main.c
-+++ b/fs/mini_fo/main.c
-@@ -79,6 +79,7 @@ mini_fo_tri_interpose(dentry_t *hidden_d
- * of the new inode's fields
- */
-
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
- /*
- * original: inode = iget(sb, hidden_inode->i_ino);
- */
-@@ -87,6 +88,13 @@ mini_fo_tri_interpose(dentry_t *hidden_d
- err = -EACCES; /* should be impossible??? */
- goto out;
- }
-+#else
-+ inode = mini_fo_iget(sb, iunique(sb, 25));
-+ if (IS_ERR(inode)) {
-+ err = PTR_ERR(inode);
-+ goto out;
-+ }
-+#endif
-
- /*
- * interpose the inode if not already interposed
-@@ -184,9 +192,9 @@ mini_fo_parse_options(super_block_t *sb,
- hidden_root = ERR_PTR(err);
- goto out;
- }
-- hidden_root = nd.dentry;
-- stopd(sb)->base_dir_dentry = nd.dentry;
-- stopd(sb)->hidden_mnt = nd.mnt;
-+ hidden_root = nd_get_dentry(&nd);
-+ stopd(sb)->base_dir_dentry = nd_get_dentry(&nd);
-+ stopd(sb)->hidden_mnt = nd_get_mnt(&nd);
-
- } else if(!strncmp("sto=", options, 4)) {
- /* parse the storage dir */
-@@ -204,9 +212,9 @@ mini_fo_parse_options(super_block_t *sb,
- hidden_root2 = ERR_PTR(err);
- goto out;
- }
-- hidden_root2 = nd2.dentry;
-- stopd(sb)->storage_dir_dentry = nd2.dentry;
-- stopd(sb)->hidden_mnt2 = nd2.mnt;
-+ hidden_root2 = nd_get_dentry(&nd2);
-+ stopd(sb)->storage_dir_dentry = nd_get_dentry(&nd2);
-+ stopd(sb)->hidden_mnt2 = nd_get_mnt(&nd2);
- stohs2(sb) = hidden_root2->d_sb;
-
- /* validate storage dir, this is done in
---- a/fs/mini_fo/mini_fo.h
-+++ b/fs/mini_fo/mini_fo.h
-@@ -302,6 +302,10 @@ extern int mini_fo_tri_interpose(dentry_
- extern int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
- dentry_t *src_dentry, struct vfsmount *src_mnt);
-
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+extern struct inode *mini_fo_iget(struct super_block *sb, unsigned long ino);
-+#endif
-+
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
- extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd);
-
-@@ -501,6 +505,29 @@ static inline void double_unlock(struct
- #endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
- #endif /* __KERNEL__ */
-
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+static inline dentry_t *nd_get_dentry(struct nameidata *nd)
-+{
-+ return (nd->path.dentry);
-+}
-+
-+static inline struct vfsmount *nd_get_mnt(struct nameidata *nd)
-+{
-+ return (nd->path.mnt);
-+}
-+#else
-+static inline dentry_t *nd_get_dentry(struct nameidata *nd)
-+{
-+ return (nd->dentry);
-+}
-+
-+static inline struct vfsmount *nd_get_mnt(struct nameidata *nd)
-+{
-+ return (nd->mnt);
-+}
-+#endif
-+
- /*
- * Definitions for user and kernel code
- */
---- a/fs/mini_fo/super.c
-+++ b/fs/mini_fo/super.c
-@@ -262,10 +262,31 @@ mini_fo_umount_begin(super_block_t *sb)
- }
- #endif
-
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+struct inode *
-+mini_fo_iget(struct super_block *sb, unsigned long ino)
-+{
-+ struct inode *inode;
-+
-+ inode = iget_locked(sb, ino);
-+ if (!inode)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (!(inode->i_state & I_NEW))
-+ return inode;
-+
-+ mini_fo_read_inode(inode);
-+
-+ unlock_new_inode(inode);
-+ return inode;
-+}
-+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25) */
-
- struct super_operations mini_fo_sops =
- {
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
- read_inode: mini_fo_read_inode,
-+#endif
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
- write_inode: mini_fo_write_inode,
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
---- a/fs/mini_fo/aux.c
-+++ b/fs/mini_fo/aux.c
-@@ -164,11 +164,11 @@ dentry_t *bpath_walk(super_block_t *sb,
- err = vfs_path_lookup(mnt->mnt_root, mnt, bpath+1, 0, &nd);
-
- /* validate */
-- if (err || !nd.dentry || !nd.dentry->d_inode) {
-+ if (err || !nd_get_dentry(&nd) || !nd_get_dentry(&nd)->d_inode) {
- printk(KERN_CRIT "mini_fo: bpath_walk: path_walk failed.\n");
- return NULL;
- }
-- return nd.dentry;
-+ return nd_get_dentry(&nd);
- }
-
-
+++ /dev/null
---- a/fs/mini_fo/meta.c
-+++ b/fs/mini_fo/meta.c
-@@ -442,6 +442,11 @@ int meta_write_d_entry(dentry_t *dentry,
- S_IRUSR | S_IWUSR);
- #endif
- }
-+
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
-@@ -535,6 +540,11 @@ int meta_write_r_entry(dentry_t *dentry,
- meta_dentry, S_IRUSR | S_IWUSR);
- #endif
- }
-+
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
-@@ -671,14 +681,16 @@ int meta_sync_d_list(dentry_t *dentry, i
- }
- }
-
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
- ERROR opening meta file.\n");
-- /* we don't mntget so we dont't mntput (for now)
-- * mntput(meta_mnt);
-- */
-+ mntput(meta_mnt);
- dput(meta_dentry);
- err = -1;
- goto out;
-@@ -811,14 +823,16 @@ int meta_sync_r_list(dentry_t *dentry, i
- }
- }
-
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
- ERROR opening meta file.\n");
-- /* we don't mntget so we dont't mntput (for now)
-- * mntput(meta_mnt);
-- */
-+ mntput(meta_mnt);
- dput(meta_dentry);
- err = -1;
- goto out;
+++ /dev/null
---- a/fs/mini_fo/super.c
-+++ b/fs/mini_fo/super.c
-@@ -84,6 +84,7 @@ mini_fo_write_inode(inode_t *inode, int
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-
-
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
- STATIC void
- mini_fo_put_inode(inode_t *inode)
- {
-@@ -99,6 +100,7 @@ mini_fo_put_inode(inode_t *inode)
- if (atomic_read(&inode->i_count) == 1)
- inode->i_nlink = 0;
- }
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) */
-
-
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-@@ -238,7 +240,7 @@ mini_fo_clear_inode(inode_t *inode)
- * dies.
- */
- STATIC void
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
- mini_fo_umount_begin(struct vfsmount *mnt, int flags)
- {
- struct vfsmount *hidden_mnt;
-@@ -290,7 +292,9 @@ struct super_operations mini_fo_sops =
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
- write_inode: mini_fo_write_inode,
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
- put_inode: mini_fo_put_inode,
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) */
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
- delete_inode: mini_fo_delete_inode,
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
+++ /dev/null
---- a/fs/mini_fo/inode.c
-+++ b/fs/mini_fo/inode.c
-@@ -439,7 +439,7 @@ mini_fo_symlink(inode_t *dir, dentry_t *
- int err=0;
- dentry_t *hidden_sto_dentry;
- dentry_t *hidden_sto_dir_dentry;
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
- umode_t mode;
- #endif
-
-@@ -466,7 +466,7 @@ mini_fo_symlink(inode_t *dir, dentry_t *
- down(&hidden_sto_dir_dentry->d_inode->i_sem);
- #endif
-
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
- mode = S_IALLUGO;
- err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
- hidden_sto_dentry, symname, mode);
-@@ -1128,7 +1128,7 @@ void mini_fo_put_link(struct dentry *den
- #endif
-
- STATIC int
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
- mini_fo_permission(inode_t *inode, int mask, struct nameidata *nd)
- #else
- mini_fo_permission(inode_t *inode, int mask)
-@@ -1150,8 +1150,9 @@ mini_fo_permission(inode_t *inode, int m
- * if (err)
- * goto out;
- */
--
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
-+ err = inode_permission(hidden_inode, mask);
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
- err = permission(hidden_inode, mask, nd);
- #else
- err = permission(hidden_inode, mask);
+++ /dev/null
---- a/fs/mini_fo/aux.c
-+++ b/fs/mini_fo/aux.c
-@@ -236,7 +236,7 @@ int mini_fo_cp_cont(dentry_t *tgt_dentry
- mntget(src_mnt);
-
- /* open file write only */
-- tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1);
-+ tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1, current_cred());
- if(!tgt_file || IS_ERR(tgt_file)) {
- printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening target file.\n");
- err = PTR_ERR(tgt_file);
-@@ -244,7 +244,7 @@ int mini_fo_cp_cont(dentry_t *tgt_dentry
- }
-
- /* open file read only */
-- src_file = dentry_open(src_dentry, src_mnt, 0x0);
-+ src_file = dentry_open(src_dentry, src_mnt, 0x0, current_cred());
- if(!src_file || IS_ERR(src_file)) {
- printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening source file.\n");
- err = PTR_ERR(src_file);
---- a/fs/mini_fo/file.c
-+++ b/fs/mini_fo/file.c
-@@ -437,7 +437,7 @@ mini_fo_open(inode_t *inode, file_t *fil
- mntget(stopd(inode->i_sb)->hidden_mnt);
- hidden_file = dentry_open(hidden_dentry,
- stopd(inode->i_sb)->hidden_mnt,
-- hidden_flags);
-+ hidden_flags, file->f_cred);
- if (IS_ERR(hidden_file)) {
- err = PTR_ERR(hidden_file);
- dput(hidden_dentry);
-@@ -479,7 +479,7 @@ mini_fo_open(inode_t *inode, file_t *fil
- mntget(stopd(inode->i_sb)->hidden_mnt);
- hidden_file = dentry_open(hidden_dentry,
- stopd(inode->i_sb)->hidden_mnt,
-- hidden_flags);
-+ hidden_flags, file->f_cred);
- if (IS_ERR(hidden_file)) {
- err = PTR_ERR(hidden_file);
- dput(hidden_dentry);
-@@ -512,7 +512,7 @@ mini_fo_open(inode_t *inode, file_t *fil
- mntget(stopd(inode->i_sb)->hidden_mnt2);
- hidden_sto_file = dentry_open(hidden_sto_dentry,
- stopd(inode->i_sb)->hidden_mnt2,
-- hidden_flags);
-+ hidden_flags, file->f_cred);
-
- /* dentry_open dputs the dentry if it fails */
- if (IS_ERR(hidden_sto_file)) {
---- a/fs/mini_fo/meta.c
-+++ b/fs/mini_fo/meta.c
-@@ -56,7 +56,7 @@ int meta_build_lists(dentry_t *dentry)
-
-
- /* open META-file for reading */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x0);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x0, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_build_lists: \
- ERROR opening META file.\n");
-@@ -448,7 +448,7 @@ int meta_write_d_entry(dentry_t *dentry,
- mntget(meta_mnt);
-
- /* open META-file for writing */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
- ERROR opening meta file.\n");
-@@ -546,7 +546,7 @@ int meta_write_r_entry(dentry_t *dentry,
- mntget(meta_mnt);
-
- /* open META-file for writing */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
- ERROR opening meta file.\n");
-@@ -686,7 +686,7 @@ int meta_sync_d_list(dentry_t *dentry, i
- mntget(meta_mnt);
-
- /* open META-file for writing */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
- ERROR opening meta file.\n");
-@@ -828,7 +828,7 @@ int meta_sync_r_list(dentry_t *dentry, i
- mntget(meta_mnt);
-
- /* open META-file for writing */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
- ERROR opening meta file.\n");
+++ /dev/null
---- a/fs/mini_fo/aux.c
-+++ b/fs/mini_fo/aux.c
-@@ -86,8 +86,10 @@ int get_neg_sto_dentry(dentry_t *dentry)
- len = dentry->d_name.len;
- name = dentry->d_name.name;
-
-+ mutex_lock(&dtohd2(dentry->d_parent)->d_inode->i_mutex);
- dtohd2(dentry) =
- lookup_one_len(name, dtohd2(dentry->d_parent), len);
-+ mutex_unlock(&dtohd2(dentry->d_parent)->d_inode->i_mutex);
-
- out:
- return err;
-@@ -426,7 +428,9 @@ int build_sto_structure(dentry_t *dir, d
- const unsigned char *name;
- len = dtohd(dentry)->d_name.len;
- name = dtohd(dentry)->d_name.name;
-+ mutex_lock(&dtohd2(dir)->d_inode->i_mutex);
- hidden_sto_dentry = lookup_one_len(name, dtohd2(dir), len);
-+ mutex_unlock(&dtohd2(dir)->d_inode->i_mutex);
- dtohd2(dentry) = hidden_sto_dentry;
- }
-
---- a/fs/mini_fo/inode.c
-+++ b/fs/mini_fo/inode.c
-@@ -113,17 +113,23 @@ mini_fo_lookup(inode_t *dir, dentry_t *d
- hidden_dir_dentry = hidden_dentry->d_parent;
- kfree(bpath);
- }
-- else if(hidden_dir_dentry && hidden_dir_dentry->d_inode)
-+ else if(hidden_dir_dentry && hidden_dir_dentry->d_inode) {
-+ mutex_lock(&hidden_dir_dentry->d_inode->i_mutex);
- hidden_dentry =
- lookup_one_len(name, hidden_dir_dentry, namelen);
-- else
-+ mutex_unlock(&hidden_dir_dentry->d_inode->i_mutex);
-+ } else {
- hidden_dentry = NULL;
-+ }
-
-- if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode) {
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
- hidden_sto_dentry =
- lookup_one_len(name, hidden_sto_dir_dentry, namelen);
-- else
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+ } else {
- hidden_sto_dentry = NULL;
-+ }
-
- /* catch error in lookup */
- if (IS_ERR(hidden_dentry) || IS_ERR(hidden_sto_dentry)) {
-@@ -553,9 +559,11 @@ mini_fo_rmdir(inode_t *dir, dentry_t *de
- #endif
-
- /* Delete an old WOL file contained in the storage dir */
-+ mutex_lock(&hidden_sto_dentry->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- hidden_sto_dentry,
- strlen(META_FILENAME));
-+ mutex_unlock(&hidden_sto_dentry->d_inode->i_mutex);
- if(meta_dentry->d_inode) {
- err = vfs_unlink(hidden_sto_dentry->d_inode, meta_dentry);
- dput(meta_dentry);
-@@ -643,9 +651,11 @@ mini_fo_rmdir(inode_t *dir, dentry_t *de
- #endif
-
- /* Delete an old WOL file contained in the storage dir */
-+ mutex_lock(&hidden_sto_dentry->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- hidden_sto_dentry,
- strlen(META_FILENAME));
-+ mutex_unlock(&hidden_sto_dentry->d_inode->i_mutex);
- if(meta_dentry->d_inode) {
- /* is this necessary? dget(meta_dentry); */
- err = vfs_unlink(hidden_sto_dentry->d_inode,
-@@ -688,9 +698,11 @@ mini_fo_rmdir(inode_t *dir, dentry_t *de
- #endif
-
- /* Delete an old WOL file contained in the storage dir */
-+ mutex_lock(&hidden_sto_dentry->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- hidden_sto_dentry,
- strlen(META_FILENAME));
-+ mutex_unlock(&hidden_sto_dentry->d_inode->i_mutex);
- if(meta_dentry->d_inode) {
- /* is this necessary? dget(meta_dentry); */
- err = vfs_unlink(hidden_sto_dentry->d_inode,
---- a/fs/mini_fo/meta.c
-+++ b/fs/mini_fo/meta.c
-@@ -43,9 +43,11 @@ int meta_build_lists(dentry_t *dentry)
-
- /* might there be a META-file? */
- if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry),
- strlen(META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
- if(!meta_dentry->d_inode) {
- dput(meta_dentry);
- goto out_ok;
-@@ -426,8 +428,11 @@ int meta_write_d_entry(dentry_t *dentry,
- goto out;
- }
- }
-+
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry), strlen (META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
-
- /* We need to create a META-file */
- if(!meta_dentry->d_inode) {
-@@ -527,9 +532,13 @@ int meta_write_r_entry(dentry_t *dentry,
- goto out;
- }
- }
-+
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry),
- strlen (META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
-+
- if(!meta_dentry->d_inode) {
- /* We need to create a META-file */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-@@ -641,9 +650,13 @@ int meta_sync_d_list(dentry_t *dentry, i
- goto out;
- }
- }
-+
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry),
- strlen(META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
-+
- if(!meta_dentry->d_inode) {
- /* We need to create a META-file */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-@@ -784,9 +797,13 @@ int meta_sync_r_list(dentry_t *dentry, i
- goto out;
- }
- }
-+
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry),
- strlen(META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
-+
- if(!meta_dentry->d_inode) {
- /* We need to create a META-file */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+++ /dev/null
---- a/fs/mini_fo/state.c
-+++ b/fs/mini_fo/state.c
-@@ -537,17 +537,17 @@ int nondir_mod_to_del(dentry_t *dentry)
- dtohd(dentry) = NULL;
- dtost(dentry) = DELETED;
-
-- /* add deleted file to META-file */
-- meta_add_d_entry(dentry->d_parent,
-- dentry->d_name.name,
-- dentry->d_name.len);
--
- /* was: unlock_dir(hidden_sto_dir_dentry); */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
- mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
- #else
- up(&hidden_sto_dir_dentry->d_inode->i_sem);
- #endif
-+ /* add deleted file to META-file */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+
- dput(hidden_sto_dir_dentry);
-
- out:
+++ /dev/null
---- a/lib/kobject_uevent.c
-+++ b/lib/kobject_uevent.c
-@@ -29,7 +29,8 @@ u64 uevent_seqnum;
- char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH;
- static DEFINE_SPINLOCK(sequence_lock);
- #if defined(CONFIG_NET)
--static struct sock *uevent_sock;
-+struct sock *uevent_sock = NULL;
-+EXPORT_SYMBOL_GPL(uevent_sock);
- #endif
-
- /* the strings here must match the enum in include/linux/kobject.h */
-@@ -42,6 +43,18 @@ static const char *kobject_actions[] = {
- [KOBJ_OFFLINE] = "offline",
- };
-
-+u64 uevent_next_seqnum(void)
-+{
-+ u64 seq;
-+
-+ spin_lock(&sequence_lock);
-+ seq = ++uevent_seqnum;
-+ spin_unlock(&sequence_lock);
-+
-+ return seq;
-+}
-+EXPORT_SYMBOL_GPL(uevent_next_seqnum);
-+
- /**
- * kobject_action_type - translate action string to numeric type
- *
-@@ -201,9 +214,7 @@ int kobject_uevent_env(struct kobject *k
- kobj->state_remove_uevent_sent = 1;
-
- /* we will send an event, so request a new sequence number */
-- spin_lock(&sequence_lock);
-- seq = ++uevent_seqnum;
-- spin_unlock(&sequence_lock);
-+ seq = uevent_next_seqnum();
- retval = add_uevent_var(env, "SEQNUM=%llu", (unsigned long long)seq);
- if (retval)
- goto exit;
+++ /dev/null
---- a/sound/core/Kconfig
-+++ b/sound/core/Kconfig
-@@ -7,7 +7,7 @@ config SND_PCM
- select SND_TIMER
-
- config SND_HWDEP
-- tristate
-+ tristate "Sound hardware support"
-
- config SND_RAWMIDI
- tristate
+++ /dev/null
---- a/fs/binfmt_elf.c
-+++ b/fs/binfmt_elf.c
-@@ -1193,7 +1193,7 @@ static unsigned long vma_dump_size(struc
- if (FILTER(ELF_HEADERS) &&
- vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
- u32 __user *header = (u32 __user *) vma->vm_start;
-- u32 word;
-+ u32 word = 0;
- mm_segment_t fs = get_fs();
- /*
- * Doing it this way gets the constant folded by GCC.
+++ /dev/null
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -21,6 +21,8 @@
- #include <linux/root_dev.h>
- #include <linux/magic.h>
-
-+#define MTD_ERASE_PARTIAL 0x8000 /* partition only covers parts of an erase block */
-+
- /* Our partition linked list */
- static LIST_HEAD(mtd_partitions);
-
-@@ -226,13 +228,60 @@ static int part_erase(struct mtd_info *m
- return -EROFS;
- if (instr->addr >= mtd->size)
- return -EINVAL;
-+
-+ instr->partial_start = false;
-+ if (mtd->flags & MTD_ERASE_PARTIAL) {
-+ size_t readlen = 0;
-+ u64 mtd_ofs;
-+
-+ instr->erase_buf = kmalloc(part->master->erasesize, GFP_ATOMIC);
-+ if (!instr->erase_buf)
-+ return -ENOMEM;
-+
-+ mtd_ofs = part->offset + instr->addr;
-+ instr->erase_buf_ofs = do_div(mtd_ofs, part->master->erasesize);
-+
-+ if (instr->erase_buf_ofs > 0) {
-+ instr->addr -= instr->erase_buf_ofs;
-+ ret = part->master->read(part->master,
-+ instr->addr + part->offset,
-+ part->master->erasesize,
-+ &readlen, instr->erase_buf);
-+
-+ instr->partial_start = true;
-+ } else {
-+ mtd_ofs = part->offset + part->mtd.size;
-+ instr->erase_buf_ofs = part->master->erasesize -
-+ do_div(mtd_ofs, part->master->erasesize);
-+
-+ if (instr->erase_buf_ofs > 0) {
-+ instr->len += instr->erase_buf_ofs;
-+ ret = part->master->read(part->master,
-+ part->offset + instr->addr +
-+ instr->len - part->master->erasesize,
-+ part->master->erasesize, &readlen,
-+ instr->erase_buf);
-+ } else {
-+ ret = 0;
-+ }
-+ }
-+ if (ret < 0) {
-+ kfree(instr->erase_buf);
-+ return ret;
-+ }
-+
-+ }
-+
- instr->addr += part->offset;
- ret = part->master->erase(part->master, instr);
- if (ret) {
- if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
- instr->fail_addr -= part->offset;
- instr->addr -= part->offset;
-+ if (mtd->flags & MTD_ERASE_PARTIAL)
-+ kfree(instr->erase_buf);
- }
-+
- return ret;
- }
-
-@@ -240,7 +289,25 @@ void mtd_erase_callback(struct erase_inf
- {
- if (instr->mtd->erase == part_erase) {
- struct mtd_part *part = PART(instr->mtd);
-+ size_t wrlen = 0;
-
-+ if (instr->mtd->flags & MTD_ERASE_PARTIAL) {
-+ if (instr->partial_start) {
-+ part->master->write(part->master,
-+ instr->addr, instr->erase_buf_ofs,
-+ &wrlen, instr->erase_buf);
-+ instr->addr += instr->erase_buf_ofs;
-+ } else {
-+ instr->len -= instr->erase_buf_ofs;
-+ part->master->write(part->master,
-+ instr->addr + instr->len,
-+ instr->erase_buf_ofs, &wrlen,
-+ instr->erase_buf +
-+ part->master->erasesize -
-+ instr->erase_buf_ofs);
-+ }
-+ kfree(instr->erase_buf);
-+ }
- if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
- instr->fail_addr -= part->offset;
- instr->addr -= part->offset;
-@@ -472,18 +539,24 @@ static struct mtd_part *add_one_partitio
- if ((slave->mtd.flags & MTD_WRITEABLE) &&
- mtd_mod_by_eb(slave->offset, &slave->mtd)) {
- /* Doesn't start on a boundary of major erase size */
-- /* FIXME: Let it be writable if it is on a boundary of
-- * _minor_ erase size though */
-- slave->mtd.flags &= ~MTD_WRITEABLE;
-- printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n",
-- part->name);
-+ slave->mtd.flags |= MTD_ERASE_PARTIAL;
-+ if (((u32) slave->mtd.size) > master->erasesize)
-+ slave->mtd.flags &= ~MTD_WRITEABLE;
-+ else
-+ slave->mtd.erasesize = slave->mtd.size;
- }
- if ((slave->mtd.flags & MTD_WRITEABLE) &&
-- mtd_mod_by_eb(slave->mtd.size, &slave->mtd)) {
-- slave->mtd.flags &= ~MTD_WRITEABLE;
-- printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n",
-- part->name);
-- }
-+ mtd_mod_by_eb(slave->offset + slave->mtd.size, &slave->mtd)) {
-+ slave->mtd.flags |= MTD_ERASE_PARTIAL;
-+
-+ if ((u32) slave->mtd.size > master->erasesize)
-+ slave->mtd.flags &= ~MTD_WRITEABLE;
-+ else
-+ slave->mtd.erasesize = slave->mtd.size;
-+ }
-+ if ((slave->mtd.flags & (MTD_ERASE_PARTIAL|MTD_WRITEABLE)) == MTD_ERASE_PARTIAL)
-+ printk(KERN_WARNING"mtd: partition \"%s\" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only\n",
-+ part->name);
-
- slave->mtd.ecclayout = master->ecclayout;
- if (master->block_isbad) {
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -46,6 +46,10 @@ struct erase_info {
- u_long priv;
- u_char state;
- struct erase_info *next;
-+
-+ u8 *erase_buf;
-+ u32 erase_buf_ofs;
-+ bool partial_start;
- };
-
- struct mtd_erase_region_info {
+++ /dev/null
-This patch allows the user to specify desired packet types (outgoing,
-broadcast, unicast, etc.) on packet sockets via setsockopt.
-This can reduce the load in situations where only a limited number
-of packet types are necessary
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-
---- a/include/linux/if_packet.h
-+++ b/include/linux/if_packet.h
-@@ -31,6 +31,8 @@ struct sockaddr_ll
- /* These ones are invisible by user level */
- #define PACKET_LOOPBACK 5 /* MC/BRD frame looped back */
- #define PACKET_FASTROUTE 6 /* Fastrouted frame */
-+#define PACKET_MASK_ANY 0xffffffff /* mask for packet type bits */
-+
-
- /* Packet socket options */
-
-@@ -48,6 +50,7 @@ struct sockaddr_ll
- #define PACKET_RESERVE 12
- #define PACKET_TX_RING 13
- #define PACKET_LOSS 14
-+#define PACKET_RECV_TYPE 15
-
- struct tpacket_stats
- {
---- a/net/packet/af_packet.c
-+++ b/net/packet/af_packet.c
-@@ -206,6 +206,7 @@ struct packet_sock {
- unsigned int tp_reserve;
- unsigned int tp_loss:1;
- #endif
-+ unsigned int pkt_type;
- };
-
- struct packet_skb_cb {
-@@ -343,6 +344,7 @@ static int packet_rcv_spkt(struct sk_buf
- {
- struct sock *sk;
- struct sockaddr_pkt *spkt;
-+ struct packet_sock *po;
-
- /*
- * When we registered the protocol we saved the socket in the data
-@@ -350,6 +352,7 @@ static int packet_rcv_spkt(struct sk_buf
- */
-
- sk = pt->af_packet_priv;
-+ po = pkt_sk(sk);
-
- /*
- * Yank back the headers [hope the device set this
-@@ -362,7 +365,7 @@ static int packet_rcv_spkt(struct sk_buf
- * so that this procedure is noop.
- */
-
-- if (skb->pkt_type == PACKET_LOOPBACK)
-+ if (!(po->pkt_type & (1 << skb->pkt_type)))
- goto out;
-
- if (dev_net(dev) != sock_net(sk))
-@@ -546,12 +549,12 @@ static int packet_rcv(struct sk_buff *sk
- int skb_len = skb->len;
- unsigned int snaplen, res;
-
-- if (skb->pkt_type == PACKET_LOOPBACK)
-- goto drop;
--
- sk = pt->af_packet_priv;
- po = pkt_sk(sk);
-
-+ if (!(po->pkt_type & (1 << skb->pkt_type)))
-+ goto drop;
-+
- if (dev_net(dev) != sock_net(sk))
- goto drop;
-
-@@ -667,12 +670,12 @@ static int tpacket_rcv(struct sk_buff *s
- struct timeval tv;
- struct timespec ts;
-
-- if (skb->pkt_type == PACKET_LOOPBACK)
-- goto drop;
--
- sk = pt->af_packet_priv;
- po = pkt_sk(sk);
-
-+ if (!(po->pkt_type & (1 << skb->pkt_type)))
-+ goto drop;
-+
- if (dev_net(dev) != sock_net(sk))
- goto drop;
-
-@@ -1387,6 +1390,7 @@ static int packet_create(struct net *net
- 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);
-
- if (sock->type == SOCK_PACKET)
- po->prot_hook.func = packet_rcv_spkt;
-@@ -1733,6 +1737,16 @@ packet_setsockopt(struct socket *sock, i
- ret = packet_mc_drop(sk, &mreq);
- return ret;
- }
-+ case PACKET_RECV_TYPE:
-+ {
-+ unsigned int val;
-+ if (optlen != sizeof(val))
-+ return -EINVAL;
-+ if (copy_from_user(&val, optval, sizeof(val)))
-+ return -EFAULT;
-+ po->pkt_type = val & ~PACKET_LOOPBACK;
-+ return 0;
-+ }
-
- #ifdef CONFIG_PACKET_MMAP
- case PACKET_RX_RING:
-@@ -1878,6 +1892,13 @@ static int packet_getsockopt(struct sock
-
- data = &val;
- break;
-+ case PACKET_RECV_TYPE:
-+ if (len > sizeof(unsigned int))
-+ len = sizeof(unsigned int);
-+ val = po->pkt_type;
-+
-+ data = &val;
-+ break;
- #ifdef CONFIG_PACKET_MMAP
- case PACKET_VERSION:
- if (len > sizeof(int))
+++ /dev/null
---- a/drivers/net/pppoe.c
-+++ b/drivers/net/pppoe.c
-@@ -863,7 +863,7 @@ static int pppoe_sendmsg(struct kiocb *i
- goto end;
-
-
-- skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32,
-+ skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32 + NET_SKB_PAD,
- 0, GFP_KERNEL);
- if (!skb) {
- error = -ENOMEM;
-@@ -871,7 +871,7 @@ static int pppoe_sendmsg(struct kiocb *i
- }
-
- /* Reserve space for headers. */
-- skb_reserve(skb, dev->hard_header_len);
-+ skb_reserve(skb, dev->hard_header_len + NET_SKB_PAD);
- skb_reset_network_header(skb);
-
- skb->dev = dev;
+++ /dev/null
---- a/net/sched/sch_generic.c
-+++ b/net/sched/sch_generic.c
-@@ -391,16 +391,50 @@ static const u8 prio2band[TC_PRIO_MAX+1]
-
- #define PFIFO_FAST_BANDS 3
-
-+struct pfifo_fast_sched_data {
-+ struct tcf_proto *filter_list;
-+ struct sk_buff_head list[PFIFO_FAST_BANDS];
-+};
-+
- static inline struct sk_buff_head *prio2list(struct sk_buff *skb,
- struct Qdisc *qdisc)
- {
-- struct sk_buff_head *list = qdisc_priv(qdisc);
-+ struct pfifo_fast_sched_data *q = qdisc_priv(qdisc);
-+ struct sk_buff_head *list = q->list;
- return list + prio2band[skb->priority & TC_PRIO_MAX];
- }
-
-+static int pfifo_fast_filter(struct sk_buff *skb, struct Qdisc* qdisc)
-+{
-+#ifdef CONFIG_NET_CLS_ACT
-+ struct pfifo_fast_sched_data *q = qdisc_priv(qdisc);
-+ int result = 0, ret = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
-+ struct tcf_result res;
-+
-+ if (q->filter_list != NULL)
-+ result = tc_classify(skb, q->filter_list, &res);
-+ if (result >= 0) {
-+ switch (result) {
-+ case TC_ACT_STOLEN:
-+ case TC_ACT_QUEUED:
-+ ret = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
-+ case TC_ACT_SHOT:
-+ kfree_skb(skb);
-+ return ret;
-+ }
-+ }
-+#endif
-+ return 0;
-+}
-+
- static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc)
- {
- struct sk_buff_head *list = prio2list(skb, qdisc);
-+ int ret;
-+
-+ ret = pfifo_fast_filter(skb, qdisc);
-+ if (ret)
-+ return ret;
-
- if (skb_queue_len(list) < qdisc_dev(qdisc)->tx_queue_len) {
- qdisc->q.qlen++;
-@@ -412,8 +446,9 @@ static int pfifo_fast_enqueue(struct sk_
-
- static struct sk_buff *pfifo_fast_dequeue(struct Qdisc* qdisc)
- {
-+ struct pfifo_fast_sched_data *q = qdisc_priv(qdisc);
-+ struct sk_buff_head *list = q->list;
- int prio;
-- struct sk_buff_head *list = qdisc_priv(qdisc);
-
- for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) {
- if (!skb_queue_empty(list + prio)) {
-@@ -440,8 +475,9 @@ static struct sk_buff *pfifo_fast_peek(s
-
- static void pfifo_fast_reset(struct Qdisc* qdisc)
- {
-+ struct pfifo_fast_sched_data *q = qdisc_priv(qdisc);
-+ struct sk_buff_head *list = q->list;
- int prio;
-- struct sk_buff_head *list = qdisc_priv(qdisc);
-
- for (prio = 0; prio < PFIFO_FAST_BANDS; prio++)
- __qdisc_reset_queue(qdisc, list + prio);
-@@ -464,8 +500,9 @@ nla_put_failure:
-
- static int pfifo_fast_init(struct Qdisc *qdisc, struct nlattr *opt)
- {
-+ struct pfifo_fast_sched_data *q = qdisc_priv(qdisc);
-+ struct sk_buff_head *list = q->list;
- int prio;
-- struct sk_buff_head *list = qdisc_priv(qdisc);
-
- for (prio = 0; prio < PFIFO_FAST_BANDS; prio++)
- skb_queue_head_init(list + prio);
-@@ -473,9 +510,36 @@ static int pfifo_fast_init(struct Qdisc
- return 0;
- }
-
-+static int pfifo_fast_change_class(struct Qdisc *qdisc, u32 classid, u32 parentid,
-+ struct nlattr **tca, unsigned long *arg)
-+{
-+ return -EOPNOTSUPP;
-+}
-+
-+static unsigned long pfifo_fast_get(struct Qdisc *qdisc, u32 classid)
-+{
-+ return 0;
-+}
-+
-+static struct tcf_proto **pfifo_fast_find_tcf(struct Qdisc *qdisc, unsigned long cl)
-+{
-+ struct pfifo_fast_sched_data *q = qdisc_priv(qdisc);
-+
-+ if (cl)
-+ return NULL;
-+ return &q->filter_list;
-+}
-+
-+static const struct Qdisc_class_ops pfifo_fast_class_ops = {
-+ .get = pfifo_fast_get,
-+ .change = pfifo_fast_change_class,
-+ .tcf_chain = pfifo_fast_find_tcf,
-+};
-+
- static struct Qdisc_ops pfifo_fast_ops __read_mostly = {
- .id = "pfifo_fast",
-- .priv_size = PFIFO_FAST_BANDS * sizeof(struct sk_buff_head),
-+ .cl_ops = &pfifo_fast_class_ops,
-+ .priv_size = sizeof(struct pfifo_fast_sched_data),
- .enqueue = pfifo_fast_enqueue,
- .dequeue = pfifo_fast_dequeue,
- .peek = pfifo_fast_peek,
-@@ -757,3 +821,18 @@ void dev_shutdown(struct net_device *dev
- shutdown_scheduler_queue(dev, &dev->rx_queue, &noop_qdisc);
- WARN_ON(timer_pending(&dev->watchdog_timer));
- }
-+
-+#ifdef CONFIG_NET_SCHED
-+static int __init sch_generic_init(void)
-+{
-+ return register_qdisc(&pfifo_fast_ops);
-+}
-+
-+static void __exit sch_generic_exit(void)
-+{
-+ unregister_qdisc(&pfifo_fast_ops);
-+}
-+
-+module_init(sch_generic_init)
-+module_exit(sch_generic_exit)
-+#endif
+++ /dev/null
-This patch adds support for bfs v230, modified for diff size reduction
-
---- a/Documentation/sysctl/kernel.txt
-+++ b/Documentation/sysctl/kernel.txt
-@@ -27,6 +27,7 @@ show up in /proc/sys/kernel:
- - domainname
- - hostname
- - hotplug
-+- iso_cpu
- - java-appletviewer [ binfmt_java, obsolete ]
- - java-interpreter [ binfmt_java, obsolete ]
- - kstack_depth_to_print [ X86 only ]
-@@ -49,6 +50,7 @@ show up in /proc/sys/kernel:
- - randomize_va_space
- - real-root-dev ==> Documentation/initrd.txt
- - reboot-cmd [ SPARC only ]
-+- rr_interval
- - rtsig-max
- - rtsig-nr
- - sem
-@@ -171,6 +173,16 @@ Default value is "/sbin/hotplug".
-
- ==============================================================
-
-+iso_cpu: (BFS only)
-+
-+This sets the percentage cpu that the unprivileged SCHED_ISO tasks can
-+run effectively at realtime priority, averaged over a rolling five
-+seconds over the -whole- system, meaning all cpus.
-+
-+Set to 70 (percent) by default.
-+
-+==============================================================
-+
- l2cr: (PPC only)
-
- This flag controls the L2 cache of G3 processor boards. If
-@@ -333,6 +345,19 @@ rebooting. ???
-
- ==============================================================
-
-+rr_interval: (BFS only)
-+
-+This is the smallest duration that any cpu process scheduling unit
-+will run for. Increasing this value can increase throughput of cpu
-+bound tasks substantially but at the expense of increased latencies
-+overall. This value is in milliseconds and the default value chosen
-+depends on the number of cpus available at scheduler initialisation
-+with a minimum of 6.
-+
-+Valid values are from 1-5000.
-+
-+==============================================================
-+
- rtsig-max & rtsig-nr:
-
- The file rtsig-max can be used to tune the maximum number
---- a/include/linux/init_task.h
-+++ b/include/linux/init_task.h
-@@ -116,9 +116,10 @@ extern struct cred init_cred;
- .usage = ATOMIC_INIT(2), \
- .flags = PF_KTHREAD, \
- .lock_depth = -1, \
-- .prio = MAX_PRIO-20, \
-+ .prio = NORMAL_PRIO, \
- .static_prio = MAX_PRIO-20, \
-- .normal_prio = MAX_PRIO-20, \
-+ .normal_prio = NORMAL_PRIO, \
-+ .deadline = 0, \
- .policy = SCHED_NORMAL, \
- .cpus_allowed = CPU_MASK_ALL, \
- .mm = NULL, \
---- a/include/linux/sched.h
-+++ b/include/linux/sched.h
-@@ -36,9 +36,12 @@
- #define SCHED_FIFO 1
- #define SCHED_RR 2
- #define SCHED_BATCH 3
--/* SCHED_ISO: reserved but not implemented yet */
-+#define SCHED_ISO 4
- #define SCHED_IDLE 5
-
-+#define SCHED_MAX (SCHED_IDLE)
-+#define SCHED_RANGE(policy) ((policy) <= SCHED_MAX)
-+
- #ifdef __KERNEL__
-
- struct sched_param {
-@@ -1090,10 +1093,13 @@ struct sched_entity {
- struct load_weight load; /* for load-balancing */
- struct rb_node run_node;
- struct list_head group_node;
-+#ifdef CONFIG_SCHED_CFS
- unsigned int on_rq;
-
- u64 exec_start;
-+#endif
- u64 sum_exec_runtime;
-+#ifdef CONFIG_SCHED_CFS
- u64 vruntime;
- u64 prev_sum_exec_runtime;
-
-@@ -1145,6 +1151,7 @@ struct sched_entity {
- /* rq "owned" by this entity/group: */
- struct cfs_rq *my_q;
- #endif
-+#endif
- };
-
- struct sched_rt_entity {
-@@ -1172,17 +1179,19 @@ struct task_struct {
-
- int lock_depth; /* BKL lock depth */
-
--#ifdef CONFIG_SMP
--#ifdef __ARCH_WANT_UNLOCKED_CTXSW
- int oncpu;
--#endif
--#endif
--
- int prio, static_prio, normal_prio;
- unsigned int rt_priority;
- const struct sched_class *sched_class;
- struct sched_entity se;
- struct sched_rt_entity rt;
-+ unsigned long deadline;
-+#ifdef CONFIG_SCHED_BFS
-+ int load_weight; /* for niceness load balancing purposes */
-+ int first_time_slice;
-+ unsigned long long timestamp, last_ran;
-+ unsigned long utime_pc, stime_pc;
-+#endif
-
- #ifdef CONFIG_PREEMPT_NOTIFIERS
- /* list of struct preempt_notifier: */
-@@ -1205,6 +1214,9 @@ struct task_struct {
-
- unsigned int policy;
- cpumask_t cpus_allowed;
-+#ifdef CONFIG_HOTPLUG_CPU
-+ cpumask_t unplugged_mask;
-+#endif
-
- #ifdef CONFIG_PREEMPT_RCU
- int rcu_read_lock_nesting;
-@@ -1497,11 +1509,19 @@ struct task_struct {
- * priority to a value higher than any user task. Note:
- * MAX_RT_PRIO must not be smaller than MAX_USER_RT_PRIO.
- */
--
-+#define PRIO_RANGE (40)
- #define MAX_USER_RT_PRIO 100
- #define MAX_RT_PRIO MAX_USER_RT_PRIO
--
-+#ifdef CONFIG_SCHED_BFS
-+#define MAX_PRIO (MAX_RT_PRIO + PRIO_RANGE)
-+#define ISO_PRIO (MAX_RT_PRIO)
-+#define NORMAL_PRIO (MAX_RT_PRIO + 1)
-+#define IDLE_PRIO (MAX_RT_PRIO + 2)
-+#define PRIO_LIMIT ((IDLE_PRIO) + 1)
-+#else
- #define MAX_PRIO (MAX_RT_PRIO + 40)
-+#define NORMAL_PRIO (MAX_RT_PRIO - 20)
-+#endif
- #define DEFAULT_PRIO (MAX_RT_PRIO + 20)
-
- static inline int rt_prio(int prio)
-@@ -1785,7 +1805,7 @@ task_sched_runtime(struct task_struct *t
- extern unsigned long long thread_group_sched_runtime(struct task_struct *task);
-
- /* sched_exec is called by processes performing an exec */
--#ifdef CONFIG_SMP
-+#if defined(CONFIG_SMP) && defined(CONFIG_SCHED_CFS)
- extern void sched_exec(void);
- #else
- #define sched_exec() {}
---- a/init/Kconfig
-+++ b/init/Kconfig
-@@ -451,9 +451,22 @@ config LOG_BUF_SHIFT
- config HAVE_UNSTABLE_SCHED_CLOCK
- bool
-
-+choice
-+ prompt "Scheduler"
-+ default SCHED_CFS
-+
-+ config SCHED_CFS
-+ bool "CFS"
-+
-+ config SCHED_BFS
-+ bool "BFS"
-+
-+endchoice
-+
- config GROUP_SCHED
- bool "Group CPU scheduler"
- depends on EXPERIMENTAL
-+ depends on SCHED_CFS
- default n
- help
- This feature lets CPU scheduler recognize task groups and control CPU
-@@ -504,6 +517,7 @@ endchoice
-
- menuconfig CGROUPS
- boolean "Control Group support"
-+ depends on SCHED_CFS
- help
- This option adds support for grouping sets of processes together, for
- use with process control subsystems such as Cpusets, CFS, memory
---- a/kernel/Makefile
-+++ b/kernel/Makefile
-@@ -2,7 +2,7 @@
- # Makefile for the linux kernel.
- #
-
--obj-y = sched.o fork.o exec_domain.o panic.o printk.o \
-+obj-y = $(if $(CONFIG_SCHED_CFS),sched.o,sched_bfs.o) fork.o exec_domain.o panic.o printk.o \
- cpu.o exit.o itimer.o time.o softirq.o resource.o \
- sysctl.o capability.o ptrace.o timer.o user.o \
- signal.o sys.o kmod.o workqueue.o pid.o \
-@@ -108,6 +108,7 @@ ifneq ($(CONFIG_SCHED_OMIT_FRAME_POINTER
- # I turn this off for IA-64 only. Andreas Schwab says it's also needed on m68k
- # to get a correct value for the wait-channel (WCHAN in ps). --davidm
- CFLAGS_sched.o := $(PROFILING) -fno-omit-frame-pointer
-+CFLAGS_sched_bfs.o := $(PROFILING) -fno-omit-frame-pointer
- endif
-
- $(obj)/configs.o: $(obj)/config_data.h
---- a/kernel/kthread.c
-+++ b/kernel/kthread.c
-@@ -16,7 +16,11 @@
- #include <linux/mutex.h>
- #include <trace/events/sched.h>
-
-+#ifdef CONFIG_SCHED_BFS
-+#define KTHREAD_NICE_LEVEL (0)
-+#else
- #define KTHREAD_NICE_LEVEL (-5)
-+#endif
-
- static DEFINE_SPINLOCK(kthread_create_lock);
- static LIST_HEAD(kthread_create_list);
---- /dev/null
-+++ b/kernel/sched_bfs.c
-@@ -0,0 +1,6105 @@
-+/*
-+ * kernel/sched_bfs.c, was sched.c
-+ *
-+ * Kernel scheduler and related syscalls
-+ *
-+ * Copyright (C) 1991-2002 Linus Torvalds
-+ *
-+ * 1996-12-23 Modified by Dave Grothe to fix bugs in semaphores and
-+ * make semaphores SMP safe
-+ * 1998-11-19 Implemented schedule_timeout() and related stuff
-+ * by Andrea Arcangeli
-+ * 2002-01-04 New ultra-scalable O(1) scheduler by Ingo Molnar:
-+ * hybrid priority-list and round-robin design with
-+ * an array-switch method of distributing timeslices
-+ * and per-CPU runqueues. Cleanups and useful suggestions
-+ * by Davide Libenzi, preemptible kernel bits by Robert Love.
-+ * 2003-09-03 Interactivity tuning by Con Kolivas.
-+ * 2004-04-02 Scheduler domains code by Nick Piggin
-+ * 2007-04-15 Work begun on replacing all interactivity tuning with a
-+ * fair scheduling design by Con Kolivas.
-+ * 2007-05-05 Load balancing (smp-nice) and other improvements
-+ * by Peter Williams
-+ * 2007-05-06 Interactivity improvements to CFS by Mike Galbraith
-+ * 2007-07-01 Group scheduling enhancements by Srivatsa Vaddagiri
-+ * 2007-11-29 RT balancing improvements by Steven Rostedt, Gregory Haskins,
-+ * Thomas Gleixner, Mike Kravetz
-+ * now Brainfuck deadline scheduling policy by Con Kolivas deletes
-+ * a whole lot of those previous things.
-+ */
-+
-+#include <linux/mm.h>
-+#include <linux/module.h>
-+#include <linux/nmi.h>
-+#include <linux/init.h>
-+#include <asm/uaccess.h>
-+#include <linux/highmem.h>
-+#include <linux/smp_lock.h>
-+#include <asm/mmu_context.h>
-+#include <linux/interrupt.h>
-+#include <linux/capability.h>
-+#include <linux/completion.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/debug_locks.h>
-+#include <linux/perf_counter.h>
-+#include <linux/security.h>
-+#include <linux/notifier.h>
-+#include <linux/profile.h>
-+#include <linux/freezer.h>
-+#include <linux/vmalloc.h>
-+#include <linux/blkdev.h>
-+#include <linux/delay.h>
-+#include <linux/smp.h>
-+#include <linux/threads.h>
-+#include <linux/timer.h>
-+#include <linux/rcupdate.h>
-+#include <linux/cpu.h>
-+#include <linux/cpuset.h>
-+#include <linux/cpumask.h>
-+#include <linux/percpu.h>
-+#include <linux/kthread.h>
-+#include <linux/proc_fs.h>
-+#include <linux/seq_file.h>
-+#include <linux/syscalls.h>
-+#include <linux/times.h>
-+#include <linux/tsacct_kern.h>
-+#include <linux/kprobes.h>
-+#include <linux/delayacct.h>
-+#include <linux/reciprocal_div.h>
-+#include <linux/log2.h>
-+#include <linux/bootmem.h>
-+#include <linux/ftrace.h>
-+
-+#include <asm/tlb.h>
-+#include <asm/unistd.h>
-+
-+#define CREATE_TRACE_POINTS
-+#include <trace/events/sched.h>
-+
-+#define rt_prio(prio) unlikely((prio) < MAX_RT_PRIO)
-+#define rt_task(p) rt_prio((p)->prio)
-+#define rt_queue(rq) rt_prio((rq)->rq_prio)
-+#define batch_task(p) (unlikely((p)->policy == SCHED_BATCH))
-+#define is_rt_policy(policy) ((policy) == SCHED_FIFO || \
-+ (policy) == SCHED_RR)
-+#define has_rt_policy(p) unlikely(is_rt_policy((p)->policy))
-+#define idleprio_task(p) unlikely((p)->policy == SCHED_IDLE)
-+#define iso_task(p) unlikely((p)->policy == SCHED_ISO)
-+#define iso_queue(rq) unlikely((rq)->rq_policy == SCHED_ISO)
-+#define ISO_PERIOD ((5 * HZ * num_online_cpus()) + 1)
-+
-+/*
-+ * Convert user-nice values [ -20 ... 0 ... 19 ]
-+ * to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ],
-+ * and back.
-+ */
-+#define NICE_TO_PRIO(nice) (MAX_RT_PRIO + (nice) + 20)
-+#define PRIO_TO_NICE(prio) ((prio) - MAX_RT_PRIO - 20)
-+#define TASK_NICE(p) PRIO_TO_NICE((p)->static_prio)
-+
-+/*
-+ * 'User priority' is the nice value converted to something we
-+ * can work with better when scaling various scheduler parameters,
-+ * it's a [ 0 ... 39 ] range.
-+ */
-+#define USER_PRIO(p) ((p)-MAX_RT_PRIO)
-+#define TASK_USER_PRIO(p) USER_PRIO((p)->static_prio)
-+#define MAX_USER_PRIO (USER_PRIO(MAX_PRIO))
-+#define SCHED_PRIO(p) ((p)+MAX_RT_PRIO)
-+
-+/* Some helpers for converting to/from various scales.*/
-+#define JIFFIES_TO_NS(TIME) ((TIME) * (1000000000 / HZ))
-+#define MS_TO_NS(TIME) ((TIME) * 1000000)
-+#define MS_TO_US(TIME) ((TIME) * 1000)
-+
-+#ifdef CONFIG_SMP
-+/*
-+ * Divide a load by a sched group cpu_power : (load / sg->__cpu_power)
-+ * Since cpu_power is a 'constant', we can use a reciprocal divide.
-+ */
-+static inline u32 sg_div_cpu_power(const struct sched_group *sg, u32 load)
-+{
-+ return reciprocal_divide(load, sg->reciprocal_cpu_power);
-+}
-+
-+/*
-+ * Each time a sched group cpu_power is changed,
-+ * we must compute its reciprocal value
-+ */
-+static inline void sg_inc_cpu_power(struct sched_group *sg, u32 val)
-+{
-+ sg->__cpu_power += val;
-+ sg->reciprocal_cpu_power = reciprocal_value(sg->__cpu_power);
-+}
-+#endif
-+
-+/*
-+ * This is the time all tasks within the same priority round robin.
-+ * Value is in ms and set to a minimum of 6ms. Scales with number of cpus.
-+ * Tunable via /proc interface.
-+ */
-+int rr_interval __read_mostly = 6;
-+
-+/*
-+ * sched_iso_cpu - sysctl which determines the cpu percentage SCHED_ISO tasks
-+ * are allowed to run five seconds as real time tasks. This is the total over
-+ * all online cpus.
-+ */
-+int sched_iso_cpu __read_mostly = 70;
-+
-+int prio_ratios[PRIO_RANGE] __read_mostly;
-+
-+static inline unsigned long timeslice(void)
-+{
-+ return MS_TO_US(rr_interval);
-+}
-+
-+struct global_rq {
-+ spinlock_t lock;
-+ unsigned long nr_running;
-+ unsigned long nr_uninterruptible;
-+ unsigned long long nr_switches;
-+ struct list_head queue[PRIO_LIMIT];
-+ DECLARE_BITMAP(prio_bitmap, PRIO_LIMIT + 1);
-+ unsigned long iso_ticks;
-+ unsigned short iso_refractory;
-+#ifdef CONFIG_SMP
-+ unsigned long qnr; /* queued not running */
-+ cpumask_t cpu_idle_map;
-+#endif
-+};
-+
-+static struct global_rq grq;
-+
-+/*
-+ * This is the main, per-CPU runqueue data structure.
-+ * All this is protected by the global_rq lock.
-+ */
-+struct rq {
-+#ifdef CONFIG_SMP
-+#ifdef CONFIG_NO_HZ
-+ unsigned char in_nohz_recently;
-+#endif
-+#endif
-+
-+ struct task_struct *curr, *idle;
-+ struct mm_struct *prev_mm;
-+ struct list_head queue; /* Place to store currently running task */
-+
-+ /* Stored data about rq->curr to work outside grq lock */
-+ unsigned long rq_deadline;
-+ unsigned int rq_policy;
-+ int rq_time_slice;
-+ int rq_prio;
-+
-+ /* Accurate timekeeping data */
-+ u64 timekeep_clock;
-+ unsigned long user_pc, nice_pc, irq_pc, softirq_pc, system_pc,
-+ iowait_pc, idle_pc;
-+ atomic_t nr_iowait;
-+
-+ int cpu; /* cpu of this runqueue */
-+ int online;
-+
-+#ifdef CONFIG_SMP
-+ struct root_domain *rd;
-+ struct sched_domain *sd;
-+
-+ struct list_head migration_queue;
-+#endif
-+
-+ u64 clock;
-+#ifdef CONFIG_SCHEDSTATS
-+
-+ /* latency stats */
-+ struct sched_info rq_sched_info;
-+ unsigned long long rq_cpu_time;
-+ /* could above be rq->cfs_rq.exec_clock + rq->rt_rq.rt_runtime ? */
-+
-+ /* sys_sched_yield() stats */
-+ unsigned int yld_count;
-+
-+ /* schedule() stats */
-+ unsigned int sched_switch;
-+ unsigned int sched_count;
-+ unsigned int sched_goidle;
-+
-+ /* try_to_wake_up() stats */
-+ unsigned int ttwu_count;
-+ unsigned int ttwu_local;
-+
-+ /* BKL stats */
-+ unsigned int bkl_count;
-+#endif
-+};
-+
-+static DEFINE_PER_CPU(struct rq, runqueues) ____cacheline_aligned_in_smp;
-+static DEFINE_MUTEX(sched_hotcpu_mutex);
-+
-+#ifdef CONFIG_SMP
-+
-+/*
-+ * We add the notion of a root-domain which will be used to define per-domain
-+ * variables. Each exclusive cpuset essentially defines an island domain by
-+ * fully partitioning the member cpus from any other cpuset. Whenever a new
-+ * exclusive cpuset is created, we also create and attach a new root-domain
-+ * object.
-+ *
-+ */
-+struct root_domain {
-+ atomic_t refcount;
-+ cpumask_var_t span;
-+ cpumask_var_t online;
-+
-+ /*
-+ * The "RT overload" flag: it gets set if a CPU has more than
-+ * one runnable RT task.
-+ */
-+ cpumask_var_t rto_mask;
-+ atomic_t rto_count;
-+#if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT)
-+ /*
-+ * Preferred wake up cpu nominated by sched_mc balance that will be
-+ * used when most cpus are idle in the system indicating overall very
-+ * low system utilisation. Triggered at POWERSAVINGS_BALANCE_WAKEUP(2)
-+ */
-+ unsigned int sched_mc_preferred_wakeup_cpu;
-+#endif
-+};
-+
-+/*
-+ * By default the system creates a single root-domain with all cpus as
-+ * members (mimicking the global state we have today).
-+ */
-+static struct root_domain def_root_domain;
-+
-+#endif
-+
-+static inline int cpu_of(struct rq *rq)
-+{
-+#ifdef CONFIG_SMP
-+ return rq->cpu;
-+#else
-+ return 0;
-+#endif
-+}
-+
-+/*
-+ * The domain tree (rq->sd) is protected by RCU's quiescent state transition.
-+ * See detach_destroy_domains: synchronize_sched for details.
-+ *
-+ * The domain tree of any CPU may only be accessed from within
-+ * preempt-disabled sections.
-+ */
-+#define for_each_domain(cpu, __sd) \
-+ for (__sd = rcu_dereference(cpu_rq(cpu)->sd); __sd; __sd = __sd->parent)
-+
-+#define cpu_rq(cpu) (&per_cpu(runqueues, (cpu)))
-+#define this_rq() (&__get_cpu_var(runqueues))
-+#define task_rq(p) cpu_rq(task_cpu(p))
-+#define cpu_curr(cpu) (cpu_rq(cpu)->curr)
-+
-+#include "sched_stats.h"
-+
-+#ifndef prepare_arch_switch
-+# define prepare_arch_switch(next) do { } while (0)
-+#endif
-+#ifndef finish_arch_switch
-+# define finish_arch_switch(prev) do { } while (0)
-+#endif
-+
-+inline void update_rq_clock(struct rq *rq)
-+{
-+ rq->clock = sched_clock_cpu(cpu_of(rq));
-+}
-+
-+static inline int task_running(struct task_struct *p)
-+{
-+ return (!!p->oncpu);
-+}
-+
-+static inline void grq_lock(void)
-+ __acquires(grq.lock)
-+{
-+ smp_mb();
-+ spin_lock(&grq.lock);
-+}
-+
-+static inline void grq_unlock(void)
-+ __releases(grq.lock)
-+{
-+ spin_unlock(&grq.lock);
-+}
-+
-+static inline void grq_lock_irq(void)
-+ __acquires(grq.lock)
-+{
-+ smp_mb();
-+ spin_lock_irq(&grq.lock);
-+}
-+
-+static inline void time_lock_grq(struct rq *rq)
-+ __acquires(grq.lock)
-+{
-+ grq_lock();
-+ update_rq_clock(rq);
-+}
-+
-+static inline void grq_unlock_irq(void)
-+ __releases(grq.lock)
-+{
-+ spin_unlock_irq(&grq.lock);
-+}
-+
-+static inline void grq_lock_irqsave(unsigned long *flags)
-+ __acquires(grq.lock)
-+{
-+ smp_mb();
-+ spin_lock_irqsave(&grq.lock, *flags);
-+}
-+
-+static inline void grq_unlock_irqrestore(unsigned long *flags)
-+ __releases(grq.lock)
-+{
-+ spin_unlock_irqrestore(&grq.lock, *flags);
-+}
-+
-+static inline struct rq
-+*task_grq_lock(struct task_struct *p, unsigned long *flags)
-+ __acquires(grq.lock)
-+{
-+ grq_lock_irqsave(flags);
-+ return task_rq(p);
-+}
-+
-+static inline struct rq
-+*time_task_grq_lock(struct task_struct *p, unsigned long *flags)
-+ __acquires(grq.lock)
-+{
-+ struct rq *rq = task_grq_lock(p, flags);
-+ update_rq_clock(rq);
-+ return rq;
-+}
-+
-+static inline void task_grq_unlock(unsigned long *flags)
-+ __releases(grq.lock)
-+{
-+ grq_unlock_irqrestore(flags);
-+}
-+
-+/**
-+ * runqueue_is_locked
-+ *
-+ * Returns true if the global runqueue is locked.
-+ * This interface allows printk to be called with the runqueue lock
-+ * held and know whether or not it is OK to wake up the klogd.
-+ */
-+int runqueue_is_locked(void)
-+{
-+ return spin_is_locked(&grq.lock);
-+}
-+
-+void task_rq_unlock_wait(struct task_struct *p)
-+ __releases(grq.lock)
-+{
-+ smp_mb(); /* spin-unlock-wait is not a full memory barrier */
-+ spin_unlock_wait(&grq.lock);
-+}
-+
-+static inline void time_grq_lock(struct rq *rq, unsigned long *flags)
-+ __acquires(grq.lock)
-+{
-+ spin_lock_irqsave(&grq.lock, *flags);
-+ update_rq_clock(rq);
-+}
-+
-+static inline struct rq *__task_grq_lock(struct task_struct *p)
-+ __acquires(grq.lock)
-+{
-+ grq_lock();
-+ return task_rq(p);
-+}
-+
-+static inline void __task_grq_unlock(void)
-+ __releases(grq.lock)
-+{
-+ grq_unlock();
-+}
-+
-+#ifndef __ARCH_WANT_UNLOCKED_CTXSW
-+static inline void prepare_lock_switch(struct rq *rq, struct task_struct *next)
-+{
-+}
-+
-+static inline void finish_lock_switch(struct rq *rq, struct task_struct *prev)
-+{
-+#ifdef CONFIG_DEBUG_SPINLOCK
-+ /* this is a valid case when another task releases the spinlock */
-+ grq.lock.owner = current;
-+#endif
-+ /*
-+ * If we are tracking spinlock dependencies then we have to
-+ * fix up the runqueue lock - which gets 'carried over' from
-+ * prev into current:
-+ */
-+ spin_acquire(&grq.lock.dep_map, 0, 0, _THIS_IP_);
-+
-+ grq_unlock_irq();
-+}
-+
-+#else /* __ARCH_WANT_UNLOCKED_CTXSW */
-+
-+static inline void prepare_lock_switch(struct rq *rq, struct task_struct *next)
-+{
-+#ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW
-+ grq_unlock_irq();
-+#else
-+ grq_unlock();
-+#endif
-+}
-+
-+static inline void finish_lock_switch(struct rq *rq, struct task_struct *prev)
-+{
-+ smp_wmb();
-+#ifndef __ARCH_WANT_INTERRUPTS_ON_CTXSW
-+ local_irq_enable();
-+#endif
-+}
-+#endif /* __ARCH_WANT_UNLOCKED_CTXSW */
-+
-+/*
-+ * A task that is queued will be on the grq run list.
-+ * A task that is not running or queued will not be on the grq run list.
-+ * A task that is currently running will have ->oncpu set and be queued
-+ * temporarily in its own rq queue.
-+ * A task that is running and no longer queued will be seen only on
-+ * context switch exit.
-+ */
-+
-+static inline int task_queued(struct task_struct *p)
-+{
-+ return (!list_empty(&p->rt.run_list));
-+}
-+
-+static inline int task_queued_only(struct task_struct *p)
-+{
-+ return (!list_empty(&p->rt.run_list) && !task_running(p));
-+}
-+
-+/*
-+ * Removing from the global runqueue. Enter with grq locked.
-+ */
-+static void dequeue_task(struct task_struct *p)
-+{
-+ list_del_init(&p->rt.run_list);
-+ if (list_empty(grq.queue + p->prio))
-+ __clear_bit(p->prio, grq.prio_bitmap);
-+}
-+
-+static inline void reset_first_time_slice(struct task_struct *p)
-+{
-+ if (unlikely(p->first_time_slice))
-+ p->first_time_slice = 0;
-+}
-+
-+static int idleprio_suitable(struct task_struct *p)
-+{
-+ return (!freezing(p) && !signal_pending(p) &&
-+ !(task_contributes_to_load(p)) && !(p->flags & (PF_EXITING)));
-+}
-+
-+static int isoprio_suitable(void)
-+{
-+ return !grq.iso_refractory;
-+}
-+
-+/*
-+ * Adding to the global runqueue. Enter with grq locked.
-+ */
-+static void enqueue_task(struct task_struct *p)
-+{
-+ if (!rt_task(p)) {
-+ /* Check it hasn't gotten rt from PI */
-+ if ((idleprio_task(p) && idleprio_suitable(p)) ||
-+ (iso_task(p) && isoprio_suitable()))
-+ p->prio = p->normal_prio;
-+ else
-+ p->prio = NORMAL_PRIO;
-+ }
-+ __set_bit(p->prio, grq.prio_bitmap);
-+ list_add_tail(&p->rt.run_list, grq.queue + p->prio);
-+ sched_info_queued(p);
-+}
-+
-+/* Only idle task does this as a real time task*/
-+static inline void enqueue_task_head(struct task_struct *p)
-+{
-+ __set_bit(p->prio, grq.prio_bitmap);
-+ list_add(&p->rt.run_list, grq.queue + p->prio);
-+ sched_info_queued(p);
-+}
-+
-+static inline void requeue_task(struct task_struct *p)
-+{
-+ sched_info_queued(p);
-+}
-+
-+static inline int pratio(struct task_struct *p)
-+{
-+ return prio_ratios[TASK_USER_PRIO(p)];
-+}
-+
-+/*
-+ * task_timeslice - all tasks of all priorities get the exact same timeslice
-+ * length. CPU distribution is handled by giving different deadlines to
-+ * tasks of different priorities.
-+ */
-+static inline int task_timeslice(struct task_struct *p)
-+{
-+ return (rr_interval * pratio(p) / 100);
-+}
-+
-+#ifdef CONFIG_SMP
-+static inline void inc_qnr(void)
-+{
-+ grq.qnr++;
-+}
-+
-+static inline void dec_qnr(void)
-+{
-+ grq.qnr--;
-+}
-+
-+static inline int queued_notrunning(void)
-+{
-+ return grq.qnr;
-+}
-+#else
-+static inline void inc_qnr(void)
-+{
-+}
-+
-+static inline void dec_qnr(void)
-+{
-+}
-+
-+static inline int queued_notrunning(void)
-+{
-+ return grq.nr_running;
-+}
-+#endif
-+
-+/*
-+ * activate_idle_task - move idle task to the _front_ of runqueue.
-+ */
-+static inline void activate_idle_task(struct task_struct *p)
-+{
-+ enqueue_task_head(p);
-+ grq.nr_running++;
-+ inc_qnr();
-+}
-+
-+static inline int normal_prio(struct task_struct *p)
-+{
-+ if (has_rt_policy(p))
-+ return MAX_RT_PRIO - 1 - p->rt_priority;
-+ if (idleprio_task(p))
-+ return IDLE_PRIO;
-+ if (iso_task(p))
-+ return ISO_PRIO;
-+ return NORMAL_PRIO;
-+}
-+
-+/*
-+ * Calculate the current priority, i.e. the priority
-+ * taken into account by the scheduler. This value might
-+ * be boosted by RT tasks as it will be RT if the task got
-+ * RT-boosted. If not then it returns p->normal_prio.
-+ */
-+static int effective_prio(struct task_struct *p)
-+{
-+ p->normal_prio = normal_prio(p);
-+ /*
-+ * If we are RT tasks or we were boosted to RT priority,
-+ * keep the priority unchanged. Otherwise, update priority
-+ * to the normal priority:
-+ */
-+ if (!rt_prio(p->prio))
-+ return p->normal_prio;
-+ return p->prio;
-+}
-+
-+/*
-+ * activate_task - move a task to the runqueue. Enter with grq locked. The rq
-+ * doesn't really matter but gives us the local clock.
-+ */
-+static void activate_task(struct task_struct *p, struct rq *rq)
-+{
-+ u64 now = rq->clock;
-+
-+ /*
-+ * Sleep time is in units of nanosecs, so shift by 20 to get a
-+ * milliseconds-range estimation of the amount of time that the task
-+ * spent sleeping:
-+ */
-+ if (unlikely(prof_on == SLEEP_PROFILING)) {
-+ if (p->state == TASK_UNINTERRUPTIBLE)
-+ profile_hits(SLEEP_PROFILING, (void *)get_wchan(p),
-+ (now - p->timestamp) >> 20);
-+ }
-+
-+ p->prio = effective_prio(p);
-+ p->timestamp = now;
-+ if (task_contributes_to_load(p))
-+ grq.nr_uninterruptible--;
-+ enqueue_task(p);
-+ grq.nr_running++;
-+ inc_qnr();
-+}
-+
-+/*
-+ * deactivate_task - If it's running, it's not on the grq and we can just
-+ * decrement the nr_running.
-+ */
-+static inline void deactivate_task(struct task_struct *p)
-+{
-+ if (task_contributes_to_load(p))
-+ grq.nr_uninterruptible++;
-+ grq.nr_running--;
-+}
-+
-+#ifdef CONFIG_SMP
-+void set_task_cpu(struct task_struct *p, unsigned int cpu)
-+{
-+ trace_sched_migrate_task(p, cpu);
-+ /*
-+ * After ->cpu is set up to a new value, task_grq_lock(p, ...) can be
-+ * successfuly executed on another CPU. We must ensure that updates of
-+ * per-task data have been completed by this moment.
-+ */
-+ smp_wmb();
-+ task_thread_info(p)->cpu = cpu;
-+}
-+#endif
-+
-+/*
-+ * Move a task off the global queue and take it to a cpu for it will
-+ * become the running task.
-+ */
-+static inline void take_task(struct rq *rq, struct task_struct *p)
-+{
-+ set_task_cpu(p, rq->cpu);
-+ dequeue_task(p);
-+ list_add(&p->rt.run_list, &rq->queue);
-+ dec_qnr();
-+}
-+
-+/*
-+ * Returns a descheduling task to the grq runqueue unless it is being
-+ * deactivated.
-+ */
-+static inline void return_task(struct task_struct *p, int deactivate)
-+{
-+ list_del_init(&p->rt.run_list);
-+ if (deactivate)
-+ deactivate_task(p);
-+ else {
-+ inc_qnr();
-+ enqueue_task(p);
-+ }
-+}
-+
-+/*
-+ * resched_task - mark a task 'to be rescheduled now'.
-+ *
-+ * On UP this means the setting of the need_resched flag, on SMP it
-+ * might also involve a cross-CPU call to trigger the scheduler on
-+ * the target CPU.
-+ */
-+#ifdef CONFIG_SMP
-+
-+#ifndef tsk_is_polling
-+#define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG)
-+#endif
-+
-+static void resched_task(struct task_struct *p)
-+{
-+ int cpu;
-+
-+ assert_spin_locked(&grq.lock);
-+
-+ if (unlikely(test_tsk_thread_flag(p, TIF_NEED_RESCHED)))
-+ return;
-+
-+ set_tsk_thread_flag(p, TIF_NEED_RESCHED);
-+
-+ cpu = task_cpu(p);
-+ if (cpu == smp_processor_id())
-+ return;
-+
-+ /* NEED_RESCHED must be visible before we test polling */
-+ smp_mb();
-+ if (!tsk_is_polling(p))
-+ smp_send_reschedule(cpu);
-+}
-+
-+#else
-+static inline void resched_task(struct task_struct *p)
-+{
-+ assert_spin_locked(&grq.lock);
-+ set_tsk_need_resched(p);
-+}
-+#endif
-+
-+/**
-+ * task_curr - is this task currently executing on a CPU?
-+ * @p: the task in question.
-+ */
-+inline int task_curr(const struct task_struct *p)
-+{
-+ return cpu_curr(task_cpu(p)) == p;
-+}
-+
-+#ifdef CONFIG_SMP
-+struct migration_req {
-+ struct list_head list;
-+
-+ struct task_struct *task;
-+ int dest_cpu;
-+
-+ struct completion done;
-+};
-+
-+/*
-+ * wait_task_context_switch - wait for a thread to complete at least one
-+ * context switch.
-+ *
-+ * @p must not be current.
-+ */
-+void wait_task_context_switch(struct task_struct *p)
-+{
-+ unsigned long nvcsw, nivcsw, flags;
-+ int running;
-+ struct rq *rq;
-+
-+ nvcsw = p->nvcsw;
-+ nivcsw = p->nivcsw;
-+ for (;;) {
-+ /*
-+ * The runqueue is assigned before the actual context
-+ * switch. We need to take the runqueue lock.
-+ *
-+ * We could check initially without the lock but it is
-+ * very likely that we need to take the lock in every
-+ * iteration.
-+ */
-+ rq = task_grq_lock(p, &flags);
-+ running = task_running(p);
-+ task_grq_unlock(&flags);
-+
-+ if (likely(!running))
-+ break;
-+ /*
-+ * The switch count is incremented before the actual
-+ * context switch. We thus wait for two switches to be
-+ * sure at least one completed.
-+ */
-+ if ((p->nvcsw - nvcsw) > 1)
-+ break;
-+ if ((p->nivcsw - nivcsw) > 1)
-+ break;
-+
-+ cpu_relax();
-+ }
-+}
-+
-+/*
-+ * wait_task_inactive - wait for a thread to unschedule.
-+ *
-+ * If @match_state is nonzero, it's the @p->state value just checked and
-+ * not expected to change. If it changes, i.e. @p might have woken up,
-+ * then return zero. When we succeed in waiting for @p to be off its CPU,
-+ * we return a positive number (its total switch count). If a second call
-+ * a short while later returns the same number, the caller can be sure that
-+ * @p has remained unscheduled the whole time.
-+ *
-+ * The caller must ensure that the task *will* unschedule sometime soon,
-+ * else this function might spin for a *long* time. This function can't
-+ * be called with interrupts off, or it may introduce deadlock with
-+ * smp_call_function() if an IPI is sent by the same process we are
-+ * waiting to become inactive.
-+ */
-+unsigned long wait_task_inactive(struct task_struct *p, long match_state)
-+{
-+ unsigned long flags;
-+ int running, on_rq;
-+ unsigned long ncsw;
-+ struct rq *rq;
-+
-+ for (;;) {
-+ /*
-+ * We do the initial early heuristics without holding
-+ * any task-queue locks at all. We'll only try to get
-+ * the runqueue lock when things look like they will
-+ * work out!
-+ */
-+ rq = task_rq(p);
-+
-+ /*
-+ * If the task is actively running on another CPU
-+ * still, just relax and busy-wait without holding
-+ * any locks.
-+ *
-+ * NOTE! Since we don't hold any locks, it's not
-+ * even sure that "rq" stays as the right runqueue!
-+ * But we don't care, since this will
-+ * return false if the runqueue has changed and p
-+ * is actually now running somewhere else!
-+ */
-+ while (task_running(p) && p == rq->curr) {
-+ if (match_state && unlikely(p->state != match_state))
-+ return 0;
-+ cpu_relax();
-+ }
-+
-+ /*
-+ * Ok, time to look more closely! We need the grq
-+ * lock now, to be *sure*. If we're wrong, we'll
-+ * just go back and repeat.
-+ */
-+ rq = task_grq_lock(p, &flags);
-+ trace_sched_wait_task(rq, p);
-+ running = task_running(p);
-+ on_rq = task_queued(p);
-+ ncsw = 0;
-+ if (!match_state || p->state == match_state)
-+ ncsw = p->nvcsw | LONG_MIN; /* sets MSB */
-+ task_grq_unlock(&flags);
-+
-+ /*
-+ * If it changed from the expected state, bail out now.
-+ */
-+ if (unlikely(!ncsw))
-+ break;
-+
-+ /*
-+ * Was it really running after all now that we
-+ * checked with the proper locks actually held?
-+ *
-+ * Oops. Go back and try again..
-+ */
-+ if (unlikely(running)) {
-+ cpu_relax();
-+ continue;
-+ }
-+
-+ /*
-+ * It's not enough that it's not actively running,
-+ * it must be off the runqueue _entirely_, and not
-+ * preempted!
-+ *
-+ * So if it was still runnable (but just not actively
-+ * running right now), it's preempted, and we should
-+ * yield - it could be a while.
-+ */
-+ if (unlikely(on_rq)) {
-+ schedule_timeout_uninterruptible(1);
-+ continue;
-+ }
-+
-+ /*
-+ * Ahh, all good. It wasn't running, and it wasn't
-+ * runnable, which means that it will never become
-+ * running in the future either. We're all done!
-+ */
-+ break;
-+ }
-+
-+ return ncsw;
-+}
-+
-+/***
-+ * kick_process - kick a running thread to enter/exit the kernel
-+ * @p: the to-be-kicked thread
-+ *
-+ * Cause a process which is running on another CPU to enter
-+ * kernel-mode, without any delay. (to get signals handled.)
-+ *
-+ * NOTE: this function doesnt have to take the runqueue lock,
-+ * because all it wants to ensure is that the remote task enters
-+ * the kernel. If the IPI races and the task has been migrated
-+ * to another CPU then no harm is done and the purpose has been
-+ * achieved as well.
-+ */
-+void kick_process(struct task_struct *p)
-+{
-+ int cpu;
-+
-+ preempt_disable();
-+ cpu = task_cpu(p);
-+ if ((cpu != smp_processor_id()) && task_curr(p))
-+ smp_send_reschedule(cpu);
-+ preempt_enable();
-+}
-+EXPORT_SYMBOL_GPL(kick_process);
-+#endif
-+
-+#define rq_idle(rq) ((rq)->rq_prio == PRIO_LIMIT)
-+
-+/*
-+ * RT tasks preempt purely on priority. SCHED_NORMAL tasks preempt on the
-+ * basis of earlier deadlines. SCHED_BATCH and SCHED_IDLE don't preempt,
-+ * they cooperatively multitask.
-+ */
-+static inline int task_preempts_curr(struct task_struct *p, struct rq *rq)
-+{
-+ int preempts = 0;
-+
-+ if (p->prio < rq->rq_prio)
-+ preempts = 1;
-+ else if (p->policy == SCHED_NORMAL && (p->prio == rq->rq_prio &&
-+ time_before(p->deadline, rq->rq_deadline)))
-+ preempts = 1;
-+ return preempts;
-+}
-+
-+/*
-+ * Wake up *any* suitable cpu to schedule this task.
-+ */
-+static void try_preempt(struct task_struct *p)
-+{
-+ struct rq *highest_prio_rq, *this_rq;
-+ unsigned long latest_deadline, cpu;
-+ int highest_prio;
-+ cpumask_t tmp;
-+
-+ /* Try the task's previous rq first and as a fallback */
-+ this_rq = task_rq(p);
-+
-+ if (cpu_isset(this_rq->cpu, p->cpus_allowed)) {
-+ highest_prio_rq = this_rq;
-+ /* If this_rq is idle, use that. */
-+ if (rq_idle(this_rq))
-+ goto found_rq;
-+ } else
-+ highest_prio_rq = cpu_rq(any_online_cpu(p->cpus_allowed));
-+ latest_deadline = this_rq->rq_deadline;
-+ highest_prio = this_rq->rq_prio;
-+
-+ cpus_and(tmp, cpu_online_map, p->cpus_allowed);
-+
-+ for_each_cpu_mask(cpu, tmp) {
-+ struct rq *rq;
-+ int rq_prio;
-+
-+ rq = cpu_rq(cpu);
-+
-+ if (rq_idle(rq)) {
-+ /* found an idle rq, use that one */
-+ highest_prio_rq = rq;
-+ goto found_rq;
-+ }
-+
-+ rq_prio = rq->rq_prio;
-+ if (rq_prio > highest_prio ||
-+ (rq_prio == highest_prio &&
-+ time_after(rq->rq_deadline, latest_deadline))) {
-+ highest_prio = rq_prio;
-+ latest_deadline = rq->rq_deadline;
-+ highest_prio_rq = rq;
-+ }
-+ }
-+
-+ if (!task_preempts_curr(p, highest_prio_rq))
-+ return;
-+found_rq:
-+ resched_task(highest_prio_rq->curr);
-+ return;
-+}
-+
-+/**
-+ * task_oncpu_function_call - call a function on the cpu on which a task runs
-+ * @p: the task to evaluate
-+ * @func: the function to be called
-+ * @info: the function call argument
-+ *
-+ * Calls the function @func when the task is currently running. This might
-+ * be on the current CPU, which just calls the function directly
-+ */
-+void task_oncpu_function_call(struct task_struct *p,
-+ void (*func) (void *info), void *info)
-+{
-+ int cpu;
-+
-+ preempt_disable();
-+ cpu = task_cpu(p);
-+ if (task_curr(p))
-+ smp_call_function_single(cpu, func, info, 1);
-+ preempt_enable();
-+}
-+
-+#ifdef CONFIG_SMP
-+static int suitable_idle_cpus(struct task_struct *p)
-+{
-+ return (cpus_intersects(p->cpus_allowed, grq.cpu_idle_map));
-+}
-+#else
-+static int suitable_idle_cpus(struct task_struct *p)
-+{
-+ return 0;
-+}
-+#endif
-+
-+/***
-+ * try_to_wake_up - wake up a thread
-+ * @p: the to-be-woken-up thread
-+ * @state: the mask of task states that can be woken
-+ * @sync: do a synchronous wakeup?
-+ *
-+ * Put it on the run-queue if it's not already there. The "current"
-+ * thread is always on the run-queue (except when the actual
-+ * re-schedule is in progress), and as such you're allowed to do
-+ * the simpler "current->state = TASK_RUNNING" to mark yourself
-+ * runnable without the overhead of this.
-+ *
-+ * returns failure only if the task is already active.
-+ */
-+static int try_to_wake_up(struct task_struct *p, unsigned int state, int sync)
-+{
-+ unsigned long flags;
-+ int success = 0;
-+ long old_state;
-+ struct rq *rq;
-+
-+ rq = time_task_grq_lock(p, &flags);
-+ old_state = p->state;
-+ if (!(old_state & state))
-+ goto out_unlock;
-+
-+ /*
-+ * Note this catches tasks that are running and queued, but returns
-+ * false during the context switch when they're running and no
-+ * longer queued.
-+ */
-+ if (task_queued(p))
-+ goto out_running;
-+
-+ activate_task(p, rq);
-+ /*
-+ * Sync wakeups (i.e. those types of wakeups where the waker
-+ * has indicated that it will leave the CPU in short order)
-+ * don't trigger a preemption if there are no idle cpus,
-+ * instead waiting for current to deschedule.
-+ */
-+ if (!sync || (sync && suitable_idle_cpus(p)))
-+ try_preempt(p);
-+ success = 1;
-+
-+out_running:
-+ trace_sched_wakeup(rq, p, success);
-+ p->state = TASK_RUNNING;
-+out_unlock:
-+ task_grq_unlock(&flags);
-+ return success;
-+}
-+
-+/**
-+ * wake_up_process - Wake up a specific process
-+ * @p: The process to be woken up.
-+ *
-+ * Attempt to wake up the nominated process and move it to the set of runnable
-+ * processes. Returns 1 if the process was woken up, 0 if it was already
-+ * running.
-+ *
-+ * It may be assumed that this function implies a write memory barrier before
-+ * changing the task state if and only if any tasks are woken up.
-+ */
-+int wake_up_process(struct task_struct *p)
-+{
-+ return try_to_wake_up(p, TASK_ALL, 0);
-+}
-+EXPORT_SYMBOL(wake_up_process);
-+
-+int wake_up_state(struct task_struct *p, unsigned int state)
-+{
-+ return try_to_wake_up(p, state, 0);
-+}
-+
-+/*
-+ * Perform scheduler related setup for a newly forked process p.
-+ * p is forked by current.
-+ */
-+void sched_fork(struct task_struct *p, int clone_flags)
-+{
-+ int cpu = get_cpu();
-+ struct rq *rq;
-+
-+#ifdef CONFIG_PREEMPT_NOTIFIERS
-+ INIT_HLIST_HEAD(&p->preempt_notifiers);
-+#endif
-+ /*
-+ * We mark the process as running here, but have not actually
-+ * inserted it onto the runqueue yet. This guarantees that
-+ * nobody will actually run it, and a signal or other external
-+ * event cannot wake it up and insert it on the runqueue either.
-+ */
-+ p->state = TASK_RUNNING;
-+ set_task_cpu(p, cpu);
-+
-+ /* Should be reset in fork.c but done here for ease of bfs patching */
-+ p->se.sum_exec_runtime = p->stime_pc = p->utime_pc = 0;
-+
-+ /*
-+ * Make sure we do not leak PI boosting priority to the child:
-+ */
-+ p->prio = current->normal_prio;
-+
-+ INIT_LIST_HEAD(&p->rt.run_list);
-+#if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT)
-+ if (unlikely(sched_info_on()))
-+ memset(&p->sched_info, 0, sizeof(p->sched_info));
-+#endif
-+
-+ p->oncpu = 0;
-+
-+#ifdef CONFIG_PREEMPT
-+ /* Want to start with kernel preemption disabled. */
-+ task_thread_info(p)->preempt_count = 1;
-+#endif
-+ if (unlikely(p->policy == SCHED_FIFO))
-+ goto out;
-+ /*
-+ * Share the timeslice between parent and child, thus the
-+ * total amount of pending timeslices in the system doesn't change,
-+ * resulting in more scheduling fairness. If it's negative, it won't
-+ * matter since that's the same as being 0. current's time_slice is
-+ * actually in rq_time_slice when it's running.
-+ */
-+ local_irq_disable();
-+ rq = task_rq(current);
-+ if (likely(rq->rq_time_slice > 0)) {
-+ rq->rq_time_slice /= 2;
-+ /*
-+ * The remainder of the first timeslice might be recovered by
-+ * the parent if the child exits early enough.
-+ */
-+ p->first_time_slice = 1;
-+ }
-+ p->rt.time_slice = rq->rq_time_slice;
-+ local_irq_enable();
-+out:
-+ put_cpu();
-+}
-+
-+/*
-+ * wake_up_new_task - wake up a newly created task for the first time.
-+ *
-+ * This function will do some initial scheduler statistics housekeeping
-+ * that must be done for every newly created context, then puts the task
-+ * on the runqueue and wakes it.
-+ */
-+void wake_up_new_task(struct task_struct *p, unsigned long clone_flags)
-+{
-+ struct task_struct *parent;
-+ unsigned long flags;
-+ struct rq *rq;
-+
-+ rq = time_task_grq_lock(p, &flags); ;
-+ parent = p->parent;
-+ BUG_ON(p->state != TASK_RUNNING);
-+ set_task_cpu(p, task_cpu(parent));
-+
-+ activate_task(p, rq);
-+ trace_sched_wakeup_new(rq, p, 1);
-+ if (!(clone_flags & CLONE_VM) && rq->curr == parent &&
-+ !suitable_idle_cpus(p)) {
-+ /*
-+ * The VM isn't cloned, so we're in a good position to
-+ * do child-runs-first in anticipation of an exec. This
-+ * usually avoids a lot of COW overhead.
-+ */
-+ resched_task(parent);
-+ } else
-+ try_preempt(p);
-+ task_grq_unlock(&flags);
-+}
-+
-+/*
-+ * Potentially available exiting-child timeslices are
-+ * retrieved here - this way the parent does not get
-+ * penalized for creating too many threads.
-+ *
-+ * (this cannot be used to 'generate' timeslices
-+ * artificially, because any timeslice recovered here
-+ * was given away by the parent in the first place.)
-+ */
-+void sched_exit(struct task_struct *p)
-+{
-+ struct task_struct *parent;
-+ unsigned long flags;
-+ struct rq *rq;
-+
-+ if (p->first_time_slice) {
-+ parent = p->parent;
-+ rq = task_grq_lock(parent, &flags);
-+ parent->rt.time_slice += p->rt.time_slice;
-+ if (unlikely(parent->rt.time_slice > timeslice()))
-+ parent->rt.time_slice = timeslice();
-+ task_grq_unlock(&flags);
-+ }
-+}
-+
-+#ifdef CONFIG_PREEMPT_NOTIFIERS
-+
-+/**
-+ * preempt_notifier_register - tell me when current is being preempted & rescheduled
-+ * @notifier: notifier struct to register
-+ */
-+void preempt_notifier_register(struct preempt_notifier *notifier)
-+{
-+ hlist_add_head(¬ifier->link, ¤t->preempt_notifiers);
-+}
-+EXPORT_SYMBOL_GPL(preempt_notifier_register);
-+
-+/**
-+ * preempt_notifier_unregister - no longer interested in preemption notifications
-+ * @notifier: notifier struct to unregister
-+ *
-+ * This is safe to call from within a preemption notifier.
-+ */
-+void preempt_notifier_unregister(struct preempt_notifier *notifier)
-+{
-+ hlist_del(¬ifier->link);
-+}
-+EXPORT_SYMBOL_GPL(preempt_notifier_unregister);
-+
-+static void fire_sched_in_preempt_notifiers(struct task_struct *curr)
-+{
-+ struct preempt_notifier *notifier;
-+ struct hlist_node *node;
-+
-+ hlist_for_each_entry(notifier, node, &curr->preempt_notifiers, link)
-+ notifier->ops->sched_in(notifier, raw_smp_processor_id());
-+}
-+
-+static void
-+fire_sched_out_preempt_notifiers(struct task_struct *curr,
-+ struct task_struct *next)
-+{
-+ struct preempt_notifier *notifier;
-+ struct hlist_node *node;
-+
-+ hlist_for_each_entry(notifier, node, &curr->preempt_notifiers, link)
-+ notifier->ops->sched_out(notifier, next);
-+}
-+
-+#else /* !CONFIG_PREEMPT_NOTIFIERS */
-+
-+static void fire_sched_in_preempt_notifiers(struct task_struct *curr)
-+{
-+}
-+
-+static void
-+fire_sched_out_preempt_notifiers(struct task_struct *curr,
-+ struct task_struct *next)
-+{
-+}
-+
-+#endif /* CONFIG_PREEMPT_NOTIFIERS */
-+
-+/**
-+ * prepare_task_switch - prepare to switch tasks
-+ * @rq: the runqueue preparing to switch
-+ * @next: the task we are going to switch to.
-+ *
-+ * This is called with the rq lock held and interrupts off. It must
-+ * be paired with a subsequent finish_task_switch after the context
-+ * switch.
-+ *
-+ * prepare_task_switch sets up locking and calls architecture specific
-+ * hooks.
-+ */
-+static inline void
-+prepare_task_switch(struct rq *rq, struct task_struct *prev,
-+ struct task_struct *next)
-+{
-+ fire_sched_out_preempt_notifiers(prev, next);
-+ prepare_lock_switch(rq, next);
-+ prepare_arch_switch(next);
-+}
-+
-+/**
-+ * finish_task_switch - clean up after a task-switch
-+ * @rq: runqueue associated with task-switch
-+ * @prev: the thread we just switched away from.
-+ *
-+ * finish_task_switch must be called after the context switch, paired
-+ * with a prepare_task_switch call before the context switch.
-+ * finish_task_switch will reconcile locking set up by prepare_task_switch,
-+ * and do any other architecture-specific cleanup actions.
-+ *
-+ * Note that we may have delayed dropping an mm in context_switch(). If
-+ * so, we finish that here outside of the runqueue lock. (Doing it
-+ * with the lock held can cause deadlocks; see schedule() for
-+ * details.)
-+ */
-+static inline void finish_task_switch(struct rq *rq, struct task_struct *prev)
-+ __releases(grq.lock)
-+{
-+ struct mm_struct *mm = rq->prev_mm;
-+ long prev_state;
-+
-+ rq->prev_mm = NULL;
-+
-+ /*
-+ * A task struct has one reference for the use as "current".
-+ * If a task dies, then it sets TASK_DEAD in tsk->state and calls
-+ * schedule one last time. The schedule call will never return, and
-+ * the scheduled task must drop that reference.
-+ * The test for TASK_DEAD must occur while the runqueue locks are
-+ * still held, otherwise prev could be scheduled on another cpu, die
-+ * there before we look at prev->state, and then the reference would
-+ * be dropped twice.
-+ * Manfred Spraul <manfred@colorfullife.com>
-+ */
-+ prev_state = prev->state;
-+ finish_arch_switch(prev);
-+ perf_counter_task_sched_in(current, cpu_of(rq));
-+ finish_lock_switch(rq, prev);
-+
-+ fire_sched_in_preempt_notifiers(current);
-+ if (mm)
-+ mmdrop(mm);
-+ if (unlikely(prev_state == TASK_DEAD)) {
-+ /*
-+ * Remove function-return probe instances associated with this
-+ * task and put them back on the free list.
-+ */
-+ kprobe_flush_task(prev);
-+ put_task_struct(prev);
-+ }
-+}
-+
-+/**
-+ * schedule_tail - first thing a freshly forked thread must call.
-+ * @prev: the thread we just switched away from.
-+ */
-+asmlinkage void schedule_tail(struct task_struct *prev)
-+ __releases(grq.lock)
-+{
-+ struct rq *rq = this_rq();
-+
-+ finish_task_switch(rq, prev);
-+#ifdef __ARCH_WANT_UNLOCKED_CTXSW
-+ /* In this case, finish_task_switch does not reenable preemption */
-+ preempt_enable();
-+#endif
-+ if (current->set_child_tid)
-+ put_user(current->pid, current->set_child_tid);
-+}
-+
-+/*
-+ * context_switch - switch to the new MM and the new
-+ * thread's register state.
-+ */
-+static inline void
-+context_switch(struct rq *rq, struct task_struct *prev,
-+ struct task_struct *next)
-+{
-+ struct mm_struct *mm, *oldmm;
-+
-+ prepare_task_switch(rq, prev, next);
-+ trace_sched_switch(rq, prev, next);
-+ mm = next->mm;
-+ oldmm = prev->active_mm;
-+ /*
-+ * For paravirt, this is coupled with an exit in switch_to to
-+ * combine the page table reload and the switch backend into
-+ * one hypercall.
-+ */
-+ arch_start_context_switch(prev);
-+
-+ if (unlikely(!mm)) {
-+ next->active_mm = oldmm;
-+ atomic_inc(&oldmm->mm_count);
-+ enter_lazy_tlb(oldmm, next);
-+ } else
-+ switch_mm(oldmm, mm, next);
-+
-+ if (unlikely(!prev->mm)) {
-+ prev->active_mm = NULL;
-+ rq->prev_mm = oldmm;
-+ }
-+ /*
-+ * Since the runqueue lock will be released by the next
-+ * task (which is an invalid locking op but in the case
-+ * of the scheduler it's an obvious special-case), so we
-+ * do an early lockdep release here:
-+ */
-+#ifndef __ARCH_WANT_UNLOCKED_CTXSW
-+ spin_release(&grq.lock.dep_map, 1, _THIS_IP_);
-+#endif
-+
-+ /* Here we just switch the register state and the stack. */
-+ switch_to(prev, next, prev);
-+
-+ barrier();
-+ /*
-+ * this_rq must be evaluated again because prev may have moved
-+ * CPUs since it called schedule(), thus the 'rq' on its stack
-+ * frame will be invalid.
-+ */
-+ finish_task_switch(this_rq(), prev);
-+}
-+
-+/*
-+ * nr_running, nr_uninterruptible and nr_context_switches:
-+ *
-+ * externally visible scheduler statistics: current number of runnable
-+ * threads, current number of uninterruptible-sleeping threads, total
-+ * number of context switches performed since bootup. All are measured
-+ * without grabbing the grq lock but the occasional inaccurate result
-+ * doesn't matter so long as it's positive.
-+ */
-+unsigned long nr_running(void)
-+{
-+ long nr = grq.nr_running;
-+
-+ if (unlikely(nr < 0))
-+ nr = 0;
-+ return (unsigned long)nr;
-+}
-+
-+unsigned long nr_uninterruptible(void)
-+{
-+ unsigned long nu = grq.nr_uninterruptible;
-+
-+ if (unlikely(nu < 0))
-+ nu = 0;
-+ return nu;
-+}
-+
-+unsigned long long nr_context_switches(void)
-+{
-+ long long ns = grq.nr_switches;
-+
-+ /* This is of course impossible */
-+ if (unlikely(ns < 0))
-+ ns = 1;
-+ return (long long)ns;
-+}
-+
-+unsigned long nr_iowait(void)
-+{
-+ unsigned long i, sum = 0;
-+
-+ for_each_possible_cpu(i)
-+ sum += atomic_read(&cpu_rq(i)->nr_iowait);
-+
-+ return sum;
-+}
-+
-+unsigned long nr_active(void)
-+{
-+ return nr_running() + nr_uninterruptible();
-+}
-+
-+/* Variables and functions for calc_load */
-+static unsigned long calc_load_update;
-+unsigned long avenrun[3];
-+EXPORT_SYMBOL(avenrun);
-+
-+/**
-+ * get_avenrun - get the load average array
-+ * @loads: pointer to dest load array
-+ * @offset: offset to add
-+ * @shift: shift count to shift the result left
-+ *
-+ * These values are estimates at best, so no need for locking.
-+ */
-+void get_avenrun(unsigned long *loads, unsigned long offset, int shift)
-+{
-+ loads[0] = (avenrun[0] + offset) << shift;
-+ loads[1] = (avenrun[1] + offset) << shift;
-+ loads[2] = (avenrun[2] + offset) << shift;
-+}
-+
-+static unsigned long
-+calc_load(unsigned long load, unsigned long exp, unsigned long active)
-+{
-+ load *= exp;
-+ load += active * (FIXED_1 - exp);
-+ return load >> FSHIFT;
-+}
-+
-+/*
-+ * calc_load - update the avenrun load estimates every LOAD_FREQ seconds.
-+ */
-+void calc_global_load(void)
-+{
-+ long active;
-+
-+ if (time_before(jiffies, calc_load_update))
-+ return;
-+ active = nr_active() * FIXED_1;
-+
-+ avenrun[0] = calc_load(avenrun[0], EXP_1, active);
-+ avenrun[1] = calc_load(avenrun[1], EXP_5, active);
-+ avenrun[2] = calc_load(avenrun[2], EXP_15, active);
-+
-+ calc_load_update = jiffies + LOAD_FREQ;
-+}
-+
-+DEFINE_PER_CPU(struct kernel_stat, kstat);
-+
-+EXPORT_PER_CPU_SYMBOL(kstat);
-+
-+/*
-+ * On each tick, see what percentage of that tick was attributed to each
-+ * component and add the percentage to the _pc values. Once a _pc value has
-+ * accumulated one tick's worth, account for that. This means the total
-+ * percentage of load components will always be 100 per tick.
-+ */
-+static void pc_idle_time(struct rq *rq, unsigned long pc)
-+{
-+ struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
-+ cputime64_t tmp = cputime_to_cputime64(jiffies_to_cputime(1));
-+
-+ if (atomic_read(&rq->nr_iowait) > 0) {
-+ rq->iowait_pc += pc;
-+ if (rq->iowait_pc >= 100) {
-+ rq->iowait_pc %= 100;
-+ cpustat->iowait = cputime64_add(cpustat->iowait, tmp);
-+ }
-+ } else {
-+ rq->idle_pc += pc;
-+ if (rq->idle_pc >= 100) {
-+ rq->idle_pc %= 100;
-+ cpustat->idle = cputime64_add(cpustat->idle, tmp);
-+ }
-+ }
-+}
-+
-+static void
-+pc_system_time(struct rq *rq, struct task_struct *p, int hardirq_offset,
-+ unsigned long pc, unsigned long ns)
-+{
-+ struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
-+ cputime_t one_jiffy = jiffies_to_cputime(1);
-+ cputime_t one_jiffy_scaled = cputime_to_scaled(one_jiffy);
-+ cputime64_t tmp = cputime_to_cputime64(one_jiffy);
-+
-+ p->stime_pc += pc;
-+ if (p->stime_pc >= 100) {
-+ p->stime_pc -= 100;
-+ p->stime = cputime_add(p->stime, one_jiffy);
-+ p->stimescaled = cputime_add(p->stimescaled, one_jiffy_scaled);
-+ account_group_system_time(p, one_jiffy);
-+ acct_update_integrals(p);
-+ }
-+ p->se.sum_exec_runtime += ns;
-+
-+ if (hardirq_count() - hardirq_offset)
-+ rq->irq_pc += pc;
-+ else if (softirq_count()) {
-+ rq->softirq_pc += pc;
-+ if (rq->softirq_pc >= 100) {
-+ rq->softirq_pc %= 100;
-+ cpustat->softirq = cputime64_add(cpustat->softirq, tmp);
-+ }
-+ } else {
-+ rq->system_pc += pc;
-+ if (rq->system_pc >= 100) {
-+ rq->system_pc %= 100;
-+ cpustat->system = cputime64_add(cpustat->system, tmp);
-+ }
-+ }
-+}
-+
-+static void pc_user_time(struct rq *rq, struct task_struct *p,
-+ unsigned long pc, unsigned long ns)
-+{
-+ struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
-+ cputime_t one_jiffy = jiffies_to_cputime(1);
-+ cputime_t one_jiffy_scaled = cputime_to_scaled(one_jiffy);
-+ cputime64_t tmp = cputime_to_cputime64(one_jiffy);
-+
-+ p->utime_pc += pc;
-+ if (p->utime_pc >= 100) {
-+ p->utime_pc -= 100;
-+ p->utime = cputime_add(p->utime, one_jiffy);
-+ p->utimescaled = cputime_add(p->utimescaled, one_jiffy_scaled);
-+ account_group_user_time(p, one_jiffy);
-+ acct_update_integrals(p);
-+ }
-+ p->se.sum_exec_runtime += ns;
-+
-+ if (TASK_NICE(p) > 0 || idleprio_task(p)) {
-+ rq->nice_pc += pc;
-+ if (rq->nice_pc >= 100) {
-+ rq->nice_pc %= 100;
-+ cpustat->nice = cputime64_add(cpustat->nice, tmp);
-+ }
-+ } else {
-+ rq->user_pc += pc;
-+ if (rq->user_pc >= 100) {
-+ rq->user_pc %= 100;
-+ cpustat->user = cputime64_add(cpustat->user, tmp);
-+ }
-+ }
-+}
-+
-+/* Convert nanoseconds to percentage of one tick. */
-+#define NS_TO_PC(NS) (NS * 100 / JIFFIES_TO_NS(1))
-+
-+/*
-+ * This is called on clock ticks and on context switches.
-+ * Bank in p->se.sum_exec_runtime the ns elapsed since the last tick or switch.
-+ * CPU scheduler quota accounting is also performed here in microseconds.
-+ * The value returned from sched_clock() occasionally gives bogus values so
-+ * some sanity checking is required. Time is supposed to be banked all the
-+ * time so default to half a tick to make up for when sched_clock reverts
-+ * to just returning jiffies, and for hardware that can't do tsc.
-+ */
-+static void
-+update_cpu_clock(struct rq *rq, struct task_struct *p, int tick)
-+{
-+ long time_diff = rq->clock - p->last_ran;
-+ long account_ns = rq->clock - rq->timekeep_clock;
-+ struct task_struct *idle = rq->idle;
-+ unsigned long account_pc;
-+
-+ /*
-+ * There should be less than or equal to one jiffy worth, and not
-+ * negative/overflow. time_diff is only used for internal scheduler
-+ * time_slice accounting.
-+ */
-+ if (time_diff <= 0)
-+ time_diff = JIFFIES_TO_NS(1) / 2;
-+ else if (time_diff > JIFFIES_TO_NS(1))
-+ time_diff = JIFFIES_TO_NS(1);
-+
-+ if (unlikely(account_ns < 0))
-+ account_ns = 0;
-+
-+ account_pc = NS_TO_PC(account_ns);
-+
-+ if (tick) {
-+ int user_tick = user_mode(get_irq_regs());
-+
-+ /* Accurate tick timekeeping */
-+ if (user_tick)
-+ pc_user_time(rq, p, account_pc, account_ns);
-+ else if (p != idle || (irq_count() != HARDIRQ_OFFSET))
-+ pc_system_time(rq, p, HARDIRQ_OFFSET,
-+ account_pc, account_ns);
-+ else
-+ pc_idle_time(rq, account_pc);
-+ } else {
-+ /* Accurate subtick timekeeping */
-+ if (p == idle)
-+ pc_idle_time(rq, account_pc);
-+ else
-+ pc_user_time(rq, p, account_pc, account_ns);
-+ }
-+
-+ /* time_slice accounting is done in usecs to avoid overflow on 32bit */
-+ if (rq->rq_policy != SCHED_FIFO && p != idle)
-+ rq->rq_time_slice -= time_diff / 1000;
-+ p->last_ran = rq->timekeep_clock = rq->clock;
-+}
-+
-+/*
-+ * Return any ns on the sched_clock that have not yet been accounted in
-+ * @p in case that task is currently running.
-+ *
-+ * Called with task_grq_lock() held on @rq.
-+ */
-+static u64 do_task_delta_exec(struct task_struct *p, struct rq *rq)
-+{
-+ u64 ns = 0;
-+
-+ if (p == rq->curr) {
-+ update_rq_clock(rq);
-+ ns = rq->clock - p->last_ran;
-+ if ((s64)ns < 0)
-+ ns = 0;
-+ }
-+
-+ return ns;
-+}
-+
-+unsigned long long task_delta_exec(struct task_struct *p)
-+{
-+ unsigned long flags;
-+ struct rq *rq;
-+ u64 ns = 0;
-+
-+ rq = task_grq_lock(p, &flags);
-+ ns = do_task_delta_exec(p, rq);
-+ task_grq_unlock(&flags);
-+
-+ return ns;
-+}
-+
-+/*
-+ * Return accounted runtime for the task.
-+ * In case the task is currently running, return the runtime plus current's
-+ * pending runtime that have not been accounted yet.
-+ */
-+unsigned long long task_sched_runtime(struct task_struct *p)
-+{
-+ unsigned long flags;
-+ struct rq *rq;
-+ u64 ns = 0;
-+
-+ rq = task_grq_lock(p, &flags);
-+ ns = p->se.sum_exec_runtime + do_task_delta_exec(p, rq);
-+ task_grq_unlock(&flags);
-+
-+ return ns;
-+}
-+
-+/*
-+ * Return sum_exec_runtime for the thread group.
-+ * In case the task is currently running, return the sum plus current's
-+ * pending runtime that have not been accounted yet.
-+ *
-+ * Note that the thread group might have other running tasks as well,
-+ * so the return value not includes other pending runtime that other
-+ * running tasks might have.
-+ */
-+unsigned long long thread_group_sched_runtime(struct task_struct *p)
-+{
-+ struct task_cputime totals;
-+ unsigned long flags;
-+ struct rq *rq;
-+ u64 ns;
-+
-+ rq = task_grq_lock(p, &flags);
-+ thread_group_cputime(p, &totals);
-+ ns = totals.sum_exec_runtime + do_task_delta_exec(p, rq);
-+ task_grq_unlock(&flags);
-+
-+ return ns;
-+}
-+
-+/* Compatibility crap for removal */
-+void account_user_time(struct task_struct *p, cputime_t cputime,
-+ cputime_t cputime_scaled)
-+{
-+}
-+
-+void account_idle_time(cputime_t cputime)
-+{
-+}
-+
-+/*
-+ * Account guest cpu time to a process.
-+ * @p: the process that the cpu time gets accounted to
-+ * @cputime: the cpu time spent in virtual machine since the last update
-+ * @cputime_scaled: cputime scaled by cpu frequency
-+ */
-+static void account_guest_time(struct task_struct *p, cputime_t cputime,
-+ cputime_t cputime_scaled)
-+{
-+ cputime64_t tmp;
-+ struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
-+
-+ tmp = cputime_to_cputime64(cputime);
-+
-+ /* Add guest time to process. */
-+ p->utime = cputime_add(p->utime, cputime);
-+ p->utimescaled = cputime_add(p->utimescaled, cputime_scaled);
-+ account_group_user_time(p, cputime);
-+ p->gtime = cputime_add(p->gtime, cputime);
-+
-+ /* Add guest time to cpustat. */
-+ cpustat->user = cputime64_add(cpustat->user, tmp);
-+ cpustat->guest = cputime64_add(cpustat->guest, tmp);
-+}
-+
-+/*
-+ * Account system cpu time to a process.
-+ * @p: the process that the cpu time gets accounted to
-+ * @hardirq_offset: the offset to subtract from hardirq_count()
-+ * @cputime: the cpu time spent in kernel space since the last update
-+ * @cputime_scaled: cputime scaled by cpu frequency
-+ * This is for guest only now.
-+ */
-+void account_system_time(struct task_struct *p, int hardirq_offset,
-+ cputime_t cputime, cputime_t cputime_scaled)
-+{
-+
-+ if ((p->flags & PF_VCPU) && (irq_count() - hardirq_offset == 0))
-+ account_guest_time(p, cputime, cputime_scaled);
-+}
-+
-+/*
-+ * Account for involuntary wait time.
-+ * @steal: the cpu time spent in involuntary wait
-+ */
-+void account_steal_time(cputime_t cputime)
-+{
-+ struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
-+ cputime64_t cputime64 = cputime_to_cputime64(cputime);
-+
-+ cpustat->steal = cputime64_add(cpustat->steal, cputime64);
-+}
-+
-+/*
-+ * Account for idle time.
-+ * @cputime: the cpu time spent in idle wait
-+ */
-+static void account_idle_times(cputime_t cputime)
-+{
-+ struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
-+ cputime64_t cputime64 = cputime_to_cputime64(cputime);
-+ struct rq *rq = this_rq();
-+
-+ if (atomic_read(&rq->nr_iowait) > 0)
-+ cpustat->iowait = cputime64_add(cpustat->iowait, cputime64);
-+ else
-+ cpustat->idle = cputime64_add(cpustat->idle, cputime64);
-+}
-+
-+#ifndef CONFIG_VIRT_CPU_ACCOUNTING
-+
-+void account_process_tick(struct task_struct *p, int user_tick)
-+{
-+}
-+
-+/*
-+ * Account multiple ticks of steal time.
-+ * @p: the process from which the cpu time has been stolen
-+ * @ticks: number of stolen ticks
-+ */
-+void account_steal_ticks(unsigned long ticks)
-+{
-+ account_steal_time(jiffies_to_cputime(ticks));
-+}
-+
-+/*
-+ * Account multiple ticks of idle time.
-+ * @ticks: number of stolen ticks
-+ */
-+void account_idle_ticks(unsigned long ticks)
-+{
-+ account_idle_times(jiffies_to_cputime(ticks));
-+}
-+#endif
-+
-+/*
-+ * Functions to test for when SCHED_ISO tasks have used their allocated
-+ * quota as real time scheduling and convert them back to SCHED_NORMAL.
-+ * Where possible, the data is tested lockless, to avoid grabbing grq_lock
-+ * because the occasional inaccurate result won't matter. However the
-+ * data is only ever modified under lock.
-+ */
-+static void set_iso_refractory(void)
-+{
-+ grq_lock();
-+ grq.iso_refractory = 1;
-+ grq_unlock();
-+}
-+
-+static void clear_iso_refractory(void)
-+{
-+ grq_lock();
-+ grq.iso_refractory = 0;
-+ grq_unlock();
-+}
-+
-+/*
-+ * Test if SCHED_ISO tasks have run longer than their alloted period as RT
-+ * tasks and set the refractory flag if necessary. There is 10% hysteresis
-+ * for unsetting the flag.
-+ */
-+static unsigned int test_ret_isorefractory(struct rq *rq)
-+{
-+ if (likely(!grq.iso_refractory)) {
-+ if (grq.iso_ticks / ISO_PERIOD > sched_iso_cpu)
-+ set_iso_refractory();
-+ } else {
-+ if (grq.iso_ticks / ISO_PERIOD < (sched_iso_cpu * 90 / 100))
-+ clear_iso_refractory();
-+ }
-+ return grq.iso_refractory;
-+}
-+
-+static void iso_tick(void)
-+{
-+ grq_lock();
-+ grq.iso_ticks += 100;
-+ grq_unlock();
-+}
-+
-+/* No SCHED_ISO task was running so decrease rq->iso_ticks */
-+static inline void no_iso_tick(void)
-+{
-+ if (grq.iso_ticks) {
-+ grq_lock();
-+ grq.iso_ticks = grq.iso_ticks * (ISO_PERIOD - 1) / ISO_PERIOD;
-+ grq_unlock();
-+ }
-+}
-+
-+static int rq_running_iso(struct rq *rq)
-+{
-+ return rq->rq_prio == ISO_PRIO;
-+}
-+
-+/* This manages tasks that have run out of timeslice during a scheduler_tick */
-+static void task_running_tick(struct rq *rq)
-+{
-+ struct task_struct *p;
-+
-+ /*
-+ * If a SCHED_ISO task is running we increment the iso_ticks. In
-+ * order to prevent SCHED_ISO tasks from causing starvation in the
-+ * presence of true RT tasks we account those as iso_ticks as well.
-+ */
-+ if ((rt_queue(rq) || (iso_queue(rq) && !grq.iso_refractory))) {
-+ if (grq.iso_ticks <= (ISO_PERIOD * 100) - 100)
-+ iso_tick();
-+ } else
-+ no_iso_tick();
-+
-+ if (iso_queue(rq)) {
-+ if (unlikely(test_ret_isorefractory(rq))) {
-+ if (rq_running_iso(rq)) {
-+ /*
-+ * SCHED_ISO task is running as RT and limit
-+ * has been hit. Force it to reschedule as
-+ * SCHED_NORMAL by zeroing its time_slice
-+ */
-+ rq->rq_time_slice = 0;
-+ }
-+ }
-+ }
-+
-+ /* SCHED_FIFO tasks never run out of timeslice. */
-+ if (rq_idle(rq) || rq->rq_time_slice > 0 || rq->rq_policy == SCHED_FIFO)
-+ return;
-+
-+ /* p->rt.time_slice <= 0. We only modify task_struct under grq lock */
-+ grq_lock();
-+ p = rq->curr;
-+ if (likely(task_running(p))) {
-+ requeue_task(p);
-+ set_tsk_need_resched(p);
-+ }
-+ grq_unlock();
-+}
-+
-+void wake_up_idle_cpu(int cpu);
-+
-+/*
-+ * This function gets called by the timer code, with HZ frequency.
-+ * We call it with interrupts disabled. The data modified is all
-+ * local to struct rq so we don't need to grab grq lock.
-+ */
-+void scheduler_tick(void)
-+{
-+ int cpu = smp_processor_id();
-+ struct rq *rq = cpu_rq(cpu);
-+
-+ sched_clock_tick();
-+ update_rq_clock(rq);
-+ update_cpu_clock(rq, rq->curr, 1);
-+ if (!rq_idle(rq))
-+ task_running_tick(rq);
-+ else {
-+ no_iso_tick();
-+ if (unlikely(queued_notrunning()))
-+ set_tsk_need_resched(rq->idle);
-+ }
-+}
-+
-+notrace unsigned long get_parent_ip(unsigned long addr)
-+{
-+ if (in_lock_functions(addr)) {
-+ addr = CALLER_ADDR2;
-+ if (in_lock_functions(addr))
-+ addr = CALLER_ADDR3;
-+ }
-+ return addr;
-+}
-+
-+#if defined(CONFIG_PREEMPT) && (defined(CONFIG_DEBUG_PREEMPT) || \
-+ defined(CONFIG_PREEMPT_TRACER))
-+void __kprobes add_preempt_count(int val)
-+{
-+#ifdef CONFIG_DEBUG_PREEMPT
-+ /*
-+ * Underflow?
-+ */
-+ if (DEBUG_LOCKS_WARN_ON((preempt_count() < 0)))
-+ return;
-+#endif
-+ preempt_count() += val;
-+#ifdef CONFIG_DEBUG_PREEMPT
-+ /*
-+ * Spinlock count overflowing soon?
-+ */
-+ DEBUG_LOCKS_WARN_ON((preempt_count() & PREEMPT_MASK) >=
-+ PREEMPT_MASK - 10);
-+#endif
-+ if (preempt_count() == val)
-+ trace_preempt_off(CALLER_ADDR0, get_parent_ip(CALLER_ADDR1));
-+}
-+EXPORT_SYMBOL(add_preempt_count);
-+
-+void __kprobes sub_preempt_count(int val)
-+{
-+#ifdef CONFIG_DEBUG_PREEMPT
-+ /*
-+ * Underflow?
-+ */
-+ if (DEBUG_LOCKS_WARN_ON(val > preempt_count()))
-+ return;
-+ /*
-+ * Is the spinlock portion underflowing?
-+ */
-+ if (DEBUG_LOCKS_WARN_ON((val < PREEMPT_MASK) &&
-+ !(preempt_count() & PREEMPT_MASK)))
-+ return;
-+#endif
-+
-+ if (preempt_count() == val)
-+ trace_preempt_on(CALLER_ADDR0, get_parent_ip(CALLER_ADDR1));
-+ preempt_count() -= val;
-+}
-+EXPORT_SYMBOL(sub_preempt_count);
-+#endif
-+
-+/*
-+ * Deadline is "now" in jiffies + (offset by priority). Setting the deadline
-+ * is the key to everything. It distributes cpu fairly amongst tasks of the
-+ * same nice value, it proportions cpu according to nice level, it means the
-+ * task that last woke up the longest ago has the earliest deadline, thus
-+ * ensuring that interactive tasks get low latency on wake up.
-+ */
-+static inline int prio_deadline_diff(struct task_struct *p)
-+{
-+ return (pratio(p) * rr_interval * HZ / 1000 / 100) ? : 1;
-+}
-+
-+static inline int longest_deadline(void)
-+{
-+ return (prio_ratios[39] * rr_interval * HZ / 1000 / 100);
-+}
-+
-+/*
-+ * SCHED_IDLE tasks still have a deadline set, but offset by to nice +19.
-+ * This allows nice levels to work between IDLEPRIO tasks and gives a
-+ * deadline longer than nice +19 for when they're scheduled as SCHED_NORMAL
-+ * tasks.
-+ */
-+static inline void time_slice_expired(struct task_struct *p)
-+{
-+ reset_first_time_slice(p);
-+ p->rt.time_slice = timeslice();
-+ p->deadline = jiffies + prio_deadline_diff(p);
-+ if (idleprio_task(p))
-+ p->deadline += longest_deadline();
-+}
-+
-+static inline void check_deadline(struct task_struct *p)
-+{
-+ if (p->rt.time_slice <= 0)
-+ time_slice_expired(p);
-+}
-+
-+/*
-+ * O(n) lookup of all tasks in the global runqueue. The real brainfuck
-+ * of lock contention and O(n). It's not really O(n) as only the queued,
-+ * but not running tasks are scanned, and is O(n) queued in the worst case
-+ * scenario only because the right task can be found before scanning all of
-+ * them.
-+ * Tasks are selected in this order:
-+ * Real time tasks are selected purely by their static priority and in the
-+ * order they were queued, so the lowest value idx, and the first queued task
-+ * of that priority value is chosen.
-+ * If no real time tasks are found, the SCHED_ISO priority is checked, and
-+ * all SCHED_ISO tasks have the same priority value, so they're selected by
-+ * the earliest deadline value.
-+ * If no SCHED_ISO tasks are found, SCHED_NORMAL tasks are selected by the
-+ * earliest deadline.
-+ * Finally if no SCHED_NORMAL tasks are found, SCHED_IDLEPRIO tasks are
-+ * selected by the earliest deadline.
-+ */
-+static inline struct
-+task_struct *earliest_deadline_task(struct rq *rq, struct task_struct *idle)
-+{
-+ unsigned long dl, earliest_deadline = 0; /* Initialise to silence compiler */
-+ struct task_struct *p, *edt;
-+ unsigned int cpu = rq->cpu;
-+ struct list_head *queue;
-+ int idx = 0;
-+
-+ edt = idle;
-+retry:
-+ idx = find_next_bit(grq.prio_bitmap, PRIO_LIMIT, idx);
-+ if (idx >= PRIO_LIMIT)
-+ goto out;
-+ queue = &grq.queue[idx];
-+ list_for_each_entry(p, queue, rt.run_list) {
-+ /* Make sure cpu affinity is ok */
-+ if (!cpu_isset(cpu, p->cpus_allowed))
-+ continue;
-+ if (idx < MAX_RT_PRIO) {
-+ /* We found an rt task */
-+ edt = p;
-+ goto out_take;
-+ }
-+
-+ /*
-+ * No rt task, select the earliest deadline task now.
-+ * On the 1st run the 2nd condition is never used, so
-+ * there is no need to initialise earliest_deadline
-+ * before. Normalise all old deadlines to now.
-+ */
-+ if (time_before(p->deadline, jiffies))
-+ dl = jiffies;
-+ else
-+ dl = p->deadline;
-+
-+ if (edt == idle ||
-+ time_before(dl, earliest_deadline)) {
-+ earliest_deadline = dl;
-+ edt = p;
-+ }
-+ }
-+ if (edt == idle) {
-+ if (++idx < PRIO_LIMIT)
-+ goto retry;
-+ goto out;
-+ }
-+out_take:
-+ take_task(rq, edt);
-+out:
-+ return edt;
-+}
-+
-+#ifdef CONFIG_SMP
-+static inline void set_cpuidle_map(unsigned long cpu)
-+{
-+ cpu_set(cpu, grq.cpu_idle_map);
-+}
-+
-+static inline void clear_cpuidle_map(unsigned long cpu)
-+{
-+ cpu_clear(cpu, grq.cpu_idle_map);
-+}
-+
-+#else /* CONFIG_SMP */
-+static inline void set_cpuidle_map(unsigned long cpu)
-+{
-+}
-+
-+static inline void clear_cpuidle_map(unsigned long cpu)
-+{
-+}
-+#endif /* !CONFIG_SMP */
-+
-+/*
-+ * Print scheduling while atomic bug:
-+ */
-+static noinline void __schedule_bug(struct task_struct *prev)
-+{
-+ struct pt_regs *regs = get_irq_regs();
-+
-+ printk(KERN_ERR "BUG: scheduling while atomic: %s/%d/0x%08x\n",
-+ prev->comm, prev->pid, preempt_count());
-+
-+ debug_show_held_locks(prev);
-+ print_modules();
-+ if (irqs_disabled())
-+ print_irqtrace_events(prev);
-+
-+ if (regs)
-+ show_regs(regs);
-+ else
-+ dump_stack();
-+}
-+
-+/*
-+ * Various schedule()-time debugging checks and statistics:
-+ */
-+static inline void schedule_debug(struct task_struct *prev)
-+{
-+ /*
-+ * Test if we are atomic. Since do_exit() needs to call into
-+ * schedule() atomically, we ignore that path for now.
-+ * Otherwise, whine if we are scheduling when we should not be.
-+ */
-+ if (unlikely(in_atomic_preempt_off() && !prev->exit_state))
-+ __schedule_bug(prev);
-+
-+ profile_hit(SCHED_PROFILING, __builtin_return_address(0));
-+
-+ schedstat_inc(this_rq(), sched_count);
-+#ifdef CONFIG_SCHEDSTATS
-+ if (unlikely(prev->lock_depth >= 0)) {
-+ schedstat_inc(this_rq(), bkl_count);
-+ schedstat_inc(prev, sched_info.bkl_count);
-+ }
-+#endif
-+}
-+
-+/*
-+ * schedule() is the main scheduler function.
-+ */
-+asmlinkage void __sched __schedule(void)
-+{
-+ struct task_struct *prev, *next, *idle;
-+ int deactivate = 0, cpu;
-+ long *switch_count;
-+ struct rq *rq;
-+ u64 now;
-+
-+ cpu = smp_processor_id();
-+ rq = this_rq();
-+ rcu_qsctr_inc(cpu);
-+ prev = rq->curr;
-+ switch_count = &prev->nivcsw;
-+
-+ release_kernel_lock(prev);
-+need_resched_nonpreemptible:
-+
-+ schedule_debug(prev);
-+ idle = rq->idle;
-+ /*
-+ * The idle thread is not allowed to schedule!
-+ * Remove this check after it has been exercised a bit.
-+ */
-+ if (unlikely(prev == idle) && prev->state != TASK_RUNNING) {
-+ printk(KERN_ERR "bad: scheduling from the idle thread!\n");
-+ dump_stack();
-+ }
-+
-+ grq_lock_irq();
-+ update_rq_clock(rq);
-+ now = rq->clock;
-+ update_cpu_clock(rq, prev, 0);
-+
-+ clear_tsk_need_resched(prev);
-+
-+ if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
-+ if (unlikely(signal_pending_state(prev->state, prev)))
-+ prev->state = TASK_RUNNING;
-+ else
-+ deactivate = 1;
-+ switch_count = &prev->nvcsw;
-+ }
-+
-+ if (prev != idle) {
-+ /* Update all the information stored on struct rq */
-+ prev->rt.time_slice = rq->rq_time_slice;
-+ prev->deadline = rq->rq_deadline;
-+ check_deadline(prev);
-+ return_task(prev, deactivate);
-+ }
-+
-+ if (likely(queued_notrunning())) {
-+ next = earliest_deadline_task(rq, idle);
-+ } else {
-+ next = idle;
-+ schedstat_inc(rq, sched_goidle);
-+ }
-+
-+ if (next == rq->idle)
-+ set_cpuidle_map(cpu);
-+ else
-+ clear_cpuidle_map(cpu);
-+
-+ prefetch(next);
-+ prefetch_stack(next);
-+
-+ prev->timestamp = prev->last_ran = now;
-+
-+ if (likely(prev != next)) {
-+ rq->rq_time_slice = next->rt.time_slice;
-+ rq->rq_deadline = next->deadline;
-+ rq->rq_prio = next->prio;
-+
-+ sched_info_switch(prev, next);
-+ grq.nr_switches++;
-+ next->oncpu = 1;
-+ prev->oncpu = 0;
-+ rq->curr = next;
-+ ++*switch_count;
-+
-+ context_switch(rq, prev, next); /* unlocks the rq */
-+ /*
-+ * the context switch might have flipped the stack from under
-+ * us, hence refresh the local variables.
-+ */
-+ cpu = smp_processor_id();
-+ rq = cpu_rq(cpu);
-+ } else
-+ grq_unlock_irq();
-+
-+ if (unlikely(reacquire_kernel_lock(current) < 0))
-+ goto need_resched_nonpreemptible;
-+}
-+
-+asmlinkage void __sched schedule(void)
-+{
-+need_resched:
-+ preempt_disable();
-+ __schedule();
-+ preempt_enable_no_resched();
-+ if (unlikely(test_thread_flag(TIF_NEED_RESCHED)))
-+ goto need_resched;
-+}
-+EXPORT_SYMBOL(schedule);
-+
-+#ifdef CONFIG_SMP
-+int mutex_spin_on_owner(struct mutex *lock, struct thread_info *owner)
-+{
-+ return 0;
-+}
-+#endif
-+
-+#ifdef CONFIG_PREEMPT
-+/*
-+ * this is the entry point to schedule() from in-kernel preemption
-+ * off of preempt_enable. Kernel preemptions off return from interrupt
-+ * occur there and call schedule directly.
-+ */
-+asmlinkage void __sched preempt_schedule(void)
-+{
-+ struct thread_info *ti = current_thread_info();
-+
-+ /*
-+ * If there is a non-zero preempt_count or interrupts are disabled,
-+ * we do not want to preempt the current task. Just return..
-+ */
-+ if (likely(ti->preempt_count || irqs_disabled()))
-+ return;
-+
-+ do {
-+ add_preempt_count(PREEMPT_ACTIVE);
-+ schedule();
-+ sub_preempt_count(PREEMPT_ACTIVE);
-+
-+ /*
-+ * Check again in case we missed a preemption opportunity
-+ * between schedule and now.
-+ */
-+ barrier();
-+ } while (need_resched());
-+}
-+EXPORT_SYMBOL(preempt_schedule);
-+
-+/*
-+ * this is the entry point to schedule() from kernel preemption
-+ * off of irq context.
-+ * Note, that this is called and return with irqs disabled. This will
-+ * protect us against recursive calling from irq.
-+ */
-+asmlinkage void __sched preempt_schedule_irq(void)
-+{
-+ struct thread_info *ti = current_thread_info();
-+
-+ /* Catch callers which need to be fixed */
-+ BUG_ON(ti->preempt_count || !irqs_disabled());
-+
-+ do {
-+ add_preempt_count(PREEMPT_ACTIVE);
-+ local_irq_enable();
-+ schedule();
-+ local_irq_disable();
-+ sub_preempt_count(PREEMPT_ACTIVE);
-+
-+ /*
-+ * Check again in case we missed a preemption opportunity
-+ * between schedule and now.
-+ */
-+ barrier();
-+ } while (need_resched());
-+}
-+
-+#endif /* CONFIG_PREEMPT */
-+
-+int default_wake_function(wait_queue_t *curr, unsigned mode, int sync,
-+ void *key)
-+{
-+ return try_to_wake_up(curr->private, mode, sync);
-+}
-+EXPORT_SYMBOL(default_wake_function);
-+
-+/*
-+ * The core wakeup function. Non-exclusive wakeups (nr_exclusive == 0) just
-+ * wake everything up. If it's an exclusive wakeup (nr_exclusive == small +ve
-+ * number) then we wake all the non-exclusive tasks and one exclusive task.
-+ *
-+ * There are circumstances in which we can try to wake a task which has already
-+ * 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)
-+{
-+ struct list_head *tmp, *next;
-+
-+ list_for_each_safe(tmp, next, &q->task_list) {
-+ wait_queue_t *curr = list_entry(tmp, wait_queue_t, task_list);
-+ unsigned flags = curr->flags;
-+
-+ if (curr->func(curr, mode, sync, key) &&
-+ (flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive)
-+ break;
-+ }
-+}
-+
-+/**
-+ * __wake_up - wake up threads blocked on a waitqueue.
-+ * @q: the waitqueue
-+ * @mode: which threads
-+ * @nr_exclusive: how many wake-one or wake-many threads to wake up
-+ * @key: is directly passed to the wakeup function
-+ *
-+ * It may be assumed that this function implies a write memory barrier before
-+ * changing the task state if and only if any tasks are woken up.
-+ */
-+void __wake_up(wait_queue_head_t *q, unsigned int mode,
-+ int nr_exclusive, void *key)
-+{
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&q->lock, flags);
-+ __wake_up_common(q, mode, nr_exclusive, 0, key);
-+ spin_unlock_irqrestore(&q->lock, flags);
-+}
-+EXPORT_SYMBOL(__wake_up);
-+
-+/*
-+ * Same as __wake_up but called with the spinlock in wait_queue_head_t held.
-+ */
-+void __wake_up_locked(wait_queue_head_t *q, unsigned int mode)
-+{
-+ __wake_up_common(q, mode, 1, 0, NULL);
-+}
-+
-+void __wake_up_locked_key(wait_queue_head_t *q, unsigned int mode, void *key)
-+{
-+ __wake_up_common(q, mode, 1, 0, key);
-+}
-+
-+/**
-+ * __wake_up_sync_key - wake up threads blocked on a waitqueue.
-+ * @q: the waitqueue
-+ * @mode: which threads
-+ * @nr_exclusive: how many wake-one or wake-many threads to wake up
-+ * @key: opaque value to be passed to wakeup targets
-+ *
-+ * The sync wakeup differs that the waker knows that it will schedule
-+ * away soon, so while the target thread will be woken up, it will not
-+ * be migrated to another CPU - ie. the two threads are 'synchronized'
-+ * with each other. This can prevent needless bouncing between CPUs.
-+ *
-+ * On UP it can prevent extra preemption.
-+ *
-+ * It may be assumed that this function implies a write memory barrier before
-+ * changing the task state if and only if any tasks are woken up.
-+ */
-+void __wake_up_sync_key(wait_queue_head_t *q, unsigned int mode,
-+ int nr_exclusive, void *key)
-+{
-+ unsigned long flags;
-+ int sync = 1;
-+
-+ if (unlikely(!q))
-+ return;
-+
-+ if (unlikely(!nr_exclusive))
-+ sync = 0;
-+
-+ spin_lock_irqsave(&q->lock, flags);
-+ __wake_up_common(q, mode, nr_exclusive, sync, key);
-+ spin_unlock_irqrestore(&q->lock, flags);
-+}
-+EXPORT_SYMBOL_GPL(__wake_up_sync_key);
-+
-+/**
-+ * __wake_up_sync - wake up threads blocked on a waitqueue.
-+ * @q: the waitqueue
-+ * @mode: which threads
-+ * @nr_exclusive: how many wake-one or wake-many threads to wake up
-+ *
-+ * The sync wakeup differs that the waker knows that it will schedule
-+ * away soon, so while the target thread will be woken up, it will not
-+ * be migrated to another CPU - ie. the two threads are 'synchronized'
-+ * with each other. This can prevent needless bouncing between CPUs.
-+ *
-+ * On UP it can prevent extra preemption.
-+ */
-+void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive)
-+{
-+ unsigned long flags;
-+ int sync = 1;
-+
-+ if (unlikely(!q))
-+ return;
-+
-+ if (unlikely(!nr_exclusive))
-+ sync = 0;
-+
-+ spin_lock_irqsave(&q->lock, flags);
-+ __wake_up_common(q, mode, nr_exclusive, sync, NULL);
-+ spin_unlock_irqrestore(&q->lock, flags);
-+}
-+EXPORT_SYMBOL_GPL(__wake_up_sync); /* For internal use only */
-+
-+/**
-+ * complete: - signals a single thread waiting on this completion
-+ * @x: holds the state of this particular completion
-+ *
-+ * This will wake up a single thread waiting on this completion. Threads will be
-+ * awakened in the same order in which they were queued.
-+ *
-+ * See also complete_all(), wait_for_completion() and related routines.
-+ *
-+ * It may be assumed that this function implies a write memory barrier before
-+ * changing the task state if and only if any tasks are woken up.
-+ */
-+void complete(struct completion *x)
-+{
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&x->wait.lock, flags);
-+ x->done++;
-+ __wake_up_common(&x->wait, TASK_NORMAL, 1, 0, NULL);
-+ spin_unlock_irqrestore(&x->wait.lock, flags);
-+}
-+EXPORT_SYMBOL(complete);
-+
-+/**
-+ * complete_all: - signals all threads waiting on this completion
-+ * @x: holds the state of this particular completion
-+ *
-+ * This will wake up all threads waiting on this particular completion event.
-+ *
-+ * It may be assumed that this function implies a write memory barrier before
-+ * changing the task state if and only if any tasks are woken up.
-+ */
-+void complete_all(struct completion *x)
-+{
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&x->wait.lock, flags);
-+ x->done += UINT_MAX/2;
-+ __wake_up_common(&x->wait, TASK_NORMAL, 0, 0, NULL);
-+ spin_unlock_irqrestore(&x->wait.lock, flags);
-+}
-+EXPORT_SYMBOL(complete_all);
-+
-+static inline long __sched
-+do_wait_for_common(struct completion *x, long timeout, int state)
-+{
-+ if (!x->done) {
-+ DECLARE_WAITQUEUE(wait, current);
-+
-+ wait.flags |= WQ_FLAG_EXCLUSIVE;
-+ __add_wait_queue_tail(&x->wait, &wait);
-+ do {
-+ if (signal_pending_state(state, current)) {
-+ timeout = -ERESTARTSYS;
-+ break;
-+ }
-+ __set_current_state(state);
-+ spin_unlock_irq(&x->wait.lock);
-+ timeout = schedule_timeout(timeout);
-+ spin_lock_irq(&x->wait.lock);
-+ } while (!x->done && timeout);
-+ __remove_wait_queue(&x->wait, &wait);
-+ if (!x->done)
-+ return timeout;
-+ }
-+ x->done--;
-+ return timeout ?: 1;
-+}
-+
-+static long __sched
-+wait_for_common(struct completion *x, long timeout, int state)
-+{
-+ might_sleep();
-+
-+ spin_lock_irq(&x->wait.lock);
-+ timeout = do_wait_for_common(x, timeout, state);
-+ spin_unlock_irq(&x->wait.lock);
-+ return timeout;
-+}
-+
-+/**
-+ * wait_for_completion: - waits for completion of a task
-+ * @x: holds the state of this particular completion
-+ *
-+ * This waits to be signaled for completion of a specific task. It is NOT
-+ * interruptible and there is no timeout.
-+ *
-+ * See also similar routines (i.e. wait_for_completion_timeout()) with timeout
-+ * and interrupt capability. Also see complete().
-+ */
-+void __sched wait_for_completion(struct completion *x)
-+{
-+ wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_UNINTERRUPTIBLE);
-+}
-+EXPORT_SYMBOL(wait_for_completion);
-+
-+/**
-+ * wait_for_completion_timeout: - waits for completion of a task (w/timeout)
-+ * @x: holds the state of this particular completion
-+ * @timeout: timeout value in jiffies
-+ *
-+ * This waits for either a completion of a specific task to be signaled or for a
-+ * specified timeout to expire. The timeout is in jiffies. It is not
-+ * interruptible.
-+ */
-+unsigned long __sched
-+wait_for_completion_timeout(struct completion *x, unsigned long timeout)
-+{
-+ return wait_for_common(x, timeout, TASK_UNINTERRUPTIBLE);
-+}
-+EXPORT_SYMBOL(wait_for_completion_timeout);
-+
-+/**
-+ * wait_for_completion_interruptible: - waits for completion of a task (w/intr)
-+ * @x: holds the state of this particular completion
-+ *
-+ * This waits for completion of a specific task to be signaled. It is
-+ * interruptible.
-+ */
-+int __sched wait_for_completion_interruptible(struct completion *x)
-+{
-+ long t = wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_INTERRUPTIBLE);
-+ if (t == -ERESTARTSYS)
-+ return t;
-+ return 0;
-+}
-+EXPORT_SYMBOL(wait_for_completion_interruptible);
-+
-+/**
-+ * wait_for_completion_interruptible_timeout: - waits for completion (w/(to,intr))
-+ * @x: holds the state of this particular completion
-+ * @timeout: timeout value in jiffies
-+ *
-+ * This waits for either a completion of a specific task to be signaled or for a
-+ * specified timeout to expire. It is interruptible. The timeout is in jiffies.
-+ */
-+unsigned long __sched
-+wait_for_completion_interruptible_timeout(struct completion *x,
-+ unsigned long timeout)
-+{
-+ return wait_for_common(x, timeout, TASK_INTERRUPTIBLE);
-+}
-+EXPORT_SYMBOL(wait_for_completion_interruptible_timeout);
-+
-+/**
-+ * wait_for_completion_killable: - waits for completion of a task (killable)
-+ * @x: holds the state of this particular completion
-+ *
-+ * This waits to be signaled for completion of a specific task. It can be
-+ * interrupted by a kill signal.
-+ */
-+int __sched wait_for_completion_killable(struct completion *x)
-+{
-+ long t = wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_KILLABLE);
-+ if (t == -ERESTARTSYS)
-+ return t;
-+ return 0;
-+}
-+EXPORT_SYMBOL(wait_for_completion_killable);
-+
-+/**
-+ * try_wait_for_completion - try to decrement a completion without blocking
-+ * @x: completion structure
-+ *
-+ * Returns: 0 if a decrement cannot be done without blocking
-+ * 1 if a decrement succeeded.
-+ *
-+ * If a completion is being used as a counting completion,
-+ * attempt to decrement the counter without blocking. This
-+ * enables us to avoid waiting if the resource the completion
-+ * is protecting is not available.
-+ */
-+bool try_wait_for_completion(struct completion *x)
-+{
-+ int ret = 1;
-+
-+ spin_lock_irq(&x->wait.lock);
-+ if (!x->done)
-+ ret = 0;
-+ else
-+ x->done--;
-+ spin_unlock_irq(&x->wait.lock);
-+ return ret;
-+}
-+EXPORT_SYMBOL(try_wait_for_completion);
-+
-+/**
-+ * completion_done - Test to see if a completion has any waiters
-+ * @x: completion structure
-+ *
-+ * Returns: 0 if there are waiters (wait_for_completion() in progress)
-+ * 1 if there are no waiters.
-+ *
-+ */
-+bool completion_done(struct completion *x)
-+{
-+ int ret = 1;
-+
-+ spin_lock_irq(&x->wait.lock);
-+ if (!x->done)
-+ ret = 0;
-+ spin_unlock_irq(&x->wait.lock);
-+ return ret;
-+}
-+EXPORT_SYMBOL(completion_done);
-+
-+static long __sched
-+sleep_on_common(wait_queue_head_t *q, int state, long timeout)
-+{
-+ unsigned long flags;
-+ wait_queue_t wait;
-+
-+ init_waitqueue_entry(&wait, current);
-+
-+ __set_current_state(state);
-+
-+ spin_lock_irqsave(&q->lock, flags);
-+ __add_wait_queue(q, &wait);
-+ spin_unlock(&q->lock);
-+ timeout = schedule_timeout(timeout);
-+ spin_lock_irq(&q->lock);
-+ __remove_wait_queue(q, &wait);
-+ spin_unlock_irqrestore(&q->lock, flags);
-+
-+ return timeout;
-+}
-+
-+void __sched interruptible_sleep_on(wait_queue_head_t *q)
-+{
-+ sleep_on_common(q, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
-+}
-+EXPORT_SYMBOL(interruptible_sleep_on);
-+
-+long __sched
-+interruptible_sleep_on_timeout(wait_queue_head_t *q, long timeout)
-+{
-+ return sleep_on_common(q, TASK_INTERRUPTIBLE, timeout);
-+}
-+EXPORT_SYMBOL(interruptible_sleep_on_timeout);
-+
-+void __sched sleep_on(wait_queue_head_t *q)
-+{
-+ sleep_on_common(q, TASK_UNINTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
-+}
-+EXPORT_SYMBOL(sleep_on);
-+
-+long __sched sleep_on_timeout(wait_queue_head_t *q, long timeout)
-+{
-+ return sleep_on_common(q, TASK_UNINTERRUPTIBLE, timeout);
-+}
-+EXPORT_SYMBOL(sleep_on_timeout);
-+
-+#ifdef CONFIG_RT_MUTEXES
-+
-+/*
-+ * rt_mutex_setprio - set the current priority of a task
-+ * @p: task
-+ * @prio: prio value (kernel-internal form)
-+ *
-+ * This function changes the 'effective' priority of a task. It does
-+ * not touch ->normal_prio like __setscheduler().
-+ *
-+ * Used by the rt_mutex code to implement priority inheritance logic.
-+ */
-+void rt_mutex_setprio(struct task_struct *p, int prio)
-+{
-+ unsigned long flags;
-+ int queued, oldprio;
-+ struct rq *rq;
-+
-+ BUG_ON(prio < 0 || prio > MAX_PRIO);
-+
-+ rq = time_task_grq_lock(p, &flags);
-+
-+ oldprio = p->prio;
-+ queued = task_queued_only(p);
-+ if (queued)
-+ dequeue_task(p);
-+ p->prio = prio;
-+ if (task_running(p) && prio > oldprio)
-+ resched_task(p);
-+ if (queued) {
-+ enqueue_task(p);
-+ try_preempt(p);
-+ }
-+
-+ task_grq_unlock(&flags);
-+}
-+
-+#endif
-+
-+/*
-+ * Adjust the deadline for when the priority is to change, before it's
-+ * changed.
-+ */
-+static void adjust_deadline(struct task_struct *p, int new_prio)
-+{
-+ p->deadline += (prio_ratios[USER_PRIO(new_prio)] - pratio(p)) *
-+ rr_interval * HZ / 1000 / 100;
-+}
-+
-+void set_user_nice(struct task_struct *p, long nice)
-+{
-+ int queued, new_static;
-+ unsigned long flags;
-+ struct rq *rq;
-+
-+ if (TASK_NICE(p) == nice || nice < -20 || nice > 19)
-+ return;
-+ new_static = NICE_TO_PRIO(nice);
-+ /*
-+ * We have to be careful, if called from sys_setpriority(),
-+ * the task might be in the middle of scheduling on another CPU.
-+ */
-+ rq = time_task_grq_lock(p, &flags);
-+ /*
-+ * The RT priorities are set via sched_setscheduler(), but we still
-+ * allow the 'normal' nice value to be set - but as expected
-+ * it wont have any effect on scheduling until the task is
-+ * not SCHED_NORMAL/SCHED_BATCH:
-+ */
-+ if (has_rt_policy(p)) {
-+ p->static_prio = new_static;
-+ goto out_unlock;
-+ }
-+ queued = task_queued_only(p);
-+ /*
-+ * If p is actually running, we don't need to do anything when
-+ * changing the priority because the grq is unaffected.
-+ */
-+ if (queued)
-+ dequeue_task(p);
-+
-+ adjust_deadline(p, new_static);
-+ p->static_prio = new_static;
-+ p->prio = effective_prio(p);
-+
-+ if (queued) {
-+ enqueue_task(p);
-+ try_preempt(p);
-+ }
-+
-+ /* Just resched the task, schedule() will know what to do. */
-+ if (task_running(p))
-+ resched_task(p);
-+out_unlock:
-+ task_grq_unlock(&flags);
-+}
-+EXPORT_SYMBOL(set_user_nice);
-+
-+/*
-+ * can_nice - check if a task can reduce its nice value
-+ * @p: task
-+ * @nice: nice value
-+ */
-+int can_nice(const struct task_struct *p, const int nice)
-+{
-+ /* convert nice value [19,-20] to rlimit style value [1,40] */
-+ int nice_rlim = 20 - nice;
-+
-+ return (nice_rlim <= p->signal->rlim[RLIMIT_NICE].rlim_cur ||
-+ capable(CAP_SYS_NICE));
-+}
-+
-+#ifdef __ARCH_WANT_SYS_NICE
-+
-+/*
-+ * sys_nice - change the priority of the current process.
-+ * @increment: priority increment
-+ *
-+ * sys_setpriority is a more generic, but much slower function that
-+ * does similar things.
-+ */
-+SYSCALL_DEFINE1(nice, int, increment)
-+{
-+ long nice, retval;
-+
-+ /*
-+ * Setpriority might change our priority at the same moment.
-+ * We don't have to worry. Conceptually one call occurs first
-+ * and we have a single winner.
-+ */
-+ if (increment < -40)
-+ increment = -40;
-+ if (increment > 40)
-+ increment = 40;
-+
-+ nice = TASK_NICE(current) + increment;
-+ if (nice < -20)
-+ nice = -20;
-+ if (nice > 19)
-+ nice = 19;
-+
-+ if (increment < 0 && !can_nice(current, nice))
-+ return -EPERM;
-+
-+ retval = security_task_setnice(current, nice);
-+ if (retval)
-+ return retval;
-+
-+ set_user_nice(current, nice);
-+ return 0;
-+}
-+
-+#endif
-+
-+/**
-+ * task_prio - return the priority value of a given task.
-+ * @p: the task in question.
-+ *
-+ * This is the priority value as seen by users in /proc.
-+ * RT tasks are offset by -100. Normal tasks are centered
-+ * around 1, value goes from 0 (SCHED_ISO) up to 82 (nice +19
-+ * SCHED_IDLE).
-+ */
-+int task_prio(const struct task_struct *p)
-+{
-+ int delta, prio = p->prio - MAX_RT_PRIO;
-+
-+ /* rt tasks and iso tasks */
-+ if (prio <= 0)
-+ goto out;
-+
-+ delta = (p->deadline - jiffies) * 40 / longest_deadline();
-+ if (delta > 0 && delta <= 80)
-+ prio += delta;
-+out:
-+ return prio;
-+}
-+
-+/**
-+ * task_nice - return the nice value of a given task.
-+ * @p: the task in question.
-+ */
-+int task_nice(const struct task_struct *p)
-+{
-+ return TASK_NICE(p);
-+}
-+EXPORT_SYMBOL_GPL(task_nice);
-+
-+/**
-+ * idle_cpu - is a given cpu idle currently?
-+ * @cpu: the processor in question.
-+ */
-+int idle_cpu(int cpu)
-+{
-+ return cpu_curr(cpu) == cpu_rq(cpu)->idle;
-+}
-+
-+/**
-+ * idle_task - return the idle task for a given cpu.
-+ * @cpu: the processor in question.
-+ */
-+struct task_struct *idle_task(int cpu)
-+{
-+ return cpu_rq(cpu)->idle;
-+}
-+
-+/**
-+ * find_process_by_pid - find a process with a matching PID value.
-+ * @pid: the pid in question.
-+ */
-+static inline struct task_struct *find_process_by_pid(pid_t pid)
-+{
-+ return pid ? find_task_by_vpid(pid) : current;
-+}
-+
-+/* Actually do priority change: must hold grq lock. */
-+static void __setscheduler(struct task_struct *p, int policy, int prio)
-+{
-+ BUG_ON(task_queued_only(p));
-+
-+ p->policy = policy;
-+ p->rt_priority = prio;
-+ p->normal_prio = normal_prio(p);
-+ /* we are holding p->pi_lock already */
-+ p->prio = rt_mutex_getprio(p);
-+ /*
-+ * Reschedule if running. schedule() will know if it can continue
-+ * running or not.
-+ */
-+ if (task_running(p))
-+ resched_task(p);
-+}
-+
-+/*
-+ * check the target process has a UID that matches the current process's
-+ */
-+static bool check_same_owner(struct task_struct *p)
-+{
-+ const struct cred *cred = current_cred(), *pcred;
-+ bool match;
-+
-+ rcu_read_lock();
-+ pcred = __task_cred(p);
-+ match = (cred->euid == pcred->euid ||
-+ cred->euid == pcred->uid);
-+ rcu_read_unlock();
-+ return match;
-+}
-+
-+static int __sched_setscheduler(struct task_struct *p, int policy,
-+ struct sched_param *param, bool user)
-+{
-+ struct sched_param zero_param = { .sched_priority = 0 };
-+ int queued, retval, oldprio, oldpolicy = -1;
-+ unsigned long flags, rlim_rtprio = 0;
-+ struct rq *rq;
-+
-+ /* may grab non-irq protected spin_locks */
-+ BUG_ON(in_interrupt());
-+
-+ if (is_rt_policy(policy) && !capable(CAP_SYS_NICE)) {
-+ unsigned long lflags;
-+
-+ if (!lock_task_sighand(p, &lflags))
-+ return -ESRCH;
-+ rlim_rtprio = p->signal->rlim[RLIMIT_RTPRIO].rlim_cur;
-+ unlock_task_sighand(p, &lflags);
-+ if (rlim_rtprio)
-+ goto recheck;
-+ /*
-+ * If the caller requested an RT policy without having the
-+ * necessary rights, we downgrade the policy to SCHED_ISO.
-+ * We also set the parameter to zero to pass the checks.
-+ */
-+ policy = SCHED_ISO;
-+ param = &zero_param;
-+ }
-+recheck:
-+ /* double check policy once rq lock held */
-+ if (policy < 0)
-+ policy = oldpolicy = p->policy;
-+ else if (!SCHED_RANGE(policy))
-+ return -EINVAL;
-+ /*
-+ * Valid priorities for SCHED_FIFO and SCHED_RR are
-+ * 1..MAX_USER_RT_PRIO-1, valid priority for SCHED_NORMAL and
-+ * SCHED_BATCH is 0.
-+ */
-+ if (param->sched_priority < 0 ||
-+ (p->mm && param->sched_priority > MAX_USER_RT_PRIO-1) ||
-+ (!p->mm && param->sched_priority > MAX_RT_PRIO-1))
-+ return -EINVAL;
-+ if (is_rt_policy(policy) != (param->sched_priority != 0))
-+ return -EINVAL;
-+
-+ /*
-+ * Allow unprivileged RT tasks to decrease priority:
-+ */
-+ if (user && !capable(CAP_SYS_NICE)) {
-+ if (is_rt_policy(policy)) {
-+ /* can't set/change the rt policy */
-+ if (policy != p->policy && !rlim_rtprio)
-+ return -EPERM;
-+
-+ /* can't increase priority */
-+ if (param->sched_priority > p->rt_priority &&
-+ param->sched_priority > rlim_rtprio)
-+ return -EPERM;
-+ } else {
-+ switch (p->policy) {
-+ /*
-+ * Can only downgrade policies but not back to
-+ * SCHED_NORMAL
-+ */
-+ case SCHED_ISO:
-+ if (policy == SCHED_ISO)
-+ goto out;
-+ if (policy == SCHED_NORMAL)
-+ return -EPERM;
-+ break;
-+ case SCHED_BATCH:
-+ if (policy == SCHED_BATCH)
-+ goto out;
-+ if (policy != SCHED_IDLE)
-+ return -EPERM;
-+ break;
-+ case SCHED_IDLE:
-+ if (policy == SCHED_IDLE)
-+ goto out;
-+ return -EPERM;
-+ default:
-+ break;
-+ }
-+ }
-+
-+ /* can't change other user's priorities */
-+ if (!check_same_owner(p))
-+ return -EPERM;
-+ }
-+
-+ retval = security_task_setscheduler(p, policy, param);
-+ if (retval)
-+ return retval;
-+ /*
-+ * make sure no PI-waiters arrive (or leave) while we are
-+ * changing the priority of the task:
-+ */
-+ spin_lock_irqsave(&p->pi_lock, flags);
-+ /*
-+ * To be able to change p->policy safely, the apropriate
-+ * runqueue lock must be held.
-+ */
-+ rq = __task_grq_lock(p);
-+ /* recheck policy now with rq lock held */
-+ if (unlikely(oldpolicy != -1 && oldpolicy != p->policy)) {
-+ __task_grq_unlock();
-+ spin_unlock_irqrestore(&p->pi_lock, flags);
-+ policy = oldpolicy = -1;
-+ goto recheck;
-+ }
-+ update_rq_clock(rq);
-+ queued = task_queued_only(p);
-+ if (queued)
-+ dequeue_task(p);
-+ oldprio = p->prio;
-+ __setscheduler(p, policy, param->sched_priority);
-+ if (queued) {
-+ enqueue_task(p);
-+ try_preempt(p);
-+ }
-+ __task_grq_unlock();
-+ spin_unlock_irqrestore(&p->pi_lock, flags);
-+
-+ rt_mutex_adjust_pi(p);
-+out:
-+ return 0;
-+}
-+
-+/**
-+ * sched_setscheduler - change the scheduling policy and/or RT priority of a thread.
-+ * @p: the task in question.
-+ * @policy: new policy.
-+ * @param: structure containing the new RT priority.
-+ *
-+ * NOTE that the task may be already dead.
-+ */
-+int sched_setscheduler(struct task_struct *p, int policy,
-+ struct sched_param *param)
-+{
-+ return __sched_setscheduler(p, policy, param, true);
-+}
-+
-+EXPORT_SYMBOL_GPL(sched_setscheduler);
-+
-+/**
-+ * sched_setscheduler_nocheck - change the scheduling policy and/or RT priority of a thread from kernelspace.
-+ * @p: the task in question.
-+ * @policy: new policy.
-+ * @param: structure containing the new RT priority.
-+ *
-+ * Just like sched_setscheduler, only don't bother checking if the
-+ * current context has permission. For example, this is needed in
-+ * stop_machine(): we create temporary high priority worker threads,
-+ * but our caller might not have that capability.
-+ */
-+int sched_setscheduler_nocheck(struct task_struct *p, int policy,
-+ struct sched_param *param)
-+{
-+ return __sched_setscheduler(p, policy, param, false);
-+}
-+
-+static int
-+do_sched_setscheduler(pid_t pid, int policy, struct sched_param __user *param)
-+{
-+ struct sched_param lparam;
-+ struct task_struct *p;
-+ int retval;
-+
-+ if (!param || pid < 0)
-+ return -EINVAL;
-+ if (copy_from_user(&lparam, param, sizeof(struct sched_param)))
-+ return -EFAULT;
-+
-+ rcu_read_lock();
-+ retval = -ESRCH;
-+ p = find_process_by_pid(pid);
-+ if (p != NULL)
-+ retval = sched_setscheduler(p, policy, &lparam);
-+ rcu_read_unlock();
-+
-+ return retval;
-+}
-+
-+/**
-+ * sys_sched_setscheduler - set/change the scheduler policy and RT priority
-+ * @pid: the pid in question.
-+ * @policy: new policy.
-+ * @param: structure containing the new RT priority.
-+ */
-+asmlinkage long sys_sched_setscheduler(pid_t pid, int policy,
-+ struct sched_param __user *param)
-+{
-+ /* negative values for policy are not valid */
-+ if (policy < 0)
-+ return -EINVAL;
-+
-+ return do_sched_setscheduler(pid, policy, param);
-+}
-+
-+/**
-+ * sys_sched_setparam - set/change the RT priority of a thread
-+ * @pid: the pid in question.
-+ * @param: structure containing the new RT priority.
-+ */
-+SYSCALL_DEFINE2(sched_setparam, pid_t, pid, struct sched_param __user *, param)
-+{
-+ return do_sched_setscheduler(pid, -1, param);
-+}
-+
-+/**
-+ * sys_sched_getscheduler - get the policy (scheduling class) of a thread
-+ * @pid: the pid in question.
-+ */
-+SYSCALL_DEFINE1(sched_getscheduler, pid_t, pid)
-+{
-+ struct task_struct *p;
-+ int retval = -EINVAL;
-+
-+ if (pid < 0)
-+ goto out_nounlock;
-+
-+ retval = -ESRCH;
-+ read_lock(&tasklist_lock);
-+ p = find_process_by_pid(pid);
-+ if (p) {
-+ retval = security_task_getscheduler(p);
-+ if (!retval)
-+ retval = p->policy;
-+ }
-+ read_unlock(&tasklist_lock);
-+
-+out_nounlock:
-+ return retval;
-+}
-+
-+/**
-+ * sys_sched_getscheduler - get the RT priority of a thread
-+ * @pid: the pid in question.
-+ * @param: structure containing the RT priority.
-+ */
-+SYSCALL_DEFINE2(sched_getparam, pid_t, pid, struct sched_param __user *, param)
-+{
-+ struct sched_param lp;
-+ struct task_struct *p;
-+ int retval = -EINVAL;
-+
-+ if (!param || pid < 0)
-+ goto out_nounlock;
-+
-+ read_lock(&tasklist_lock);
-+ p = find_process_by_pid(pid);
-+ retval = -ESRCH;
-+ if (!p)
-+ goto out_unlock;
-+
-+ retval = security_task_getscheduler(p);
-+ if (retval)
-+ goto out_unlock;
-+
-+ lp.sched_priority = p->rt_priority;
-+ read_unlock(&tasklist_lock);
-+
-+ /*
-+ * This one might sleep, we cannot do it with a spinlock held ...
-+ */
-+ retval = copy_to_user(param, &lp, sizeof(*param)) ? -EFAULT : 0;
-+
-+out_nounlock:
-+ return retval;
-+
-+out_unlock:
-+ read_unlock(&tasklist_lock);
-+ return retval;
-+}
-+
-+long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)
-+{
-+ cpumask_var_t cpus_allowed, new_mask;
-+ struct task_struct *p;
-+ int retval;
-+
-+ get_online_cpus();
-+ read_lock(&tasklist_lock);
-+
-+ p = find_process_by_pid(pid);
-+ if (!p) {
-+ read_unlock(&tasklist_lock);
-+ put_online_cpus();
-+ return -ESRCH;
-+ }
-+
-+ /*
-+ * It is not safe to call set_cpus_allowed with the
-+ * tasklist_lock held. We will bump the task_struct's
-+ * usage count and then drop tasklist_lock.
-+ */
-+ get_task_struct(p);
-+ read_unlock(&tasklist_lock);
-+
-+ if (!alloc_cpumask_var(&cpus_allowed, GFP_KERNEL)) {
-+ retval = -ENOMEM;
-+ goto out_put_task;
-+ }
-+ if (!alloc_cpumask_var(&new_mask, GFP_KERNEL)) {
-+ retval = -ENOMEM;
-+ goto out_free_cpus_allowed;
-+ }
-+ retval = -EPERM;
-+ if (!check_same_owner(p) && !capable(CAP_SYS_NICE))
-+ goto out_unlock;
-+
-+ retval = security_task_setscheduler(p, 0, NULL);
-+ if (retval)
-+ goto out_unlock;
-+
-+ cpuset_cpus_allowed(p, cpus_allowed);
-+ cpumask_and(new_mask, in_mask, cpus_allowed);
-+again:
-+ retval = set_cpus_allowed_ptr(p, new_mask);
-+
-+ if (!retval) {
-+ cpuset_cpus_allowed(p, cpus_allowed);
-+ if (!cpumask_subset(new_mask, cpus_allowed)) {
-+ /*
-+ * We must have raced with a concurrent cpuset
-+ * update. Just reset the cpus_allowed to the
-+ * cpuset's cpus_allowed
-+ */
-+ cpumask_copy(new_mask, cpus_allowed);
-+ goto again;
-+ }
-+ }
-+out_unlock:
-+ free_cpumask_var(new_mask);
-+out_free_cpus_allowed:
-+ free_cpumask_var(cpus_allowed);
-+out_put_task:
-+ put_task_struct(p);
-+ put_online_cpus();
-+ return retval;
-+}
-+
-+static int get_user_cpu_mask(unsigned long __user *user_mask_ptr, unsigned len,
-+ cpumask_t *new_mask)
-+{
-+ if (len < sizeof(cpumask_t)) {
-+ memset(new_mask, 0, sizeof(cpumask_t));
-+ } else if (len > sizeof(cpumask_t)) {
-+ len = sizeof(cpumask_t);
-+ }
-+ return copy_from_user(new_mask, user_mask_ptr, len) ? -EFAULT : 0;
-+}
-+
-+
-+/**
-+ * sys_sched_setaffinity - set the cpu affinity of a process
-+ * @pid: pid of the process
-+ * @len: length in bytes of the bitmask pointed to by user_mask_ptr
-+ * @user_mask_ptr: user-space pointer to the new cpu mask
-+ */
-+SYSCALL_DEFINE3(sched_setaffinity, pid_t, pid, unsigned int, len,
-+ unsigned long __user *, user_mask_ptr)
-+{
-+ cpumask_var_t new_mask;
-+ int retval;
-+
-+ if (!alloc_cpumask_var(&new_mask, GFP_KERNEL))
-+ return -ENOMEM;
-+
-+ retval = get_user_cpu_mask(user_mask_ptr, len, new_mask);
-+ if (retval == 0)
-+ retval = sched_setaffinity(pid, new_mask);
-+ free_cpumask_var(new_mask);
-+ return retval;
-+}
-+
-+long sched_getaffinity(pid_t pid, cpumask_t *mask)
-+{
-+ struct task_struct *p;
-+ int retval;
-+
-+ mutex_lock(&sched_hotcpu_mutex);
-+ read_lock(&tasklist_lock);
-+
-+ retval = -ESRCH;
-+ p = find_process_by_pid(pid);
-+ if (!p)
-+ goto out_unlock;
-+
-+ retval = security_task_getscheduler(p);
-+ if (retval)
-+ goto out_unlock;
-+
-+ cpus_and(*mask, p->cpus_allowed, cpu_online_map);
-+
-+out_unlock:
-+ read_unlock(&tasklist_lock);
-+ mutex_unlock(&sched_hotcpu_mutex);
-+ if (retval)
-+ return retval;
-+
-+ return 0;
-+}
-+
-+/**
-+ * sys_sched_getaffinity - get the cpu affinity of a process
-+ * @pid: pid of the process
-+ * @len: length in bytes of the bitmask pointed to by user_mask_ptr
-+ * @user_mask_ptr: user-space pointer to hold the current cpu mask
-+ */
-+SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len,
-+ unsigned long __user *, user_mask_ptr)
-+{
-+ int ret;
-+ cpumask_var_t mask;
-+
-+ if (len < cpumask_size())
-+ return -EINVAL;
-+
-+ if (!alloc_cpumask_var(&mask, GFP_KERNEL))
-+ return -ENOMEM;
-+
-+ ret = sched_getaffinity(pid, mask);
-+ if (ret == 0) {
-+ if (copy_to_user(user_mask_ptr, mask, cpumask_size()))
-+ ret = -EFAULT;
-+ else
-+ ret = cpumask_size();
-+ }
-+ free_cpumask_var(mask);
-+
-+ return ret;
-+}
-+
-+/**
-+ * sys_sched_yield - yield the current processor to other threads.
-+ *
-+ * This function yields the current CPU to other tasks. It does this by
-+ * refilling the timeslice, resetting the deadline and scheduling away.
-+ */
-+SYSCALL_DEFINE0(sched_yield)
-+{
-+ struct task_struct *p;
-+
-+ grq_lock_irq();
-+ p = current;
-+ schedstat_inc(this_rq(), yld_count);
-+ update_rq_clock(task_rq(p));
-+ time_slice_expired(p);
-+ requeue_task(p);
-+
-+ /*
-+ * Since we are going to call schedule() anyway, there's
-+ * no need to preempt or enable interrupts:
-+ */
-+ __release(grq.lock);
-+ spin_release(&grq.lock.dep_map, 1, _THIS_IP_);
-+ _raw_spin_unlock(&grq.lock);
-+ preempt_enable_no_resched();
-+
-+ schedule();
-+
-+ return 0;
-+}
-+
-+static inline int should_resched(void)
-+{
-+ return need_resched() && !(preempt_count() & PREEMPT_ACTIVE);
-+}
-+
-+static void __cond_resched(void)
-+{
-+#ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
-+ __might_sleep(__FILE__, __LINE__);
-+#endif
-+ /*
-+ * The BKS might be reacquired before we have dropped
-+ * PREEMPT_ACTIVE, which could trigger a second
-+ * cond_resched() call.
-+ */
-+ do {
-+ add_preempt_count(PREEMPT_ACTIVE);
-+ schedule();
-+ sub_preempt_count(PREEMPT_ACTIVE);
-+ } while (need_resched());
-+}
-+
-+int __sched _cond_resched(void)
-+{
-+ if (should_resched()) {
-+ __cond_resched();
-+ return 1;
-+ }
-+ return 0;
-+}
-+EXPORT_SYMBOL(_cond_resched);
-+
-+/*
-+ * cond_resched_lock() - if a reschedule is pending, drop the given lock,
-+ * call schedule, and on return reacquire the lock.
-+ *
-+ * This works OK both with and without CONFIG_PREEMPT. We do strange low-level
-+ * operations here to prevent schedule() from being called twice (once via
-+ * spin_unlock(), once by hand).
-+ */
-+int cond_resched_lock(spinlock_t *lock)
-+{
-+ int resched = should_resched();
-+ int ret = 0;
-+
-+ if (spin_needbreak(lock) || resched) {
-+ spin_unlock(lock);
-+ if (resched)
-+ __cond_resched();
-+ else
-+ cpu_relax();
-+ ret = 1;
-+ spin_lock(lock);
-+ }
-+ return ret;
-+}
-+EXPORT_SYMBOL(cond_resched_lock);
-+
-+int __sched cond_resched_softirq(void)
-+{
-+ BUG_ON(!in_softirq());
-+
-+ if (should_resched()) {
-+ local_bh_enable();
-+ __cond_resched();
-+ local_bh_disable();
-+ return 1;
-+ }
-+ return 0;
-+}
-+EXPORT_SYMBOL(cond_resched_softirq);
-+
-+/**
-+ * yield - yield the current processor to other threads.
-+ *
-+ * This is a shortcut for kernel-space yielding - it marks the
-+ * thread runnable and calls sys_sched_yield().
-+ */
-+void __sched yield(void)
-+{
-+ set_current_state(TASK_RUNNING);
-+ sys_sched_yield();
-+}
-+EXPORT_SYMBOL(yield);
-+
-+/*
-+ * This task is about to go to sleep on IO. Increment rq->nr_iowait so
-+ * that process accounting knows that this is a task in IO wait state.
-+ *
-+ * But don't do that if it is a deliberate, throttling IO wait (this task
-+ * has set its backing_dev_info: the queue against which it should throttle)
-+ */
-+void __sched io_schedule(void)
-+{
-+ struct rq *rq = &__raw_get_cpu_var(runqueues);
-+
-+ delayacct_blkio_start();
-+ atomic_inc(&rq->nr_iowait);
-+ schedule();
-+ atomic_dec(&rq->nr_iowait);
-+ delayacct_blkio_end();
-+}
-+EXPORT_SYMBOL(io_schedule);
-+
-+long __sched io_schedule_timeout(long timeout)
-+{
-+ struct rq *rq = &__raw_get_cpu_var(runqueues);
-+ long ret;
-+
-+ delayacct_blkio_start();
-+ atomic_inc(&rq->nr_iowait);
-+ ret = schedule_timeout(timeout);
-+ atomic_dec(&rq->nr_iowait);
-+ delayacct_blkio_end();
-+ return ret;
-+}
-+
-+/**
-+ * sys_sched_get_priority_max - return maximum RT priority.
-+ * @policy: scheduling class.
-+ *
-+ * this syscall returns the maximum rt_priority that can be used
-+ * by a given scheduling class.
-+ */
-+SYSCALL_DEFINE1(sched_get_priority_max, int, policy)
-+{
-+ int ret = -EINVAL;
-+
-+ switch (policy) {
-+ case SCHED_FIFO:
-+ case SCHED_RR:
-+ ret = MAX_USER_RT_PRIO-1;
-+ break;
-+ case SCHED_NORMAL:
-+ case SCHED_BATCH:
-+ case SCHED_ISO:
-+ case SCHED_IDLE:
-+ ret = 0;
-+ break;
-+ }
-+ return ret;
-+}
-+
-+/**
-+ * sys_sched_get_priority_min - return minimum RT priority.
-+ * @policy: scheduling class.
-+ *
-+ * this syscall returns the minimum rt_priority that can be used
-+ * by a given scheduling class.
-+ */
-+SYSCALL_DEFINE1(sched_get_priority_min, int, policy)
-+{
-+ int ret = -EINVAL;
-+
-+ switch (policy) {
-+ case SCHED_FIFO:
-+ case SCHED_RR:
-+ ret = 1;
-+ break;
-+ case SCHED_NORMAL:
-+ case SCHED_BATCH:
-+ case SCHED_ISO:
-+ case SCHED_IDLE:
-+ ret = 0;
-+ break;
-+ }
-+ return ret;
-+}
-+
-+/**
-+ * sys_sched_rr_get_interval - return the default timeslice of a process.
-+ * @pid: pid of the process.
-+ * @interval: userspace pointer to the timeslice value.
-+ *
-+ * this syscall writes the default timeslice value of a given process
-+ * into the user-space timespec buffer. A value of '0' means infinity.
-+ */
-+SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid,
-+ struct timespec __user *, interval)
-+{
-+ struct task_struct *p;
-+ int retval = -EINVAL;
-+ struct timespec t;
-+
-+ if (pid < 0)
-+ goto out_nounlock;
-+
-+ retval = -ESRCH;
-+ read_lock(&tasklist_lock);
-+ p = find_process_by_pid(pid);
-+ if (!p)
-+ goto out_unlock;
-+
-+ retval = security_task_getscheduler(p);
-+ if (retval)
-+ goto out_unlock;
-+
-+ t = ns_to_timespec(p->policy == SCHED_FIFO ? 0 :
-+ MS_TO_NS(task_timeslice(p)));
-+ read_unlock(&tasklist_lock);
-+ retval = copy_to_user(interval, &t, sizeof(t)) ? -EFAULT : 0;
-+out_nounlock:
-+ return retval;
-+out_unlock:
-+ read_unlock(&tasklist_lock);
-+ return retval;
-+}
-+
-+static const char stat_nam[] = TASK_STATE_TO_CHAR_STR;
-+
-+void sched_show_task(struct task_struct *p)
-+{
-+ unsigned long free = 0;
-+ unsigned state;
-+
-+ state = p->state ? __ffs(p->state) + 1 : 0;
-+ printk(KERN_INFO "%-13.13s %c", p->comm,
-+ state < sizeof(stat_nam) - 1 ? stat_nam[state] : '?');
-+#if BITS_PER_LONG == 32
-+ if (state == TASK_RUNNING)
-+ printk(KERN_CONT " running ");
-+ else
-+ printk(KERN_CONT " %08lx ", thread_saved_pc(p));
-+#else
-+ if (state == TASK_RUNNING)
-+ printk(KERN_CONT " running task ");
-+ else
-+ printk(KERN_CONT " %016lx ", thread_saved_pc(p));
-+#endif
-+#ifdef CONFIG_DEBUG_STACK_USAGE
-+ free = stack_not_used(p);
-+#endif
-+ printk(KERN_CONT "%5lu %5d %6d 0x%08lx\n", free,
-+ task_pid_nr(p), task_pid_nr(p->real_parent),
-+ (unsigned long)task_thread_info(p)->flags);
-+
-+ show_stack(p, NULL);
-+}
-+
-+void show_state_filter(unsigned long state_filter)
-+{
-+ struct task_struct *g, *p;
-+
-+#if BITS_PER_LONG == 32
-+ printk(KERN_INFO
-+ " task PC stack pid father\n");
-+#else
-+ printk(KERN_INFO
-+ " task PC stack pid father\n");
-+#endif
-+ read_lock(&tasklist_lock);
-+ do_each_thread(g, p) {
-+ /*
-+ * reset the NMI-timeout, listing all files on a slow
-+ * console might take alot of time:
-+ */
-+ touch_nmi_watchdog();
-+ if (!state_filter || (p->state & state_filter))
-+ sched_show_task(p);
-+ } while_each_thread(g, p);
-+
-+ touch_all_softlockup_watchdogs();
-+
-+ read_unlock(&tasklist_lock);
-+ /*
-+ * Only show locks if all tasks are dumped:
-+ */
-+ if (state_filter == -1)
-+ debug_show_all_locks();
-+}
-+
-+/**
-+ * init_idle - set up an idle thread for a given CPU
-+ * @idle: task in question
-+ * @cpu: cpu the idle task belongs to
-+ *
-+ * NOTE: this function does not set the idle thread's NEED_RESCHED
-+ * flag, to make booting more robust.
-+ */
-+void __cpuinit init_idle(struct task_struct *idle, int cpu)
-+{
-+ struct rq *rq = cpu_rq(cpu);
-+ unsigned long flags;
-+
-+ time_grq_lock(rq, &flags);
-+ idle->timestamp = idle->last_ran = rq->clock;
-+ idle->state = TASK_RUNNING;
-+ /* Setting prio to illegal value shouldn't matter when never queued */
-+ idle->prio = rq->rq_prio = PRIO_LIMIT;
-+ rq->rq_deadline = idle->deadline;
-+ rq->rq_policy = idle->policy;
-+ rq->rq_time_slice = idle->rt.time_slice;
-+ idle->cpus_allowed = cpumask_of_cpu(cpu);
-+ set_task_cpu(idle, cpu);
-+ rq->curr = rq->idle = idle;
-+ idle->oncpu = 1;
-+ set_cpuidle_map(cpu);
-+#ifdef CONFIG_HOTPLUG_CPU
-+ idle->unplugged_mask = CPU_MASK_NONE;
-+#endif
-+ grq_unlock_irqrestore(&flags);
-+
-+ /* Set the preempt count _outside_ the spinlocks! */
-+#if defined(CONFIG_PREEMPT) && !defined(CONFIG_PREEMPT_BKL)
-+ task_thread_info(idle)->preempt_count = (idle->lock_depth >= 0);
-+#else
-+ task_thread_info(idle)->preempt_count = 0;
-+#endif
-+ ftrace_graph_init_task(idle);
-+}
-+
-+/*
-+ * In a system that switches off the HZ timer nohz_cpu_mask
-+ * indicates which cpus entered this state. This is used
-+ * in the rcu update to wait only for active cpus. For system
-+ * which do not switch off the HZ timer nohz_cpu_mask should
-+ * always be CPU_BITS_NONE.
-+ */
-+cpumask_var_t nohz_cpu_mask;
-+
-+#ifdef CONFIG_SMP
-+#ifdef CONFIG_NO_HZ
-+static struct {
-+ atomic_t load_balancer;
-+ cpumask_var_t cpu_mask;
-+ cpumask_var_t ilb_grp_nohz_mask;
-+} nohz ____cacheline_aligned = {
-+ .load_balancer = ATOMIC_INIT(-1),
-+};
-+
-+int get_nohz_load_balancer(void)
-+{
-+ return atomic_read(&nohz.load_balancer);
-+}
-+
-+/*
-+ * This routine will try to nominate the ilb (idle load balancing)
-+ * owner among the cpus whose ticks are stopped. ilb owner will do the idle
-+ * load balancing on behalf of all those cpus. If all the cpus in the system
-+ * go into this tickless mode, then there will be no ilb owner (as there is
-+ * no need for one) and all the cpus will sleep till the next wakeup event
-+ * arrives...
-+ *
-+ * For the ilb owner, tick is not stopped. And this tick will be used
-+ * for idle load balancing. ilb owner will still be part of
-+ * nohz.cpu_mask..
-+ *
-+ * While stopping the tick, this cpu will become the ilb owner if there
-+ * is no other owner. And will be the owner till that cpu becomes busy
-+ * or if all cpus in the system stop their ticks at which point
-+ * there is no need for ilb owner.
-+ *
-+ * When the ilb owner becomes busy, it nominates another owner, during the
-+ * next busy scheduler_tick()
-+ */
-+int select_nohz_load_balancer(int stop_tick)
-+{
-+ int cpu = smp_processor_id();
-+
-+ if (stop_tick) {
-+ 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 (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)
-+ atomic_set(&nohz.load_balancer, -1);
-+ return 0;
-+ }
-+
-+ if (atomic_read(&nohz.load_balancer) == -1) {
-+ /* make me the ilb owner */
-+ if (atomic_cmpxchg(&nohz.load_balancer, -1, cpu) == -1)
-+ return 1;
-+ } else if (atomic_read(&nohz.load_balancer) == cpu)
-+ return 1;
-+ } else {
-+ if (!cpumask_test_cpu(cpu, nohz.cpu_mask))
-+ return 0;
-+
-+ cpumask_clear_cpu(cpu, nohz.cpu_mask);
-+
-+ if (atomic_read(&nohz.load_balancer) == cpu)
-+ if (atomic_cmpxchg(&nohz.load_balancer, cpu, -1) != cpu)
-+ BUG();
-+ }
-+ return 0;
-+}
-+
-+/*
-+ * When add_timer_on() enqueues a timer into the timer wheel of an
-+ * idle CPU then this timer might expire before the next timer event
-+ * which is scheduled to wake up that CPU. In case of a completely
-+ * idle system the next event might even be infinite time into the
-+ * future. wake_up_idle_cpu() ensures that the CPU is woken up and
-+ * leaves the inner idle loop so the newly added timer is taken into
-+ * account when the CPU goes back to idle and evaluates the timer
-+ * wheel for the next timer event.
-+ */
-+void wake_up_idle_cpu(int cpu)
-+{
-+ struct task_struct *idle;
-+ struct rq *rq;
-+
-+ if (cpu == smp_processor_id())
-+ return;
-+
-+ rq = cpu_rq(cpu);
-+ idle = rq->idle;
-+
-+ /*
-+ * This is safe, as this function is called with the timer
-+ * wheel base lock of (cpu) held. When the CPU is on the way
-+ * to idle and has not yet set rq->curr to idle then it will
-+ * be serialized on the timer wheel base lock and take the new
-+ * timer into account automatically.
-+ */
-+ if (unlikely(rq->curr != idle))
-+ return;
-+
-+ /*
-+ * We can set TIF_RESCHED on the idle task of the other CPU
-+ * lockless. The worst case is that the other CPU runs the
-+ * idle task through an additional NOOP schedule()
-+ */
-+ set_tsk_need_resched(idle);
-+
-+ /* NEED_RESCHED must be visible before we test polling */
-+ smp_mb();
-+ if (!tsk_is_polling(idle))
-+ smp_send_reschedule(cpu);
-+}
-+
-+#endif /* CONFIG_NO_HZ */
-+
-+/*
-+ * Change a given task's CPU affinity. Migrate the thread to a
-+ * proper CPU and schedule it away if the CPU it's executing on
-+ * is removed from the allowed bitmask.
-+ *
-+ * NOTE: the caller must have a valid reference to the task, the
-+ * task must not exit() & deallocate itself prematurely. The
-+ * call is not atomic; no spinlocks may be held.
-+ */
-+int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask)
-+{
-+ unsigned long flags;
-+ int running = 0;
-+ int queued = 0;
-+ struct rq *rq;
-+ int ret = 0;
-+
-+ rq = task_grq_lock(p, &flags);
-+ if (!cpumask_intersects(new_mask, cpu_online_mask)) {
-+ ret = -EINVAL;
-+ goto out;
-+ }
-+
-+ if (unlikely((p->flags & PF_THREAD_BOUND) && p != current &&
-+ !cpumask_equal(&p->cpus_allowed, new_mask))) {
-+ ret = -EINVAL;
-+ goto out;
-+ }
-+
-+ queued = task_queued_only(p);
-+
-+ cpumask_copy(&p->cpus_allowed, new_mask);
-+ p->rt.nr_cpus_allowed = cpumask_weight(new_mask);
-+
-+ /* Can the task run on the task's current CPU? If so, we're done */
-+ if (cpumask_test_cpu(task_cpu(p), new_mask))
-+ goto out;
-+
-+ /* Reschedule the task, schedule() will know if it can keep running */
-+ if (task_running(p))
-+ running = 1;
-+ else
-+ set_task_cpu(p, cpumask_any_and(cpu_online_mask, new_mask));
-+
-+out:
-+ if (queued)
-+ try_preempt(p);
-+ task_grq_unlock(&flags);
-+
-+ /* This might be a flaky way of changing cpus! */
-+ if (running)
-+ schedule();
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(set_cpus_allowed_ptr);
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+/* Schedules idle task to be the next runnable task on current CPU.
-+ * It does so by boosting its priority to highest possible.
-+ * Used by CPU offline code.
-+ */
-+void sched_idle_next(void)
-+{
-+ int this_cpu = smp_processor_id();
-+ struct rq *rq = cpu_rq(this_cpu);
-+ struct task_struct *idle = rq->idle;
-+ unsigned long flags;
-+
-+ /* cpu has to be offline */
-+ BUG_ON(cpu_online(this_cpu));
-+
-+ /*
-+ * Strictly not necessary since rest of the CPUs are stopped by now
-+ * and interrupts disabled on the current cpu.
-+ */
-+ time_grq_lock(rq, &flags);
-+
-+ __setscheduler(idle, SCHED_FIFO, MAX_RT_PRIO - 1);
-+
-+ activate_idle_task(idle);
-+ set_tsk_need_resched(rq->curr);
-+
-+ grq_unlock_irqrestore(&flags);
-+}
-+
-+/*
-+ * Ensures that the idle task is using init_mm right before its cpu goes
-+ * offline.
-+ */
-+void idle_task_exit(void)
-+{
-+ struct mm_struct *mm = current->active_mm;
-+
-+ BUG_ON(cpu_online(smp_processor_id()));
-+
-+ if (mm != &init_mm)
-+ switch_mm(mm, &init_mm, current);
-+ mmdrop(mm);
-+}
-+
-+#endif /* CONFIG_HOTPLUG_CPU */
-+
-+#if defined(CONFIG_SCHED_DEBUG) && defined(CONFIG_SYSCTL)
-+
-+static struct ctl_table sd_ctl_dir[] = {
-+ {
-+ .procname = "sched_domain",
-+ .mode = 0555,
-+ },
-+ {0, },
-+};
-+
-+static struct ctl_table sd_ctl_root[] = {
-+ {
-+ .ctl_name = CTL_KERN,
-+ .procname = "kernel",
-+ .mode = 0555,
-+ .child = sd_ctl_dir,
-+ },
-+ {0, },
-+};
-+
-+static struct ctl_table *sd_alloc_ctl_entry(int n)
-+{
-+ struct ctl_table *entry =
-+ kcalloc(n, sizeof(struct ctl_table), GFP_KERNEL);
-+
-+ return entry;
-+}
-+
-+static void sd_free_ctl_entry(struct ctl_table **tablep)
-+{
-+ struct ctl_table *entry;
-+
-+ /*
-+ * In the intermediate directories, both the child directory and
-+ * procname are dynamically allocated and could fail but the mode
-+ * will always be set. In the lowest directory the names are
-+ * static strings and all have proc handlers.
-+ */
-+ for (entry = *tablep; entry->mode; entry++) {
-+ if (entry->child)
-+ sd_free_ctl_entry(&entry->child);
-+ if (entry->proc_handler == NULL)
-+ kfree(entry->procname);
-+ }
-+
-+ kfree(*tablep);
-+ *tablep = NULL;
-+}
-+
-+static void
-+set_table_entry(struct ctl_table *entry,
-+ const char *procname, void *data, int maxlen,
-+ mode_t mode, proc_handler *proc_handler)
-+{
-+ entry->procname = procname;
-+ entry->data = data;
-+ entry->maxlen = maxlen;
-+ entry->mode = mode;
-+ entry->proc_handler = proc_handler;
-+}
-+
-+static struct ctl_table *
-+sd_alloc_ctl_domain_table(struct sched_domain *sd)
-+{
-+ struct ctl_table *table = sd_alloc_ctl_entry(13);
-+
-+ if (table == NULL)
-+ return NULL;
-+
-+ set_table_entry(&table[0], "min_interval", &sd->min_interval,
-+ sizeof(long), 0644, proc_doulongvec_minmax);
-+ set_table_entry(&table[1], "max_interval", &sd->max_interval,
-+ sizeof(long), 0644, proc_doulongvec_minmax);
-+ set_table_entry(&table[2], "busy_idx", &sd->busy_idx,
-+ sizeof(int), 0644, proc_dointvec_minmax);
-+ set_table_entry(&table[3], "idle_idx", &sd->idle_idx,
-+ sizeof(int), 0644, proc_dointvec_minmax);
-+ set_table_entry(&table[4], "newidle_idx", &sd->newidle_idx,
-+ sizeof(int), 0644, proc_dointvec_minmax);
-+ set_table_entry(&table[5], "wake_idx", &sd->wake_idx,
-+ sizeof(int), 0644, proc_dointvec_minmax);
-+ set_table_entry(&table[6], "forkexec_idx", &sd->forkexec_idx,
-+ sizeof(int), 0644, proc_dointvec_minmax);
-+ set_table_entry(&table[7], "busy_factor", &sd->busy_factor,
-+ sizeof(int), 0644, proc_dointvec_minmax);
-+ set_table_entry(&table[8], "imbalance_pct", &sd->imbalance_pct,
-+ sizeof(int), 0644, proc_dointvec_minmax);
-+ set_table_entry(&table[9], "cache_nice_tries",
-+ &sd->cache_nice_tries,
-+ sizeof(int), 0644, proc_dointvec_minmax);
-+ set_table_entry(&table[10], "flags", &sd->flags,
-+ sizeof(int), 0644, proc_dointvec_minmax);
-+ set_table_entry(&table[11], "name", sd->name,
-+ CORENAME_MAX_SIZE, 0444, proc_dostring);
-+ /* &table[12] is terminator */
-+
-+ return table;
-+}
-+
-+static ctl_table *sd_alloc_ctl_cpu_table(int cpu)
-+{
-+ struct ctl_table *entry, *table;
-+ struct sched_domain *sd;
-+ int domain_num = 0, i;
-+ char buf[32];
-+
-+ for_each_domain(cpu, sd)
-+ domain_num++;
-+ entry = table = sd_alloc_ctl_entry(domain_num + 1);
-+ if (table == NULL)
-+ return NULL;
-+
-+ i = 0;
-+ for_each_domain(cpu, sd) {
-+ snprintf(buf, 32, "domain%d", i);
-+ entry->procname = kstrdup(buf, GFP_KERNEL);
-+ entry->mode = 0555;
-+ entry->child = sd_alloc_ctl_domain_table(sd);
-+ entry++;
-+ i++;
-+ }
-+ return table;
-+}
-+
-+static struct ctl_table_header *sd_sysctl_header;
-+static void register_sched_domain_sysctl(void)
-+{
-+ int i, cpu_num = num_online_cpus();
-+ struct ctl_table *entry = sd_alloc_ctl_entry(cpu_num + 1);
-+ char buf[32];
-+
-+ WARN_ON(sd_ctl_dir[0].child);
-+ sd_ctl_dir[0].child = entry;
-+
-+ if (entry == NULL)
-+ return;
-+
-+ for_each_online_cpu(i) {
-+ snprintf(buf, 32, "cpu%d", i);
-+ entry->procname = kstrdup(buf, GFP_KERNEL);
-+ entry->mode = 0555;
-+ entry->child = sd_alloc_ctl_cpu_table(i);
-+ entry++;
-+ }
-+
-+ WARN_ON(sd_sysctl_header);
-+ sd_sysctl_header = register_sysctl_table(sd_ctl_root);
-+}
-+
-+/* may be called multiple times per register */
-+static void unregister_sched_domain_sysctl(void)
-+{
-+ if (sd_sysctl_header)
-+ unregister_sysctl_table(sd_sysctl_header);
-+ sd_sysctl_header = NULL;
-+ if (sd_ctl_dir[0].child)
-+ sd_free_ctl_entry(&sd_ctl_dir[0].child);
-+}
-+#else
-+static void register_sched_domain_sysctl(void)
-+{
-+}
-+static void unregister_sched_domain_sysctl(void)
-+{
-+}
-+#endif
-+
-+static void set_rq_online(struct rq *rq)
-+{
-+ if (!rq->online) {
-+ cpumask_set_cpu(rq->cpu, rq->rd->online);
-+ rq->online = 1;
-+ }
-+}
-+
-+static void set_rq_offline(struct rq *rq)
-+{
-+ if (rq->online) {
-+ cpumask_clear_cpu(rq->cpu, rq->rd->online);
-+ rq->online = 0;
-+ }
-+}
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+/*
-+ * This cpu is going down, so walk over the tasklist and find tasks that can
-+ * only run on this cpu and remove their affinity. Store their value in
-+ * unplugged_mask so it can be restored once their correct cpu is online. No
-+ * need to do anything special since they'll just move on next reschedule if
-+ * they're running.
-+ */
-+static void remove_cpu(unsigned long cpu)
-+{
-+ struct task_struct *p, *t;
-+
-+ read_lock(&tasklist_lock);
-+
-+ do_each_thread(t, p) {
-+ cpumask_t cpus_remaining;
-+
-+ cpus_and(cpus_remaining, p->cpus_allowed, cpu_online_map);
-+ cpu_clear(cpu, cpus_remaining);
-+ if (cpus_empty(cpus_remaining)) {
-+ p->unplugged_mask = p->cpus_allowed;
-+ p->cpus_allowed = cpu_possible_map;
-+ }
-+ } while_each_thread(t, p);
-+
-+ read_unlock(&tasklist_lock);
-+}
-+
-+/*
-+ * This cpu is coming up so add it to the cpus_allowed.
-+ */
-+static void add_cpu(unsigned long cpu)
-+{
-+ struct task_struct *p, *t;
-+
-+ read_lock(&tasklist_lock);
-+
-+ do_each_thread(t, p) {
-+ /* Have we taken all the cpus from the unplugged_mask back */
-+ if (cpus_empty(p->unplugged_mask))
-+ continue;
-+
-+ /* Was this cpu in the unplugged_mask mask */
-+ if (cpu_isset(cpu, p->unplugged_mask)) {
-+ cpu_set(cpu, p->cpus_allowed);
-+ if (cpus_subset(p->unplugged_mask, p->cpus_allowed)) {
-+ /*
-+ * Have we set more than the unplugged_mask?
-+ * If so, that means we have remnants set from
-+ * the unplug/plug cycle and need to remove
-+ * them. Then clear the unplugged_mask as we've
-+ * set all the cpus back.
-+ */
-+ p->cpus_allowed = p->unplugged_mask;
-+ cpus_clear(p->unplugged_mask);
-+ }
-+ }
-+ } while_each_thread(t, p);
-+
-+ read_unlock(&tasklist_lock);
-+}
-+#else
-+static void add_cpu(unsigned long cpu)
-+{
-+}
-+#endif
-+
-+/*
-+ * migration_call - callback that gets triggered when a CPU is added.
-+ */
-+static int __cpuinit
-+migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
-+{
-+ int cpu = (long)hcpu;
-+ unsigned long flags;
-+ struct rq *rq;
-+
-+ switch (action) {
-+
-+ case CPU_UP_PREPARE:
-+ case CPU_UP_PREPARE_FROZEN:
-+ break;
-+
-+ case CPU_ONLINE:
-+ case CPU_ONLINE_FROZEN:
-+ /* Update our root-domain */
-+ rq = cpu_rq(cpu);
-+ grq_lock_irqsave(&flags);
-+ if (rq->rd) {
-+ BUG_ON(!cpumask_test_cpu(cpu, rq->rd->span));
-+
-+ set_rq_online(rq);
-+ }
-+ add_cpu(cpu);
-+ grq_unlock_irqrestore(&flags);
-+ break;
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+ case CPU_UP_CANCELED:
-+ case CPU_UP_CANCELED_FROZEN:
-+ break;
-+
-+ case CPU_DEAD:
-+ case CPU_DEAD_FROZEN:
-+ cpuset_lock(); /* around calls to cpuset_cpus_allowed_lock() */
-+ rq = cpu_rq(cpu);
-+ /* Idle task back to normal (off runqueue, low prio) */
-+ grq_lock_irq();
-+ remove_cpu(cpu);
-+ deactivate_task(rq->idle);
-+ rq->idle->static_prio = MAX_PRIO;
-+ __setscheduler(rq->idle, SCHED_NORMAL, 0);
-+ rq->idle->prio = PRIO_LIMIT;
-+ update_rq_clock(rq);
-+ grq_unlock_irq();
-+ cpuset_unlock();
-+ break;
-+
-+ case CPU_DYING:
-+ case CPU_DYING_FROZEN:
-+ rq = cpu_rq(cpu);
-+ grq_lock_irqsave(&flags);
-+ if (rq->rd) {
-+ BUG_ON(!cpumask_test_cpu(cpu, rq->rd->span));
-+ set_rq_offline(rq);
-+ }
-+ grq_unlock_irqrestore(&flags);
-+ break;
-+#endif
-+ }
-+ return NOTIFY_OK;
-+}
-+
-+/*
-+ * Register at high priority so that task migration (migrate_all_tasks)
-+ * happens before everything else. This has to be lower priority than
-+ * the notifier in the perf_counter subsystem, though.
-+ */
-+static struct notifier_block __cpuinitdata migration_notifier = {
-+ .notifier_call = migration_call,
-+ .priority = 10
-+};
-+
-+int __init migration_init(void)
-+{
-+ void *cpu = (void *)(long)smp_processor_id();
-+ int err;
-+
-+ /* Start one for the boot CPU: */
-+ err = migration_call(&migration_notifier, CPU_UP_PREPARE, cpu);
-+ BUG_ON(err == NOTIFY_BAD);
-+ migration_call(&migration_notifier, CPU_ONLINE, cpu);
-+ register_cpu_notifier(&migration_notifier);
-+
-+ return 0;
-+}
-+early_initcall(migration_init);
-+#endif
-+
-+/*
-+ * sched_domains_mutex serializes calls to arch_init_sched_domains,
-+ * detach_destroy_domains and partition_sched_domains.
-+ */
-+static DEFINE_MUTEX(sched_domains_mutex);
-+
-+#ifdef CONFIG_SMP
-+
-+#ifdef CONFIG_SCHED_DEBUG
-+
-+static int sched_domain_debug_one(struct sched_domain *sd, int cpu, int level,
-+ struct cpumask *groupmask)
-+{
-+ struct sched_group *group = sd->groups;
-+ char str[256];
-+
-+ cpulist_scnprintf(str, sizeof(str), sched_domain_span(sd));
-+ cpumask_clear(groupmask);
-+
-+ printk(KERN_DEBUG "%*s domain %d: ", level, "", level);
-+
-+ if (!(sd->flags & SD_LOAD_BALANCE)) {
-+ printk("does not load-balance\n");
-+ if (sd->parent)
-+ printk(KERN_ERR "ERROR: !SD_LOAD_BALANCE domain"
-+ " has parent");
-+ return -1;
-+ }
-+
-+ printk(KERN_CONT "span %s level %s\n", str, sd->name);
-+
-+ if (!cpumask_test_cpu(cpu, sched_domain_span(sd))) {
-+ printk(KERN_ERR "ERROR: domain->span does not contain "
-+ "CPU%d\n", cpu);
-+ }
-+ if (!cpumask_test_cpu(cpu, sched_group_cpus(group))) {
-+ printk(KERN_ERR "ERROR: domain->groups does not contain"
-+ " CPU%d\n", cpu);
-+ }
-+
-+ printk(KERN_DEBUG "%*s groups:", level + 1, "");
-+ do {
-+ if (!group) {
-+ printk("\n");
-+ printk(KERN_ERR "ERROR: group is NULL\n");
-+ break;
-+ }
-+
-+ if (!group->__cpu_power) {
-+ printk(KERN_CONT "\n");
-+ printk(KERN_ERR "ERROR: domain->cpu_power not "
-+ "set\n");
-+ break;
-+ }
-+
-+ if (!cpumask_weight(sched_group_cpus(group))) {
-+ printk(KERN_CONT "\n");
-+ printk(KERN_ERR "ERROR: empty group\n");
-+ break;
-+ }
-+
-+ if (cpumask_intersects(groupmask, sched_group_cpus(group))) {
-+ printk(KERN_CONT "\n");
-+ printk(KERN_ERR "ERROR: repeated CPUs\n");
-+ break;
-+ }
-+
-+ cpumask_or(groupmask, groupmask, sched_group_cpus(group));
-+
-+ cpulist_scnprintf(str, sizeof(str), sched_group_cpus(group));
-+
-+ printk(KERN_CONT " %s", str);
-+ if (group->__cpu_power != SCHED_LOAD_SCALE) {
-+ printk(KERN_CONT " (__cpu_power = %d)",
-+ group->__cpu_power);
-+ }
-+
-+ group = group->next;
-+ } while (group != sd->groups);
-+ printk(KERN_CONT "\n");
-+
-+ if (!cpumask_equal(sched_domain_span(sd), groupmask))
-+ printk(KERN_ERR "ERROR: groups don't span domain->span\n");
-+
-+ if (sd->parent &&
-+ !cpumask_subset(groupmask, sched_domain_span(sd->parent)))
-+ printk(KERN_ERR "ERROR: parent span is not a superset "
-+ "of domain->span\n");
-+ return 0;
-+}
-+
-+static void sched_domain_debug(struct sched_domain *sd, int cpu)
-+{
-+ cpumask_var_t groupmask;
-+ int level = 0;
-+
-+ if (!sd) {
-+ printk(KERN_DEBUG "CPU%d attaching NULL sched-domain.\n", cpu);
-+ return;
-+ }
-+
-+ printk(KERN_DEBUG "CPU%d attaching sched-domain:\n", cpu);
-+
-+ if (!alloc_cpumask_var(&groupmask, GFP_KERNEL)) {
-+ printk(KERN_DEBUG "Cannot load-balance (out of memory)\n");
-+ return;
-+ }
-+
-+ for (;;) {
-+ if (sched_domain_debug_one(sd, cpu, level, groupmask))
-+ break;
-+ level++;
-+ sd = sd->parent;
-+ if (!sd)
-+ break;
-+ }
-+ free_cpumask_var(groupmask);
-+}
-+#else /* !CONFIG_SCHED_DEBUG */
-+# define sched_domain_debug(sd, cpu) do { } while (0)
-+#endif /* CONFIG_SCHED_DEBUG */
-+
-+static int sd_degenerate(struct sched_domain *sd)
-+{
-+ if (cpumask_weight(sched_domain_span(sd)) == 1)
-+ return 1;
-+
-+ /* Following flags need at least 2 groups */
-+ if (sd->flags & (SD_LOAD_BALANCE |
-+ SD_BALANCE_NEWIDLE |
-+ SD_BALANCE_FORK |
-+ SD_BALANCE_EXEC |
-+ SD_SHARE_CPUPOWER |
-+ SD_SHARE_PKG_RESOURCES)) {
-+ if (sd->groups != sd->groups->next)
-+ return 0;
-+ }
-+
-+ /* Following flags don't use groups */
-+ if (sd->flags & (SD_WAKE_IDLE |
-+ SD_WAKE_AFFINE |
-+ SD_WAKE_BALANCE))
-+ return 0;
-+
-+ return 1;
-+}
-+
-+static int
-+sd_parent_degenerate(struct sched_domain *sd, struct sched_domain *parent)
-+{
-+ unsigned long cflags = sd->flags, pflags = parent->flags;
-+
-+ if (sd_degenerate(parent))
-+ return 1;
-+
-+ if (!cpumask_equal(sched_domain_span(sd), sched_domain_span(parent)))
-+ return 0;
-+
-+ /* Does parent contain flags not in child? */
-+ /* WAKE_BALANCE is a subset of WAKE_AFFINE */
-+ if (cflags & SD_WAKE_AFFINE)
-+ pflags &= ~SD_WAKE_BALANCE;
-+ /* Flags needing groups don't count if only 1 group in parent */
-+ if (parent->groups == parent->groups->next) {
-+ pflags &= ~(SD_LOAD_BALANCE |
-+ SD_BALANCE_NEWIDLE |
-+ SD_BALANCE_FORK |
-+ SD_BALANCE_EXEC |
-+ SD_SHARE_CPUPOWER |
-+ SD_SHARE_PKG_RESOURCES);
-+ if (nr_node_ids == 1)
-+ pflags &= ~SD_SERIALIZE;
-+ }
-+ if (~cflags & pflags)
-+ return 0;
-+
-+ return 1;
-+}
-+
-+static void free_rootdomain(struct root_domain *rd)
-+{
-+ free_cpumask_var(rd->rto_mask);
-+ free_cpumask_var(rd->online);
-+ free_cpumask_var(rd->span);
-+ kfree(rd);
-+}
-+
-+static void rq_attach_root(struct rq *rq, struct root_domain *rd)
-+{
-+ struct root_domain *old_rd = NULL;
-+ unsigned long flags;
-+
-+ grq_lock_irqsave(&flags);
-+
-+ if (rq->rd) {
-+ 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;
-+ }
-+
-+ atomic_inc(&rd->refcount);
-+ rq->rd = rd;
-+
-+ cpumask_set_cpu(rq->cpu, rd->span);
-+ if (cpumask_test_cpu(rq->cpu, cpu_online_mask))
-+ set_rq_online(rq);
-+
-+ grq_unlock_irqrestore(&flags);
-+
-+ if (old_rd)
-+ free_rootdomain(old_rd);
-+}
-+
-+static int init_rootdomain(struct root_domain *rd, bool bootmem)
-+{
-+ gfp_t gfp = GFP_KERNEL;
-+
-+ memset(rd, 0, sizeof(*rd));
-+
-+ if (bootmem)
-+ gfp = GFP_NOWAIT;
-+
-+ if (!alloc_cpumask_var(&rd->span, gfp))
-+ goto out;
-+ if (!alloc_cpumask_var(&rd->online, gfp))
-+ goto free_span;
-+ if (!alloc_cpumask_var(&rd->rto_mask, gfp))
-+ goto free_online;
-+
-+ return 0;
-+
-+free_online:
-+ free_cpumask_var(rd->online);
-+free_span:
-+ free_cpumask_var(rd->span);
-+out:
-+ return -ENOMEM;
-+}
-+
-+static void init_defrootdomain(void)
-+{
-+ init_rootdomain(&def_root_domain, true);
-+
-+ atomic_set(&def_root_domain.refcount, 1);
-+}
-+
-+static struct root_domain *alloc_rootdomain(void)
-+{
-+ struct root_domain *rd;
-+
-+ rd = kmalloc(sizeof(*rd), GFP_KERNEL);
-+ if (!rd)
-+ return NULL;
-+
-+ if (init_rootdomain(rd, false) != 0) {
-+ kfree(rd);
-+ return NULL;
-+ }
-+
-+ return rd;
-+}
-+
-+/*
-+ * Attach the domain 'sd' to 'cpu' as its base domain. Callers must
-+ * hold the hotplug lock.
-+ */
-+static void
-+cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu)
-+{
-+ struct rq *rq = cpu_rq(cpu);
-+ struct sched_domain *tmp;
-+
-+ /* Remove the sched domains which do not contribute to scheduling. */
-+ for (tmp = sd; tmp; ) {
-+ struct sched_domain *parent = tmp->parent;
-+ if (!parent)
-+ break;
-+
-+ if (sd_parent_degenerate(tmp, parent)) {
-+ tmp->parent = parent->parent;
-+ if (parent->parent)
-+ parent->parent->child = tmp;
-+ } else
-+ tmp = tmp->parent;
-+ }
-+
-+ if (sd && sd_degenerate(sd)) {
-+ sd = sd->parent;
-+ if (sd)
-+ sd->child = NULL;
-+ }
-+
-+ sched_domain_debug(sd, cpu);
-+
-+ rq_attach_root(rq, rd);
-+ rcu_assign_pointer(rq->sd, sd);
-+}
-+
-+/* cpus with isolated domains */
-+static cpumask_var_t cpu_isolated_map;
-+
-+/* Setup the mask of cpus configured for isolated domains */
-+static int __init isolated_cpu_setup(char *str)
-+{
-+ cpulist_parse(str, cpu_isolated_map);
-+ return 1;
-+}
-+
-+__setup("isolcpus=", isolated_cpu_setup);
-+
-+/*
-+ * init_sched_build_groups takes the cpumask we wish to span, and a pointer
-+ * to a function which identifies what group(along with sched group) a CPU
-+ * belongs to. The return value of group_fn must be a >= 0 and < nr_cpu_ids
-+ * (due to the fact that we keep track of groups covered with a struct cpumask).
-+ *
-+ * init_sched_build_groups will build a circular linked list of the groups
-+ * covered by the given span, and will set each group's ->cpumask correctly,
-+ * and ->cpu_power to 0.
-+ */
-+static void
-+init_sched_build_groups(const struct cpumask *span,
-+ const struct cpumask *cpu_map,
-+ int (*group_fn)(int cpu, const struct cpumask *cpu_map,
-+ struct sched_group **sg,
-+ struct cpumask *tmpmask),
-+ struct cpumask *covered, struct cpumask *tmpmask)
-+{
-+ struct sched_group *first = NULL, *last = NULL;
-+ int i;
-+
-+ cpumask_clear(covered);
-+
-+ for_each_cpu(i, span) {
-+ struct sched_group *sg;
-+ int group = group_fn(i, cpu_map, &sg, tmpmask);
-+ int j;
-+
-+ if (cpumask_test_cpu(i, covered))
-+ continue;
-+
-+ cpumask_clear(sched_group_cpus(sg));
-+ sg->__cpu_power = 0;
-+
-+ for_each_cpu(j, span) {
-+ if (group_fn(j, cpu_map, NULL, tmpmask) != group)
-+ continue;
-+
-+ cpumask_set_cpu(j, covered);
-+ cpumask_set_cpu(j, sched_group_cpus(sg));
-+ }
-+ if (!first)
-+ first = sg;
-+ if (last)
-+ last->next = sg;
-+ last = sg;
-+ }
-+ last->next = first;
-+}
-+
-+#define SD_NODES_PER_DOMAIN 16
-+
-+#ifdef CONFIG_NUMA
-+
-+/**
-+ * find_next_best_node - find the next node to include in a sched_domain
-+ * @node: node whose sched_domain we're building
-+ * @used_nodes: nodes already in the sched_domain
-+ *
-+ * Find the next node to include in a given scheduling domain. Simply
-+ * finds the closest node not already in the @used_nodes map.
-+ *
-+ * Should use nodemask_t.
-+ */
-+static int find_next_best_node(int node, nodemask_t *used_nodes)
-+{
-+ int i, n, val, min_val, best_node = 0;
-+
-+ min_val = INT_MAX;
-+
-+ for (i = 0; i < nr_node_ids; i++) {
-+ /* Start at @node */
-+ n = (node + i) % nr_node_ids;
-+
-+ if (!nr_cpus_node(n))
-+ continue;
-+
-+ /* Skip already used nodes */
-+ if (node_isset(n, *used_nodes))
-+ continue;
-+
-+ /* Simple min distance search */
-+ val = node_distance(node, n);
-+
-+ if (val < min_val) {
-+ min_val = val;
-+ best_node = n;
-+ }
-+ }
-+
-+ node_set(best_node, *used_nodes);
-+ return best_node;
-+}
-+
-+/**
-+ * sched_domain_node_span - get a cpumask for a node's sched_domain
-+ * @node: node whose cpumask we're constructing
-+ * @span: resulting cpumask
-+ *
-+ * Given a node, construct a good cpumask for its sched_domain to span. It
-+ * should be one that prevents unnecessary balancing, but also spreads tasks
-+ * out optimally.
-+ */
-+static void sched_domain_node_span(int node, struct cpumask *span)
-+{
-+ nodemask_t used_nodes;
-+ int i;
-+
-+ cpumask_clear(span);
-+ nodes_clear(used_nodes);
-+
-+ cpumask_or(span, span, cpumask_of_node(node));
-+ node_set(node, used_nodes);
-+
-+ for (i = 1; i < SD_NODES_PER_DOMAIN; i++) {
-+ int next_node = find_next_best_node(node, &used_nodes);
-+
-+ cpumask_or(span, span, cpumask_of_node(next_node));
-+ }
-+}
-+#endif /* CONFIG_NUMA */
-+
-+int sched_smt_power_savings = 0, sched_mc_power_savings = 0;
-+
-+/*
-+ * The cpus mask in sched_group and sched_domain hangs off the end.
-+ *
-+ * ( See the the comments in include/linux/sched.h:struct sched_group
-+ * and struct sched_domain. )
-+ */
-+struct static_sched_group {
-+ struct sched_group sg;
-+ DECLARE_BITMAP(cpus, CONFIG_NR_CPUS);
-+};
-+
-+struct static_sched_domain {
-+ struct sched_domain sd;
-+ DECLARE_BITMAP(span, CONFIG_NR_CPUS);
-+};
-+
-+/*
-+ * SMT sched-domains:
-+ */
-+#ifdef CONFIG_SCHED_SMT
-+static DEFINE_PER_CPU(struct static_sched_domain, cpu_domains);
-+static DEFINE_PER_CPU(struct static_sched_group, sched_group_cpus);
-+
-+static int
-+cpu_to_cpu_group(int cpu, const struct cpumask *cpu_map,
-+ struct sched_group **sg, struct cpumask *unused)
-+{
-+ if (sg)
-+ *sg = &per_cpu(sched_group_cpus, cpu).sg;
-+ return cpu;
-+}
-+#endif /* CONFIG_SCHED_SMT */
-+
-+/*
-+ * multi-core sched-domains:
-+ */
-+#ifdef CONFIG_SCHED_MC
-+static DEFINE_PER_CPU(struct static_sched_domain, core_domains);
-+static DEFINE_PER_CPU(struct static_sched_group, sched_group_core);
-+#endif /* CONFIG_SCHED_MC */
-+
-+#if defined(CONFIG_SCHED_MC) && defined(CONFIG_SCHED_SMT)
-+static int
-+cpu_to_core_group(int cpu, const struct cpumask *cpu_map,
-+ struct sched_group **sg, struct cpumask *mask)
-+{
-+ int group;
-+
-+ cpumask_and(mask, topology_thread_cpumask(cpu), cpu_map);
-+ group = cpumask_first(mask);
-+ if (sg)
-+ *sg = &per_cpu(sched_group_core, group).sg;
-+ return group;
-+}
-+#elif defined(CONFIG_SCHED_MC)
-+static int
-+cpu_to_core_group(int cpu, const struct cpumask *cpu_map,
-+ struct sched_group **sg, struct cpumask *unused)
-+{
-+ if (sg)
-+ *sg = &per_cpu(sched_group_core, cpu).sg;
-+ return cpu;
-+}
-+#endif
-+
-+static DEFINE_PER_CPU(struct static_sched_domain, phys_domains);
-+static DEFINE_PER_CPU(struct static_sched_group, sched_group_phys);
-+
-+static int
-+cpu_to_phys_group(int cpu, const struct cpumask *cpu_map,
-+ struct sched_group **sg, struct cpumask *mask)
-+{
-+ int group;
-+#ifdef CONFIG_SCHED_MC
-+ cpumask_and(mask, cpu_coregroup_mask(cpu), cpu_map);
-+ group = cpumask_first(mask);
-+#elif defined(CONFIG_SCHED_SMT)
-+ cpumask_and(mask, topology_thread_cpumask(cpu), cpu_map);
-+ group = cpumask_first(mask);
-+#else
-+ group = cpu;
-+#endif
-+ if (sg)
-+ *sg = &per_cpu(sched_group_phys, group).sg;
-+ return group;
-+}
-+
-+/**
-+ * group_first_cpu - Returns the first cpu in the cpumask of a sched_group.
-+ * @group: The group whose first cpu is to be returned.
-+ */
-+static inline unsigned int group_first_cpu(struct sched_group *group)
-+{
-+ return cpumask_first(sched_group_cpus(group));
-+}
-+
-+#ifdef CONFIG_NUMA
-+/*
-+ * The init_sched_build_groups can't handle what we want to do with node
-+ * groups, so roll our own. Now each node has its own list of groups which
-+ * gets dynamically allocated.
-+ */
-+static DEFINE_PER_CPU(struct static_sched_domain, node_domains);
-+static struct sched_group ***sched_group_nodes_bycpu;
-+
-+static DEFINE_PER_CPU(struct static_sched_domain, allnodes_domains);
-+static DEFINE_PER_CPU(struct static_sched_group, sched_group_allnodes);
-+
-+static int cpu_to_allnodes_group(int cpu, const struct cpumask *cpu_map,
-+ struct sched_group **sg,
-+ struct cpumask *nodemask)
-+{
-+ int group;
-+
-+ cpumask_and(nodemask, cpumask_of_node(cpu_to_node(cpu)), cpu_map);
-+ group = cpumask_first(nodemask);
-+
-+ if (sg)
-+ *sg = &per_cpu(sched_group_allnodes, group).sg;
-+ return group;
-+}
-+
-+static void init_numa_sched_groups_power(struct sched_group *group_head)
-+{
-+ struct sched_group *sg = group_head;
-+ int j;
-+
-+ if (!sg)
-+ return;
-+ do {
-+ for_each_cpu(j, sched_group_cpus(sg)) {
-+ struct sched_domain *sd;
-+
-+ sd = &per_cpu(phys_domains, j).sd;
-+ if (j != group_first_cpu(sd->groups)) {
-+ /*
-+ * Only add "power" once for each
-+ * physical package.
-+ */
-+ continue;
-+ }
-+
-+ sg_inc_cpu_power(sg, sd->groups->__cpu_power);
-+ }
-+ sg = sg->next;
-+ } while (sg != group_head);
-+}
-+#endif /* CONFIG_NUMA */
-+
-+#ifdef CONFIG_NUMA
-+/* Free memory allocated for various sched_group structures */
-+static void free_sched_groups(const struct cpumask *cpu_map,
-+ struct cpumask *nodemask)
-+{
-+ int cpu, i;
-+
-+ for_each_cpu(cpu, cpu_map) {
-+ struct sched_group **sched_group_nodes
-+ = sched_group_nodes_bycpu[cpu];
-+
-+ if (!sched_group_nodes)
-+ continue;
-+
-+ for (i = 0; i < nr_node_ids; i++) {
-+ struct sched_group *oldsg, *sg = sched_group_nodes[i];
-+
-+ cpumask_and(nodemask, cpumask_of_node(i), cpu_map);
-+ if (cpumask_empty(nodemask))
-+ continue;
-+
-+ if (sg == NULL)
-+ continue;
-+ sg = sg->next;
-+next_sg:
-+ oldsg = sg;
-+ sg = sg->next;
-+ kfree(oldsg);
-+ if (oldsg != sched_group_nodes[i])
-+ goto next_sg;
-+ }
-+ kfree(sched_group_nodes);
-+ sched_group_nodes_bycpu[cpu] = NULL;
-+ }
-+}
-+#else /* !CONFIG_NUMA */
-+static void free_sched_groups(const struct cpumask *cpu_map,
-+ struct cpumask *nodemask)
-+{
-+}
-+#endif /* CONFIG_NUMA */
-+
-+/*
-+ * Initialize sched groups cpu_power.
-+ *
-+ * cpu_power indicates the capacity of sched group, which is used while
-+ * distributing the load between different sched groups in a sched domain.
-+ * Typically cpu_power for all the groups in a sched domain will be same unless
-+ * there are asymmetries in the topology. If there are asymmetries, group
-+ * having more cpu_power will pickup more load compared to the group having
-+ * less cpu_power.
-+ *
-+ * cpu_power will be a multiple of SCHED_LOAD_SCALE. This multiple represents
-+ * the maximum number of tasks a group can handle in the presence of other idle
-+ * or lightly loaded groups in the same sched domain.
-+ */
-+static void init_sched_groups_power(int cpu, struct sched_domain *sd)
-+{
-+ struct sched_domain *child;
-+ struct sched_group *group;
-+
-+ WARN_ON(!sd || !sd->groups);
-+
-+ if (cpu != group_first_cpu(sd->groups))
-+ return;
-+
-+ child = sd->child;
-+
-+ sd->groups->__cpu_power = 0;
-+
-+ /*
-+ * For perf policy, if the groups in child domain share resources
-+ * (for example cores sharing some portions of the cache hierarchy
-+ * or SMT), then set this domain groups cpu_power such that each group
-+ * can handle only one task, when there are other idle groups in the
-+ * same sched domain.
-+ */
-+ if (!child || (!(sd->flags & SD_POWERSAVINGS_BALANCE) &&
-+ (child->flags &
-+ (SD_SHARE_CPUPOWER | SD_SHARE_PKG_RESOURCES)))) {
-+ sg_inc_cpu_power(sd->groups, SCHED_LOAD_SCALE);
-+ return;
-+ }
-+
-+ /*
-+ * add cpu_power of each child group to this groups cpu_power
-+ */
-+ group = child->groups;
-+ do {
-+ sg_inc_cpu_power(sd->groups, group->__cpu_power);
-+ group = group->next;
-+ } while (group != child->groups);
-+}
-+
-+/*
-+ * Initializers for schedule domains
-+ * Non-inlined to reduce accumulated stack pressure in build_sched_domains()
-+ */
-+
-+#ifdef CONFIG_SCHED_DEBUG
-+# define SD_INIT_NAME(sd, type) sd->name = #type
-+#else
-+# define SD_INIT_NAME(sd, type) do { } while (0)
-+#endif
-+
-+#define SD_INIT(sd, type) sd_init_##type(sd)
-+
-+#define SD_INIT_FUNC(type) \
-+static noinline void sd_init_##type(struct sched_domain *sd) \
-+{ \
-+ memset(sd, 0, sizeof(*sd)); \
-+ *sd = SD_##type##_INIT; \
-+ sd->level = SD_LV_##type; \
-+ SD_INIT_NAME(sd, type); \
-+}
-+
-+SD_INIT_FUNC(CPU)
-+#ifdef CONFIG_NUMA
-+ SD_INIT_FUNC(ALLNODES)
-+ SD_INIT_FUNC(NODE)
-+#endif
-+#ifdef CONFIG_SCHED_SMT
-+ SD_INIT_FUNC(SIBLING)
-+#endif
-+#ifdef CONFIG_SCHED_MC
-+ SD_INIT_FUNC(MC)
-+#endif
-+
-+static int default_relax_domain_level = -1;
-+
-+static int __init setup_relax_domain_level(char *str)
-+{
-+ unsigned long val;
-+
-+ val = simple_strtoul(str, NULL, 0);
-+ if (val < SD_LV_MAX)
-+ default_relax_domain_level = val;
-+
-+ return 1;
-+}
-+__setup("relax_domain_level=", setup_relax_domain_level);
-+
-+static void set_domain_attribute(struct sched_domain *sd,
-+ struct sched_domain_attr *attr)
-+{
-+ int request;
-+
-+ if (!attr || attr->relax_domain_level < 0) {
-+ if (default_relax_domain_level < 0)
-+ return;
-+ else
-+ request = default_relax_domain_level;
-+ } else
-+ request = attr->relax_domain_level;
-+ if (request < sd->level) {
-+ /* turn off idle balance on this domain */
-+ sd->flags &= ~(SD_WAKE_IDLE|SD_BALANCE_NEWIDLE);
-+ } else {
-+ /* turn on idle balance on this domain */
-+ sd->flags |= (SD_WAKE_IDLE_FAR|SD_BALANCE_NEWIDLE);
-+ }
-+}
-+
-+/*
-+ * Build sched domains for a given set of cpus and attach the sched domains
-+ * to the individual cpus
-+ */
-+static int __build_sched_domains(const struct cpumask *cpu_map,
-+ struct sched_domain_attr *attr)
-+{
-+ int i, err = -ENOMEM;
-+ struct root_domain *rd;
-+ cpumask_var_t nodemask, this_sibling_map, this_core_map, send_covered,
-+ tmpmask;
-+#ifdef CONFIG_NUMA
-+ cpumask_var_t domainspan, covered, notcovered;
-+ struct sched_group **sched_group_nodes = NULL;
-+ int sd_allnodes = 0;
-+
-+ if (!alloc_cpumask_var(&domainspan, GFP_KERNEL))
-+ goto out;
-+ if (!alloc_cpumask_var(&covered, GFP_KERNEL))
-+ goto free_domainspan;
-+ if (!alloc_cpumask_var(¬covered, GFP_KERNEL))
-+ goto free_covered;
-+#endif
-+
-+ if (!alloc_cpumask_var(&nodemask, GFP_KERNEL))
-+ goto free_notcovered;
-+ if (!alloc_cpumask_var(&this_sibling_map, GFP_KERNEL))
-+ goto free_nodemask;
-+ if (!alloc_cpumask_var(&this_core_map, GFP_KERNEL))
-+ goto free_this_sibling_map;
-+ if (!alloc_cpumask_var(&send_covered, GFP_KERNEL))
-+ goto free_this_core_map;
-+ if (!alloc_cpumask_var(&tmpmask, GFP_KERNEL))
-+ goto free_send_covered;
-+
-+#ifdef CONFIG_NUMA
-+ /*
-+ * Allocate the per-node list of sched groups
-+ */
-+ sched_group_nodes = kcalloc(nr_node_ids, sizeof(struct sched_group *),
-+ GFP_KERNEL);
-+ if (!sched_group_nodes) {
-+ printk(KERN_WARNING "Can not alloc sched group node list\n");
-+ goto free_tmpmask;
-+ }
-+#endif
-+
-+ rd = alloc_rootdomain();
-+ if (!rd) {
-+ printk(KERN_WARNING "Cannot alloc root domain\n");
-+ goto free_sched_groups;
-+ }
-+
-+#ifdef CONFIG_NUMA
-+ sched_group_nodes_bycpu[cpumask_first(cpu_map)] = sched_group_nodes;
-+#endif
-+
-+ /*
-+ * Set up domains for cpus specified by the cpu_map.
-+ */
-+ for_each_cpu(i, cpu_map) {
-+ struct sched_domain *sd = NULL, *p;
-+
-+ cpumask_and(nodemask, cpumask_of_node(cpu_to_node(i)), cpu_map);
-+
-+#ifdef CONFIG_NUMA
-+ if (cpumask_weight(cpu_map) >
-+ SD_NODES_PER_DOMAIN*cpumask_weight(nodemask)) {
-+ sd = &per_cpu(allnodes_domains, i).sd;
-+ SD_INIT(sd, ALLNODES);
-+ set_domain_attribute(sd, attr);
-+ cpumask_copy(sched_domain_span(sd), cpu_map);
-+ cpu_to_allnodes_group(i, cpu_map, &sd->groups, tmpmask);
-+ p = sd;
-+ sd_allnodes = 1;
-+ } else
-+ p = NULL;
-+
-+ sd = &per_cpu(node_domains, i).sd;
-+ SD_INIT(sd, NODE);
-+ set_domain_attribute(sd, attr);
-+ sched_domain_node_span(cpu_to_node(i), sched_domain_span(sd));
-+ sd->parent = p;
-+ if (p)
-+ p->child = sd;
-+ cpumask_and(sched_domain_span(sd),
-+ sched_domain_span(sd), cpu_map);
-+#endif
-+
-+ p = sd;
-+ sd = &per_cpu(phys_domains, i).sd;
-+ SD_INIT(sd, CPU);
-+ set_domain_attribute(sd, attr);
-+ cpumask_copy(sched_domain_span(sd), nodemask);
-+ sd->parent = p;
-+ if (p)
-+ p->child = sd;
-+ cpu_to_phys_group(i, cpu_map, &sd->groups, tmpmask);
-+
-+#ifdef CONFIG_SCHED_MC
-+ p = sd;
-+ sd = &per_cpu(core_domains, i).sd;
-+ SD_INIT(sd, MC);
-+ set_domain_attribute(sd, attr);
-+ cpumask_and(sched_domain_span(sd), cpu_map,
-+ cpu_coregroup_mask(i));
-+ sd->parent = p;
-+ p->child = sd;
-+ cpu_to_core_group(i, cpu_map, &sd->groups, tmpmask);
-+#endif
-+
-+#ifdef CONFIG_SCHED_SMT
-+ p = sd;
-+ sd = &per_cpu(cpu_domains, i).sd;
-+ SD_INIT(sd, SIBLING);
-+ set_domain_attribute(sd, attr);
-+ cpumask_and(sched_domain_span(sd),
-+ topology_thread_cpumask(i), cpu_map);
-+ sd->parent = p;
-+ p->child = sd;
-+ cpu_to_cpu_group(i, cpu_map, &sd->groups, tmpmask);
-+#endif
-+ }
-+
-+#ifdef CONFIG_SCHED_SMT
-+ /* Set up CPU (sibling) groups */
-+ for_each_cpu(i, cpu_map) {
-+ cpumask_and(this_sibling_map,
-+ topology_thread_cpumask(i), cpu_map);
-+ if (i != cpumask_first(this_sibling_map))
-+ continue;
-+
-+ init_sched_build_groups(this_sibling_map, cpu_map,
-+ &cpu_to_cpu_group,
-+ send_covered, tmpmask);
-+ }
-+#endif
-+
-+#ifdef CONFIG_SCHED_MC
-+ /* Set up multi-core groups */
-+ for_each_cpu(i, cpu_map) {
-+ cpumask_and(this_core_map, cpu_coregroup_mask(i), cpu_map);
-+ if (i != cpumask_first(this_core_map))
-+ continue;
-+
-+ init_sched_build_groups(this_core_map, cpu_map,
-+ &cpu_to_core_group,
-+ send_covered, tmpmask);
-+ }
-+#endif
-+
-+ /* Set up physical groups */
-+ for (i = 0; i < nr_node_ids; i++) {
-+ cpumask_and(nodemask, cpumask_of_node(i), cpu_map);
-+ if (cpumask_empty(nodemask))
-+ continue;
-+
-+ init_sched_build_groups(nodemask, cpu_map,
-+ &cpu_to_phys_group,
-+ send_covered, tmpmask);
-+ }
-+
-+#ifdef CONFIG_NUMA
-+ /* Set up node groups */
-+ if (sd_allnodes) {
-+ init_sched_build_groups(cpu_map, cpu_map,
-+ &cpu_to_allnodes_group,
-+ send_covered, tmpmask);
-+ }
-+
-+ for (i = 0; i < nr_node_ids; i++) {
-+ /* Set up node groups */
-+ struct sched_group *sg, *prev;
-+ int j;
-+
-+ cpumask_clear(covered);
-+ cpumask_and(nodemask, cpumask_of_node(i), cpu_map);
-+ if (cpumask_empty(nodemask)) {
-+ sched_group_nodes[i] = NULL;
-+ continue;
-+ }
-+
-+ sched_domain_node_span(i, domainspan);
-+ cpumask_and(domainspan, domainspan, cpu_map);
-+
-+ sg = kmalloc_node(sizeof(struct sched_group) + cpumask_size(),
-+ GFP_KERNEL, i);
-+ if (!sg) {
-+ printk(KERN_WARNING "Can not alloc domain group for "
-+ "node %d\n", i);
-+ goto error;
-+ }
-+ sched_group_nodes[i] = sg;
-+ for_each_cpu(j, nodemask) {
-+ struct sched_domain *sd;
-+
-+ sd = &per_cpu(node_domains, j).sd;
-+ sd->groups = sg;
-+ }
-+ sg->__cpu_power = 0;
-+ cpumask_copy(sched_group_cpus(sg), nodemask);
-+ sg->next = sg;
-+ cpumask_or(covered, covered, nodemask);
-+ prev = sg;
-+
-+ for (j = 0; j < nr_node_ids; j++) {
-+ int n = (i + j) % nr_node_ids;
-+
-+ cpumask_complement(notcovered, covered);
-+ cpumask_and(tmpmask, notcovered, cpu_map);
-+ cpumask_and(tmpmask, tmpmask, domainspan);
-+ if (cpumask_empty(tmpmask))
-+ break;
-+
-+ cpumask_and(tmpmask, tmpmask, cpumask_of_node(n));
-+ if (cpumask_empty(tmpmask))
-+ continue;
-+
-+ sg = kmalloc_node(sizeof(struct sched_group) +
-+ cpumask_size(),
-+ GFP_KERNEL, i);
-+ if (!sg) {
-+ printk(KERN_WARNING
-+ "Can not alloc domain group for node %d\n", j);
-+ goto error;
-+ }
-+ sg->__cpu_power = 0;
-+ cpumask_copy(sched_group_cpus(sg), tmpmask);
-+ sg->next = prev->next;
-+ cpumask_or(covered, covered, tmpmask);
-+ prev->next = sg;
-+ prev = sg;
-+ }
-+ }
-+#endif
-+
-+ /* Calculate CPU power for physical packages and nodes */
-+#ifdef CONFIG_SCHED_SMT
-+ for_each_cpu(i, cpu_map) {
-+ struct sched_domain *sd = &per_cpu(cpu_domains, i).sd;
-+
-+ init_sched_groups_power(i, sd);
-+ }
-+#endif
-+#ifdef CONFIG_SCHED_MC
-+ for_each_cpu(i, cpu_map) {
-+ struct sched_domain *sd = &per_cpu(core_domains, i).sd;
-+
-+ init_sched_groups_power(i, sd);
-+ }
-+#endif
-+
-+ for_each_cpu(i, cpu_map) {
-+ struct sched_domain *sd = &per_cpu(phys_domains, i).sd;
-+
-+ init_sched_groups_power(i, sd);
-+ }
-+
-+#ifdef CONFIG_NUMA
-+ for (i = 0; i < nr_node_ids; i++)
-+ init_numa_sched_groups_power(sched_group_nodes[i]);
-+
-+ if (sd_allnodes) {
-+ struct sched_group *sg;
-+
-+ cpu_to_allnodes_group(cpumask_first(cpu_map), cpu_map, &sg,
-+ tmpmask);
-+ init_numa_sched_groups_power(sg);
-+ }
-+#endif
-+
-+ /* Attach the domains */
-+ for_each_cpu(i, cpu_map) {
-+ struct sched_domain *sd;
-+#ifdef CONFIG_SCHED_SMT
-+ sd = &per_cpu(cpu_domains, i).sd;
-+#elif defined(CONFIG_SCHED_MC)
-+ sd = &per_cpu(core_domains, i).sd;
-+#else
-+ sd = &per_cpu(phys_domains, i).sd;
-+#endif
-+ cpu_attach_domain(sd, rd, i);
-+ }
-+
-+ err = 0;
-+
-+free_tmpmask:
-+ free_cpumask_var(tmpmask);
-+free_send_covered:
-+ free_cpumask_var(send_covered);
-+free_this_core_map:
-+ free_cpumask_var(this_core_map);
-+free_this_sibling_map:
-+ free_cpumask_var(this_sibling_map);
-+free_nodemask:
-+ free_cpumask_var(nodemask);
-+free_notcovered:
-+#ifdef CONFIG_NUMA
-+ free_cpumask_var(notcovered);
-+free_covered:
-+ free_cpumask_var(covered);
-+free_domainspan:
-+ free_cpumask_var(domainspan);
-+out:
-+#endif
-+ return err;
-+
-+free_sched_groups:
-+#ifdef CONFIG_NUMA
-+ kfree(sched_group_nodes);
-+#endif
-+ goto free_tmpmask;
-+
-+#ifdef CONFIG_NUMA
-+error:
-+ free_sched_groups(cpu_map, tmpmask);
-+ free_rootdomain(rd);
-+ goto free_tmpmask;
-+#endif
-+}
-+
-+static int build_sched_domains(const struct cpumask *cpu_map)
-+{
-+ return __build_sched_domains(cpu_map, NULL);
-+}
-+
-+static struct cpumask *doms_cur; /* current sched domains */
-+static int ndoms_cur; /* number of sched domains in 'doms_cur' */
-+static struct sched_domain_attr *dattr_cur;
-+ /* attribues of custom domains in 'doms_cur' */
-+
-+/*
-+ * Special case: If a kmalloc of a doms_cur partition (array of
-+ * cpumask) fails, then fallback to a single sched domain,
-+ * as determined by the single cpumask fallback_doms.
-+ */
-+static cpumask_var_t fallback_doms;
-+
-+/*
-+ * arch_update_cpu_topology lets virtualized architectures update the
-+ * cpu core maps. It is supposed to return 1 if the topology changed
-+ * or 0 if it stayed the same.
-+ */
-+int __attribute__((weak)) arch_update_cpu_topology(void)
-+{
-+ return 0;
-+}
-+
-+/*
-+ * Set up scheduler domains and groups. Callers must hold the hotplug lock.
-+ * For now this just excludes isolated cpus, but could be used to
-+ * exclude other special cases in the future.
-+ */
-+static int arch_init_sched_domains(const struct cpumask *cpu_map)
-+{
-+ int err;
-+
-+ arch_update_cpu_topology();
-+ ndoms_cur = 1;
-+ doms_cur = kmalloc(cpumask_size(), GFP_KERNEL);
-+ if (!doms_cur)
-+ doms_cur = fallback_doms;
-+ cpumask_andnot(doms_cur, cpu_map, cpu_isolated_map);
-+ dattr_cur = NULL;
-+ err = build_sched_domains(doms_cur);
-+ register_sched_domain_sysctl();
-+
-+ return err;
-+}
-+
-+static void arch_destroy_sched_domains(const struct cpumask *cpu_map,
-+ struct cpumask *tmpmask)
-+{
-+ free_sched_groups(cpu_map, tmpmask);
-+}
-+
-+/*
-+ * Detach sched domains from a group of cpus specified in cpu_map
-+ * These cpus will now be attached to the NULL domain
-+ */
-+static void detach_destroy_domains(const struct cpumask *cpu_map)
-+{
-+ /* Save because hotplug lock held. */
-+ static DECLARE_BITMAP(tmpmask, CONFIG_NR_CPUS);
-+ int i;
-+
-+ for_each_cpu(i, cpu_map)
-+ cpu_attach_domain(NULL, &def_root_domain, i);
-+ synchronize_sched();
-+ arch_destroy_sched_domains(cpu_map, to_cpumask(tmpmask));
-+}
-+
-+/* handle null as "default" */
-+static int dattrs_equal(struct sched_domain_attr *cur, int idx_cur,
-+ struct sched_domain_attr *new, int idx_new)
-+{
-+ struct sched_domain_attr tmp;
-+
-+ /* fast path */
-+ if (!new && !cur)
-+ return 1;
-+
-+ tmp = SD_ATTR_INIT;
-+ return !memcmp(cur ? (cur + idx_cur) : &tmp,
-+ new ? (new + idx_new) : &tmp,
-+ sizeof(struct sched_domain_attr));
-+}
-+
-+/*
-+ * Partition sched domains as specified by the 'ndoms_new'
-+ * cpumasks in the array doms_new[] of cpumasks. This compares
-+ * doms_new[] to the current sched domain partitioning, doms_cur[].
-+ * It destroys each deleted domain and builds each new domain.
-+ *
-+ * 'doms_new' is an array of cpumask's of length 'ndoms_new'.
-+ * The masks don't intersect (don't overlap.) We should setup one
-+ * sched domain for each mask. CPUs not in any of the cpumasks will
-+ * not be load balanced. If the same cpumask appears both in the
-+ * current 'doms_cur' domains and in the new 'doms_new', we can leave
-+ * it as it is.
-+ *
-+ * The passed in 'doms_new' should be kmalloc'd. This routine takes
-+ * ownership of it and will kfree it when done with it. If the caller
-+ * failed the kmalloc call, then it can pass in doms_new == NULL &&
-+ * ndoms_new == 1, and partition_sched_domains() will fallback to
-+ * the single partition 'fallback_doms', it also forces the domains
-+ * to be rebuilt.
-+ *
-+ * If doms_new == NULL it will be replaced with cpu_online_mask.
-+ * ndoms_new == 0 is a special case for destroying existing domains,
-+ * and it will not create the default domain.
-+ *
-+ * Call with hotplug lock held
-+ */
-+/* FIXME: Change to struct cpumask *doms_new[] */
-+void partition_sched_domains(int ndoms_new, struct cpumask *doms_new,
-+ struct sched_domain_attr *dattr_new)
-+{
-+ int i, j, n;
-+ int new_topology;
-+
-+ mutex_lock(&sched_domains_mutex);
-+
-+ /* always unregister in case we don't destroy any domains */
-+ unregister_sched_domain_sysctl();
-+
-+ /* Let architecture update cpu core mappings. */
-+ new_topology = arch_update_cpu_topology();
-+
-+ n = doms_new ? ndoms_new : 0;
-+
-+ /* Destroy deleted domains */
-+ for (i = 0; i < ndoms_cur; i++) {
-+ for (j = 0; j < n && !new_topology; j++) {
-+ if (cpumask_equal(&doms_cur[i], &doms_new[j])
-+ && dattrs_equal(dattr_cur, i, dattr_new, j))
-+ goto match1;
-+ }
-+ /* no match - a current sched domain not in new doms_new[] */
-+ detach_destroy_domains(doms_cur + i);
-+match1:
-+ ;
-+ }
-+
-+ if (doms_new == NULL) {
-+ ndoms_cur = 0;
-+ doms_new = fallback_doms;
-+ cpumask_andnot(&doms_new[0], cpu_online_mask, cpu_isolated_map);
-+ WARN_ON_ONCE(dattr_new);
-+ }
-+
-+ /* Build new domains */
-+ for (i = 0; i < ndoms_new; i++) {
-+ for (j = 0; j < ndoms_cur && !new_topology; j++) {
-+ if (cpumask_equal(&doms_new[i], &doms_cur[j])
-+ && dattrs_equal(dattr_new, i, dattr_cur, j))
-+ goto match2;
-+ }
-+ /* no match - add a new doms_new */
-+ __build_sched_domains(doms_new + i,
-+ dattr_new ? dattr_new + i : NULL);
-+match2:
-+ ;
-+ }
-+
-+ /* Remember the new sched domains */
-+ if (doms_cur != fallback_doms)
-+ kfree(doms_cur);
-+ kfree(dattr_cur); /* kfree(NULL) is safe */
-+ doms_cur = doms_new;
-+ dattr_cur = dattr_new;
-+ ndoms_cur = ndoms_new;
-+
-+ register_sched_domain_sysctl();
-+
-+ mutex_unlock(&sched_domains_mutex);
-+}
-+
-+#if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT)
-+static void arch_reinit_sched_domains(void)
-+{
-+ get_online_cpus();
-+
-+ /* Destroy domains first to force the rebuild */
-+ partition_sched_domains(0, NULL, NULL);
-+
-+ rebuild_sched_domains();
-+ put_online_cpus();
-+}
-+
-+static ssize_t sched_power_savings_store(const char *buf, size_t count, int smt)
-+{
-+ unsigned int level = 0;
-+
-+ if (sscanf(buf, "%u", &level) != 1)
-+ return -EINVAL;
-+
-+ /*
-+ * level is always be positive so don't check for
-+ * level < POWERSAVINGS_BALANCE_NONE which is 0
-+ * What happens on 0 or 1 byte write,
-+ * need to check for count as well?
-+ */
-+
-+ if (level >= MAX_POWERSAVINGS_BALANCE_LEVELS)
-+ return -EINVAL;
-+
-+ if (smt)
-+ sched_smt_power_savings = level;
-+ else
-+ sched_mc_power_savings = level;
-+
-+ arch_reinit_sched_domains();
-+
-+ return count;
-+}
-+
-+#ifdef CONFIG_SCHED_MC
-+static ssize_t sched_mc_power_savings_show(struct sysdev_class *class,
-+ char *page)
-+{
-+ return sprintf(page, "%u\n", sched_mc_power_savings);
-+}
-+static ssize_t sched_mc_power_savings_store(struct sysdev_class *class,
-+ const char *buf, size_t count)
-+{
-+ return sched_power_savings_store(buf, count, 0);
-+}
-+static SYSDEV_CLASS_ATTR(sched_mc_power_savings, 0644,
-+ sched_mc_power_savings_show,
-+ sched_mc_power_savings_store);
-+#endif
-+
-+#ifdef CONFIG_SCHED_SMT
-+static ssize_t sched_smt_power_savings_show(struct sysdev_class *dev,
-+ char *page)
-+{
-+ return sprintf(page, "%u\n", sched_smt_power_savings);
-+}
-+static ssize_t sched_smt_power_savings_store(struct sysdev_class *dev,
-+ const char *buf, size_t count)
-+{
-+ return sched_power_savings_store(buf, count, 1);
-+}
-+static SYSDEV_CLASS_ATTR(sched_smt_power_savings, 0644,
-+ sched_smt_power_savings_show,
-+ sched_smt_power_savings_store);
-+#endif
-+
-+int __init sched_create_sysfs_power_savings_entries(struct sysdev_class *cls)
-+{
-+ int err = 0;
-+
-+#ifdef CONFIG_SCHED_SMT
-+ if (smt_capable())
-+ err = sysfs_create_file(&cls->kset.kobj,
-+ &attr_sched_smt_power_savings.attr);
-+#endif
-+#ifdef CONFIG_SCHED_MC
-+ if (!err && mc_capable())
-+ err = sysfs_create_file(&cls->kset.kobj,
-+ &attr_sched_mc_power_savings.attr);
-+#endif
-+ return err;
-+}
-+#endif /* CONFIG_SCHED_MC || CONFIG_SCHED_SMT */
-+
-+#ifndef CONFIG_CPUSETS
-+/*
-+ * Add online and remove offline CPUs from the scheduler domains.
-+ * When cpusets are enabled they take over this function.
-+ */
-+static int update_sched_domains(struct notifier_block *nfb,
-+ unsigned long action, void *hcpu)
-+{
-+ switch (action) {
-+ case CPU_ONLINE:
-+ case CPU_ONLINE_FROZEN:
-+ case CPU_DEAD:
-+ case CPU_DEAD_FROZEN:
-+ partition_sched_domains(1, NULL, NULL);
-+ return NOTIFY_OK;
-+
-+ default:
-+ return NOTIFY_DONE;
-+ }
-+}
-+#endif
-+
-+static int update_runtime(struct notifier_block *nfb,
-+ unsigned long action, void *hcpu)
-+{
-+ switch (action) {
-+ case CPU_DOWN_PREPARE:
-+ case CPU_DOWN_PREPARE_FROZEN:
-+ return NOTIFY_OK;
-+
-+ case CPU_DOWN_FAILED:
-+ case CPU_DOWN_FAILED_FROZEN:
-+ case CPU_ONLINE:
-+ case CPU_ONLINE_FROZEN:
-+ return NOTIFY_OK;
-+
-+ default:
-+ return NOTIFY_DONE;
-+ }
-+}
-+
-+void __init sched_init_smp(void)
-+{
-+ cpumask_var_t non_isolated_cpus;
-+
-+ alloc_cpumask_var(&non_isolated_cpus, GFP_KERNEL);
-+
-+#if defined(CONFIG_NUMA)
-+ sched_group_nodes_bycpu = kzalloc(nr_cpu_ids * sizeof(void **),
-+ GFP_KERNEL);
-+ BUG_ON(sched_group_nodes_bycpu == NULL);
-+#endif
-+ get_online_cpus();
-+ mutex_lock(&sched_domains_mutex);
-+ arch_init_sched_domains(cpu_online_mask);
-+ cpumask_andnot(non_isolated_cpus, cpu_possible_mask, cpu_isolated_map);
-+ if (cpumask_empty(non_isolated_cpus))
-+ cpumask_set_cpu(smp_processor_id(), non_isolated_cpus);
-+ mutex_unlock(&sched_domains_mutex);
-+ put_online_cpus();
-+
-+#ifndef CONFIG_CPUSETS
-+ /* XXX: Theoretical race here - CPU may be hotplugged now */
-+ hotcpu_notifier(update_sched_domains, 0);
-+#endif
-+
-+ /* RT runtime code needs to handle some hotplug events */
-+ hotcpu_notifier(update_runtime, 0);
-+
-+ /* Move init over to a non-isolated CPU */
-+ if (set_cpus_allowed_ptr(current, non_isolated_cpus) < 0)
-+ BUG();
-+ free_cpumask_var(non_isolated_cpus);
-+
-+ alloc_cpumask_var(&fallback_doms, GFP_KERNEL);
-+
-+ /*
-+ * Assume that every added cpu gives us slightly less overall latency
-+ * allowing us to increase the base rr_interval, but in a non linear
-+ * fashion.
-+ */
-+ rr_interval *= 1 + ilog2(num_online_cpus());
-+}
-+#else
-+void __init sched_init_smp(void)
-+{
-+}
-+#endif /* CONFIG_SMP */
-+
-+unsigned int sysctl_timer_migration = 1;
-+
-+int in_sched_functions(unsigned long addr)
-+{
-+ return in_lock_functions(addr) ||
-+ (addr >= (unsigned long)__sched_text_start
-+ && addr < (unsigned long)__sched_text_end);
-+}
-+
-+void __init sched_init(void)
-+{
-+ int i;
-+ int highest_cpu = 0;
-+
-+ prio_ratios[0] = 100;
-+ for (i = 1 ; i < PRIO_RANGE ; i++)
-+ prio_ratios[i] = prio_ratios[i - 1] * 11 / 10;
-+
-+#ifdef CONFIG_SMP
-+ init_defrootdomain();
-+ cpus_clear(grq.cpu_idle_map);
-+#endif
-+ spin_lock_init(&grq.lock);
-+ for_each_possible_cpu(i) {
-+ struct rq *rq;
-+
-+ rq = cpu_rq(i);
-+ INIT_LIST_HEAD(&rq->queue);
-+ rq->rq_deadline = 0;
-+ rq->rq_prio = 0;
-+ rq->cpu = i;
-+ rq->user_pc = rq->nice_pc = rq->softirq_pc = rq->system_pc =
-+ rq->iowait_pc = rq->idle_pc = 0;
-+#ifdef CONFIG_SMP
-+ rq->sd = NULL;
-+ rq->rd = NULL;
-+ rq->online = 0;
-+ INIT_LIST_HEAD(&rq->migration_queue);
-+ rq_attach_root(rq, &def_root_domain);
-+#endif
-+ atomic_set(&rq->nr_iowait, 0);
-+ highest_cpu = i;
-+ }
-+ grq.iso_ticks = grq.nr_running = grq.nr_uninterruptible = 0;
-+ for (i = 0; i < PRIO_LIMIT; i++)
-+ INIT_LIST_HEAD(grq.queue + i);
-+ bitmap_zero(grq.prio_bitmap, PRIO_LIMIT);
-+ /* delimiter for bitsearch */
-+ __set_bit(PRIO_LIMIT, grq.prio_bitmap);
-+
-+#ifdef CONFIG_SMP
-+ nr_cpu_ids = highest_cpu + 1;
-+#endif
-+
-+#ifdef CONFIG_PREEMPT_NOTIFIERS
-+ INIT_HLIST_HEAD(&init_task.preempt_notifiers);
-+#endif
-+
-+#ifdef CONFIG_RT_MUTEXES
-+ plist_head_init(&init_task.pi_waiters, &init_task.pi_lock);
-+#endif
-+
-+ /*
-+ * The boot idle thread does lazy MMU switching as well:
-+ */
-+ atomic_inc(&init_mm.mm_count);
-+ enter_lazy_tlb(&init_mm, current);
-+
-+ /*
-+ * Make us the idle thread. Technically, schedule() should not be
-+ * called from this thread, however somewhere below it might be,
-+ * but because we are the idle thread, we just pick up running again
-+ * when this runqueue becomes "idle".
-+ */
-+ init_idle(current, smp_processor_id());
-+
-+ /* Allocate the nohz_cpu_mask if CONFIG_CPUMASK_OFFSTACK */
-+ alloc_cpumask_var(&nohz_cpu_mask, GFP_NOWAIT);
-+#ifdef CONFIG_SMP
-+#ifdef CONFIG_NO_HZ
-+ alloc_cpumask_var(&nohz.cpu_mask, GFP_NOWAIT);
-+ alloc_cpumask_var(&nohz.ilb_grp_nohz_mask, GFP_NOWAIT);
-+#endif
-+ alloc_cpumask_var(&cpu_isolated_map, GFP_NOWAIT);
-+#endif /* SMP */
-+ perf_counter_init();
-+}
-+
-+#ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
-+void __might_sleep(char *file, int line)
-+{
-+#ifdef in_atomic
-+ static unsigned long prev_jiffy; /* ratelimiting */
-+
-+ if ((in_atomic() || irqs_disabled()) &&
-+ system_state == SYSTEM_RUNNING && !oops_in_progress) {
-+ if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy)
-+ return;
-+ prev_jiffy = jiffies;
-+ printk(KERN_ERR "BUG: sleeping function called from invalid"
-+ " context at %s:%d\n", file, line);
-+ printk("in_atomic():%d, irqs_disabled():%d\n",
-+ in_atomic(), irqs_disabled());
-+ debug_show_held_locks(current);
-+ if (irqs_disabled())
-+ print_irqtrace_events(current);
-+ dump_stack();
-+ }
-+#endif
-+}
-+EXPORT_SYMBOL(__might_sleep);
-+#endif
-+
-+#ifdef CONFIG_MAGIC_SYSRQ
-+void normalize_rt_tasks(void)
-+{
-+ struct task_struct *g, *p;
-+ unsigned long flags;
-+ struct rq *rq;
-+ int queued;
-+
-+ read_lock_irq(&tasklist_lock);
-+
-+ do_each_thread(g, p) {
-+ if (!rt_task(p) && !iso_task(p))
-+ continue;
-+
-+ spin_lock_irqsave(&p->pi_lock, flags);
-+ rq = __task_grq_lock(p);
-+ update_rq_clock(rq);
-+
-+ queued = task_queued_only(p);
-+ if (queued)
-+ dequeue_task(p);
-+ __setscheduler(p, SCHED_NORMAL, 0);
-+ if (task_running(p))
-+ resched_task(p);
-+ if (queued) {
-+ enqueue_task(p);
-+ try_preempt(p);
-+ }
-+
-+ __task_grq_unlock();
-+ spin_unlock_irqrestore(&p->pi_lock, flags);
-+ } while_each_thread(g, p);
-+
-+ read_unlock_irq(&tasklist_lock);
-+}
-+#endif /* CONFIG_MAGIC_SYSRQ */
-+
-+#ifdef CONFIG_IA64
-+/*
-+ * These functions are only useful for the IA64 MCA handling.
-+ *
-+ * They can only be called when the whole system has been
-+ * stopped - every CPU needs to be quiescent, and no scheduling
-+ * activity can take place. Using them for anything else would
-+ * be a serious bug, and as a result, they aren't even visible
-+ * under any other configuration.
-+ */
-+
-+/**
-+ * curr_task - return the current task for a given cpu.
-+ * @cpu: the processor in question.
-+ *
-+ * ONLY VALID WHEN THE WHOLE SYSTEM IS STOPPED!
-+ */
-+struct task_struct *curr_task(int cpu)
-+{
-+ return cpu_curr(cpu);
-+}
-+
-+/**
-+ * set_curr_task - set the current task for a given cpu.
-+ * @cpu: the processor in question.
-+ * @p: the task pointer to set.
-+ *
-+ * Description: This function must only be used when non-maskable interrupts
-+ * are serviced on a separate stack. It allows the architecture to switch the
-+ * notion of the current task on a cpu in a non-blocking manner. This function
-+ * must be called with all CPU's synchronized, and interrupts disabled, the
-+ * and caller must save the original value of the current task (see
-+ * curr_task() above) and restore that value before reenabling interrupts and
-+ * re-starting the system.
-+ *
-+ * ONLY VALID WHEN THE WHOLE SYSTEM IS STOPPED!
-+ */
-+void set_curr_task(int cpu, struct task_struct *p)
-+{
-+ cpu_curr(cpu) = p;
-+}
-+
-+#endif
-+
-+/*
-+ * Use precise platform statistics if available:
-+ */
-+#ifdef CONFIG_VIRT_CPU_ACCOUNTING
-+cputime_t task_utime(struct task_struct *p)
-+{
-+ return p->utime;
-+}
-+
-+cputime_t task_stime(struct task_struct *p)
-+{
-+ return p->stime;
-+}
-+#else
-+cputime_t task_utime(struct task_struct *p)
-+{
-+ clock_t utime = cputime_to_clock_t(p->utime),
-+ total = utime + cputime_to_clock_t(p->stime);
-+ u64 temp;
-+
-+ temp = (u64)nsec_to_clock_t(p->se.sum_exec_runtime);
-+
-+ if (total) {
-+ temp *= utime;
-+ do_div(temp, total);
-+ }
-+ utime = (clock_t)temp;
-+
-+ p->prev_utime = max(p->prev_utime, clock_t_to_cputime(utime));
-+ return p->prev_utime;
-+}
-+
-+cputime_t task_stime(struct task_struct *p)
-+{
-+ clock_t stime;
-+
-+ stime = nsec_to_clock_t(p->se.sum_exec_runtime) -
-+ cputime_to_clock_t(task_utime(p));
-+
-+ if (stime >= 0)
-+ p->prev_stime = max(p->prev_stime, clock_t_to_cputime(stime));
-+
-+ return p->prev_stime;
-+}
-+#endif
-+
-+inline cputime_t task_gtime(struct task_struct *p)
-+{
-+ return p->gtime;
-+}
-+
-+void __cpuinit init_idle_bootup_task(struct task_struct *idle)
-+{}
-+
-+#ifdef CONFIG_SCHED_DEBUG
-+void proc_sched_show_task(struct task_struct *p, struct seq_file *m)
-+{}
-+
-+void proc_sched_set_task(struct task_struct *p)
-+{}
-+#endif
---- a/kernel/sysctl.c
-+++ b/kernel/sysctl.c
-@@ -86,6 +86,8 @@ extern int percpu_pagelist_fraction;
- extern int compat_log;
- extern int latencytop_enabled;
- extern int sysctl_nr_open_min, sysctl_nr_open_max;
-+extern int rr_interval;
-+extern int sched_iso_cpu;
- #ifndef CONFIG_MMU
- extern int sysctl_nr_trim_pages;
- #endif
-@@ -103,7 +105,8 @@ static int zero;
- static int __maybe_unused one = 1;
- static int __maybe_unused two = 2;
- static unsigned long one_ul = 1;
--static int one_hundred = 100;
-+static int __read_mostly one_hundred = 100;
-+static int __maybe_unused __read_mostly five_thousand = 5000;
-
- /* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */
- static unsigned long dirty_bytes_min = 2 * PAGE_SIZE;
-@@ -238,7 +241,7 @@ static struct ctl_table root_table[] = {
- { .ctl_name = 0 }
- };
-
--#ifdef CONFIG_SCHED_DEBUG
-+#if defined(CONFIG_SCHED_DEBUG) && defined(CONFIG_SCHED_CFS)
- static int min_sched_granularity_ns = 100000; /* 100 usecs */
- static int max_sched_granularity_ns = NSEC_PER_SEC; /* 1 second */
- static int min_wakeup_granularity_ns; /* 0 usecs */
-@@ -246,7 +249,7 @@ static int max_wakeup_granularity_ns = N
- #endif
-
- static struct ctl_table kern_table[] = {
--#ifdef CONFIG_SCHED_DEBUG
-+#if defined(CONFIG_SCHED_DEBUG) && defined(CONFIG_SCHED_CFS)
- {
- .ctl_name = CTL_UNNUMBERED,
- .procname = "sched_min_granularity_ns",
-@@ -342,6 +345,7 @@ static struct ctl_table kern_table[] = {
- .extra2 = &one,
- },
- #endif
-+#ifdef CONFIG_SCHED_CFS
- {
- .ctl_name = CTL_UNNUMBERED,
- .procname = "sched_rt_period_us",
-@@ -366,6 +370,7 @@ static struct ctl_table kern_table[] = {
- .mode = 0644,
- .proc_handler = &proc_dointvec,
- },
-+#endif
- #ifdef CONFIG_PROVE_LOCKING
- {
- .ctl_name = CTL_UNNUMBERED,
-@@ -798,6 +803,30 @@ static struct ctl_table kern_table[] = {
- .proc_handler = &proc_dointvec,
- },
- #endif
-+#ifdef CONFIG_SCHED_BFS
-+ {
-+ .ctl_name = CTL_UNNUMBERED,
-+ .procname = "rr_interval",
-+ .data = &rr_interval,
-+ .maxlen = sizeof (int),
-+ .mode = 0644,
-+ .proc_handler = &proc_dointvec_minmax,
-+ .strategy = &sysctl_intvec,
-+ .extra1 = &one,
-+ .extra2 = &five_thousand,
-+ },
-+ {
-+ .ctl_name = CTL_UNNUMBERED,
-+ .procname = "iso_cpu",
-+ .data = &sched_iso_cpu,
-+ .maxlen = sizeof (int),
-+ .mode = 0644,
-+ .proc_handler = &proc_dointvec_minmax,
-+ .strategy = &sysctl_intvec,
-+ .extra1 = &zero,
-+ .extra2 = &one_hundred,
-+ },
-+#endif
- #if defined(CONFIG_S390) && defined(CONFIG_SMP)
- {
- .ctl_name = KERN_SPIN_RETRY,
---- a/kernel/workqueue.c
-+++ b/kernel/workqueue.c
-@@ -317,7 +317,9 @@ static int worker_thread(void *__cwq)
- if (cwq->wq->freezeable)
- set_freezable();
-
-+#ifdef CONFIG_SCHED_CFS
- set_user_nice(current, -5);
-+#endif
-
- for (;;) {
- prepare_to_wait(&cwq->more_work, &wait, TASK_INTERRUPTIBLE);
+++ /dev/null
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -297,4 +297,8 @@ config LEDS_TRIGGER_DEFAULT_ON
- comment "iptables trigger is under Netfilter config (LED target)"
- depends on LEDS_TRIGGERS
-
-+config LEDS_TRIGGER_MORSE
-+ tristate "LED Morse Trigger"
-+ depends on LEDS_TRIGGERS
-+
- endif # NEW_LEDS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -39,3 +39,4 @@ obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) +=
- obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) += ledtrig-backlight.o
- obj-$(CONFIG_LEDS_TRIGGER_GPIO) += ledtrig-gpio.o
- obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o
-+obj-$(CONFIG_LEDS_TRIGGER_MORSE) += ledtrig-morse.o
+++ /dev/null
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -301,4 +301,11 @@ config LEDS_TRIGGER_MORSE
- tristate "LED Morse Trigger"
- depends on LEDS_TRIGGERS
-
-+config LEDS_TRIGGER_NETDEV
-+ tristate "LED Netdev Trigger"
-+ depends on NET && LEDS_TRIGGERS
-+ help
-+ This allows LEDs to be controlled by network device activity.
-+ If unsure, say Y.
-+
- endif # NEW_LEDS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -40,3 +40,4 @@ obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) +=
- obj-$(CONFIG_LEDS_TRIGGER_GPIO) += ledtrig-gpio.o
- obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o
- obj-$(CONFIG_LEDS_TRIGGER_MORSE) += ledtrig-morse.o
-+obj-$(CONFIG_LEDS_TRIGGER_NETDEV) += ledtrig-netdev.o
+++ /dev/null
---- a/drivers/input/misc/Kconfig
-+++ b/drivers/input/misc/Kconfig
-@@ -269,4 +269,21 @@ config INPUT_DM355EVM
-
- To compile this driver as a module, choose M here: the
- module will be called dm355evm_keys.
-+
-+config INPUT_GPIO_BUTTONS
-+ tristate "Polled GPIO buttons interface"
-+ depends on GENERIC_GPIO
-+ select INPUT_POLLDEV
-+ help
-+ This driver implements support for buttons connected
-+ to GPIO pins of various CPUs (and some other chips).
-+
-+ Say Y here if your device has buttons connected
-+ directly to such GPIO pins. Your board-specific
-+ setup logic must also provide a platform device,
-+ with configuration data saying which GPIOs are used.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called gpio-buttons.
-+
- endif
---- a/drivers/input/misc/Makefile
-+++ b/drivers/input/misc/Makefile
-@@ -26,3 +26,4 @@ obj-$(CONFIG_INPUT_TWL4030_PWRBUTTON) +=
- obj-$(CONFIG_INPUT_UINPUT) += uinput.o
- obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o
- obj-$(CONFIG_INPUT_YEALINK) += yealink.o
-+obj-$(CONFIG_INPUT_GPIO_BUTTONS) += gpio_buttons.o
+++ /dev/null
---- a/drivers/char/Kconfig
-+++ b/drivers/char/Kconfig
-@@ -1029,6 +1029,14 @@ config CS5535_GPIO
-
- If compiled as a module, it will be called cs5535_gpio.
-
-+config GPIO_DEVICE
-+ tristate "GPIO device support"
-+ depends on GENERIC_GPIO
-+ help
-+ Say Y to enable Linux GPIO device support. This allows control of
-+ GPIO pins using a character device
-+
-+
- config RAW_DRIVER
- tristate "RAW driver (/dev/raw/rawN)"
- depends on BLOCK
---- a/drivers/char/Makefile
-+++ b/drivers/char/Makefile
-@@ -95,6 +95,7 @@ obj-$(CONFIG_SCx200_GPIO) += scx200_gpio
- obj-$(CONFIG_PC8736x_GPIO) += pc8736x_gpio.o
- obj-$(CONFIG_NSC_GPIO) += nsc_gpio.o
- obj-$(CONFIG_CS5535_GPIO) += cs5535_gpio.o
-+obj-$(CONFIG_GPIO_DEVICE) += gpio_dev.o
- obj-$(CONFIG_GPIO_TB0219) += tb0219.o
- obj-$(CONFIG_TELCLOCK) += tlclk.o
-
+++ /dev/null
---- a/include/scsi/scsi.h
-+++ b/include/scsi/scsi.h
-@@ -142,10 +142,10 @@ struct scsi_cmnd;
-
- /* defined in T10 SCSI Primary Commands-2 (SPC2) */
- struct scsi_varlen_cdb_hdr {
-- u8 opcode; /* opcode always == VARIABLE_LENGTH_CMD */
-- u8 control;
-- u8 misc[5];
-- u8 additional_cdb_length; /* total cdb length - 8 */
-+ __u8 opcode; /* opcode always == VARIABLE_LENGTH_CMD */
-+ __u8 control;
-+ __u8 misc[5];
-+ __u8 additional_cdb_length; /* total cdb length - 8 */
- __be16 service_action;
- /* service specific data follows */
- };
+++ /dev/null
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -188,6 +188,7 @@ source "fs/sysv/Kconfig"
- source "fs/ufs/Kconfig"
- source "fs/exofs/Kconfig"
- source "fs/nilfs2/Kconfig"
-+source "fs/yaffs2/Kconfig"
-
- endif # MISC_FILESYSTEMS
-
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -125,3 +125,4 @@ obj-$(CONFIG_OCFS2_FS) += ocfs2/
- obj-$(CONFIG_BTRFS_FS) += btrfs/
- obj-$(CONFIG_GFS2_FS) += gfs2/
- obj-$(CONFIG_EXOFS_FS) += exofs/
-+obj-$(CONFIG_YAFFS_FS) += yaffs2/
+++ /dev/null
---- a/fs/yaffs2/devextras.h
-+++ b/fs/yaffs2/devextras.h
-@@ -14,194 +14,135 @@
- */
-
- /*
-- * This file is just holds extra declarations used during development.
-- * Most of these are from kernel includes placed here so we can use them in
-- * applications.
-+ * This file is just holds extra declarations of macros that would normally
-+ * be providesd in the Linux kernel. These macros have been written from
-+ * scratch but are functionally equivalent to the Linux ones.
- *
- */
-
- #ifndef __EXTRAS_H__
- #define __EXTRAS_H__
-
--#if defined WIN32
--#define __inline__ __inline
--#define new newHack
--#endif
--
--#if !(defined __KERNEL__) || (defined WIN32)
-
--/* User space defines */
-+#if !(defined __KERNEL__)
-
-+/* Definition of types */
- typedef unsigned char __u8;
- typedef unsigned short __u16;
- typedef unsigned __u32;
-
-+#endif
-+
- /*
-- * Simple doubly linked list implementation.
-- *
-- * Some of the internal functions ("__xxx") are useful when
-- * manipulating whole lists rather than single entries, as
-- * sometimes we already know the next/prev entries and we can
-- * generate better code by using them directly rather than
-- * using the generic single-entry routines.
-+ * This is a simple doubly linked list implementation that matches the
-+ * way the Linux kernel doubly linked list implementation works.
- */
-
--#define prefetch(x) 1
--
--struct list_head {
-- struct list_head *next, *prev;
-+struct ylist_head {
-+ struct ylist_head *next; /* next in chain */
-+ struct ylist_head *prev; /* previous in chain */
- };
-
--#define LIST_HEAD_INIT(name) { &(name), &(name) }
-
--#define LIST_HEAD(name) \
-- struct list_head name = LIST_HEAD_INIT(name)
-+/* Initialise a static list */
-+#define YLIST_HEAD(name) \
-+struct ylist_head name = { &(name), &(name)}
-+
-
--#define INIT_LIST_HEAD(ptr) do { \
-- (ptr)->next = (ptr); (ptr)->prev = (ptr); \
-+
-+/* Initialise a list head to an empty list */
-+#define YINIT_LIST_HEAD(p) \
-+do { \
-+ (p)->next = (p);\
-+ (p)->prev = (p); \
- } while (0)
-
--/*
-- * Insert a new entry between two known consecutive entries.
-- *
-- * This is only for internal list manipulation where we know
-- * the prev/next entries already!
-- */
--static __inline__ void __list_add(struct list_head *new,
-- struct list_head *prev,
-- struct list_head *next)
--{
-- next->prev = new;
-- new->next = next;
-- new->prev = prev;
-- prev->next = new;
--}
-
--/**
-- * list_add - add a new entry
-- * @new: new entry to be added
-- * @head: list head to add it after
-- *
-- * Insert a new entry after the specified head.
-- * This is good for implementing stacks.
-- */
--static __inline__ void list_add(struct list_head *new, struct list_head *head)
-+/* Add an element to a list */
-+static __inline__ void ylist_add(struct ylist_head *newEntry,
-+ struct ylist_head *list)
- {
-- __list_add(new, head, head->next);
--}
-+ struct ylist_head *listNext = list->next;
-+
-+ list->next = newEntry;
-+ newEntry->prev = list;
-+ newEntry->next = listNext;
-+ listNext->prev = newEntry;
-
--/**
-- * list_add_tail - add a new entry
-- * @new: new entry to be added
-- * @head: list head to add it before
-- *
-- * Insert a new entry before the specified head.
-- * This is useful for implementing queues.
-- */
--static __inline__ void list_add_tail(struct list_head *new,
-- struct list_head *head)
--{
-- __list_add(new, head->prev, head);
- }
-
--/*
-- * Delete a list entry by making the prev/next entries
-- * point to each other.
-- *
-- * This is only for internal list manipulation where we know
-- * the prev/next entries already!
-- */
--static __inline__ void __list_del(struct list_head *prev,
-- struct list_head *next)
-+static __inline__ void ylist_add_tail(struct ylist_head *newEntry,
-+ struct ylist_head *list)
- {
-- next->prev = prev;
-- prev->next = next;
-+ struct ylist_head *listPrev = list->prev;
-+
-+ list->prev = newEntry;
-+ newEntry->next = list;
-+ newEntry->prev = listPrev;
-+ listPrev->next = newEntry;
-+
- }
-
--/**
-- * list_del - deletes entry from list.
-- * @entry: the element to delete from the list.
-- * Note: list_empty on entry does not return true after this, the entry is
-- * in an undefined state.
-- */
--static __inline__ void list_del(struct list_head *entry)
-+
-+/* Take an element out of its current list, with or without
-+ * reinitialising the links.of the entry*/
-+static __inline__ void ylist_del(struct ylist_head *entry)
- {
-- __list_del(entry->prev, entry->next);
-+ struct ylist_head *listNext = entry->next;
-+ struct ylist_head *listPrev = entry->prev;
-+
-+ listNext->prev = listPrev;
-+ listPrev->next = listNext;
-+
- }
-
--/**
-- * list_del_init - deletes entry from list and reinitialize it.
-- * @entry: the element to delete from the list.
-- */
--static __inline__ void list_del_init(struct list_head *entry)
-+static __inline__ void ylist_del_init(struct ylist_head *entry)
- {
-- __list_del(entry->prev, entry->next);
-- INIT_LIST_HEAD(entry);
-+ ylist_del(entry);
-+ entry->next = entry->prev = entry;
- }
-
--/**
-- * list_empty - tests whether a list is empty
-- * @head: the list to test.
-- */
--static __inline__ int list_empty(struct list_head *head)
-+
-+/* Test if the list is empty */
-+static __inline__ int ylist_empty(struct ylist_head *entry)
- {
-- return head->next == head;
-+ return (entry->next == entry);
- }
-
--/**
-- * list_splice - join two lists
-- * @list: the new list to add.
-- * @head: the place to add it in the first list.
-+
-+/* ylist_entry takes a pointer to a list entry and offsets it to that
-+ * we can find a pointer to the object it is embedded in.
- */
--static __inline__ void list_splice(struct list_head *list,
-- struct list_head *head)
--{
-- struct list_head *first = list->next;
-
-- if (first != list) {
-- struct list_head *last = list->prev;
-- struct list_head *at = head->next;
--
-- first->prev = head;
-- head->next = first;
--
-- last->next = at;
-- at->prev = last;
-- }
--}
-
--/**
-- * list_entry - get the struct for this entry
-- * @ptr: the &struct list_head pointer.
-- * @type: the type of the struct this is embedded in.
-- * @member: the name of the list_struct within the struct.
-- */
--#define list_entry(ptr, type, member) \
-- ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
--
--/**
-- * list_for_each - iterate over a list
-- * @pos: the &struct list_head to use as a loop counter.
-- * @head: the head for your list.
-- */
--#define list_for_each(pos, head) \
-- for (pos = (head)->next, prefetch(pos->next); pos != (head); \
-- pos = pos->next, prefetch(pos->next))
--
--/**
-- * list_for_each_safe - iterate over a list safe against removal
-- * of list entry
-- * @pos: the &struct list_head to use as a loop counter.
-- * @n: another &struct list_head to use as temporary storage
-- * @head: the head for your list.
-- */
--#define list_for_each_safe(pos, n, head) \
-- for (pos = (head)->next, n = pos->next; pos != (head); \
-- pos = n, n = pos->next)
-+#define ylist_entry(entry, type, member) \
-+ ((type *)((char *)(entry)-(unsigned long)(&((type *)NULL)->member)))
-
--/*
-- * File types
-+
-+/* ylist_for_each and list_for_each_safe iterate over lists.
-+ * ylist_for_each_safe uses temporary storage to make the list delete safe
- */
-+
-+#define ylist_for_each(itervar, list) \
-+ for (itervar = (list)->next; itervar != (list); itervar = itervar->next)
-+
-+#define ylist_for_each_safe(itervar, saveVar, list) \
-+ for (itervar = (list)->next, saveVar = (list)->next->next; \
-+ itervar != (list); itervar = saveVar, saveVar = saveVar->next)
-+
-+
-+#if !(defined __KERNEL__)
-+
-+
-+#ifndef WIN32
-+#include <sys/stat.h>
-+#endif
-+
-+
-+#ifdef CONFIG_YAFFS_PROVIDE_DEFS
-+/* File types */
-+
-+
- #define DT_UNKNOWN 0
- #define DT_FIFO 1
- #define DT_CHR 2
-@@ -212,6 +153,7 @@ static __inline__ void list_splice(struc
- #define DT_SOCK 12
- #define DT_WHT 14
-
-+
- #ifndef WIN32
- #include <sys/stat.h>
- #endif
-@@ -227,10 +169,6 @@ static __inline__ void list_splice(struc
- #define ATTR_ATIME 16
- #define ATTR_MTIME 32
- #define ATTR_CTIME 64
--#define ATTR_ATIME_SET 128
--#define ATTR_MTIME_SET 256
--#define ATTR_FORCE 512 /* Not a change, but a change it */
--#define ATTR_ATTR_FLAG 1024
-
- struct iattr {
- unsigned int ia_valid;
-@@ -244,21 +182,15 @@ struct iattr {
- unsigned int ia_attr_flags;
- };
-
--#define KERN_DEBUG
-+#endif
-
- #else
-
--#ifndef WIN32
- #include <linux/types.h>
--#include <linux/list.h>
- #include <linux/fs.h>
- #include <linux/stat.h>
--#endif
-
- #endif
-
--#if defined WIN32
--#undef new
--#endif
-
- #endif
---- a/fs/yaffs2/Kconfig
-+++ b/fs/yaffs2/Kconfig
-@@ -5,7 +5,7 @@
- config YAFFS_FS
- tristate "YAFFS2 file system support"
- default n
-- depends on MTD
-+ depends on MTD_BLOCK
- select YAFFS_YAFFS1
- select YAFFS_YAFFS2
- help
-@@ -43,7 +43,8 @@ config YAFFS_9BYTE_TAGS
- format that you need to continue to support. New data written
- also uses the older-style format. Note: Use of this option
- generally requires that MTD's oob layout be adjusted to use the
-- older-style format. See notes on tags formats and MTD versions.
-+ older-style format. See notes on tags formats and MTD versions
-+ in yaffs_mtdif1.c.
-
- If unsure, say N.
-
-@@ -109,26 +110,6 @@ config YAFFS_DISABLE_LAZY_LOAD
-
- If unsure, say N.
-
--config YAFFS_CHECKPOINT_RESERVED_BLOCKS
-- int "Reserved blocks for checkpointing"
-- depends on YAFFS_YAFFS2
-- default 10
-- help
-- Give the number of Blocks to reserve for checkpointing.
-- Checkpointing saves the state at unmount so that mounting is
-- much faster as a scan of all the flash to regenerate this state
-- is not needed. These Blocks are reserved per partition, so if
-- you have very small partitions the default (10) may be a mess
-- for you. You can set this value to 0, but that does not mean
-- checkpointing is disabled at all. There only won't be any
-- specially reserved blocks for checkpointing, so if there is
-- enough free space on the filesystem, it will be used for
-- checkpointing.
--
-- If unsure, leave at default (10), but don't wonder if there are
-- always 2MB used on your large page device partition (10 x 2k
-- pagesize). When using small partitions or when being very small
-- on space, you probably want to set this to zero.
-
- config YAFFS_DISABLE_WIDE_TNODES
- bool "Turn off wide tnodes"
---- a/fs/yaffs2/Makefile
-+++ b/fs/yaffs2/Makefile
-@@ -5,7 +5,6 @@
- obj-$(CONFIG_YAFFS_FS) += yaffs.o
-
- yaffs-y := yaffs_ecc.o yaffs_fs.o yaffs_guts.o yaffs_checkptrw.o
--yaffs-y += yaffs_packedtags2.o yaffs_nand.o yaffs_qsort.o
-+yaffs-y += yaffs_packedtags1.o yaffs_packedtags2.o yaffs_nand.o yaffs_qsort.o
- yaffs-y += yaffs_tagscompat.o yaffs_tagsvalidity.o
--yaffs-y += yaffs_mtdif1.o yaffs_packedtags1.o
--yaffs-y += yaffs_mtdif.o yaffs_mtdif2.o
-+yaffs-y += yaffs_mtdif.o yaffs_mtdif1.o yaffs_mtdif2.o
---- a/fs/yaffs2/moduleconfig.h
-+++ b/fs/yaffs2/moduleconfig.h
-@@ -27,12 +27,12 @@
-
- /* Default: Not selected */
- /* Meaning: Yaffs does its own ECC, rather than using MTD ECC */
--//#define CONFIG_YAFFS_DOES_ECC
-+/* #define CONFIG_YAFFS_DOES_ECC */
-
- /* Default: Not selected */
- /* Meaning: ECC byte order is 'wrong'. Only meaningful if */
- /* CONFIG_YAFFS_DOES_ECC is set */
--//#define CONFIG_YAFFS_ECC_WRONG_ORDER
-+/* #define CONFIG_YAFFS_ECC_WRONG_ORDER */
-
- /* Default: Selected */
- /* Meaning: Disables testing whether chunks are erased before writing to them*/
-@@ -54,11 +54,11 @@ that you need to continue to support. N
- older-style format.
- Note: Use of this option generally requires that MTD's oob layout be
- adjusted to use the older-style format. See notes on tags formats and
--MTD versions.
-+MTD versions in yaffs_mtdif1.c.
- */
- /* Default: Not selected */
- /* Meaning: Use older-style on-NAND data format with pageStatus byte */
--#define CONFIG_YAFFS_9BYTE_TAGS
-+/* #define CONFIG_YAFFS_9BYTE_TAGS */
-
- #endif /* YAFFS_OUT_OF_TREE */
-
---- a/fs/yaffs2/yaffs_checkptrw.c
-+++ b/fs/yaffs2/yaffs_checkptrw.c
-@@ -12,48 +12,43 @@
- */
-
- const char *yaffs_checkptrw_c_version =
-- "$Id: yaffs_checkptrw.c,v 1.14 2007-05-15 20:07:40 charles Exp $";
-+ "$Id: yaffs_checkptrw.c,v 1.18 2009-03-06 17:20:49 wookey Exp $";
-
-
- #include "yaffs_checkptrw.h"
--
-+#include "yaffs_getblockinfo.h"
-
- static int yaffs_CheckpointSpaceOk(yaffs_Device *dev)
- {
--
- int blocksAvailable = dev->nErasedBlocks - dev->nReservedBlocks;
-
- T(YAFFS_TRACE_CHECKPOINT,
- (TSTR("checkpt blocks available = %d" TENDSTR),
- blocksAvailable));
-
--
- return (blocksAvailable <= 0) ? 0 : 1;
- }
-
-
- static int yaffs_CheckpointErase(yaffs_Device *dev)
- {
--
- int i;
-
--
-- if(!dev->eraseBlockInNAND)
-+ if (!dev->eraseBlockInNAND)
- return 0;
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("checking blocks %d to %d"TENDSTR),
-- dev->internalStartBlock,dev->internalEndBlock));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checking blocks %d to %d"TENDSTR),
-+ dev->internalStartBlock, dev->internalEndBlock));
-
-- for(i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) {
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i);
-- if(bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("erasing checkpt block %d"TENDSTR),i));
-- if(dev->eraseBlockInNAND(dev,i- dev->blockOffset /* realign */)){
-+ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) {
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i);
-+ if (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("erasing checkpt block %d"TENDSTR), i));
-+ if (dev->eraseBlockInNAND(dev, i - dev->blockOffset /* realign */)) {
- bi->blockState = YAFFS_BLOCK_STATE_EMPTY;
- dev->nErasedBlocks++;
- dev->nFreeChunks += dev->nChunksPerBlock;
-- }
-- else {
-- dev->markNANDBlockBad(dev,i);
-+ } else {
-+ dev->markNANDBlockBad(dev, i);
- bi->blockState = YAFFS_BLOCK_STATE_DEAD;
- }
- }
-@@ -71,23 +66,23 @@ static void yaffs_CheckpointFindNextEras
- int blocksAvailable = dev->nErasedBlocks - dev->nReservedBlocks;
- T(YAFFS_TRACE_CHECKPOINT,
- (TSTR("allocating checkpt block: erased %d reserved %d avail %d next %d "TENDSTR),
-- dev->nErasedBlocks,dev->nReservedBlocks,blocksAvailable,dev->checkpointNextBlock));
-+ dev->nErasedBlocks, dev->nReservedBlocks, blocksAvailable, dev->checkpointNextBlock));
-
-- if(dev->checkpointNextBlock >= 0 &&
-- dev->checkpointNextBlock <= dev->internalEndBlock &&
-- blocksAvailable > 0){
--
-- for(i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++){
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i);
-- if(bi->blockState == YAFFS_BLOCK_STATE_EMPTY){
-+ if (dev->checkpointNextBlock >= 0 &&
-+ dev->checkpointNextBlock <= dev->internalEndBlock &&
-+ blocksAvailable > 0) {
-+
-+ for (i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++) {
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i);
-+ if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY) {
- dev->checkpointNextBlock = i + 1;
- dev->checkpointCurrentBlock = i;
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("allocating checkpt block %d"TENDSTR),i));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("allocating checkpt block %d"TENDSTR), i));
- return;
- }
- }
- }
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("out of checkpt blocks"TENDSTR)));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("out of checkpt blocks"TENDSTR)));
-
- dev->checkpointNextBlock = -1;
- dev->checkpointCurrentBlock = -1;
-@@ -98,30 +93,31 @@ static void yaffs_CheckpointFindNextChec
- int i;
- yaffs_ExtendedTags tags;
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("find next checkpt block: start: blocks %d next %d" TENDSTR),
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("find next checkpt block: start: blocks %d next %d" TENDSTR),
- dev->blocksInCheckpoint, dev->checkpointNextBlock));
-
-- if(dev->blocksInCheckpoint < dev->checkpointMaxBlocks)
-- for(i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++){
-+ if (dev->blocksInCheckpoint < dev->checkpointMaxBlocks)
-+ for (i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++) {
- int chunk = i * dev->nChunksPerBlock;
- int realignedChunk = chunk - dev->chunkOffset;
-
-- dev->readChunkWithTagsFromNAND(dev,realignedChunk,NULL,&tags);
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("find next checkpt block: search: block %d oid %d seq %d eccr %d" TENDSTR),
-- i, tags.objectId,tags.sequenceNumber,tags.eccResult));
-+ dev->readChunkWithTagsFromNAND(dev, realignedChunk,
-+ NULL, &tags);
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("find next checkpt block: search: block %d oid %d seq %d eccr %d" TENDSTR),
-+ i, tags.objectId, tags.sequenceNumber, tags.eccResult));
-
-- if(tags.sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA){
-+ if (tags.sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA) {
- /* Right kind of block */
- dev->checkpointNextBlock = tags.objectId;
- dev->checkpointCurrentBlock = i;
- dev->checkpointBlockList[dev->blocksInCheckpoint] = i;
- dev->blocksInCheckpoint++;
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("found checkpt block %d"TENDSTR),i));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("found checkpt block %d"TENDSTR), i));
- return;
- }
- }
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("found no more checkpt blocks"TENDSTR)));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("found no more checkpt blocks"TENDSTR)));
-
- dev->checkpointNextBlock = -1;
- dev->checkpointCurrentBlock = -1;
-@@ -133,17 +129,17 @@ int yaffs_CheckpointOpen(yaffs_Device *d
-
- /* Got the functions we need? */
- if (!dev->writeChunkWithTagsToNAND ||
-- !dev->readChunkWithTagsFromNAND ||
-- !dev->eraseBlockInNAND ||
-- !dev->markNANDBlockBad)
-+ !dev->readChunkWithTagsFromNAND ||
-+ !dev->eraseBlockInNAND ||
-+ !dev->markNANDBlockBad)
- return 0;
-
-- if(forWriting && !yaffs_CheckpointSpaceOk(dev))
-+ if (forWriting && !yaffs_CheckpointSpaceOk(dev))
- return 0;
-
-- if(!dev->checkpointBuffer)
-- dev->checkpointBuffer = YMALLOC_DMA(dev->nDataBytesPerChunk);
-- if(!dev->checkpointBuffer)
-+ if (!dev->checkpointBuffer)
-+ dev->checkpointBuffer = YMALLOC_DMA(dev->totalBytesPerChunk);
-+ if (!dev->checkpointBuffer)
- return 0;
-
-
-@@ -159,12 +155,10 @@ int yaffs_CheckpointOpen(yaffs_Device *d
- dev->checkpointNextBlock = dev->internalStartBlock;
-
- /* Erase all the blocks in the checkpoint area */
-- if(forWriting){
-- memset(dev->checkpointBuffer,0,dev->nDataBytesPerChunk);
-+ if (forWriting) {
-+ memset(dev->checkpointBuffer, 0, dev->nDataBytesPerChunk);
- dev->checkpointByteOffset = 0;
- return yaffs_CheckpointErase(dev);
--
--
- } else {
- int i;
- /* Set to a value that will kick off a read */
-@@ -174,7 +168,7 @@ int yaffs_CheckpointOpen(yaffs_Device *d
- dev->blocksInCheckpoint = 0;
- dev->checkpointMaxBlocks = (dev->internalEndBlock - dev->internalStartBlock)/16 + 2;
- dev->checkpointBlockList = YMALLOC(sizeof(int) * dev->checkpointMaxBlocks);
-- for(i = 0; i < dev->checkpointMaxBlocks; i++)
-+ for (i = 0; i < dev->checkpointMaxBlocks; i++)
- dev->checkpointBlockList[i] = -1;
- }
-
-@@ -191,18 +185,17 @@ int yaffs_GetCheckpointSum(yaffs_Device
-
- static int yaffs_CheckpointFlushBuffer(yaffs_Device *dev)
- {
--
- int chunk;
- int realignedChunk;
-
- yaffs_ExtendedTags tags;
-
-- if(dev->checkpointCurrentBlock < 0){
-+ if (dev->checkpointCurrentBlock < 0) {
- yaffs_CheckpointFindNextErasedBlock(dev);
- dev->checkpointCurrentChunk = 0;
- }
-
-- if(dev->checkpointCurrentBlock < 0)
-+ if (dev->checkpointCurrentBlock < 0)
- return 0;
-
- tags.chunkDeleted = 0;
-@@ -210,10 +203,10 @@ static int yaffs_CheckpointFlushBuffer(y
- tags.chunkId = dev->checkpointPageSequence + 1;
- tags.sequenceNumber = YAFFS_SEQUENCE_CHECKPOINT_DATA;
- tags.byteCount = dev->nDataBytesPerChunk;
-- if(dev->checkpointCurrentChunk == 0){
-+ if (dev->checkpointCurrentChunk == 0) {
- /* First chunk we write for the block? Set block state to
- checkpoint */
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,dev->checkpointCurrentBlock);
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, dev->checkpointCurrentBlock);
- bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT;
- dev->blocksInCheckpoint++;
- }
-@@ -221,28 +214,29 @@ static int yaffs_CheckpointFlushBuffer(y
- chunk = dev->checkpointCurrentBlock * dev->nChunksPerBlock + dev->checkpointCurrentChunk;
-
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint wite buffer nand %d(%d:%d) objid %d chId %d" TENDSTR),
-- chunk, dev->checkpointCurrentBlock, dev->checkpointCurrentChunk,tags.objectId,tags.chunkId));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint wite buffer nand %d(%d:%d) objid %d chId %d" TENDSTR),
-+ chunk, dev->checkpointCurrentBlock, dev->checkpointCurrentChunk, tags.objectId, tags.chunkId));
-
- realignedChunk = chunk - dev->chunkOffset;
-
-- dev->writeChunkWithTagsToNAND(dev,realignedChunk,dev->checkpointBuffer,&tags);
-+ dev->writeChunkWithTagsToNAND(dev, realignedChunk,
-+ dev->checkpointBuffer, &tags);
- dev->checkpointByteOffset = 0;
- dev->checkpointPageSequence++;
- dev->checkpointCurrentChunk++;
-- if(dev->checkpointCurrentChunk >= dev->nChunksPerBlock){
-+ if (dev->checkpointCurrentChunk >= dev->nChunksPerBlock) {
- dev->checkpointCurrentChunk = 0;
- dev->checkpointCurrentBlock = -1;
- }
-- memset(dev->checkpointBuffer,0,dev->nDataBytesPerChunk);
-+ memset(dev->checkpointBuffer, 0, dev->nDataBytesPerChunk);
-
- return 1;
- }
-
-
--int yaffs_CheckpointWrite(yaffs_Device *dev,const void *data, int nBytes)
-+int yaffs_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes)
- {
-- int i=0;
-+ int i = 0;
- int ok = 1;
-
-
-@@ -250,17 +244,14 @@ int yaffs_CheckpointWrite(yaffs_Device *
-
-
-
-- if(!dev->checkpointBuffer)
-+ if (!dev->checkpointBuffer)
- return 0;
-
-- if(!dev->checkpointOpenForWrite)
-+ if (!dev->checkpointOpenForWrite)
- return -1;
-
-- while(i < nBytes && ok) {
--
--
--
-- dev->checkpointBuffer[dev->checkpointByteOffset] = *dataBytes ;
-+ while (i < nBytes && ok) {
-+ dev->checkpointBuffer[dev->checkpointByteOffset] = *dataBytes;
- dev->checkpointSum += *dataBytes;
- dev->checkpointXor ^= *dataBytes;
-
-@@ -270,18 +261,17 @@ int yaffs_CheckpointWrite(yaffs_Device *
- dev->checkpointByteCount++;
-
-
-- if(dev->checkpointByteOffset < 0 ||
-+ if (dev->checkpointByteOffset < 0 ||
- dev->checkpointByteOffset >= dev->nDataBytesPerChunk)
- ok = yaffs_CheckpointFlushBuffer(dev);
--
- }
-
-- return i;
-+ return i;
- }
-
- int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes)
- {
-- int i=0;
-+ int i = 0;
- int ok = 1;
- yaffs_ExtendedTags tags;
-
-@@ -291,52 +281,54 @@ int yaffs_CheckpointRead(yaffs_Device *d
-
- __u8 *dataBytes = (__u8 *)data;
-
-- if(!dev->checkpointBuffer)
-+ if (!dev->checkpointBuffer)
- return 0;
-
-- if(dev->checkpointOpenForWrite)
-+ if (dev->checkpointOpenForWrite)
- return -1;
-
-- while(i < nBytes && ok) {
-+ while (i < nBytes && ok) {
-
-
-- if(dev->checkpointByteOffset < 0 ||
-- dev->checkpointByteOffset >= dev->nDataBytesPerChunk) {
-+ if (dev->checkpointByteOffset < 0 ||
-+ dev->checkpointByteOffset >= dev->nDataBytesPerChunk) {
-
-- if(dev->checkpointCurrentBlock < 0){
-+ if (dev->checkpointCurrentBlock < 0) {
- yaffs_CheckpointFindNextCheckpointBlock(dev);
- dev->checkpointCurrentChunk = 0;
- }
-
-- if(dev->checkpointCurrentBlock < 0)
-+ if (dev->checkpointCurrentBlock < 0)
- ok = 0;
- else {
--
-- chunk = dev->checkpointCurrentBlock * dev->nChunksPerBlock +
-- dev->checkpointCurrentChunk;
-+ chunk = dev->checkpointCurrentBlock *
-+ dev->nChunksPerBlock +
-+ dev->checkpointCurrentChunk;
-
- realignedChunk = chunk - dev->chunkOffset;
-
-- /* read in the next chunk */
-- /* printf("read checkpoint page %d\n",dev->checkpointPage); */
-- dev->readChunkWithTagsFromNAND(dev, realignedChunk,
-- dev->checkpointBuffer,
-- &tags);
--
-- if(tags.chunkId != (dev->checkpointPageSequence + 1) ||
-- tags.sequenceNumber != YAFFS_SEQUENCE_CHECKPOINT_DATA)
-- ok = 0;
-+ /* read in the next chunk */
-+ /* printf("read checkpoint page %d\n",dev->checkpointPage); */
-+ dev->readChunkWithTagsFromNAND(dev,
-+ realignedChunk,
-+ dev->checkpointBuffer,
-+ &tags);
-+
-+ if (tags.chunkId != (dev->checkpointPageSequence + 1) ||
-+ tags.eccResult > YAFFS_ECC_RESULT_FIXED ||
-+ tags.sequenceNumber != YAFFS_SEQUENCE_CHECKPOINT_DATA)
-+ ok = 0;
-
- dev->checkpointByteOffset = 0;
- dev->checkpointPageSequence++;
- dev->checkpointCurrentChunk++;
-
-- if(dev->checkpointCurrentChunk >= dev->nChunksPerBlock)
-+ if (dev->checkpointCurrentChunk >= dev->nChunksPerBlock)
- dev->checkpointCurrentBlock = -1;
- }
- }
-
-- if(ok){
-+ if (ok) {
- *dataBytes = dev->checkpointBuffer[dev->checkpointByteOffset];
- dev->checkpointSum += *dataBytes;
- dev->checkpointXor ^= *dataBytes;
-@@ -353,17 +345,17 @@ int yaffs_CheckpointRead(yaffs_Device *d
- int yaffs_CheckpointClose(yaffs_Device *dev)
- {
-
-- if(dev->checkpointOpenForWrite){
-- if(dev->checkpointByteOffset != 0)
-+ if (dev->checkpointOpenForWrite) {
-+ if (dev->checkpointByteOffset != 0)
- yaffs_CheckpointFlushBuffer(dev);
- } else {
- int i;
-- for(i = 0; i < dev->blocksInCheckpoint && dev->checkpointBlockList[i] >= 0; i++){
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,dev->checkpointBlockList[i]);
-- if(bi->blockState == YAFFS_BLOCK_STATE_EMPTY)
-+ for (i = 0; i < dev->blocksInCheckpoint && dev->checkpointBlockList[i] >= 0; i++) {
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, dev->checkpointBlockList[i]);
-+ if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY)
- bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT;
- else {
-- // Todo this looks odd...
-+ /* Todo this looks odd... */
- }
- }
- YFREE(dev->checkpointBlockList);
-@@ -374,27 +366,25 @@ int yaffs_CheckpointClose(yaffs_Device *
- dev->nErasedBlocks -= dev->blocksInCheckpoint;
-
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint byte count %d" TENDSTR),
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint byte count %d" TENDSTR),
- dev->checkpointByteCount));
-
-- if(dev->checkpointBuffer){
-+ if (dev->checkpointBuffer) {
- /* free the buffer */
- YFREE(dev->checkpointBuffer);
- dev->checkpointBuffer = NULL;
- return 1;
-- }
-- else
-+ } else
- return 0;
--
- }
-
- int yaffs_CheckpointInvalidateStream(yaffs_Device *dev)
- {
- /* Erase the first checksum block */
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint invalidate"TENDSTR)));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint invalidate"TENDSTR)));
-
-- if(!yaffs_CheckpointSpaceOk(dev))
-+ if (!yaffs_CheckpointSpaceOk(dev))
- return 0;
-
- return yaffs_CheckpointErase(dev);
---- a/fs/yaffs2/yaffs_checkptrw.h
-+++ b/fs/yaffs2/yaffs_checkptrw.h
-@@ -20,9 +20,9 @@
-
- int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting);
-
--int yaffs_CheckpointWrite(yaffs_Device *dev,const void *data, int nBytes);
-+int yaffs_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes);
-
--int yaffs_CheckpointRead(yaffs_Device *dev,void *data, int nBytes);
-+int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes);
-
- int yaffs_GetCheckpointSum(yaffs_Device *dev, __u32 *sum);
-
---- a/fs/yaffs2/yaffs_ecc.c
-+++ b/fs/yaffs2/yaffs_ecc.c
-@@ -29,7 +29,7 @@
- */
-
- const char *yaffs_ecc_c_version =
-- "$Id: yaffs_ecc.c,v 1.9 2007-02-14 01:09:06 wookey Exp $";
-+ "$Id: yaffs_ecc.c,v 1.11 2009-03-06 17:20:50 wookey Exp $";
-
- #include "yportenv.h"
-
-@@ -109,12 +109,10 @@ void yaffs_ECCCalculate(const unsigned c
- b = column_parity_table[*data++];
- col_parity ^= b;
-
-- if (b & 0x01) // odd number of bits in the byte
-- {
-+ if (b & 0x01) { /* odd number of bits in the byte */
- line_parity ^= i;
- line_parity_prime ^= ~i;
- }
--
- }
-
- ecc[2] = (~col_parity) | 0x03;
-@@ -158,7 +156,7 @@ void yaffs_ECCCalculate(const unsigned c
- ecc[0] = ~t;
-
- #ifdef CONFIG_YAFFS_ECC_WRONG_ORDER
-- // Swap the bytes into the wrong order
-+ /* Swap the bytes into the wrong order */
- t = ecc[0];
- ecc[0] = ecc[1];
- ecc[1] = t;
-@@ -189,7 +187,7 @@ int yaffs_ECCCorrect(unsigned char *data
- unsigned bit;
-
- #ifdef CONFIG_YAFFS_ECC_WRONG_ORDER
-- // swap the bytes to correct for the wrong order
-+ /* swap the bytes to correct for the wrong order */
- unsigned char t;
-
- t = d0;
-@@ -251,7 +249,7 @@ int yaffs_ECCCorrect(unsigned char *data
- * ECCxxxOther does ECC calcs on arbitrary n bytes of data
- */
- void yaffs_ECCCalculateOther(const unsigned char *data, unsigned nBytes,
-- yaffs_ECCOther * eccOther)
-+ yaffs_ECCOther *eccOther)
- {
- unsigned int i;
-
-@@ -278,8 +276,8 @@ void yaffs_ECCCalculateOther(const unsig
- }
-
- int yaffs_ECCCorrectOther(unsigned char *data, unsigned nBytes,
-- yaffs_ECCOther * read_ecc,
-- const yaffs_ECCOther * test_ecc)
-+ yaffs_ECCOther *read_ecc,
-+ const yaffs_ECCOther *test_ecc)
- {
- unsigned char cDelta; /* column parity delta */
- unsigned lDelta; /* line parity delta */
-@@ -294,8 +292,7 @@ int yaffs_ECCCorrectOther(unsigned char
- return 0; /* no error */
-
- if (lDelta == ~lDeltaPrime &&
-- (((cDelta ^ (cDelta >> 1)) & 0x15) == 0x15))
-- {
-+ (((cDelta ^ (cDelta >> 1)) & 0x15) == 0x15)) {
- /* Single bit (recoverable) error in data */
-
- bit = 0;
-@@ -307,7 +304,7 @@ int yaffs_ECCCorrectOther(unsigned char
- if (cDelta & 0x02)
- bit |= 0x01;
-
-- if(lDelta >= nBytes)
-+ if (lDelta >= nBytes)
- return -1;
-
- data[lDelta] ^= (1 << bit);
-@@ -316,7 +313,7 @@ int yaffs_ECCCorrectOther(unsigned char
- }
-
- if ((yaffs_CountBits32(lDelta) + yaffs_CountBits32(lDeltaPrime) +
-- yaffs_CountBits(cDelta)) == 1) {
-+ yaffs_CountBits(cDelta)) == 1) {
- /* Reccoverable error in ecc */
-
- *read_ecc = *test_ecc;
-@@ -326,6 +323,4 @@ int yaffs_ECCCorrectOther(unsigned char
- /* Unrecoverable error */
-
- return -1;
--
- }
--
---- a/fs/yaffs2/yaffs_ecc.h
-+++ b/fs/yaffs2/yaffs_ecc.h
-@@ -13,15 +13,15 @@
- * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
- */
-
-- /*
-- * This code implements the ECC algorithm used in SmartMedia.
-- *
-- * The ECC comprises 22 bits of parity information and is stuffed into 3 bytes.
-- * The two unused bit are set to 1.
-- * The ECC can correct single bit errors in a 256-byte page of data. Thus, two such ECC
-- * blocks are used on a 512-byte NAND page.
-- *
-- */
-+/*
-+ * This code implements the ECC algorithm used in SmartMedia.
-+ *
-+ * The ECC comprises 22 bits of parity information and is stuffed into 3 bytes.
-+ * The two unused bit are set to 1.
-+ * The ECC can correct single bit errors in a 256-byte page of data. Thus, two such ECC
-+ * blocks are used on a 512-byte NAND page.
-+ *
-+ */
-
- #ifndef __YAFFS_ECC_H__
- #define __YAFFS_ECC_H__
-@@ -34,11 +34,11 @@ typedef struct {
-
- void yaffs_ECCCalculate(const unsigned char *data, unsigned char *ecc);
- int yaffs_ECCCorrect(unsigned char *data, unsigned char *read_ecc,
-- const unsigned char *test_ecc);
-+ const unsigned char *test_ecc);
-
- void yaffs_ECCCalculateOther(const unsigned char *data, unsigned nBytes,
-- yaffs_ECCOther * ecc);
-+ yaffs_ECCOther *ecc);
- int yaffs_ECCCorrectOther(unsigned char *data, unsigned nBytes,
-- yaffs_ECCOther * read_ecc,
-- const yaffs_ECCOther * test_ecc);
-+ yaffs_ECCOther *read_ecc,
-+ const yaffs_ECCOther *test_ecc);
- #endif
---- a/fs/yaffs2/yaffs_fs.c
-+++ b/fs/yaffs2/yaffs_fs.c
-@@ -1,7 +1,7 @@
- /*
- * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
- *
-- * Copyright (C) 2002-2007 Aleph One Ltd.
-+ * Copyright (C) 2002-2009 Aleph One Ltd.
- * for Toby Churchill Ltd and Brightstar Engineering
- *
- * Created by Charles Manning <charles@aleph1.co.uk>
-@@ -32,18 +32,17 @@
- */
-
- const char *yaffs_fs_c_version =
-- "$Id: yaffs_fs.c,v 1.63 2007-09-19 20:35:40 imcd Exp $";
-+ "$Id: yaffs_fs.c,v 1.79 2009-03-17 01:12:00 wookey Exp $";
- extern const char *yaffs_guts_c_version;
-
- #include <linux/version.h>
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
- #include <linux/config.h>
- #endif
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/slab.h>
- #include <linux/init.h>
--#include <linux/list.h>
- #include <linux/fs.h>
- #include <linux/proc_fs.h>
- #include <linux/smp_lock.h>
-@@ -53,10 +52,12 @@ extern const char *yaffs_guts_c_version;
- #include <linux/string.h>
- #include <linux/ctype.h>
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#include "asm/div64.h"
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-
- #include <linux/statfs.h> /* Added NCB 15-8-2003 */
--#include <asm/statfs.h>
-+#include <linux/statfs.h>
- #define UnlockPage(p) unlock_page(p)
- #define Page_Uptodate(page) test_bit(PG_uptodate, &(page)->flags)
-
-@@ -69,22 +70,45 @@ extern const char *yaffs_guts_c_version;
- #define BDEVNAME_SIZE 0
- #define yaffs_devname(sb, buf) kdevname(sb->s_dev)
-
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0))
- /* added NCB 26/5/2006 for 2.4.25-vrs2-tcl1 kernel */
- #define __user
- #endif
-
- #endif
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26))
-+#define YPROC_ROOT (&proc_root)
-+#else
-+#define YPROC_ROOT NULL
-+#endif
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- #define WRITE_SIZE_STR "writesize"
--#define WRITE_SIZE(mtd) (mtd)->writesize
-+#define WRITE_SIZE(mtd) ((mtd)->writesize)
- #else
- #define WRITE_SIZE_STR "oobblock"
--#define WRITE_SIZE(mtd) (mtd)->oobblock
-+#define WRITE_SIZE(mtd) ((mtd)->oobblock)
- #endif
-
--#include <asm/uaccess.h>
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 27))
-+#define YAFFS_USE_WRITE_BEGIN_END 1
-+#else
-+#define YAFFS_USE_WRITE_BEGIN_END 0
-+#endif
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 28))
-+static uint32_t YCALCBLOCKS(uint64_t partition_size, uint32_t block_size)
-+{
-+ uint64_t result = partition_size;
-+ do_div(result, block_size);
-+ return (uint32_t)result;
-+}
-+#else
-+#define YCALCBLOCKS(s, b) ((s)/(b))
-+#endif
-+
-+#include <linux/uaccess.h>
-
- #include "yportenv.h"
- #include "yaffs_guts.h"
-@@ -96,28 +120,44 @@ extern const char *yaffs_guts_c_version;
-
- unsigned int yaffs_traceMask = YAFFS_TRACE_BAD_BLOCKS;
- unsigned int yaffs_wr_attempts = YAFFS_WR_ATTEMPTS;
-+unsigned int yaffs_auto_checkpoint = 1;
-
- /* Module Parameters */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
--module_param(yaffs_traceMask,uint,0644);
--module_param(yaffs_wr_attempts,uint,0644);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-+module_param(yaffs_traceMask, uint, 0644);
-+module_param(yaffs_wr_attempts, uint, 0644);
-+module_param(yaffs_auto_checkpoint, uint, 0644);
-+#else
-+MODULE_PARM(yaffs_traceMask, "i");
-+MODULE_PARM(yaffs_wr_attempts, "i");
-+MODULE_PARM(yaffs_auto_checkpoint, "i");
-+#endif
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 25))
-+/* use iget and read_inode */
-+#define Y_IGET(sb, inum) iget((sb), (inum))
-+static void yaffs_read_inode(struct inode *inode);
-+
- #else
--MODULE_PARM(yaffs_traceMask,"i");
--MODULE_PARM(yaffs_wr_attempts,"i");
-+/* Call local equivalent */
-+#define YAFFS_USE_OWN_IGET
-+#define Y_IGET(sb, inum) yaffs_iget((sb), (inum))
-+
-+static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino);
- #endif
-
- /*#define T(x) printk x */
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
--#define yaffs_InodeToObjectLV(iptr) (iptr)->i_private
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18))
-+#define yaffs_InodeToObjectLV(iptr) ((iptr)->i_private)
- #else
--#define yaffs_InodeToObjectLV(iptr) (iptr)->u.generic_ip
-+#define yaffs_InodeToObjectLV(iptr) ((iptr)->u.generic_ip)
- #endif
-
- #define yaffs_InodeToObject(iptr) ((yaffs_Object *)(yaffs_InodeToObjectLV(iptr)))
- #define yaffs_DentryToObject(dptr) yaffs_InodeToObject((dptr)->d_inode)
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- #define yaffs_SuperToDevice(sb) ((yaffs_Device *)sb->s_fs_info)
- #else
- #define yaffs_SuperToDevice(sb) ((yaffs_Device *)sb->u.generic_sbp)
-@@ -126,47 +166,49 @@ MODULE_PARM(yaffs_wr_attempts,"i");
- static void yaffs_put_super(struct super_block *sb);
-
- static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n,
-- loff_t * pos);
-+ loff_t *pos);
-+static ssize_t yaffs_hold_space(struct file *f);
-+static void yaffs_release_space(struct file *f);
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_file_flush(struct file *file, fl_owner_t id);
- #else
- static int yaffs_file_flush(struct file *file);
- #endif
-
- static int yaffs_sync_object(struct file *file, struct dentry *dentry,
-- int datasync);
-+ int datasync);
-
- static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir);
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode,
- struct nameidata *n);
- static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry,
-- struct nameidata *n);
-+ struct nameidata *n);
- #else
- static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode);
- static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry);
- #endif
- static int yaffs_link(struct dentry *old_dentry, struct inode *dir,
-- struct dentry *dentry);
-+ struct dentry *dentry);
- static int yaffs_unlink(struct inode *dir, struct dentry *dentry);
- static int yaffs_symlink(struct inode *dir, struct dentry *dentry,
-- const char *symname);
-+ const char *symname);
- static int yaffs_mkdir(struct inode *dir, struct dentry *dentry, int mode);
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
-- dev_t dev);
-+ dev_t dev);
- #else
- static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
-- int dev);
-+ int dev);
- #endif
- static int yaffs_rename(struct inode *old_dir, struct dentry *old_dentry,
- struct inode *new_dir, struct dentry *new_dentry);
- static int yaffs_setattr(struct dentry *dentry, struct iattr *attr);
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_sync_fs(struct super_block *sb, int wait);
- static void yaffs_write_super(struct super_block *sb);
- #else
-@@ -174,33 +216,47 @@ static int yaffs_sync_fs(struct super_bl
- static int yaffs_write_super(struct super_block *sb);
- #endif
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_statfs(struct dentry *dentry, struct kstatfs *buf);
--#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_statfs(struct super_block *sb, struct kstatfs *buf);
- #else
- static int yaffs_statfs(struct super_block *sb, struct statfs *buf);
- #endif
--static void yaffs_read_inode(struct inode *inode);
-
-+#ifdef YAFFS_HAS_PUT_INODE
- static void yaffs_put_inode(struct inode *inode);
-+#endif
-+
- static void yaffs_delete_inode(struct inode *);
- static void yaffs_clear_inode(struct inode *);
-
- static int yaffs_readpage(struct file *file, struct page *page);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_writepage(struct page *page, struct writeback_control *wbc);
- #else
- static int yaffs_writepage(struct page *page);
- #endif
-+
-+
-+#if (YAFFS_USE_WRITE_BEGIN_END != 0)
-+static int yaffs_write_begin(struct file *filp, struct address_space *mapping,
-+ loff_t pos, unsigned len, unsigned flags,
-+ struct page **pagep, void **fsdata);
-+static int yaffs_write_end(struct file *filp, struct address_space *mapping,
-+ loff_t pos, unsigned len, unsigned copied,
-+ struct page *pg, void *fsdadata);
-+#else
- static int yaffs_prepare_write(struct file *f, struct page *pg,
-- unsigned offset, unsigned to);
-+ unsigned offset, unsigned to);
- static int yaffs_commit_write(struct file *f, struct page *pg, unsigned offset,
-- unsigned to);
-+ unsigned to);
-
--static int yaffs_readlink(struct dentry *dentry, char __user * buffer,
-- int buflen);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-+#endif
-+
-+static int yaffs_readlink(struct dentry *dentry, char __user *buffer,
-+ int buflen);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
- static void *yaffs_follow_link(struct dentry *dentry, struct nameidata *nd);
- #else
- static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd);
-@@ -209,12 +265,17 @@ static int yaffs_follow_link(struct dent
- static struct address_space_operations yaffs_file_address_operations = {
- .readpage = yaffs_readpage,
- .writepage = yaffs_writepage,
-+#if (YAFFS_USE_WRITE_BEGIN_END > 0)
-+ .write_begin = yaffs_write_begin,
-+ .write_end = yaffs_write_end,
-+#else
- .prepare_write = yaffs_prepare_write,
- .commit_write = yaffs_commit_write,
-+#endif
- };
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22))
--static struct file_operations yaffs_file_operations = {
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22))
-+static const struct file_operations yaffs_file_operations = {
- .read = do_sync_read,
- .write = do_sync_write,
- .aio_read = generic_file_aio_read,
-@@ -224,11 +285,12 @@ static struct file_operations yaffs_file
- .fsync = yaffs_sync_object,
- .splice_read = generic_file_splice_read,
- .splice_write = generic_file_splice_write,
-+ .llseek = generic_file_llseek,
- };
-
--#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
-+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18))
-
--static struct file_operations yaffs_file_operations = {
-+static const struct file_operations yaffs_file_operations = {
- .read = do_sync_read,
- .write = do_sync_write,
- .aio_read = generic_file_aio_read,
-@@ -241,29 +303,29 @@ static struct file_operations yaffs_file
-
- #else
-
--static struct file_operations yaffs_file_operations = {
-+static const struct file_operations yaffs_file_operations = {
- .read = generic_file_read,
- .write = generic_file_write,
- .mmap = generic_file_mmap,
- .flush = yaffs_file_flush,
- .fsync = yaffs_sync_object,
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- .sendfile = generic_file_sendfile,
- #endif
- };
- #endif
-
--static struct inode_operations yaffs_file_inode_operations = {
-+static const struct inode_operations yaffs_file_inode_operations = {
- .setattr = yaffs_setattr,
- };
-
--static struct inode_operations yaffs_symlink_inode_operations = {
-+static const struct inode_operations yaffs_symlink_inode_operations = {
- .readlink = yaffs_readlink,
- .follow_link = yaffs_follow_link,
- .setattr = yaffs_setattr,
- };
-
--static struct inode_operations yaffs_dir_inode_operations = {
-+static const struct inode_operations yaffs_dir_inode_operations = {
- .create = yaffs_create,
- .lookup = yaffs_lookup,
- .link = yaffs_link,
-@@ -276,16 +338,21 @@ static struct inode_operations yaffs_dir
- .setattr = yaffs_setattr,
- };
-
--static struct file_operations yaffs_dir_operations = {
-+static const struct file_operations yaffs_dir_operations = {
- .read = generic_read_dir,
- .readdir = yaffs_readdir,
- .fsync = yaffs_sync_object,
- };
-
--static struct super_operations yaffs_super_ops = {
-+static const struct super_operations yaffs_super_ops = {
- .statfs = yaffs_statfs,
-+
-+#ifndef YAFFS_USE_OWN_IGET
- .read_inode = yaffs_read_inode,
-+#endif
-+#ifdef YAFFS_HAS_PUT_INODE
- .put_inode = yaffs_put_inode,
-+#endif
- .put_super = yaffs_put_super,
- .delete_inode = yaffs_delete_inode,
- .clear_inode = yaffs_clear_inode,
-@@ -293,22 +360,21 @@ static struct super_operations yaffs_sup
- .write_super = yaffs_write_super,
- };
-
--static void yaffs_GrossLock(yaffs_Device * dev)
-+static void yaffs_GrossLock(yaffs_Device *dev)
- {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs locking\n"));
--
-+ T(YAFFS_TRACE_OS, ("yaffs locking %p\n", current));
- down(&dev->grossLock);
-+ T(YAFFS_TRACE_OS, ("yaffs locked %p\n", current));
- }
-
--static void yaffs_GrossUnlock(yaffs_Device * dev)
-+static void yaffs_GrossUnlock(yaffs_Device *dev)
- {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs unlocking\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs unlocking %p\n", current));
- up(&dev->grossLock);
--
- }
-
--static int yaffs_readlink(struct dentry *dentry, char __user * buffer,
-- int buflen)
-+static int yaffs_readlink(struct dentry *dentry, char __user *buffer,
-+ int buflen)
- {
- unsigned char *alias;
- int ret;
-@@ -329,7 +395,7 @@ static int yaffs_readlink(struct dentry
- return ret;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
- static void *yaffs_follow_link(struct dentry *dentry, struct nameidata *nd)
- #else
- static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd)
-@@ -345,32 +411,31 @@ static int yaffs_follow_link(struct dent
-
- yaffs_GrossUnlock(dev);
-
-- if (!alias)
-- {
-+ if (!alias) {
- ret = -ENOMEM;
- goto out;
-- }
-+ }
-
- ret = vfs_follow_link(nd, alias);
- kfree(alias);
- out:
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-- return ERR_PTR (ret);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
-+ return ERR_PTR(ret);
- #else
- return ret;
- #endif
- }
-
- struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev,
-- yaffs_Object * obj);
-+ yaffs_Object *obj);
-
- /*
- * Lookup is used to find objects in the fs
- */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-
- static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry,
-- struct nameidata *n)
-+ struct nameidata *n)
- #else
- static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry)
- #endif
-@@ -383,12 +448,11 @@ static struct dentry *yaffs_lookup(struc
- yaffs_GrossLock(dev);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_lookup for %d:%s\n",
-- yaffs_InodeToObject(dir)->objectId, dentry->d_name.name));
-+ ("yaffs_lookup for %d:%s\n",
-+ yaffs_InodeToObject(dir)->objectId, dentry->d_name.name));
-
-- obj =
-- yaffs_FindObjectByName(yaffs_InodeToObject(dir),
-- dentry->d_name.name);
-+ obj = yaffs_FindObjectByName(yaffs_InodeToObject(dir),
-+ dentry->d_name.name);
-
- obj = yaffs_GetEquivalentObject(obj); /* in case it was a hardlink */
-
-@@ -397,13 +461,13 @@ static struct dentry *yaffs_lookup(struc
-
- if (obj) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_lookup found %d\n", obj->objectId));
-+ ("yaffs_lookup found %d\n", obj->objectId));
-
- inode = yaffs_get_inode(dir->i_sb, obj->yst_mode, 0, obj);
-
- if (inode) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_loookup dentry \n"));
-+ ("yaffs_loookup dentry \n"));
- /* #if 0 asserted by NCB for 2.5/6 compatability - falls through to
- * d_add even if NULL inode */
- #if 0
-@@ -416,7 +480,7 @@ static struct dentry *yaffs_lookup(struc
- }
-
- } else {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_lookup not found\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_lookup not found\n"));
-
- }
-
-@@ -425,20 +489,22 @@ static struct dentry *yaffs_lookup(struc
- d_add(dentry, inode);
-
- return NULL;
-- /* return (ERR_PTR(-EIO)); */
--
- }
-
-+
-+#ifdef YAFFS_HAS_PUT_INODE
-+
- /* For now put inode is just for debugging
- * Put inode is called when the inode **structure** is put.
- */
- static void yaffs_put_inode(struct inode *inode)
- {
- T(YAFFS_TRACE_OS,
-- ("yaffs_put_inode: ino %d, count %d\n", (int)inode->i_ino,
-- atomic_read(&inode->i_count)));
-+ ("yaffs_put_inode: ino %d, count %d\n", (int)inode->i_ino,
-+ atomic_read(&inode->i_count)));
-
- }
-+#endif
-
- /* clear is called to tell the fs to release any per-inode data it holds */
- static void yaffs_clear_inode(struct inode *inode)
-@@ -449,9 +515,9 @@ static void yaffs_clear_inode(struct ino
- obj = yaffs_InodeToObject(inode);
-
- T(YAFFS_TRACE_OS,
-- ("yaffs_clear_inode: ino %d, count %d %s\n", (int)inode->i_ino,
-- atomic_read(&inode->i_count),
-- obj ? "object exists" : "null object"));
-+ ("yaffs_clear_inode: ino %d, count %d %s\n", (int)inode->i_ino,
-+ atomic_read(&inode->i_count),
-+ obj ? "object exists" : "null object"));
-
- if (obj) {
- dev = obj->myDev;
-@@ -486,23 +552,23 @@ static void yaffs_delete_inode(struct in
- yaffs_Device *dev;
-
- T(YAFFS_TRACE_OS,
-- ("yaffs_delete_inode: ino %d, count %d %s\n", (int)inode->i_ino,
-- atomic_read(&inode->i_count),
-- obj ? "object exists" : "null object"));
-+ ("yaffs_delete_inode: ino %d, count %d %s\n", (int)inode->i_ino,
-+ atomic_read(&inode->i_count),
-+ obj ? "object exists" : "null object"));
-
- if (obj) {
- dev = obj->myDev;
- yaffs_GrossLock(dev);
-- yaffs_DeleteFile(obj);
-+ yaffs_DeleteObject(obj);
- yaffs_GrossUnlock(dev);
- }
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-- truncate_inode_pages (&inode->i_data, 0);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
-+ truncate_inode_pages(&inode->i_data, 0);
- #endif
- clear_inode(inode);
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_file_flush(struct file *file, fl_owner_t id)
- #else
- static int yaffs_file_flush(struct file *file)
-@@ -513,8 +579,8 @@ static int yaffs_file_flush(struct file
- yaffs_Device *dev = obj->myDev;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_file_flush object %d (%s)\n", obj->objectId,
-- obj->dirty ? "dirty" : "clean"));
-+ ("yaffs_file_flush object %d (%s)\n", obj->objectId,
-+ obj->dirty ? "dirty" : "clean"));
-
- yaffs_GrossLock(dev);
-
-@@ -535,15 +601,15 @@ static int yaffs_readpage_nolock(struct
-
- yaffs_Device *dev;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_readpage at %08x, size %08x\n",
-- (unsigned)(pg->index << PAGE_CACHE_SHIFT),
-- (unsigned)PAGE_CACHE_SIZE));
-+ T(YAFFS_TRACE_OS, ("yaffs_readpage at %08x, size %08x\n",
-+ (unsigned)(pg->index << PAGE_CACHE_SHIFT),
-+ (unsigned)PAGE_CACHE_SIZE));
-
- obj = yaffs_DentryToObject(f->f_dentry);
-
- dev = obj->myDev;
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- BUG_ON(!PageLocked(pg));
- #else
- if (!PageLocked(pg))
-@@ -555,9 +621,9 @@ static int yaffs_readpage_nolock(struct
-
- yaffs_GrossLock(dev);
-
-- ret =
-- yaffs_ReadDataFromFile(obj, pg_buf, pg->index << PAGE_CACHE_SHIFT,
-- PAGE_CACHE_SIZE);
-+ ret = yaffs_ReadDataFromFile(obj, pg_buf,
-+ pg->index << PAGE_CACHE_SHIFT,
-+ PAGE_CACHE_SIZE);
-
- yaffs_GrossUnlock(dev);
-
-@@ -575,7 +641,7 @@ static int yaffs_readpage_nolock(struct
- flush_dcache_page(pg);
- kunmap(pg);
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_readpage done\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_readpage done\n"));
- return ret;
- }
-
-@@ -593,7 +659,7 @@ static int yaffs_readpage(struct file *f
-
- /* writepage inspired by/stolen from smbfs */
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_writepage(struct page *page, struct writeback_control *wbc)
- #else
- static int yaffs_writepage(struct page *page)
-@@ -616,12 +682,11 @@ static int yaffs_writepage(struct page *
-
- if (offset > inode->i_size) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_writepage at %08x, inode size = %08x!!!\n",
-- (unsigned)(page->index << PAGE_CACHE_SHIFT),
-- (unsigned)inode->i_size));
-+ ("yaffs_writepage at %08x, inode size = %08x!!!\n",
-+ (unsigned)(page->index << PAGE_CACHE_SHIFT),
-+ (unsigned)inode->i_size));
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG " -> don't care!!\n"));
-+ (" -> don't care!!\n"));
- unlock_page(page);
- return 0;
- }
-@@ -629,11 +694,10 @@ static int yaffs_writepage(struct page *
- end_index = inode->i_size >> PAGE_CACHE_SHIFT;
-
- /* easy case */
-- if (page->index < end_index) {
-+ if (page->index < end_index)
- nBytes = PAGE_CACHE_SIZE;
-- } else {
-+ else
- nBytes = inode->i_size & (PAGE_CACHE_SIZE - 1);
-- }
-
- get_page(page);
-
-@@ -643,19 +707,18 @@ static int yaffs_writepage(struct page *
- yaffs_GrossLock(obj->myDev);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_writepage at %08x, size %08x\n",
-- (unsigned)(page->index << PAGE_CACHE_SHIFT), nBytes));
-+ ("yaffs_writepage at %08x, size %08x\n",
-+ (unsigned)(page->index << PAGE_CACHE_SHIFT), nBytes));
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "writepag0: obj = %05x, ino = %05x\n",
-- (int)obj->variant.fileVariant.fileSize, (int)inode->i_size));
-+ ("writepag0: obj = %05x, ino = %05x\n",
-+ (int)obj->variant.fileVariant.fileSize, (int)inode->i_size));
-
-- nWritten =
-- yaffs_WriteDataToFile(obj, buffer, page->index << PAGE_CACHE_SHIFT,
-- nBytes, 0);
-+ nWritten = yaffs_WriteDataToFile(obj, buffer,
-+ page->index << PAGE_CACHE_SHIFT, nBytes, 0);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "writepag1: obj = %05x, ino = %05x\n",
-- (int)obj->variant.fileVariant.fileSize, (int)inode->i_size));
-+ ("writepag1: obj = %05x, ino = %05x\n",
-+ (int)obj->variant.fileVariant.fileSize, (int)inode->i_size));
-
- yaffs_GrossUnlock(obj->myDev);
-
-@@ -667,100 +730,207 @@ static int yaffs_writepage(struct page *
- return (nWritten == nBytes) ? 0 : -ENOSPC;
- }
-
-+
-+#if (YAFFS_USE_WRITE_BEGIN_END > 0)
-+static int yaffs_write_begin(struct file *filp, struct address_space *mapping,
-+ loff_t pos, unsigned len, unsigned flags,
-+ struct page **pagep, void **fsdata)
-+{
-+ struct page *pg = NULL;
-+ pgoff_t index = pos >> PAGE_CACHE_SHIFT;
-+ uint32_t offset = pos & (PAGE_CACHE_SIZE - 1);
-+ uint32_t to = offset + len;
-+
-+ int ret = 0;
-+ int space_held = 0;
-+
-+ T(YAFFS_TRACE_OS, ("start yaffs_write_begin\n"));
-+ /* Get a page */
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 28)
-+ pg = grab_cache_page_write_begin(mapping, index, flags);
-+#else
-+ pg = __grab_cache_page(mapping, index);
-+#endif
-+
-+ *pagep = pg;
-+ if (!pg) {
-+ ret = -ENOMEM;
-+ goto out;
-+ }
-+ /* Get fs space */
-+ space_held = yaffs_hold_space(filp);
-+
-+ if (!space_held) {
-+ ret = -ENOSPC;
-+ goto out;
-+ }
-+
-+ /* Update page if required */
-+
-+ if (!Page_Uptodate(pg) && (offset || to < PAGE_CACHE_SIZE))
-+ ret = yaffs_readpage_nolock(filp, pg);
-+
-+ if (ret)
-+ goto out;
-+
-+ /* Happy path return */
-+ T(YAFFS_TRACE_OS, ("end yaffs_write_begin - ok\n"));
-+
-+ return 0;
-+
-+out:
-+ T(YAFFS_TRACE_OS, ("end yaffs_write_begin fail returning %d\n", ret));
-+ if (space_held)
-+ yaffs_release_space(filp);
-+ if (pg) {
-+ unlock_page(pg);
-+ page_cache_release(pg);
-+ }
-+ return ret;
-+}
-+
-+#else
-+
- static int yaffs_prepare_write(struct file *f, struct page *pg,
-- unsigned offset, unsigned to)
-+ unsigned offset, unsigned to)
- {
-+ T(YAFFS_TRACE_OS, ("yaffs_prepair_write\n"));
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_prepair_write\n"));
- if (!Page_Uptodate(pg) && (offset || to < PAGE_CACHE_SIZE))
- return yaffs_readpage_nolock(f, pg);
--
- return 0;
-+}
-+#endif
-+
-+#if (YAFFS_USE_WRITE_BEGIN_END > 0)
-+static int yaffs_write_end(struct file *filp, struct address_space *mapping,
-+ loff_t pos, unsigned len, unsigned copied,
-+ struct page *pg, void *fsdadata)
-+{
-+ int ret = 0;
-+ void *addr, *kva;
-+ uint32_t offset_into_page = pos & (PAGE_CACHE_SIZE - 1);
-+
-+ kva = kmap(pg);
-+ addr = kva + offset_into_page;
-+
-+ T(YAFFS_TRACE_OS,
-+ ("yaffs_write_end addr %x pos %x nBytes %d\n",
-+ (unsigned) addr,
-+ (int)pos, copied));
-+
-+ ret = yaffs_file_write(filp, addr, copied, &pos);
-+
-+ if (ret != copied) {
-+ T(YAFFS_TRACE_OS,
-+ ("yaffs_write_end not same size ret %d copied %d\n",
-+ ret, copied));
-+ SetPageError(pg);
-+ ClearPageUptodate(pg);
-+ } else {
-+ SetPageUptodate(pg);
-+ }
-+
-+ kunmap(pg);
-
-+ yaffs_release_space(filp);
-+ unlock_page(pg);
-+ page_cache_release(pg);
-+ return ret;
- }
-+#else
-
- static int yaffs_commit_write(struct file *f, struct page *pg, unsigned offset,
-- unsigned to)
-+ unsigned to)
- {
-+ void *addr, *kva;
-
-- void *addr = page_address(pg) + offset;
- loff_t pos = (((loff_t) pg->index) << PAGE_CACHE_SHIFT) + offset;
- int nBytes = to - offset;
- int nWritten;
-
- unsigned spos = pos;
-- unsigned saddr = (unsigned)addr;
-+ unsigned saddr;
-+
-+ kva = kmap(pg);
-+ addr = kva + offset;
-+
-+ saddr = (unsigned) addr;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_commit_write addr %x pos %x nBytes %d\n", saddr,
-- spos, nBytes));
-+ ("yaffs_commit_write addr %x pos %x nBytes %d\n",
-+ saddr, spos, nBytes));
-
- nWritten = yaffs_file_write(f, addr, nBytes, &pos);
-
- if (nWritten != nBytes) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_commit_write not same size nWritten %d nBytes %d\n",
-- nWritten, nBytes));
-+ ("yaffs_commit_write not same size nWritten %d nBytes %d\n",
-+ nWritten, nBytes));
- SetPageError(pg);
- ClearPageUptodate(pg);
- } else {
- SetPageUptodate(pg);
- }
-
-+ kunmap(pg);
-+
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_commit_write returning %d\n",
-- nWritten == nBytes ? 0 : nWritten));
-+ ("yaffs_commit_write returning %d\n",
-+ nWritten == nBytes ? 0 : nWritten));
-
- return nWritten == nBytes ? 0 : nWritten;
--
- }
-+#endif
-+
-
--static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object * obj)
-+static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object *obj)
- {
- if (inode && obj) {
-
-
- /* Check mode against the variant type and attempt to repair if broken. */
-- __u32 mode = obj->yst_mode;
-- switch( obj->variantType ){
-- case YAFFS_OBJECT_TYPE_FILE :
-- if( ! S_ISREG(mode) ){
-- obj->yst_mode &= ~S_IFMT;
-- obj->yst_mode |= S_IFREG;
-- }
--
-- break;
-- case YAFFS_OBJECT_TYPE_SYMLINK :
-- if( ! S_ISLNK(mode) ){
-- obj->yst_mode &= ~S_IFMT;
-- obj->yst_mode |= S_IFLNK;
-- }
--
-- break;
-- case YAFFS_OBJECT_TYPE_DIRECTORY :
-- if( ! S_ISDIR(mode) ){
-- obj->yst_mode &= ~S_IFMT;
-- obj->yst_mode |= S_IFDIR;
-- }
--
-- break;
-- case YAFFS_OBJECT_TYPE_UNKNOWN :
-- case YAFFS_OBJECT_TYPE_HARDLINK :
-- case YAFFS_OBJECT_TYPE_SPECIAL :
-- default:
-- /* TODO? */
-- break;
-- }
-+ __u32 mode = obj->yst_mode;
-+ switch (obj->variantType) {
-+ case YAFFS_OBJECT_TYPE_FILE:
-+ if (!S_ISREG(mode)) {
-+ obj->yst_mode &= ~S_IFMT;
-+ obj->yst_mode |= S_IFREG;
-+ }
-+
-+ break;
-+ case YAFFS_OBJECT_TYPE_SYMLINK:
-+ if (!S_ISLNK(mode)) {
-+ obj->yst_mode &= ~S_IFMT;
-+ obj->yst_mode |= S_IFLNK;
-+ }
-+
-+ break;
-+ case YAFFS_OBJECT_TYPE_DIRECTORY:
-+ if (!S_ISDIR(mode)) {
-+ obj->yst_mode &= ~S_IFMT;
-+ obj->yst_mode |= S_IFDIR;
-+ }
-+
-+ break;
-+ case YAFFS_OBJECT_TYPE_UNKNOWN:
-+ case YAFFS_OBJECT_TYPE_HARDLINK:
-+ case YAFFS_OBJECT_TYPE_SPECIAL:
-+ default:
-+ /* TODO? */
-+ break;
-+ }
-+
-+ inode->i_flags |= S_NOATIME;
-
- inode->i_ino = obj->objectId;
- inode->i_mode = obj->yst_mode;
- inode->i_uid = obj->yst_uid;
- inode->i_gid = obj->yst_gid;
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
- inode->i_blksize = inode->i_sb->s_blocksize;
- #endif
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-
- inode->i_rdev = old_decode_dev(obj->yst_rdev);
- inode->i_atime.tv_sec = (time_t) (obj->yst_atime);
-@@ -781,26 +951,25 @@ static void yaffs_FillInodeFromObject(st
- inode->i_nlink = yaffs_GetObjectLinkCount(obj);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_FillInode mode %x uid %d gid %d size %d count %d\n",
-- inode->i_mode, inode->i_uid, inode->i_gid,
-- (int)inode->i_size, atomic_read(&inode->i_count)));
-+ ("yaffs_FillInode mode %x uid %d gid %d size %d count %d\n",
-+ inode->i_mode, inode->i_uid, inode->i_gid,
-+ (int)inode->i_size, atomic_read(&inode->i_count)));
-
- switch (obj->yst_mode & S_IFMT) {
- default: /* fifo, device or socket */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- init_special_inode(inode, obj->yst_mode,
-- old_decode_dev(obj->yst_rdev));
-+ old_decode_dev(obj->yst_rdev));
- #else
- init_special_inode(inode, obj->yst_mode,
-- (dev_t) (obj->yst_rdev));
-+ (dev_t) (obj->yst_rdev));
- #endif
- break;
- case S_IFREG: /* file */
- inode->i_op = &yaffs_file_inode_operations;
- inode->i_fop = &yaffs_file_operations;
- inode->i_mapping->a_ops =
-- &yaffs_file_address_operations;
-+ &yaffs_file_address_operations;
- break;
- case S_IFDIR: /* directory */
- inode->i_op = &yaffs_dir_inode_operations;
-@@ -817,34 +986,36 @@ static void yaffs_FillInodeFromObject(st
-
- } else {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_FileInode invalid parameters\n"));
-+ ("yaffs_FileInode invalid parameters\n"));
- }
-
- }
-
- struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev,
-- yaffs_Object * obj)
-+ yaffs_Object *obj)
- {
- struct inode *inode;
-
- if (!sb) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_get_inode for NULL super_block!!\n"));
-+ ("yaffs_get_inode for NULL super_block!!\n"));
- return NULL;
-
- }
-
- if (!obj) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_get_inode for NULL object!!\n"));
-+ ("yaffs_get_inode for NULL object!!\n"));
- return NULL;
-
- }
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_get_inode for object %d\n", obj->objectId));
-+ ("yaffs_get_inode for object %d\n", obj->objectId));
-
-- inode = iget(sb, obj->objectId);
-+ inode = Y_IGET(sb, obj->objectId);
-+ if (IS_ERR(inode))
-+ return NULL;
-
- /* NB Side effect: iget calls back to yaffs_read_inode(). */
- /* iget also increments the inode's i_count */
-@@ -854,7 +1025,7 @@ struct inode *yaffs_get_inode(struct sup
- }
-
- static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n,
-- loff_t * pos)
-+ loff_t *pos)
- {
- yaffs_Object *obj;
- int nWritten, ipos;
-@@ -869,28 +1040,26 @@ static ssize_t yaffs_file_write(struct f
-
- inode = f->f_dentry->d_inode;
-
-- if (!S_ISBLK(inode->i_mode) && f->f_flags & O_APPEND) {
-+ if (!S_ISBLK(inode->i_mode) && f->f_flags & O_APPEND)
- ipos = inode->i_size;
-- } else {
-+ else
- ipos = *pos;
-- }
-
-- if (!obj) {
-+ if (!obj)
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_file_write: hey obj is null!\n"));
-- } else {
-+ ("yaffs_file_write: hey obj is null!\n"));
-+ else
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_file_write about to write writing %d bytes"
-- "to object %d at %d\n",
-- n, obj->objectId, ipos));
-- }
-+ ("yaffs_file_write about to write writing %zu bytes"
-+ "to object %d at %d\n",
-+ n, obj->objectId, ipos));
-
- nWritten = yaffs_WriteDataToFile(obj, buf, ipos, n, 0);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_file_write writing %d bytes, %d written at %d\n",
-- n, nWritten, ipos));
-+ ("yaffs_file_write writing %zu bytes, %d written at %d\n",
-+ n, nWritten, ipos));
-+
- if (nWritten > 0) {
- ipos += nWritten;
- *pos = ipos;
-@@ -899,10 +1068,9 @@ static ssize_t yaffs_file_write(struct f
- inode->i_blocks = (ipos + 511) >> 9;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_file_write size updated to %d bytes, "
-- "%d blocks\n",
-- ipos, (int)(inode->i_blocks)));
-+ ("yaffs_file_write size updated to %d bytes, "
-+ "%d blocks\n",
-+ ipos, (int)(inode->i_blocks)));
- }
-
- }
-@@ -910,13 +1078,54 @@ static ssize_t yaffs_file_write(struct f
- return nWritten == 0 ? -ENOSPC : nWritten;
- }
-
-+/* Space holding and freeing is done to ensure we have space available for write_begin/end */
-+/* For now we just assume few parallel writes and check against a small number. */
-+/* Todo: need to do this with a counter to handle parallel reads better */
-+
-+static ssize_t yaffs_hold_space(struct file *f)
-+{
-+ yaffs_Object *obj;
-+ yaffs_Device *dev;
-+
-+ int nFreeChunks;
-+
-+
-+ obj = yaffs_DentryToObject(f->f_dentry);
-+
-+ dev = obj->myDev;
-+
-+ yaffs_GrossLock(dev);
-+
-+ nFreeChunks = yaffs_GetNumberOfFreeChunks(dev);
-+
-+ yaffs_GrossUnlock(dev);
-+
-+ return (nFreeChunks > 20) ? 1 : 0;
-+}
-+
-+static void yaffs_release_space(struct file *f)
-+{
-+ yaffs_Object *obj;
-+ yaffs_Device *dev;
-+
-+
-+ obj = yaffs_DentryToObject(f->f_dentry);
-+
-+ dev = obj->myDev;
-+
-+ yaffs_GrossLock(dev);
-+
-+
-+ yaffs_GrossUnlock(dev);
-+}
-+
- static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir)
- {
- yaffs_Object *obj;
- yaffs_Device *dev;
- struct inode *inode = f->f_dentry->d_inode;
- unsigned long offset, curoffs;
-- struct list_head *i;
-+ struct ylist_head *i;
- yaffs_Object *l;
-
- char name[YAFFS_MAX_NAME_LENGTH + 1];
-@@ -932,24 +1141,20 @@ static int yaffs_readdir(struct file *f,
-
- if (offset == 0) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_readdir: entry . ino %d \n",
-- (int)inode->i_ino));
-- if (filldir(dirent, ".", 1, offset, inode->i_ino, DT_DIR)
-- < 0) {
-+ ("yaffs_readdir: entry . ino %d \n",
-+ (int)inode->i_ino));
-+ if (filldir(dirent, ".", 1, offset, inode->i_ino, DT_DIR) < 0)
- goto out;
-- }
- offset++;
- f->f_pos++;
- }
- if (offset == 1) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_readdir: entry .. ino %d \n",
-- (int)f->f_dentry->d_parent->d_inode->i_ino));
-- if (filldir
-- (dirent, "..", 2, offset,
-- f->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0) {
-+ ("yaffs_readdir: entry .. ino %d \n",
-+ (int)f->f_dentry->d_parent->d_inode->i_ino));
-+ if (filldir(dirent, "..", 2, offset,
-+ f->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0)
- goto out;
-- }
- offset++;
- f->f_pos++;
- }
-@@ -965,35 +1170,32 @@ static int yaffs_readdir(struct file *f,
- f->f_version = inode->i_version;
- }
-
-- list_for_each(i, &obj->variant.directoryVariant.children) {
-+ ylist_for_each(i, &obj->variant.directoryVariant.children) {
- curoffs++;
- if (curoffs >= offset) {
-- l = list_entry(i, yaffs_Object, siblings);
-+ l = ylist_entry(i, yaffs_Object, siblings);
-
- yaffs_GetObjectName(l, name,
- YAFFS_MAX_NAME_LENGTH + 1);
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_readdir: %s inode %d\n", name,
-+ ("yaffs_readdir: %s inode %d\n", name,
- yaffs_GetObjectInode(l)));
-
- if (filldir(dirent,
-- name,
-- strlen(name),
-- offset,
-- yaffs_GetObjectInode(l),
-- yaffs_GetObjectType(l))
-- < 0) {
-+ name,
-+ strlen(name),
-+ offset,
-+ yaffs_GetObjectInode(l),
-+ yaffs_GetObjectType(l)) < 0)
- goto up_and_out;
-- }
-
- offset++;
- f->f_pos++;
- }
- }
-
-- up_and_out:
-- out:
--
-+up_and_out:
-+out:
- yaffs_GrossUnlock(dev);
-
- return 0;
-@@ -1002,12 +1204,19 @@ static int yaffs_readdir(struct file *f,
- /*
- * File creation. Allocate an inode, and we're done..
- */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29)
-+#define YCRED(x) x
-+#else
-+#define YCRED(x) (x->cred)
-+#endif
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
-- dev_t rdev)
-+ dev_t rdev)
- #else
- static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
-- int rdev)
-+ int rdev)
- #endif
- {
- struct inode *inode;
-@@ -1018,25 +1227,25 @@ static int yaffs_mknod(struct inode *dir
- yaffs_Object *parent = yaffs_InodeToObject(dir);
-
- int error = -ENOSPC;
-- uid_t uid = current->fsuid;
-- gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid;
-+ uid_t uid = YCRED(current)->fsuid;
-+ gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid;
-
-- if((dir->i_mode & S_ISGID) && S_ISDIR(mode))
-+ if ((dir->i_mode & S_ISGID) && S_ISDIR(mode))
- mode |= S_ISGID;
-
- if (parent) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod: parent object %d type %d\n",
-- parent->objectId, parent->variantType));
-+ ("yaffs_mknod: parent object %d type %d\n",
-+ parent->objectId, parent->variantType));
- } else {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod: could not get parent object\n"));
-+ ("yaffs_mknod: could not get parent object\n"));
- return -EPERM;
- }
-
- T(YAFFS_TRACE_OS, ("yaffs_mknod: making oject for %s, "
-- "mode %x dev %x\n",
-- dentry->d_name.name, mode, rdev));
-+ "mode %x dev %x\n",
-+ dentry->d_name.name, mode, rdev));
-
- dev = parent->myDev;
-
-@@ -1045,33 +1254,28 @@ static int yaffs_mknod(struct inode *dir
- switch (mode & S_IFMT) {
- default:
- /* Special (socket, fifo, device...) */
-- T(YAFFS_TRACE_OS, (KERN_DEBUG
-- "yaffs_mknod: making special\n"));
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-- obj =
-- yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid,
-- gid, old_encode_dev(rdev));
--#else
-- obj =
-- yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid,
-- gid, rdev);
-+ T(YAFFS_TRACE_OS, ("yaffs_mknod: making special\n"));
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-+ obj = yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid,
-+ gid, old_encode_dev(rdev));
-+#else
-+ obj = yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid,
-+ gid, rdev);
- #endif
- break;
- case S_IFREG: /* file */
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_mknod: making file\n"));
-- obj =
-- yaffs_MknodFile(parent, dentry->d_name.name, mode, uid,
-- gid);
-+ T(YAFFS_TRACE_OS, ("yaffs_mknod: making file\n"));
-+ obj = yaffs_MknodFile(parent, dentry->d_name.name, mode, uid,
-+ gid);
- break;
- case S_IFDIR: /* directory */
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod: making directory\n"));
-- obj =
-- yaffs_MknodDirectory(parent, dentry->d_name.name, mode,
-- uid, gid);
-+ ("yaffs_mknod: making directory\n"));
-+ obj = yaffs_MknodDirectory(parent, dentry->d_name.name, mode,
-+ uid, gid);
- break;
- case S_IFLNK: /* symlink */
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_mknod: making file\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_mknod: making symlink\n"));
- obj = NULL; /* Do we ever get here? */
- break;
- }
-@@ -1083,12 +1287,12 @@ static int yaffs_mknod(struct inode *dir
- inode = yaffs_get_inode(dir->i_sb, mode, rdev, obj);
- d_instantiate(dentry, inode);
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod created object %d count = %d\n",
-- obj->objectId, atomic_read(&inode->i_count)));
-+ ("yaffs_mknod created object %d count = %d\n",
-+ obj->objectId, atomic_read(&inode->i_count)));
- error = 0;
- } else {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod failed making object\n"));
-+ ("yaffs_mknod failed making object\n"));
- error = -ENOMEM;
- }
-
-@@ -1098,25 +1302,19 @@ static int yaffs_mknod(struct inode *dir
- static int yaffs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
- {
- int retVal;
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_mkdir\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_mkdir\n"));
- retVal = yaffs_mknod(dir, dentry, mode | S_IFDIR, 0);
--#if 0
-- /* attempt to fix dir bug - didn't work */
-- if (!retVal) {
-- dget(dentry);
-- }
--#endif
- return retVal;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode,
- struct nameidata *n)
- #else
- static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode)
- #endif
- {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_create\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_create\n"));
- return yaffs_mknod(dir, dentry, mode | S_IFREG, 0);
- }
-
-@@ -1127,8 +1325,8 @@ static int yaffs_unlink(struct inode *di
- yaffs_Device *dev;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_unlink %d:%s\n", (int)(dir->i_ino),
-- dentry->d_name.name));
-+ ("yaffs_unlink %d:%s\n", (int)(dir->i_ino),
-+ dentry->d_name.name));
-
- dev = yaffs_InodeToObject(dir)->myDev;
-
-@@ -1151,82 +1349,74 @@ static int yaffs_unlink(struct inode *di
- * Create a link...
- */
- static int yaffs_link(struct dentry *old_dentry, struct inode *dir,
-- struct dentry *dentry)
-+ struct dentry *dentry)
- {
- struct inode *inode = old_dentry->d_inode;
- yaffs_Object *obj = NULL;
- yaffs_Object *link = NULL;
- yaffs_Device *dev;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_link\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_link\n"));
-
- obj = yaffs_InodeToObject(inode);
- dev = obj->myDev;
-
- yaffs_GrossLock(dev);
-
-- if (!S_ISDIR(inode->i_mode)) /* Don't link directories */
-- {
-- link =
-- yaffs_Link(yaffs_InodeToObject(dir), dentry->d_name.name,
-- obj);
-- }
-+ if (!S_ISDIR(inode->i_mode)) /* Don't link directories */
-+ link = yaffs_Link(yaffs_InodeToObject(dir), dentry->d_name.name,
-+ obj);
-
- if (link) {
- old_dentry->d_inode->i_nlink = yaffs_GetObjectLinkCount(obj);
- d_instantiate(dentry, old_dentry->d_inode);
- atomic_inc(&old_dentry->d_inode->i_count);
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_link link count %d i_count %d\n",
-- old_dentry->d_inode->i_nlink,
-- atomic_read(&old_dentry->d_inode->i_count)));
--
-+ ("yaffs_link link count %d i_count %d\n",
-+ old_dentry->d_inode->i_nlink,
-+ atomic_read(&old_dentry->d_inode->i_count)));
- }
-
- yaffs_GrossUnlock(dev);
-
-- if (link) {
--
-+ if (link)
- return 0;
-- }
-
- return -EPERM;
- }
-
- static int yaffs_symlink(struct inode *dir, struct dentry *dentry,
-- const char *symname)
-+ const char *symname)
- {
- yaffs_Object *obj;
- yaffs_Device *dev;
-- uid_t uid = current->fsuid;
-- gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid;
-+ uid_t uid = YCRED(current)->fsuid;
-+ gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_symlink\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_symlink\n"));
-
- dev = yaffs_InodeToObject(dir)->myDev;
- yaffs_GrossLock(dev);
- obj = yaffs_MknodSymLink(yaffs_InodeToObject(dir), dentry->d_name.name,
-- S_IFLNK | S_IRWXUGO, uid, gid, symname);
-+ S_IFLNK | S_IRWXUGO, uid, gid, symname);
- yaffs_GrossUnlock(dev);
-
- if (obj) {
--
- struct inode *inode;
-
- inode = yaffs_get_inode(dir->i_sb, obj->yst_mode, 0, obj);
- d_instantiate(dentry, inode);
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "symlink created OK\n"));
-+ T(YAFFS_TRACE_OS, ("symlink created OK\n"));
- return 0;
- } else {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "symlink not created\n"));
--
-+ T(YAFFS_TRACE_OS, ("symlink not created\n"));
- }
-
- return -ENOMEM;
- }
-
- static int yaffs_sync_object(struct file *file, struct dentry *dentry,
-- int datasync)
-+ int datasync)
- {
-
- yaffs_Object *obj;
-@@ -1236,7 +1426,7 @@ static int yaffs_sync_object(struct file
-
- dev = obj->myDev;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_sync_object\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_sync_object\n"));
- yaffs_GrossLock(dev);
- yaffs_FlushFile(obj, 1);
- yaffs_GrossUnlock(dev);
-@@ -1255,41 +1445,36 @@ static int yaffs_rename(struct inode *ol
- int retVal = YAFFS_FAIL;
- yaffs_Object *target;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_rename\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_rename\n"));
- dev = yaffs_InodeToObject(old_dir)->myDev;
-
- yaffs_GrossLock(dev);
-
- /* Check if the target is an existing directory that is not empty. */
-- target =
-- yaffs_FindObjectByName(yaffs_InodeToObject(new_dir),
-- new_dentry->d_name.name);
-+ target = yaffs_FindObjectByName(yaffs_InodeToObject(new_dir),
-+ new_dentry->d_name.name);
-
-
-
-- if (target &&
-- target->variantType == YAFFS_OBJECT_TYPE_DIRECTORY &&
-- !list_empty(&target->variant.directoryVariant.children)) {
-+ if (target && target->variantType == YAFFS_OBJECT_TYPE_DIRECTORY &&
-+ !ylist_empty(&target->variant.directoryVariant.children)) {
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "target is non-empty dir\n"));
-+ T(YAFFS_TRACE_OS, ("target is non-empty dir\n"));
-
- retVal = YAFFS_FAIL;
- } else {
--
- /* Now does unlinking internally using shadowing mechanism */
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "calling yaffs_RenameObject\n"));
--
-- retVal =
-- yaffs_RenameObject(yaffs_InodeToObject(old_dir),
-- old_dentry->d_name.name,
-- yaffs_InodeToObject(new_dir),
-- new_dentry->d_name.name);
-+ T(YAFFS_TRACE_OS, ("calling yaffs_RenameObject\n"));
-
-+ retVal = yaffs_RenameObject(yaffs_InodeToObject(old_dir),
-+ old_dentry->d_name.name,
-+ yaffs_InodeToObject(new_dir),
-+ new_dentry->d_name.name);
- }
- yaffs_GrossUnlock(dev);
-
- if (retVal == YAFFS_OK) {
-- if(target) {
-+ if (target) {
- new_dentry->d_inode->i_nlink--;
- mark_inode_dirty(new_dentry->d_inode);
- }
-@@ -1298,7 +1483,6 @@ static int yaffs_rename(struct inode *ol
- } else {
- return -ENOTEMPTY;
- }
--
- }
-
- static int yaffs_setattr(struct dentry *dentry, struct iattr *attr)
-@@ -1308,15 +1492,15 @@ static int yaffs_setattr(struct dentry *
- yaffs_Device *dev;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_setattr of object %d\n",
-- yaffs_InodeToObject(inode)->objectId));
--
-- if ((error = inode_change_ok(inode, attr)) == 0) {
-+ ("yaffs_setattr of object %d\n",
-+ yaffs_InodeToObject(inode)->objectId));
-
-+ error = inode_change_ok(inode, attr);
-+ if (error == 0) {
- dev = yaffs_InodeToObject(inode)->myDev;
- yaffs_GrossLock(dev);
- if (yaffs_SetAttributes(yaffs_InodeToObject(inode), attr) ==
-- YAFFS_OK) {
-+ YAFFS_OK) {
- error = 0;
- } else {
- error = -EPERM;
-@@ -1328,12 +1512,12 @@ static int yaffs_setattr(struct dentry *
- return error;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_statfs(struct dentry *dentry, struct kstatfs *buf)
- {
- yaffs_Device *dev = yaffs_DentryToObject(dentry)->myDev;
- struct super_block *sb = dentry->d_sb;
--#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_statfs(struct super_block *sb, struct kstatfs *buf)
- {
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-@@ -1343,32 +1527,53 @@ static int yaffs_statfs(struct super_blo
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
- #endif
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_statfs\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_statfs\n"));
-
- yaffs_GrossLock(dev);
-
- buf->f_type = YAFFS_MAGIC;
- buf->f_bsize = sb->s_blocksize;
- buf->f_namelen = 255;
-- if (sb->s_blocksize > dev->nDataBytesPerChunk) {
-+
-+ if (dev->nDataBytesPerChunk & (dev->nDataBytesPerChunk - 1)) {
-+ /* Do this if chunk size is not a power of 2 */
-+
-+ uint64_t bytesInDev;
-+ uint64_t bytesFree;
-+
-+ bytesInDev = ((uint64_t)((dev->endBlock - dev->startBlock + 1))) *
-+ ((uint64_t)(dev->nChunksPerBlock * dev->nDataBytesPerChunk));
-+
-+ do_div(bytesInDev, sb->s_blocksize); /* bytesInDev becomes the number of blocks */
-+ buf->f_blocks = bytesInDev;
-+
-+ bytesFree = ((uint64_t)(yaffs_GetNumberOfFreeChunks(dev))) *
-+ ((uint64_t)(dev->nDataBytesPerChunk));
-+
-+ do_div(bytesFree, sb->s_blocksize);
-+
-+ buf->f_bfree = bytesFree;
-+
-+ } else if (sb->s_blocksize > dev->nDataBytesPerChunk) {
-
- buf->f_blocks =
-- (dev->endBlock - dev->startBlock +
-- 1) * dev->nChunksPerBlock / (sb->s_blocksize /
-- dev->nDataBytesPerChunk);
-+ (dev->endBlock - dev->startBlock + 1) *
-+ dev->nChunksPerBlock /
-+ (sb->s_blocksize / dev->nDataBytesPerChunk);
- buf->f_bfree =
-- yaffs_GetNumberOfFreeChunks(dev) / (sb->s_blocksize /
-- dev->nDataBytesPerChunk);
-+ yaffs_GetNumberOfFreeChunks(dev) /
-+ (sb->s_blocksize / dev->nDataBytesPerChunk);
- } else {
--
- buf->f_blocks =
-- (dev->endBlock - dev->startBlock +
-- 1) * dev->nChunksPerBlock * (dev->nDataBytesPerChunk /
-- sb->s_blocksize);
-+ (dev->endBlock - dev->startBlock + 1) *
-+ dev->nChunksPerBlock *
-+ (dev->nDataBytesPerChunk / sb->s_blocksize);
-+
- buf->f_bfree =
-- yaffs_GetNumberOfFreeChunks(dev) * (dev->nDataBytesPerChunk /
-- sb->s_blocksize);
-+ yaffs_GetNumberOfFreeChunks(dev) *
-+ (dev->nDataBytesPerChunk / sb->s_blocksize);
- }
-+
- buf->f_files = 0;
- buf->f_ffree = 0;
- buf->f_bavail = buf->f_bfree;
-@@ -1378,18 +1583,19 @@ static int yaffs_statfs(struct super_blo
- }
-
-
--/**
- static int yaffs_do_sync_fs(struct super_block *sb)
- {
-
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_do_sync_fs\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_do_sync_fs\n"));
-
-- if(sb->s_dirt) {
-+ if (sb->s_dirt) {
- yaffs_GrossLock(dev);
-
-- if(dev)
-+ if (dev) {
-+ yaffs_FlushEntireDeviceCache(dev);
- yaffs_CheckpointSave(dev);
-+ }
-
- yaffs_GrossUnlock(dev);
-
-@@ -1397,35 +1603,73 @@ static int yaffs_do_sync_fs(struct super
- }
- return 0;
- }
--**/
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static void yaffs_write_super(struct super_block *sb)
- #else
- static int yaffs_write_super(struct super_block *sb)
- #endif
- {
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_write_super\n"));
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18))
-- return 0; /* yaffs_do_sync_fs(sb);*/
-+ T(YAFFS_TRACE_OS, ("yaffs_write_super\n"));
-+ if (yaffs_auto_checkpoint >= 2)
-+ yaffs_do_sync_fs(sb);
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
-+ return 0;
- #endif
- }
-
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_sync_fs(struct super_block *sb, int wait)
- #else
- static int yaffs_sync_fs(struct super_block *sb)
- #endif
- {
-+ T(YAFFS_TRACE_OS, ("yaffs_sync_fs\n"));
-+
-+ if (yaffs_auto_checkpoint >= 1)
-+ yaffs_do_sync_fs(sb);
-+
-+ return 0;
-+}
-+
-+#ifdef YAFFS_USE_OWN_IGET
-+
-+static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino)
-+{
-+ struct inode *inode;
-+ yaffs_Object *obj;
-+ yaffs_Device *dev = yaffs_SuperToDevice(sb);
-+
-+ T(YAFFS_TRACE_OS,
-+ ("yaffs_iget for %lu\n", ino));
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_sync_fs\n"));
-+ inode = iget_locked(sb, ino);
-+ if (!inode)
-+ return ERR_PTR(-ENOMEM);
-+ if (!(inode->i_state & I_NEW))
-+ return inode;
-+
-+ /* NB This is called as a side effect of other functions, but
-+ * we had to release the lock to prevent deadlocks, so
-+ * need to lock again.
-+ */
-
-- return 0; /* yaffs_do_sync_fs(sb);*/
-+ yaffs_GrossLock(dev);
-
-+ obj = yaffs_FindObjectByNumber(dev, inode->i_ino);
-+
-+ yaffs_FillInodeFromObject(inode, obj);
-+
-+ yaffs_GrossUnlock(dev);
-+
-+ unlock_new_inode(inode);
-+ return inode;
- }
-
-+#else
-
- static void yaffs_read_inode(struct inode *inode)
- {
-@@ -1438,7 +1682,7 @@ static void yaffs_read_inode(struct inod
- yaffs_Device *dev = yaffs_SuperToDevice(inode->i_sb);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_read_inode for %d\n", (int)inode->i_ino));
-+ ("yaffs_read_inode for %d\n", (int)inode->i_ino));
-
- yaffs_GrossLock(dev);
-
-@@ -1449,18 +1693,20 @@ static void yaffs_read_inode(struct inod
- yaffs_GrossUnlock(dev);
- }
-
--static LIST_HEAD(yaffs_dev_list);
-+#endif
-+
-+static YLIST_HEAD(yaffs_dev_list);
-
--#if 0 // not used
-+#if 0 /* not used */
- static int yaffs_remount_fs(struct super_block *sb, int *flags, char *data)
- {
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-
-- if( *flags & MS_RDONLY ) {
-+ if (*flags & MS_RDONLY) {
- struct mtd_info *mtd = yaffs_SuperToDevice(sb)->genericDevice;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_remount_fs: %s: RO\n", dev->name ));
-+ ("yaffs_remount_fs: %s: RO\n", dev->name));
-
- yaffs_GrossLock(dev);
-
-@@ -1472,10 +1718,9 @@ static int yaffs_remount_fs(struct super
- mtd->sync(mtd);
-
- yaffs_GrossUnlock(dev);
-- }
-- else {
-+ } else {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_remount_fs: %s: RW\n", dev->name ));
-+ ("yaffs_remount_fs: %s: RW\n", dev->name));
- }
-
- return 0;
-@@ -1486,7 +1731,7 @@ static void yaffs_put_super(struct super
- {
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_put_super\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_put_super\n"));
-
- yaffs_GrossLock(dev);
-
-@@ -1494,18 +1739,17 @@ static void yaffs_put_super(struct super
-
- yaffs_CheckpointSave(dev);
-
-- if (dev->putSuperFunc) {
-+ if (dev->putSuperFunc)
- dev->putSuperFunc(sb);
-- }
-
- yaffs_Deinitialise(dev);
-
- yaffs_GrossUnlock(dev);
-
- /* we assume this is protected by lock_kernel() in mount/umount */
-- list_del(&dev->devList);
-+ ylist_del(&dev->devList);
-
-- if(dev->spareBuffer){
-+ if (dev->spareBuffer) {
- YFREE(dev->spareBuffer);
- dev->spareBuffer = NULL;
- }
-@@ -1516,12 +1760,10 @@ static void yaffs_put_super(struct super
-
- static void yaffs_MTDPutSuper(struct super_block *sb)
- {
--
- struct mtd_info *mtd = yaffs_SuperToDevice(sb)->genericDevice;
-
-- if (mtd->sync) {
-+ if (mtd->sync)
- mtd->sync(mtd);
-- }
-
- put_mtd_device(mtd);
- }
-@@ -1531,9 +1773,9 @@ static void yaffs_MarkSuperBlockDirty(vo
- {
- struct super_block *sb = (struct super_block *)vsb;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_MarkSuperBlockDirty() sb = %p\n",sb));
--// if(sb)
--// sb->s_dirt = 1;
-+ T(YAFFS_TRACE_OS, ("yaffs_MarkSuperBlockDirty() sb = %p\n", sb));
-+ if (sb)
-+ sb->s_dirt = 1;
- }
-
- typedef struct {
-@@ -1546,48 +1788,48 @@ typedef struct {
- #define MAX_OPT_LEN 20
- static int yaffs_parse_options(yaffs_options *options, const char *options_str)
- {
-- char cur_opt[MAX_OPT_LEN+1];
-+ char cur_opt[MAX_OPT_LEN + 1];
- int p;
- int error = 0;
-
- /* Parse through the options which is a comma seperated list */
-
-- while(options_str && *options_str && !error){
-- memset(cur_opt,0,MAX_OPT_LEN+1);
-+ while (options_str && *options_str && !error) {
-+ memset(cur_opt, 0, MAX_OPT_LEN + 1);
- p = 0;
-
-- while(*options_str && *options_str != ','){
-- if(p < MAX_OPT_LEN){
-+ while (*options_str && *options_str != ',') {
-+ if (p < MAX_OPT_LEN) {
- cur_opt[p] = *options_str;
- p++;
- }
- options_str++;
- }
-
-- if(!strcmp(cur_opt,"inband-tags"))
-+ if (!strcmp(cur_opt, "inband-tags"))
- options->inband_tags = 1;
-- else if(!strcmp(cur_opt,"no-cache"))
-+ else if (!strcmp(cur_opt, "no-cache"))
- options->no_cache = 1;
-- else if(!strcmp(cur_opt,"no-checkpoint-read"))
-+ else if (!strcmp(cur_opt, "no-checkpoint-read"))
- options->skip_checkpoint_read = 1;
-- else if(!strcmp(cur_opt,"no-checkpoint-write"))
-+ else if (!strcmp(cur_opt, "no-checkpoint-write"))
- options->skip_checkpoint_write = 1;
-- else if(!strcmp(cur_opt,"no-checkpoint")){
-+ else if (!strcmp(cur_opt, "no-checkpoint")) {
- options->skip_checkpoint_read = 1;
- options->skip_checkpoint_write = 1;
- } else {
-- printk(KERN_INFO "yaffs: Bad mount option \"%s\"\n",cur_opt);
-+ printk(KERN_INFO "yaffs: Bad mount option \"%s\"\n",
-+ cur_opt);
- error = 1;
- }
--
- }
-
- return error;
- }
-
- static struct super_block *yaffs_internal_read_super(int yaffsVersion,
-- struct super_block *sb,
-- void *data, int silent)
-+ struct super_block *sb,
-+ void *data, int silent)
- {
- int nBlocks;
- struct inode *inode = NULL;
-@@ -1602,6 +1844,7 @@ static struct super_block *yaffs_interna
-
- sb->s_magic = YAFFS_MAGIC;
- sb->s_op = &yaffs_super_ops;
-+ sb->s_flags |= MS_NOATIME;
-
- if (!sb)
- printk(KERN_INFO "yaffs: sb is NULL\n");
-@@ -1614,14 +1857,14 @@ static struct super_block *yaffs_interna
- sb->s_dev,
- yaffs_devname(sb, devname_buf));
-
-- if(!data_str)
-+ if (!data_str)
- data_str = "";
-
-- printk(KERN_INFO "yaffs: passed flags \"%s\"\n",data_str);
-+ printk(KERN_INFO "yaffs: passed flags \"%s\"\n", data_str);
-
-- memset(&options,0,sizeof(options));
-+ memset(&options, 0, sizeof(options));
-
-- if(yaffs_parse_options(&options,data_str)){
-+ if (yaffs_parse_options(&options, data_str)) {
- /* Option parsing failed */
- return NULL;
- }
-@@ -1645,9 +1888,9 @@ static struct super_block *yaffs_interna
- yaffs_devname(sb, devname_buf)));
-
- /* Check it's an mtd device..... */
-- if (MAJOR(sb->s_dev) != MTD_BLOCK_MAJOR) {
-+ if (MAJOR(sb->s_dev) != MTD_BLOCK_MAJOR)
- return NULL; /* This isn't an mtd device */
-- }
-+
- /* Get the device */
- mtd = get_mtd_device(NULL, MINOR(sb->s_dev));
- if (!mtd) {
-@@ -1673,29 +1916,23 @@ static struct super_block *yaffs_interna
- T(YAFFS_TRACE_OS, (" %s %d\n", WRITE_SIZE_STR, WRITE_SIZE(mtd)));
- T(YAFFS_TRACE_OS, (" oobsize %d\n", mtd->oobsize));
- T(YAFFS_TRACE_OS, (" erasesize %d\n", mtd->erasesize));
-- T(YAFFS_TRACE_OS, (" size %d\n", mtd->size));
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29)
-+ T(YAFFS_TRACE_OS, (" size %u\n", mtd->size));
-+#else
-+ T(YAFFS_TRACE_OS, (" size %lld\n", mtd->size));
-+#endif
-
- #ifdef CONFIG_YAFFS_AUTO_YAFFS2
-
-- if (yaffsVersion == 1 &&
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- mtd->writesize >= 2048) {
--#else
-- mtd->oobblock >= 2048) {
--#endif
-- T(YAFFS_TRACE_ALWAYS,("yaffs: auto selecting yaffs2\n"));
-- yaffsVersion = 2;
-+ if (yaffsVersion == 1 && WRITE_SIZE(mtd) >= 2048) {
-+ T(YAFFS_TRACE_ALWAYS, ("yaffs: auto selecting yaffs2\n"));
-+ yaffsVersion = 2;
- }
-
- /* Added NCB 26/5/2006 for completeness */
-- if (yaffsVersion == 2 &&
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- mtd->writesize == 512) {
--#else
-- mtd->oobblock == 512) {
--#endif
-- T(YAFFS_TRACE_ALWAYS,("yaffs: auto selecting yaffs1\n"));
-- yaffsVersion = 1;
-+ if (yaffsVersion == 2 && !options.inband_tags && WRITE_SIZE(mtd) == 512) {
-+ T(YAFFS_TRACE_ALWAYS, ("yaffs: auto selecting yaffs1\n"));
-+ yaffsVersion = 1;
- }
-
- #endif
-@@ -1707,7 +1944,7 @@ static struct super_block *yaffs_interna
- !mtd->block_markbad ||
- !mtd->read ||
- !mtd->write ||
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- !mtd->read_oob || !mtd->write_oob) {
- #else
- !mtd->write_ecc ||
-@@ -1719,12 +1956,9 @@ static struct super_block *yaffs_interna
- return NULL;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- if (mtd->writesize < YAFFS_MIN_YAFFS2_CHUNK_SIZE ||
--#else
-- if (mtd->oobblock < YAFFS_MIN_YAFFS2_CHUNK_SIZE ||
--#endif
-- mtd->oobsize < YAFFS_MIN_YAFFS2_SPARE_SIZE) {
-+ if ((WRITE_SIZE(mtd) < YAFFS_MIN_YAFFS2_CHUNK_SIZE ||
-+ mtd->oobsize < YAFFS_MIN_YAFFS2_SPARE_SIZE) &&
-+ !options.inband_tags) {
- T(YAFFS_TRACE_ALWAYS,
- ("yaffs: MTD device does not have the "
- "right page sizes\n"));
-@@ -1735,7 +1969,7 @@ static struct super_block *yaffs_interna
- if (!mtd->erase ||
- !mtd->read ||
- !mtd->write ||
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- !mtd->read_oob || !mtd->write_oob) {
- #else
- !mtd->write_ecc ||
-@@ -1761,7 +1995,7 @@ static struct super_block *yaffs_interna
- * Set the yaffs_Device up for mtd
- */
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- sb->s_fs_info = dev = kmalloc(sizeof(yaffs_Device), GFP_KERNEL);
- #else
- sb->u.generic_sbp = dev = kmalloc(sizeof(yaffs_Device), GFP_KERNEL);
-@@ -1780,13 +2014,15 @@ static struct super_block *yaffs_interna
-
- /* Set up the memory size parameters.... */
-
-- nBlocks = mtd->size / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
-+ nBlocks = YCALCBLOCKS(mtd->size, (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK));
-+
- dev->startBlock = 0;
- dev->endBlock = nBlocks - 1;
- dev->nChunksPerBlock = YAFFS_CHUNKS_PER_BLOCK;
-- dev->nDataBytesPerChunk = YAFFS_BYTES_PER_CHUNK;
-+ dev->totalBytesPerChunk = YAFFS_BYTES_PER_CHUNK;
- dev->nReservedBlocks = 5;
- dev->nShortOpCaches = (options.no_cache) ? 0 : 10;
-+ dev->inbandTags = options.inband_tags;
-
- /* ... and the functions. */
- if (yaffsVersion == 2) {
-@@ -1798,20 +2034,19 @@ static struct super_block *yaffs_interna
- dev->queryNANDBlock = nandmtd2_QueryNANDBlock;
- dev->spareBuffer = YMALLOC(mtd->oobsize);
- dev->isYaffs2 = 1;
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- dev->nDataBytesPerChunk = mtd->writesize;
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
-+ dev->totalBytesPerChunk = mtd->writesize;
- dev->nChunksPerBlock = mtd->erasesize / mtd->writesize;
- #else
-- dev->nDataBytesPerChunk = mtd->oobblock;
-+ dev->totalBytesPerChunk = mtd->oobblock;
- dev->nChunksPerBlock = mtd->erasesize / mtd->oobblock;
- #endif
-- nBlocks = mtd->size / mtd->erasesize;
-+ nBlocks = YCALCBLOCKS(mtd->size, mtd->erasesize);
-
-- dev->nCheckpointReservedBlocks = CONFIG_YAFFS_CHECKPOINT_RESERVED_BLOCKS;
- dev->startBlock = 0;
- dev->endBlock = nBlocks - 1;
- } else {
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- /* use the MTD interface in yaffs_mtdif1.c */
- dev->writeChunkWithTagsToNAND =
- nandmtd1_WriteChunkWithTagsToNAND;
-@@ -1847,7 +2082,7 @@ static struct super_block *yaffs_interna
- dev->skipCheckpointWrite = options.skip_checkpoint_write;
-
- /* we assume this is protected by lock_kernel() in mount/umount */
-- list_add_tail(&dev->devList, &yaffs_dev_list);
-+ ylist_add_tail(&dev->devList, &yaffs_dev_list);
-
- init_MUTEX(&dev->grossLock);
-
-@@ -1884,20 +2119,23 @@ static struct super_block *yaffs_interna
- return NULL;
- }
- sb->s_root = root;
-+ sb->s_dirt = !dev->isCheckpointed;
-+ T(YAFFS_TRACE_ALWAYS,
-+ ("yaffs_read_super: isCheckpointed %d\n", dev->isCheckpointed));
-
- T(YAFFS_TRACE_OS, ("yaffs_read_super: done\n"));
- return sb;
- }
-
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_internal_read_super_mtd(struct super_block *sb, void *data,
- int silent)
- {
- return yaffs_internal_read_super(1, sb, data, silent) ? 0 : -EINVAL;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_read_super(struct file_system_type *fs,
- int flags, const char *dev_name,
- void *data, struct vfsmount *mnt)
-@@ -1938,14 +2176,14 @@ static DECLARE_FSTYPE(yaffs_fs_type, "ya
-
- #ifdef CONFIG_YAFFS_YAFFS2
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs2_internal_read_super_mtd(struct super_block *sb, void *data,
- int silent)
- {
- return yaffs_internal_read_super(2, sb, data, silent) ? 0 : -EINVAL;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs2_read_super(struct file_system_type *fs,
- int flags, const char *dev_name, void *data,
- struct vfsmount *mnt)
-@@ -1990,12 +2228,12 @@ static char *yaffs_dump_dev(char *buf, y
- {
- buf += sprintf(buf, "startBlock......... %d\n", dev->startBlock);
- buf += sprintf(buf, "endBlock........... %d\n", dev->endBlock);
-+ buf += sprintf(buf, "totalBytesPerChunk. %d\n", dev->totalBytesPerChunk);
- buf += sprintf(buf, "nDataBytesPerChunk. %d\n", dev->nDataBytesPerChunk);
- buf += sprintf(buf, "chunkGroupBits..... %d\n", dev->chunkGroupBits);
- buf += sprintf(buf, "chunkGroupSize..... %d\n", dev->chunkGroupSize);
- buf += sprintf(buf, "nErasedBlocks...... %d\n", dev->nErasedBlocks);
- buf += sprintf(buf, "nReservedBlocks.... %d\n", dev->nReservedBlocks);
-- buf += sprintf(buf, "nCheckptResBlocks.. %d\n", dev->nCheckpointReservedBlocks);
- buf += sprintf(buf, "blocksInCheckpoint. %d\n", dev->blocksInCheckpoint);
- buf += sprintf(buf, "nTnodesCreated..... %d\n", dev->nTnodesCreated);
- buf += sprintf(buf, "nFreeTnodes........ %d\n", dev->nFreeTnodes);
-@@ -2006,10 +2244,8 @@ static char *yaffs_dump_dev(char *buf, y
- buf += sprintf(buf, "nPageReads......... %d\n", dev->nPageReads);
- buf += sprintf(buf, "nBlockErasures..... %d\n", dev->nBlockErasures);
- buf += sprintf(buf, "nGCCopies.......... %d\n", dev->nGCCopies);
-- buf +=
-- sprintf(buf, "garbageCollections. %d\n", dev->garbageCollections);
-- buf +=
-- sprintf(buf, "passiveGCs......... %d\n",
-+ buf += sprintf(buf, "garbageCollections. %d\n", dev->garbageCollections);
-+ buf += sprintf(buf, "passiveGCs......... %d\n",
- dev->passiveGarbageCollections);
- buf += sprintf(buf, "nRetriedWrites..... %d\n", dev->nRetriedWrites);
- buf += sprintf(buf, "nShortOpCaches..... %d\n", dev->nShortOpCaches);
-@@ -2025,6 +2261,7 @@ static char *yaffs_dump_dev(char *buf, y
- sprintf(buf, "nBackgroudDeletions %d\n", dev->nBackgroundDeletions);
- buf += sprintf(buf, "useNANDECC......... %d\n", dev->useNANDECC);
- buf += sprintf(buf, "isYaffs2........... %d\n", dev->isYaffs2);
-+ buf += sprintf(buf, "inbandTags......... %d\n", dev->inbandTags);
-
- return buf;
- }
-@@ -2033,7 +2270,7 @@ static int yaffs_proc_read(char *page,
- char **start,
- off_t offset, int count, int *eof, void *data)
- {
-- struct list_head *item;
-+ struct ylist_head *item;
- char *buf = page;
- int step = offset;
- int n = 0;
-@@ -2057,8 +2294,8 @@ static int yaffs_proc_read(char *page,
- lock_kernel();
-
- /* Locate and print the Nth entry. Order N-squared but N is small. */
-- list_for_each(item, &yaffs_dev_list) {
-- yaffs_Device *dev = list_entry(item, yaffs_Device, devList);
-+ ylist_for_each(item, &yaffs_dev_list) {
-+ yaffs_Device *dev = ylist_entry(item, yaffs_Device, devList);
- if (n < step) {
- n++;
- continue;
-@@ -2119,7 +2356,7 @@ static int yaffs_proc_write(struct file
- char *end;
- char *mask_name;
- const char *x;
-- char substring[MAX_MASK_NAME_LENGTH+1];
-+ char substring[MAX_MASK_NAME_LENGTH + 1];
- int i;
- int done = 0;
- int add, len = 0;
-@@ -2129,9 +2366,8 @@ static int yaffs_proc_write(struct file
-
- while (!done && (pos < count)) {
- done = 1;
-- while ((pos < count) && isspace(buf[pos])) {
-+ while ((pos < count) && isspace(buf[pos]))
- pos++;
-- }
-
- switch (buf[pos]) {
- case '+':
-@@ -2148,20 +2384,21 @@ static int yaffs_proc_write(struct file
- mask_name = NULL;
-
- mask_bitfield = simple_strtoul(buf + pos, &end, 0);
-+
- if (end > buf + pos) {
- mask_name = "numeral";
- len = end - (buf + pos);
- pos += len;
- done = 0;
- } else {
-- for(x = buf + pos, i = 0;
-- (*x == '_' || (*x >='a' && *x <= 'z')) &&
-- i <MAX_MASK_NAME_LENGTH; x++, i++, pos++)
-- substring[i] = *x;
-+ for (x = buf + pos, i = 0;
-+ (*x == '_' || (*x >= 'a' && *x <= 'z')) &&
-+ i < MAX_MASK_NAME_LENGTH; x++, i++, pos++)
-+ substring[i] = *x;
- substring[i] = '\0';
-
- for (i = 0; mask_flags[i].mask_name != NULL; i++) {
-- if(strcmp(substring,mask_flags[i].mask_name) == 0){
-+ if (strcmp(substring, mask_flags[i].mask_name) == 0) {
- mask_name = mask_flags[i].mask_name;
- mask_bitfield = mask_flags[i].mask_bitfield;
- done = 0;
-@@ -2172,7 +2409,7 @@ static int yaffs_proc_write(struct file
-
- if (mask_name != NULL) {
- done = 0;
-- switch(add) {
-+ switch (add) {
- case '-':
- rg &= ~mask_bitfield;
- break;
-@@ -2191,13 +2428,13 @@ static int yaffs_proc_write(struct file
-
- yaffs_traceMask = rg | YAFFS_TRACE_ALWAYS;
-
-- printk("new trace = 0x%08X\n",yaffs_traceMask);
-+ printk(KERN_DEBUG "new trace = 0x%08X\n", yaffs_traceMask);
-
- if (rg & YAFFS_TRACE_ALWAYS) {
- for (i = 0; mask_flags[i].mask_name != NULL; i++) {
- char flag;
- flag = ((rg & mask_flags[i].mask_bitfield) == mask_flags[i].mask_bitfield) ? '+' : '-';
-- printk("%c%s\n", flag, mask_flags[i].mask_name);
-+ printk(KERN_DEBUG "%c%s\n", flag, mask_flags[i].mask_name);
- }
- }
-
-@@ -2211,12 +2448,8 @@ struct file_system_to_install {
- };
-
- static struct file_system_to_install fs_to_install[] = {
--//#ifdef CONFIG_YAFFS_YAFFS1
- {&yaffs_fs_type, 0},
--//#endif
--//#ifdef CONFIG_YAFFS_YAFFS2
- {&yaffs2_fs_type, 0},
--//#endif
- {NULL, 0}
- };
-
-@@ -2231,15 +2464,14 @@ static int __init init_yaffs_fs(void)
- /* Install the proc_fs entry */
- my_proc_entry = create_proc_entry("yaffs",
- S_IRUGO | S_IFREG,
-- &proc_root);
-+ YPROC_ROOT);
-
- if (my_proc_entry) {
- my_proc_entry->write_proc = yaffs_proc_write;
- my_proc_entry->read_proc = yaffs_proc_read;
- my_proc_entry->data = NULL;
-- } else {
-+ } else
- return -ENOMEM;
-- }
-
- /* Now add the file system entries */
-
-@@ -2247,9 +2479,8 @@ static int __init init_yaffs_fs(void)
-
- while (fsinst->fst && !error) {
- error = register_filesystem(fsinst->fst);
-- if (!error) {
-+ if (!error)
- fsinst->installed = 1;
-- }
- fsinst++;
- }
-
-@@ -2277,7 +2508,7 @@ static void __exit exit_yaffs_fs(void)
- T(YAFFS_TRACE_ALWAYS, ("yaffs " __DATE__ " " __TIME__
- " removing. \n"));
-
-- remove_proc_entry("yaffs", &proc_root);
-+ remove_proc_entry("yaffs", YPROC_ROOT);
-
- fsinst = fs_to_install;
-
-@@ -2288,7 +2519,6 @@ static void __exit exit_yaffs_fs(void)
- }
- fsinst++;
- }
--
- }
-
- module_init(init_yaffs_fs)
---- /dev/null
-+++ b/fs/yaffs2/yaffs_getblockinfo.h
-@@ -0,0 +1,34 @@
-+/*
-+ * YAFFS: Yet another Flash File System . A NAND-flash specific file system.
-+ *
-+ * Copyright (C) 2002-2007 Aleph One Ltd.
-+ * for Toby Churchill Ltd and Brightstar Engineering
-+ *
-+ * Created by Charles Manning <charles@aleph1.co.uk>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU Lesser General Public License version 2.1 as
-+ * published by the Free Software Foundation.
-+ *
-+ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
-+ */
-+
-+#ifndef __YAFFS_GETBLOCKINFO_H__
-+#define __YAFFS_GETBLOCKINFO_H__
-+
-+#include "yaffs_guts.h"
-+
-+/* Function to manipulate block info */
-+static Y_INLINE yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blk)
-+{
-+ if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) {
-+ T(YAFFS_TRACE_ERROR,
-+ (TSTR
-+ ("**>> yaffs: getBlockInfo block %d is not valid" TENDSTR),
-+ blk));
-+ YBUG();
-+ }
-+ return &dev->blockInfo[blk - dev->internalStartBlock];
-+}
-+
-+#endif
---- a/fs/yaffs2/yaffs_guts.c
-+++ b/fs/yaffs2/yaffs_guts.c
-@@ -12,16 +12,17 @@
- */
-
- const char *yaffs_guts_c_version =
-- "$Id: yaffs_guts.c,v 1.49 2007-05-15 20:07:40 charles Exp $";
-+ "$Id: yaffs_guts.c,v 1.82 2009-03-09 04:24:17 charles Exp $";
-
- #include "yportenv.h"
-
- #include "yaffsinterface.h"
- #include "yaffs_guts.h"
- #include "yaffs_tagsvalidity.h"
-+#include "yaffs_getblockinfo.h"
-
- #include "yaffs_tagscompat.h"
--#ifndef CONFIG_YAFFS_USE_OWN_SORT
-+#ifndef CONFIG_YAFFS_USE_OWN_SORT
- #include "yaffs_qsort.h"
- #endif
- #include "yaffs_nand.h"
-@@ -32,116 +33,116 @@ const char *yaffs_guts_c_version =
- #include "yaffs_packedtags2.h"
-
-
--#ifdef CONFIG_YAFFS_WINCE
--void yfsd_LockYAFFS(BOOL fsLockOnly);
--void yfsd_UnlockYAFFS(BOOL fsLockOnly);
--#endif
--
- #define YAFFS_PASSIVE_GC_CHUNKS 2
-
- #include "yaffs_ecc.h"
-
-
- /* Robustification (if it ever comes about...) */
--static void yaffs_RetireBlock(yaffs_Device * dev, int blockInNAND);
--static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND, int erasedOk);
--static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags * tags);
--static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,
-- const yaffs_ExtendedTags * tags);
-+static void yaffs_RetireBlock(yaffs_Device *dev, int blockInNAND);
-+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND,
-+ int erasedOk);
-+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
-+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND,
-+ const yaffs_ExtendedTags *tags);
-
- /* Other local prototypes */
--static int yaffs_UnlinkObject( yaffs_Object *obj);
-+static int yaffs_UnlinkObject(yaffs_Object *obj);
- static int yaffs_ObjectHasCachedWriteData(yaffs_Object *obj);
-
- static void yaffs_HardlinkFixup(yaffs_Device *dev, yaffs_Object *hardList);
-
--static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device * dev,
-- const __u8 * buffer,
-- yaffs_ExtendedTags * tags,
-- int useReserve);
--static int yaffs_PutChunkIntoFile(yaffs_Object * in, int chunkInInode,
-- int chunkInNAND, int inScan);
--
--static yaffs_Object *yaffs_CreateNewObject(yaffs_Device * dev, int number,
-- yaffs_ObjectType type);
--static void yaffs_AddObjectToDirectory(yaffs_Object * directory,
-- yaffs_Object * obj);
--static int yaffs_UpdateObjectHeader(yaffs_Object * in, const YCHAR * name,
-- int force, int isShrink, int shadows);
--static void yaffs_RemoveObjectFromDirectory(yaffs_Object * obj);
-+static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device *dev,
-+ const __u8 *buffer,
-+ yaffs_ExtendedTags *tags,
-+ int useReserve);
-+static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode,
-+ int chunkInNAND, int inScan);
-+
-+static yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number,
-+ yaffs_ObjectType type);
-+static void yaffs_AddObjectToDirectory(yaffs_Object *directory,
-+ yaffs_Object *obj);
-+static int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name,
-+ int force, int isShrink, int shadows);
-+static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj);
- static int yaffs_CheckStructures(void);
--static int yaffs_DeleteWorker(yaffs_Object * in, yaffs_Tnode * tn, __u32 level,
-- int chunkOffset, int *limit);
--static int yaffs_DoGenericObjectDeletion(yaffs_Object * in);
--
--static yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blockNo);
--
--static __u8 *yaffs_GetTempBuffer(yaffs_Device * dev, int lineNo);
--static void yaffs_ReleaseTempBuffer(yaffs_Device * dev, __u8 * buffer,
-- int lineNo);
-+static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level,
-+ int chunkOffset, int *limit);
-+static int yaffs_DoGenericObjectDeletion(yaffs_Object *in);
-+
-+static yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device *dev, int blockNo);
-
--static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND);
-
--static int yaffs_UnlinkWorker(yaffs_Object * obj);
--static void yaffs_DestroyObject(yaffs_Object * obj);
-+static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND);
-
--static int yaffs_TagsMatch(const yaffs_ExtendedTags * tags, int objectId,
-- int chunkInObject);
-+static int yaffs_UnlinkWorker(yaffs_Object *obj);
-
--loff_t yaffs_GetFileSize(yaffs_Object * obj);
-+static int yaffs_TagsMatch(const yaffs_ExtendedTags *tags, int objectId,
-+ int chunkInObject);
-
--static int yaffs_AllocateChunk(yaffs_Device * dev, int useReserve, yaffs_BlockInfo **blockUsedPtr);
-+static int yaffs_AllocateChunk(yaffs_Device *dev, int useReserve,
-+ yaffs_BlockInfo **blockUsedPtr);
-
--static void yaffs_VerifyFreeChunks(yaffs_Device * dev);
-+static void yaffs_VerifyFreeChunks(yaffs_Device *dev);
-
- static void yaffs_CheckObjectDetailsLoaded(yaffs_Object *in);
-
-+static void yaffs_VerifyDirectory(yaffs_Object *directory);
- #ifdef YAFFS_PARANOID
--static int yaffs_CheckFileSanity(yaffs_Object * in);
-+static int yaffs_CheckFileSanity(yaffs_Object *in);
- #else
- #define yaffs_CheckFileSanity(in)
- #endif
-
--static void yaffs_InvalidateWholeChunkCache(yaffs_Object * in);
--static void yaffs_InvalidateChunkCache(yaffs_Object * object, int chunkId);
-+static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in);
-+static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId);
-
- static void yaffs_InvalidateCheckpoint(yaffs_Device *dev);
-
--static int yaffs_FindChunkInFile(yaffs_Object * in, int chunkInInode,
-- yaffs_ExtendedTags * tags);
-+static int yaffs_FindChunkInFile(yaffs_Object *in, int chunkInInode,
-+ yaffs_ExtendedTags *tags);
-
--static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos);
--static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device * dev,
-- yaffs_FileStructure * fStruct,
-- __u32 chunkId);
-+static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn,
-+ unsigned pos);
-+static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device *dev,
-+ yaffs_FileStructure *fStruct,
-+ __u32 chunkId);
-
-
- /* Function to calculate chunk and offset */
-
--static void yaffs_AddrToChunk(yaffs_Device *dev, loff_t addr, __u32 *chunk, __u32 *offset)
-+static void yaffs_AddrToChunk(yaffs_Device *dev, loff_t addr, int *chunkOut,
-+ __u32 *offsetOut)
- {
-- if(dev->chunkShift){
-- /* Easy-peasy power of 2 case */
-- *chunk = (__u32)(addr >> dev->chunkShift);
-- *offset = (__u32)(addr & dev->chunkMask);
-- }
-- else if(dev->crumbsPerChunk)
-- {
-- /* Case where we're using "crumbs" */
-- *offset = (__u32)(addr & dev->crumbMask);
-- addr >>= dev->crumbShift;
-- *chunk = ((__u32)addr)/dev->crumbsPerChunk;
-- *offset += ((addr - (*chunk * dev->crumbsPerChunk)) << dev->crumbShift);
-+ int chunk;
-+ __u32 offset;
-+
-+ chunk = (__u32)(addr >> dev->chunkShift);
-+
-+ if (dev->chunkDiv == 1) {
-+ /* easy power of 2 case */
-+ offset = (__u32)(addr & dev->chunkMask);
-+ } else {
-+ /* Non power-of-2 case */
-+
-+ loff_t chunkBase;
-+
-+ chunk /= dev->chunkDiv;
-+
-+ chunkBase = ((loff_t)chunk) * dev->nDataBytesPerChunk;
-+ offset = (__u32)(addr - chunkBase);
- }
-- else
-- YBUG();
-+
-+ *chunkOut = chunk;
-+ *offsetOut = offset;
- }
-
--/* Function to return the number of shifts for a power of 2 greater than or equal
-- * to the given number
-+/* Function to return the number of shifts for a power of 2 greater than or
-+ * equal to the given number
- * Note we don't try to cater for all possible numbers and this does not have to
- * be hellishly efficient.
- */
-@@ -153,13 +154,14 @@ static __u32 ShiftsGE(__u32 x)
-
- nShifts = extraBits = 0;
-
-- while(x>1){
-- if(x & 1) extraBits++;
-- x>>=1;
-+ while (x > 1) {
-+ if (x & 1)
-+ extraBits++;
-+ x >>= 1;
- nShifts++;
- }
-
-- if(extraBits)
-+ if (extraBits)
- nShifts++;
-
- return nShifts;
-@@ -168,16 +170,17 @@ static __u32 ShiftsGE(__u32 x)
- /* Function to return the number of shifts to get a 1 in bit 0
- */
-
--static __u32 ShiftDiv(__u32 x)
-+static __u32 Shifts(__u32 x)
- {
- int nShifts;
-
- nShifts = 0;
-
-- if(!x) return 0;
-+ if (!x)
-+ return 0;
-
-- while( !(x&1)){
-- x>>=1;
-+ while (!(x&1)) {
-+ x >>= 1;
- nShifts++;
- }
-
-@@ -195,21 +198,25 @@ static int yaffs_InitialiseTempBuffers(y
- int i;
- __u8 *buf = (__u8 *)1;
-
-- memset(dev->tempBuffer,0,sizeof(dev->tempBuffer));
-+ memset(dev->tempBuffer, 0, sizeof(dev->tempBuffer));
-
- for (i = 0; buf && i < YAFFS_N_TEMP_BUFFERS; i++) {
- dev->tempBuffer[i].line = 0; /* not in use */
- dev->tempBuffer[i].buffer = buf =
-- YMALLOC_DMA(dev->nDataBytesPerChunk);
-+ YMALLOC_DMA(dev->totalBytesPerChunk);
- }
-
- return buf ? YAFFS_OK : YAFFS_FAIL;
--
- }
-
--static __u8 *yaffs_GetTempBuffer(yaffs_Device * dev, int lineNo)
-+__u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo)
- {
- int i, j;
-+
-+ dev->tempInUse++;
-+ if (dev->tempInUse > dev->maxTemp)
-+ dev->maxTemp = dev->tempInUse;
-+
- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
- if (dev->tempBuffer[i].line == 0) {
- dev->tempBuffer[i].line = lineNo;
-@@ -227,9 +234,9 @@ static __u8 *yaffs_GetTempBuffer(yaffs_D
- T(YAFFS_TRACE_BUFFERS,
- (TSTR("Out of temp buffers at line %d, other held by lines:"),
- lineNo));
-- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
-+ for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++)
- T(YAFFS_TRACE_BUFFERS, (TSTR(" %d "), dev->tempBuffer[i].line));
-- }
-+
- T(YAFFS_TRACE_BUFFERS, (TSTR(" " TENDSTR)));
-
- /*
-@@ -242,10 +249,13 @@ static __u8 *yaffs_GetTempBuffer(yaffs_D
-
- }
-
--static void yaffs_ReleaseTempBuffer(yaffs_Device * dev, __u8 * buffer,
-+void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer,
- int lineNo)
- {
- int i;
-+
-+ dev->tempInUse--;
-+
- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
- if (dev->tempBuffer[i].buffer == buffer) {
- dev->tempBuffer[i].line = 0;
-@@ -267,27 +277,26 @@ static void yaffs_ReleaseTempBuffer(yaff
- /*
- * Determine if we have a managed buffer.
- */
--int yaffs_IsManagedTempBuffer(yaffs_Device * dev, const __u8 * buffer)
-+int yaffs_IsManagedTempBuffer(yaffs_Device *dev, const __u8 *buffer)
- {
- int i;
-+
- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
- if (dev->tempBuffer[i].buffer == buffer)
- return 1;
-+ }
-
-+ for (i = 0; i < dev->nShortOpCaches; i++) {
-+ if (dev->srCache[i].data == buffer)
-+ return 1;
- }
-
-- for (i = 0; i < dev->nShortOpCaches; i++) {
-- if( dev->srCache[i].data == buffer )
-- return 1;
--
-- }
--
-- if (buffer == dev->checkpointBuffer)
-- return 1;
--
-- T(YAFFS_TRACE_ALWAYS,
-- (TSTR("yaffs: unmaged buffer detected.\n" TENDSTR)));
-- return 0;
-+ if (buffer == dev->checkpointBuffer)
-+ return 1;
-+
-+ T(YAFFS_TRACE_ALWAYS,
-+ (TSTR("yaffs: unmaged buffer detected.\n" TENDSTR)));
-+ return 0;
- }
-
-
-@@ -296,62 +305,63 @@ int yaffs_IsManagedTempBuffer(yaffs_Devi
- * Chunk bitmap manipulations
- */
-
--static Y_INLINE __u8 *yaffs_BlockBits(yaffs_Device * dev, int blk)
-+static Y_INLINE __u8 *yaffs_BlockBits(yaffs_Device *dev, int blk)
- {
- if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) {
- T(YAFFS_TRACE_ERROR,
-- (TSTR("**>> yaffs: BlockBits block %d is not valid" TENDSTR),
-- blk));
-+ (TSTR("**>> yaffs: BlockBits block %d is not valid" TENDSTR),
-+ blk));
- YBUG();
- }
- return dev->chunkBits +
-- (dev->chunkBitmapStride * (blk - dev->internalStartBlock));
-+ (dev->chunkBitmapStride * (blk - dev->internalStartBlock));
- }
-
- static Y_INLINE void yaffs_VerifyChunkBitId(yaffs_Device *dev, int blk, int chunk)
- {
-- if(blk < dev->internalStartBlock || blk > dev->internalEndBlock ||
-- chunk < 0 || chunk >= dev->nChunksPerBlock) {
-- T(YAFFS_TRACE_ERROR,
-- (TSTR("**>> yaffs: Chunk Id (%d:%d) invalid"TENDSTR),blk,chunk));
-- YBUG();
-+ if (blk < dev->internalStartBlock || blk > dev->internalEndBlock ||
-+ chunk < 0 || chunk >= dev->nChunksPerBlock) {
-+ T(YAFFS_TRACE_ERROR,
-+ (TSTR("**>> yaffs: Chunk Id (%d:%d) invalid"TENDSTR),
-+ blk, chunk));
-+ YBUG();
- }
- }
-
--static Y_INLINE void yaffs_ClearChunkBits(yaffs_Device * dev, int blk)
-+static Y_INLINE void yaffs_ClearChunkBits(yaffs_Device *dev, int blk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
-
- memset(blkBits, 0, dev->chunkBitmapStride);
- }
-
--static Y_INLINE void yaffs_ClearChunkBit(yaffs_Device * dev, int blk, int chunk)
-+static Y_INLINE void yaffs_ClearChunkBit(yaffs_Device *dev, int blk, int chunk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
-
-- yaffs_VerifyChunkBitId(dev,blk,chunk);
-+ yaffs_VerifyChunkBitId(dev, blk, chunk);
-
- blkBits[chunk / 8] &= ~(1 << (chunk & 7));
- }
-
--static Y_INLINE void yaffs_SetChunkBit(yaffs_Device * dev, int blk, int chunk)
-+static Y_INLINE void yaffs_SetChunkBit(yaffs_Device *dev, int blk, int chunk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
-
-- yaffs_VerifyChunkBitId(dev,blk,chunk);
-+ yaffs_VerifyChunkBitId(dev, blk, chunk);
-
- blkBits[chunk / 8] |= (1 << (chunk & 7));
- }
-
--static Y_INLINE int yaffs_CheckChunkBit(yaffs_Device * dev, int blk, int chunk)
-+static Y_INLINE int yaffs_CheckChunkBit(yaffs_Device *dev, int blk, int chunk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
-- yaffs_VerifyChunkBitId(dev,blk,chunk);
-+ yaffs_VerifyChunkBitId(dev, blk, chunk);
-
- return (blkBits[chunk / 8] & (1 << (chunk & 7))) ? 1 : 0;
- }
-
--static Y_INLINE int yaffs_StillSomeChunkBits(yaffs_Device * dev, int blk)
-+static Y_INLINE int yaffs_StillSomeChunkBits(yaffs_Device *dev, int blk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
- int i;
-@@ -363,17 +373,17 @@ static Y_INLINE int yaffs_StillSomeChunk
- return 0;
- }
-
--static int yaffs_CountChunkBits(yaffs_Device * dev, int blk)
-+static int yaffs_CountChunkBits(yaffs_Device *dev, int blk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
- int i;
- int n = 0;
- for (i = 0; i < dev->chunkBitmapStride; i++) {
- __u8 x = *blkBits;
-- while(x){
-- if(x & 1)
-+ while (x) {
-+ if (x & 1)
- n++;
-- x >>=1;
-+ x >>= 1;
- }
-
- blkBits++;
-@@ -400,7 +410,7 @@ static int yaffs_SkipNANDVerification(ya
- return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY_NAND));
- }
-
--static const char * blockStateName[] = {
-+static const char *blockStateName[] = {
- "Unknown",
- "Needs scanning",
- "Scanning",
-@@ -413,64 +423,65 @@ static const char * blockStateName[] = {
- "Dead"
- };
-
--static void yaffs_VerifyBlock(yaffs_Device *dev,yaffs_BlockInfo *bi,int n)
-+static void yaffs_VerifyBlock(yaffs_Device *dev, yaffs_BlockInfo *bi, int n)
- {
- int actuallyUsed;
- int inUse;
-
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
- /* Report illegal runtime states */
-- if(bi->blockState <0 || bi->blockState >= YAFFS_NUMBER_OF_BLOCK_STATES)
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has undefined state %d"TENDSTR),n,bi->blockState));
-+ if (bi->blockState >= YAFFS_NUMBER_OF_BLOCK_STATES)
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has undefined state %d"TENDSTR), n, bi->blockState));
-
-- switch(bi->blockState){
-- case YAFFS_BLOCK_STATE_UNKNOWN:
-- case YAFFS_BLOCK_STATE_SCANNING:
-- case YAFFS_BLOCK_STATE_NEEDS_SCANNING:
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has bad run-state %s"TENDSTR),
-- n,blockStateName[bi->blockState]));
-+ switch (bi->blockState) {
-+ case YAFFS_BLOCK_STATE_UNKNOWN:
-+ case YAFFS_BLOCK_STATE_SCANNING:
-+ case YAFFS_BLOCK_STATE_NEEDS_SCANNING:
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has bad run-state %s"TENDSTR),
-+ n, blockStateName[bi->blockState]));
- }
-
- /* Check pages in use and soft deletions are legal */
-
- actuallyUsed = bi->pagesInUse - bi->softDeletions;
-
-- if(bi->pagesInUse < 0 || bi->pagesInUse > dev->nChunksPerBlock ||
-+ if (bi->pagesInUse < 0 || bi->pagesInUse > dev->nChunksPerBlock ||
- bi->softDeletions < 0 || bi->softDeletions > dev->nChunksPerBlock ||
- actuallyUsed < 0 || actuallyUsed > dev->nChunksPerBlock)
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has illegal values pagesInUsed %d softDeletions %d"TENDSTR),
-- n,bi->pagesInUse,bi->softDeletions));
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has illegal values pagesInUsed %d softDeletions %d"TENDSTR),
-+ n, bi->pagesInUse, bi->softDeletions));
-
-
- /* Check chunk bitmap legal */
-- inUse = yaffs_CountChunkBits(dev,n);
-- if(inUse != bi->pagesInUse)
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has inconsistent values pagesInUse %d counted chunk bits %d"TENDSTR),
-- n,bi->pagesInUse,inUse));
-+ inUse = yaffs_CountChunkBits(dev, n);
-+ if (inUse != bi->pagesInUse)
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has inconsistent values pagesInUse %d counted chunk bits %d"TENDSTR),
-+ n, bi->pagesInUse, inUse));
-
- /* Check that the sequence number is valid.
- * Ten million is legal, but is very unlikely
- */
-- if(dev->isYaffs2 &&
-+ if (dev->isYaffs2 &&
- (bi->blockState == YAFFS_BLOCK_STATE_ALLOCATING || bi->blockState == YAFFS_BLOCK_STATE_FULL) &&
-- (bi->sequenceNumber < YAFFS_LOWEST_SEQUENCE_NUMBER || bi->sequenceNumber > 10000000 ))
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has suspect sequence number of %d"TENDSTR),
-- n,bi->sequenceNumber));
--
-+ (bi->sequenceNumber < YAFFS_LOWEST_SEQUENCE_NUMBER || bi->sequenceNumber > 10000000))
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has suspect sequence number of %d"TENDSTR),
-+ n, bi->sequenceNumber));
- }
-
--static void yaffs_VerifyCollectedBlock(yaffs_Device *dev,yaffs_BlockInfo *bi,int n)
-+static void yaffs_VerifyCollectedBlock(yaffs_Device *dev, yaffs_BlockInfo *bi,
-+ int n)
- {
-- yaffs_VerifyBlock(dev,bi,n);
-+ yaffs_VerifyBlock(dev, bi, n);
-
- /* After collection the block should be in the erased state */
-- /* TODO: This will need to change if we do partial gc */
-+ /* This will need to change if we do partial gc */
-
-- if(bi->blockState != YAFFS_BLOCK_STATE_EMPTY){
-- T(YAFFS_TRACE_ERROR,(TSTR("Block %d is in state %d after gc, should be erased"TENDSTR),
-- n,bi->blockState));
-+ if (bi->blockState != YAFFS_BLOCK_STATE_COLLECTING &&
-+ bi->blockState != YAFFS_BLOCK_STATE_EMPTY) {
-+ T(YAFFS_TRACE_ERROR, (TSTR("Block %d is in state %d after gc, should be erased"TENDSTR),
-+ n, bi->blockState));
- }
- }
-
-@@ -480,52 +491,49 @@ static void yaffs_VerifyBlocks(yaffs_Dev
- int nBlocksPerState[YAFFS_NUMBER_OF_BLOCK_STATES];
- int nIllegalBlockStates = 0;
-
--
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
-- memset(nBlocksPerState,0,sizeof(nBlocksPerState));
--
-+ memset(nBlocksPerState, 0, sizeof(nBlocksPerState));
-
-- for(i = dev->internalStartBlock; i <= dev->internalEndBlock; i++){
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i);
-- yaffs_VerifyBlock(dev,bi,i);
-+ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) {
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i);
-+ yaffs_VerifyBlock(dev, bi, i);
-
-- if(bi->blockState >=0 && bi->blockState < YAFFS_NUMBER_OF_BLOCK_STATES)
-+ if (bi->blockState < YAFFS_NUMBER_OF_BLOCK_STATES)
- nBlocksPerState[bi->blockState]++;
- else
- nIllegalBlockStates++;
--
- }
-
-- T(YAFFS_TRACE_VERIFY,(TSTR(""TENDSTR)));
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block summary"TENDSTR)));
-+ T(YAFFS_TRACE_VERIFY, (TSTR(""TENDSTR)));
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block summary"TENDSTR)));
-
-- T(YAFFS_TRACE_VERIFY,(TSTR("%d blocks have illegal states"TENDSTR),nIllegalBlockStates));
-- if(nBlocksPerState[YAFFS_BLOCK_STATE_ALLOCATING] > 1)
-- T(YAFFS_TRACE_VERIFY,(TSTR("Too many allocating blocks"TENDSTR)));
-+ T(YAFFS_TRACE_VERIFY, (TSTR("%d blocks have illegal states"TENDSTR), nIllegalBlockStates));
-+ if (nBlocksPerState[YAFFS_BLOCK_STATE_ALLOCATING] > 1)
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Too many allocating blocks"TENDSTR)));
-
-- for(i = 0; i < YAFFS_NUMBER_OF_BLOCK_STATES; i++)
-+ for (i = 0; i < YAFFS_NUMBER_OF_BLOCK_STATES; i++)
- T(YAFFS_TRACE_VERIFY,
- (TSTR("%s %d blocks"TENDSTR),
-- blockStateName[i],nBlocksPerState[i]));
-+ blockStateName[i], nBlocksPerState[i]));
-
-- if(dev->blocksInCheckpoint != nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT])
-+ if (dev->blocksInCheckpoint != nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT])
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Checkpoint block count wrong dev %d count %d"TENDSTR),
- dev->blocksInCheckpoint, nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT]));
-
-- if(dev->nErasedBlocks != nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY])
-+ if (dev->nErasedBlocks != nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY])
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Erased block count wrong dev %d count %d"TENDSTR),
- dev->nErasedBlocks, nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY]));
-
-- if(nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING] > 1)
-+ if (nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING] > 1)
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Too many collecting blocks %d (max is 1)"TENDSTR),
- nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING]));
-
-- T(YAFFS_TRACE_VERIFY,(TSTR(""TENDSTR)));
-+ T(YAFFS_TRACE_VERIFY, (TSTR(""TENDSTR)));
-
- }
-
-@@ -535,26 +543,26 @@ static void yaffs_VerifyBlocks(yaffs_Dev
- */
- static void yaffs_VerifyObjectHeader(yaffs_Object *obj, yaffs_ObjectHeader *oh, yaffs_ExtendedTags *tags, int parentCheck)
- {
-- if(yaffs_SkipVerification(obj->myDev))
-+ if (obj && yaffs_SkipVerification(obj->myDev))
- return;
-
-- if(!(tags && obj && oh)){
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Verifying object header tags %x obj %x oh %x"TENDSTR),
-- (__u32)tags,(__u32)obj,(__u32)oh));
-+ if (!(tags && obj && oh)) {
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Verifying object header tags %x obj %x oh %x"TENDSTR),
-+ (__u32)tags, (__u32)obj, (__u32)oh));
- return;
- }
-
-- if(oh->type <= YAFFS_OBJECT_TYPE_UNKNOWN ||
-- oh->type > YAFFS_OBJECT_TYPE_MAX)
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header type is illegal value 0x%x"TENDSTR),
-- tags->objectId, oh->type));
--
-- if(tags->objectId != obj->objectId)
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header mismatch objectId %d"TENDSTR),
-- tags->objectId, obj->objectId));
-+ if (oh->type <= YAFFS_OBJECT_TYPE_UNKNOWN ||
-+ oh->type > YAFFS_OBJECT_TYPE_MAX)
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d header type is illegal value 0x%x"TENDSTR),
-+ tags->objectId, oh->type));
-+
-+ if (tags->objectId != obj->objectId)
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d header mismatch objectId %d"TENDSTR),
-+ tags->objectId, obj->objectId));
-
-
- /*
-@@ -563,46 +571,43 @@ static void yaffs_VerifyObjectHeader(yaf
- * Tests do not apply to the root object.
- */
-
-- if(parentCheck && tags->objectId > 1 && !obj->parent)
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header mismatch parentId %d obj->parent is NULL"TENDSTR),
-- tags->objectId, oh->parentObjectId));
--
--
-- if(parentCheck && obj->parent &&
-- oh->parentObjectId != obj->parent->objectId &&
-- (oh->parentObjectId != YAFFS_OBJECTID_UNLINKED ||
-- obj->parent->objectId != YAFFS_OBJECTID_DELETED))
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header mismatch parentId %d parentObjectId %d"TENDSTR),
-- tags->objectId, oh->parentObjectId, obj->parent->objectId));
-+ if (parentCheck && tags->objectId > 1 && !obj->parent)
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d header mismatch parentId %d obj->parent is NULL"TENDSTR),
-+ tags->objectId, oh->parentObjectId));
-
-+ if (parentCheck && obj->parent &&
-+ oh->parentObjectId != obj->parent->objectId &&
-+ (oh->parentObjectId != YAFFS_OBJECTID_UNLINKED ||
-+ obj->parent->objectId != YAFFS_OBJECTID_DELETED))
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d header mismatch parentId %d parentObjectId %d"TENDSTR),
-+ tags->objectId, oh->parentObjectId, obj->parent->objectId));
-
-- if(tags->objectId > 1 && oh->name[0] == 0) /* Null name */
-+ if (tags->objectId > 1 && oh->name[0] == 0) /* Null name */
- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header name is NULL"TENDSTR),
-- obj->objectId));
-+ (TSTR("Obj %d header name is NULL"TENDSTR),
-+ obj->objectId));
-
-- if(tags->objectId > 1 && ((__u8)(oh->name[0])) == 0xff) /* Trashed name */
-+ if (tags->objectId > 1 && ((__u8)(oh->name[0])) == 0xff) /* Trashed name */
- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header name is 0xFF"TENDSTR),
-- obj->objectId));
-+ (TSTR("Obj %d header name is 0xFF"TENDSTR),
-+ obj->objectId));
- }
-
-
-
--static int yaffs_VerifyTnodeWorker(yaffs_Object * obj, yaffs_Tnode * tn,
-- __u32 level, int chunkOffset)
-+static int yaffs_VerifyTnodeWorker(yaffs_Object *obj, yaffs_Tnode *tn,
-+ __u32 level, int chunkOffset)
- {
- int i;
- yaffs_Device *dev = obj->myDev;
- int ok = 1;
-- int nTnodeBytes = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-
- if (tn) {
- if (level > 0) {
-
-- for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++){
-+ for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++) {
- if (tn->internal[i]) {
- ok = yaffs_VerifyTnodeWorker(obj,
- tn->internal[i],
-@@ -611,20 +616,19 @@ static int yaffs_VerifyTnodeWorker(yaffs
- }
- }
- } else if (level == 0) {
-- int i;
- yaffs_ExtendedTags tags;
- __u32 objectId = obj->objectId;
-
- chunkOffset <<= YAFFS_TNODES_LEVEL0_BITS;
-
-- for(i = 0; i < YAFFS_NTNODES_LEVEL0; i++){
-- __u32 theChunk = yaffs_GetChunkGroupBase(dev,tn,i);
-+ for (i = 0; i < YAFFS_NTNODES_LEVEL0; i++) {
-+ __u32 theChunk = yaffs_GetChunkGroupBase(dev, tn, i);
-
-- if(theChunk > 0){
-+ if (theChunk > 0) {
- /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),tags.objectId,tags.chunkId,theChunk)); */
-- yaffs_ReadChunkWithTagsFromNAND(dev,theChunk,NULL, &tags);
-- if(tags.objectId != objectId || tags.chunkId != chunkOffset){
-- T(~0,(TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR),
-+ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL, &tags);
-+ if (tags.objectId != objectId || tags.chunkId != chunkOffset) {
-+ T(~0, (TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR),
- objectId, chunkOffset, theChunk,
- tags.objectId, tags.chunkId));
- }
-@@ -646,13 +650,15 @@ static void yaffs_VerifyFile(yaffs_Objec
- __u32 lastChunk;
- __u32 x;
- __u32 i;
-- int ok;
- yaffs_Device *dev;
- yaffs_ExtendedTags tags;
- yaffs_Tnode *tn;
- __u32 objectId;
-
-- if(obj && yaffs_SkipVerification(obj->myDev))
-+ if (!obj)
-+ return;
-+
-+ if (yaffs_SkipVerification(obj->myDev))
- return;
-
- dev = obj->myDev;
-@@ -662,17 +668,17 @@ static void yaffs_VerifyFile(yaffs_Objec
- lastChunk = obj->variant.fileVariant.fileSize / dev->nDataBytesPerChunk + 1;
- x = lastChunk >> YAFFS_TNODES_LEVEL0_BITS;
- requiredTallness = 0;
-- while (x> 0) {
-+ while (x > 0) {
- x >>= YAFFS_TNODES_INTERNAL_BITS;
- requiredTallness++;
- }
-
- actualTallness = obj->variant.fileVariant.topLevel;
-
-- if(requiredTallness > actualTallness )
-+ if (requiredTallness > actualTallness)
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Obj %d had tnode tallness %d, needs to be %d"TENDSTR),
-- obj->objectId,actualTallness, requiredTallness));
-+ obj->objectId, actualTallness, requiredTallness));
-
-
- /* Check that the chunks in the tnode tree are all correct.
-@@ -680,39 +686,31 @@ static void yaffs_VerifyFile(yaffs_Objec
- * checking the tags for every chunk match.
- */
-
-- if(yaffs_SkipNANDVerification(dev))
-+ if (yaffs_SkipNANDVerification(dev))
- return;
-
-- for(i = 1; i <= lastChunk; i++){
-- tn = yaffs_FindLevel0Tnode(dev, &obj->variant.fileVariant,i);
-+ for (i = 1; i <= lastChunk; i++) {
-+ tn = yaffs_FindLevel0Tnode(dev, &obj->variant.fileVariant, i);
-
- if (tn) {
-- __u32 theChunk = yaffs_GetChunkGroupBase(dev,tn,i);
-- if(theChunk > 0){
-+ __u32 theChunk = yaffs_GetChunkGroupBase(dev, tn, i);
-+ if (theChunk > 0) {
- /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),objectId,i,theChunk)); */
-- yaffs_ReadChunkWithTagsFromNAND(dev,theChunk,NULL, &tags);
-- if(tags.objectId != objectId || tags.chunkId != i){
-- T(~0,(TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR),
-+ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL, &tags);
-+ if (tags.objectId != objectId || tags.chunkId != i) {
-+ T(~0, (TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR),
- objectId, i, theChunk,
- tags.objectId, tags.chunkId));
- }
- }
- }
--
- }
--
- }
-
--static void yaffs_VerifyDirectory(yaffs_Object *obj)
--{
-- if(obj && yaffs_SkipVerification(obj->myDev))
-- return;
--
--}
-
- static void yaffs_VerifyHardLink(yaffs_Object *obj)
- {
-- if(obj && yaffs_SkipVerification(obj->myDev))
-+ if (obj && yaffs_SkipVerification(obj->myDev))
- return;
-
- /* Verify sane equivalent object */
-@@ -720,7 +718,7 @@ static void yaffs_VerifyHardLink(yaffs_O
-
- static void yaffs_VerifySymlink(yaffs_Object *obj)
- {
-- if(obj && yaffs_SkipVerification(obj->myDev))
-+ if (obj && yaffs_SkipVerification(obj->myDev))
- return;
-
- /* Verify symlink string */
-@@ -728,7 +726,7 @@ static void yaffs_VerifySymlink(yaffs_Ob
-
- static void yaffs_VerifySpecial(yaffs_Object *obj)
- {
-- if(obj && yaffs_SkipVerification(obj->myDev))
-+ if (obj && yaffs_SkipVerification(obj->myDev))
- return;
- }
-
-@@ -740,14 +738,19 @@ static void yaffs_VerifyObject(yaffs_Obj
- __u32 chunkMax;
-
- __u32 chunkIdOk;
-- __u32 chunkIsLive;
-+ __u32 chunkInRange;
-+ __u32 chunkShouldNotBeDeleted;
-+ __u32 chunkValid;
-+
-+ if (!obj)
-+ return;
-
-- if(!obj)
-+ if (obj->beingCreated)
- return;
-
- dev = obj->myDev;
-
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
- /* Check sane object header chunk */
-@@ -755,50 +758,54 @@ static void yaffs_VerifyObject(yaffs_Obj
- chunkMin = dev->internalStartBlock * dev->nChunksPerBlock;
- chunkMax = (dev->internalEndBlock+1) * dev->nChunksPerBlock - 1;
-
-- chunkIdOk = (obj->chunkId >= chunkMin && obj->chunkId <= chunkMax);
-- chunkIsLive = chunkIdOk &&
-+ chunkInRange = (((unsigned)(obj->hdrChunk)) >= chunkMin && ((unsigned)(obj->hdrChunk)) <= chunkMax);
-+ chunkIdOk = chunkInRange || obj->hdrChunk == 0;
-+ chunkValid = chunkInRange &&
- yaffs_CheckChunkBit(dev,
-- obj->chunkId / dev->nChunksPerBlock,
-- obj->chunkId % dev->nChunksPerBlock);
-- if(!obj->fake &&
-- (!chunkIdOk || !chunkIsLive)) {
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d has chunkId %d %s %s"TENDSTR),
-- obj->objectId,obj->chunkId,
-- chunkIdOk ? "" : ",out of range",
-- chunkIsLive || !chunkIdOk ? "" : ",marked as deleted"));
-+ obj->hdrChunk / dev->nChunksPerBlock,
-+ obj->hdrChunk % dev->nChunksPerBlock);
-+ chunkShouldNotBeDeleted = chunkInRange && !chunkValid;
-+
-+ if (!obj->fake &&
-+ (!chunkIdOk || chunkShouldNotBeDeleted)) {
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d has chunkId %d %s %s"TENDSTR),
-+ obj->objectId, obj->hdrChunk,
-+ chunkIdOk ? "" : ",out of range",
-+ chunkShouldNotBeDeleted ? ",marked as deleted" : ""));
- }
-
-- if(chunkIdOk && chunkIsLive &&!yaffs_SkipNANDVerification(dev)) {
-+ if (chunkValid && !yaffs_SkipNANDVerification(dev)) {
- yaffs_ExtendedTags tags;
- yaffs_ObjectHeader *oh;
-- __u8 *buffer = yaffs_GetTempBuffer(dev,__LINE__);
-+ __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__);
-
- oh = (yaffs_ObjectHeader *)buffer;
-
-- yaffs_ReadChunkWithTagsFromNAND(dev, obj->chunkId,buffer, &tags);
-+ yaffs_ReadChunkWithTagsFromNAND(dev, obj->hdrChunk, buffer,
-+ &tags);
-
-- yaffs_VerifyObjectHeader(obj,oh,&tags,1);
-+ yaffs_VerifyObjectHeader(obj, oh, &tags, 1);
-
-- yaffs_ReleaseTempBuffer(dev,buffer,__LINE__);
-+ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__);
- }
-
- /* Verify it has a parent */
-- if(obj && !obj->fake &&
-- (!obj->parent || obj->parent->myDev != dev)){
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d has parent pointer %p which does not look like an object"TENDSTR),
-- obj->objectId,obj->parent));
-+ if (obj && !obj->fake &&
-+ (!obj->parent || obj->parent->myDev != dev)) {
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d has parent pointer %p which does not look like an object"TENDSTR),
-+ obj->objectId, obj->parent));
- }
-
- /* Verify parent is a directory */
-- if(obj->parent && obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY){
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d's parent is not a directory (type %d)"TENDSTR),
-- obj->objectId,obj->parent->variantType));
-+ if (obj->parent && obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d's parent is not a directory (type %d)"TENDSTR),
-+ obj->objectId, obj->parent->variantType));
- }
-
-- switch(obj->variantType){
-+ switch (obj->variantType) {
- case YAFFS_OBJECT_TYPE_FILE:
- yaffs_VerifyFile(obj);
- break;
-@@ -818,33 +825,30 @@ static void yaffs_VerifyObject(yaffs_Obj
- default:
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Obj %d has illegaltype %d"TENDSTR),
-- obj->objectId,obj->variantType));
-+ obj->objectId, obj->variantType));
- break;
- }
--
--
- }
-
- static void yaffs_VerifyObjects(yaffs_Device *dev)
- {
- yaffs_Object *obj;
- int i;
-- struct list_head *lh;
-+ struct ylist_head *lh;
-
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
- /* Iterate through the objects in each hash entry */
-
-- for(i = 0; i < YAFFS_NOBJECT_BUCKETS; i++){
-- list_for_each(lh, &dev->objectBucket[i].list) {
-+ for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) {
-+ ylist_for_each(lh, &dev->objectBucket[i].list) {
- if (lh) {
-- obj = list_entry(lh, yaffs_Object, hashLink);
-+ obj = ylist_entry(lh, yaffs_Object, hashLink);
- yaffs_VerifyObject(obj);
- }
- }
-- }
--
-+ }
- }
-
-
-@@ -855,19 +859,20 @@ static void yaffs_VerifyObjects(yaffs_De
- static Y_INLINE int yaffs_HashFunction(int n)
- {
- n = abs(n);
-- return (n % YAFFS_NOBJECT_BUCKETS);
-+ return n % YAFFS_NOBJECT_BUCKETS;
- }
-
- /*
-- * Access functions to useful fake objects
-+ * Access functions to useful fake objects.
-+ * Note that root might have a presence in NAND if permissions are set.
- */
-
--yaffs_Object *yaffs_Root(yaffs_Device * dev)
-+yaffs_Object *yaffs_Root(yaffs_Device *dev)
- {
- return dev->rootDir;
- }
-
--yaffs_Object *yaffs_LostNFound(yaffs_Device * dev)
-+yaffs_Object *yaffs_LostNFound(yaffs_Device *dev)
- {
- return dev->lostNFoundDir;
- }
-@@ -877,7 +882,7 @@ yaffs_Object *yaffs_LostNFound(yaffs_Dev
- * Erased NAND checking functions
- */
-
--int yaffs_CheckFF(__u8 * buffer, int nBytes)
-+int yaffs_CheckFF(__u8 *buffer, int nBytes)
- {
- /* Horrible, slow implementation */
- while (nBytes--) {
-@@ -889,9 +894,8 @@ int yaffs_CheckFF(__u8 * buffer, int nBy
- }
-
- static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND)
-+ int chunkInNAND)
- {
--
- int retval = YAFFS_OK;
- __u8 *data = yaffs_GetTempBuffer(dev, __LINE__);
- yaffs_ExtendedTags tags;
-@@ -899,10 +903,9 @@ static int yaffs_CheckChunkErased(struct
-
- result = yaffs_ReadChunkWithTagsFromNAND(dev, chunkInNAND, data, &tags);
-
-- if(tags.eccResult > YAFFS_ECC_RESULT_NO_ERROR)
-+ if (tags.eccResult > YAFFS_ECC_RESULT_NO_ERROR)
- retval = YAFFS_FAIL;
-
--
- if (!yaffs_CheckFF(data, dev->nDataBytesPerChunk) || tags.chunkUsed) {
- T(YAFFS_TRACE_NANDACCESS,
- (TSTR("Chunk %d not erased" TENDSTR), chunkInNAND));
-@@ -915,11 +918,10 @@ static int yaffs_CheckChunkErased(struct
-
- }
-
--
- static int yaffs_WriteNewChunkWithTagsToNAND(struct yaffs_DeviceStruct *dev,
-- const __u8 * data,
-- yaffs_ExtendedTags * tags,
-- int useReserve)
-+ const __u8 *data,
-+ yaffs_ExtendedTags *tags,
-+ int useReserve)
- {
- int attempts = 0;
- int writeOk = 0;
-@@ -972,7 +974,7 @@ static int yaffs_WriteNewChunkWithTagsTo
- erasedOk = yaffs_CheckChunkErased(dev, chunk);
- if (erasedOk != YAFFS_OK) {
- T(YAFFS_TRACE_ERROR,
-- (TSTR ("**>> yaffs chunk %d was not erased"
-+ (TSTR("**>> yaffs chunk %d was not erased"
- TENDSTR), chunk));
-
- /* try another chunk */
-@@ -992,7 +994,11 @@ static int yaffs_WriteNewChunkWithTagsTo
- /* Copy the data into the robustification buffer */
- yaffs_HandleWriteChunkOk(dev, chunk, data, tags);
-
-- } while (writeOk != YAFFS_OK && attempts < yaffs_wr_attempts);
-+ } while (writeOk != YAFFS_OK &&
-+ (yaffs_wr_attempts <= 0 || attempts <= yaffs_wr_attempts));
-+
-+ if (!writeOk)
-+ chunk = -1;
-
- if (attempts > 1) {
- T(YAFFS_TRACE_ERROR,
-@@ -1009,13 +1015,35 @@ static int yaffs_WriteNewChunkWithTagsTo
- * Block retiring for handling a broken block.
- */
-
--static void yaffs_RetireBlock(yaffs_Device * dev, int blockInNAND)
-+static void yaffs_RetireBlock(yaffs_Device *dev, int blockInNAND)
- {
- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockInNAND);
-
- yaffs_InvalidateCheckpoint(dev);
-
-- yaffs_MarkBlockBad(dev, blockInNAND);
-+ if (yaffs_MarkBlockBad(dev, blockInNAND) != YAFFS_OK) {
-+ if (yaffs_EraseBlockInNAND(dev, blockInNAND) != YAFFS_OK) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR(
-+ "yaffs: Failed to mark bad and erase block %d"
-+ TENDSTR), blockInNAND));
-+ } else {
-+ yaffs_ExtendedTags tags;
-+ int chunkId = blockInNAND * dev->nChunksPerBlock;
-+
-+ __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__);
-+
-+ memset(buffer, 0xff, dev->nDataBytesPerChunk);
-+ yaffs_InitialiseTags(&tags);
-+ tags.sequenceNumber = YAFFS_SEQUENCE_BAD_BLOCK;
-+ if (dev->writeChunkWithTagsToNAND(dev, chunkId -
-+ dev->chunkOffset, buffer, &tags) != YAFFS_OK)
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Failed to "
-+ TCONT("write bad block marker to block %d")
-+ TENDSTR), blockInNAND));
-+
-+ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__);
-+ }
-+ }
-
- bi->blockState = YAFFS_BLOCK_STATE_DEAD;
- bi->gcPrioritise = 0;
-@@ -1029,49 +1057,45 @@ static void yaffs_RetireBlock(yaffs_Devi
- *
- */
-
--static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags * tags)
-+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags)
- {
- }
-
--static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,
-- const yaffs_ExtendedTags * tags)
-+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND,
-+ const yaffs_ExtendedTags *tags)
- {
- }
-
- void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi)
- {
-- if(!bi->gcPrioritise){
-+ if (!bi->gcPrioritise) {
- bi->gcPrioritise = 1;
- dev->hasPendingPrioritisedGCs = 1;
-- bi->chunkErrorStrikes ++;
-+ bi->chunkErrorStrikes++;
-
-- if(bi->chunkErrorStrikes > 3){
-+ if (bi->chunkErrorStrikes > 3) {
- bi->needsRetiring = 1; /* Too many stikes, so retire this */
- T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Block struck out" TENDSTR)));
-
- }
--
- }
- }
-
--static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND, int erasedOk)
-+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND,
-+ int erasedOk)
- {
--
- int blockInNAND = chunkInNAND / dev->nChunksPerBlock;
- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockInNAND);
-
-- yaffs_HandleChunkError(dev,bi);
-+ yaffs_HandleChunkError(dev, bi);
-
--
-- if(erasedOk ) {
-+ if (erasedOk) {
- /* Was an actual write failure, so mark the block for retirement */
- bi->needsRetiring = 1;
- T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS,
- (TSTR("**>> Block %d needs retiring" TENDSTR), blockInNAND));
--
--
- }
-
- /* Delete the chunk */
-@@ -1081,12 +1105,12 @@ static void yaffs_HandleWriteChunkError(
-
- /*---------------- Name handling functions ------------*/
-
--static __u16 yaffs_CalcNameSum(const YCHAR * name)
-+static __u16 yaffs_CalcNameSum(const YCHAR *name)
- {
- __u16 sum = 0;
- __u16 i = 1;
-
-- YUCHAR *bname = (YUCHAR *) name;
-+ const YUCHAR *bname = (const YUCHAR *) name;
- if (bname) {
- while ((*bname) && (i < (YAFFS_MAX_NAME_LENGTH/2))) {
-
-@@ -1102,14 +1126,14 @@ static __u16 yaffs_CalcNameSum(const YCH
- return sum;
- }
-
--static void yaffs_SetObjectName(yaffs_Object * obj, const YCHAR * name)
-+static void yaffs_SetObjectName(yaffs_Object *obj, const YCHAR *name)
- {
- #ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM
-- if (name && yaffs_strlen(name) <= YAFFS_SHORT_NAME_LENGTH) {
-+ memset(obj->shortName, 0, sizeof(YCHAR) * (YAFFS_SHORT_NAME_LENGTH+1));
-+ if (name && yaffs_strlen(name) <= YAFFS_SHORT_NAME_LENGTH)
- yaffs_strcpy(obj->shortName, name);
-- } else {
-+ else
- obj->shortName[0] = _Y('\0');
-- }
- #endif
- obj->sum = yaffs_CalcNameSum(name);
- }
-@@ -1126,7 +1150,7 @@ static void yaffs_SetObjectName(yaffs_Ob
- * Don't use this function directly
- */
-
--static int yaffs_CreateTnodes(yaffs_Device * dev, int nTnodes)
-+static int yaffs_CreateTnodes(yaffs_Device *dev, int nTnodes)
- {
- int i;
- int tnodeSize;
-@@ -1143,6 +1167,9 @@ static int yaffs_CreateTnodes(yaffs_Devi
- * Must be a multiple of 32-bits */
- tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-+
- /* make these things */
-
- newTnodes = YMALLOC(nTnodes * tnodeSize);
-@@ -1150,7 +1177,7 @@ static int yaffs_CreateTnodes(yaffs_Devi
-
- if (!newTnodes) {
- T(YAFFS_TRACE_ERROR,
-- (TSTR("yaffs: Could not allocate Tnodes" TENDSTR)));
-+ (TSTR("yaffs: Could not allocate Tnodes" TENDSTR)));
- return YAFFS_FAIL;
- }
-
-@@ -1170,7 +1197,7 @@ static int yaffs_CreateTnodes(yaffs_Devi
- dev->freeTnodes = newTnodes;
- #else
- /* New hookup for wide tnodes */
-- for(i = 0; i < nTnodes -1; i++) {
-+ for (i = 0; i < nTnodes - 1; i++) {
- curr = (yaffs_Tnode *) &mem[i * tnodeSize];
- next = (yaffs_Tnode *) &mem[(i+1) * tnodeSize];
- curr->internal[0] = next;
-@@ -1197,7 +1224,6 @@ static int yaffs_CreateTnodes(yaffs_Devi
- (TSTR
- ("yaffs: Could not add tnodes to management list" TENDSTR)));
- return YAFFS_FAIL;
--
- } else {
- tnl->tnodes = newTnodes;
- tnl->next = dev->allocatedTnodeList;
-@@ -1211,14 +1237,13 @@ static int yaffs_CreateTnodes(yaffs_Devi
-
- /* GetTnode gets us a clean tnode. Tries to make allocate more if we run out */
-
--static yaffs_Tnode *yaffs_GetTnodeRaw(yaffs_Device * dev)
-+static yaffs_Tnode *yaffs_GetTnodeRaw(yaffs_Device *dev)
- {
- yaffs_Tnode *tn = NULL;
-
- /* If there are none left make more */
-- if (!dev->freeTnodes) {
-+ if (!dev->freeTnodes)
- yaffs_CreateTnodes(dev, YAFFS_ALLOCATION_NTNODES);
-- }
-
- if (dev->freeTnodes) {
- tn = dev->freeTnodes;
-@@ -1233,21 +1258,27 @@ static yaffs_Tnode *yaffs_GetTnodeRaw(ya
- dev->nFreeTnodes--;
- }
-
-+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
-+
- return tn;
- }
-
--static yaffs_Tnode *yaffs_GetTnode(yaffs_Device * dev)
-+static yaffs_Tnode *yaffs_GetTnode(yaffs_Device *dev)
- {
- yaffs_Tnode *tn = yaffs_GetTnodeRaw(dev);
-+ int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-
-- if(tn)
-- memset(tn, 0, (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8);
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-+
-+ if (tn)
-+ memset(tn, 0, tnodeSize);
-
- return tn;
- }
-
- /* FreeTnode frees up a tnode and puts it back on the free list */
--static void yaffs_FreeTnode(yaffs_Device * dev, yaffs_Tnode * tn)
-+static void yaffs_FreeTnode(yaffs_Device *dev, yaffs_Tnode *tn)
- {
- if (tn) {
- #ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG
-@@ -1262,9 +1293,10 @@ static void yaffs_FreeTnode(yaffs_Device
- dev->freeTnodes = tn;
- dev->nFreeTnodes++;
- }
-+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
- }
-
--static void yaffs_DeinitialiseTnodes(yaffs_Device * dev)
-+static void yaffs_DeinitialiseTnodes(yaffs_Device *dev)
- {
- /* Free the list of allocated tnodes */
- yaffs_TnodeList *tmp;
-@@ -1282,71 +1314,72 @@ static void yaffs_DeinitialiseTnodes(yaf
- dev->nFreeTnodes = 0;
- }
-
--static void yaffs_InitialiseTnodes(yaffs_Device * dev)
-+static void yaffs_InitialiseTnodes(yaffs_Device *dev)
- {
- dev->allocatedTnodeList = NULL;
- dev->freeTnodes = NULL;
- dev->nFreeTnodes = 0;
- dev->nTnodesCreated = 0;
--
- }
-
-
--void yaffs_PutLevel0Tnode(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos, unsigned val)
-+void yaffs_PutLevel0Tnode(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos,
-+ unsigned val)
- {
-- __u32 *map = (__u32 *)tn;
-- __u32 bitInMap;
-- __u32 bitInWord;
-- __u32 wordInMap;
-- __u32 mask;
-+ __u32 *map = (__u32 *)tn;
-+ __u32 bitInMap;
-+ __u32 bitInWord;
-+ __u32 wordInMap;
-+ __u32 mask;
-
-- pos &= YAFFS_TNODES_LEVEL0_MASK;
-- val >>= dev->chunkGroupBits;
-+ pos &= YAFFS_TNODES_LEVEL0_MASK;
-+ val >>= dev->chunkGroupBits;
-
-- bitInMap = pos * dev->tnodeWidth;
-- wordInMap = bitInMap /32;
-- bitInWord = bitInMap & (32 -1);
-+ bitInMap = pos * dev->tnodeWidth;
-+ wordInMap = bitInMap / 32;
-+ bitInWord = bitInMap & (32 - 1);
-
-- mask = dev->tnodeMask << bitInWord;
-+ mask = dev->tnodeMask << bitInWord;
-
-- map[wordInMap] &= ~mask;
-- map[wordInMap] |= (mask & (val << bitInWord));
-+ map[wordInMap] &= ~mask;
-+ map[wordInMap] |= (mask & (val << bitInWord));
-
-- if(dev->tnodeWidth > (32-bitInWord)) {
-- bitInWord = (32 - bitInWord);
-- wordInMap++;;
-- mask = dev->tnodeMask >> (/*dev->tnodeWidth -*/ bitInWord);
-- map[wordInMap] &= ~mask;
-- map[wordInMap] |= (mask & (val >> bitInWord));
-- }
-+ if (dev->tnodeWidth > (32 - bitInWord)) {
-+ bitInWord = (32 - bitInWord);
-+ wordInMap++;;
-+ mask = dev->tnodeMask >> (/*dev->tnodeWidth -*/ bitInWord);
-+ map[wordInMap] &= ~mask;
-+ map[wordInMap] |= (mask & (val >> bitInWord));
-+ }
- }
-
--static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos)
-+static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn,
-+ unsigned pos)
- {
-- __u32 *map = (__u32 *)tn;
-- __u32 bitInMap;
-- __u32 bitInWord;
-- __u32 wordInMap;
-- __u32 val;
-+ __u32 *map = (__u32 *)tn;
-+ __u32 bitInMap;
-+ __u32 bitInWord;
-+ __u32 wordInMap;
-+ __u32 val;
-
-- pos &= YAFFS_TNODES_LEVEL0_MASK;
-+ pos &= YAFFS_TNODES_LEVEL0_MASK;
-
-- bitInMap = pos * dev->tnodeWidth;
-- wordInMap = bitInMap /32;
-- bitInWord = bitInMap & (32 -1);
-+ bitInMap = pos * dev->tnodeWidth;
-+ wordInMap = bitInMap / 32;
-+ bitInWord = bitInMap & (32 - 1);
-
-- val = map[wordInMap] >> bitInWord;
-+ val = map[wordInMap] >> bitInWord;
-
-- if(dev->tnodeWidth > (32-bitInWord)) {
-- bitInWord = (32 - bitInWord);
-- wordInMap++;;
-- val |= (map[wordInMap] << bitInWord);
-- }
-+ if (dev->tnodeWidth > (32 - bitInWord)) {
-+ bitInWord = (32 - bitInWord);
-+ wordInMap++;;
-+ val |= (map[wordInMap] << bitInWord);
-+ }
-
-- val &= dev->tnodeMask;
-- val <<= dev->chunkGroupBits;
-+ val &= dev->tnodeMask;
-+ val <<= dev->chunkGroupBits;
-
-- return val;
-+ return val;
- }
-
- /* ------------------- End of individual tnode manipulation -----------------*/
-@@ -1357,24 +1390,21 @@ static __u32 yaffs_GetChunkGroupBase(yaf
- */
-
- /* FindLevel0Tnode finds the level 0 tnode, if one exists. */
--static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device * dev,
-- yaffs_FileStructure * fStruct,
-- __u32 chunkId)
-+static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device *dev,
-+ yaffs_FileStructure *fStruct,
-+ __u32 chunkId)
- {
--
- yaffs_Tnode *tn = fStruct->top;
- __u32 i;
- int requiredTallness;
- int level = fStruct->topLevel;
-
- /* Check sane level and chunk Id */
-- if (level < 0 || level > YAFFS_TNODES_MAX_LEVEL) {
-+ if (level < 0 || level > YAFFS_TNODES_MAX_LEVEL)
- return NULL;
-- }
-
-- if (chunkId > YAFFS_MAX_CHUNK_ID) {
-+ if (chunkId > YAFFS_MAX_CHUNK_ID)
- return NULL;
-- }
-
- /* First check we're tall enough (ie enough topLevel) */
-
-@@ -1385,22 +1415,17 @@ static yaffs_Tnode *yaffs_FindLevel0Tnod
- requiredTallness++;
- }
-
-- if (requiredTallness > fStruct->topLevel) {
-- /* Not tall enough, so we can't find it, return NULL. */
-- return NULL;
-- }
-+ if (requiredTallness > fStruct->topLevel)
-+ return NULL; /* Not tall enough, so we can't find it */
-
- /* Traverse down to level 0 */
- while (level > 0 && tn) {
-- tn = tn->
-- internal[(chunkId >>
-- ( YAFFS_TNODES_LEVEL0_BITS +
-- (level - 1) *
-- YAFFS_TNODES_INTERNAL_BITS)
-- ) &
-- YAFFS_TNODES_INTERNAL_MASK];
-+ tn = tn->internal[(chunkId >>
-+ (YAFFS_TNODES_LEVEL0_BITS +
-+ (level - 1) *
-+ YAFFS_TNODES_INTERNAL_BITS)) &
-+ YAFFS_TNODES_INTERNAL_MASK];
- level--;
--
- }
-
- return tn;
-@@ -1417,12 +1442,11 @@ static yaffs_Tnode *yaffs_FindLevel0Tnod
- * be plugged into the ttree.
- */
-
--static yaffs_Tnode *yaffs_AddOrFindLevel0Tnode(yaffs_Device * dev,
-- yaffs_FileStructure * fStruct,
-- __u32 chunkId,
-- yaffs_Tnode *passedTn)
-+static yaffs_Tnode *yaffs_AddOrFindLevel0Tnode(yaffs_Device *dev,
-+ yaffs_FileStructure *fStruct,
-+ __u32 chunkId,
-+ yaffs_Tnode *passedTn)
- {
--
- int requiredTallness;
- int i;
- int l;
-@@ -1432,13 +1456,11 @@ static yaffs_Tnode *yaffs_AddOrFindLevel
-
-
- /* Check sane level and page Id */
-- if (fStruct->topLevel < 0 || fStruct->topLevel > YAFFS_TNODES_MAX_LEVEL) {
-+ if (fStruct->topLevel < 0 || fStruct->topLevel > YAFFS_TNODES_MAX_LEVEL)
- return NULL;
-- }
-
-- if (chunkId > YAFFS_MAX_CHUNK_ID) {
-+ if (chunkId > YAFFS_MAX_CHUNK_ID)
- return NULL;
-- }
-
- /* First check we're tall enough (ie enough topLevel) */
-
-@@ -1451,7 +1473,7 @@ static yaffs_Tnode *yaffs_AddOrFindLevel
-
-
- if (requiredTallness > fStruct->topLevel) {
-- /* Not tall enough,gotta make the tree taller */
-+ /* Not tall enough, gotta make the tree taller */
- for (i = fStruct->topLevel; i < requiredTallness; i++) {
-
- tn = yaffs_GetTnode(dev);
-@@ -1473,27 +1495,27 @@ static yaffs_Tnode *yaffs_AddOrFindLevel
- l = fStruct->topLevel;
- tn = fStruct->top;
-
-- if(l > 0) {
-+ if (l > 0) {
- while (l > 0 && tn) {
- x = (chunkId >>
-- ( YAFFS_TNODES_LEVEL0_BITS +
-+ (YAFFS_TNODES_LEVEL0_BITS +
- (l - 1) * YAFFS_TNODES_INTERNAL_BITS)) &
- YAFFS_TNODES_INTERNAL_MASK;
-
-
-- if((l>1) && !tn->internal[x]){
-+ if ((l > 1) && !tn->internal[x]) {
- /* Add missing non-level-zero tnode */
- tn->internal[x] = yaffs_GetTnode(dev);
-
-- } else if(l == 1) {
-+ } else if (l == 1) {
- /* Looking from level 1 at level 0 */
-- if (passedTn) {
-+ if (passedTn) {
- /* If we already have one, then release it.*/
-- if(tn->internal[x])
-- yaffs_FreeTnode(dev,tn->internal[x]);
-+ if (tn->internal[x])
-+ yaffs_FreeTnode(dev, tn->internal[x]);
- tn->internal[x] = passedTn;
-
-- } else if(!tn->internal[x]) {
-+ } else if (!tn->internal[x]) {
- /* Don't have one, none passed in */
- tn->internal[x] = yaffs_GetTnode(dev);
- }
-@@ -1504,31 +1526,29 @@ static yaffs_Tnode *yaffs_AddOrFindLevel
- }
- } else {
- /* top is level 0 */
-- if(passedTn) {
-- memcpy(tn,passedTn,(dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8);
-- yaffs_FreeTnode(dev,passedTn);
-+ if (passedTn) {
-+ memcpy(tn, passedTn, (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8);
-+ yaffs_FreeTnode(dev, passedTn);
- }
- }
-
- return tn;
- }
-
--static int yaffs_FindChunkInGroup(yaffs_Device * dev, int theChunk,
-- yaffs_ExtendedTags * tags, int objectId,
-- int chunkInInode)
-+static int yaffs_FindChunkInGroup(yaffs_Device *dev, int theChunk,
-+ yaffs_ExtendedTags *tags, int objectId,
-+ int chunkInInode)
- {
- int j;
-
- for (j = 0; theChunk && j < dev->chunkGroupSize; j++) {
-- if (yaffs_CheckChunkBit
-- (dev, theChunk / dev->nChunksPerBlock,
-- theChunk % dev->nChunksPerBlock)) {
-+ if (yaffs_CheckChunkBit(dev, theChunk / dev->nChunksPerBlock,
-+ theChunk % dev->nChunksPerBlock)) {
- yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL,
- tags);
- if (yaffs_TagsMatch(tags, objectId, chunkInInode)) {
- /* found it; */
- return theChunk;
--
- }
- }
- theChunk++;
-@@ -1543,7 +1563,7 @@ static int yaffs_FindChunkInGroup(yaffs_
- * Returns 0 if it stopped early due to hitting the limit and the delete is incomplete.
- */
-
--static int yaffs_DeleteWorker(yaffs_Object * in, yaffs_Tnode * tn, __u32 level,
-+static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level,
- int chunkOffset, int *limit)
- {
- int i;
-@@ -1557,7 +1577,6 @@ static int yaffs_DeleteWorker(yaffs_Obje
-
- if (tn) {
- if (level > 0) {
--
- for (i = YAFFS_NTNODES_INTERNAL - 1; allDone && i >= 0;
- i--) {
- if (tn->internal[i]) {
-@@ -1565,17 +1584,17 @@ static int yaffs_DeleteWorker(yaffs_Obje
- allDone = 0;
- } else {
- allDone =
-- yaffs_DeleteWorker(in,
-- tn->
-- internal
-- [i],
-- level -
-- 1,
-- (chunkOffset
-+ yaffs_DeleteWorker(in,
-+ tn->
-+ internal
-+ [i],
-+ level -
-+ 1,
-+ (chunkOffset
- <<
- YAFFS_TNODES_INTERNAL_BITS)
-- + i,
-- limit);
-+ + i,
-+ limit);
- }
- if (allDone) {
- yaffs_FreeTnode(dev,
-@@ -1584,27 +1603,25 @@ static int yaffs_DeleteWorker(yaffs_Obje
- tn->internal[i] = NULL;
- }
- }
--
- }
- return (allDone) ? 1 : 0;
- } else if (level == 0) {
- int hitLimit = 0;
-
- for (i = YAFFS_NTNODES_LEVEL0 - 1; i >= 0 && !hitLimit;
-- i--) {
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,i);
-+ i--) {
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, i);
- if (theChunk) {
-
-- chunkInInode =
-- (chunkOffset <<
-- YAFFS_TNODES_LEVEL0_BITS) + i;
-+ chunkInInode = (chunkOffset <<
-+ YAFFS_TNODES_LEVEL0_BITS) + i;
-
- foundChunk =
-- yaffs_FindChunkInGroup(dev,
-- theChunk,
-- &tags,
-- in->objectId,
-- chunkInInode);
-+ yaffs_FindChunkInGroup(dev,
-+ theChunk,
-+ &tags,
-+ in->objectId,
-+ chunkInInode);
-
- if (foundChunk > 0) {
- yaffs_DeleteChunk(dev,
-@@ -1613,14 +1630,13 @@ static int yaffs_DeleteWorker(yaffs_Obje
- in->nDataChunks--;
- if (limit) {
- *limit = *limit - 1;
-- if (*limit <= 0) {
-+ if (*limit <= 0)
- hitLimit = 1;
-- }
- }
-
- }
-
-- yaffs_PutLevel0Tnode(dev,tn,i,0);
-+ yaffs_PutLevel0Tnode(dev, tn, i, 0);
- }
-
- }
-@@ -1634,9 +1650,8 @@ static int yaffs_DeleteWorker(yaffs_Obje
-
- }
-
--static void yaffs_SoftDeleteChunk(yaffs_Device * dev, int chunk)
-+static void yaffs_SoftDeleteChunk(yaffs_Device *dev, int chunk)
- {
--
- yaffs_BlockInfo *theBlock;
-
- T(YAFFS_TRACE_DELETION, (TSTR("soft delete chunk %d" TENDSTR), chunk));
-@@ -1654,7 +1669,7 @@ static void yaffs_SoftDeleteChunk(yaffs_
- * Thus, essentially this is the same as DeleteWorker except that the chunks are soft deleted.
- */
-
--static int yaffs_SoftDeleteWorker(yaffs_Object * in, yaffs_Tnode * tn,
-+static int yaffs_SoftDeleteWorker(yaffs_Object *in, yaffs_Tnode *tn,
- __u32 level, int chunkOffset)
- {
- int i;
-@@ -1691,14 +1706,14 @@ static int yaffs_SoftDeleteWorker(yaffs_
- } else if (level == 0) {
-
- for (i = YAFFS_NTNODES_LEVEL0 - 1; i >= 0; i--) {
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,i);
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, i);
- if (theChunk) {
- /* Note this does not find the real chunk, only the chunk group.
- * We make an assumption that a chunk group is not larger than
- * a block.
- */
- yaffs_SoftDeleteChunk(dev, theChunk);
-- yaffs_PutLevel0Tnode(dev,tn,i,0);
-+ yaffs_PutLevel0Tnode(dev, tn, i, 0);
- }
-
- }
-@@ -1712,7 +1727,7 @@ static int yaffs_SoftDeleteWorker(yaffs_
-
- }
-
--static void yaffs_SoftDeleteFile(yaffs_Object * obj)
-+static void yaffs_SoftDeleteFile(yaffs_Object *obj)
- {
- if (obj->deleted &&
- obj->variantType == YAFFS_OBJECT_TYPE_FILE && !obj->softDeleted) {
-@@ -1746,8 +1761,8 @@ static void yaffs_SoftDeleteFile(yaffs_O
- * by a special case.
- */
-
--static yaffs_Tnode *yaffs_PruneWorker(yaffs_Device * dev, yaffs_Tnode * tn,
-- __u32 level, int del0)
-+static yaffs_Tnode *yaffs_PruneWorker(yaffs_Device *dev, yaffs_Tnode *tn,
-+ __u32 level, int del0)
- {
- int i;
- int hasData;
-@@ -1763,9 +1778,8 @@ static yaffs_Tnode *yaffs_PruneWorker(ya
- (i == 0) ? del0 : 1);
- }
-
-- if (tn->internal[i]) {
-+ if (tn->internal[i])
- hasData++;
-- }
- }
-
- if (hasData == 0 && del0) {
-@@ -1781,8 +1795,8 @@ static yaffs_Tnode *yaffs_PruneWorker(ya
-
- }
-
--static int yaffs_PruneFileStructure(yaffs_Device * dev,
-- yaffs_FileStructure * fStruct)
-+static int yaffs_PruneFileStructure(yaffs_Device *dev,
-+ yaffs_FileStructure *fStruct)
- {
- int i;
- int hasData;
-@@ -1805,9 +1819,8 @@ static int yaffs_PruneFileStructure(yaff
-
- hasData = 0;
- for (i = 1; i < YAFFS_NTNODES_INTERNAL; i++) {
-- if (tn->internal[i]) {
-+ if (tn->internal[i])
- hasData++;
-- }
- }
-
- if (!hasData) {
-@@ -1828,7 +1841,7 @@ static int yaffs_PruneFileStructure(yaff
- /* yaffs_CreateFreeObjects creates a bunch more objects and
- * adds them to the object free list.
- */
--static int yaffs_CreateFreeObjects(yaffs_Device * dev, int nObjects)
-+static int yaffs_CreateFreeObjects(yaffs_Device *dev, int nObjects)
- {
- int i;
- yaffs_Object *newObjects;
-@@ -1842,9 +1855,9 @@ static int yaffs_CreateFreeObjects(yaffs
- list = YMALLOC(sizeof(yaffs_ObjectList));
-
- if (!newObjects || !list) {
-- if(newObjects)
-+ if (newObjects)
- YFREE(newObjects);
-- if(list)
-+ if (list)
- YFREE(list);
- T(YAFFS_TRACE_ALLOCATE,
- (TSTR("yaffs: Could not allocate more objects" TENDSTR)));
-@@ -1854,7 +1867,7 @@ static int yaffs_CreateFreeObjects(yaffs
- /* Hook them into the free list */
- for (i = 0; i < nObjects - 1; i++) {
- newObjects[i].siblings.next =
-- (struct list_head *)(&newObjects[i + 1]);
-+ (struct ylist_head *)(&newObjects[i + 1]);
- }
-
- newObjects[nObjects - 1].siblings.next = (void *)dev->freeObjects;
-@@ -1873,85 +1886,109 @@ static int yaffs_CreateFreeObjects(yaffs
-
-
- /* AllocateEmptyObject gets us a clean Object. Tries to make allocate more if we run out */
--static yaffs_Object *yaffs_AllocateEmptyObject(yaffs_Device * dev)
-+static yaffs_Object *yaffs_AllocateEmptyObject(yaffs_Device *dev)
- {
- yaffs_Object *tn = NULL;
-
-+#ifdef VALGRIND_TEST
-+ tn = YMALLOC(sizeof(yaffs_Object));
-+#else
- /* If there are none left make more */
-- if (!dev->freeObjects) {
-+ if (!dev->freeObjects)
- yaffs_CreateFreeObjects(dev, YAFFS_ALLOCATION_NOBJECTS);
-- }
-
- if (dev->freeObjects) {
- tn = dev->freeObjects;
- dev->freeObjects =
-- (yaffs_Object *) (dev->freeObjects->siblings.next);
-+ (yaffs_Object *) (dev->freeObjects->siblings.next);
- dev->nFreeObjects--;
--
-+ }
-+#endif
-+ if (tn) {
- /* Now sweeten it up... */
-
- memset(tn, 0, sizeof(yaffs_Object));
-+ tn->beingCreated = 1;
-+
- tn->myDev = dev;
-- tn->chunkId = -1;
-+ tn->hdrChunk = 0;
- tn->variantType = YAFFS_OBJECT_TYPE_UNKNOWN;
-- INIT_LIST_HEAD(&(tn->hardLinks));
-- INIT_LIST_HEAD(&(tn->hashLink));
-- INIT_LIST_HEAD(&tn->siblings);
-+ YINIT_LIST_HEAD(&(tn->hardLinks));
-+ YINIT_LIST_HEAD(&(tn->hashLink));
-+ YINIT_LIST_HEAD(&tn->siblings);
-+
-+
-+ /* Now make the directory sane */
-+ if (dev->rootDir) {
-+ tn->parent = dev->rootDir;
-+ ylist_add(&(tn->siblings), &dev->rootDir->variant.directoryVariant.children);
-+ }
-
- /* Add it to the lost and found directory.
- * NB Can't put root or lostNFound in lostNFound so
- * check if lostNFound exists first
- */
-- if (dev->lostNFoundDir) {
-+ if (dev->lostNFoundDir)
- yaffs_AddObjectToDirectory(dev->lostNFoundDir, tn);
-- }
-+
-+ tn->beingCreated = 0;
- }
-
-+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
-+
- return tn;
- }
-
--static yaffs_Object *yaffs_CreateFakeDirectory(yaffs_Device * dev, int number,
-+static yaffs_Object *yaffs_CreateFakeDirectory(yaffs_Device *dev, int number,
- __u32 mode)
- {
-
- yaffs_Object *obj =
- yaffs_CreateNewObject(dev, number, YAFFS_OBJECT_TYPE_DIRECTORY);
- if (obj) {
-- obj->fake = 1; /* it is fake so it has no NAND presence... */
-+ obj->fake = 1; /* it is fake so it might have no NAND presence... */
- obj->renameAllowed = 0; /* ... and we're not allowed to rename it... */
- obj->unlinkAllowed = 0; /* ... or unlink it */
- obj->deleted = 0;
- obj->unlinked = 0;
- obj->yst_mode = mode;
- obj->myDev = dev;
-- obj->chunkId = 0; /* Not a valid chunk. */
-+ obj->hdrChunk = 0; /* Not a valid chunk. */
- }
-
- return obj;
-
- }
-
--static void yaffs_UnhashObject(yaffs_Object * tn)
-+static void yaffs_UnhashObject(yaffs_Object *tn)
- {
- int bucket;
- yaffs_Device *dev = tn->myDev;
-
- /* If it is still linked into the bucket list, free from the list */
-- if (!list_empty(&tn->hashLink)) {
-- list_del_init(&tn->hashLink);
-+ if (!ylist_empty(&tn->hashLink)) {
-+ ylist_del_init(&tn->hashLink);
- bucket = yaffs_HashFunction(tn->objectId);
- dev->objectBucket[bucket].count--;
- }
--
- }
-
- /* FreeObject frees up a Object and puts it back on the free list */
--static void yaffs_FreeObject(yaffs_Object * tn)
-+static void yaffs_FreeObject(yaffs_Object *tn)
- {
--
- yaffs_Device *dev = tn->myDev;
-
--#ifdef __KERNEL__
-+#ifdef __KERNEL__
-+ T(YAFFS_TRACE_OS, (TSTR("FreeObject %p inode %p"TENDSTR), tn, tn->myInode));
-+#endif
-+
-+ if (tn->parent)
-+ YBUG();
-+ if (!ylist_empty(&tn->siblings))
-+ YBUG();
-+
-+
-+#ifdef __KERNEL__
- if (tn->myInode) {
- /* We're still hooked up to a cached inode.
- * Don't delete now, but mark for later deletion
-@@ -1963,24 +2000,28 @@ static void yaffs_FreeObject(yaffs_Objec
-
- yaffs_UnhashObject(tn);
-
-+#ifdef VALGRIND_TEST
-+ YFREE(tn);
-+#else
- /* Link into the free list. */
-- tn->siblings.next = (struct list_head *)(dev->freeObjects);
-+ tn->siblings.next = (struct ylist_head *)(dev->freeObjects);
- dev->freeObjects = tn;
- dev->nFreeObjects++;
-+#endif
-+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
- }
-
- #ifdef __KERNEL__
-
--void yaffs_HandleDeferedFree(yaffs_Object * obj)
-+void yaffs_HandleDeferedFree(yaffs_Object *obj)
- {
-- if (obj->deferedFree) {
-+ if (obj->deferedFree)
- yaffs_FreeObject(obj);
-- }
- }
-
- #endif
-
--static void yaffs_DeinitialiseObjects(yaffs_Device * dev)
-+static void yaffs_DeinitialiseObjects(yaffs_Device *dev)
- {
- /* Free the list of allocated Objects */
-
-@@ -1998,7 +2039,7 @@ static void yaffs_DeinitialiseObjects(ya
- dev->nFreeObjects = 0;
- }
-
--static void yaffs_InitialiseObjects(yaffs_Device * dev)
-+static void yaffs_InitialiseObjects(yaffs_Device *dev)
- {
- int i;
-
-@@ -2007,15 +2048,14 @@ static void yaffs_InitialiseObjects(yaff
- dev->nFreeObjects = 0;
-
- for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) {
-- INIT_LIST_HEAD(&dev->objectBucket[i].list);
-+ YINIT_LIST_HEAD(&dev->objectBucket[i].list);
- dev->objectBucket[i].count = 0;
- }
--
- }
-
--static int yaffs_FindNiceObjectBucket(yaffs_Device * dev)
-+static int yaffs_FindNiceObjectBucket(yaffs_Device *dev)
- {
-- static int x = 0;
-+ static int x;
- int i;
- int l = 999;
- int lowest = 999999;
-@@ -2049,7 +2089,7 @@ static int yaffs_FindNiceObjectBucket(ya
- return l;
- }
-
--static int yaffs_CreateNewObjectNumber(yaffs_Device * dev)
-+static int yaffs_CreateNewObjectNumber(yaffs_Device *dev)
- {
- int bucket = yaffs_FindNiceObjectBucket(dev);
-
-@@ -2058,7 +2098,7 @@ static int yaffs_CreateNewObjectNumber(y
- */
-
- int found = 0;
-- struct list_head *i;
-+ struct ylist_head *i;
-
- __u32 n = (__u32) bucket;
-
-@@ -2068,41 +2108,38 @@ static int yaffs_CreateNewObjectNumber(y
- found = 1;
- n += YAFFS_NOBJECT_BUCKETS;
- if (1 || dev->objectBucket[bucket].count > 0) {
-- list_for_each(i, &dev->objectBucket[bucket].list) {
-+ ylist_for_each(i, &dev->objectBucket[bucket].list) {
- /* If there is already one in the list */
-- if (i
-- && list_entry(i, yaffs_Object,
-- hashLink)->objectId == n) {
-+ if (i && ylist_entry(i, yaffs_Object,
-+ hashLink)->objectId == n) {
- found = 0;
- }
- }
- }
- }
-
--
- return n;
- }
-
--static void yaffs_HashObject(yaffs_Object * in)
-+static void yaffs_HashObject(yaffs_Object *in)
- {
- int bucket = yaffs_HashFunction(in->objectId);
- yaffs_Device *dev = in->myDev;
-
-- list_add(&in->hashLink, &dev->objectBucket[bucket].list);
-+ ylist_add(&in->hashLink, &dev->objectBucket[bucket].list);
- dev->objectBucket[bucket].count++;
--
- }
-
--yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device * dev, __u32 number)
-+yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev, __u32 number)
- {
- int bucket = yaffs_HashFunction(number);
-- struct list_head *i;
-+ struct ylist_head *i;
- yaffs_Object *in;
-
-- list_for_each(i, &dev->objectBucket[bucket].list) {
-+ ylist_for_each(i, &dev->objectBucket[bucket].list) {
- /* Look if it is in the list */
- if (i) {
-- in = list_entry(i, yaffs_Object, hashLink);
-+ in = ylist_entry(i, yaffs_Object, hashLink);
- if (in->objectId == number) {
- #ifdef __KERNEL__
- /* Don't tell the VFS about this one if it is defered free */
-@@ -2118,31 +2155,27 @@ yaffs_Object *yaffs_FindObjectByNumber(y
- return NULL;
- }
-
--yaffs_Object *yaffs_CreateNewObject(yaffs_Device * dev, int number,
-+yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number,
- yaffs_ObjectType type)
- {
--
- yaffs_Object *theObject;
-- yaffs_Tnode *tn;
-+ yaffs_Tnode *tn = NULL;
-
-- if (number < 0) {
-+ if (number < 0)
- number = yaffs_CreateNewObjectNumber(dev);
-- }
-
- theObject = yaffs_AllocateEmptyObject(dev);
-- if(!theObject)
-+ if (!theObject)
- return NULL;
-
-- if(type == YAFFS_OBJECT_TYPE_FILE){
-+ if (type == YAFFS_OBJECT_TYPE_FILE) {
- tn = yaffs_GetTnode(dev);
-- if(!tn){
-+ if (!tn) {
- yaffs_FreeObject(theObject);
- return NULL;
- }
- }
-
--
--
- if (theObject) {
- theObject->fake = 0;
- theObject->renameAllowed = 1;
-@@ -2171,8 +2204,8 @@ yaffs_Object *yaffs_CreateNewObject(yaff
- theObject->variant.fileVariant.top = tn;
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-- INIT_LIST_HEAD(&theObject->variant.directoryVariant.
-- children);
-+ YINIT_LIST_HEAD(&theObject->variant.directoryVariant.
-+ children);
- break;
- case YAFFS_OBJECT_TYPE_SYMLINK:
- case YAFFS_OBJECT_TYPE_HARDLINK:
-@@ -2188,32 +2221,30 @@ yaffs_Object *yaffs_CreateNewObject(yaff
- return theObject;
- }
-
--static yaffs_Object *yaffs_FindOrCreateObjectByNumber(yaffs_Device * dev,
-+static yaffs_Object *yaffs_FindOrCreateObjectByNumber(yaffs_Device *dev,
- int number,
- yaffs_ObjectType type)
- {
- yaffs_Object *theObject = NULL;
-
-- if (number > 0) {
-+ if (number > 0)
- theObject = yaffs_FindObjectByNumber(dev, number);
-- }
-
-- if (!theObject) {
-+ if (!theObject)
- theObject = yaffs_CreateNewObject(dev, number, type);
-- }
-
- return theObject;
-
- }
-
-
--static YCHAR *yaffs_CloneString(const YCHAR * str)
-+static YCHAR *yaffs_CloneString(const YCHAR *str)
- {
- YCHAR *newStr = NULL;
-
- if (str && *str) {
- newStr = YMALLOC((yaffs_strlen(str) + 1) * sizeof(YCHAR));
-- if(newStr)
-+ if (newStr)
- yaffs_strcpy(newStr, str);
- }
-
-@@ -2229,29 +2260,31 @@ static YCHAR *yaffs_CloneString(const YC
- */
-
- static yaffs_Object *yaffs_MknodObject(yaffs_ObjectType type,
-- yaffs_Object * parent,
-- const YCHAR * name,
-+ yaffs_Object *parent,
-+ const YCHAR *name,
- __u32 mode,
- __u32 uid,
- __u32 gid,
-- yaffs_Object * equivalentObject,
-- const YCHAR * aliasString, __u32 rdev)
-+ yaffs_Object *equivalentObject,
-+ const YCHAR *aliasString, __u32 rdev)
- {
- yaffs_Object *in;
-- YCHAR *str;
-+ YCHAR *str = NULL;
-
- yaffs_Device *dev = parent->myDev;
-
- /* Check if the entry exists. If it does then fail the call since we don't want a dup.*/
-- if (yaffs_FindObjectByName(parent, name)) {
-+ if (yaffs_FindObjectByName(parent, name))
- return NULL;
-- }
-
- in = yaffs_CreateNewObject(dev, -1, type);
-
-- if(type == YAFFS_OBJECT_TYPE_SYMLINK){
-+ if (!in)
-+ return YAFFS_FAIL;
-+
-+ if (type == YAFFS_OBJECT_TYPE_SYMLINK) {
- str = yaffs_CloneString(aliasString);
-- if(!str){
-+ if (!str) {
- yaffs_FreeObject(in);
- return NULL;
- }
-@@ -2260,7 +2293,7 @@ static yaffs_Object *yaffs_MknodObject(y
-
-
- if (in) {
-- in->chunkId = -1;
-+ in->hdrChunk = 0;
- in->valid = 1;
- in->variantType = type;
-
-@@ -2293,10 +2326,10 @@ static yaffs_Object *yaffs_MknodObject(y
- break;
- case YAFFS_OBJECT_TYPE_HARDLINK:
- in->variant.hardLinkVariant.equivalentObject =
-- equivalentObject;
-+ equivalentObject;
- in->variant.hardLinkVariant.equivalentObjectId =
-- equivalentObject->objectId;
-- list_add(&in->hardLinks, &equivalentObject->hardLinks);
-+ equivalentObject->objectId;
-+ ylist_add(&in->hardLinks, &equivalentObject->hardLinks);
- break;
- case YAFFS_OBJECT_TYPE_FILE:
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-@@ -2308,7 +2341,7 @@ static yaffs_Object *yaffs_MknodObject(y
-
- if (yaffs_UpdateObjectHeader(in, name, 0, 0, 0) < 0) {
- /* Could not create the object header, fail the creation */
-- yaffs_DestroyObject(in);
-+ yaffs_DeleteObject(in);
- in = NULL;
- }
-
-@@ -2317,38 +2350,38 @@ static yaffs_Object *yaffs_MknodObject(y
- return in;
- }
-
--yaffs_Object *yaffs_MknodFile(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid)
-+yaffs_Object *yaffs_MknodFile(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid)
- {
- return yaffs_MknodObject(YAFFS_OBJECT_TYPE_FILE, parent, name, mode,
-- uid, gid, NULL, NULL, 0);
-+ uid, gid, NULL, NULL, 0);
- }
-
--yaffs_Object *yaffs_MknodDirectory(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid)
-+yaffs_Object *yaffs_MknodDirectory(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid)
- {
- return yaffs_MknodObject(YAFFS_OBJECT_TYPE_DIRECTORY, parent, name,
- mode, uid, gid, NULL, NULL, 0);
- }
-
--yaffs_Object *yaffs_MknodSpecial(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid, __u32 rdev)
-+yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid, __u32 rdev)
- {
- return yaffs_MknodObject(YAFFS_OBJECT_TYPE_SPECIAL, parent, name, mode,
- uid, gid, NULL, NULL, rdev);
- }
-
--yaffs_Object *yaffs_MknodSymLink(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid,
-- const YCHAR * alias)
-+yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid,
-+ const YCHAR *alias)
- {
- return yaffs_MknodObject(YAFFS_OBJECT_TYPE_SYMLINK, parent, name, mode,
-- uid, gid, NULL, alias, 0);
-+ uid, gid, NULL, alias, 0);
- }
-
- /* yaffs_Link returns the object id of the equivalent object.*/
--yaffs_Object *yaffs_Link(yaffs_Object * parent, const YCHAR * name,
-- yaffs_Object * equivalentObject)
-+yaffs_Object *yaffs_Link(yaffs_Object *parent, const YCHAR *name,
-+ yaffs_Object *equivalentObject)
- {
- /* Get the real object in case we were fed a hard link as an equivalent object */
- equivalentObject = yaffs_GetEquivalentObject(equivalentObject);
-@@ -2363,33 +2396,31 @@ yaffs_Object *yaffs_Link(yaffs_Object *
-
- }
-
--static int yaffs_ChangeObjectName(yaffs_Object * obj, yaffs_Object * newDir,
-- const YCHAR * newName, int force, int shadows)
-+static int yaffs_ChangeObjectName(yaffs_Object *obj, yaffs_Object *newDir,
-+ const YCHAR *newName, int force, int shadows)
- {
- int unlinkOp;
- int deleteOp;
-
- yaffs_Object *existingTarget;
-
-- if (newDir == NULL) {
-+ if (newDir == NULL)
- newDir = obj->parent; /* use the old directory */
-- }
-
- if (newDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
-- ("tragendy: yaffs_ChangeObjectName: newDir is not a directory"
-+ ("tragedy: yaffs_ChangeObjectName: newDir is not a directory"
- TENDSTR)));
- YBUG();
- }
-
- /* TODO: Do we need this different handling for YAFFS2 and YAFFS1?? */
-- if (obj->myDev->isYaffs2) {
-+ if (obj->myDev->isYaffs2)
- unlinkOp = (newDir == obj->myDev->unlinkedDir);
-- } else {
-+ else
- unlinkOp = (newDir == obj->myDev->unlinkedDir
- && obj->variantType == YAFFS_OBJECT_TYPE_FILE);
-- }
-
- deleteOp = (newDir == obj->myDev->deletedDir);
-
-@@ -2415,40 +2446,40 @@ static int yaffs_ChangeObjectName(yaffs_
- obj->unlinked = 1;
-
- /* If it is a deletion then we mark it as a shrink for gc purposes. */
-- if (yaffs_UpdateObjectHeader(obj, newName, 0, deleteOp, shadows)>= 0)
-+ if (yaffs_UpdateObjectHeader(obj, newName, 0, deleteOp, shadows) >= 0)
- return YAFFS_OK;
- }
-
- return YAFFS_FAIL;
- }
-
--int yaffs_RenameObject(yaffs_Object * oldDir, const YCHAR * oldName,
-- yaffs_Object * newDir, const YCHAR * newName)
-+int yaffs_RenameObject(yaffs_Object *oldDir, const YCHAR *oldName,
-+ yaffs_Object *newDir, const YCHAR *newName)
- {
-- yaffs_Object *obj;
-- yaffs_Object *existingTarget;
-+ yaffs_Object *obj = NULL;
-+ yaffs_Object *existingTarget = NULL;
- int force = 0;
-
-+
-+ if (!oldDir || oldDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY)
-+ YBUG();
-+ if (!newDir || newDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY)
-+ YBUG();
-+
- #ifdef CONFIG_YAFFS_CASE_INSENSITIVE
- /* Special case for case insemsitive systems (eg. WinCE).
- * While look-up is case insensitive, the name isn't.
- * Therefore we might want to change x.txt to X.txt
- */
-- if (oldDir == newDir && yaffs_strcmp(oldName, newName) == 0) {
-+ if (oldDir == newDir && yaffs_strcmp(oldName, newName) == 0)
- force = 1;
-- }
- #endif
-
-+ else if (yaffs_strlen(newName) > YAFFS_MAX_NAME_LENGTH)
-+ /* ENAMETOOLONG */
-+ return YAFFS_FAIL;
-+
- obj = yaffs_FindObjectByName(oldDir, oldName);
-- /* Check new name to long. */
-- if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK &&
-- yaffs_strlen(newName) > YAFFS_MAX_ALIAS_LENGTH)
-- /* ENAMETOOLONG */
-- return YAFFS_FAIL;
-- else if (obj->variantType != YAFFS_OBJECT_TYPE_SYMLINK &&
-- yaffs_strlen(newName) > YAFFS_MAX_NAME_LENGTH)
-- /* ENAMETOOLONG */
-- return YAFFS_FAIL;
-
- if (obj && obj->renameAllowed) {
-
-@@ -2456,8 +2487,8 @@ int yaffs_RenameObject(yaffs_Object * ol
-
- existingTarget = yaffs_FindObjectByName(newDir, newName);
- if (existingTarget &&
-- existingTarget->variantType == YAFFS_OBJECT_TYPE_DIRECTORY &&
-- !list_empty(&existingTarget->variant.directoryVariant.children)) {
-+ existingTarget->variantType == YAFFS_OBJECT_TYPE_DIRECTORY &&
-+ !ylist_empty(&existingTarget->variant.directoryVariant.children)) {
- /* There is a target that is a non-empty directory, so we fail */
- return YAFFS_FAIL; /* EEXIST or ENOTEMPTY */
- } else if (existingTarget && existingTarget != obj) {
-@@ -2465,7 +2496,7 @@ int yaffs_RenameObject(yaffs_Object * ol
- * but only if it isn't the same object
- */
- yaffs_ChangeObjectName(obj, newDir, newName, force,
-- existingTarget->objectId);
-+ existingTarget->objectId);
- yaffs_UnlinkObject(existingTarget);
- }
-
-@@ -2476,7 +2507,7 @@ int yaffs_RenameObject(yaffs_Object * ol
-
- /*------------------------- Block Management and Page Allocation ----------------*/
-
--static int yaffs_InitialiseBlocks(yaffs_Device * dev)
-+static int yaffs_InitialiseBlocks(yaffs_Device *dev)
- {
- int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1;
-
-@@ -2487,23 +2518,20 @@ static int yaffs_InitialiseBlocks(yaffs_
-
- /* If the first allocation strategy fails, thry the alternate one */
- dev->blockInfo = YMALLOC(nBlocks * sizeof(yaffs_BlockInfo));
-- if(!dev->blockInfo){
-+ if (!dev->blockInfo) {
- dev->blockInfo = YMALLOC_ALT(nBlocks * sizeof(yaffs_BlockInfo));
- dev->blockInfoAlt = 1;
-- }
-- else
-+ } else
- dev->blockInfoAlt = 0;
-
-- if(dev->blockInfo){
--
-+ if (dev->blockInfo) {
- /* Set up dynamic blockinfo stuff. */
- dev->chunkBitmapStride = (dev->nChunksPerBlock + 7) / 8; /* round up bytes */
- dev->chunkBits = YMALLOC(dev->chunkBitmapStride * nBlocks);
-- if(!dev->chunkBits){
-+ if (!dev->chunkBits) {
- dev->chunkBits = YMALLOC_ALT(dev->chunkBitmapStride * nBlocks);
- dev->chunkBitsAlt = 1;
-- }
-- else
-+ } else
- dev->chunkBitsAlt = 0;
- }
-
-@@ -2514,30 +2542,29 @@ static int yaffs_InitialiseBlocks(yaffs_
- }
-
- return YAFFS_FAIL;
--
- }
-
--static void yaffs_DeinitialiseBlocks(yaffs_Device * dev)
-+static void yaffs_DeinitialiseBlocks(yaffs_Device *dev)
- {
-- if(dev->blockInfoAlt && dev->blockInfo)
-+ if (dev->blockInfoAlt && dev->blockInfo)
- YFREE_ALT(dev->blockInfo);
-- else if(dev->blockInfo)
-+ else if (dev->blockInfo)
- YFREE(dev->blockInfo);
-
- dev->blockInfoAlt = 0;
-
- dev->blockInfo = NULL;
-
-- if(dev->chunkBitsAlt && dev->chunkBits)
-+ if (dev->chunkBitsAlt && dev->chunkBits)
- YFREE_ALT(dev->chunkBits);
-- else if(dev->chunkBits)
-+ else if (dev->chunkBits)
- YFREE(dev->chunkBits);
- dev->chunkBitsAlt = 0;
- dev->chunkBits = NULL;
- }
-
--static int yaffs_BlockNotDisqualifiedFromGC(yaffs_Device * dev,
-- yaffs_BlockInfo * bi)
-+static int yaffs_BlockNotDisqualifiedFromGC(yaffs_Device *dev,
-+ yaffs_BlockInfo *bi)
- {
- int i;
- __u32 seq;
-@@ -2556,7 +2583,7 @@ static int yaffs_BlockNotDisqualifiedFro
- seq = dev->sequenceNumber;
-
- for (i = dev->internalStartBlock; i <= dev->internalEndBlock;
-- i++) {
-+ i++) {
- b = yaffs_GetBlockInfo(dev, i);
- if (b->blockState == YAFFS_BLOCK_STATE_FULL &&
- (b->pagesInUse - b->softDeletions) <
-@@ -2571,38 +2598,36 @@ static int yaffs_BlockNotDisqualifiedFro
- * discarded pages.
- */
- return (bi->sequenceNumber <= dev->oldestDirtySequence);
--
- }
-
- /* FindDiretiestBlock is used to select the dirtiest block (or close enough)
- * for garbage collection.
- */
-
--static int yaffs_FindBlockForGarbageCollection(yaffs_Device * dev,
-- int aggressive)
-+static int yaffs_FindBlockForGarbageCollection(yaffs_Device *dev,
-+ int aggressive)
- {
--
- int b = dev->currentDirtyChecker;
-
- int i;
- int iterations;
- int dirtiest = -1;
- int pagesInUse = 0;
-- int prioritised=0;
-+ int prioritised = 0;
- yaffs_BlockInfo *bi;
- int pendingPrioritisedExist = 0;
-
- /* First let's see if we need to grab a prioritised block */
-- if(dev->hasPendingPrioritisedGCs){
-- for(i = dev->internalStartBlock; i < dev->internalEndBlock && !prioritised; i++){
-+ if (dev->hasPendingPrioritisedGCs) {
-+ for (i = dev->internalStartBlock; i < dev->internalEndBlock && !prioritised; i++) {
-
- bi = yaffs_GetBlockInfo(dev, i);
-- //yaffs_VerifyBlock(dev,bi,i);
-+ /* yaffs_VerifyBlock(dev,bi,i); */
-
-- if(bi->gcPrioritise) {
-+ if (bi->gcPrioritise) {
- pendingPrioritisedExist = 1;
-- if(bi->blockState == YAFFS_BLOCK_STATE_FULL &&
-- yaffs_BlockNotDisqualifiedFromGC(dev, bi)){
-+ if (bi->blockState == YAFFS_BLOCK_STATE_FULL &&
-+ yaffs_BlockNotDisqualifiedFromGC(dev, bi)) {
- pagesInUse = (bi->pagesInUse - bi->softDeletions);
- dirtiest = i;
- prioritised = 1;
-@@ -2611,7 +2636,7 @@ static int yaffs_FindBlockForGarbageColl
- }
- }
-
-- if(!pendingPrioritisedExist) /* None found, so we can clear this */
-+ if (!pendingPrioritisedExist) /* None found, so we can clear this */
- dev->hasPendingPrioritisedGCs = 0;
- }
-
-@@ -2623,31 +2648,28 @@ static int yaffs_FindBlockForGarbageColl
-
- dev->nonAggressiveSkip--;
-
-- if (!aggressive && (dev->nonAggressiveSkip > 0)) {
-+ if (!aggressive && (dev->nonAggressiveSkip > 0))
- return -1;
-- }
-
-- if(!prioritised)
-+ if (!prioritised)
- pagesInUse =
-- (aggressive) ? dev->nChunksPerBlock : YAFFS_PASSIVE_GC_CHUNKS + 1;
-+ (aggressive) ? dev->nChunksPerBlock : YAFFS_PASSIVE_GC_CHUNKS + 1;
-
-- if (aggressive) {
-+ if (aggressive)
- iterations =
- dev->internalEndBlock - dev->internalStartBlock + 1;
-- } else {
-+ else {
- iterations =
- dev->internalEndBlock - dev->internalStartBlock + 1;
- iterations = iterations / 16;
-- if (iterations > 200) {
-+ if (iterations > 200)
- iterations = 200;
-- }
- }
-
- for (i = 0; i <= iterations && pagesInUse > 0 && !prioritised; i++) {
- b++;
-- if (b < dev->internalStartBlock || b > dev->internalEndBlock) {
-+ if (b < dev->internalStartBlock || b > dev->internalEndBlock)
- b = dev->internalStartBlock;
-- }
-
- if (b < dev->internalStartBlock || b > dev->internalEndBlock) {
- T(YAFFS_TRACE_ERROR,
-@@ -2657,17 +2679,9 @@ static int yaffs_FindBlockForGarbageColl
-
- bi = yaffs_GetBlockInfo(dev, b);
-
--#if 0
-- if (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT) {
-- dirtiest = b;
-- pagesInUse = 0;
-- }
-- else
--#endif
--
- if (bi->blockState == YAFFS_BLOCK_STATE_FULL &&
-- (bi->pagesInUse - bi->softDeletions) < pagesInUse &&
-- yaffs_BlockNotDisqualifiedFromGC(dev, bi)) {
-+ (bi->pagesInUse - bi->softDeletions) < pagesInUse &&
-+ yaffs_BlockNotDisqualifiedFromGC(dev, bi)) {
- dirtiest = b;
- pagesInUse = (bi->pagesInUse - bi->softDeletions);
- }
-@@ -2678,19 +2692,18 @@ static int yaffs_FindBlockForGarbageColl
- if (dirtiest > 0) {
- T(YAFFS_TRACE_GC,
- (TSTR("GC Selected block %d with %d free, prioritised:%d" TENDSTR), dirtiest,
-- dev->nChunksPerBlock - pagesInUse,prioritised));
-+ dev->nChunksPerBlock - pagesInUse, prioritised));
- }
-
- dev->oldestDirtySequence = 0;
-
-- if (dirtiest > 0) {
-+ if (dirtiest > 0)
- dev->nonAggressiveSkip = 4;
-- }
-
- return dirtiest;
- }
-
--static void yaffs_BlockBecameDirty(yaffs_Device * dev, int blockNo)
-+static void yaffs_BlockBecameDirty(yaffs_Device *dev, int blockNo)
- {
- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockNo);
-
-@@ -2752,7 +2765,7 @@ static void yaffs_BlockBecameDirty(yaffs
- }
- }
-
--static int yaffs_FindBlockForAllocation(yaffs_Device * dev)
-+static int yaffs_FindBlockForAllocation(yaffs_Device *dev)
- {
- int i;
-
-@@ -2763,7 +2776,7 @@ static int yaffs_FindBlockForAllocation(
- * Can't get space to gc
- */
- T(YAFFS_TRACE_ERROR,
-- (TSTR("yaffs tragedy: no more eraased blocks" TENDSTR)));
-+ (TSTR("yaffs tragedy: no more erased blocks" TENDSTR)));
-
- return -1;
- }
-@@ -2794,31 +2807,74 @@ static int yaffs_FindBlockForAllocation(
-
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
-- ("yaffs tragedy: no more eraased blocks, but there should have been %d"
-+ ("yaffs tragedy: no more erased blocks, but there should have been %d"
- TENDSTR), dev->nErasedBlocks));
-
- return -1;
- }
-
-
--// Check if there's space to allocate...
--// Thinks.... do we need top make this ths same as yaffs_GetFreeChunks()?
--static int yaffs_CheckSpaceForAllocation(yaffs_Device * dev)
-+
-+static int yaffs_CalcCheckpointBlocksRequired(yaffs_Device *dev)
-+{
-+ if (!dev->nCheckpointBlocksRequired &&
-+ dev->isYaffs2) {
-+ /* Not a valid value so recalculate */
-+ int nBytes = 0;
-+ int nBlocks;
-+ int devBlocks = (dev->endBlock - dev->startBlock + 1);
-+ int tnodeSize;
-+
-+ tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-+
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-+
-+ nBytes += sizeof(yaffs_CheckpointValidity);
-+ nBytes += sizeof(yaffs_CheckpointDevice);
-+ nBytes += devBlocks * sizeof(yaffs_BlockInfo);
-+ nBytes += devBlocks * dev->chunkBitmapStride;
-+ nBytes += (sizeof(yaffs_CheckpointObject) + sizeof(__u32)) * (dev->nObjectsCreated - dev->nFreeObjects);
-+ nBytes += (tnodeSize + sizeof(__u32)) * (dev->nTnodesCreated - dev->nFreeTnodes);
-+ nBytes += sizeof(yaffs_CheckpointValidity);
-+ nBytes += sizeof(__u32); /* checksum*/
-+
-+ /* Round up and add 2 blocks to allow for some bad blocks, so add 3 */
-+
-+ nBlocks = (nBytes/(dev->nDataBytesPerChunk * dev->nChunksPerBlock)) + 3;
-+
-+ dev->nCheckpointBlocksRequired = nBlocks;
-+ }
-+
-+ return dev->nCheckpointBlocksRequired;
-+}
-+
-+/*
-+ * Check if there's space to allocate...
-+ * Thinks.... do we need top make this ths same as yaffs_GetFreeChunks()?
-+ */
-+static int yaffs_CheckSpaceForAllocation(yaffs_Device *dev)
- {
- int reservedChunks;
- int reservedBlocks = dev->nReservedBlocks;
- int checkpointBlocks;
-
-- checkpointBlocks = dev->nCheckpointReservedBlocks - dev->blocksInCheckpoint;
-- if(checkpointBlocks < 0)
-+ if (dev->isYaffs2) {
-+ checkpointBlocks = yaffs_CalcCheckpointBlocksRequired(dev) -
-+ dev->blocksInCheckpoint;
-+ if (checkpointBlocks < 0)
-+ checkpointBlocks = 0;
-+ } else {
- checkpointBlocks = 0;
-+ }
-
- reservedChunks = ((reservedBlocks + checkpointBlocks) * dev->nChunksPerBlock);
-
- return (dev->nFreeChunks > reservedChunks);
- }
-
--static int yaffs_AllocateChunk(yaffs_Device * dev, int useReserve, yaffs_BlockInfo **blockUsedPtr)
-+static int yaffs_AllocateChunk(yaffs_Device *dev, int useReserve,
-+ yaffs_BlockInfo **blockUsedPtr)
- {
- int retVal;
- yaffs_BlockInfo *bi;
-@@ -2835,7 +2891,7 @@ static int yaffs_AllocateChunk(yaffs_Dev
- }
-
- if (dev->nErasedBlocks < dev->nReservedBlocks
-- && dev->allocationPage == 0) {
-+ && dev->allocationPage == 0) {
- T(YAFFS_TRACE_ALLOCATE, (TSTR("Allocating reserve" TENDSTR)));
- }
-
-@@ -2844,10 +2900,10 @@ static int yaffs_AllocateChunk(yaffs_Dev
- bi = yaffs_GetBlockInfo(dev, dev->allocationBlock);
-
- retVal = (dev->allocationBlock * dev->nChunksPerBlock) +
-- dev->allocationPage;
-+ dev->allocationPage;
- bi->pagesInUse++;
- yaffs_SetChunkBit(dev, dev->allocationBlock,
-- dev->allocationPage);
-+ dev->allocationPage);
-
- dev->allocationPage++;
-
-@@ -2859,43 +2915,43 @@ static int yaffs_AllocateChunk(yaffs_Dev
- dev->allocationBlock = -1;
- }
-
-- if(blockUsedPtr)
-+ if (blockUsedPtr)
- *blockUsedPtr = bi;
-
- return retVal;
- }
-
- T(YAFFS_TRACE_ERROR,
-- (TSTR("!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!" TENDSTR)));
-+ (TSTR("!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!" TENDSTR)));
-
- return -1;
- }
-
--static int yaffs_GetErasedChunks(yaffs_Device * dev)
-+static int yaffs_GetErasedChunks(yaffs_Device *dev)
- {
- int n;
-
- n = dev->nErasedBlocks * dev->nChunksPerBlock;
-
-- if (dev->allocationBlock > 0) {
-+ if (dev->allocationBlock > 0)
- n += (dev->nChunksPerBlock - dev->allocationPage);
-- }
-
- return n;
-
- }
-
--static int yaffs_GarbageCollectBlock(yaffs_Device * dev, int block)
-+static int yaffs_GarbageCollectBlock(yaffs_Device *dev, int block,
-+ int wholeBlock)
- {
- int oldChunk;
- int newChunk;
-- int chunkInBlock;
- int markNAND;
- int retVal = YAFFS_OK;
- int cleanups = 0;
- int i;
- int isCheckpointBlock;
- int matchingChunk;
-+ int maxCopies;
-
- int chunksBefore = yaffs_GetErasedChunks(dev);
- int chunksAfter;
-@@ -2911,8 +2967,11 @@ static int yaffs_GarbageCollectBlock(yaf
- bi->blockState = YAFFS_BLOCK_STATE_COLLECTING;
-
- T(YAFFS_TRACE_TRACING,
-- (TSTR("Collecting block %d, in use %d, shrink %d, " TENDSTR), block,
-- bi->pagesInUse, bi->hasShrinkHeader));
-+ (TSTR("Collecting block %d, in use %d, shrink %d, wholeBlock %d" TENDSTR),
-+ block,
-+ bi->pagesInUse,
-+ bi->hasShrinkHeader,
-+ wholeBlock));
-
- /*yaffs_VerifyFreeChunks(dev); */
-
-@@ -2926,26 +2985,33 @@ static int yaffs_GarbageCollectBlock(yaf
- dev->isDoingGC = 1;
-
- if (isCheckpointBlock ||
-- !yaffs_StillSomeChunkBits(dev, block)) {
-+ !yaffs_StillSomeChunkBits(dev, block)) {
- T(YAFFS_TRACE_TRACING,
-- (TSTR
-- ("Collecting block %d that has no chunks in use" TENDSTR),
-- block));
-+ (TSTR
-+ ("Collecting block %d that has no chunks in use" TENDSTR),
-+ block));
- yaffs_BlockBecameDirty(dev, block);
- } else {
-
- __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__);
-
-- yaffs_VerifyBlock(dev,bi,block);
-+ yaffs_VerifyBlock(dev, bi, block);
-
-- for (chunkInBlock = 0, oldChunk = block * dev->nChunksPerBlock;
-- chunkInBlock < dev->nChunksPerBlock
-- && yaffs_StillSomeChunkBits(dev, block);
-- chunkInBlock++, oldChunk++) {
-- if (yaffs_CheckChunkBit(dev, block, chunkInBlock)) {
-+ maxCopies = (wholeBlock) ? dev->nChunksPerBlock : 10;
-+ oldChunk = block * dev->nChunksPerBlock + dev->gcChunk;
-+
-+ for (/* init already done */;
-+ retVal == YAFFS_OK &&
-+ dev->gcChunk < dev->nChunksPerBlock &&
-+ (bi->blockState == YAFFS_BLOCK_STATE_COLLECTING) &&
-+ maxCopies > 0;
-+ dev->gcChunk++, oldChunk++) {
-+ if (yaffs_CheckChunkBit(dev, block, dev->gcChunk)) {
-
- /* This page is in use and might need to be copied off */
-
-+ maxCopies--;
-+
- markNAND = 1;
-
- yaffs_InitialiseTags(&tags);
-@@ -2959,22 +3025,22 @@ static int yaffs_GarbageCollectBlock(yaf
-
- T(YAFFS_TRACE_GC_DETAIL,
- (TSTR
-- ("Collecting page %d, %d %d %d " TENDSTR),
-- chunkInBlock, tags.objectId, tags.chunkId,
-+ ("Collecting chunk in block %d, %d %d %d " TENDSTR),
-+ dev->gcChunk, tags.objectId, tags.chunkId,
- tags.byteCount));
-
-- if(object && !yaffs_SkipVerification(dev)){
-- if(tags.chunkId == 0)
-- matchingChunk = object->chunkId;
-- else if(object->softDeleted)
-+ if (object && !yaffs_SkipVerification(dev)) {
-+ if (tags.chunkId == 0)
-+ matchingChunk = object->hdrChunk;
-+ else if (object->softDeleted)
- matchingChunk = oldChunk; /* Defeat the test */
- else
-- matchingChunk = yaffs_FindChunkInFile(object,tags.chunkId,NULL);
-+ matchingChunk = yaffs_FindChunkInFile(object, tags.chunkId, NULL);
-
-- if(oldChunk != matchingChunk)
-+ if (oldChunk != matchingChunk)
- T(YAFFS_TRACE_ERROR,
- (TSTR("gc: page in gc mismatch: %d %d %d %d"TENDSTR),
-- oldChunk,matchingChunk,tags.objectId, tags.chunkId));
-+ oldChunk, matchingChunk, tags.objectId, tags.chunkId));
-
- }
-
-@@ -2986,9 +3052,11 @@ static int yaffs_GarbageCollectBlock(yaf
- tags.objectId, tags.chunkId, tags.byteCount));
- }
-
-- if (object && object->deleted
-- && tags.chunkId != 0) {
-- /* Data chunk in a deleted file, throw it away
-+ if (object &&
-+ object->deleted &&
-+ object->softDeleted &&
-+ tags.chunkId != 0) {
-+ /* Data chunk in a soft deleted file, throw it away
- * It's a soft deleted data chunk,
- * No need to copy this, just forget about it and
- * fix up the object.
-@@ -3003,13 +3071,12 @@ static int yaffs_GarbageCollectBlock(yaf
- cleanups++;
- }
- markNAND = 0;
-- } else if (0
-- /* Todo object && object->deleted && object->nDataChunks == 0 */
-- ) {
-+ } else if (0) {
-+ /* Todo object && object->deleted && object->nDataChunks == 0 */
- /* Deleted object header with no data chunks.
- * Can be discarded and the file deleted.
- */
-- object->chunkId = 0;
-+ object->hdrChunk = 0;
- yaffs_FreeTnode(object->myDev,
- object->variant.
- fileVariant.top);
-@@ -3031,17 +3098,14 @@ static int yaffs_GarbageCollectBlock(yaf
- * We need to nuke the shrinkheader flags first
- * We no longer want the shrinkHeader flag since its work is done
- * and if it is left in place it will mess up scanning.
-- * Also, clear out any shadowing stuff
- */
-
- yaffs_ObjectHeader *oh;
- oh = (yaffs_ObjectHeader *)buffer;
- oh->isShrink = 0;
-- oh->shadowsObject = -1;
-- tags.extraShadows = 0;
- tags.extraIsShrinkHeader = 0;
-
-- yaffs_VerifyObjectHeader(object,oh,&tags,1);
-+ yaffs_VerifyObjectHeader(object, oh, &tags, 1);
- }
-
- newChunk =
-@@ -3055,7 +3119,7 @@ static int yaffs_GarbageCollectBlock(yaf
-
- if (tags.chunkId == 0) {
- /* It's a header */
-- object->chunkId = newChunk;
-+ object->hdrChunk = newChunk;
- object->serial = tags.serialNumber;
- } else {
- /* It's a data chunk */
-@@ -3067,7 +3131,8 @@ static int yaffs_GarbageCollectBlock(yaf
- }
- }
-
-- yaffs_DeleteChunk(dev, oldChunk, markNAND, __LINE__);
-+ if (retVal == YAFFS_OK)
-+ yaffs_DeleteChunk(dev, oldChunk, markNAND, __LINE__);
-
- }
- }
-@@ -3098,18 +3163,25 @@ static int yaffs_GarbageCollectBlock(yaf
-
- }
-
-- yaffs_VerifyCollectedBlock(dev,bi,block);
-+ yaffs_VerifyCollectedBlock(dev, bi, block);
-
-- if (chunksBefore >= (chunksAfter = yaffs_GetErasedChunks(dev))) {
-+ chunksAfter = yaffs_GetErasedChunks(dev);
-+ if (chunksBefore >= chunksAfter) {
- T(YAFFS_TRACE_GC,
- (TSTR
- ("gc did not increase free chunks before %d after %d"
- TENDSTR), chunksBefore, chunksAfter));
- }
-
-+ /* If the gc completed then clear the current gcBlock so that we find another. */
-+ if (bi->blockState != YAFFS_BLOCK_STATE_COLLECTING) {
-+ dev->gcBlock = -1;
-+ dev->gcChunk = 0;
-+ }
-+
- dev->isDoingGC = 0;
-
-- return YAFFS_OK;
-+ return retVal;
- }
-
- /* New garbage collector
-@@ -3121,7 +3193,7 @@ static int yaffs_GarbageCollectBlock(yaf
- * The idea is to help clear out space in a more spread-out manner.
- * Dunno if it really does anything useful.
- */
--static int yaffs_CheckGarbageCollection(yaffs_Device * dev)
-+static int yaffs_CheckGarbageCollection(yaffs_Device *dev)
- {
- int block;
- int aggressive;
-@@ -3142,8 +3214,8 @@ static int yaffs_CheckGarbageCollection(
- do {
- maxTries++;
-
-- checkpointBlockAdjust = (dev->nCheckpointReservedBlocks - dev->blocksInCheckpoint);
-- if(checkpointBlockAdjust < 0)
-+ checkpointBlockAdjust = yaffs_CalcCheckpointBlocksRequired(dev) - dev->blocksInCheckpoint;
-+ if (checkpointBlockAdjust < 0)
- checkpointBlockAdjust = 0;
-
- if (dev->nErasedBlocks < (dev->nReservedBlocks + checkpointBlockAdjust + 2)) {
-@@ -3154,20 +3226,24 @@ static int yaffs_CheckGarbageCollection(
- aggressive = 0;
- }
-
-- block = yaffs_FindBlockForGarbageCollection(dev, aggressive);
-+ if (dev->gcBlock <= 0) {
-+ dev->gcBlock = yaffs_FindBlockForGarbageCollection(dev, aggressive);
-+ dev->gcChunk = 0;
-+ }
-+
-+ block = dev->gcBlock;
-
- if (block > 0) {
- dev->garbageCollections++;
-- if (!aggressive) {
-+ if (!aggressive)
- dev->passiveGarbageCollections++;
-- }
-
- T(YAFFS_TRACE_GC,
- (TSTR
- ("yaffs: GC erasedBlocks %d aggressive %d" TENDSTR),
- dev->nErasedBlocks, aggressive));
-
-- gcOk = yaffs_GarbageCollectBlock(dev, block);
-+ gcOk = yaffs_GarbageCollectBlock(dev, block, aggressive);
- }
-
- if (dev->nErasedBlocks < (dev->nReservedBlocks) && block > 0) {
-@@ -3176,15 +3252,16 @@ static int yaffs_CheckGarbageCollection(
- ("yaffs: GC !!!no reclaim!!! erasedBlocks %d after try %d block %d"
- TENDSTR), dev->nErasedBlocks, maxTries, block));
- }
-- } while ((dev->nErasedBlocks < dev->nReservedBlocks) && (block > 0)
-- && (maxTries < 2));
-+ } while ((dev->nErasedBlocks < dev->nReservedBlocks) &&
-+ (block > 0) &&
-+ (maxTries < 2));
-
- return aggressive ? gcOk : YAFFS_OK;
- }
-
- /*------------------------- TAGS --------------------------------*/
-
--static int yaffs_TagsMatch(const yaffs_ExtendedTags * tags, int objectId,
-+static int yaffs_TagsMatch(const yaffs_ExtendedTags *tags, int objectId,
- int chunkInObject)
- {
- return (tags->chunkId == chunkInObject &&
-@@ -3195,8 +3272,8 @@ static int yaffs_TagsMatch(const yaffs_E
-
- /*-------------------- Data file manipulation -----------------*/
-
--static int yaffs_FindChunkInFile(yaffs_Object * in, int chunkInInode,
-- yaffs_ExtendedTags * tags)
-+static int yaffs_FindChunkInFile(yaffs_Object *in, int chunkInInode,
-+ yaffs_ExtendedTags *tags)
- {
- /*Get the Tnode, then get the level 0 offset chunk offset */
- yaffs_Tnode *tn;
-@@ -3214,7 +3291,7 @@ static int yaffs_FindChunkInFile(yaffs_O
- tn = yaffs_FindLevel0Tnode(dev, &in->variant.fileVariant, chunkInInode);
-
- if (tn) {
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,chunkInInode);
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode);
-
- retVal =
- yaffs_FindChunkInGroup(dev, theChunk, tags, in->objectId,
-@@ -3223,8 +3300,8 @@ static int yaffs_FindChunkInFile(yaffs_O
- return retVal;
- }
-
--static int yaffs_FindAndDeleteChunkInFile(yaffs_Object * in, int chunkInInode,
-- yaffs_ExtendedTags * tags)
-+static int yaffs_FindAndDeleteChunkInFile(yaffs_Object *in, int chunkInInode,
-+ yaffs_ExtendedTags *tags)
- {
- /* Get the Tnode, then get the level 0 offset chunk offset */
- yaffs_Tnode *tn;
-@@ -3243,29 +3320,23 @@ static int yaffs_FindAndDeleteChunkInFil
-
- if (tn) {
-
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,chunkInInode);
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode);
-
- retVal =
- yaffs_FindChunkInGroup(dev, theChunk, tags, in->objectId,
- chunkInInode);
-
- /* Delete the entry in the filestructure (if found) */
-- if (retVal != -1) {
-- yaffs_PutLevel0Tnode(dev,tn,chunkInInode,0);
-- }
-- } else {
-- /*T(("No level 0 found for %d\n", chunkInInode)); */
-+ if (retVal != -1)
-+ yaffs_PutLevel0Tnode(dev, tn, chunkInInode, 0);
- }
-
-- if (retVal == -1) {
-- /* T(("Could not find %d to delete\n",chunkInInode)); */
-- }
- return retVal;
- }
-
- #ifdef YAFFS_PARANOID
-
--static int yaffs_CheckFileSanity(yaffs_Object * in)
-+static int yaffs_CheckFileSanity(yaffs_Object *in)
- {
- int chunk;
- int nChunks;
-@@ -3278,10 +3349,8 @@ static int yaffs_CheckFileSanity(yaffs_O
- int theChunk;
- int chunkDeleted;
-
-- if (in->variantType != YAFFS_OBJECT_TYPE_FILE) {
-- /* T(("Object not a file\n")); */
-+ if (in->variantType != YAFFS_OBJECT_TYPE_FILE)
- return YAFFS_FAIL;
-- }
-
- objId = in->objectId;
- fSize = in->variant.fileVariant.fileSize;
-@@ -3294,7 +3363,7 @@ static int yaffs_CheckFileSanity(yaffs_O
-
- if (tn) {
-
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,chunk);
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunk);
-
- if (yaffs_CheckChunkBits
- (dev, theChunk / dev->nChunksPerBlock,
-@@ -3323,7 +3392,7 @@ static int yaffs_CheckFileSanity(yaffs_O
-
- #endif
-
--static int yaffs_PutChunkIntoFile(yaffs_Object * in, int chunkInInode,
-+static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode,
- int chunkInNAND, int inScan)
- {
- /* NB inScan is zero unless scanning.
-@@ -3358,11 +3427,10 @@ static int yaffs_PutChunkIntoFile(yaffs_
- &in->variant.fileVariant,
- chunkInInode,
- NULL);
-- if (!tn) {
-+ if (!tn)
- return YAFFS_FAIL;
-- }
-
-- existingChunk = yaffs_GetChunkGroupBase(dev,tn,chunkInInode);
-+ existingChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode);
-
- if (inScan != 0) {
- /* If we're scanning then we need to test for duplicates
-@@ -3374,7 +3442,7 @@ static int yaffs_PutChunkIntoFile(yaffs_
- * Update: For backward scanning we don't need to re-read tags so this is quite cheap.
- */
-
-- if (existingChunk != 0) {
-+ if (existingChunk > 0) {
- /* NB Right now existing chunk will not be real chunkId if the device >= 32MB
- * thus we have to do a FindChunkInFile to get the real chunk id.
- *
-@@ -3411,8 +3479,10 @@ static int yaffs_PutChunkIntoFile(yaffs_
- * not be loaded during a scan
- */
-
-- newSerial = newTags.serialNumber;
-- existingSerial = existingTags.serialNumber;
-+ if (inScan > 0) {
-+ newSerial = newTags.serialNumber;
-+ existingSerial = existingTags.serialNumber;
-+ }
-
- if ((inScan > 0) &&
- (in->myDev->isYaffs2 ||
-@@ -3437,24 +3507,23 @@ static int yaffs_PutChunkIntoFile(yaffs_
-
- }
-
-- if (existingChunk == 0) {
-+ if (existingChunk == 0)
- in->nDataChunks++;
-- }
-
-- yaffs_PutLevel0Tnode(dev,tn,chunkInInode,chunkInNAND);
-+ yaffs_PutLevel0Tnode(dev, tn, chunkInInode, chunkInNAND);
-
- return YAFFS_OK;
- }
-
--static int yaffs_ReadChunkDataFromObject(yaffs_Object * in, int chunkInInode,
-- __u8 * buffer)
-+static int yaffs_ReadChunkDataFromObject(yaffs_Object *in, int chunkInInode,
-+ __u8 *buffer)
- {
- int chunkInNAND = yaffs_FindChunkInFile(in, chunkInInode, NULL);
-
-- if (chunkInNAND >= 0) {
-+ if (chunkInNAND >= 0)
- return yaffs_ReadChunkWithTagsFromNAND(in->myDev, chunkInNAND,
-- buffer,NULL);
-- } else {
-+ buffer, NULL);
-+ else {
- T(YAFFS_TRACE_NANDACCESS,
- (TSTR("Chunk %d not found zero instead" TENDSTR),
- chunkInNAND));
-@@ -3465,7 +3534,7 @@ static int yaffs_ReadChunkDataFromObject
-
- }
-
--void yaffs_DeleteChunk(yaffs_Device * dev, int chunkId, int markNAND, int lyn)
-+void yaffs_DeleteChunk(yaffs_Device *dev, int chunkId, int markNAND, int lyn)
- {
- int block;
- int page;
-@@ -3475,16 +3544,15 @@ void yaffs_DeleteChunk(yaffs_Device * de
- if (chunkId <= 0)
- return;
-
--
- dev->nDeletions++;
- block = chunkId / dev->nChunksPerBlock;
- page = chunkId % dev->nChunksPerBlock;
-
-
-- if(!yaffs_CheckChunkBit(dev,block,page))
-+ if (!yaffs_CheckChunkBit(dev, block, page))
- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Deleting invalid chunk %d"TENDSTR),
-- chunkId));
-+ (TSTR("Deleting invalid chunk %d"TENDSTR),
-+ chunkId));
-
- bi = yaffs_GetBlockInfo(dev, block);
-
-@@ -3524,14 +3592,12 @@ void yaffs_DeleteChunk(yaffs_Device * de
- yaffs_BlockBecameDirty(dev, block);
- }
-
-- } else {
-- /* T(("Bad news deleting chunk %d\n",chunkId)); */
- }
-
- }
-
--static int yaffs_WriteChunkDataToObject(yaffs_Object * in, int chunkInInode,
-- const __u8 * buffer, int nBytes,
-+static int yaffs_WriteChunkDataToObject(yaffs_Object *in, int chunkInInode,
-+ const __u8 *buffer, int nBytes,
- int useReserve)
- {
- /* Find old chunk Need to do this to get serial number
-@@ -3561,6 +3627,12 @@ static int yaffs_WriteChunkDataToObject(
- (prevChunkId >= 0) ? prevTags.serialNumber + 1 : 1;
- newTags.byteCount = nBytes;
-
-+ if (nBytes < 1 || nBytes > dev->totalBytesPerChunk) {
-+ T(YAFFS_TRACE_ERROR,
-+ (TSTR("Writing %d bytes to chunk!!!!!!!!!" TENDSTR), nBytes));
-+ YBUG();
-+ }
-+
- newChunkId =
- yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags,
- useReserve);
-@@ -3568,11 +3640,9 @@ static int yaffs_WriteChunkDataToObject(
- if (newChunkId >= 0) {
- yaffs_PutChunkIntoFile(in, chunkInInode, newChunkId, 0);
-
-- if (prevChunkId >= 0) {
-+ if (prevChunkId >= 0)
- yaffs_DeleteChunk(dev, prevChunkId, 1, __LINE__);
-
-- }
--
- yaffs_CheckFileSanity(in);
- }
- return newChunkId;
-@@ -3582,7 +3652,7 @@ static int yaffs_WriteChunkDataToObject(
- /* UpdateObjectHeader updates the header on NAND for an object.
- * If name is not NULL, then that new name is used.
- */
--int yaffs_UpdateObjectHeader(yaffs_Object * in, const YCHAR * name, int force,
-+int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name, int force,
- int isShrink, int shadows)
- {
-
-@@ -3603,9 +3673,12 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
-
- yaffs_ObjectHeader *oh = NULL;
-
-- yaffs_strcpy(oldName,"silly old name");
-+ yaffs_strcpy(oldName, _Y("silly old name"));
-
-- if (!in->fake || force) {
-+
-+ if (!in->fake ||
-+ in == dev->rootDir || /* The rootDir should also be saved */
-+ force) {
-
- yaffs_CheckGarbageCollection(dev);
- yaffs_CheckObjectDetailsLoaded(in);
-@@ -3613,13 +3686,13 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
- buffer = yaffs_GetTempBuffer(in->myDev, __LINE__);
- oh = (yaffs_ObjectHeader *) buffer;
-
-- prevChunkId = in->chunkId;
-+ prevChunkId = in->hdrChunk;
-
-- if (prevChunkId >= 0) {
-+ if (prevChunkId > 0) {
- result = yaffs_ReadChunkWithTagsFromNAND(dev, prevChunkId,
- buffer, &oldTags);
-
-- yaffs_VerifyObjectHeader(in,oh,&oldTags,0);
-+ yaffs_VerifyObjectHeader(in, oh, &oldTags, 0);
-
- memcpy(oldName, oh->name, sizeof(oh->name));
- }
-@@ -3628,7 +3701,7 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
-
- oh->type = in->variantType;
- oh->yst_mode = in->yst_mode;
-- oh->shadowsObject = shadows;
-+ oh->shadowsObject = oh->inbandShadowsObject = shadows;
-
- #ifdef CONFIG_YAFFS_WINCE
- oh->win_atime[0] = in->win_atime[0];
-@@ -3645,20 +3718,18 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
- oh->yst_ctime = in->yst_ctime;
- oh->yst_rdev = in->yst_rdev;
- #endif
-- if (in->parent) {
-+ if (in->parent)
- oh->parentObjectId = in->parent->objectId;
-- } else {
-+ else
- oh->parentObjectId = 0;
-- }
-
- if (name && *name) {
- memset(oh->name, 0, sizeof(oh->name));
- yaffs_strncpy(oh->name, name, YAFFS_MAX_NAME_LENGTH);
-- } else if (prevChunkId>=0) {
-+ } else if (prevChunkId >= 0)
- memcpy(oh->name, oldName, sizeof(oh->name));
-- } else {
-+ else
- memset(oh->name, 0, sizeof(oh->name));
-- }
-
- oh->isShrink = isShrink;
-
-@@ -3708,7 +3779,7 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
- newTags.extraShadows = (oh->shadowsObject > 0) ? 1 : 0;
- newTags.extraObjectType = in->variantType;
-
-- yaffs_VerifyObjectHeader(in,oh,&newTags,1);
-+ yaffs_VerifyObjectHeader(in, oh, &newTags, 1);
-
- /* Create new chunk in NAND */
- newChunkId =
-@@ -3717,20 +3788,20 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
-
- if (newChunkId >= 0) {
-
-- in->chunkId = newChunkId;
-+ in->hdrChunk = newChunkId;
-
- if (prevChunkId >= 0) {
- yaffs_DeleteChunk(dev, prevChunkId, 1,
- __LINE__);
- }
-
-- if(!yaffs_ObjectHasCachedWriteData(in))
-+ if (!yaffs_ObjectHasCachedWriteData(in))
- in->dirty = 0;
-
- /* If this was a shrink, then mark the block that the chunk lives on */
- if (isShrink) {
- bi = yaffs_GetBlockInfo(in->myDev,
-- newChunkId /in->myDev-> nChunksPerBlock);
-+ newChunkId / in->myDev->nChunksPerBlock);
- bi->hasShrinkHeader = 1;
- }
-
-@@ -3766,7 +3837,7 @@ static int yaffs_ObjectHasCachedWriteDat
- yaffs_ChunkCache *cache;
- int nCaches = obj->myDev->nShortOpCaches;
-
-- for(i = 0; i < nCaches; i++){
-+ for (i = 0; i < nCaches; i++) {
- cache = &dev->srCache[i];
- if (cache->object == obj &&
- cache->dirty)
-@@ -3777,7 +3848,7 @@ static int yaffs_ObjectHasCachedWriteDat
- }
-
-
--static void yaffs_FlushFilesChunkCache(yaffs_Object * obj)
-+static void yaffs_FlushFilesChunkCache(yaffs_Object *obj)
- {
- yaffs_Device *dev = obj->myDev;
- int lowest = -99; /* Stop compiler whining. */
-@@ -3844,16 +3915,16 @@ void yaffs_FlushEntireDeviceCache(yaffs_
- */
- do {
- obj = NULL;
-- for( i = 0; i < nCaches && !obj; i++) {
-+ for (i = 0; i < nCaches && !obj; i++) {
- if (dev->srCache[i].object &&
- dev->srCache[i].dirty)
- obj = dev->srCache[i].object;
-
- }
-- if(obj)
-+ if (obj)
- yaffs_FlushFilesChunkCache(obj);
-
-- } while(obj);
-+ } while (obj);
-
- }
-
-@@ -3863,41 +3934,21 @@ void yaffs_FlushEntireDeviceCache(yaffs_
- * Then look for the least recently used non-dirty one.
- * Then look for the least recently used dirty one...., flush and look again.
- */
--static yaffs_ChunkCache *yaffs_GrabChunkCacheWorker(yaffs_Device * dev)
-+static yaffs_ChunkCache *yaffs_GrabChunkCacheWorker(yaffs_Device *dev)
- {
- int i;
-- int usage;
-- int theOne;
-
- if (dev->nShortOpCaches > 0) {
- for (i = 0; i < dev->nShortOpCaches; i++) {
- if (!dev->srCache[i].object)
- return &dev->srCache[i];
- }
-+ }
-
-- return NULL;
-+ return NULL;
-+}
-
-- theOne = -1;
-- usage = 0; /* just to stop the compiler grizzling */
--
-- for (i = 0; i < dev->nShortOpCaches; i++) {
-- if (!dev->srCache[i].dirty &&
-- ((dev->srCache[i].lastUse < usage && theOne >= 0) ||
-- theOne < 0)) {
-- usage = dev->srCache[i].lastUse;
-- theOne = i;
-- }
-- }
--
--
-- return theOne >= 0 ? &dev->srCache[theOne] : NULL;
-- } else {
-- return NULL;
-- }
--
--}
--
--static yaffs_ChunkCache *yaffs_GrabChunkCache(yaffs_Device * dev)
-+static yaffs_ChunkCache *yaffs_GrabChunkCache(yaffs_Device *dev)
- {
- yaffs_ChunkCache *cache;
- yaffs_Object *theObj;
-@@ -3927,8 +3978,7 @@ static yaffs_ChunkCache *yaffs_GrabChunk
- for (i = 0; i < dev->nShortOpCaches; i++) {
- if (dev->srCache[i].object &&
- !dev->srCache[i].locked &&
-- (dev->srCache[i].lastUse < usage || !cache))
-- {
-+ (dev->srCache[i].lastUse < usage || !cache)) {
- usage = dev->srCache[i].lastUse;
- theObj = dev->srCache[i].object;
- cache = &dev->srCache[i];
-@@ -3950,7 +4000,7 @@ static yaffs_ChunkCache *yaffs_GrabChunk
- }
-
- /* Find a cached chunk */
--static yaffs_ChunkCache *yaffs_FindChunkCache(const yaffs_Object * obj,
-+static yaffs_ChunkCache *yaffs_FindChunkCache(const yaffs_Object *obj,
- int chunkId)
- {
- yaffs_Device *dev = obj->myDev;
-@@ -3969,7 +4019,7 @@ static yaffs_ChunkCache *yaffs_FindChunk
- }
-
- /* Mark the chunk for the least recently used algorithym */
--static void yaffs_UseChunkCache(yaffs_Device * dev, yaffs_ChunkCache * cache,
-+static void yaffs_UseChunkCache(yaffs_Device *dev, yaffs_ChunkCache *cache,
- int isAWrite)
- {
-
-@@ -3977,9 +4027,9 @@ static void yaffs_UseChunkCache(yaffs_De
- if (dev->srLastUse < 0 || dev->srLastUse > 100000000) {
- /* Reset the cache usages */
- int i;
-- for (i = 1; i < dev->nShortOpCaches; i++) {
-+ for (i = 1; i < dev->nShortOpCaches; i++)
- dev->srCache[i].lastUse = 0;
-- }
-+
- dev->srLastUse = 0;
- }
-
-@@ -3987,9 +4037,8 @@ static void yaffs_UseChunkCache(yaffs_De
-
- cache->lastUse = dev->srLastUse;
-
-- if (isAWrite) {
-+ if (isAWrite)
- cache->dirty = 1;
-- }
- }
- }
-
-@@ -3997,21 +4046,20 @@ static void yaffs_UseChunkCache(yaffs_De
- * Do this when a whole page gets written,
- * ie the short cache for this page is no longer valid.
- */
--static void yaffs_InvalidateChunkCache(yaffs_Object * object, int chunkId)
-+static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId)
- {
- if (object->myDev->nShortOpCaches > 0) {
- yaffs_ChunkCache *cache = yaffs_FindChunkCache(object, chunkId);
-
-- if (cache) {
-+ if (cache)
- cache->object = NULL;
-- }
- }
- }
-
- /* Invalidate all the cache pages associated with this object
- * Do this whenever ther file is deleted or resized.
- */
--static void yaffs_InvalidateWholeChunkCache(yaffs_Object * in)
-+static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in)
- {
- int i;
- yaffs_Device *dev = in->myDev;
-@@ -4019,9 +4067,8 @@ static void yaffs_InvalidateWholeChunkCa
- if (dev->nShortOpCaches > 0) {
- /* Invalidate it. */
- for (i = 0; i < dev->nShortOpCaches; i++) {
-- if (dev->srCache[i].object == in) {
-+ if (dev->srCache[i].object == in)
- dev->srCache[i].object = NULL;
-- }
- }
- }
- }
-@@ -4029,18 +4076,18 @@ static void yaffs_InvalidateWholeChunkCa
- /*--------------------- Checkpointing --------------------*/
-
-
--static int yaffs_WriteCheckpointValidityMarker(yaffs_Device *dev,int head)
-+static int yaffs_WriteCheckpointValidityMarker(yaffs_Device *dev, int head)
- {
- yaffs_CheckpointValidity cp;
-
-- memset(&cp,0,sizeof(cp));
-+ memset(&cp, 0, sizeof(cp));
-
- cp.structType = sizeof(cp);
- cp.magic = YAFFS_MAGIC;
- cp.version = YAFFS_CHECKPOINT_VERSION;
- cp.head = (head) ? 1 : 0;
-
-- return (yaffs_CheckpointWrite(dev,&cp,sizeof(cp)) == sizeof(cp))?
-+ return (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)) ?
- 1 : 0;
- }
-
-@@ -4049,9 +4096,9 @@ static int yaffs_ReadCheckpointValidityM
- yaffs_CheckpointValidity cp;
- int ok;
-
-- ok = (yaffs_CheckpointRead(dev,&cp,sizeof(cp)) == sizeof(cp));
-+ ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp));
-
-- if(ok)
-+ if (ok)
- ok = (cp.structType == sizeof(cp)) &&
- (cp.magic == YAFFS_MAGIC) &&
- (cp.version == YAFFS_CHECKPOINT_VERSION) &&
-@@ -4100,21 +4147,21 @@ static int yaffs_WriteCheckpointDevice(y
- int ok;
-
- /* Write device runtime values*/
-- yaffs_DeviceToCheckpointDevice(&cp,dev);
-+ yaffs_DeviceToCheckpointDevice(&cp, dev);
- cp.structType = sizeof(cp);
-
-- ok = (yaffs_CheckpointWrite(dev,&cp,sizeof(cp)) == sizeof(cp));
-+ ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp));
-
- /* Write block info */
-- if(ok) {
-+ if (ok) {
- nBytes = nBlocks * sizeof(yaffs_BlockInfo);
-- ok = (yaffs_CheckpointWrite(dev,dev->blockInfo,nBytes) == nBytes);
-+ ok = (yaffs_CheckpointWrite(dev, dev->blockInfo, nBytes) == nBytes);
- }
-
- /* Write chunk bits */
-- if(ok) {
-+ if (ok) {
- nBytes = nBlocks * dev->chunkBitmapStride;
-- ok = (yaffs_CheckpointWrite(dev,dev->chunkBits,nBytes) == nBytes);
-+ ok = (yaffs_CheckpointWrite(dev, dev->chunkBits, nBytes) == nBytes);
- }
- return ok ? 1 : 0;
-
-@@ -4128,25 +4175,25 @@ static int yaffs_ReadCheckpointDevice(ya
-
- int ok;
-
-- ok = (yaffs_CheckpointRead(dev,&cp,sizeof(cp)) == sizeof(cp));
-- if(!ok)
-+ ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp));
-+ if (!ok)
- return 0;
-
-- if(cp.structType != sizeof(cp))
-+ if (cp.structType != sizeof(cp))
- return 0;
-
-
-- yaffs_CheckpointDeviceToDevice(dev,&cp);
-+ yaffs_CheckpointDeviceToDevice(dev, &cp);
-
- nBytes = nBlocks * sizeof(yaffs_BlockInfo);
-
-- ok = (yaffs_CheckpointRead(dev,dev->blockInfo,nBytes) == nBytes);
-+ ok = (yaffs_CheckpointRead(dev, dev->blockInfo, nBytes) == nBytes);
-
-- if(!ok)
-+ if (!ok)
- return 0;
- nBytes = nBlocks * dev->chunkBitmapStride;
-
-- ok = (yaffs_CheckpointRead(dev,dev->chunkBits,nBytes) == nBytes);
-+ ok = (yaffs_CheckpointRead(dev, dev->chunkBits, nBytes) == nBytes);
-
- return ok ? 1 : 0;
- }
-@@ -4157,7 +4204,7 @@ static void yaffs_ObjectToCheckpointObje
-
- cp->objectId = obj->objectId;
- cp->parentId = (obj->parent) ? obj->parent->objectId : 0;
-- cp->chunkId = obj->chunkId;
-+ cp->hdrChunk = obj->hdrChunk;
- cp->variantType = obj->variantType;
- cp->deleted = obj->deleted;
- cp->softDeleted = obj->softDeleted;
-@@ -4168,20 +4215,28 @@ static void yaffs_ObjectToCheckpointObje
- cp->serial = obj->serial;
- cp->nDataChunks = obj->nDataChunks;
-
-- if(obj->variantType == YAFFS_OBJECT_TYPE_FILE)
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE)
- cp->fileSizeOrEquivalentObjectId = obj->variant.fileVariant.fileSize;
-- else if(obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK)
-+ else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK)
- cp->fileSizeOrEquivalentObjectId = obj->variant.hardLinkVariant.equivalentObjectId;
- }
-
--static void yaffs_CheckpointObjectToObject( yaffs_Object *obj,yaffs_CheckpointObject *cp)
-+static int yaffs_CheckpointObjectToObject(yaffs_Object *obj, yaffs_CheckpointObject *cp)
- {
-
- yaffs_Object *parent;
-
-+ if (obj->variantType != cp->variantType) {
-+ T(YAFFS_TRACE_ERROR, (TSTR("Checkpoint read object %d type %d "
-+ TCONT("chunk %d does not match existing object type %d")
-+ TENDSTR), cp->objectId, cp->variantType, cp->hdrChunk,
-+ obj->variantType));
-+ return 0;
-+ }
-+
- obj->objectId = cp->objectId;
-
-- if(cp->parentId)
-+ if (cp->parentId)
- parent = yaffs_FindOrCreateObjectByNumber(
- obj->myDev,
- cp->parentId,
-@@ -4189,10 +4244,19 @@ static void yaffs_CheckpointObjectToObje
- else
- parent = NULL;
-
-- if(parent)
-+ if (parent) {
-+ if (parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Checkpoint read object %d parent %d type %d"
-+ TCONT(" chunk %d Parent type, %d, not directory")
-+ TENDSTR),
-+ cp->objectId, cp->parentId, cp->variantType,
-+ cp->hdrChunk, parent->variantType));
-+ return 0;
-+ }
- yaffs_AddObjectToDirectory(parent, obj);
-+ }
-
-- obj->chunkId = cp->chunkId;
-+ obj->hdrChunk = cp->hdrChunk;
- obj->variantType = cp->variantType;
- obj->deleted = cp->deleted;
- obj->softDeleted = cp->softDeleted;
-@@ -4203,29 +4267,34 @@ static void yaffs_CheckpointObjectToObje
- obj->serial = cp->serial;
- obj->nDataChunks = cp->nDataChunks;
-
-- if(obj->variantType == YAFFS_OBJECT_TYPE_FILE)
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE)
- obj->variant.fileVariant.fileSize = cp->fileSizeOrEquivalentObjectId;
-- else if(obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK)
-+ else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK)
- obj->variant.hardLinkVariant.equivalentObjectId = cp->fileSizeOrEquivalentObjectId;
-
-- if(obj->objectId >= YAFFS_NOBJECT_BUCKETS)
-+ if (obj->hdrChunk > 0)
- obj->lazyLoaded = 1;
-+ return 1;
- }
-
-
-
--static int yaffs_CheckpointTnodeWorker(yaffs_Object * in, yaffs_Tnode * tn,
-- __u32 level, int chunkOffset)
-+static int yaffs_CheckpointTnodeWorker(yaffs_Object *in, yaffs_Tnode *tn,
-+ __u32 level, int chunkOffset)
- {
- int i;
- yaffs_Device *dev = in->myDev;
- int ok = 1;
-- int nTnodeBytes = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-+ int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-+
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-+
-
- if (tn) {
- if (level > 0) {
-
-- for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++){
-+ for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++) {
- if (tn->internal[i]) {
- ok = yaffs_CheckpointTnodeWorker(in,
- tn->internal[i],
-@@ -4235,10 +4304,9 @@ static int yaffs_CheckpointTnodeWorker(y
- }
- } else if (level == 0) {
- __u32 baseOffset = chunkOffset << YAFFS_TNODES_LEVEL0_BITS;
-- /* printf("write tnode at %d\n",baseOffset); */
-- ok = (yaffs_CheckpointWrite(dev,&baseOffset,sizeof(baseOffset)) == sizeof(baseOffset));
-- if(ok)
-- ok = (yaffs_CheckpointWrite(dev,tn,nTnodeBytes) == nTnodeBytes);
-+ ok = (yaffs_CheckpointWrite(dev, &baseOffset, sizeof(baseOffset)) == sizeof(baseOffset));
-+ if (ok)
-+ ok = (yaffs_CheckpointWrite(dev, tn, tnodeSize) == tnodeSize);
- }
- }
-
-@@ -4251,13 +4319,13 @@ static int yaffs_WriteCheckpointTnodes(y
- __u32 endMarker = ~0;
- int ok = 1;
-
-- if(obj->variantType == YAFFS_OBJECT_TYPE_FILE){
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) {
- ok = yaffs_CheckpointTnodeWorker(obj,
- obj->variant.fileVariant.top,
- obj->variant.fileVariant.topLevel,
- 0);
-- if(ok)
-- ok = (yaffs_CheckpointWrite(obj->myDev,&endMarker,sizeof(endMarker)) ==
-+ if (ok)
-+ ok = (yaffs_CheckpointWrite(obj->myDev, &endMarker, sizeof(endMarker)) ==
- sizeof(endMarker));
- }
-
-@@ -4272,38 +4340,38 @@ static int yaffs_ReadCheckpointTnodes(ya
- yaffs_FileStructure *fileStructPtr = &obj->variant.fileVariant;
- yaffs_Tnode *tn;
- int nread = 0;
-+ int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-
-- ok = (yaffs_CheckpointRead(dev,&baseChunk,sizeof(baseChunk)) == sizeof(baseChunk));
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-
-- while(ok && (~baseChunk)){
-+ ok = (yaffs_CheckpointRead(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk));
-+
-+ while (ok && (~baseChunk)) {
- nread++;
- /* Read level 0 tnode */
-
-
-- /* printf("read tnode at %d\n",baseChunk); */
- tn = yaffs_GetTnodeRaw(dev);
-- if(tn)
-- ok = (yaffs_CheckpointRead(dev,tn,(dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8) ==
-- (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8);
-+ if (tn)
-+ ok = (yaffs_CheckpointRead(dev, tn, tnodeSize) == tnodeSize);
- else
- ok = 0;
-
-- if(tn && ok){
-+ if (tn && ok)
- ok = yaffs_AddOrFindLevel0Tnode(dev,
-- fileStructPtr,
-- baseChunk,
-- tn) ? 1 : 0;
-+ fileStructPtr,
-+ baseChunk,
-+ tn) ? 1 : 0;
-
-- }
--
-- if(ok)
-- ok = (yaffs_CheckpointRead(dev,&baseChunk,sizeof(baseChunk)) == sizeof(baseChunk));
-+ if (ok)
-+ ok = (yaffs_CheckpointRead(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk));
-
- }
-
-- T(YAFFS_TRACE_CHECKPOINT,(
-+ T(YAFFS_TRACE_CHECKPOINT, (
- TSTR("Checkpoint read tnodes %d records, last %d. ok %d" TENDSTR),
-- nread,baseChunk,ok));
-+ nread, baseChunk, ok));
-
- return ok ? 1 : 0;
- }
-@@ -4315,41 +4383,40 @@ static int yaffs_WriteCheckpointObjects(
- yaffs_CheckpointObject cp;
- int i;
- int ok = 1;
-- struct list_head *lh;
-+ struct ylist_head *lh;
-
-
- /* Iterate through the objects in each hash entry,
- * dumping them to the checkpointing stream.
- */
-
-- for(i = 0; ok && i < YAFFS_NOBJECT_BUCKETS; i++){
-- list_for_each(lh, &dev->objectBucket[i].list) {
-+ for (i = 0; ok && i < YAFFS_NOBJECT_BUCKETS; i++) {
-+ ylist_for_each(lh, &dev->objectBucket[i].list) {
- if (lh) {
-- obj = list_entry(lh, yaffs_Object, hashLink);
-+ obj = ylist_entry(lh, yaffs_Object, hashLink);
- if (!obj->deferedFree) {
-- yaffs_ObjectToCheckpointObject(&cp,obj);
-+ yaffs_ObjectToCheckpointObject(&cp, obj);
- cp.structType = sizeof(cp);
-
-- T(YAFFS_TRACE_CHECKPOINT,(
-+ T(YAFFS_TRACE_CHECKPOINT, (
- TSTR("Checkpoint write object %d parent %d type %d chunk %d obj addr %x" TENDSTR),
-- cp.objectId,cp.parentId,cp.variantType,cp.chunkId,(unsigned) obj));
-+ cp.objectId, cp.parentId, cp.variantType, cp.hdrChunk, (unsigned) obj));
-
-- ok = (yaffs_CheckpointWrite(dev,&cp,sizeof(cp)) == sizeof(cp));
-+ ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp));
-
-- if(ok && obj->variantType == YAFFS_OBJECT_TYPE_FILE){
-+ if (ok && obj->variantType == YAFFS_OBJECT_TYPE_FILE)
- ok = yaffs_WriteCheckpointTnodes(obj);
-- }
- }
- }
- }
-- }
-+ }
-
-- /* Dump end of list */
-- memset(&cp,0xFF,sizeof(yaffs_CheckpointObject));
-+ /* Dump end of list */
-+ memset(&cp, 0xFF, sizeof(yaffs_CheckpointObject));
- cp.structType = sizeof(cp);
-
-- if(ok)
-- ok = (yaffs_CheckpointWrite(dev,&cp,sizeof(cp)) == sizeof(cp));
-+ if (ok)
-+ ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp));
-
- return ok ? 1 : 0;
- }
-@@ -4362,38 +4429,39 @@ static int yaffs_ReadCheckpointObjects(y
- int done = 0;
- yaffs_Object *hardList = NULL;
-
-- while(ok && !done) {
-- ok = (yaffs_CheckpointRead(dev,&cp,sizeof(cp)) == sizeof(cp));
-- if(cp.structType != sizeof(cp)) {
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("struct size %d instead of %d ok %d"TENDSTR),
-- cp.structType,sizeof(cp),ok));
-+ while (ok && !done) {
-+ ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp));
-+ if (cp.structType != sizeof(cp)) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("struct size %d instead of %d ok %d"TENDSTR),
-+ cp.structType, sizeof(cp), ok));
- ok = 0;
- }
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("Checkpoint read object %d parent %d type %d chunk %d " TENDSTR),
-- cp.objectId,cp.parentId,cp.variantType,cp.chunkId));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("Checkpoint read object %d parent %d type %d chunk %d " TENDSTR),
-+ cp.objectId, cp.parentId, cp.variantType, cp.hdrChunk));
-
-- if(ok && cp.objectId == ~0)
-+ if (ok && cp.objectId == ~0)
- done = 1;
-- else if(ok){
-- obj = yaffs_FindOrCreateObjectByNumber(dev,cp.objectId, cp.variantType);
-- if(obj) {
-- yaffs_CheckpointObjectToObject(obj,&cp);
-- if(obj->variantType == YAFFS_OBJECT_TYPE_FILE) {
-+ else if (ok) {
-+ obj = yaffs_FindOrCreateObjectByNumber(dev, cp.objectId, cp.variantType);
-+ if (obj) {
-+ ok = yaffs_CheckpointObjectToObject(obj, &cp);
-+ if (!ok)
-+ break;
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) {
- ok = yaffs_ReadCheckpointTnodes(obj);
-- } else if(obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) {
-+ } else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) {
- obj->hardLinks.next =
-- (struct list_head *)
-- hardList;
-+ (struct ylist_head *) hardList;
- hardList = obj;
- }
--
-- }
-+ } else
-+ ok = 0;
- }
- }
-
-- if(ok)
-- yaffs_HardlinkFixup(dev,hardList);
-+ if (ok)
-+ yaffs_HardlinkFixup(dev, hardList);
-
- return ok ? 1 : 0;
- }
-@@ -4403,11 +4471,11 @@ static int yaffs_WriteCheckpointSum(yaff
- __u32 checkpointSum;
- int ok;
-
-- yaffs_GetCheckpointSum(dev,&checkpointSum);
-+ yaffs_GetCheckpointSum(dev, &checkpointSum);
-
-- ok = (yaffs_CheckpointWrite(dev,&checkpointSum,sizeof(checkpointSum)) == sizeof(checkpointSum));
-+ ok = (yaffs_CheckpointWrite(dev, &checkpointSum, sizeof(checkpointSum)) == sizeof(checkpointSum));
-
-- if(!ok)
-+ if (!ok)
- return 0;
-
- return 1;
-@@ -4419,14 +4487,14 @@ static int yaffs_ReadCheckpointSum(yaffs
- __u32 checkpointSum1;
- int ok;
-
-- yaffs_GetCheckpointSum(dev,&checkpointSum0);
-+ yaffs_GetCheckpointSum(dev, &checkpointSum0);
-
-- ok = (yaffs_CheckpointRead(dev,&checkpointSum1,sizeof(checkpointSum1)) == sizeof(checkpointSum1));
-+ ok = (yaffs_CheckpointRead(dev, &checkpointSum1, sizeof(checkpointSum1)) == sizeof(checkpointSum1));
-
-- if(!ok)
-+ if (!ok)
- return 0;
-
-- if(checkpointSum0 != checkpointSum1)
-+ if (checkpointSum0 != checkpointSum1)
- return 0;
-
- return 1;
-@@ -4435,46 +4503,43 @@ static int yaffs_ReadCheckpointSum(yaffs
-
- static int yaffs_WriteCheckpointData(yaffs_Device *dev)
- {
--
- int ok = 1;
-
-- if(dev->skipCheckpointWrite || !dev->isYaffs2){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("skipping checkpoint write" TENDSTR)));
-+ if (dev->skipCheckpointWrite || !dev->isYaffs2) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("skipping checkpoint write" TENDSTR)));
- ok = 0;
- }
-
-- if(ok)
-- ok = yaffs_CheckpointOpen(dev,1);
-+ if (ok)
-+ ok = yaffs_CheckpointOpen(dev, 1);
-
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("write checkpoint validity" TENDSTR)));
-- ok = yaffs_WriteCheckpointValidityMarker(dev,1);
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint validity" TENDSTR)));
-+ ok = yaffs_WriteCheckpointValidityMarker(dev, 1);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("write checkpoint device" TENDSTR)));
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint device" TENDSTR)));
- ok = yaffs_WriteCheckpointDevice(dev);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("write checkpoint objects" TENDSTR)));
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint objects" TENDSTR)));
- ok = yaffs_WriteCheckpointObjects(dev);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("write checkpoint validity" TENDSTR)));
-- ok = yaffs_WriteCheckpointValidityMarker(dev,0);
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint validity" TENDSTR)));
-+ ok = yaffs_WriteCheckpointValidityMarker(dev, 0);
- }
-
-- if(ok){
-+ if (ok)
- ok = yaffs_WriteCheckpointSum(dev);
-- }
--
-
-- if(!yaffs_CheckpointClose(dev))
-- ok = 0;
-+ if (!yaffs_CheckpointClose(dev))
-+ ok = 0;
-
-- if(ok)
-- dev->isCheckpointed = 1;
-- else
-- dev->isCheckpointed = 0;
-+ if (ok)
-+ dev->isCheckpointed = 1;
-+ else
-+ dev->isCheckpointed = 0;
-
- return dev->isCheckpointed;
- }
-@@ -4483,43 +4548,43 @@ static int yaffs_ReadCheckpointData(yaff
- {
- int ok = 1;
-
-- if(dev->skipCheckpointRead || !dev->isYaffs2){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("skipping checkpoint read" TENDSTR)));
-+ if (dev->skipCheckpointRead || !dev->isYaffs2) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("skipping checkpoint read" TENDSTR)));
- ok = 0;
- }
-
-- if(ok)
-- ok = yaffs_CheckpointOpen(dev,0); /* open for read */
-+ if (ok)
-+ ok = yaffs_CheckpointOpen(dev, 0); /* open for read */
-
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint validity" TENDSTR)));
-- ok = yaffs_ReadCheckpointValidityMarker(dev,1);
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint validity" TENDSTR)));
-+ ok = yaffs_ReadCheckpointValidityMarker(dev, 1);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint device" TENDSTR)));
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint device" TENDSTR)));
- ok = yaffs_ReadCheckpointDevice(dev);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint objects" TENDSTR)));
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint objects" TENDSTR)));
- ok = yaffs_ReadCheckpointObjects(dev);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint validity" TENDSTR)));
-- ok = yaffs_ReadCheckpointValidityMarker(dev,0);
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint validity" TENDSTR)));
-+ ok = yaffs_ReadCheckpointValidityMarker(dev, 0);
- }
-
-- if(ok){
-+ if (ok) {
- ok = yaffs_ReadCheckpointSum(dev);
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint checksum %d" TENDSTR),ok));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint checksum %d" TENDSTR), ok));
- }
-
-- if(!yaffs_CheckpointClose(dev))
-+ if (!yaffs_CheckpointClose(dev))
- ok = 0;
-
-- if(ok)
-- dev->isCheckpointed = 1;
-- else
-- dev->isCheckpointed = 0;
-+ if (ok)
-+ dev->isCheckpointed = 1;
-+ else
-+ dev->isCheckpointed = 0;
-
- return ok ? 1 : 0;
-
-@@ -4527,11 +4592,11 @@ static int yaffs_ReadCheckpointData(yaff
-
- static void yaffs_InvalidateCheckpoint(yaffs_Device *dev)
- {
-- if(dev->isCheckpointed ||
-- dev->blocksInCheckpoint > 0){
-+ if (dev->isCheckpointed ||
-+ dev->blocksInCheckpoint > 0) {
- dev->isCheckpointed = 0;
- yaffs_CheckpointInvalidateStream(dev);
-- if(dev->superBlock && dev->markSuperBlockDirty)
-+ if (dev->superBlock && dev->markSuperBlockDirty)
- dev->markSuperBlockDirty(dev->superBlock);
- }
- }
-@@ -4540,18 +4605,18 @@ static void yaffs_InvalidateCheckpoint(y
- int yaffs_CheckpointSave(yaffs_Device *dev)
- {
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("save entry: isCheckpointed %d"TENDSTR),dev->isCheckpointed));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("save entry: isCheckpointed %d"TENDSTR), dev->isCheckpointed));
-
- yaffs_VerifyObjects(dev);
- yaffs_VerifyBlocks(dev);
- yaffs_VerifyFreeChunks(dev);
-
-- if(!dev->isCheckpointed) {
-+ if (!dev->isCheckpointed) {
- yaffs_InvalidateCheckpoint(dev);
- yaffs_WriteCheckpointData(dev);
- }
-
-- T(YAFFS_TRACE_ALWAYS,(TSTR("save exit: isCheckpointed %d"TENDSTR),dev->isCheckpointed));
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("save exit: isCheckpointed %d"TENDSTR), dev->isCheckpointed));
-
- return dev->isCheckpointed;
- }
-@@ -4559,17 +4624,17 @@ int yaffs_CheckpointSave(yaffs_Device *d
- int yaffs_CheckpointRestore(yaffs_Device *dev)
- {
- int retval;
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("restore entry: isCheckpointed %d"TENDSTR),dev->isCheckpointed));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore entry: isCheckpointed %d"TENDSTR), dev->isCheckpointed));
-
- retval = yaffs_ReadCheckpointData(dev);
-
-- if(dev->isCheckpointed){
-+ if (dev->isCheckpointed) {
- yaffs_VerifyObjects(dev);
- yaffs_VerifyBlocks(dev);
- yaffs_VerifyFreeChunks(dev);
- }
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("restore exit: isCheckpointed %d"TENDSTR),dev->isCheckpointed));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore exit: isCheckpointed %d"TENDSTR), dev->isCheckpointed));
-
- return retval;
- }
-@@ -4584,12 +4649,12 @@ int yaffs_CheckpointRestore(yaffs_Device
- * Curve-balls: the first chunk might also be the last chunk.
- */
-
--int yaffs_ReadDataFromFile(yaffs_Object * in, __u8 * buffer, loff_t offset,
-- int nBytes)
-+int yaffs_ReadDataFromFile(yaffs_Object *in, __u8 *buffer, loff_t offset,
-+ int nBytes)
- {
-
- int chunk;
-- int start;
-+ __u32 start;
- int nToCopy;
- int n = nBytes;
- int nDone = 0;
-@@ -4600,27 +4665,26 @@ int yaffs_ReadDataFromFile(yaffs_Object
- dev = in->myDev;
-
- while (n > 0) {
-- //chunk = offset / dev->nDataBytesPerChunk + 1;
-- //start = offset % dev->nDataBytesPerChunk;
-- yaffs_AddrToChunk(dev,offset,&chunk,&start);
-+ /* chunk = offset / dev->nDataBytesPerChunk + 1; */
-+ /* start = offset % dev->nDataBytesPerChunk; */
-+ yaffs_AddrToChunk(dev, offset, &chunk, &start);
- chunk++;
-
- /* OK now check for the curveball where the start and end are in
- * the same chunk.
- */
-- if ((start + n) < dev->nDataBytesPerChunk) {
-+ if ((start + n) < dev->nDataBytesPerChunk)
- nToCopy = n;
-- } else {
-+ else
- nToCopy = dev->nDataBytesPerChunk - start;
-- }
-
- cache = yaffs_FindChunkCache(in, chunk);
-
- /* If the chunk is already in the cache or it is less than a whole chunk
-- * then use the cache (if there is caching)
-+ * or we're using inband tags then use the cache (if there is caching)
- * else bypass the cache.
- */
-- if (cache || nToCopy != dev->nDataBytesPerChunk) {
-+ if (cache || nToCopy != dev->nDataBytesPerChunk || dev->inbandTags) {
- if (dev->nShortOpCaches > 0) {
-
- /* If we can't find the data in the cache, then load it up. */
-@@ -4641,14 +4705,9 @@ int yaffs_ReadDataFromFile(yaffs_Object
-
- cache->locked = 1;
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-+
- memcpy(buffer, &cache->data[start], nToCopy);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
- cache->locked = 0;
- } else {
- /* Read into the local buffer then copy..*/
-@@ -4657,41 +4716,19 @@ int yaffs_ReadDataFromFile(yaffs_Object
- yaffs_GetTempBuffer(dev, __LINE__);
- yaffs_ReadChunkDataFromObject(in, chunk,
- localBuffer);
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-+
- memcpy(buffer, &localBuffer[start], nToCopy);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
-+
- yaffs_ReleaseTempBuffer(dev, localBuffer,
- __LINE__);
- }
-
- } else {
--#ifdef CONFIG_YAFFS_WINCE
-- __u8 *localBuffer = yaffs_GetTempBuffer(dev, __LINE__);
--
-- /* Under WinCE can't do direct transfer. Need to use a local buffer.
-- * This is because we otherwise screw up WinCE's memory mapper
-- */
-- yaffs_ReadChunkDataFromObject(in, chunk, localBuffer);
--
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-- memcpy(buffer, localBuffer, dev->nDataBytesPerChunk);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
-- yaffs_ReleaseTempBuffer(dev, localBuffer, __LINE__);
--#endif
--
--#else
- /* A full chunk. Read directly into the supplied buffer. */
- yaffs_ReadChunkDataFromObject(in, chunk, buffer);
--#endif
-+
- }
-
- n -= nToCopy;
-@@ -4704,28 +4741,37 @@ int yaffs_ReadDataFromFile(yaffs_Object
- return nDone;
- }
-
--int yaffs_WriteDataToFile(yaffs_Object * in, const __u8 * buffer, loff_t offset,
-- int nBytes, int writeThrough)
-+int yaffs_WriteDataToFile(yaffs_Object *in, const __u8 *buffer, loff_t offset,
-+ int nBytes, int writeThrough)
- {
-
- int chunk;
-- int start;
-+ __u32 start;
- int nToCopy;
- int n = nBytes;
- int nDone = 0;
- int nToWriteBack;
- int startOfWrite = offset;
- int chunkWritten = 0;
-- int nBytesRead;
-+ __u32 nBytesRead;
-+ __u32 chunkStart;
-
- yaffs_Device *dev;
-
- dev = in->myDev;
-
- while (n > 0 && chunkWritten >= 0) {
-- //chunk = offset / dev->nDataBytesPerChunk + 1;
-- //start = offset % dev->nDataBytesPerChunk;
-- yaffs_AddrToChunk(dev,offset,&chunk,&start);
-+ /* chunk = offset / dev->nDataBytesPerChunk + 1; */
-+ /* start = offset % dev->nDataBytesPerChunk; */
-+ yaffs_AddrToChunk(dev, offset, &chunk, &start);
-+
-+ if (chunk * dev->nDataBytesPerChunk + start != offset ||
-+ start >= dev->nDataBytesPerChunk) {
-+ T(YAFFS_TRACE_ERROR, (
-+ TSTR("AddrToChunk of offset %d gives chunk %d start %d"
-+ TENDSTR),
-+ (int)offset, chunk, start));
-+ }
- chunk++;
-
- /* OK now check for the curveball where the start and end are in
-@@ -4740,25 +4786,32 @@ int yaffs_WriteDataToFile(yaffs_Object *
- * we need to write back as much as was there before.
- */
-
-- nBytesRead =
-- in->variant.fileVariant.fileSize -
-- ((chunk - 1) * dev->nDataBytesPerChunk);
-+ chunkStart = ((chunk - 1) * dev->nDataBytesPerChunk);
-+
-+ if (chunkStart > in->variant.fileVariant.fileSize)
-+ nBytesRead = 0; /* Past end of file */
-+ else
-+ nBytesRead = in->variant.fileVariant.fileSize - chunkStart;
-
-- if (nBytesRead > dev->nDataBytesPerChunk) {
-+ if (nBytesRead > dev->nDataBytesPerChunk)
- nBytesRead = dev->nDataBytesPerChunk;
-- }
-
- nToWriteBack =
- (nBytesRead >
- (start + n)) ? nBytesRead : (start + n);
-
-+ if (nToWriteBack < 0 || nToWriteBack > dev->nDataBytesPerChunk)
-+ YBUG();
-+
- } else {
- nToCopy = dev->nDataBytesPerChunk - start;
- nToWriteBack = dev->nDataBytesPerChunk;
- }
-
-- if (nToCopy != dev->nDataBytesPerChunk) {
-- /* An incomplete start or end chunk (or maybe both start and end chunk) */
-+ if (nToCopy != dev->nDataBytesPerChunk || dev->inbandTags) {
-+ /* An incomplete start or end chunk (or maybe both start and end chunk),
-+ * or we're using inband tags, so we want to use the cache buffers.
-+ */
- if (dev->nShortOpCaches > 0) {
- yaffs_ChunkCache *cache;
- /* If we can't find the data in the cache, then load the cache */
-@@ -4775,10 +4828,9 @@ int yaffs_WriteDataToFile(yaffs_Object *
- yaffs_ReadChunkDataFromObject(in, chunk,
- cache->
- data);
-- }
-- else if(cache &&
-- !cache->dirty &&
-- !yaffs_CheckSpaceForAllocation(in->myDev)){
-+ } else if (cache &&
-+ !cache->dirty &&
-+ !yaffs_CheckSpaceForAllocation(in->myDev)) {
- /* Drop the cache if it was a read cache item and
- * no space check has been made for it.
- */
-@@ -4788,16 +4840,12 @@ int yaffs_WriteDataToFile(yaffs_Object *
- if (cache) {
- yaffs_UseChunkCache(dev, cache, 1);
- cache->locked = 1;
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-+
-
- memcpy(&cache->data[start], buffer,
- nToCopy);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
-+
- cache->locked = 0;
- cache->nBytes = nToWriteBack;
-
-@@ -4825,15 +4873,10 @@ int yaffs_WriteDataToFile(yaffs_Object *
- yaffs_ReadChunkDataFromObject(in, chunk,
- localBuffer);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-+
-
- memcpy(&localBuffer[start], buffer, nToCopy);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
- chunkWritten =
- yaffs_WriteChunkDataToObject(in, chunk,
- localBuffer,
-@@ -4846,31 +4889,15 @@ int yaffs_WriteDataToFile(yaffs_Object *
- }
-
- } else {
--
--#ifdef CONFIG_YAFFS_WINCE
-- /* Under WinCE can't do direct transfer. Need to use a local buffer.
-- * This is because we otherwise screw up WinCE's memory mapper
-- */
-- __u8 *localBuffer = yaffs_GetTempBuffer(dev, __LINE__);
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-- memcpy(localBuffer, buffer, dev->nDataBytesPerChunk);
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
-- chunkWritten =
-- yaffs_WriteChunkDataToObject(in, chunk, localBuffer,
-- dev->nDataBytesPerChunk,
-- 0);
-- yaffs_ReleaseTempBuffer(dev, localBuffer, __LINE__);
--#else
- /* A full chunk. Write directly from the supplied buffer. */
-+
-+
-+
- chunkWritten =
- yaffs_WriteChunkDataToObject(in, chunk, buffer,
- dev->nDataBytesPerChunk,
- 0);
--#endif
-+
- /* Since we've overwritten the cached data, we better invalidate it. */
- yaffs_InvalidateChunkCache(in, chunk);
- }
-@@ -4886,9 +4913,8 @@ int yaffs_WriteDataToFile(yaffs_Object *
-
- /* Update file object */
-
-- if ((startOfWrite + nDone) > in->variant.fileVariant.fileSize) {
-+ if ((startOfWrite + nDone) > in->variant.fileVariant.fileSize)
- in->variant.fileVariant.fileSize = (startOfWrite + nDone);
-- }
-
- in->dirty = 1;
-
-@@ -4898,7 +4924,7 @@ int yaffs_WriteDataToFile(yaffs_Object *
-
- /* ---------------------- File resizing stuff ------------------ */
-
--static void yaffs_PruneResizedChunks(yaffs_Object * in, int newSize)
-+static void yaffs_PruneResizedChunks(yaffs_Object *in, int newSize)
- {
-
- yaffs_Device *dev = in->myDev;
-@@ -4939,11 +4965,11 @@ static void yaffs_PruneResizedChunks(yaf
-
- }
-
--int yaffs_ResizeFile(yaffs_Object * in, loff_t newSize)
-+int yaffs_ResizeFile(yaffs_Object *in, loff_t newSize)
- {
-
- int oldFileSize = in->variant.fileVariant.fileSize;
-- int newSizeOfPartialChunk;
-+ __u32 newSizeOfPartialChunk;
- int newFullChunks;
-
- yaffs_Device *dev = in->myDev;
-@@ -4955,13 +4981,11 @@ int yaffs_ResizeFile(yaffs_Object * in,
-
- yaffs_CheckGarbageCollection(dev);
-
-- if (in->variantType != YAFFS_OBJECT_TYPE_FILE) {
-- return yaffs_GetFileSize(in);
-- }
-+ if (in->variantType != YAFFS_OBJECT_TYPE_FILE)
-+ return YAFFS_FAIL;
-
-- if (newSize == oldFileSize) {
-- return oldFileSize;
-- }
-+ if (newSize == oldFileSize)
-+ return YAFFS_OK;
-
- if (newSize < oldFileSize) {
-
-@@ -4994,21 +5018,20 @@ int yaffs_ResizeFile(yaffs_Object * in,
- }
-
-
--
- /* Write a new object header.
- * show we've shrunk the file, if need be
- * Do this only if the file is not in the deleted directories.
- */
-- if (in->parent->objectId != YAFFS_OBJECTID_UNLINKED &&
-- in->parent->objectId != YAFFS_OBJECTID_DELETED) {
-+ if (in->parent &&
-+ in->parent->objectId != YAFFS_OBJECTID_UNLINKED &&
-+ in->parent->objectId != YAFFS_OBJECTID_DELETED)
- yaffs_UpdateObjectHeader(in, NULL, 0,
- (newSize < oldFileSize) ? 1 : 0, 0);
-- }
-
-- return newSize;
-+ return YAFFS_OK;
- }
-
--loff_t yaffs_GetFileSize(yaffs_Object * obj)
-+loff_t yaffs_GetFileSize(yaffs_Object *obj)
- {
- obj = yaffs_GetEquivalentObject(obj);
-
-@@ -5024,7 +5047,7 @@ loff_t yaffs_GetFileSize(yaffs_Object *
-
-
-
--int yaffs_FlushFile(yaffs_Object * in, int updateTime)
-+int yaffs_FlushFile(yaffs_Object *in, int updateTime)
- {
- int retVal;
- if (in->dirty) {
-@@ -5039,9 +5062,8 @@ int yaffs_FlushFile(yaffs_Object * in, i
- #endif
- }
-
-- retVal =
-- (yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0) >=
-- 0) ? YAFFS_OK : YAFFS_FAIL;
-+ retVal = (yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0) >=
-+ 0) ? YAFFS_OK : YAFFS_FAIL;
- } else {
- retVal = YAFFS_OK;
- }
-@@ -5050,7 +5072,7 @@ int yaffs_FlushFile(yaffs_Object * in, i
-
- }
-
--static int yaffs_DoGenericObjectDeletion(yaffs_Object * in)
-+static int yaffs_DoGenericObjectDeletion(yaffs_Object *in)
- {
-
- /* First off, invalidate the file's data in the cache, without flushing. */
-@@ -5058,13 +5080,13 @@ static int yaffs_DoGenericObjectDeletion
-
- if (in->myDev->isYaffs2 && (in->parent != in->myDev->deletedDir)) {
- /* Move to the unlinked directory so we have a record that it was deleted. */
-- yaffs_ChangeObjectName(in, in->myDev->deletedDir,"deleted", 0, 0);
-+ yaffs_ChangeObjectName(in, in->myDev->deletedDir, _Y("deleted"), 0, 0);
-
- }
-
- yaffs_RemoveObjectFromDirectory(in);
-- yaffs_DeleteChunk(in->myDev, in->chunkId, 1, __LINE__);
-- in->chunkId = -1;
-+ yaffs_DeleteChunk(in->myDev, in->hdrChunk, 1, __LINE__);
-+ in->hdrChunk = 0;
-
- yaffs_FreeObject(in);
- return YAFFS_OK;
-@@ -5075,62 +5097,63 @@ static int yaffs_DoGenericObjectDeletion
- * and the inode associated with the file.
- * It does not delete the links associated with the file.
- */
--static int yaffs_UnlinkFile(yaffs_Object * in)
-+static int yaffs_UnlinkFileIfNeeded(yaffs_Object *in)
- {
-
- int retVal;
- int immediateDeletion = 0;
-
-- if (1) {
- #ifdef __KERNEL__
-- if (!in->myInode) {
-- immediateDeletion = 1;
--
-- }
-+ if (!in->myInode)
-+ immediateDeletion = 1;
- #else
-- if (in->inUse <= 0) {
-- immediateDeletion = 1;
--
-- }
-+ if (in->inUse <= 0)
-+ immediateDeletion = 1;
- #endif
-- if (immediateDeletion) {
-- retVal =
-- yaffs_ChangeObjectName(in, in->myDev->deletedDir,
-- "deleted", 0, 0);
-- T(YAFFS_TRACE_TRACING,
-- (TSTR("yaffs: immediate deletion of file %d" TENDSTR),
-- in->objectId));
-- in->deleted = 1;
-- in->myDev->nDeletedFiles++;
-- if (0 && in->myDev->isYaffs2) {
-- yaffs_ResizeFile(in, 0);
-- }
-- yaffs_SoftDeleteFile(in);
-- } else {
-- retVal =
-- yaffs_ChangeObjectName(in, in->myDev->unlinkedDir,
-- "unlinked", 0, 0);
-- }
-
-+ if (immediateDeletion) {
-+ retVal =
-+ yaffs_ChangeObjectName(in, in->myDev->deletedDir,
-+ _Y("deleted"), 0, 0);
-+ T(YAFFS_TRACE_TRACING,
-+ (TSTR("yaffs: immediate deletion of file %d" TENDSTR),
-+ in->objectId));
-+ in->deleted = 1;
-+ in->myDev->nDeletedFiles++;
-+ if (1 || in->myDev->isYaffs2)
-+ yaffs_ResizeFile(in, 0);
-+ yaffs_SoftDeleteFile(in);
-+ } else {
-+ retVal =
-+ yaffs_ChangeObjectName(in, in->myDev->unlinkedDir,
-+ _Y("unlinked"), 0, 0);
- }
-+
-+
- return retVal;
- }
-
--int yaffs_DeleteFile(yaffs_Object * in)
-+int yaffs_DeleteFile(yaffs_Object *in)
- {
- int retVal = YAFFS_OK;
-+ int deleted = in->deleted;
-+
-+ yaffs_ResizeFile(in, 0);
-
- if (in->nDataChunks > 0) {
-- /* Use soft deletion if there is data in the file */
-- if (!in->unlinked) {
-- retVal = yaffs_UnlinkFile(in);
-- }
-+ /* Use soft deletion if there is data in the file.
-+ * That won't be the case if it has been resized to zero.
-+ */
-+ if (!in->unlinked)
-+ retVal = yaffs_UnlinkFileIfNeeded(in);
-+
- if (retVal == YAFFS_OK && in->unlinked && !in->deleted) {
- in->deleted = 1;
-+ deleted = 1;
- in->myDev->nDeletedFiles++;
- yaffs_SoftDeleteFile(in);
- }
-- return in->deleted ? YAFFS_OK : YAFFS_FAIL;
-+ return deleted ? YAFFS_OK : YAFFS_FAIL;
- } else {
- /* The file has no data chunks so we toss it immediately */
- yaffs_FreeTnode(in->myDev, in->variant.fileVariant.top);
-@@ -5141,62 +5164,75 @@ int yaffs_DeleteFile(yaffs_Object * in)
- }
- }
-
--static int yaffs_DeleteDirectory(yaffs_Object * in)
-+static int yaffs_DeleteDirectory(yaffs_Object *in)
- {
- /* First check that the directory is empty. */
-- if (list_empty(&in->variant.directoryVariant.children)) {
-+ if (ylist_empty(&in->variant.directoryVariant.children))
- return yaffs_DoGenericObjectDeletion(in);
-- }
-
- return YAFFS_FAIL;
-
- }
-
--static int yaffs_DeleteSymLink(yaffs_Object * in)
-+static int yaffs_DeleteSymLink(yaffs_Object *in)
- {
- YFREE(in->variant.symLinkVariant.alias);
-
- return yaffs_DoGenericObjectDeletion(in);
- }
-
--static int yaffs_DeleteHardLink(yaffs_Object * in)
-+static int yaffs_DeleteHardLink(yaffs_Object *in)
- {
- /* remove this hardlink from the list assocaited with the equivalent
- * object
- */
-- list_del(&in->hardLinks);
-+ ylist_del_init(&in->hardLinks);
- return yaffs_DoGenericObjectDeletion(in);
- }
-
--static void yaffs_DestroyObject(yaffs_Object * obj)
-+int yaffs_DeleteObject(yaffs_Object *obj)
- {
-+int retVal = -1;
- switch (obj->variantType) {
- case YAFFS_OBJECT_TYPE_FILE:
-- yaffs_DeleteFile(obj);
-+ retVal = yaffs_DeleteFile(obj);
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-- yaffs_DeleteDirectory(obj);
-+ return yaffs_DeleteDirectory(obj);
- break;
- case YAFFS_OBJECT_TYPE_SYMLINK:
-- yaffs_DeleteSymLink(obj);
-+ retVal = yaffs_DeleteSymLink(obj);
- break;
- case YAFFS_OBJECT_TYPE_HARDLINK:
-- yaffs_DeleteHardLink(obj);
-+ retVal = yaffs_DeleteHardLink(obj);
- break;
- case YAFFS_OBJECT_TYPE_SPECIAL:
-- yaffs_DoGenericObjectDeletion(obj);
-+ retVal = yaffs_DoGenericObjectDeletion(obj);
- break;
- case YAFFS_OBJECT_TYPE_UNKNOWN:
-+ retVal = 0;
- break; /* should not happen. */
- }
-+
-+ return retVal;
- }
-
--static int yaffs_UnlinkWorker(yaffs_Object * obj)
-+static int yaffs_UnlinkWorker(yaffs_Object *obj)
- {
-
-+ int immediateDeletion = 0;
-+
-+#ifdef __KERNEL__
-+ if (!obj->myInode)
-+ immediateDeletion = 1;
-+#else
-+ if (obj->inUse <= 0)
-+ immediateDeletion = 1;
-+#endif
-+
- if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) {
- return yaffs_DeleteHardLink(obj);
-- } else if (!list_empty(&obj->hardLinks)) {
-+ } else if (!ylist_empty(&obj->hardLinks)) {
- /* Curve ball: We're unlinking an object that has a hardlink.
- *
- * This problem arises because we are not strictly following
-@@ -5215,24 +5251,24 @@ static int yaffs_UnlinkWorker(yaffs_Obje
- int retVal;
- YCHAR name[YAFFS_MAX_NAME_LENGTH + 1];
-
-- hl = list_entry(obj->hardLinks.next, yaffs_Object, hardLinks);
-+ hl = ylist_entry(obj->hardLinks.next, yaffs_Object, hardLinks);
-
-- list_del_init(&hl->hardLinks);
-- list_del_init(&hl->siblings);
-+ ylist_del_init(&hl->hardLinks);
-+ ylist_del_init(&hl->siblings);
-
- yaffs_GetObjectName(hl, name, YAFFS_MAX_NAME_LENGTH + 1);
-
- retVal = yaffs_ChangeObjectName(obj, hl->parent, name, 0, 0);
-
-- if (retVal == YAFFS_OK) {
-+ if (retVal == YAFFS_OK)
- retVal = yaffs_DoGenericObjectDeletion(hl);
-- }
-+
- return retVal;
-
-- } else {
-+ } else if (immediateDeletion) {
- switch (obj->variantType) {
- case YAFFS_OBJECT_TYPE_FILE:
-- return yaffs_UnlinkFile(obj);
-+ return yaffs_DeleteFile(obj);
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
- return yaffs_DeleteDirectory(obj);
-@@ -5248,21 +5284,22 @@ static int yaffs_UnlinkWorker(yaffs_Obje
- default:
- return YAFFS_FAIL;
- }
-- }
-+ } else
-+ return yaffs_ChangeObjectName(obj, obj->myDev->unlinkedDir,
-+ _Y("unlinked"), 0, 0);
- }
-
-
--static int yaffs_UnlinkObject( yaffs_Object *obj)
-+static int yaffs_UnlinkObject(yaffs_Object *obj)
- {
-
-- if (obj && obj->unlinkAllowed) {
-+ if (obj && obj->unlinkAllowed)
- return yaffs_UnlinkWorker(obj);
-- }
-
- return YAFFS_FAIL;
-
- }
--int yaffs_Unlink(yaffs_Object * dir, const YCHAR * name)
-+int yaffs_Unlink(yaffs_Object *dir, const YCHAR *name)
- {
- yaffs_Object *obj;
-
-@@ -5272,8 +5309,8 @@ int yaffs_Unlink(yaffs_Object * dir, con
-
- /*----------------------- Initialisation Scanning ---------------------- */
-
--static void yaffs_HandleShadowedObject(yaffs_Device * dev, int objId,
-- int backwardScanning)
-+static void yaffs_HandleShadowedObject(yaffs_Device *dev, int objId,
-+ int backwardScanning)
- {
- yaffs_Object *obj;
-
-@@ -5286,9 +5323,8 @@ static void yaffs_HandleShadowedObject(y
- /* Handle YAFFS2 case (backward scanning)
- * If the shadowed object exists then ignore.
- */
-- if (yaffs_FindObjectByNumber(dev, objId)) {
-+ if (yaffs_FindObjectByNumber(dev, objId))
- return;
-- }
- }
-
- /* Let's create it (if it does not exist) assuming it is a file so that it can do shrinking etc.
-@@ -5297,6 +5333,8 @@ static void yaffs_HandleShadowedObject(y
- obj =
- yaffs_FindOrCreateObjectByNumber(dev, objId,
- YAFFS_OBJECT_TYPE_FILE);
-+ if (!obj)
-+ return;
- yaffs_AddObjectToDirectory(dev->unlinkedDir, obj);
- obj->variant.fileVariant.shrinkSize = 0;
- obj->valid = 1; /* So that we don't read any other info for this file */
-@@ -5325,44 +5363,77 @@ static void yaffs_HardlinkFixup(yaffs_De
- if (in) {
- /* Add the hardlink pointers */
- hl->variant.hardLinkVariant.equivalentObject = in;
-- list_add(&hl->hardLinks, &in->hardLinks);
-+ ylist_add(&hl->hardLinks, &in->hardLinks);
- } else {
- /* Todo Need to report/handle this better.
- * Got a problem... hardlink to a non-existant object
- */
- hl->variant.hardLinkVariant.equivalentObject = NULL;
-- INIT_LIST_HEAD(&hl->hardLinks);
-+ YINIT_LIST_HEAD(&hl->hardLinks);
-
- }
--
- }
-+}
-+
-+
-
-+
-+
-+static int ybicmp(const void *a, const void *b)
-+{
-+ register int aseq = ((yaffs_BlockIndex *)a)->seq;
-+ register int bseq = ((yaffs_BlockIndex *)b)->seq;
-+ register int ablock = ((yaffs_BlockIndex *)a)->block;
-+ register int bblock = ((yaffs_BlockIndex *)b)->block;
-+ if (aseq == bseq)
-+ return ablock - bblock;
-+ else
-+ return aseq - bseq;
- }
-
-
-+struct yaffs_ShadowFixerStruct {
-+ int objectId;
-+ int shadowedId;
-+ struct yaffs_ShadowFixerStruct *next;
-+};
-+
-
-+static void yaffs_StripDeletedObjects(yaffs_Device *dev)
-+{
-+ /*
-+ * Sort out state of unlinked and deleted objects after scanning.
-+ */
-+ struct ylist_head *i;
-+ struct ylist_head *n;
-+ yaffs_Object *l;
-
-+ /* Soft delete all the unlinked files */
-+ ylist_for_each_safe(i, n,
-+ &dev->unlinkedDir->variant.directoryVariant.children) {
-+ if (i) {
-+ l = ylist_entry(i, yaffs_Object, siblings);
-+ yaffs_DeleteObject(l);
-+ }
-+ }
-
--static int ybicmp(const void *a, const void *b){
-- register int aseq = ((yaffs_BlockIndex *)a)->seq;
-- register int bseq = ((yaffs_BlockIndex *)b)->seq;
-- register int ablock = ((yaffs_BlockIndex *)a)->block;
-- register int bblock = ((yaffs_BlockIndex *)b)->block;
-- if( aseq == bseq )
-- return ablock - bblock;
-- else
-- return aseq - bseq;
-+ ylist_for_each_safe(i, n,
-+ &dev->deletedDir->variant.directoryVariant.children) {
-+ if (i) {
-+ l = ylist_entry(i, yaffs_Object, siblings);
-+ yaffs_DeleteObject(l);
-+ }
-+ }
-
- }
-
--static int yaffs_Scan(yaffs_Device * dev)
-+static int yaffs_Scan(yaffs_Device *dev)
- {
- yaffs_ExtendedTags tags;
- int blk;
- int blockIterator;
- int startIterator;
- int endIterator;
-- int nBlocksToScan = 0;
- int result;
-
- int chunk;
-@@ -5371,26 +5442,19 @@ static int yaffs_Scan(yaffs_Device * dev
- yaffs_BlockState state;
- yaffs_Object *hardList = NULL;
- yaffs_BlockInfo *bi;
-- int sequenceNumber;
-+ __u32 sequenceNumber;
- yaffs_ObjectHeader *oh;
- yaffs_Object *in;
- yaffs_Object *parent;
-- int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1;
-
- int alloc_failed = 0;
-
-+ struct yaffs_ShadowFixerStruct *shadowFixerList = NULL;
-+
-
- __u8 *chunkData;
-
-- yaffs_BlockIndex *blockIndex = NULL;
-
-- if (dev->isYaffs2) {
-- T(YAFFS_TRACE_SCAN,
-- (TSTR("yaffs_Scan is not for YAFFS2!" TENDSTR)));
-- return YAFFS_FAIL;
-- }
--
-- //TODO Throw all the yaffs2 stuuf out of yaffs_Scan since it is only for yaffs1 format.
-
- T(YAFFS_TRACE_SCAN,
- (TSTR("yaffs_Scan starts intstartblk %d intendblk %d..." TENDSTR),
-@@ -5400,12 +5464,6 @@ static int yaffs_Scan(yaffs_Device * dev
-
- dev->sequenceNumber = YAFFS_LOWEST_SEQUENCE_NUMBER;
-
-- if (dev->isYaffs2) {
-- blockIndex = YMALLOC(nBlocks * sizeof(yaffs_BlockIndex));
-- if(!blockIndex)
-- return YAFFS_FAIL;
-- }
--
- /* Scan all the blocks to determine their state */
- for (blk = dev->internalStartBlock; blk <= dev->internalEndBlock; blk++) {
- bi = yaffs_GetBlockInfo(dev, blk);
-@@ -5418,6 +5476,9 @@ static int yaffs_Scan(yaffs_Device * dev
- bi->blockState = state;
- bi->sequenceNumber = sequenceNumber;
-
-+ if (bi->sequenceNumber == YAFFS_SEQUENCE_BAD_BLOCK)
-+ bi->blockState = state = YAFFS_BLOCK_STATE_DEAD;
-+
- T(YAFFS_TRACE_SCAN_DEBUG,
- (TSTR("Block scanning block %d state %d seq %d" TENDSTR), blk,
- state, sequenceNumber));
-@@ -5430,70 +5491,21 @@ static int yaffs_Scan(yaffs_Device * dev
- (TSTR("Block empty " TENDSTR)));
- dev->nErasedBlocks++;
- dev->nFreeChunks += dev->nChunksPerBlock;
-- } else if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING) {
--
-- /* Determine the highest sequence number */
-- if (dev->isYaffs2 &&
-- sequenceNumber >= YAFFS_LOWEST_SEQUENCE_NUMBER &&
-- sequenceNumber < YAFFS_HIGHEST_SEQUENCE_NUMBER) {
--
-- blockIndex[nBlocksToScan].seq = sequenceNumber;
-- blockIndex[nBlocksToScan].block = blk;
--
-- nBlocksToScan++;
--
-- if (sequenceNumber >= dev->sequenceNumber) {
-- dev->sequenceNumber = sequenceNumber;
-- }
-- } else if (dev->isYaffs2) {
-- /* TODO: Nasty sequence number! */
-- T(YAFFS_TRACE_SCAN,
-- (TSTR
-- ("Block scanning block %d has bad sequence number %d"
-- TENDSTR), blk, sequenceNumber));
--
-- }
- }
- }
-
-- /* Sort the blocks
-- * Dungy old bubble sort for now...
-- */
-- if (dev->isYaffs2) {
-- yaffs_BlockIndex temp;
-- int i;
-- int j;
--
-- for (i = 0; i < nBlocksToScan; i++)
-- for (j = i + 1; j < nBlocksToScan; j++)
-- if (blockIndex[i].seq > blockIndex[j].seq) {
-- temp = blockIndex[j];
-- blockIndex[j] = blockIndex[i];
-- blockIndex[i] = temp;
-- }
-- }
--
-- /* Now scan the blocks looking at the data. */
-- if (dev->isYaffs2) {
-- startIterator = 0;
-- endIterator = nBlocksToScan - 1;
-- T(YAFFS_TRACE_SCAN_DEBUG,
-- (TSTR("%d blocks to be scanned" TENDSTR), nBlocksToScan));
-- } else {
-- startIterator = dev->internalStartBlock;
-- endIterator = dev->internalEndBlock;
-- }
-+ startIterator = dev->internalStartBlock;
-+ endIterator = dev->internalEndBlock;
-
- /* For each block.... */
- for (blockIterator = startIterator; !alloc_failed && blockIterator <= endIterator;
- blockIterator++) {
-
-- if (dev->isYaffs2) {
-- /* get the block to scan in the correct order */
-- blk = blockIndex[blockIterator].block;
-- } else {
-- blk = blockIterator;
-- }
-+ YYIELD();
-+
-+ YYIELD();
-+
-+ blk = blockIterator;
-
- bi = yaffs_GetBlockInfo(dev, blk);
- state = bi->blockState;
-@@ -5511,7 +5523,7 @@ static int yaffs_Scan(yaffs_Device * dev
-
- /* Let's have a good look at this chunk... */
-
-- if (!dev->isYaffs2 && tags.chunkDeleted) {
-+ if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED || tags.chunkDeleted) {
- /* YAFFS1 only...
- * A deleted chunk
- */
-@@ -5540,18 +5552,6 @@ static int yaffs_Scan(yaffs_Device * dev
- dev->allocationBlockFinder = blk;
- /* Set it to here to encourage the allocator to go forth from here. */
-
-- /* Yaffs2 sanity check:
-- * This should be the one with the highest sequence number
-- */
-- if (dev->isYaffs2
-- && (dev->sequenceNumber !=
-- bi->sequenceNumber)) {
-- T(YAFFS_TRACE_ALWAYS,
-- (TSTR
-- ("yaffs: Allocation block %d was not highest sequence id:"
-- " block seq = %d, dev seq = %d"
-- TENDSTR), blk,bi->sequenceNumber,dev->sequenceNumber));
-- }
- }
-
- dev->nFreeChunks += (dev->nChunksPerBlock - c);
-@@ -5570,11 +5570,11 @@ static int yaffs_Scan(yaffs_Device * dev
- * the same chunkId).
- */
-
-- if(!in)
-+ if (!in)
- alloc_failed = 1;
-
-- if(in){
-- if(!yaffs_PutChunkIntoFile(in, tags.chunkId, chunk,1))
-+ if (in) {
-+ if (!yaffs_PutChunkIntoFile(in, tags.chunkId, chunk, 1))
- alloc_failed = 1;
- }
-
-@@ -5617,7 +5617,7 @@ static int yaffs_Scan(yaffs_Device * dev
- * deleted, and worse still it has changed type. Delete the old object.
- */
-
-- yaffs_DestroyObject(in);
-+ yaffs_DeleteObject(in);
-
- in = 0;
- }
-@@ -5627,14 +5627,20 @@ static int yaffs_Scan(yaffs_Device * dev
- objectId,
- oh->type);
-
-- if(!in)
-+ if (!in)
- alloc_failed = 1;
-
- if (in && oh->shadowsObject > 0) {
-- yaffs_HandleShadowedObject(dev,
-- oh->
-- shadowsObject,
-- 0);
-+
-+ struct yaffs_ShadowFixerStruct *fixer;
-+ fixer = YMALLOC(sizeof(struct yaffs_ShadowFixerStruct));
-+ if (fixer) {
-+ fixer->next = shadowFixerList;
-+ shadowFixerList = fixer;
-+ fixer->objectId = tags.objectId;
-+ fixer->shadowedId = oh->shadowsObject;
-+ }
-+
- }
-
- if (in && in->valid) {
-@@ -5643,12 +5649,10 @@ static int yaffs_Scan(yaffs_Device * dev
- unsigned existingSerial = in->serial;
- unsigned newSerial = tags.serialNumber;
-
-- if (dev->isYaffs2 ||
-- ((existingSerial + 1) & 3) ==
-- newSerial) {
-+ if (((existingSerial + 1) & 3) == newSerial) {
- /* Use new one - destroy the exisiting one */
- yaffs_DeleteChunk(dev,
-- in->chunkId,
-+ in->hdrChunk,
- 1, __LINE__);
- in->valid = 0;
- } else {
-@@ -5681,7 +5685,8 @@ static int yaffs_Scan(yaffs_Device * dev
- in->yst_ctime = oh->yst_ctime;
- in->yst_rdev = oh->yst_rdev;
- #endif
-- in->chunkId = chunk;
-+ in->hdrChunk = chunk;
-+ in->serial = tags.serialNumber;
-
- } else if (in && !in->valid) {
- /* we need to load this info */
-@@ -5705,7 +5710,8 @@ static int yaffs_Scan(yaffs_Device * dev
- in->yst_ctime = oh->yst_ctime;
- in->yst_rdev = oh->yst_rdev;
- #endif
-- in->chunkId = chunk;
-+ in->hdrChunk = chunk;
-+ in->serial = tags.serialNumber;
-
- yaffs_SetObjectName(in, oh->name);
- in->dirty = 0;
-@@ -5718,25 +5724,25 @@ static int yaffs_Scan(yaffs_Device * dev
- yaffs_FindOrCreateObjectByNumber
- (dev, oh->parentObjectId,
- YAFFS_OBJECT_TYPE_DIRECTORY);
-- if (parent->variantType ==
-+ if (!parent)
-+ alloc_failed = 1;
-+ if (parent && parent->variantType ==
- YAFFS_OBJECT_TYPE_UNKNOWN) {
- /* Set up as a directory */
- parent->variantType =
-- YAFFS_OBJECT_TYPE_DIRECTORY;
-- INIT_LIST_HEAD(&parent->variant.
-- directoryVariant.
-- children);
-- } else if (parent->variantType !=
-- YAFFS_OBJECT_TYPE_DIRECTORY)
-- {
-+ YAFFS_OBJECT_TYPE_DIRECTORY;
-+ YINIT_LIST_HEAD(&parent->variant.
-+ directoryVariant.
-+ children);
-+ } else if (!parent || parent->variantType !=
-+ YAFFS_OBJECT_TYPE_DIRECTORY) {
- /* Hoosterman, another problem....
- * We're trying to use a non-directory as a directory
- */
-
- T(YAFFS_TRACE_ERROR,
- (TSTR
-- ("yaffs tragedy: attempting to use non-directory as"
-- " a directory in scan. Put in lost+found."
-+ ("yaffs tragedy: attempting to use non-directory as a directory in scan. Put in lost+found."
- TENDSTR)));
- parent = dev->lostNFoundDir;
- }
-@@ -5760,15 +5766,6 @@ static int yaffs_Scan(yaffs_Device * dev
- /* Todo got a problem */
- break;
- case YAFFS_OBJECT_TYPE_FILE:
-- if (dev->isYaffs2
-- && oh->isShrink) {
-- /* Prune back the shrunken chunks */
-- yaffs_PruneResizedChunks
-- (in, oh->fileSize);
-- /* Mark the block as having a shrinkHeader */
-- bi->hasShrinkHeader = 1;
-- }
--
- if (dev->useHeaderFileSize)
-
- in->variant.fileVariant.
-@@ -5778,11 +5775,11 @@ static int yaffs_Scan(yaffs_Device * dev
- break;
- case YAFFS_OBJECT_TYPE_HARDLINK:
- in->variant.hardLinkVariant.
-- equivalentObjectId =
-- oh->equivalentObjectId;
-+ equivalentObjectId =
-+ oh->equivalentObjectId;
- in->hardLinks.next =
-- (struct list_head *)
-- hardList;
-+ (struct ylist_head *)
-+ hardList;
- hardList = in;
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-@@ -5794,15 +5791,17 @@ static int yaffs_Scan(yaffs_Device * dev
- case YAFFS_OBJECT_TYPE_SYMLINK:
- in->variant.symLinkVariant.alias =
- yaffs_CloneString(oh->alias);
-- if(!in->variant.symLinkVariant.alias)
-+ if (!in->variant.symLinkVariant.alias)
- alloc_failed = 1;
- break;
- }
-
-+/*
- if (parent == dev->deletedDir) {
- yaffs_DestroyObject(in);
- bi->hasShrinkHeader = 1;
- }
-+*/
- }
- }
- }
-@@ -5823,10 +5822,6 @@ static int yaffs_Scan(yaffs_Device * dev
-
- }
-
-- if (blockIndex) {
-- YFREE(blockIndex);
-- }
--
-
- /* Ok, we've done all the scanning.
- * Fix up the hard link chains.
-@@ -5834,32 +5829,36 @@ static int yaffs_Scan(yaffs_Device * dev
- * hardlinks.
- */
-
-- yaffs_HardlinkFixup(dev,hardList);
-+ yaffs_HardlinkFixup(dev, hardList);
-
-- /* Handle the unlinked files. Since they were left in an unlinked state we should
-- * just delete them.
-- */
-+ /* Fix up any shadowed objects */
- {
-- struct list_head *i;
-- struct list_head *n;
-+ struct yaffs_ShadowFixerStruct *fixer;
-+ yaffs_Object *obj;
-
-- yaffs_Object *l;
-- /* Soft delete all the unlinked files */
-- list_for_each_safe(i, n,
-- &dev->unlinkedDir->variant.directoryVariant.
-- children) {
-- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-- yaffs_DestroyObject(l);
-- }
-+ while (shadowFixerList) {
-+ fixer = shadowFixerList;
-+ shadowFixerList = fixer->next;
-+ /* Complete the rename transaction by deleting the shadowed object
-+ * then setting the object header to unshadowed.
-+ */
-+ obj = yaffs_FindObjectByNumber(dev, fixer->shadowedId);
-+ if (obj)
-+ yaffs_DeleteObject(obj);
-+
-+ obj = yaffs_FindObjectByNumber(dev, fixer->objectId);
-+
-+ if (obj)
-+ yaffs_UpdateObjectHeader(obj, NULL, 1, 0, 0);
-+
-+ YFREE(fixer);
- }
- }
-
- yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__);
-
-- if(alloc_failed){
-+ if (alloc_failed)
- return YAFFS_FAIL;
-- }
-
- T(YAFFS_TRACE_SCAN, (TSTR("yaffs_Scan ends" TENDSTR)));
-
-@@ -5871,25 +5870,27 @@ static void yaffs_CheckObjectDetailsLoad
- {
- __u8 *chunkData;
- yaffs_ObjectHeader *oh;
-- yaffs_Device *dev = in->myDev;
-+ yaffs_Device *dev;
- yaffs_ExtendedTags tags;
- int result;
- int alloc_failed = 0;
-
-- if(!in)
-+ if (!in)
- return;
-
-+ dev = in->myDev;
-+
- #if 0
-- T(YAFFS_TRACE_SCAN,(TSTR("details for object %d %s loaded" TENDSTR),
-+ T(YAFFS_TRACE_SCAN, (TSTR("details for object %d %s loaded" TENDSTR),
- in->objectId,
- in->lazyLoaded ? "not yet" : "already"));
- #endif
-
-- if(in->lazyLoaded){
-+ if (in->lazyLoaded && in->hdrChunk > 0) {
- in->lazyLoaded = 0;
- chunkData = yaffs_GetTempBuffer(dev, __LINE__);
-
-- result = yaffs_ReadChunkWithTagsFromNAND(dev,in->chunkId,chunkData,&tags);
-+ result = yaffs_ReadChunkWithTagsFromNAND(dev, in->hdrChunk, chunkData, &tags);
- oh = (yaffs_ObjectHeader *) chunkData;
-
- in->yst_mode = oh->yst_mode;
-@@ -5911,18 +5912,18 @@ static void yaffs_CheckObjectDetailsLoad
- #endif
- yaffs_SetObjectName(in, oh->name);
-
-- if(in->variantType == YAFFS_OBJECT_TYPE_SYMLINK){
-- in->variant.symLinkVariant.alias =
-+ if (in->variantType == YAFFS_OBJECT_TYPE_SYMLINK) {
-+ in->variant.symLinkVariant.alias =
- yaffs_CloneString(oh->alias);
-- if(!in->variant.symLinkVariant.alias)
-+ if (!in->variant.symLinkVariant.alias)
- alloc_failed = 1; /* Not returned to caller */
- }
-
-- yaffs_ReleaseTempBuffer(dev,chunkData, __LINE__);
-+ yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__);
- }
- }
-
--static int yaffs_ScanBackwards(yaffs_Device * dev)
-+static int yaffs_ScanBackwards(yaffs_Device *dev)
- {
- yaffs_ExtendedTags tags;
- int blk;
-@@ -5938,7 +5939,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- yaffs_BlockState state;
- yaffs_Object *hardList = NULL;
- yaffs_BlockInfo *bi;
-- int sequenceNumber;
-+ __u32 sequenceNumber;
- yaffs_ObjectHeader *oh;
- yaffs_Object *in;
- yaffs_Object *parent;
-@@ -5972,12 +5973,12 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- blockIndex = YMALLOC(nBlocks * sizeof(yaffs_BlockIndex));
-
-- if(!blockIndex) {
-+ if (!blockIndex) {
- blockIndex = YMALLOC_ALT(nBlocks * sizeof(yaffs_BlockIndex));
- altBlockIndex = 1;
- }
-
-- if(!blockIndex) {
-+ if (!blockIndex) {
- T(YAFFS_TRACE_SCAN,
- (TSTR("yaffs_Scan() could not allocate block index!" TENDSTR)));
- return YAFFS_FAIL;
-@@ -5999,15 +6000,17 @@ static int yaffs_ScanBackwards(yaffs_Dev
- bi->blockState = state;
- bi->sequenceNumber = sequenceNumber;
-
-- if(bi->sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA)
-+ if (bi->sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA)
- bi->blockState = state = YAFFS_BLOCK_STATE_CHECKPOINT;
-+ if (bi->sequenceNumber == YAFFS_SEQUENCE_BAD_BLOCK)
-+ bi->blockState = state = YAFFS_BLOCK_STATE_DEAD;
-
- T(YAFFS_TRACE_SCAN_DEBUG,
- (TSTR("Block scanning block %d state %d seq %d" TENDSTR), blk,
- state, sequenceNumber));
-
-
-- if(state == YAFFS_BLOCK_STATE_CHECKPOINT){
-+ if (state == YAFFS_BLOCK_STATE_CHECKPOINT) {
- dev->blocksInCheckpoint++;
-
- } else if (state == YAFFS_BLOCK_STATE_DEAD) {
-@@ -6021,8 +6024,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- } else if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING) {
-
- /* Determine the highest sequence number */
-- if (dev->isYaffs2 &&
-- sequenceNumber >= YAFFS_LOWEST_SEQUENCE_NUMBER &&
-+ if (sequenceNumber >= YAFFS_LOWEST_SEQUENCE_NUMBER &&
- sequenceNumber < YAFFS_HIGHEST_SEQUENCE_NUMBER) {
-
- blockIndex[nBlocksToScan].seq = sequenceNumber;
-@@ -6030,10 +6032,9 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- nBlocksToScan++;
-
-- if (sequenceNumber >= dev->sequenceNumber) {
-+ if (sequenceNumber >= dev->sequenceNumber)
- dev->sequenceNumber = sequenceNumber;
-- }
-- } else if (dev->isYaffs2) {
-+ } else {
- /* TODO: Nasty sequence number! */
- T(YAFFS_TRACE_SCAN,
- (TSTR
-@@ -6053,11 +6054,13 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- /* Sort the blocks */
- #ifndef CONFIG_YAFFS_USE_OWN_SORT
-- yaffs_qsort(blockIndex, nBlocksToScan,
-- sizeof(yaffs_BlockIndex), ybicmp);
-+ {
-+ /* Use qsort now. */
-+ yaffs_qsort(blockIndex, nBlocksToScan, sizeof(yaffs_BlockIndex), ybicmp);
-+ }
- #else
- {
-- /* Dungy old bubble sort... */
-+ /* Dungy old bubble sort... */
-
- yaffs_BlockIndex temp;
- int i;
-@@ -6075,7 +6078,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- YYIELD();
-
-- T(YAFFS_TRACE_SCAN, (TSTR("...done" TENDSTR)));
-+ T(YAFFS_TRACE_SCAN, (TSTR("...done" TENDSTR)));
-
- /* Now scan the blocks looking at the data. */
- startIterator = 0;
-@@ -6085,10 +6088,10 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- /* For each block.... backwards */
- for (blockIterator = endIterator; !alloc_failed && blockIterator >= startIterator;
-- blockIterator--) {
-- /* Cooperative multitasking! This loop can run for so
-+ blockIterator--) {
-+ /* Cooperative multitasking! This loop can run for so
- long that watchdog timers expire. */
-- YYIELD();
-+ YYIELD();
-
- /* get the block to scan in the correct order */
- blk = blockIndex[blockIterator].block;
-@@ -6127,10 +6130,8 @@ static int yaffs_ScanBackwards(yaffs_Dev
- * this is the one being allocated from
- */
-
-- if(foundChunksInBlock)
-- {
-+ if (foundChunksInBlock) {
- /* This is a chunk that was skipped due to failing the erased check */
--
- } else if (c == 0) {
- /* We're looking at the first chunk in the block so the block is unused */
- state = YAFFS_BLOCK_STATE_EMPTY;
-@@ -6138,7 +6139,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- } else {
- if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING ||
- state == YAFFS_BLOCK_STATE_ALLOCATING) {
-- if(dev->sequenceNumber == bi->sequenceNumber) {
-+ if (dev->sequenceNumber == bi->sequenceNumber) {
- /* this is the block being allocated from */
-
- T(YAFFS_TRACE_SCAN,
-@@ -6150,27 +6151,31 @@ static int yaffs_ScanBackwards(yaffs_Dev
- dev->allocationBlock = blk;
- dev->allocationPage = c;
- dev->allocationBlockFinder = blk;
-- }
-- else {
-+ } else {
- /* This is a partially written block that is not
- * the current allocation block. This block must have
- * had a write failure, so set up for retirement.
- */
-
-- bi->needsRetiring = 1;
-+ /* bi->needsRetiring = 1; ??? TODO */
- bi->gcPrioritise = 1;
-
- T(YAFFS_TRACE_ALWAYS,
-- (TSTR("Partially written block %d being set for retirement" TENDSTR),
-+ (TSTR("Partially written block %d detected" TENDSTR),
- blk));
- }
--
- }
--
- }
-
- dev->nFreeChunks++;
-
-+ } else if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED) {
-+ T(YAFFS_TRACE_SCAN,
-+ (TSTR(" Unfixed ECC in chunk(%d:%d), chunk ignored"TENDSTR),
-+ blk, c));
-+
-+ dev->nFreeChunks++;
-+
- } else if (tags.chunkId > 0) {
- /* chunkId > 0 so it is a data chunk... */
- unsigned int endpos;
-@@ -6187,7 +6192,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- tags.
- objectId,
- YAFFS_OBJECT_TYPE_FILE);
-- if(!in){
-+ if (!in) {
- /* Out of memory */
- alloc_failed = 1;
- }
-@@ -6197,8 +6202,8 @@ static int yaffs_ScanBackwards(yaffs_Dev
- && chunkBase <
- in->variant.fileVariant.shrinkSize) {
- /* This has not been invalidated by a resize */
-- if(!yaffs_PutChunkIntoFile(in, tags.chunkId,
-- chunk, -1)){
-+ if (!yaffs_PutChunkIntoFile(in, tags.chunkId,
-+ chunk, -1)) {
- alloc_failed = 1;
- }
-
-@@ -6221,7 +6226,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- scannedFileSize;
- }
-
-- } else if(in) {
-+ } else if (in) {
- /* This chunk has been invalidated by a resize, so delete */
- yaffs_DeleteChunk(dev, chunk, 1, __LINE__);
-
-@@ -6242,6 +6247,8 @@ static int yaffs_ScanBackwards(yaffs_Dev
- in = yaffs_FindOrCreateObjectByNumber
- (dev, tags.objectId,
- tags.extraObjectType);
-+ if (!in)
-+ alloc_failed = 1;
- }
-
- if (!in ||
-@@ -6251,8 +6258,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- tags.extraShadows ||
- (!in->valid &&
- (tags.objectId == YAFFS_OBJECTID_ROOT ||
-- tags.objectId == YAFFS_OBJECTID_LOSTNFOUND))
-- ) {
-+ tags.objectId == YAFFS_OBJECTID_LOSTNFOUND))) {
-
- /* If we don't have valid info then we need to read the chunk
- * TODO In future we can probably defer reading the chunk and
-@@ -6266,8 +6272,17 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- oh = (yaffs_ObjectHeader *) chunkData;
-
-- if (!in)
-+ if (dev->inbandTags) {
-+ /* Fix up the header if they got corrupted by inband tags */
-+ oh->shadowsObject = oh->inbandShadowsObject;
-+ oh->isShrink = oh->inbandIsShrink;
-+ }
-+
-+ if (!in) {
- in = yaffs_FindOrCreateObjectByNumber(dev, tags.objectId, oh->type);
-+ if (!in)
-+ alloc_failed = 1;
-+ }
-
- }
-
-@@ -6275,10 +6290,9 @@ static int yaffs_ScanBackwards(yaffs_Dev
- /* TODO Hoosterman we have a problem! */
- T(YAFFS_TRACE_ERROR,
- (TSTR
-- ("yaffs tragedy: Could not make object for object %d "
-- "at chunk %d during scan"
-+ ("yaffs tragedy: Could not make object for object %d at chunk %d during scan"
- TENDSTR), tags.objectId, chunk));
--
-+ continue;
- }
-
- if (in->valid) {
-@@ -6289,10 +6303,9 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- if ((in->variantType == YAFFS_OBJECT_TYPE_FILE) &&
- ((oh &&
-- oh-> type == YAFFS_OBJECT_TYPE_FILE)||
-+ oh->type == YAFFS_OBJECT_TYPE_FILE) ||
- (tags.extraHeaderInfoAvailable &&
-- tags.extraObjectType == YAFFS_OBJECT_TYPE_FILE))
-- ) {
-+ tags.extraObjectType == YAFFS_OBJECT_TYPE_FILE))) {
- __u32 thisSize =
- (oh) ? oh->fileSize : tags.
- extraFileLength;
-@@ -6300,7 +6313,9 @@ static int yaffs_ScanBackwards(yaffs_Dev
- (oh) ? oh->
- parentObjectId : tags.
- extraParentObjectId;
-- unsigned isShrink =
-+
-+
-+ isShrink =
- (oh) ? oh->isShrink : tags.
- extraIsShrinkHeader;
-
-@@ -6323,9 +6338,8 @@ static int yaffs_ScanBackwards(yaffs_Dev
- thisSize;
- }
-
-- if (isShrink) {
-+ if (isShrink)
- bi->hasShrinkHeader = 1;
-- }
-
- }
- /* Use existing - destroy this one. */
-@@ -6333,6 +6347,17 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- }
-
-+ if (!in->valid && in->variantType !=
-+ (oh ? oh->type : tags.extraObjectType))
-+ T(YAFFS_TRACE_ERROR, (
-+ TSTR("yaffs tragedy: Bad object type, "
-+ TCONT("%d != %d, for object %d at chunk ")
-+ TCONT("%d during scan")
-+ TENDSTR), oh ?
-+ oh->type : tags.extraObjectType,
-+ in->variantType, tags.objectId,
-+ chunk));
-+
- if (!in->valid &&
- (tags.objectId == YAFFS_OBJECTID_ROOT ||
- tags.objectId ==
-@@ -6340,7 +6365,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- /* We only load some info, don't fiddle with directory structure */
- in->valid = 1;
-
-- if(oh) {
-+ if (oh) {
- in->variantType = oh->type;
-
- in->yst_mode = oh->yst_mode;
-@@ -6365,15 +6390,15 @@ static int yaffs_ScanBackwards(yaffs_Dev
- in->lazyLoaded = 1;
- }
-
-- in->chunkId = chunk;
-+ in->hdrChunk = chunk;
-
- } else if (!in->valid) {
- /* we need to load this info */
-
- in->valid = 1;
-- in->chunkId = chunk;
-+ in->hdrChunk = chunk;
-
-- if(oh) {
-+ if (oh) {
- in->variantType = oh->type;
-
- in->yst_mode = oh->yst_mode;
-@@ -6403,20 +6428,19 @@ static int yaffs_ScanBackwards(yaffs_Dev
- yaffs_SetObjectName(in, oh->name);
- parent =
- yaffs_FindOrCreateObjectByNumber
-- (dev, oh->parentObjectId,
-- YAFFS_OBJECT_TYPE_DIRECTORY);
-+ (dev, oh->parentObjectId,
-+ YAFFS_OBJECT_TYPE_DIRECTORY);
-
- fileSize = oh->fileSize;
-- isShrink = oh->isShrink;
-+ isShrink = oh->isShrink;
- equivalentObjectId = oh->equivalentObjectId;
-
-- }
-- else {
-+ } else {
- in->variantType = tags.extraObjectType;
- parent =
- yaffs_FindOrCreateObjectByNumber
-- (dev, tags.extraParentObjectId,
-- YAFFS_OBJECT_TYPE_DIRECTORY);
-+ (dev, tags.extraParentObjectId,
-+ YAFFS_OBJECT_TYPE_DIRECTORY);
- fileSize = tags.extraFileLength;
- isShrink = tags.extraIsShrinkHeader;
- equivalentObjectId = tags.extraEquivalentObjectId;
-@@ -6425,29 +6449,30 @@ static int yaffs_ScanBackwards(yaffs_Dev
- }
- in->dirty = 0;
-
-+ if (!parent)
-+ alloc_failed = 1;
-+
- /* directory stuff...
- * hook up to parent
- */
-
-- if (parent->variantType ==
-+ if (parent && parent->variantType ==
- YAFFS_OBJECT_TYPE_UNKNOWN) {
- /* Set up as a directory */
- parent->variantType =
-- YAFFS_OBJECT_TYPE_DIRECTORY;
-- INIT_LIST_HEAD(&parent->variant.
-- directoryVariant.
-- children);
-- } else if (parent->variantType !=
-- YAFFS_OBJECT_TYPE_DIRECTORY)
-- {
-+ YAFFS_OBJECT_TYPE_DIRECTORY;
-+ YINIT_LIST_HEAD(&parent->variant.
-+ directoryVariant.
-+ children);
-+ } else if (!parent || parent->variantType !=
-+ YAFFS_OBJECT_TYPE_DIRECTORY) {
- /* Hoosterman, another problem....
- * We're trying to use a non-directory as a directory
- */
-
- T(YAFFS_TRACE_ERROR,
- (TSTR
-- ("yaffs tragedy: attempting to use non-directory as"
-- " a directory in scan. Put in lost+found."
-+ ("yaffs tragedy: attempting to use non-directory as a directory in scan. Put in lost+found."
- TENDSTR)));
- parent = dev->lostNFoundDir;
- }
-@@ -6494,12 +6519,12 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- break;
- case YAFFS_OBJECT_TYPE_HARDLINK:
-- if(!itsUnlinked) {
-- in->variant.hardLinkVariant.equivalentObjectId =
-- equivalentObjectId;
-- in->hardLinks.next =
-- (struct list_head *) hardList;
-- hardList = in;
-+ if (!itsUnlinked) {
-+ in->variant.hardLinkVariant.equivalentObjectId =
-+ equivalentObjectId;
-+ in->hardLinks.next =
-+ (struct ylist_head *) hardList;
-+ hardList = in;
- }
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-@@ -6509,12 +6534,11 @@ static int yaffs_ScanBackwards(yaffs_Dev
- /* Do nothing */
- break;
- case YAFFS_OBJECT_TYPE_SYMLINK:
-- if(oh){
-- in->variant.symLinkVariant.alias =
-- yaffs_CloneString(oh->
-- alias);
-- if(!in->variant.symLinkVariant.alias)
-- alloc_failed = 1;
-+ if (oh) {
-+ in->variant.symLinkVariant.alias =
-+ yaffs_CloneString(oh->alias);
-+ if (!in->variant.symLinkVariant.alias)
-+ alloc_failed = 1;
- }
- break;
- }
-@@ -6551,75 +6575,129 @@ static int yaffs_ScanBackwards(yaffs_Dev
- * We should now have scanned all the objects, now it's time to add these
- * hardlinks.
- */
-- yaffs_HardlinkFixup(dev,hardList);
-+ yaffs_HardlinkFixup(dev, hardList);
-
-
-- /*
-- * Sort out state of unlinked and deleted objects.
-- */
-- {
-- struct list_head *i;
-- struct list_head *n;
-+ yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__);
-
-- yaffs_Object *l;
-+ if (alloc_failed)
-+ return YAFFS_FAIL;
-
-- /* Soft delete all the unlinked files */
-- list_for_each_safe(i, n,
-- &dev->unlinkedDir->variant.directoryVariant.
-- children) {
-- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-- yaffs_DestroyObject(l);
-- }
-- }
-+ T(YAFFS_TRACE_SCAN, (TSTR("yaffs_ScanBackwards ends" TENDSTR)));
-
-- /* Soft delete all the deletedDir files */
-- list_for_each_safe(i, n,
-- &dev->deletedDir->variant.directoryVariant.
-- children) {
-- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-- yaffs_DestroyObject(l);
-+ return YAFFS_OK;
-+}
-
-- }
-+/*------------------------------ Directory Functions ----------------------------- */
-+
-+static void yaffs_VerifyObjectInDirectory(yaffs_Object *obj)
-+{
-+ struct ylist_head *lh;
-+ yaffs_Object *listObj;
-+
-+ int count = 0;
-+
-+ if (!obj) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("No object to verify" TENDSTR)));
-+ YBUG();
-+ return;
-+ }
-+
-+ if (yaffs_SkipVerification(obj->myDev))
-+ return;
-+
-+ if (!obj->parent) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Object does not have parent" TENDSTR)));
-+ YBUG();
-+ return;
-+ }
-+
-+ if (obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Parent is not directory" TENDSTR)));
-+ YBUG();
-+ }
-+
-+ /* Iterate through the objects in each hash entry */
-+
-+ ylist_for_each(lh, &obj->parent->variant.directoryVariant.children) {
-+ if (lh) {
-+ listObj = ylist_entry(lh, yaffs_Object, siblings);
-+ yaffs_VerifyObject(listObj);
-+ if (obj == listObj)
-+ count++;
- }
-+ }
-+
-+ if (count != 1) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Object in directory %d times" TENDSTR), count));
-+ YBUG();
- }
-+}
-
-- yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__);
-+static void yaffs_VerifyDirectory(yaffs_Object *directory)
-+{
-+ struct ylist_head *lh;
-+ yaffs_Object *listObj;
-
-- if(alloc_failed){
-- return YAFFS_FAIL;
-+ if (!directory) {
-+ YBUG();
-+ return;
- }
-
-- T(YAFFS_TRACE_SCAN, (TSTR("yaffs_ScanBackwards ends" TENDSTR)));
-+ if (yaffs_SkipFullVerification(directory->myDev))
-+ return;
-
-- return YAFFS_OK;
-+ if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Directory has wrong type: %d" TENDSTR), directory->variantType));
-+ YBUG();
-+ }
-+
-+ /* Iterate through the objects in each hash entry */
-+
-+ ylist_for_each(lh, &directory->variant.directoryVariant.children) {
-+ if (lh) {
-+ listObj = ylist_entry(lh, yaffs_Object, siblings);
-+ if (listObj->parent != directory) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Object in directory list has wrong parent %p" TENDSTR), listObj->parent));
-+ YBUG();
-+ }
-+ yaffs_VerifyObjectInDirectory(listObj);
-+ }
-+ }
- }
-
--/*------------------------------ Directory Functions ----------------------------- */
-
--static void yaffs_RemoveObjectFromDirectory(yaffs_Object * obj)
-+static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj)
- {
- yaffs_Device *dev = obj->myDev;
-+ yaffs_Object *parent;
-+
-+ yaffs_VerifyObjectInDirectory(obj);
-+ parent = obj->parent;
-+
-+ yaffs_VerifyDirectory(parent);
-
-- if(dev && dev->removeObjectCallback)
-+ if (dev && dev->removeObjectCallback)
- dev->removeObjectCallback(obj);
-
-- list_del_init(&obj->siblings);
-+
-+ ylist_del_init(&obj->siblings);
- obj->parent = NULL;
-+
-+ yaffs_VerifyDirectory(parent);
- }
-
-
--static void yaffs_AddObjectToDirectory(yaffs_Object * directory,
-- yaffs_Object * obj)
-+static void yaffs_AddObjectToDirectory(yaffs_Object *directory,
-+ yaffs_Object *obj)
- {
--
- if (!directory) {
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
- ("tragedy: Trying to add an object to a null pointer directory"
- TENDSTR)));
- YBUG();
-+ return;
- }
- if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
-@@ -6631,37 +6709,42 @@ static void yaffs_AddObjectToDirectory(y
-
- if (obj->siblings.prev == NULL) {
- /* Not initialised */
-- INIT_LIST_HEAD(&obj->siblings);
--
-- } else if (!list_empty(&obj->siblings)) {
-- /* If it is holed up somewhere else, un hook it */
-- yaffs_RemoveObjectFromDirectory(obj);
-+ YBUG();
- }
-+
-+
-+ yaffs_VerifyDirectory(directory);
-+
-+ yaffs_RemoveObjectFromDirectory(obj);
-+
-+
- /* Now add it */
-- list_add(&obj->siblings, &directory->variant.directoryVariant.children);
-+ ylist_add(&obj->siblings, &directory->variant.directoryVariant.children);
- obj->parent = directory;
-
- if (directory == obj->myDev->unlinkedDir
-- || directory == obj->myDev->deletedDir) {
-+ || directory == obj->myDev->deletedDir) {
- obj->unlinked = 1;
- obj->myDev->nUnlinkedFiles++;
- obj->renameAllowed = 0;
- }
-+
-+ yaffs_VerifyDirectory(directory);
-+ yaffs_VerifyObjectInDirectory(obj);
- }
-
--yaffs_Object *yaffs_FindObjectByName(yaffs_Object * directory,
-- const YCHAR * name)
-+yaffs_Object *yaffs_FindObjectByName(yaffs_Object *directory,
-+ const YCHAR *name)
- {
- int sum;
-
-- struct list_head *i;
-+ struct ylist_head *i;
- YCHAR buffer[YAFFS_MAX_NAME_LENGTH + 1];
-
- yaffs_Object *l;
-
-- if (!name) {
-+ if (!name)
- return NULL;
-- }
-
- if (!directory) {
- T(YAFFS_TRACE_ALWAYS,
-@@ -6669,6 +6752,7 @@ yaffs_Object *yaffs_FindObjectByName(yaf
- ("tragedy: yaffs_FindObjectByName: null pointer directory"
- TENDSTR)));
- YBUG();
-+ return NULL;
- }
- if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
-@@ -6679,28 +6763,27 @@ yaffs_Object *yaffs_FindObjectByName(yaf
-
- sum = yaffs_CalcNameSum(name);
-
-- list_for_each(i, &directory->variant.directoryVariant.children) {
-+ ylist_for_each(i, &directory->variant.directoryVariant.children) {
- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-+ l = ylist_entry(i, yaffs_Object, siblings);
-+
-+ if (l->parent != directory)
-+ YBUG();
-
- yaffs_CheckObjectDetailsLoaded(l);
-
- /* Special case for lost-n-found */
- if (l->objectId == YAFFS_OBJECTID_LOSTNFOUND) {
-- if (yaffs_strcmp(name, YAFFS_LOSTNFOUND_NAME) == 0) {
-+ if (yaffs_strcmp(name, YAFFS_LOSTNFOUND_NAME) == 0)
- return l;
-- }
-- } else if (yaffs_SumCompare(l->sum, sum) || l->chunkId <= 0)
-- {
-- /* LostnFound cunk called Objxxx
-+ } else if (yaffs_SumCompare(l->sum, sum) || l->hdrChunk <= 0) {
-+ /* LostnFound chunk called Objxxx
- * Do a real check
- */
- yaffs_GetObjectName(l, buffer,
- YAFFS_MAX_NAME_LENGTH);
-- if (yaffs_strncmp(name, buffer,YAFFS_MAX_NAME_LENGTH) == 0) {
-+ if (yaffs_strncmp(name, buffer, YAFFS_MAX_NAME_LENGTH) == 0)
- return l;
-- }
--
- }
- }
- }
-@@ -6710,10 +6793,10 @@ yaffs_Object *yaffs_FindObjectByName(yaf
-
-
- #if 0
--int yaffs_ApplyToDirectoryChildren(yaffs_Object * theDir,
-- int (*fn) (yaffs_Object *))
-+int yaffs_ApplyToDirectoryChildren(yaffs_Object *theDir,
-+ int (*fn) (yaffs_Object *))
- {
-- struct list_head *i;
-+ struct ylist_head *i;
- yaffs_Object *l;
-
- if (!theDir) {
-@@ -6722,20 +6805,21 @@ int yaffs_ApplyToDirectoryChildren(yaffs
- ("tragedy: yaffs_FindObjectByName: null pointer directory"
- TENDSTR)));
- YBUG();
-+ return YAFFS_FAIL;
- }
- if (theDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
- ("tragedy: yaffs_FindObjectByName: non-directory" TENDSTR)));
- YBUG();
-+ return YAFFS_FAIL;
- }
-
-- list_for_each(i, &theDir->variant.directoryVariant.children) {
-+ ylist_for_each(i, &theDir->variant.directoryVariant.children) {
- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-- if (l && !fn(l)) {
-+ l = ylist_entry(i, yaffs_Object, siblings);
-+ if (l && !fn(l))
- return YAFFS_FAIL;
-- }
- }
- }
-
-@@ -6748,7 +6832,7 @@ int yaffs_ApplyToDirectoryChildren(yaffs
- * actual object.
- */
-
--yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object * obj)
-+yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj)
- {
- if (obj && obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) {
- /* We want the object id of the equivalent object, not this one */
-@@ -6756,10 +6840,9 @@ yaffs_Object *yaffs_GetEquivalentObject(
- yaffs_CheckObjectDetailsLoaded(obj);
- }
- return obj;
--
- }
-
--int yaffs_GetObjectName(yaffs_Object * obj, YCHAR * name, int buffSize)
-+int yaffs_GetObjectName(yaffs_Object *obj, YCHAR *name, int buffSize)
- {
- memset(name, 0, buffSize * sizeof(YCHAR));
-
-@@ -6767,18 +6850,26 @@ int yaffs_GetObjectName(yaffs_Object * o
-
- if (obj->objectId == YAFFS_OBJECTID_LOSTNFOUND) {
- yaffs_strncpy(name, YAFFS_LOSTNFOUND_NAME, buffSize - 1);
-- } else if (obj->chunkId <= 0) {
-+ } else if (obj->hdrChunk <= 0) {
- YCHAR locName[20];
-+ YCHAR numString[20];
-+ YCHAR *x = &numString[19];
-+ unsigned v = obj->objectId;
-+ numString[19] = 0;
-+ while (v > 0) {
-+ x--;
-+ *x = '0' + (v % 10);
-+ v /= 10;
-+ }
- /* make up a name */
-- yaffs_sprintf(locName, _Y("%s%d"), YAFFS_LOSTNFOUND_PREFIX,
-- obj->objectId);
-+ yaffs_strcpy(locName, YAFFS_LOSTNFOUND_PREFIX);
-+ yaffs_strcat(locName, x);
- yaffs_strncpy(name, locName, buffSize - 1);
-
- }
- #ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM
-- else if (obj->shortName[0]) {
-+ else if (obj->shortName[0])
- yaffs_strcpy(name, obj->shortName);
-- }
- #endif
- else {
- int result;
-@@ -6788,9 +6879,9 @@ int yaffs_GetObjectName(yaffs_Object * o
-
- memset(buffer, 0, obj->myDev->nDataBytesPerChunk);
-
-- if (obj->chunkId >= 0) {
-+ if (obj->hdrChunk > 0) {
- result = yaffs_ReadChunkWithTagsFromNAND(obj->myDev,
-- obj->chunkId, buffer,
-+ obj->hdrChunk, buffer,
- NULL);
- }
- yaffs_strncpy(name, oh->name, buffSize - 1);
-@@ -6801,46 +6892,43 @@ int yaffs_GetObjectName(yaffs_Object * o
- return yaffs_strlen(name);
- }
-
--int yaffs_GetObjectFileLength(yaffs_Object * obj)
-+int yaffs_GetObjectFileLength(yaffs_Object *obj)
- {
--
- /* Dereference any hard linking */
- obj = yaffs_GetEquivalentObject(obj);
-
-- if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) {
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE)
- return obj->variant.fileVariant.fileSize;
-- }
-- if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK) {
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
- return yaffs_strlen(obj->variant.symLinkVariant.alias);
-- } else {
-+ else {
- /* Only a directory should drop through to here */
- return obj->myDev->nDataBytesPerChunk;
- }
- }
-
--int yaffs_GetObjectLinkCount(yaffs_Object * obj)
-+int yaffs_GetObjectLinkCount(yaffs_Object *obj)
- {
- int count = 0;
-- struct list_head *i;
-+ struct ylist_head *i;
-
-- if (!obj->unlinked) {
-- count++; /* the object itself */
-- }
-- list_for_each(i, &obj->hardLinks) {
-- count++; /* add the hard links; */
-- }
-- return count;
-+ if (!obj->unlinked)
-+ count++; /* the object itself */
-+
-+ ylist_for_each(i, &obj->hardLinks)
-+ count++; /* add the hard links; */
-
-+ return count;
- }
-
--int yaffs_GetObjectInode(yaffs_Object * obj)
-+int yaffs_GetObjectInode(yaffs_Object *obj)
- {
- obj = yaffs_GetEquivalentObject(obj);
-
- return obj->objectId;
- }
-
--unsigned yaffs_GetObjectType(yaffs_Object * obj)
-+unsigned yaffs_GetObjectType(yaffs_Object *obj)
- {
- obj = yaffs_GetEquivalentObject(obj);
-
-@@ -6872,19 +6960,18 @@ unsigned yaffs_GetObjectType(yaffs_Objec
- }
- }
-
--YCHAR *yaffs_GetSymlinkAlias(yaffs_Object * obj)
-+YCHAR *yaffs_GetSymlinkAlias(yaffs_Object *obj)
- {
- obj = yaffs_GetEquivalentObject(obj);
-- if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK) {
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
- return yaffs_CloneString(obj->variant.symLinkVariant.alias);
-- } else {
-+ else
- return yaffs_CloneString(_Y(""));
-- }
- }
-
- #ifndef CONFIG_YAFFS_WINCE
-
--int yaffs_SetAttributes(yaffs_Object * obj, struct iattr *attr)
-+int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr)
- {
- unsigned int valid = attr->ia_valid;
-
-@@ -6910,7 +6997,7 @@ int yaffs_SetAttributes(yaffs_Object * o
- return YAFFS_OK;
-
- }
--int yaffs_GetAttributes(yaffs_Object * obj, struct iattr *attr)
-+int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr)
- {
- unsigned int valid = 0;
-
-@@ -6934,13 +7021,12 @@ int yaffs_GetAttributes(yaffs_Object * o
- attr->ia_valid = valid;
-
- return YAFFS_OK;
--
- }
-
- #endif
-
- #if 0
--int yaffs_DumpObject(yaffs_Object * obj)
-+int yaffs_DumpObject(yaffs_Object *obj)
- {
- YCHAR name[257];
-
-@@ -6951,7 +7037,7 @@ int yaffs_DumpObject(yaffs_Object * obj)
- ("Object %d, inode %d \"%s\"\n dirty %d valid %d serial %d sum %d"
- " chunk %d type %d size %d\n"
- TENDSTR), obj->objectId, yaffs_GetObjectInode(obj), name,
-- obj->dirty, obj->valid, obj->serial, obj->sum, obj->chunkId,
-+ obj->dirty, obj->valid, obj->serial, obj->sum, obj->hdrChunk,
- yaffs_GetObjectType(obj), yaffs_GetObjectFileLength(obj)));
-
- return YAFFS_OK;
-@@ -6960,7 +7046,7 @@ int yaffs_DumpObject(yaffs_Object * obj)
-
- /*---------------------------- Initialisation code -------------------------------------- */
-
--static int yaffs_CheckDevFunctions(const yaffs_Device * dev)
-+static int yaffs_CheckDevFunctions(const yaffs_Device *dev)
- {
-
- /* Common functions, gotta have */
-@@ -7011,7 +7097,7 @@ static int yaffs_CreateInitialDirectorie
- yaffs_CreateFakeDirectory(dev, YAFFS_OBJECTID_LOSTNFOUND,
- YAFFS_LOSTNFOUND_MODE | S_IFDIR);
-
-- if(dev->lostNFoundDir && dev->rootDir && dev->unlinkedDir && dev->deletedDir){
-+ if (dev->lostNFoundDir && dev->rootDir && dev->unlinkedDir && dev->deletedDir) {
- yaffs_AddObjectToDirectory(dev->rootDir, dev->lostNFoundDir);
- return YAFFS_OK;
- }
-@@ -7019,7 +7105,7 @@ static int yaffs_CreateInitialDirectorie
- return YAFFS_FAIL;
- }
-
--int yaffs_GutsInitialise(yaffs_Device * dev)
-+int yaffs_GutsInitialise(yaffs_Device *dev)
- {
- int init_failed = 0;
- unsigned x;
-@@ -7040,6 +7126,8 @@ int yaffs_GutsInitialise(yaffs_Device *
- dev->chunkOffset = 0;
- dev->nFreeChunks = 0;
-
-+ dev->gcBlock = -1;
-+
- if (dev->startBlock == 0) {
- dev->internalStartBlock = dev->startBlock + 1;
- dev->internalEndBlock = dev->endBlock + 1;
-@@ -7049,18 +7137,18 @@ int yaffs_GutsInitialise(yaffs_Device *
-
- /* Check geometry parameters. */
-
-- if ((dev->isYaffs2 && dev->nDataBytesPerChunk < 1024) ||
-- (!dev->isYaffs2 && dev->nDataBytesPerChunk != 512) ||
-+ if ((!dev->inbandTags && dev->isYaffs2 && dev->totalBytesPerChunk < 1024) ||
-+ (!dev->isYaffs2 && dev->totalBytesPerChunk < 512) ||
-+ (dev->inbandTags && !dev->isYaffs2) ||
- dev->nChunksPerBlock < 2 ||
- dev->nReservedBlocks < 2 ||
- dev->internalStartBlock <= 0 ||
- dev->internalEndBlock <= 0 ||
-- dev->internalEndBlock <= (dev->internalStartBlock + dev->nReservedBlocks + 2) // otherwise it is too small
-- ) {
-+ dev->internalEndBlock <= (dev->internalStartBlock + dev->nReservedBlocks + 2)) { /* otherwise it is too small */
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
-- ("yaffs: NAND geometry problems: chunk size %d, type is yaffs%s "
-- TENDSTR), dev->nDataBytesPerChunk, dev->isYaffs2 ? "2" : ""));
-+ ("yaffs: NAND geometry problems: chunk size %d, type is yaffs%s, inbandTags %d "
-+ TENDSTR), dev->totalBytesPerChunk, dev->isYaffs2 ? "2" : "", dev->inbandTags));
- return YAFFS_FAIL;
- }
-
-@@ -7070,6 +7158,12 @@ int yaffs_GutsInitialise(yaffs_Device *
- return YAFFS_FAIL;
- }
-
-+ /* Sort out space for inband tags, if required */
-+ if (dev->inbandTags)
-+ dev->nDataBytesPerChunk = dev->totalBytesPerChunk - sizeof(yaffs_PackedTags2TagsPart);
-+ else
-+ dev->nDataBytesPerChunk = dev->totalBytesPerChunk;
-+
- /* Got the right mix of functions? */
- if (!yaffs_CheckDevFunctions(dev)) {
- /* Function missing */
-@@ -7097,31 +7191,18 @@ int yaffs_GutsInitialise(yaffs_Device *
-
- dev->isMounted = 1;
-
--
--
- /* OK now calculate a few things for the device */
-
- /*
- * Calculate all the chunk size manipulation numbers:
- */
-- /* Start off assuming it is a power of 2 */
-- dev->chunkShift = ShiftDiv(dev->nDataBytesPerChunk);
-- dev->chunkMask = (1<<dev->chunkShift) - 1;
--
-- if(dev->nDataBytesPerChunk == (dev->chunkMask + 1)){
-- /* Yes it is a power of 2, disable crumbs */
-- dev->crumbMask = 0;
-- dev->crumbShift = 0;
-- dev->crumbsPerChunk = 0;
-- } else {
-- /* Not a power of 2, use crumbs instead */
-- dev->crumbShift = ShiftDiv(sizeof(yaffs_PackedTags2TagsPart));
-- dev->crumbMask = (1<<dev->crumbShift)-1;
-- dev->crumbsPerChunk = dev->nDataBytesPerChunk/(1 << dev->crumbShift);
-- dev->chunkShift = 0;
-- dev->chunkMask = 0;
-- }
--
-+ x = dev->nDataBytesPerChunk;
-+ /* We always use dev->chunkShift and dev->chunkDiv */
-+ dev->chunkShift = Shifts(x);
-+ x >>= dev->chunkShift;
-+ dev->chunkDiv = x;
-+ /* We only use chunk mask if chunkDiv is 1 */
-+ dev->chunkMask = (1<<dev->chunkShift) - 1;
-
- /*
- * Calculate chunkGroupBits.
-@@ -7133,16 +7214,15 @@ int yaffs_GutsInitialise(yaffs_Device *
- bits = ShiftsGE(x);
-
- /* Set up tnode width if wide tnodes are enabled. */
-- if(!dev->wideTnodesDisabled){
-+ if (!dev->wideTnodesDisabled) {
- /* bits must be even so that we end up with 32-bit words */
-- if(bits & 1)
-+ if (bits & 1)
- bits++;
-- if(bits < 16)
-+ if (bits < 16)
- dev->tnodeWidth = 16;
- else
- dev->tnodeWidth = bits;
-- }
-- else
-+ } else
- dev->tnodeWidth = 16;
-
- dev->tnodeMask = (1<<dev->tnodeWidth)-1;
-@@ -7193,7 +7273,7 @@ int yaffs_GutsInitialise(yaffs_Device *
- dev->hasPendingPrioritisedGCs = 1; /* Assume the worst for now, will get fixed on first GC */
-
- /* Initialise temporary buffers and caches. */
-- if(!yaffs_InitialiseTempBuffers(dev))
-+ if (!yaffs_InitialiseTempBuffers(dev))
- init_failed = 1;
-
- dev->srCache = NULL;
-@@ -7203,25 +7283,26 @@ int yaffs_GutsInitialise(yaffs_Device *
- if (!init_failed &&
- dev->nShortOpCaches > 0) {
- int i;
-- __u8 *buf;
-+ void *buf;
- int srCacheBytes = dev->nShortOpCaches * sizeof(yaffs_ChunkCache);
-
-- if (dev->nShortOpCaches > YAFFS_MAX_SHORT_OP_CACHES) {
-+ if (dev->nShortOpCaches > YAFFS_MAX_SHORT_OP_CACHES)
- dev->nShortOpCaches = YAFFS_MAX_SHORT_OP_CACHES;
-- }
-
-- buf = dev->srCache = YMALLOC(srCacheBytes);
-+ dev->srCache = YMALLOC(srCacheBytes);
-
-- if(dev->srCache)
-- memset(dev->srCache,0,srCacheBytes);
-+ buf = (__u8 *) dev->srCache;
-+
-+ if (dev->srCache)
-+ memset(dev->srCache, 0, srCacheBytes);
-
- for (i = 0; i < dev->nShortOpCaches && buf; i++) {
- dev->srCache[i].object = NULL;
- dev->srCache[i].lastUse = 0;
- dev->srCache[i].dirty = 0;
-- dev->srCache[i].data = buf = YMALLOC_DMA(dev->nDataBytesPerChunk);
-+ dev->srCache[i].data = buf = YMALLOC_DMA(dev->totalBytesPerChunk);
- }
-- if(!buf)
-+ if (!buf)
- init_failed = 1;
-
- dev->srLastUse = 0;
-@@ -7229,29 +7310,30 @@ int yaffs_GutsInitialise(yaffs_Device *
-
- dev->cacheHits = 0;
-
-- if(!init_failed){
-+ if (!init_failed) {
- dev->gcCleanupList = YMALLOC(dev->nChunksPerBlock * sizeof(__u32));
-- if(!dev->gcCleanupList)
-+ if (!dev->gcCleanupList)
- init_failed = 1;
- }
-
-- if (dev->isYaffs2) {
-+ if (dev->isYaffs2)
- dev->useHeaderFileSize = 1;
-- }
-- if(!init_failed && !yaffs_InitialiseBlocks(dev))
-+
-+ if (!init_failed && !yaffs_InitialiseBlocks(dev))
- init_failed = 1;
-
- yaffs_InitialiseTnodes(dev);
- yaffs_InitialiseObjects(dev);
-
-- if(!init_failed && !yaffs_CreateInitialDirectories(dev))
-+ if (!init_failed && !yaffs_CreateInitialDirectories(dev))
- init_failed = 1;
-
-
-- if(!init_failed){
-+ if (!init_failed) {
- /* Now scan the flash. */
- if (dev->isYaffs2) {
-- if(yaffs_CheckpointRestore(dev)) {
-+ if (yaffs_CheckpointRestore(dev)) {
-+ yaffs_CheckObjectDetailsLoaded(dev->rootDir);
- T(YAFFS_TRACE_ALWAYS,
- (TSTR("yaffs: restored from checkpoint" TENDSTR)));
- } else {
-@@ -7273,24 +7355,25 @@ int yaffs_GutsInitialise(yaffs_Device *
- dev->nBackgroundDeletions = 0;
- dev->oldestDirtySequence = 0;
-
-- if(!init_failed && !yaffs_InitialiseBlocks(dev))
-+ if (!init_failed && !yaffs_InitialiseBlocks(dev))
- init_failed = 1;
-
- yaffs_InitialiseTnodes(dev);
- yaffs_InitialiseObjects(dev);
-
-- if(!init_failed && !yaffs_CreateInitialDirectories(dev))
-+ if (!init_failed && !yaffs_CreateInitialDirectories(dev))
- init_failed = 1;
-
-- if(!init_failed && !yaffs_ScanBackwards(dev))
-+ if (!init_failed && !yaffs_ScanBackwards(dev))
- init_failed = 1;
- }
-- }else
-- if(!yaffs_Scan(dev))
-+ } else if (!yaffs_Scan(dev))
- init_failed = 1;
-+
-+ yaffs_StripDeletedObjects(dev);
- }
-
-- if(init_failed){
-+ if (init_failed) {
- /* Clean up the mess */
- T(YAFFS_TRACE_TRACING,
- (TSTR("yaffs: yaffs_GutsInitialise() aborted.\n" TENDSTR)));
-@@ -7318,7 +7401,7 @@ int yaffs_GutsInitialise(yaffs_Device *
-
- }
-
--void yaffs_Deinitialise(yaffs_Device * dev)
-+void yaffs_Deinitialise(yaffs_Device *dev)
- {
- if (dev->isMounted) {
- int i;
-@@ -7330,7 +7413,7 @@ void yaffs_Deinitialise(yaffs_Device * d
- dev->srCache) {
-
- for (i = 0; i < dev->nShortOpCaches; i++) {
-- if(dev->srCache[i].data)
-+ if (dev->srCache[i].data)
- YFREE(dev->srCache[i].data);
- dev->srCache[i].data = NULL;
- }
-@@ -7341,16 +7424,17 @@ void yaffs_Deinitialise(yaffs_Device * d
-
- YFREE(dev->gcCleanupList);
-
-- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
-+ for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++)
- YFREE(dev->tempBuffer[i].buffer);
-- }
-
- dev->isMounted = 0;
-- }
-
-+ if (dev->deinitialiseNAND)
-+ dev->deinitialiseNAND(dev);
-+ }
- }
-
--static int yaffs_CountFreeChunks(yaffs_Device * dev)
-+static int yaffs_CountFreeChunks(yaffs_Device *dev)
- {
- int nFree;
- int b;
-@@ -7358,7 +7442,7 @@ static int yaffs_CountFreeChunks(yaffs_D
- yaffs_BlockInfo *blk;
-
- for (nFree = 0, b = dev->internalStartBlock; b <= dev->internalEndBlock;
-- b++) {
-+ b++) {
- blk = yaffs_GetBlockInfo(dev, b);
-
- switch (blk->blockState) {
-@@ -7373,19 +7457,19 @@ static int yaffs_CountFreeChunks(yaffs_D
- default:
- break;
- }
--
- }
-
- return nFree;
- }
-
--int yaffs_GetNumberOfFreeChunks(yaffs_Device * dev)
-+int yaffs_GetNumberOfFreeChunks(yaffs_Device *dev)
- {
- /* This is what we report to the outside world */
-
- int nFree;
- int nDirtyCacheChunks;
- int blocksForCheckpoint;
-+ int i;
-
- #if 1
- nFree = dev->nFreeChunks;
-@@ -7397,12 +7481,9 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De
-
- /* Now count the number of dirty chunks in the cache and subtract those */
-
-- {
-- int i;
-- for (nDirtyCacheChunks = 0, i = 0; i < dev->nShortOpCaches; i++) {
-- if (dev->srCache[i].dirty)
-- nDirtyCacheChunks++;
-- }
-+ for (nDirtyCacheChunks = 0, i = 0; i < dev->nShortOpCaches; i++) {
-+ if (dev->srCache[i].dirty)
-+ nDirtyCacheChunks++;
- }
-
- nFree -= nDirtyCacheChunks;
-@@ -7410,8 +7491,8 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De
- nFree -= ((dev->nReservedBlocks + 1) * dev->nChunksPerBlock);
-
- /* Now we figure out how much to reserve for the checkpoint and report that... */
-- blocksForCheckpoint = dev->nCheckpointReservedBlocks - dev->blocksInCheckpoint;
-- if(blocksForCheckpoint < 0)
-+ blocksForCheckpoint = yaffs_CalcCheckpointBlocksRequired(dev) - dev->blocksInCheckpoint;
-+ if (blocksForCheckpoint < 0)
- blocksForCheckpoint = 0;
-
- nFree -= (blocksForCheckpoint * dev->nChunksPerBlock);
-@@ -7425,12 +7506,12 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De
-
- static int yaffs_freeVerificationFailures;
-
--static void yaffs_VerifyFreeChunks(yaffs_Device * dev)
-+static void yaffs_VerifyFreeChunks(yaffs_Device *dev)
- {
- int counted;
- int difference;
-
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
- counted = yaffs_CountFreeChunks(dev);
-@@ -7447,23 +7528,25 @@ static void yaffs_VerifyFreeChunks(yaffs
-
- /*---------------------------------------- YAFFS test code ----------------------*/
-
--#define yaffs_CheckStruct(structure,syze, name) \
-- if(sizeof(structure) != syze) \
-- { \
-- T(YAFFS_TRACE_ALWAYS,(TSTR("%s should be %d but is %d\n" TENDSTR),\
-- name,syze,sizeof(structure))); \
-- return YAFFS_FAIL; \
-- }
-+#define yaffs_CheckStruct(structure, syze, name) \
-+ do { \
-+ if (sizeof(structure) != syze) { \
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("%s should be %d but is %d\n" TENDSTR),\
-+ name, syze, sizeof(structure))); \
-+ return YAFFS_FAIL; \
-+ } \
-+ } while (0)
-
- static int yaffs_CheckStructures(void)
- {
--/* yaffs_CheckStruct(yaffs_Tags,8,"yaffs_Tags") */
--/* yaffs_CheckStruct(yaffs_TagsUnion,8,"yaffs_TagsUnion") */
--/* yaffs_CheckStruct(yaffs_Spare,16,"yaffs_Spare") */
-+/* yaffs_CheckStruct(yaffs_Tags,8,"yaffs_Tags"); */
-+/* yaffs_CheckStruct(yaffs_TagsUnion,8,"yaffs_TagsUnion"); */
-+/* yaffs_CheckStruct(yaffs_Spare,16,"yaffs_Spare"); */
- #ifndef CONFIG_YAFFS_TNODE_LIST_DEBUG
-- yaffs_CheckStruct(yaffs_Tnode, 2 * YAFFS_NTNODES_LEVEL0, "yaffs_Tnode")
-+ yaffs_CheckStruct(yaffs_Tnode, 2 * YAFFS_NTNODES_LEVEL0, "yaffs_Tnode");
- #endif
-- yaffs_CheckStruct(yaffs_ObjectHeader, 512, "yaffs_ObjectHeader")
--
-- return YAFFS_OK;
-+#ifndef CONFIG_YAFFS_WINCE
-+ yaffs_CheckStruct(yaffs_ObjectHeader, 512, "yaffs_ObjectHeader");
-+#endif
-+ return YAFFS_OK;
- }
---- a/fs/yaffs2/yaffs_guts.h
-+++ b/fs/yaffs2/yaffs_guts.h
-@@ -90,7 +90,7 @@
-
- #define YAFFS_MAX_SHORT_OP_CACHES 20
-
--#define YAFFS_N_TEMP_BUFFERS 4
-+#define YAFFS_N_TEMP_BUFFERS 6
-
- /* We limit the number attempts at sucessfully saving a chunk of data.
- * Small-page devices have 32 pages per block; large-page devices have 64.
-@@ -108,6 +108,9 @@
- #define YAFFS_LOWEST_SEQUENCE_NUMBER 0x00001000
- #define YAFFS_HIGHEST_SEQUENCE_NUMBER 0xEFFFFF00
-
-+/* Special sequence number for bad block that failed to be marked bad */
-+#define YAFFS_SEQUENCE_BAD_BLOCK 0xFFFF0000
-+
- /* ChunkCache is used for short read/write operations.*/
- typedef struct {
- struct yaffs_ObjectStruct *object;
-@@ -134,11 +137,10 @@ typedef struct {
- typedef struct {
- unsigned chunkId:20;
- unsigned serialNumber:2;
-- unsigned byteCount:10;
-+ unsigned byteCountLSB:10;
- unsigned objectId:18;
- unsigned ecc:12;
-- unsigned unusedStuff:2;
--
-+ unsigned byteCountMSB:2;
- } yaffs_Tags;
-
- typedef union {
-@@ -277,13 +279,13 @@ typedef struct {
-
- int softDeletions:10; /* number of soft deleted pages */
- int pagesInUse:10; /* number of pages in use */
-- yaffs_BlockState blockState:4; /* One of the above block states */
-+ unsigned blockState:4; /* One of the above block states. NB use unsigned because enum is sometimes an int */
- __u32 needsRetiring:1; /* Data has failed on this block, need to get valid data off */
-- /* and retire the block. */
-- __u32 skipErasedCheck: 1; /* If this is set we can skip the erased check on this block */
-- __u32 gcPrioritise: 1; /* An ECC check or blank check has failed on this block.
-+ /* and retire the block. */
-+ __u32 skipErasedCheck:1; /* If this is set we can skip the erased check on this block */
-+ __u32 gcPrioritise:1; /* An ECC check or blank check has failed on this block.
- It should be prioritised for GC */
-- __u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */
-+ __u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */
-
- #ifdef CONFIG_YAFFS_YAFFS2
- __u32 hasShrinkHeader:1; /* This block has at least one shrink object header */
-@@ -300,11 +302,11 @@ typedef struct {
-
- /* Apply to everything */
- int parentObjectId;
-- __u16 sum__NoLongerUsed; /* checksum of name. No longer used */
-+ __u16 sum__NoLongerUsed; /* checksum of name. No longer used */
- YCHAR name[YAFFS_MAX_NAME_LENGTH + 1];
-
-- /* Thes following apply to directories, files, symlinks - not hard links */
-- __u32 yst_mode; /* protection */
-+ /* The following apply to directories, files, symlinks - not hard links */
-+ __u32 yst_mode; /* protection */
-
- #ifdef CONFIG_YAFFS_WINCE
- __u32 notForWinCE[5];
-@@ -331,11 +333,14 @@ typedef struct {
- __u32 win_ctime[2];
- __u32 win_atime[2];
- __u32 win_mtime[2];
-- __u32 roomToGrow[4];
- #else
-- __u32 roomToGrow[10];
-+ __u32 roomToGrow[6];
-+
- #endif
-+ __u32 inbandShadowsObject;
-+ __u32 inbandIsShrink;
-
-+ __u32 reservedSpace[2];
- int shadowsObject; /* This object header shadows the specified object if > 0 */
-
- /* isShrink applies to object headers written when we shrink the file (ie resize) */
-@@ -381,7 +386,7 @@ typedef struct {
- } yaffs_FileStructure;
-
- typedef struct {
-- struct list_head children; /* list of child links */
-+ struct ylist_head children; /* list of child links */
- } yaffs_DirectoryStructure;
-
- typedef struct {
-@@ -418,23 +423,24 @@ struct yaffs_ObjectStruct {
- * still in the inode cache. Free of object is defered.
- * until the inode is released.
- */
-+ __u8 beingCreated:1; /* This object is still being created so skip some checks. */
-
- __u8 serial; /* serial number of chunk in NAND. Cached here */
- __u16 sum; /* sum of the name to speed searching */
-
-- struct yaffs_DeviceStruct *myDev; /* The device I'm on */
-+ struct yaffs_DeviceStruct *myDev; /* The device I'm on */
-
-- struct list_head hashLink; /* list of objects in this hash bucket */
-+ struct ylist_head hashLink; /* list of objects in this hash bucket */
-
-- struct list_head hardLinks; /* all the equivalent hard linked objects */
-+ struct ylist_head hardLinks; /* all the equivalent hard linked objects */
-
- /* directory structure stuff */
- /* also used for linking up the free list */
- struct yaffs_ObjectStruct *parent;
-- struct list_head siblings;
-+ struct ylist_head siblings;
-
- /* Where's my object header in NAND? */
-- int chunkId;
-+ int hdrChunk;
-
- int nDataChunks; /* Number of data chunks attached to the file. */
-
-@@ -485,7 +491,7 @@ struct yaffs_ObjectList_struct {
- typedef struct yaffs_ObjectList_struct yaffs_ObjectList;
-
- typedef struct {
-- struct list_head list;
-+ struct ylist_head list;
- int count;
- } yaffs_ObjectBucket;
-
-@@ -495,11 +501,10 @@ typedef struct {
- */
-
- typedef struct {
-- int structType;
-+ int structType;
- __u32 objectId;
- __u32 parentId;
-- int chunkId;
--
-+ int hdrChunk;
- yaffs_ObjectType variantType:3;
- __u8 deleted:1;
- __u8 softDeleted:1;
-@@ -511,8 +516,7 @@ typedef struct {
-
- int nDataChunks;
- __u32 fileSizeOrEquivalentObjectId;
--
--}yaffs_CheckpointObject;
-+} yaffs_CheckpointObject;
-
- /*--------------------- Temporary buffers ----------------
- *
-@@ -528,13 +532,13 @@ typedef struct {
- /*----------------- Device ---------------------------------*/
-
- struct yaffs_DeviceStruct {
-- struct list_head devList;
-+ struct ylist_head devList;
- const char *name;
-
- /* Entry parameters set up way early. Yaffs sets up the rest.*/
- int nDataBytesPerChunk; /* Should be a power of 2 >= 512 */
- int nChunksPerBlock; /* does not need to be a power of 2 */
-- int nBytesPerSpare; /* spare area size */
-+ int spareBytesPerChunk; /* spare area size */
- int startBlock; /* Start block we're allowed to use */
- int endBlock; /* End block we're allowed to use */
- int nReservedBlocks; /* We want this tuneable so that we can reduce */
-@@ -544,9 +548,7 @@ struct yaffs_DeviceStruct {
- /* Stuff used by the shared space checkpointing mechanism */
- /* If this value is zero, then this mechanism is disabled */
-
-- int nCheckpointReservedBlocks; /* Blocks to reserve for checkpoint data */
--
--
-+/* int nCheckpointReservedBlocks; */ /* Blocks to reserve for checkpoint data */
-
-
- int nShortOpCaches; /* If <= 0, then short op caching is disabled, else
-@@ -560,30 +562,31 @@ struct yaffs_DeviceStruct {
- void *genericDevice; /* Pointer to device context
- * On an mtd this holds the mtd pointer.
- */
-- void *superBlock;
-+ void *superBlock;
-
- /* NAND access functions (Must be set before calling YAFFS)*/
-
-- int (*writeChunkToNAND) (struct yaffs_DeviceStruct * dev,
-- int chunkInNAND, const __u8 * data,
-- const yaffs_Spare * spare);
-- int (*readChunkFromNAND) (struct yaffs_DeviceStruct * dev,
-- int chunkInNAND, __u8 * data,
-- yaffs_Spare * spare);
-- int (*eraseBlockInNAND) (struct yaffs_DeviceStruct * dev,
-- int blockInNAND);
-- int (*initialiseNAND) (struct yaffs_DeviceStruct * dev);
-+ int (*writeChunkToNAND) (struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND, const __u8 *data,
-+ const yaffs_Spare *spare);
-+ int (*readChunkFromNAND) (struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND, __u8 *data,
-+ yaffs_Spare *spare);
-+ int (*eraseBlockInNAND) (struct yaffs_DeviceStruct *dev,
-+ int blockInNAND);
-+ int (*initialiseNAND) (struct yaffs_DeviceStruct *dev);
-+ int (*deinitialiseNAND) (struct yaffs_DeviceStruct *dev);
-
- #ifdef CONFIG_YAFFS_YAFFS2
-- int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct * dev,
-- int chunkInNAND, const __u8 * data,
-- const yaffs_ExtendedTags * tags);
-- int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct * dev,
-- int chunkInNAND, __u8 * data,
-- yaffs_ExtendedTags * tags);
-- int (*markNANDBlockBad) (struct yaffs_DeviceStruct * dev, int blockNo);
-- int (*queryNANDBlock) (struct yaffs_DeviceStruct * dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber);
-+ int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND, const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
-+ int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND, __u8 *data,
-+ yaffs_ExtendedTags *tags);
-+ int (*markNANDBlockBad) (struct yaffs_DeviceStruct *dev, int blockNo);
-+ int (*queryNANDBlock) (struct yaffs_DeviceStruct *dev, int blockNo,
-+ yaffs_BlockState *state, __u32 *sequenceNumber);
- #endif
-
- int isYaffs2;
-@@ -595,10 +598,12 @@ struct yaffs_DeviceStruct {
- void (*removeObjectCallback)(struct yaffs_ObjectStruct *obj);
-
- /* Callback to mark the superblock dirsty */
-- void (*markSuperBlockDirty)(void * superblock);
-+ void (*markSuperBlockDirty)(void *superblock);
-
- int wideTnodesDisabled; /* Set to disable wide tnodes */
-
-+ YCHAR *pathDividers; /* String of legal path dividers */
-+
-
- /* End of stuff that must be set before initialisation. */
-
-@@ -615,16 +620,14 @@ struct yaffs_DeviceStruct {
- __u32 tnodeWidth;
- __u32 tnodeMask;
-
-- /* Stuff to support various file offses to chunk/offset translations */
-- /* "Crumbs" for nDataBytesPerChunk not being a power of 2 */
-- __u32 crumbMask;
-- __u32 crumbShift;
-- __u32 crumbsPerChunk;
--
-- /* Straight shifting for nDataBytesPerChunk being a power of 2 */
-- __u32 chunkShift;
-- __u32 chunkMask;
--
-+ /* Stuff for figuring out file offset to chunk conversions */
-+ __u32 chunkShift; /* Shift value */
-+ __u32 chunkDiv; /* Divisor after shifting: 1 for power-of-2 sizes */
-+ __u32 chunkMask; /* Mask to use for power-of-2 case */
-+
-+ /* Stuff to handle inband tags */
-+ int inbandTags;
-+ __u32 totalBytesPerChunk;
-
- #ifdef __KERNEL__
-
-@@ -633,7 +636,7 @@ struct yaffs_DeviceStruct {
- __u8 *spareBuffer; /* For mtdif2 use. Don't know the size of the buffer
- * at compile time so we have to allocate it.
- */
-- void (*putSuperFunc) (struct super_block * sb);
-+ void (*putSuperFunc) (struct super_block *sb);
- #endif
-
- int isMounted;
-@@ -663,6 +666,8 @@ struct yaffs_DeviceStruct {
- __u32 checkpointSum;
- __u32 checkpointXor;
-
-+ int nCheckpointBlocksRequired; /* Number of blocks needed to store current checkpoint set */
-+
- /* Block Info */
- yaffs_BlockInfo *blockInfo;
- __u8 *chunkBits; /* bitmap of chunks in use */
-@@ -684,11 +689,15 @@ struct yaffs_DeviceStruct {
- yaffs_TnodeList *allocatedTnodeList;
-
- int isDoingGC;
-+ int gcBlock;
-+ int gcChunk;
-
- int nObjectsCreated;
- yaffs_Object *freeObjects;
- int nFreeObjects;
-
-+ int nHardLinks;
-+
- yaffs_ObjectList *allocatedObjectList;
-
- yaffs_ObjectBucket objectBucket[YAFFS_NOBJECT_BUCKETS];
-@@ -745,8 +754,10 @@ struct yaffs_DeviceStruct {
- int nBackgroundDeletions; /* Count of background deletions. */
-
-
-+ /* Temporary buffer management */
- yaffs_TempBuffer tempBuffer[YAFFS_N_TEMP_BUFFERS];
- int maxTemp;
-+ int tempInUse;
- int unmanagedTempAllocations;
- int unmanagedTempDeallocations;
-
-@@ -758,9 +769,9 @@ struct yaffs_DeviceStruct {
-
- typedef struct yaffs_DeviceStruct yaffs_Device;
-
--/* The static layout of bllock usage etc is stored in the super block header */
-+/* The static layout of block usage etc is stored in the super block header */
- typedef struct {
-- int StructType;
-+ int StructType;
- int version;
- int checkpointStartBlock;
- int checkpointEndBlock;
-@@ -773,7 +784,7 @@ typedef struct {
- * must be preserved over unmount/mount cycles.
- */
- typedef struct {
-- int structType;
-+ int structType;
- int nErasedBlocks;
- int allocationBlock; /* Current block being allocated off */
- __u32 allocationPage;
-@@ -791,57 +802,45 @@ typedef struct {
-
-
- typedef struct {
-- int structType;
-- __u32 magic;
-- __u32 version;
-- __u32 head;
-+ int structType;
-+ __u32 magic;
-+ __u32 version;
-+ __u32 head;
- } yaffs_CheckpointValidity;
-
--/* Function to manipulate block info */
--static Y_INLINE yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blk)
--{
-- if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) {
-- T(YAFFS_TRACE_ERROR,
-- (TSTR
-- ("**>> yaffs: getBlockInfo block %d is not valid" TENDSTR),
-- blk));
-- YBUG();
-- }
-- return &dev->blockInfo[blk - dev->internalStartBlock];
--}
-
- /*----------------------- YAFFS Functions -----------------------*/
-
--int yaffs_GutsInitialise(yaffs_Device * dev);
--void yaffs_Deinitialise(yaffs_Device * dev);
-+int yaffs_GutsInitialise(yaffs_Device *dev);
-+void yaffs_Deinitialise(yaffs_Device *dev);
-
--int yaffs_GetNumberOfFreeChunks(yaffs_Device * dev);
-+int yaffs_GetNumberOfFreeChunks(yaffs_Device *dev);
-
--int yaffs_RenameObject(yaffs_Object * oldDir, const YCHAR * oldName,
-- yaffs_Object * newDir, const YCHAR * newName);
-+int yaffs_RenameObject(yaffs_Object *oldDir, const YCHAR *oldName,
-+ yaffs_Object *newDir, const YCHAR *newName);
-
--int yaffs_Unlink(yaffs_Object * dir, const YCHAR * name);
--int yaffs_DeleteFile(yaffs_Object * obj);
-+int yaffs_Unlink(yaffs_Object *dir, const YCHAR *name);
-+int yaffs_DeleteObject(yaffs_Object *obj);
-
--int yaffs_GetObjectName(yaffs_Object * obj, YCHAR * name, int buffSize);
--int yaffs_GetObjectFileLength(yaffs_Object * obj);
--int yaffs_GetObjectInode(yaffs_Object * obj);
--unsigned yaffs_GetObjectType(yaffs_Object * obj);
--int yaffs_GetObjectLinkCount(yaffs_Object * obj);
-+int yaffs_GetObjectName(yaffs_Object *obj, YCHAR *name, int buffSize);
-+int yaffs_GetObjectFileLength(yaffs_Object *obj);
-+int yaffs_GetObjectInode(yaffs_Object *obj);
-+unsigned yaffs_GetObjectType(yaffs_Object *obj);
-+int yaffs_GetObjectLinkCount(yaffs_Object *obj);
-
--int yaffs_SetAttributes(yaffs_Object * obj, struct iattr *attr);
--int yaffs_GetAttributes(yaffs_Object * obj, struct iattr *attr);
-+int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr);
-+int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr);
-
- /* File operations */
--int yaffs_ReadDataFromFile(yaffs_Object * obj, __u8 * buffer, loff_t offset,
-- int nBytes);
--int yaffs_WriteDataToFile(yaffs_Object * obj, const __u8 * buffer, loff_t offset,
-- int nBytes, int writeThrough);
--int yaffs_ResizeFile(yaffs_Object * obj, loff_t newSize);
--
--yaffs_Object *yaffs_MknodFile(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid);
--int yaffs_FlushFile(yaffs_Object * obj, int updateTime);
-+int yaffs_ReadDataFromFile(yaffs_Object *obj, __u8 *buffer, loff_t offset,
-+ int nBytes);
-+int yaffs_WriteDataToFile(yaffs_Object *obj, const __u8 *buffer, loff_t offset,
-+ int nBytes, int writeThrough);
-+int yaffs_ResizeFile(yaffs_Object *obj, loff_t newSize);
-+
-+yaffs_Object *yaffs_MknodFile(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid);
-+int yaffs_FlushFile(yaffs_Object *obj, int updateTime);
-
- /* Flushing and checkpointing */
- void yaffs_FlushEntireDeviceCache(yaffs_Device *dev);
-@@ -850,33 +849,33 @@ int yaffs_CheckpointSave(yaffs_Device *d
- int yaffs_CheckpointRestore(yaffs_Device *dev);
-
- /* Directory operations */
--yaffs_Object *yaffs_MknodDirectory(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid);
--yaffs_Object *yaffs_FindObjectByName(yaffs_Object * theDir, const YCHAR * name);
--int yaffs_ApplyToDirectoryChildren(yaffs_Object * theDir,
-+yaffs_Object *yaffs_MknodDirectory(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid);
-+yaffs_Object *yaffs_FindObjectByName(yaffs_Object *theDir, const YCHAR *name);
-+int yaffs_ApplyToDirectoryChildren(yaffs_Object *theDir,
- int (*fn) (yaffs_Object *));
-
--yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device * dev, __u32 number);
-+yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev, __u32 number);
-
- /* Link operations */
--yaffs_Object *yaffs_Link(yaffs_Object * parent, const YCHAR * name,
-- yaffs_Object * equivalentObject);
-+yaffs_Object *yaffs_Link(yaffs_Object *parent, const YCHAR *name,
-+ yaffs_Object *equivalentObject);
-
--yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object * obj);
-+yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj);
-
- /* Symlink operations */
--yaffs_Object *yaffs_MknodSymLink(yaffs_Object * parent, const YCHAR * name,
-+yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent, const YCHAR *name,
- __u32 mode, __u32 uid, __u32 gid,
-- const YCHAR * alias);
--YCHAR *yaffs_GetSymlinkAlias(yaffs_Object * obj);
-+ const YCHAR *alias);
-+YCHAR *yaffs_GetSymlinkAlias(yaffs_Object *obj);
-
- /* Special inodes (fifos, sockets and devices) */
--yaffs_Object *yaffs_MknodSpecial(yaffs_Object * parent, const YCHAR * name,
-+yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent, const YCHAR *name,
- __u32 mode, __u32 uid, __u32 gid, __u32 rdev);
-
- /* Special directories */
--yaffs_Object *yaffs_Root(yaffs_Device * dev);
--yaffs_Object *yaffs_LostNFound(yaffs_Device * dev);
-+yaffs_Object *yaffs_Root(yaffs_Device *dev);
-+yaffs_Object *yaffs_LostNFound(yaffs_Device *dev);
-
- #ifdef CONFIG_YAFFS_WINCE
- /* CONFIG_YAFFS_WINCE special stuff */
-@@ -885,18 +884,21 @@ void yfsd_WinFileTimeNow(__u32 target[2]
-
- #ifdef __KERNEL__
-
--void yaffs_HandleDeferedFree(yaffs_Object * obj);
-+void yaffs_HandleDeferedFree(yaffs_Object *obj);
- #endif
-
- /* Debug dump */
--int yaffs_DumpObject(yaffs_Object * obj);
-+int yaffs_DumpObject(yaffs_Object *obj);
-
--void yaffs_GutsTest(yaffs_Device * dev);
-+void yaffs_GutsTest(yaffs_Device *dev);
-
- /* A few useful functions */
--void yaffs_InitialiseTags(yaffs_ExtendedTags * tags);
--void yaffs_DeleteChunk(yaffs_Device * dev, int chunkId, int markNAND, int lyn);
--int yaffs_CheckFF(__u8 * buffer, int nBytes);
-+void yaffs_InitialiseTags(yaffs_ExtendedTags *tags);
-+void yaffs_DeleteChunk(yaffs_Device *dev, int chunkId, int markNAND, int lyn);
-+int yaffs_CheckFF(__u8 *buffer, int nBytes);
- void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi);
-
-+__u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo);
-+void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer, int lineNo);
-+
- #endif
---- a/fs/yaffs2/yaffs_mtdif1.c
-+++ b/fs/yaffs2/yaffs_mtdif1.c
-@@ -26,7 +26,7 @@
- #include "yportenv.h"
- #include "yaffs_guts.h"
- #include "yaffs_packedtags1.h"
--#include "yaffs_tagscompat.h" // for yaffs_CalcTagsECC
-+#include "yaffs_tagscompat.h" /* for yaffs_CalcTagsECC */
-
- #include "linux/kernel.h"
- #include "linux/version.h"
-@@ -34,9 +34,9 @@
- #include "linux/mtd/mtd.h"
-
- /* Don't compile this module if we don't have MTD's mtd_oob_ops interface */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
-
--const char *yaffs_mtdif1_c_version = "$Id: yaffs_mtdif1.c,v 1.3 2007/05/15 20:16:11 ian Exp $";
-+const char *yaffs_mtdif1_c_version = "$Id: yaffs_mtdif1.c,v 1.10 2009-03-09 07:41:10 charles Exp $";
-
- #ifndef CONFIG_YAFFS_9BYTE_TAGS
- # define YTAG1_SIZE 8
-@@ -89,9 +89,9 @@ static struct nand_ecclayout nand_oob_16
- * Returns YAFFS_OK or YAFFS_FAIL.
- */
- int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device *dev,
-- int chunkInNAND, const __u8 * data, const yaffs_ExtendedTags * etags)
-+ int chunkInNAND, const __u8 *data, const yaffs_ExtendedTags *etags)
- {
-- struct mtd_info * mtd = dev->genericDevice;
-+ struct mtd_info *mtd = dev->genericDevice;
- int chunkBytes = dev->nDataBytesPerChunk;
- loff_t addr = ((loff_t)chunkInNAND) * chunkBytes;
- struct mtd_oob_ops ops;
-@@ -146,7 +146,7 @@ int nandmtd1_WriteChunkWithTagsToNAND(ya
-
- /* Return with empty ExtendedTags but add eccResult.
- */
--static int rettags(yaffs_ExtendedTags * etags, int eccResult, int retval)
-+static int rettags(yaffs_ExtendedTags *etags, int eccResult, int retval)
- {
- if (etags) {
- memset(etags, 0, sizeof(*etags));
-@@ -169,9 +169,9 @@ static int rettags(yaffs_ExtendedTags *
- * Returns YAFFS_OK or YAFFS_FAIL.
- */
- int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device *dev,
-- int chunkInNAND, __u8 * data, yaffs_ExtendedTags * etags)
-+ int chunkInNAND, __u8 *data, yaffs_ExtendedTags *etags)
- {
-- struct mtd_info * mtd = dev->genericDevice;
-+ struct mtd_info *mtd = dev->genericDevice;
- int chunkBytes = dev->nDataBytesPerChunk;
- loff_t addr = ((loff_t)chunkInNAND) * chunkBytes;
- int eccres = YAFFS_ECC_RESULT_NO_ERROR;
-@@ -189,7 +189,7 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y
- ops.datbuf = data;
- ops.oobbuf = (__u8 *)&pt1;
-
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
-+#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 20))
- /* In MTD 2.6.18 to 2.6.19 nand_base.c:nand_do_read_oob() has a bug;
- * help it out with ops.len = ops.ooblen when ops.datbuf == NULL.
- */
-@@ -284,11 +284,11 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y
- */
- int nandmtd1_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo)
- {
-- struct mtd_info * mtd = dev->genericDevice;
-+ struct mtd_info *mtd = dev->genericDevice;
- int blocksize = dev->nChunksPerBlock * dev->nDataBytesPerChunk;
- int retval;
-
-- yaffs_trace(YAFFS_TRACE_BAD_BLOCKS, "marking block %d bad", blockNo);
-+ yaffs_trace(YAFFS_TRACE_BAD_BLOCKS, "marking block %d bad\n", blockNo);
-
- retval = mtd->block_markbad(mtd, (loff_t)blocksize * blockNo);
- return (retval) ? YAFFS_FAIL : YAFFS_OK;
-@@ -298,7 +298,7 @@ int nandmtd1_MarkNANDBlockBad(struct yaf
- *
- * Returns YAFFS_OK or YAFFS_FAIL.
- */
--static int nandmtd1_TestPrerequists(struct mtd_info * mtd)
-+static int nandmtd1_TestPrerequists(struct mtd_info *mtd)
- {
- /* 2.6.18 has mtd->ecclayout->oobavail */
- /* 2.6.21 has mtd->ecclayout->oobavail and mtd->oobavail */
-@@ -323,10 +323,11 @@ static int nandmtd1_TestPrerequists(stru
- * Always returns YAFFS_OK.
- */
- int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * pState, int *pSequenceNumber)
-+ yaffs_BlockState *pState, __u32 *pSequenceNumber)
- {
-- struct mtd_info * mtd = dev->genericDevice;
-+ struct mtd_info *mtd = dev->genericDevice;
- int chunkNo = blockNo * dev->nChunksPerBlock;
-+ loff_t addr = (loff_t)chunkNo * dev->nDataBytesPerChunk;
- yaffs_ExtendedTags etags;
- int state = YAFFS_BLOCK_STATE_DEAD;
- int seqnum = 0;
-@@ -335,21 +336,22 @@ int nandmtd1_QueryNANDBlock(struct yaffs
- /* We don't yet have a good place to test for MTD config prerequists.
- * Do it here as we are called during the initial scan.
- */
-- if (nandmtd1_TestPrerequists(mtd) != YAFFS_OK) {
-+ if (nandmtd1_TestPrerequists(mtd) != YAFFS_OK)
- return YAFFS_FAIL;
-- }
-
- retval = nandmtd1_ReadChunkWithTagsFromNAND(dev, chunkNo, NULL, &etags);
-+ etags.blockBad = (mtd->block_isbad)(mtd, addr);
- if (etags.blockBad) {
- yaffs_trace(YAFFS_TRACE_BAD_BLOCKS,
-- "block %d is marked bad", blockNo);
-+ "block %d is marked bad\n", blockNo);
- state = YAFFS_BLOCK_STATE_DEAD;
-- }
-- else if (etags.chunkUsed) {
-+ } else if (etags.eccResult != YAFFS_ECC_RESULT_NO_ERROR) {
-+ /* bad tags, need to look more closely */
-+ state = YAFFS_BLOCK_STATE_NEEDS_SCANNING;
-+ } else if (etags.chunkUsed) {
- state = YAFFS_BLOCK_STATE_NEEDS_SCANNING;
- seqnum = etags.sequenceNumber;
-- }
-- else {
-+ } else {
- state = YAFFS_BLOCK_STATE_EMPTY;
- }
-
-@@ -360,4 +362,4 @@ int nandmtd1_QueryNANDBlock(struct yaffs
- return YAFFS_OK;
- }
-
--#endif /*KERNEL_VERSION*/
-+#endif /*MTD_VERSION*/
---- a/fs/yaffs2/yaffs_mtdif1.h
-+++ b/fs/yaffs2/yaffs_mtdif1.h
-@@ -14,15 +14,15 @@
- #ifndef __YAFFS_MTDIF1_H__
- #define __YAFFS_MTDIF1_H__
-
--int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data, const yaffs_ExtendedTags * tags);
-+int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data, const yaffs_ExtendedTags *tags);
-
--int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * data, yaffs_ExtendedTags * tags);
-+int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *data, yaffs_ExtendedTags *tags);
-
- int nandmtd1_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo);
-
- int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber);
-+ yaffs_BlockState *state, __u32 *sequenceNumber);
-
- #endif
---- a/fs/yaffs2/yaffs_mtdif2.c
-+++ b/fs/yaffs2/yaffs_mtdif2.c
-@@ -14,7 +14,7 @@
- /* mtd interface for YAFFS2 */
-
- const char *yaffs_mtdif2_c_version =
-- "$Id: yaffs_mtdif2.c,v 1.17 2007-02-14 01:09:06 wookey Exp $";
-+ "$Id: yaffs_mtdif2.c,v 1.23 2009-03-06 17:20:53 wookey Exp $";
-
- #include "yportenv.h"
-
-@@ -27,19 +27,23 @@ const char *yaffs_mtdif2_c_version =
-
- #include "yaffs_packedtags2.h"
-
--int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags * tags)
-+/* NB For use with inband tags....
-+ * We assume that the data buffer is of size totalBytersPerChunk so that we can also
-+ * use it to load the tags.
-+ */
-+int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- struct mtd_oob_ops ops;
- #else
- size_t dummy;
- #endif
- int retval = 0;
-
-- loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk;
-+ loff_t addr;
-
- yaffs_PackedTags2 pt;
-
-@@ -48,46 +52,40 @@ int nandmtd2_WriteChunkWithTagsToNAND(ya
- ("nandmtd2_WriteChunkWithTagsToNAND chunk %d data %p tags %p"
- TENDSTR), chunkInNAND, data, tags));
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- if (tags)
-- yaffs_PackTags2(&pt, tags);
-- else
-- BUG(); /* both tags and data should always be present */
-
-- if (data) {
-- ops.mode = MTD_OOB_AUTO;
-- ops.ooblen = sizeof(pt);
-- ops.len = dev->nDataBytesPerChunk;
-- ops.ooboffs = 0;
-- ops.datbuf = (__u8 *)data;
-- ops.oobbuf = (void *)&pt;
-- retval = mtd->write_oob(mtd, addr, &ops);
-+ addr = ((loff_t) chunkInNAND) * dev->totalBytesPerChunk;
-+
-+ /* For yaffs2 writing there must be both data and tags.
-+ * If we're using inband tags, then the tags are stuffed into
-+ * the end of the data buffer.
-+ */
-+ if (!data || !tags)
-+ BUG();
-+ else if (dev->inbandTags) {
-+ yaffs_PackedTags2TagsPart *pt2tp;
-+ pt2tp = (yaffs_PackedTags2TagsPart *)(data + dev->nDataBytesPerChunk);
-+ yaffs_PackTags2TagsPart(pt2tp, tags);
- } else
-- BUG(); /* both tags and data should always be present */
--#else
-- if (tags) {
- yaffs_PackTags2(&pt, tags);
-- }
-
-- if (data && tags) {
-- if (dev->useNANDECC)
-- retval =
-- mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk,
-- &dummy, data, (__u8 *) & pt, NULL);
-- else
-- retval =
-- mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk,
-- &dummy, data, (__u8 *) & pt, NULL);
-- } else {
-- if (data)
-- retval =
-- mtd->write(mtd, addr, dev->nDataBytesPerChunk, &dummy,
-- data);
-- if (tags)
-- retval =
-- mtd->write_oob(mtd, addr, mtd->oobsize, &dummy,
-- (__u8 *) & pt);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
-+ ops.mode = MTD_OOB_AUTO;
-+ ops.ooblen = (dev->inbandTags) ? 0 : sizeof(pt);
-+ ops.len = dev->totalBytesPerChunk;
-+ ops.ooboffs = 0;
-+ ops.datbuf = (__u8 *)data;
-+ ops.oobbuf = (dev->inbandTags) ? NULL : (void *)&pt;
-+ retval = mtd->write_oob(mtd, addr, &ops);
-
-+#else
-+ if (!dev->inbandTags) {
-+ retval =
-+ mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk,
-+ &dummy, data, (__u8 *) &pt, NULL);
-+ } else {
-+ retval =
-+ mtd->write(mtd, addr, dev->totalBytesPerChunk, &dummy,
-+ data);
- }
- #endif
-
-@@ -97,17 +95,18 @@ int nandmtd2_WriteChunkWithTagsToNAND(ya
- return YAFFS_FAIL;
- }
-
--int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * data, yaffs_ExtendedTags * tags)
-+int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *data, yaffs_ExtendedTags *tags)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- struct mtd_oob_ops ops;
- #endif
- size_t dummy;
- int retval = 0;
-+ int localData = 0;
-
-- loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk;
-+ loff_t addr = ((loff_t) chunkInNAND) * dev->totalBytesPerChunk;
-
- yaffs_PackedTags2 pt;
-
-@@ -116,9 +115,20 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y
- ("nandmtd2_ReadChunkWithTagsFromNAND chunk %d data %p tags %p"
- TENDSTR), chunkInNAND, data, tags));
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- if (data && !tags)
-- retval = mtd->read(mtd, addr, dev->nDataBytesPerChunk,
-+ if (dev->inbandTags) {
-+
-+ if (!data) {
-+ localData = 1;
-+ data = yaffs_GetTempBuffer(dev, __LINE__);
-+ }
-+
-+
-+ }
-+
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
-+ if (dev->inbandTags || (data && !tags))
-+ retval = mtd->read(mtd, addr, dev->totalBytesPerChunk,
- &dummy, data);
- else if (tags) {
- ops.mode = MTD_OOB_AUTO;
-@@ -130,38 +140,42 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y
- retval = mtd->read_oob(mtd, addr, &ops);
- }
- #else
-- if (data && tags) {
-- if (dev->useNANDECC) {
-- retval =
-- mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk,
-- &dummy, data, dev->spareBuffer,
-- NULL);
-- } else {
-- retval =
-- mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk,
-+ if (!dev->inbandTags && data && tags) {
-+
-+ retval = mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk,
- &dummy, data, dev->spareBuffer,
- NULL);
-- }
- } else {
- if (data)
- retval =
- mtd->read(mtd, addr, dev->nDataBytesPerChunk, &dummy,
- data);
-- if (tags)
-+ if (!dev->inbandTags && tags)
- retval =
- mtd->read_oob(mtd, addr, mtd->oobsize, &dummy,
- dev->spareBuffer);
- }
- #endif
-
-- memcpy(&pt, dev->spareBuffer, sizeof(pt));
-
-- if (tags)
-- yaffs_UnpackTags2(tags, &pt);
-+ if (dev->inbandTags) {
-+ if (tags) {
-+ yaffs_PackedTags2TagsPart *pt2tp;
-+ pt2tp = (yaffs_PackedTags2TagsPart *)&data[dev->nDataBytesPerChunk];
-+ yaffs_UnpackTags2TagsPart(tags, pt2tp);
-+ }
-+ } else {
-+ if (tags) {
-+ memcpy(&pt, dev->spareBuffer, sizeof(pt));
-+ yaffs_UnpackTags2(tags, &pt);
-+ }
-+ }
-
-- if(tags && retval == -EBADMSG && tags->eccResult == YAFFS_ECC_RESULT_NO_ERROR)
-- tags->eccResult = YAFFS_ECC_RESULT_UNFIXED;
-+ if (localData)
-+ yaffs_ReleaseTempBuffer(dev, data, __LINE__);
-
-+ if (tags && retval == -EBADMSG && tags->eccResult == YAFFS_ECC_RESULT_NO_ERROR)
-+ tags->eccResult = YAFFS_ECC_RESULT_UNFIXED;
- if (retval == 0)
- return YAFFS_OK;
- else
-@@ -178,7 +192,7 @@ int nandmtd2_MarkNANDBlockBad(struct yaf
- retval =
- mtd->block_markbad(mtd,
- blockNo * dev->nChunksPerBlock *
-- dev->nDataBytesPerChunk);
-+ dev->totalBytesPerChunk);
-
- if (retval == 0)
- return YAFFS_OK;
-@@ -188,7 +202,7 @@ int nandmtd2_MarkNANDBlockBad(struct yaf
- }
-
- int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber)
-+ yaffs_BlockState *state, __u32 *sequenceNumber)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
- int retval;
-@@ -198,7 +212,7 @@ int nandmtd2_QueryNANDBlock(struct yaffs
- retval =
- mtd->block_isbad(mtd,
- blockNo * dev->nChunksPerBlock *
-- dev->nDataBytesPerChunk);
-+ dev->totalBytesPerChunk);
-
- if (retval) {
- T(YAFFS_TRACE_MTD, (TSTR("block is bad" TENDSTR)));
---- a/fs/yaffs2/yaffs_mtdif2.h
-+++ b/fs/yaffs2/yaffs_mtdif2.h
-@@ -17,13 +17,13 @@
- #define __YAFFS_MTDIF2_H__
-
- #include "yaffs_guts.h"
--int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags * tags);
--int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * data, yaffs_ExtendedTags * tags);
-+int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
-+int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *data, yaffs_ExtendedTags *tags);
- int nandmtd2_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo);
- int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber);
-+ yaffs_BlockState *state, __u32 *sequenceNumber);
-
- #endif
---- a/fs/yaffs2/yaffs_mtdif.c
-+++ b/fs/yaffs2/yaffs_mtdif.c
-@@ -12,7 +12,7 @@
- */
-
- const char *yaffs_mtdif_c_version =
-- "$Id: yaffs_mtdif.c,v 1.19 2007-02-14 01:09:06 wookey Exp $";
-+ "$Id: yaffs_mtdif.c,v 1.22 2009-03-06 17:20:51 wookey Exp $";
-
- #include "yportenv.h"
-
-@@ -24,7 +24,7 @@ const char *yaffs_mtdif_c_version =
- #include "linux/time.h"
- #include "linux/mtd/nand.h"
-
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18))
-+#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 18))
- static struct nand_oobinfo yaffs_oobinfo = {
- .useecc = 1,
- .eccbytes = 6,
-@@ -36,7 +36,7 @@ static struct nand_oobinfo yaffs_noeccin
- };
- #endif
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- static inline void translate_spare2oob(const yaffs_Spare *spare, __u8 *oob)
- {
- oob[0] = spare->tagByte0;
-@@ -45,8 +45,8 @@ static inline void translate_spare2oob(c
- oob[3] = spare->tagByte3;
- oob[4] = spare->tagByte4;
- oob[5] = spare->tagByte5 & 0x3f;
-- oob[5] |= spare->blockStatus == 'Y' ? 0: 0x80;
-- oob[5] |= spare->pageStatus == 0 ? 0: 0x40;
-+ oob[5] |= spare->blockStatus == 'Y' ? 0 : 0x80;
-+ oob[5] |= spare->pageStatus == 0 ? 0 : 0x40;
- oob[6] = spare->tagByte6;
- oob[7] = spare->tagByte7;
- }
-@@ -71,18 +71,18 @@ static inline void translate_oob2spare(y
- }
- #endif
-
--int nandmtd_WriteChunkToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data, const yaffs_Spare * spare)
-+int nandmtd_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data, const yaffs_Spare *spare)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- struct mtd_oob_ops ops;
- #endif
- size_t dummy;
- int retval = 0;
-
- loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk;
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- __u8 spareAsBytes[8]; /* OOB */
-
- if (data && !spare)
-@@ -135,18 +135,18 @@ int nandmtd_WriteChunkToNAND(yaffs_Devic
- return YAFFS_FAIL;
- }
-
--int nandmtd_ReadChunkFromNAND(yaffs_Device * dev, int chunkInNAND, __u8 * data,
-- yaffs_Spare * spare)
-+int nandmtd_ReadChunkFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data,
-+ yaffs_Spare *spare)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- struct mtd_oob_ops ops;
- #endif
- size_t dummy;
- int retval = 0;
-
- loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk;
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- __u8 spareAsBytes[8]; /* OOB */
-
- if (data && !spare)
-@@ -205,7 +205,7 @@ int nandmtd_ReadChunkFromNAND(yaffs_Devi
- return YAFFS_FAIL;
- }
-
--int nandmtd_EraseBlockInNAND(yaffs_Device * dev, int blockNumber)
-+int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
- __u32 addr =
-@@ -234,7 +234,7 @@ int nandmtd_EraseBlockInNAND(yaffs_Devic
- return YAFFS_FAIL;
- }
-
--int nandmtd_InitialiseNAND(yaffs_Device * dev)
-+int nandmtd_InitialiseNAND(yaffs_Device *dev)
- {
- return YAFFS_OK;
- }
---- a/fs/yaffs2/yaffs_mtdif.h
-+++ b/fs/yaffs2/yaffs_mtdif.h
-@@ -18,10 +18,15 @@
-
- #include "yaffs_guts.h"
-
--int nandmtd_WriteChunkToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data, const yaffs_Spare * spare);
--int nandmtd_ReadChunkFromNAND(yaffs_Device * dev, int chunkInNAND, __u8 * data,
-- yaffs_Spare * spare);
--int nandmtd_EraseBlockInNAND(yaffs_Device * dev, int blockNumber);
--int nandmtd_InitialiseNAND(yaffs_Device * dev);
-+#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 18))
-+extern struct nand_oobinfo yaffs_oobinfo;
-+extern struct nand_oobinfo yaffs_noeccinfo;
-+#endif
-+
-+int nandmtd_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data, const yaffs_Spare *spare);
-+int nandmtd_ReadChunkFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data,
-+ yaffs_Spare *spare);
-+int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber);
-+int nandmtd_InitialiseNAND(yaffs_Device *dev);
- #endif
---- a/fs/yaffs2/yaffs_nand.c
-+++ b/fs/yaffs2/yaffs_nand.c
-@@ -12,16 +12,17 @@
- */
-
- const char *yaffs_nand_c_version =
-- "$Id: yaffs_nand.c,v 1.7 2007-02-14 01:09:06 wookey Exp $";
-+ "$Id: yaffs_nand.c,v 1.10 2009-03-06 17:20:54 wookey Exp $";
-
- #include "yaffs_nand.h"
- #include "yaffs_tagscompat.h"
- #include "yaffs_tagsvalidity.h"
-
-+#include "yaffs_getblockinfo.h"
-
--int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * buffer,
-- yaffs_ExtendedTags * tags)
-+int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *buffer,
-+ yaffs_ExtendedTags *tags)
- {
- int result;
- yaffs_ExtendedTags localTags;
-@@ -29,7 +30,7 @@ int yaffs_ReadChunkWithTagsFromNAND(yaff
- int realignedChunkInNAND = chunkInNAND - dev->chunkOffset;
-
- /* If there are no tags provided, use local tags to get prioritised gc working */
-- if(!tags)
-+ if (!tags)
- tags = &localTags;
-
- if (dev->readChunkWithTagsFromNAND)
-@@ -40,20 +41,20 @@ int yaffs_ReadChunkWithTagsFromNAND(yaff
- realignedChunkInNAND,
- buffer,
- tags);
-- if(tags &&
-- tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR){
-+ if (tags &&
-+ tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR) {
-
- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, chunkInNAND/dev->nChunksPerBlock);
-- yaffs_HandleChunkError(dev,bi);
-+ yaffs_HandleChunkError(dev, bi);
- }
-
- return result;
- }
-
--int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev,
-+int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev,
- int chunkInNAND,
-- const __u8 * buffer,
-- yaffs_ExtendedTags * tags)
-+ const __u8 *buffer,
-+ yaffs_ExtendedTags *tags)
- {
- chunkInNAND -= dev->chunkOffset;
-
-@@ -84,7 +85,7 @@ int yaffs_WriteChunkWithTagsToNAND(yaffs
- tags);
- }
-
--int yaffs_MarkBlockBad(yaffs_Device * dev, int blockNo)
-+int yaffs_MarkBlockBad(yaffs_Device *dev, int blockNo)
- {
- blockNo -= dev->blockOffset;
-
-@@ -95,10 +96,10 @@ int yaffs_MarkBlockBad(yaffs_Device * de
- return yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo);
- }
-
--int yaffs_QueryInitialBlockState(yaffs_Device * dev,
-+int yaffs_QueryInitialBlockState(yaffs_Device *dev,
- int blockNo,
-- yaffs_BlockState * state,
-- unsigned *sequenceNumber)
-+ yaffs_BlockState *state,
-+ __u32 *sequenceNumber)
- {
- blockNo -= dev->blockOffset;
-
---- a/fs/yaffs2/yaffs_nandemul2k.h
-+++ b/fs/yaffs2/yaffs_nandemul2k.h
-@@ -21,14 +21,14 @@
- #include "yaffs_guts.h"
-
- int nandemul2k_WriteChunkWithTagsToNAND(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND, const __u8 * data,
-- yaffs_ExtendedTags * tags);
-+ int chunkInNAND, const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
- int nandemul2k_ReadChunkWithTagsFromNAND(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND, __u8 * data,
-- yaffs_ExtendedTags * tags);
-+ int chunkInNAND, __u8 *data,
-+ yaffs_ExtendedTags *tags);
- int nandemul2k_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo);
- int nandemul2k_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber);
-+ yaffs_BlockState *state, __u32 *sequenceNumber);
- int nandemul2k_EraseBlockInNAND(struct yaffs_DeviceStruct *dev,
- int blockInNAND);
- int nandemul2k_InitialiseNAND(struct yaffs_DeviceStruct *dev);
---- a/fs/yaffs2/yaffs_nand.h
-+++ b/fs/yaffs2/yaffs_nand.h
-@@ -19,21 +19,21 @@
-
-
-
--int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * buffer,
-- yaffs_ExtendedTags * tags);
--
--int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev,
-- int chunkInNAND,
-- const __u8 * buffer,
-- yaffs_ExtendedTags * tags);
--
--int yaffs_MarkBlockBad(yaffs_Device * dev, int blockNo);
--
--int yaffs_QueryInitialBlockState(yaffs_Device * dev,
-- int blockNo,
-- yaffs_BlockState * state,
-- unsigned *sequenceNumber);
-+int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *buffer,
-+ yaffs_ExtendedTags *tags);
-+
-+int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev,
-+ int chunkInNAND,
-+ const __u8 *buffer,
-+ yaffs_ExtendedTags *tags);
-+
-+int yaffs_MarkBlockBad(yaffs_Device *dev, int blockNo);
-+
-+int yaffs_QueryInitialBlockState(yaffs_Device *dev,
-+ int blockNo,
-+ yaffs_BlockState *state,
-+ unsigned *sequenceNumber);
-
- int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev,
- int blockInNAND);
---- a/fs/yaffs2/yaffs_packedtags1.c
-+++ b/fs/yaffs2/yaffs_packedtags1.c
-@@ -14,7 +14,7 @@
- #include "yaffs_packedtags1.h"
- #include "yportenv.h"
-
--void yaffs_PackTags1(yaffs_PackedTags1 * pt, const yaffs_ExtendedTags * t)
-+void yaffs_PackTags1(yaffs_PackedTags1 *pt, const yaffs_ExtendedTags *t)
- {
- pt->chunkId = t->chunkId;
- pt->serialNumber = t->serialNumber;
-@@ -27,7 +27,7 @@ void yaffs_PackTags1(yaffs_PackedTags1 *
-
- }
-
--void yaffs_UnpackTags1(yaffs_ExtendedTags * t, const yaffs_PackedTags1 * pt)
-+void yaffs_UnpackTags1(yaffs_ExtendedTags *t, const yaffs_PackedTags1 *pt)
- {
- static const __u8 allFF[] =
- { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-@@ -35,9 +35,8 @@ void yaffs_UnpackTags1(yaffs_ExtendedTag
-
- if (memcmp(allFF, pt, sizeof(yaffs_PackedTags1))) {
- t->blockBad = 0;
-- if (pt->shouldBeFF != 0xFFFFFFFF) {
-+ if (pt->shouldBeFF != 0xFFFFFFFF)
- t->blockBad = 1;
-- }
- t->chunkUsed = 1;
- t->objectId = pt->objectId;
- t->chunkId = pt->chunkId;
-@@ -47,6 +46,5 @@ void yaffs_UnpackTags1(yaffs_ExtendedTag
- t->serialNumber = pt->serialNumber;
- } else {
- memset(t, 0, sizeof(yaffs_ExtendedTags));
--
- }
- }
---- a/fs/yaffs2/yaffs_packedtags1.h
-+++ b/fs/yaffs2/yaffs_packedtags1.h
-@@ -32,6 +32,6 @@ typedef struct {
-
- } yaffs_PackedTags1;
-
--void yaffs_PackTags1(yaffs_PackedTags1 * pt, const yaffs_ExtendedTags * t);
--void yaffs_UnpackTags1(yaffs_ExtendedTags * t, const yaffs_PackedTags1 * pt);
-+void yaffs_PackTags1(yaffs_PackedTags1 *pt, const yaffs_ExtendedTags *t);
-+void yaffs_UnpackTags1(yaffs_ExtendedTags *t, const yaffs_PackedTags1 *pt);
- #endif
---- a/fs/yaffs2/yaffs_packedtags2.c
-+++ b/fs/yaffs2/yaffs_packedtags2.c
-@@ -37,60 +37,68 @@
- #define EXTRA_OBJECT_TYPE_SHIFT (28)
- #define EXTRA_OBJECT_TYPE_MASK ((0x0F) << EXTRA_OBJECT_TYPE_SHIFT)
-
--static void yaffs_DumpPackedTags2(const yaffs_PackedTags2 * pt)
-+
-+static void yaffs_DumpPackedTags2TagsPart(const yaffs_PackedTags2TagsPart *ptt)
- {
- T(YAFFS_TRACE_MTD,
- (TSTR("packed tags obj %d chunk %d byte %d seq %d" TENDSTR),
-- pt->t.objectId, pt->t.chunkId, pt->t.byteCount,
-- pt->t.sequenceNumber));
-+ ptt->objectId, ptt->chunkId, ptt->byteCount,
-+ ptt->sequenceNumber));
-+}
-+static void yaffs_DumpPackedTags2(const yaffs_PackedTags2 *pt)
-+{
-+ yaffs_DumpPackedTags2TagsPart(&pt->t);
- }
-
--static void yaffs_DumpTags2(const yaffs_ExtendedTags * t)
-+static void yaffs_DumpTags2(const yaffs_ExtendedTags *t)
- {
- T(YAFFS_TRACE_MTD,
- (TSTR
-- ("ext.tags eccres %d blkbad %d chused %d obj %d chunk%d byte "
-- "%d del %d ser %d seq %d"
-+ ("ext.tags eccres %d blkbad %d chused %d obj %d chunk%d byte %d del %d ser %d seq %d"
- TENDSTR), t->eccResult, t->blockBad, t->chunkUsed, t->objectId,
- t->chunkId, t->byteCount, t->chunkDeleted, t->serialNumber,
- t->sequenceNumber));
-
- }
-
--void yaffs_PackTags2(yaffs_PackedTags2 * pt, const yaffs_ExtendedTags * t)
-+void yaffs_PackTags2TagsPart(yaffs_PackedTags2TagsPart *ptt,
-+ const yaffs_ExtendedTags *t)
- {
-- pt->t.chunkId = t->chunkId;
-- pt->t.sequenceNumber = t->sequenceNumber;
-- pt->t.byteCount = t->byteCount;
-- pt->t.objectId = t->objectId;
-+ ptt->chunkId = t->chunkId;
-+ ptt->sequenceNumber = t->sequenceNumber;
-+ ptt->byteCount = t->byteCount;
-+ ptt->objectId = t->objectId;
-
- if (t->chunkId == 0 && t->extraHeaderInfoAvailable) {
- /* Store the extra header info instead */
- /* We save the parent object in the chunkId */
-- pt->t.chunkId = EXTRA_HEADER_INFO_FLAG
-+ ptt->chunkId = EXTRA_HEADER_INFO_FLAG
- | t->extraParentObjectId;
-- if (t->extraIsShrinkHeader) {
-- pt->t.chunkId |= EXTRA_SHRINK_FLAG;
-- }
-- if (t->extraShadows) {
-- pt->t.chunkId |= EXTRA_SHADOWS_FLAG;
-- }
-+ if (t->extraIsShrinkHeader)
-+ ptt->chunkId |= EXTRA_SHRINK_FLAG;
-+ if (t->extraShadows)
-+ ptt->chunkId |= EXTRA_SHADOWS_FLAG;
-
-- pt->t.objectId &= ~EXTRA_OBJECT_TYPE_MASK;
-- pt->t.objectId |=
-+ ptt->objectId &= ~EXTRA_OBJECT_TYPE_MASK;
-+ ptt->objectId |=
- (t->extraObjectType << EXTRA_OBJECT_TYPE_SHIFT);
-
-- if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK) {
-- pt->t.byteCount = t->extraEquivalentObjectId;
-- } else if (t->extraObjectType == YAFFS_OBJECT_TYPE_FILE) {
-- pt->t.byteCount = t->extraFileLength;
-- } else {
-- pt->t.byteCount = 0;
-- }
-+ if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK)
-+ ptt->byteCount = t->extraEquivalentObjectId;
-+ else if (t->extraObjectType == YAFFS_OBJECT_TYPE_FILE)
-+ ptt->byteCount = t->extraFileLength;
-+ else
-+ ptt->byteCount = 0;
- }
-
-- yaffs_DumpPackedTags2(pt);
-+ yaffs_DumpPackedTags2TagsPart(ptt);
- yaffs_DumpTags2(t);
-+}
-+
-+
-+void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ExtendedTags *t)
-+{
-+ yaffs_PackTags2TagsPart(&pt->t, t);
-
- #ifndef YAFFS_IGNORE_TAGS_ECC
- {
-@@ -101,82 +109,98 @@ void yaffs_PackTags2(yaffs_PackedTags2 *
- #endif
- }
-
--void yaffs_UnpackTags2(yaffs_ExtendedTags * t, yaffs_PackedTags2 * pt)
-+
-+void yaffs_UnpackTags2TagsPart(yaffs_ExtendedTags *t,
-+ yaffs_PackedTags2TagsPart *ptt)
- {
-
- memset(t, 0, sizeof(yaffs_ExtendedTags));
-
- yaffs_InitialiseTags(t);
-
-- if (pt->t.sequenceNumber != 0xFFFFFFFF) {
-- /* Page is in use */
--#ifdef YAFFS_IGNORE_TAGS_ECC
-- {
-- t->eccResult = YAFFS_ECC_RESULT_NO_ERROR;
-- }
--#else
-- {
-- yaffs_ECCOther ecc;
-- int result;
-- yaffs_ECCCalculateOther((unsigned char *)&pt->t,
-- sizeof
-- (yaffs_PackedTags2TagsPart),
-- &ecc);
-- result =
-- yaffs_ECCCorrectOther((unsigned char *)&pt->t,
-- sizeof
-- (yaffs_PackedTags2TagsPart),
-- &pt->ecc, &ecc);
-- switch(result){
-- case 0:
-- t->eccResult = YAFFS_ECC_RESULT_NO_ERROR;
-- break;
-- case 1:
-- t->eccResult = YAFFS_ECC_RESULT_FIXED;
-- break;
-- case -1:
-- t->eccResult = YAFFS_ECC_RESULT_UNFIXED;
-- break;
-- default:
-- t->eccResult = YAFFS_ECC_RESULT_UNKNOWN;
-- }
-- }
--#endif
-+ if (ptt->sequenceNumber != 0xFFFFFFFF) {
- t->blockBad = 0;
- t->chunkUsed = 1;
-- t->objectId = pt->t.objectId;
-- t->chunkId = pt->t.chunkId;
-- t->byteCount = pt->t.byteCount;
-+ t->objectId = ptt->objectId;
-+ t->chunkId = ptt->chunkId;
-+ t->byteCount = ptt->byteCount;
- t->chunkDeleted = 0;
- t->serialNumber = 0;
-- t->sequenceNumber = pt->t.sequenceNumber;
-+ t->sequenceNumber = ptt->sequenceNumber;
-
- /* Do extra header info stuff */
-
-- if (pt->t.chunkId & EXTRA_HEADER_INFO_FLAG) {
-+ if (ptt->chunkId & EXTRA_HEADER_INFO_FLAG) {
- t->chunkId = 0;
- t->byteCount = 0;
-
- t->extraHeaderInfoAvailable = 1;
- t->extraParentObjectId =
-- pt->t.chunkId & (~(ALL_EXTRA_FLAGS));
-+ ptt->chunkId & (~(ALL_EXTRA_FLAGS));
- t->extraIsShrinkHeader =
-- (pt->t.chunkId & EXTRA_SHRINK_FLAG) ? 1 : 0;
-+ (ptt->chunkId & EXTRA_SHRINK_FLAG) ? 1 : 0;
- t->extraShadows =
-- (pt->t.chunkId & EXTRA_SHADOWS_FLAG) ? 1 : 0;
-+ (ptt->chunkId & EXTRA_SHADOWS_FLAG) ? 1 : 0;
- t->extraObjectType =
-- pt->t.objectId >> EXTRA_OBJECT_TYPE_SHIFT;
-+ ptt->objectId >> EXTRA_OBJECT_TYPE_SHIFT;
- t->objectId &= ~EXTRA_OBJECT_TYPE_MASK;
-
-- if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK) {
-- t->extraEquivalentObjectId = pt->t.byteCount;
-- } else {
-- t->extraFileLength = pt->t.byteCount;
-+ if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK)
-+ t->extraEquivalentObjectId = ptt->byteCount;
-+ else
-+ t->extraFileLength = ptt->byteCount;
-+ }
-+ }
-+
-+ yaffs_DumpPackedTags2TagsPart(ptt);
-+ yaffs_DumpTags2(t);
-+
-+}
-+
-+
-+void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt)
-+{
-+
-+ yaffs_ECCResult eccResult = YAFFS_ECC_RESULT_NO_ERROR;
-+
-+ if (pt->t.sequenceNumber != 0xFFFFFFFF) {
-+ /* Page is in use */
-+#ifndef YAFFS_IGNORE_TAGS_ECC
-+ {
-+ yaffs_ECCOther ecc;
-+ int result;
-+ yaffs_ECCCalculateOther((unsigned char *)&pt->t,
-+ sizeof
-+ (yaffs_PackedTags2TagsPart),
-+ &ecc);
-+ result =
-+ yaffs_ECCCorrectOther((unsigned char *)&pt->t,
-+ sizeof
-+ (yaffs_PackedTags2TagsPart),
-+ &pt->ecc, &ecc);
-+ switch (result) {
-+ case 0:
-+ eccResult = YAFFS_ECC_RESULT_NO_ERROR;
-+ break;
-+ case 1:
-+ eccResult = YAFFS_ECC_RESULT_FIXED;
-+ break;
-+ case -1:
-+ eccResult = YAFFS_ECC_RESULT_UNFIXED;
-+ break;
-+ default:
-+ eccResult = YAFFS_ECC_RESULT_UNKNOWN;
- }
- }
-+#endif
- }
-
-+ yaffs_UnpackTags2TagsPart(t, &pt->t);
-+
-+ t->eccResult = eccResult;
-+
- yaffs_DumpPackedTags2(pt);
- yaffs_DumpTags2(t);
-
- }
-+
---- a/fs/yaffs2/yaffs_packedtags2.h
-+++ b/fs/yaffs2/yaffs_packedtags2.h
-@@ -33,6 +33,11 @@ typedef struct {
- yaffs_ECCOther ecc;
- } yaffs_PackedTags2;
-
--void yaffs_PackTags2(yaffs_PackedTags2 * pt, const yaffs_ExtendedTags * t);
--void yaffs_UnpackTags2(yaffs_ExtendedTags * t, yaffs_PackedTags2 * pt);
-+/* Full packed tags with ECC, used for oob tags */
-+void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ExtendedTags *t);
-+void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt);
-+
-+/* Only the tags part (no ECC for use with inband tags */
-+void yaffs_PackTags2TagsPart(yaffs_PackedTags2TagsPart *pt, const yaffs_ExtendedTags *t);
-+void yaffs_UnpackTags2TagsPart(yaffs_ExtendedTags *t, yaffs_PackedTags2TagsPart *pt);
- #endif
---- a/fs/yaffs2/yaffs_qsort.c
-+++ b/fs/yaffs2/yaffs_qsort.c
-@@ -28,12 +28,12 @@
- */
-
- #include "yportenv.h"
--//#include <linux/string.h>
-+/* #include <linux/string.h> */
-
- /*
- * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".
- */
--#define swapcode(TYPE, parmi, parmj, n) { \
-+#define swapcode(TYPE, parmi, parmj, n) do { \
- long i = (n) / sizeof (TYPE); \
- register TYPE *pi = (TYPE *) (parmi); \
- register TYPE *pj = (TYPE *) (parmj); \
-@@ -41,28 +41,29 @@
- register TYPE t = *pi; \
- *pi++ = *pj; \
- *pj++ = t; \
-- } while (--i > 0); \
--}
-+ } while (--i > 0); \
-+} while (0)
-
- #define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \
-- es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;
-+ es % sizeof(long) ? 2 : es == sizeof(long) ? 0 : 1;
-
- static __inline void
- swapfunc(char *a, char *b, int n, int swaptype)
- {
- if (swaptype <= 1)
-- swapcode(long, a, b, n)
-+ swapcode(long, a, b, n);
- else
-- swapcode(char, a, b, n)
-+ swapcode(char, a, b, n);
- }
-
--#define swap(a, b) \
-+#define yswap(a, b) do { \
- if (swaptype == 0) { \
- long t = *(long *)(a); \
- *(long *)(a) = *(long *)(b); \
- *(long *)(b) = t; \
- } else \
-- swapfunc(a, b, es, swaptype)
-+ swapfunc(a, b, es, swaptype); \
-+} while (0)
-
- #define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype)
-
-@@ -70,12 +71,12 @@ static __inline char *
- med3(char *a, char *b, char *c, int (*cmp)(const void *, const void *))
- {
- return cmp(a, b) < 0 ?
-- (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a ))
-- :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c ));
-+ (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a))
-+ : (cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c));
- }
-
- #ifndef min
--#define min(a,b) (((a) < (b)) ? (a) : (b))
-+#define min(a, b) (((a) < (b)) ? (a) : (b))
- #endif
-
- void
-@@ -92,7 +93,7 @@ loop: SWAPINIT(a, es);
- for (pm = (char *)a + es; pm < (char *) a + n * es; pm += es)
- for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
- pl -= es)
-- swap(pl, pl - es);
-+ yswap(pl, pl - es);
- return;
- }
- pm = (char *)a + (n / 2) * es;
-@@ -107,7 +108,7 @@ loop: SWAPINIT(a, es);
- }
- pm = med3(pl, pm, pn, cmp);
- }
-- swap(a, pm);
-+ yswap(a, pm);
- pa = pb = (char *)a + es;
-
- pc = pd = (char *)a + (n - 1) * es;
-@@ -115,7 +116,7 @@ loop: SWAPINIT(a, es);
- while (pb <= pc && (r = cmp(pb, a)) <= 0) {
- if (r == 0) {
- swap_cnt = 1;
-- swap(pa, pb);
-+ yswap(pa, pb);
- pa += es;
- }
- pb += es;
-@@ -123,14 +124,14 @@ loop: SWAPINIT(a, es);
- while (pb <= pc && (r = cmp(pc, a)) >= 0) {
- if (r == 0) {
- swap_cnt = 1;
-- swap(pc, pd);
-+ yswap(pc, pd);
- pd -= es;
- }
- pc -= es;
- }
- if (pb > pc)
- break;
-- swap(pb, pc);
-+ yswap(pb, pc);
- swap_cnt = 1;
- pb += es;
- pc -= es;
-@@ -139,7 +140,7 @@ loop: SWAPINIT(a, es);
- for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)
- for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
- pl -= es)
-- swap(pl, pl - es);
-+ yswap(pl, pl - es);
- return;
- }
-
-@@ -148,9 +149,11 @@ loop: SWAPINIT(a, es);
- vecswap(a, pb - r, r);
- r = min((long)(pd - pc), (long)(pn - pd - es));
- vecswap(pb, pn - r, r);
-- if ((r = pb - pa) > es)
-+ r = pb - pa;
-+ if (r > es)
- yaffs_qsort(a, r / es, es, cmp);
-- if ((r = pd - pc) > es) {
-+ r = pd - pc;
-+ if (r > es) {
- /* Iterate rather than recurse to save stack space */
- a = pn - r;
- n = r / es;
---- a/fs/yaffs2/yaffs_qsort.h
-+++ b/fs/yaffs2/yaffs_qsort.h
-@@ -17,7 +17,7 @@
- #ifndef __YAFFS_QSORT_H__
- #define __YAFFS_QSORT_H__
-
--extern void yaffs_qsort (void *const base, size_t total_elems, size_t size,
-- int (*cmp)(const void *, const void *));
-+extern void yaffs_qsort(void *const base, size_t total_elems, size_t size,
-+ int (*cmp)(const void *, const void *));
-
- #endif
---- a/fs/yaffs2/yaffs_tagscompat.c
-+++ b/fs/yaffs2/yaffs_tagscompat.c
-@@ -14,16 +14,17 @@
- #include "yaffs_guts.h"
- #include "yaffs_tagscompat.h"
- #include "yaffs_ecc.h"
-+#include "yaffs_getblockinfo.h"
-
--static void yaffs_HandleReadDataError(yaffs_Device * dev, int chunkInNAND);
-+static void yaffs_HandleReadDataError(yaffs_Device *dev, int chunkInNAND);
- #ifdef NOTYET
--static void yaffs_CheckWrittenBlock(yaffs_Device * dev, int chunkInNAND);
--static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_Spare * spare);
--static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,
-- const yaffs_Spare * spare);
--static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND);
-+static void yaffs_CheckWrittenBlock(yaffs_Device *dev, int chunkInNAND);
-+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_Spare *spare);
-+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND,
-+ const yaffs_Spare *spare);
-+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND);
- #endif
-
- static const char yaffs_countBitsTable[256] = {
-@@ -54,13 +55,13 @@ int yaffs_CountBits(__u8 x)
-
- /********** Tags ECC calculations *********/
-
--void yaffs_CalcECC(const __u8 * data, yaffs_Spare * spare)
-+void yaffs_CalcECC(const __u8 *data, yaffs_Spare *spare)
- {
- yaffs_ECCCalculate(data, spare->ecc1);
- yaffs_ECCCalculate(&data[256], spare->ecc2);
- }
-
--void yaffs_CalcTagsECC(yaffs_Tags * tags)
-+void yaffs_CalcTagsECC(yaffs_Tags *tags)
- {
- /* Calculate an ecc */
-
-@@ -74,9 +75,8 @@ void yaffs_CalcTagsECC(yaffs_Tags * tags
- for (i = 0; i < 8; i++) {
- for (j = 1; j & 0xff; j <<= 1) {
- bit++;
-- if (b[i] & j) {
-+ if (b[i] & j)
- ecc ^= bit;
-- }
- }
- }
-
-@@ -84,7 +84,7 @@ void yaffs_CalcTagsECC(yaffs_Tags * tags
-
- }
-
--int yaffs_CheckECCOnTags(yaffs_Tags * tags)
-+int yaffs_CheckECCOnTags(yaffs_Tags *tags)
- {
- unsigned ecc = tags->ecc;
-
-@@ -115,8 +115,8 @@ int yaffs_CheckECCOnTags(yaffs_Tags * ta
-
- /********** Tags **********/
-
--static void yaffs_LoadTagsIntoSpare(yaffs_Spare * sparePtr,
-- yaffs_Tags * tagsPtr)
-+static void yaffs_LoadTagsIntoSpare(yaffs_Spare *sparePtr,
-+ yaffs_Tags *tagsPtr)
- {
- yaffs_TagsUnion *tu = (yaffs_TagsUnion *) tagsPtr;
-
-@@ -132,8 +132,8 @@ static void yaffs_LoadTagsIntoSpare(yaff
- sparePtr->tagByte7 = tu->asBytes[7];
- }
-
--static void yaffs_GetTagsFromSpare(yaffs_Device * dev, yaffs_Spare * sparePtr,
-- yaffs_Tags * tagsPtr)
-+static void yaffs_GetTagsFromSpare(yaffs_Device *dev, yaffs_Spare *sparePtr,
-+ yaffs_Tags *tagsPtr)
- {
- yaffs_TagsUnion *tu = (yaffs_TagsUnion *) tagsPtr;
- int result;
-@@ -148,21 +148,20 @@ static void yaffs_GetTagsFromSpare(yaffs
- tu->asBytes[7] = sparePtr->tagByte7;
-
- result = yaffs_CheckECCOnTags(tagsPtr);
-- if (result > 0) {
-+ if (result > 0)
- dev->tagsEccFixed++;
-- } else if (result < 0) {
-+ else if (result < 0)
- dev->tagsEccUnfixed++;
-- }
- }
-
--static void yaffs_SpareInitialise(yaffs_Spare * spare)
-+static void yaffs_SpareInitialise(yaffs_Spare *spare)
- {
- memset(spare, 0xFF, sizeof(yaffs_Spare));
- }
-
- static int yaffs_WriteChunkToNAND(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND, const __u8 * data,
-- yaffs_Spare * spare)
-+ int chunkInNAND, const __u8 *data,
-+ yaffs_Spare *spare)
- {
- if (chunkInNAND < dev->startBlock * dev->nChunksPerBlock) {
- T(YAFFS_TRACE_ERROR,
-@@ -177,9 +176,9 @@ static int yaffs_WriteChunkToNAND(struct
-
- static int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev,
- int chunkInNAND,
-- __u8 * data,
-- yaffs_Spare * spare,
-- yaffs_ECCResult * eccResult,
-+ __u8 *data,
-+ yaffs_Spare *spare,
-+ yaffs_ECCResult *eccResult,
- int doErrorCorrection)
- {
- int retVal;
-@@ -252,9 +251,11 @@ static int yaffs_ReadChunkFromNAND(struc
- /* Must allocate enough memory for spare+2*sizeof(int) */
- /* for ecc results from device. */
- struct yaffs_NANDSpare nspare;
-- retVal =
-- dev->readChunkFromNAND(dev, chunkInNAND, data,
-- (yaffs_Spare *) & nspare);
-+
-+ memset(&nspare, 0, sizeof(nspare));
-+
-+ retVal = dev->readChunkFromNAND(dev, chunkInNAND, data,
-+ (yaffs_Spare *) &nspare);
- memcpy(spare, &nspare, sizeof(yaffs_Spare));
- if (data && doErrorCorrection) {
- if (nspare.eccres1 > 0) {
-@@ -302,8 +303,7 @@ static int yaffs_ReadChunkFromNAND(struc
- static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,
- int chunkInNAND)
- {
--
-- static int init = 0;
-+ static int init;
- static __u8 cmpbuf[YAFFS_BYTES_PER_CHUNK];
- static __u8 data[YAFFS_BYTES_PER_CHUNK];
- /* Might as well always allocate the larger size for */
-@@ -331,12 +331,12 @@ static int yaffs_CheckChunkErased(struct
- * Functions for robustisizing
- */
-
--static void yaffs_HandleReadDataError(yaffs_Device * dev, int chunkInNAND)
-+static void yaffs_HandleReadDataError(yaffs_Device *dev, int chunkInNAND)
- {
- int blockInNAND = chunkInNAND / dev->nChunksPerBlock;
-
- /* Mark the block for retirement */
-- yaffs_GetBlockInfo(dev, blockInNAND)->needsRetiring = 1;
-+ yaffs_GetBlockInfo(dev, blockInNAND + dev->blockOffset)->needsRetiring = 1;
- T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS,
- (TSTR("**>>Block %d marked for retirement" TENDSTR), blockInNAND));
-
-@@ -348,22 +348,22 @@ static void yaffs_HandleReadDataError(ya
- }
-
- #ifdef NOTYET
--static void yaffs_CheckWrittenBlock(yaffs_Device * dev, int chunkInNAND)
-+static void yaffs_CheckWrittenBlock(yaffs_Device *dev, int chunkInNAND)
- {
- }
-
--static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_Spare * spare)
-+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_Spare *spare)
- {
- }
-
--static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,
-- const yaffs_Spare * spare)
-+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND,
-+ const yaffs_Spare *spare)
- {
- }
-
--static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND)
-+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND)
- {
- int blockInNAND = chunkInNAND / dev->nChunksPerBlock;
-
-@@ -373,8 +373,8 @@ static void yaffs_HandleWriteChunkError(
- yaffs_DeleteChunk(dev, chunkInNAND, 1, __LINE__);
- }
-
--static int yaffs_VerifyCompare(const __u8 * d0, const __u8 * d1,
-- const yaffs_Spare * s0, const yaffs_Spare * s1)
-+static int yaffs_VerifyCompare(const __u8 *d0, const __u8 *d1,
-+ const yaffs_Spare *s0, const yaffs_Spare *s1)
- {
-
- if (memcmp(d0, d1, YAFFS_BYTES_PER_CHUNK) != 0 ||
-@@ -398,28 +398,35 @@ static int yaffs_VerifyCompare(const __u
- }
- #endif /* NOTYET */
-
--int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device * dev,
-- int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags *
-- eTags)
-+int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device *dev,
-+ int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *eTags)
- {
- yaffs_Spare spare;
- yaffs_Tags tags;
-
- yaffs_SpareInitialise(&spare);
-
-- if (eTags->chunkDeleted) {
-+ if (eTags->chunkDeleted)
- spare.pageStatus = 0;
-- } else {
-+ else {
- tags.objectId = eTags->objectId;
- tags.chunkId = eTags->chunkId;
-- tags.byteCount = eTags->byteCount;
-+
-+ tags.byteCountLSB = eTags->byteCount & 0x3ff;
-+
-+ if (dev->nDataBytesPerChunk >= 1024)
-+ tags.byteCountMSB = (eTags->byteCount >> 10) & 3;
-+ else
-+ tags.byteCountMSB = 3;
-+
-+
- tags.serialNumber = eTags->serialNumber;
-
-- if (!dev->useNANDECC && data) {
-+ if (!dev->useNANDECC && data)
- yaffs_CalcECC(data, &spare);
-- }
-+
- yaffs_LoadTagsIntoSpare(&spare, &tags);
-
- }
-@@ -427,15 +434,15 @@ int yaffs_TagsCompatabilityWriteChunkWit
- return yaffs_WriteChunkToNAND(dev, chunkInNAND, data, &spare);
- }
-
--int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device * dev,
-+int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device *dev,
- int chunkInNAND,
-- __u8 * data,
-- yaffs_ExtendedTags * eTags)
-+ __u8 *data,
-+ yaffs_ExtendedTags *eTags)
- {
-
- yaffs_Spare spare;
- yaffs_Tags tags;
-- yaffs_ECCResult eccResult;
-+ yaffs_ECCResult eccResult = YAFFS_ECC_RESULT_UNKNOWN;
-
- static yaffs_Spare spareFF;
- static int init;
-@@ -466,7 +473,11 @@ int yaffs_TagsCompatabilityReadChunkWith
-
- eTags->objectId = tags.objectId;
- eTags->chunkId = tags.chunkId;
-- eTags->byteCount = tags.byteCount;
-+ eTags->byteCount = tags.byteCountLSB;
-+
-+ if (dev->nDataBytesPerChunk >= 1024)
-+ eTags->byteCount |= (((unsigned) tags.byteCountMSB) << 10);
-+
- eTags->serialNumber = tags.serialNumber;
- }
- }
-@@ -497,9 +508,9 @@ int yaffs_TagsCompatabilityMarkNANDBlock
- }
-
- int yaffs_TagsCompatabilityQueryNANDBlock(struct yaffs_DeviceStruct *dev,
-- int blockNo, yaffs_BlockState *
-- state,
-- int *sequenceNumber)
-+ int blockNo,
-+ yaffs_BlockState *state,
-+ __u32 *sequenceNumber)
- {
-
- yaffs_Spare spare0, spare1;
---- a/fs/yaffs2/yaffs_tagscompat.h
-+++ b/fs/yaffs2/yaffs_tagscompat.h
-@@ -17,24 +17,23 @@
- #define __YAFFS_TAGSCOMPAT_H__
-
- #include "yaffs_guts.h"
--int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device * dev,
-- int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags *
-- tags);
--int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device * dev,
-- int chunkInNAND,
-- __u8 * data,
-- yaffs_ExtendedTags *
-- tags);
-+int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device *dev,
-+ int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
-+int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device *dev,
-+ int chunkInNAND,
-+ __u8 *data,
-+ yaffs_ExtendedTags *tags);
- int yaffs_TagsCompatabilityMarkNANDBlockBad(struct yaffs_DeviceStruct *dev,
- int blockNo);
- int yaffs_TagsCompatabilityQueryNANDBlock(struct yaffs_DeviceStruct *dev,
-- int blockNo, yaffs_BlockState *
-- state, int *sequenceNumber);
-+ int blockNo,
-+ yaffs_BlockState *state,
-+ __u32 *sequenceNumber);
-
--void yaffs_CalcTagsECC(yaffs_Tags * tags);
--int yaffs_CheckECCOnTags(yaffs_Tags * tags);
-+void yaffs_CalcTagsECC(yaffs_Tags *tags);
-+int yaffs_CheckECCOnTags(yaffs_Tags *tags);
- int yaffs_CountBits(__u8 byte);
-
- #endif
---- a/fs/yaffs2/yaffs_tagsvalidity.c
-+++ b/fs/yaffs2/yaffs_tagsvalidity.c
-@@ -13,14 +13,14 @@
-
- #include "yaffs_tagsvalidity.h"
-
--void yaffs_InitialiseTags(yaffs_ExtendedTags * tags)
-+void yaffs_InitialiseTags(yaffs_ExtendedTags *tags)
- {
- memset(tags, 0, sizeof(yaffs_ExtendedTags));
- tags->validMarker0 = 0xAAAAAAAA;
- tags->validMarker1 = 0x55555555;
- }
-
--int yaffs_ValidateTags(yaffs_ExtendedTags * tags)
-+int yaffs_ValidateTags(yaffs_ExtendedTags *tags)
- {
- return (tags->validMarker0 == 0xAAAAAAAA &&
- tags->validMarker1 == 0x55555555);
---- a/fs/yaffs2/yaffs_tagsvalidity.h
-+++ b/fs/yaffs2/yaffs_tagsvalidity.h
-@@ -19,6 +19,6 @@
-
- #include "yaffs_guts.h"
-
--void yaffs_InitialiseTags(yaffs_ExtendedTags * tags);
--int yaffs_ValidateTags(yaffs_ExtendedTags * tags);
-+void yaffs_InitialiseTags(yaffs_ExtendedTags *tags);
-+int yaffs_ValidateTags(yaffs_ExtendedTags *tags);
- #endif
---- a/fs/yaffs2/yportenv.h
-+++ b/fs/yaffs2/yportenv.h
-@@ -17,17 +17,28 @@
- #ifndef __YPORTENV_H__
- #define __YPORTENV_H__
-
-+/*
-+ * Define the MTD version in terms of Linux Kernel versions
-+ * This allows yaffs to be used independantly of the kernel
-+ * as well as with it.
-+ */
-+
-+#define MTD_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + (c))
-+
- #if defined CONFIG_YAFFS_WINCE
-
- #include "ywinceenv.h"
-
--#elif defined __KERNEL__
-+#elif defined __KERNEL__
-
- #include "moduleconfig.h"
-
- /* Linux kernel */
-+
- #include <linux/version.h>
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
-+#define MTD_VERSION_CODE LINUX_VERSION_CODE
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
- #include <linux/config.h>
- #endif
- #include <linux/kernel.h>
-@@ -40,12 +51,13 @@
- #define YCHAR char
- #define YUCHAR unsigned char
- #define _Y(x) x
--#define yaffs_strcpy(a,b) strcpy(a,b)
--#define yaffs_strncpy(a,b,c) strncpy(a,b,c)
--#define yaffs_strncmp(a,b,c) strncmp(a,b,c)
--#define yaffs_strlen(s) strlen(s)
--#define yaffs_sprintf sprintf
--#define yaffs_toupper(a) toupper(a)
-+#define yaffs_strcat(a, b) strcat(a, b)
-+#define yaffs_strcpy(a, b) strcpy(a, b)
-+#define yaffs_strncpy(a, b, c) strncpy(a, b, c)
-+#define yaffs_strncmp(a, b, c) strncmp(a, b, c)
-+#define yaffs_strlen(s) strlen(s)
-+#define yaffs_sprintf sprintf
-+#define yaffs_toupper(a) toupper(a)
-
- #define Y_INLINE inline
-
-@@ -53,19 +65,19 @@
- #define YAFFS_LOSTNFOUND_PREFIX "obj"
-
- /* #define YPRINTF(x) printk x */
--#define YMALLOC(x) kmalloc(x,GFP_KERNEL)
-+#define YMALLOC(x) kmalloc(x, GFP_NOFS)
- #define YFREE(x) kfree(x)
- #define YMALLOC_ALT(x) vmalloc(x)
- #define YFREE_ALT(x) vfree(x)
- #define YMALLOC_DMA(x) YMALLOC(x)
-
--// KR - added for use in scan so processes aren't blocked indefinitely.
-+/* KR - added for use in scan so processes aren't blocked indefinitely. */
- #define YYIELD() schedule()
-
- #define YAFFS_ROOT_MODE 0666
- #define YAFFS_LOSTNFOUND_MODE 0666
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- #define Y_CURRENT_TIME CURRENT_TIME.tv_sec
- #define Y_TIME_CONVERT(x) (x).tv_sec
- #else
-@@ -73,11 +85,12 @@
- #define Y_TIME_CONVERT(x) (x)
- #endif
-
--#define yaffs_SumCompare(x,y) ((x) == (y))
--#define yaffs_strcmp(a,b) strcmp(a,b)
-+#define yaffs_SumCompare(x, y) ((x) == (y))
-+#define yaffs_strcmp(a, b) strcmp(a, b)
-
- #define TENDSTR "\n"
- #define TSTR(x) KERN_WARNING x
-+#define TCONT(x) x
- #define TOUT(p) printk p
-
- #define yaffs_trace(mask, fmt, args...) \
-@@ -90,6 +103,8 @@
-
- #elif defined CONFIG_YAFFS_DIRECT
-
-+#define MTD_VERSION_CODE MTD_VERSION(2, 6, 22)
-+
- /* Direct interface */
- #include "ydirectenv.h"
-
-@@ -111,11 +126,12 @@
- #define YCHAR char
- #define YUCHAR unsigned char
- #define _Y(x) x
--#define yaffs_strcpy(a,b) strcpy(a,b)
--#define yaffs_strncpy(a,b,c) strncpy(a,b,c)
--#define yaffs_strlen(s) strlen(s)
--#define yaffs_sprintf sprintf
--#define yaffs_toupper(a) toupper(a)
-+#define yaffs_strcat(a, b) strcat(a, b)
-+#define yaffs_strcpy(a, b) strcpy(a, b)
-+#define yaffs_strncpy(a, b, c) strncpy(a, b, c)
-+#define yaffs_strlen(s) strlen(s)
-+#define yaffs_sprintf sprintf
-+#define yaffs_toupper(a) toupper(a)
-
- #define Y_INLINE inline
-
-@@ -133,8 +149,8 @@
- #define YAFFS_ROOT_MODE 0666
- #define YAFFS_LOSTNFOUND_MODE 0666
-
--#define yaffs_SumCompare(x,y) ((x) == (y))
--#define yaffs_strcmp(a,b) strcmp(a,b)
-+#define yaffs_SumCompare(x, y) ((x) == (y))
-+#define yaffs_strcmp(a, b) strcmp(a, b)
-
- #else
- /* Should have specified a configuration type */
-@@ -178,10 +194,10 @@ extern unsigned int yaffs_wr_attempts;
- #define YAFFS_TRACE_ALWAYS 0xF0000000
-
-
--#define T(mask,p) do{ if((mask) & (yaffs_traceMask | YAFFS_TRACE_ALWAYS)) TOUT(p);} while(0)
-+#define T(mask, p) do { if ((mask) & (yaffs_traceMask | YAFFS_TRACE_ALWAYS)) TOUT(p); } while (0)
-
--#ifndef CONFIG_YAFFS_WINCE
--#define YBUG() T(YAFFS_TRACE_BUG,(TSTR("==>> yaffs bug: " __FILE__ " %d" TENDSTR),__LINE__))
-+#ifndef YBUG
-+#define YBUG() do {T(YAFFS_TRACE_BUG, (TSTR("==>> yaffs bug: " __FILE__ " %d" TENDSTR), __LINE__)); } while (0)
- #endif
-
- #endif
+++ /dev/null
---- a/drivers/net/phy/phy.c
-+++ b/drivers/net/phy/phy.c
-@@ -299,6 +299,50 @@ int phy_ethtool_gset(struct phy_device *
- }
- EXPORT_SYMBOL(phy_ethtool_gset);
-
-+int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr)
-+{
-+ u32 cmd;
-+ int tmp;
-+ struct ethtool_cmd ecmd = { ETHTOOL_GSET };
-+ struct ethtool_value edata = { ETHTOOL_GLINK };
-+
-+ if (get_user(cmd, (u32 *) useraddr))
-+ return -EFAULT;
-+
-+ switch (cmd) {
-+ case ETHTOOL_GSET:
-+ phy_ethtool_gset(phydev, &ecmd);
-+ if (copy_to_user(useraddr, &ecmd, sizeof(ecmd)))
-+ return -EFAULT;
-+ return 0;
-+
-+ case ETHTOOL_SSET:
-+ if (copy_from_user(&ecmd, useraddr, sizeof(ecmd)))
-+ return -EFAULT;
-+ return phy_ethtool_sset(phydev, &ecmd);
-+
-+ case ETHTOOL_NWAY_RST:
-+ /* if autoneg is off, it's an error */
-+ tmp = phy_read(phydev, MII_BMCR);
-+ if (tmp & BMCR_ANENABLE) {
-+ tmp |= (BMCR_ANRESTART);
-+ phy_write(phydev, MII_BMCR, tmp);
-+ return 0;
-+ }
-+ return -EINVAL;
-+
-+ case ETHTOOL_GLINK:
-+ edata.data = (phy_read(phydev,
-+ MII_BMSR) & BMSR_LSTATUS) ? 1 : 0;
-+ if (copy_to_user(useraddr, &edata, sizeof(edata)))
-+ return -EFAULT;
-+ return 0;
-+ }
-+
-+ return -EOPNOTSUPP;
-+}
-+EXPORT_SYMBOL(phy_ethtool_ioctl);
-+
- /**
- * phy_mii_ioctl - generic PHY MII ioctl interface
- * @phydev: the phy_device struct
-@@ -355,8 +399,8 @@ int phy_mii_ioctl(struct phy_device *phy
- }
-
- phy_write(phydev, mii_data->reg_num, val);
--
-- if (mii_data->reg_num == MII_BMCR
-+
-+ if (mii_data->reg_num == MII_BMCR
- && val & BMCR_RESET
- && phydev->drv->config_init) {
- phy_scan_fixups(phydev);
-@@ -471,7 +515,7 @@ static void phy_force_reduction(struct p
- int idx;
-
- idx = phy_find_setting(phydev->speed, phydev->duplex);
--
-+
- idx++;
-
- idx = phy_find_valid(idx, phydev->supported);
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -489,6 +489,7 @@ void phy_start_machine(struct phy_device
- void phy_stop_machine(struct phy_device *phydev);
- int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd);
- int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd);
-+int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr);
- int phy_mii_ioctl(struct phy_device *phydev,
- struct mii_ioctl_data *mii_data, int cmd);
- int phy_start_interrupts(struct phy_device *phydev);
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -82,6 +82,11 @@ config LSI_ET1011C_PHY
- ---help---
- Supports the LSI ET1011C PHY.
-
-+config ADM6996_PHY
-+ tristate "Driver for ADM6996 switches"
-+ ---help---
-+ Currently supports the ADM6996F switch
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -12,6 +12,7 @@ obj-$(CONFIG_SMSC_PHY) += smsc.o
- obj-$(CONFIG_VITESSE_PHY) += vitesse.o
- obj-$(CONFIG_BROADCOM_PHY) += broadcom.o
- obj-$(CONFIG_ICPLUS_PHY) += icplus.o
-+obj-$(CONFIG_ADM6996_PHY) += adm6996.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
+++ /dev/null
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -146,6 +146,18 @@ int phy_scan_fixups(struct phy_device *p
- }
- EXPORT_SYMBOL(phy_scan_fixups);
-
-+static int generic_receive_skb(struct sk_buff *skb)
-+{
-+ skb->protocol = eth_type_trans(skb, skb->dev);
-+ return netif_receive_skb(skb);
-+}
-+
-+static int generic_rx(struct sk_buff *skb)
-+{
-+ skb->protocol = eth_type_trans(skb, skb->dev);
-+ return netif_rx(skb);
-+}
-+
- struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id)
- {
- struct phy_device *dev;
-@@ -175,6 +187,8 @@ struct phy_device* phy_device_create(str
- dev_set_name(&dev->dev, PHY_ID_FMT, bus->id, addr);
-
- dev->state = PHY_DOWN;
-+ dev->netif_receive_skb = &generic_receive_skb;
-+ dev->netif_rx = &generic_rx;
-
- mutex_init(&dev->lock);
-
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -325,6 +325,20 @@ struct phy_device {
- void (*adjust_link)(struct net_device *dev);
-
- void (*adjust_state)(struct net_device *dev);
-+
-+ /*
-+ * By default these point to the original functions
-+ * with the same name. adding them to the phy_device
-+ * allows the phy driver to override them for packet
-+ * mangling if the ethernet driver supports it
-+ * This is required to support some really horrible
-+ * switches such as the Marvell 88E6060
-+ */
-+ int (*netif_receive_skb)(struct sk_buff *skb);
-+ int (*netif_rx)(struct sk_buff *skb);
-+
-+ /* alignment offset for packets */
-+ int pkt_align;
- };
- #define to_phy_device(d) container_of(d, struct phy_device, dev)
-
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -804,6 +804,7 @@ struct net_device
- void *ax25_ptr; /* AX.25 specific data */
- struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data,
- assign before registering */
-+ void *phy_ptr; /* PHY device specific data */
-
- /*
- * Cache line mostly used on receive path (including eth_type_trans())
+++ /dev/null
-commit 2e302ebfeac04beb5a5d6af1ac583c6a1fb76d1a
-Author: chas williams - CONTRACTOR <chas@cmf.nrl.navy.mil>
-Date: Fri Dec 4 11:06:32 2009 +0000
-
- atm: [br2684] allow routed mode operation again
-
- in routed mode, we don't have a hardware address so netdev_ops doesnt
- need to validate our hardware address via .ndo_validate_addr
-
- Reported-by: Manuel Fuentes <mfuentes@agenciaefe.com>
- Signed-off-by: Chas Williams - CONTRACTOR <chas@cmf.nrl.navy.mil>
- Signed-off-by: David S. Miller <davem@davemloft.net>
-
---- a/net/atm/br2684.c
-+++ b/net/atm/br2684.c
-@@ -536,6 +536,12 @@ static const struct net_device_ops br268
- .ndo_validate_addr = eth_validate_addr,
- };
-
-+static const struct net_device_ops br2684_netdev_ops_routed = {
-+ .ndo_start_xmit = br2684_start_xmit,
-+ .ndo_set_mac_address = br2684_mac_addr,
-+ .ndo_change_mtu = eth_change_mtu
-+};
-+
- static void br2684_setup(struct net_device *netdev)
- {
- struct br2684_dev *brdev = BRPRIV(netdev);
-@@ -551,11 +557,10 @@ static void br2684_setup(struct net_devi
- static void br2684_setup_routed(struct net_device *netdev)
- {
- struct br2684_dev *brdev = BRPRIV(netdev);
-- brdev->net_dev = netdev;
-
-+ brdev->net_dev = netdev;
- netdev->hard_header_len = 0;
--
-- netdev->netdev_ops = &br2684_netdev_ops;
-+ netdev->netdev_ops = &br2684_netdev_ops_routed;
- netdev->addr_len = 0;
- netdev->mtu = 1500;
- netdev->type = ARPHRD_PPP;
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -13,6 +13,12 @@ menuconfig PHYLIB
-
- if PHYLIB
-
-+config SWCONFIG
-+ tristate "Switch configuration API"
-+ ---help---
-+ Switch configuration API using netlink. This allows
-+ you to configure the VLAN features of certain switches.
-+
- comment "MII PHY device drivers"
-
- config MARVELL_PHY
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -3,6 +3,7 @@
- libphy-objs := phy.o phy_device.o mdio_bus.o
-
- obj-$(CONFIG_PHYLIB) += libphy.o
-+obj-$(CONFIG_SWCONFIG) += swconfig.o
- obj-$(CONFIG_MARVELL_PHY) += marvell.o
- obj-$(CONFIG_DAVICOM_PHY) += davicom.o
- obj-$(CONFIG_CICADA_PHY) += cicada.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -93,6 +93,9 @@ config ADM6996_PHY
- ---help---
- Currently supports the ADM6996F switch
-
-+config MVSWITCH_PHY
-+ tristate "Driver for Marvell 88E6060 switches"
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -14,6 +14,7 @@ obj-$(CONFIG_VITESSE_PHY) += vitesse.o
- obj-$(CONFIG_BROADCOM_PHY) += broadcom.o
- obj-$(CONFIG_ICPLUS_PHY) += icplus.o
- obj-$(CONFIG_ADM6996_PHY) += adm6996.o
-+obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -96,6 +96,10 @@ config ADM6996_PHY
- config MVSWITCH_PHY
- tristate "Driver for Marvell 88E6060 switches"
-
-+config IP175C_PHY
-+ tristate "Driver for IC+ IP175C/IP178C switches"
-+ select SWCONFIG
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -15,6 +15,7 @@ obj-$(CONFIG_BROADCOM_PHY) += broadcom.o
- obj-$(CONFIG_ICPLUS_PHY) += icplus.o
- obj-$(CONFIG_ADM6996_PHY) += adm6996.o
- obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
-+obj-$(CONFIG_IP175C_PHY) += ip175c.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -100,6 +100,10 @@ config IP175C_PHY
- tristate "Driver for IC+ IP175C/IP178C switches"
- select SWCONFIG
-
-+config AR8216_PHY
-+ tristate "Driver for Atheros AR8216 switches"
-+ select SWCONFIG
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -17,6 +17,7 @@ obj-$(CONFIG_ADM6996_PHY) += adm6996.o
- obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
- obj-$(CONFIG_IP175C_PHY) += ip175c.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
-+obj-$(CONFIG_AR8216_PHY) += ar8216.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
- obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -104,6 +104,10 @@ config AR8216_PHY
- tristate "Driver for Atheros AR8216 switches"
- select SWCONFIG
-
-+config RTL8306_PHY
-+ tristate "Driver for Realtek RTL8306S switches"
-+ select SWCONFIG
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -18,6 +18,7 @@ obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
- obj-$(CONFIG_IP175C_PHY) += ip175c.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_AR8216_PHY) += ar8216.o
-+obj-$(CONFIG_RTL8306_PHY) += rtl8306.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
- obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -135,4 +135,29 @@ config MDIO_GPIO
- To compile this driver as a module, choose M here: the module
- will be called mdio-gpio.
-
-+config RTL8366_SMI
-+ tristate "Driver for the RTL8366 SMI interface"
-+ depends on GENERIC_GPIO
-+ ---help---
-+ This module implements the SMI interface protocol which is used
-+ by some RTL8366 ethernet switch devices via the generic GPIO API.
-+
-+if RTL8366_SMI
-+
-+config RTL8366S_PHY
-+ tristate "Driver for the Realtek RTL8366S switch"
-+ select SWCONFIG
-+
-+config RTL8366RB_PHY
-+ tristate "Driver for the Realtek RTL8366RB switch"
-+ select SWCONFIG
-+
-+config RTL8366S_PHY_DEBUG_FS
-+ bool "RTL8366 switch driver DEBUG_FS support"
-+ depends on RTL8366S_PHY || RTL8366RB_PHY
-+ depends on DEBUG_FS
-+ default n
-+
-+endif # RTL8366_SMI
-+
- endif # PHYLIB
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -19,6 +19,9 @@ obj-$(CONFIG_IP175C_PHY) += ip175c.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_AR8216_PHY) += ar8216.o
- obj-$(CONFIG_RTL8306_PHY) += rtl8306.o
-+obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi.o
-+obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o
-+obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
- obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
+++ /dev/null
---- a/drivers/rtc/Kconfig
-+++ b/drivers/rtc/Kconfig
-@@ -535,6 +535,15 @@ config RTC_DRV_PCF50633
- If you say yes here you get support for the RTC subsystem of the
- NXP PCF50633 used in embedded systems.
-
-+config RTC_DRV_RTC7301
-+ tristate "Epson RTC-7301 SF/DG"
-+ help
-+ If you say Y here you will get support for the
-+ Epson RTC-7301 SF/DG RTC chips.
-+
-+ This driver can also be built as a module. If so, the module
-+ will be called rtc-7301.
-+
- comment "on-CPU RTC drivers"
-
- config RTC_DRV_OMAP
---- a/drivers/rtc/Makefile
-+++ b/drivers/rtc/Makefile
-@@ -62,6 +62,7 @@ obj-$(CONFIG_RTC_DRV_R9701) += rtc-r9701
- obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o
- obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o
- obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o
-+obj-$(CONFIG_RTC_DRV_RTC7301) += rtc-rtc7301.o
- obj-$(CONFIG_RTC_DRV_RX8025) += rtc-rx8025.o
- obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o
- obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o
---- /dev/null
-+++ b/drivers/rtc/rtc-rtc7301.c
-@@ -0,0 +1,219 @@
-+/*
-+ * Driver for Epson RTC-7301SF/DG
-+ *
-+ * Copyright (C) 2009 Jose Vasconcellos
-+ *
-+ * This program is free software; you can 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/rtc.h>
-+#include <linux/platform_device.h>
-+#include <linux/io.h>
-+#include <linux/delay.h>
-+#include <linux/bcd.h>
-+
-+#define RTC_NAME "rtc7301"
-+#define RTC_VERSION "0.1"
-+
-+/* Epson RTC-7301 register addresses */
-+#define RTC7301_SEC 0x00
-+#define RTC7301_SEC10 0x01
-+#define RTC7301_MIN 0x02
-+#define RTC7301_MIN10 0x03
-+#define RTC7301_HOUR 0x04
-+#define RTC7301_HOUR10 0x05
-+#define RTC7301_WEEKDAY 0x06
-+#define RTC7301_DAY 0x07
-+#define RTC7301_DAY10 0x08
-+#define RTC7301_MON 0x09
-+#define RTC7301_MON10 0x0A
-+#define RTC7301_YEAR 0x0B
-+#define RTC7301_YEAR10 0x0C
-+#define RTC7301_YEAR100 0x0D
-+#define RTC7301_YEAR1000 0x0E
-+#define RTC7301_CTRLREG 0x0F
-+
-+static uint8_t __iomem *rtc7301_base;
-+
-+#define read_reg(offset) (readb(rtc7301_base + offset) & 0xf)
-+#define write_reg(offset, data) writeb(data, rtc7301_base + (offset))
-+
-+#define rtc7301_isbusy() (read_reg(RTC7301_CTRLREG) & 1)
-+
-+static void rtc7301_init_settings(void)
-+{
-+ int i;
-+
-+ write_reg(RTC7301_CTRLREG, 2);
-+ write_reg(RTC7301_YEAR1000, 2);
-+ udelay(122);
-+
-+ /* bank 1 */
-+ write_reg(RTC7301_CTRLREG, 6);
-+ for (i=0; i<15; i++)
-+ write_reg(i, 0);
-+
-+ /* bank 2 */
-+ write_reg(RTC7301_CTRLREG, 14);
-+ for (i=0; i<15; i++)
-+ write_reg(i, 0);
-+ write_reg(RTC7301_CTRLREG, 0);
-+}
-+
-+static int rtc7301_get_datetime(struct device *dev, struct rtc_time *dt)
-+{
-+ int cnt;
-+ uint8_t buf[16];
-+
-+ cnt = 0;
-+ while (rtc7301_isbusy()) {
-+ udelay(244);
-+ if (cnt++ > 100) {
-+ dev_err(dev, "%s: timeout error %x\n", __func__, rtc7301_base[RTC7301_CTRLREG]);
-+ return -EIO;
-+ }
-+ }
-+
-+ for (cnt=0; cnt<16; cnt++)
-+ buf[cnt] = read_reg(cnt);
-+
-+ if (buf[RTC7301_SEC10] & 8) {
-+ dev_err(dev, "%s: RTC not set\n", __func__);
-+ return -EINVAL;
-+ }
-+
-+ memset(dt, 0, sizeof(*dt));
-+
-+ dt->tm_sec = buf[RTC7301_SEC] + buf[RTC7301_SEC10]*10;
-+ dt->tm_min = buf[RTC7301_MIN] + buf[RTC7301_MIN10]*10;
-+ dt->tm_hour = buf[RTC7301_HOUR] + buf[RTC7301_HOUR10]*10;
-+
-+ dt->tm_mday = buf[RTC7301_DAY] + buf[RTC7301_DAY10]*10;
-+ dt->tm_mon = buf[RTC7301_MON] + buf[RTC7301_MON10]*10 - 1;
-+ dt->tm_year = buf[RTC7301_YEAR] + buf[RTC7301_YEAR10]*10 +
-+ buf[RTC7301_YEAR100]*100 +
-+ ((buf[RTC7301_YEAR1000] & 3)*1000) - 1900;
-+
-+ /* the rtc device may contain illegal values on power up
-+ * according to the data sheet. make sure they are valid.
-+ */
-+
-+ return rtc_valid_tm(dt);
-+}
-+
-+static int rtc7301_set_datetime(struct device *dev, struct rtc_time *dt)
-+{
-+ int data;
-+
-+ data = dt->tm_year + 1900;
-+ if (data >= 2100 || data < 1900)
-+ return -EINVAL;
-+
-+ write_reg(RTC7301_CTRLREG, 2);
-+ udelay(122);
-+
-+ data = bin2bcd(dt->tm_sec);
-+ write_reg(RTC7301_SEC, data);
-+ write_reg(RTC7301_SEC10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_min);
-+ write_reg(RTC7301_MIN, data );
-+ write_reg(RTC7301_MIN10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_hour);
-+ write_reg(RTC7301_HOUR, data);
-+ write_reg(RTC7301_HOUR10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_mday);
-+ write_reg(RTC7301_DAY, data);
-+ write_reg(RTC7301_DAY10, (data>> 4));
-+
-+ data = bin2bcd(dt->tm_mon + 1);
-+ write_reg(RTC7301_MON, data);
-+ write_reg(RTC7301_MON10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_year % 100);
-+ write_reg(RTC7301_YEAR, data);
-+ write_reg(RTC7301_YEAR10, (data >> 4));
-+ data = bin2bcd((1900 + dt->tm_year) / 100);
-+ write_reg(RTC7301_YEAR100, data);
-+
-+ data = bin2bcd(dt->tm_wday);
-+ write_reg(RTC7301_WEEKDAY, data);
-+
-+ write_reg(RTC7301_CTRLREG, 0);
-+
-+ return 0;
-+}
-+
-+static const struct rtc_class_ops rtc7301_rtc_ops = {
-+ .read_time = rtc7301_get_datetime,
-+ .set_time = rtc7301_set_datetime,
-+};
-+
-+static int __devinit rtc7301_probe(struct platform_device *pdev)
-+{
-+ struct rtc_device *rtc;
-+ struct resource *res;
-+
-+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ if (!res)
-+ return -ENOENT;
-+
-+ rtc7301_base = ioremap_nocache(res->start, 0x1000 /*res->end - res->start + 1*/);
-+ if (!rtc7301_base)
-+ return -EINVAL;
-+
-+ rtc = rtc_device_register(RTC_NAME, &pdev->dev,
-+ &rtc7301_rtc_ops, THIS_MODULE);
-+ if (IS_ERR(rtc)) {
-+ iounmap(rtc7301_base);
-+ return PTR_ERR(rtc);
-+ }
-+
-+ platform_set_drvdata(pdev, rtc);
-+
-+ rtc7301_init_settings();
-+ return 0;
-+}
-+
-+static int __devexit rtc7301_remove(struct platform_device *pdev)
-+{
-+ struct rtc_device *rtc = platform_get_drvdata(pdev);
-+
-+ if (rtc)
-+ rtc_device_unregister(rtc);
-+ if (rtc7301_base)
-+ iounmap(rtc7301_base);
-+ return 0;
-+}
-+
-+static struct platform_driver rtc7301_driver = {
-+ .driver = {
-+ .name = RTC_NAME,
-+ .owner = THIS_MODULE,
-+ },
-+ .probe = rtc7301_probe,
-+ .remove = __devexit_p(rtc7301_remove),
-+};
-+
-+static __init int rtc7301_init(void)
-+{
-+ return platform_driver_register(&rtc7301_driver);
-+}
-+module_init(rtc7301_init);
-+
-+static __exit void rtc7301_exit(void)
-+{
-+ platform_driver_unregister(&rtc7301_driver);
-+}
-+module_exit(rtc7301_exit);
-+
-+MODULE_DESCRIPTION("Epson 7301 RTC driver");
-+MODULE_AUTHOR("Jose Vasconcellos <jvasco@verizon.net>");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS("platform:" RTC_NAME);
-+MODULE_VERSION(RTC_VERSION);
+++ /dev/null
---- a/include/linux/fb.h
-+++ b/include/linux/fb.h
-@@ -124,6 +124,7 @@ struct dentry;
- #define FB_ACCEL_TRIDENT_BLADE3D 52 /* Trident Blade3D */
- #define FB_ACCEL_TRIDENT_BLADEXP 53 /* Trident BladeXP */
- #define FB_ACCEL_CIRRUS_ALPINE 53 /* Cirrus Logic 543x/544x/5480 */
-+#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 */
---- a/include/linux/Kbuild
-+++ b/include/linux/Kbuild
-@@ -76,6 +76,8 @@ header-y += genetlink.h
- header-y += gen_stats.h
- header-y += gfs2_ondisk.h
- header-y += gigaset_dev.h
-+header-y += glamofb.h
-+header-y += glamo-engine.h
- header-y += hysdn_if.h
- header-y += i2o-dev.h
- header-y += i8k.h
+++ /dev/null
-commit 5ced436d549d911ce610ea47d85f71fae5bbfce4
-Author: Lars-Peter Clausen <lars@metafoo.de>
-Date: Fri Jul 31 18:26:48 2009 +0200
-
- ASoC: jack: Fix race in snd_soc_jack_add_gpios
-
- The irq can fire as soon as it has been requested, thus all fields accessed
- from within the irq handler must be initialized prior to requesting the irq.
-
- Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
-
---- a/sound/soc/soc-jack.c
-+++ b/sound/soc/soc-jack.c
-@@ -220,6 +220,9 @@ int snd_soc_jack_add_gpios(struct snd_so
- if (ret)
- goto err;
-
-+ INIT_WORK(&gpios[i].work, gpio_work);
-+ gpios[i].jack = jack;
-+
- ret = request_irq(gpio_to_irq(gpios[i].gpio),
- gpio_handler,
- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-@@ -227,9 +230,6 @@ int snd_soc_jack_add_gpios(struct snd_so
- &gpios[i]);
- if (ret)
- goto err;
--
-- INIT_WORK(&gpios[i].work, gpio_work);
-- gpios[i].jack = jack;
- }
-
- return 0;
+++ /dev/null
---- a/drivers/usb/serial/usb-serial.c
-+++ b/drivers/usb/serial/usb-serial.c
-@@ -60,6 +60,7 @@ static struct usb_driver usb_serial_driv
- drivers depend on it.
- */
-
-+static ushort maxSize = 0;
- static int debug;
- /* initially all NULL */
- static struct usb_serial *serial_table[SERIAL_TTY_MINORS];
-@@ -947,7 +948,7 @@ int usb_serial_probe(struct usb_interfac
- dev_err(&interface->dev, "No free urbs available\n");
- goto probe_error;
- }
-- buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
-+ buffer_size = (endpoint->wMaxPacketSize > maxSize) ? endpoint->wMaxPacketSize : maxSize;
- port->bulk_in_size = buffer_size;
- port->bulk_in_endpointAddress = endpoint->bEndpointAddress;
- port->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
-@@ -1381,3 +1382,5 @@ MODULE_LICENSE("GPL");
-
- module_param(debug, bool, S_IRUGO | S_IWUSR);
- MODULE_PARM_DESC(debug, "Debug enabled or not");
-+module_param(maxSize, ushort,0);
-+MODULE_PARM_DESC(maxSize,"User specified USB endpoint size");
+++ /dev/null
---- a/init/main.c
-+++ b/init/main.c
-@@ -839,7 +839,7 @@ static noinline int init_post(void)
- numa_default_policy();
-
- if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
-- printk(KERN_WARNING "Warning: unable to open an initial console.\n");
-+ printk(KERN_WARNING "Please be patient, while OpenWrt loads ...\n");
-
- (void) sys_dup(0);
- (void) sys_dup(0);
+++ /dev/null
---- a/scripts/genksyms/parse.c_shipped
-+++ b/scripts/genksyms/parse.c_shipped
-@@ -160,7 +160,9 @@
-
-
- #include <assert.h>
-+#ifndef __APPLE__
- #include <malloc.h>
-+#endif
- #include "genksyms.h"
-
- static int is_typedef;
---- a/scripts/genksyms/parse.y
-+++ b/scripts/genksyms/parse.y
-@@ -24,7 +24,9 @@
- %{
-
- #include <assert.h>
-+#ifndef __APPLE__
- #include <malloc.h>
-+#endif
- #include "genksyms.h"
-
- static int is_typedef;
---- a/scripts/kallsyms.c
-+++ b/scripts/kallsyms.c
-@@ -22,6 +22,35 @@
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
-+#ifdef __APPLE__
-+/* Darwin has no memmem implementation, this one is ripped of the uClibc-0.9.28 source */
-+void *memmem (const void *haystack, size_t haystack_len,
-+ const void *needle, size_t needle_len)
-+{
-+ const char *begin;
-+ const char *const last_possible
-+ = (const char *) haystack + haystack_len - needle_len;
-+
-+ if (needle_len == 0)
-+ /* The first occurrence of the empty string is deemed to occur at
-+ the beginning of the string. */
-+ return (void *) haystack;
-+
-+ /* Sanity check, otherwise the loop might search through the whole
-+ memory. */
-+ if (__builtin_expect (haystack_len < needle_len, 0))
-+ return NULL;
-+
-+ for (begin = (const char *) haystack; begin <= last_possible; ++begin)
-+ if (begin[0] == ((const char *) needle)[0] &&
-+ !memcmp ((const void *) &begin[1],
-+ (const void *) ((const char *) needle + 1),
-+ needle_len - 1))
-+ return (void *) begin;
-+
-+ return NULL;
-+}
-+#endif
-
- #ifndef ARRAY_SIZE
- #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
---- a/scripts/kconfig/Makefile
-+++ b/scripts/kconfig/Makefile
-@@ -97,6 +97,9 @@ check-lxdialog := $(srctree)/$(src)/lxd
- # we really need to do so. (Do not call gcc as part of make mrproper)
- HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
- HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
-+ifeq ($(shell uname -s),Darwin)
-+HOST_LOADLIBES += -lncurses
-+endif
-
- HOST_EXTRACFLAGS += -DLOCALE
-
---- a/scripts/mod/mk_elfconfig.c
-+++ b/scripts/mod/mk_elfconfig.c
-@@ -1,7 +1,11 @@
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-+#ifndef __APPLE__
- #include <elf.h>
-+#else
-+#include "../../../../../tools/sstrip/include/elf.h"
-+#endif
-
- int
- main(int argc, char **argv)
---- a/scripts/mod/modpost.h
-+++ b/scripts/mod/modpost.h
-@@ -7,7 +7,11 @@
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <unistd.h>
-+#if !(defined(__APPLE__) || defined(__CYGWIN__))
- #include <elf.h>
-+#else
-+#include "../../../../../tools/sstrip/include/elf.h"
-+#endif
-
- #include "elfconfig.h"
-
+++ /dev/null
---- a/drivers/net/wireless/hostap/hostap_ap.c
-+++ b/drivers/net/wireless/hostap/hostap_ap.c
-@@ -2335,13 +2335,13 @@ int prism2_ap_get_sta_qual(local_info_t
- addr[count].sa_family = ARPHRD_ETHER;
- memcpy(addr[count].sa_data, sta->addr, ETH_ALEN);
- if (sta->last_rx_silence == 0)
-- qual[count].qual = sta->last_rx_signal < 27 ?
-- 0 : (sta->last_rx_signal - 27) * 92 / 127;
-+ qual[count].qual = (sta->last_rx_signal - 156) == 0 ?
-+ 0 : (sta->last_rx_signal - 156) * 92 / 64;
- else
-- qual[count].qual = sta->last_rx_signal -
-- sta->last_rx_silence - 35;
-- qual[count].level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);
-- qual[count].noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);
-+ qual[count].qual = (sta->last_rx_signal -
-+ sta->last_rx_silence) * 92 / 64;
-+ qual[count].level = sta->last_rx_signal;
-+ qual[count].noise = sta->last_rx_silence;
- qual[count].updated = sta->last_rx_updated;
-
- sta->last_rx_updated = IW_QUAL_DBM;
-@@ -2407,13 +2407,13 @@ int prism2_ap_translate_scan(struct net_
- memset(&iwe, 0, sizeof(iwe));
- iwe.cmd = IWEVQUAL;
- if (sta->last_rx_silence == 0)
-- iwe.u.qual.qual = sta->last_rx_signal < 27 ?
-- 0 : (sta->last_rx_signal - 27) * 92 / 127;
-+ iwe.u.qual.qual = (sta->last_rx_signal -156) == 0 ?
-+ 0 : (sta->last_rx_signal - 156) * 92 / 64;
- else
-- iwe.u.qual.qual = sta->last_rx_signal -
-- sta->last_rx_silence - 35;
-- iwe.u.qual.level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);
-- iwe.u.qual.noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);
-+ iwe.u.qual.qual = (sta->last_rx_signal -
-+ sta->last_rx_silence) * 92 / 64;
-+ iwe.u.qual.level = sta->last_rx_signal;
-+ iwe.u.qual.noise = sta->last_rx_silence;
- iwe.u.qual.updated = sta->last_rx_updated;
- iwe.len = IW_EV_QUAL_LEN;
- current_ev = iwe_stream_add_event(info, current_ev, end_buf,
---- a/drivers/net/wireless/hostap/hostap_config.h
-+++ b/drivers/net/wireless/hostap/hostap_config.h
-@@ -45,4 +45,9 @@
- */
- /* #define PRISM2_NO_STATION_MODES */
-
-+/* Enable TX power Setting functions
-+ * (min att = -128 , max att = 127)
-+ */
-+#define RAW_TXPOWER_SETTING
-+
- #endif /* HOSTAP_CONFIG_H */
---- a/drivers/net/wireless/hostap/hostap.h
-+++ b/drivers/net/wireless/hostap/hostap.h
-@@ -90,6 +90,7 @@ extern const struct iw_handler_def hosta
- extern const struct ethtool_ops prism2_ethtool_ops;
-
- int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
-+int hostap_restore_power(struct net_device *dev);
-
-
- #endif /* HOSTAP_H */
---- a/drivers/net/wireless/hostap/hostap_hw.c
-+++ b/drivers/net/wireless/hostap/hostap_hw.c
-@@ -932,6 +932,7 @@ static int hfa384x_set_rid(struct net_de
- prism2_hw_reset(dev);
- }
-
-+ hostap_restore_power(dev);
- return res;
- }
-
---- a/drivers/net/wireless/hostap/hostap_info.c
-+++ b/drivers/net/wireless/hostap/hostap_info.c
-@@ -431,6 +431,11 @@ static void handle_info_queue_linkstatus
- }
-
- /* Get BSSID if we have a valid AP address */
-+
-+ if ( val == HFA384X_LINKSTATUS_CONNECTED ||
-+ val == HFA384X_LINKSTATUS_DISCONNECTED )
-+ hostap_restore_power(local->dev);
-+
- if (connected) {
- netif_carrier_on(local->dev);
- netif_carrier_on(local->ddev);
---- a/drivers/net/wireless/hostap/hostap_ioctl.c
-+++ b/drivers/net/wireless/hostap/hostap_ioctl.c
-@@ -1475,23 +1475,20 @@ static int prism2_txpower_hfa386x_to_dBm
- val = 255;
-
- tmp = val;
-- tmp >>= 2;
-
-- return -12 - tmp;
-+ return tmp;
- }
-
- static u16 prism2_txpower_dBm_to_hfa386x(int val)
- {
- signed char tmp;
-
-- if (val > 20)
-- return 128;
-- else if (val < -43)
-+ if (val > 127)
- return 127;
-+ else if (val < -128)
-+ return 128;
-
- tmp = val;
-- tmp = -12 - tmp;
-- tmp <<= 2;
-
- return (unsigned char) tmp;
- }
-@@ -4055,3 +4052,35 @@ int hostap_ioctl(struct net_device *dev,
-
- return ret;
- }
-+
-+/* BUG FIX: Restore power setting value when lost due to F/W bug */
-+
-+int hostap_restore_power(struct net_device *dev)
-+{
-+ struct hostap_interface *iface = netdev_priv(dev);
-+ local_info_t *local = iface->local;
-+
-+ u16 val;
-+ int ret = 0;
-+
-+ if (local->txpower_type == PRISM2_TXPOWER_OFF) {
-+ val = 0xff; /* use all standby and sleep modes */
-+ ret = local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
-+ HFA386X_CR_A_D_TEST_MODES2,
-+ &val, NULL);
-+ }
-+
-+#ifdef RAW_TXPOWER_SETTING
-+ if (local->txpower_type == PRISM2_TXPOWER_FIXED) {
-+ val = HFA384X_TEST_CFG_BIT_ALC;
-+ local->func->cmd(dev, HFA384X_CMDCODE_TEST |
-+ (HFA384X_TEST_CFG_BITS << 8), 0, &val, NULL);
-+ val = prism2_txpower_dBm_to_hfa386x(local->txpower);
-+ ret = (local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
-+ HFA386X_CR_MANUAL_TX_POWER, &val, NULL));
-+ }
-+#endif /* RAW_TXPOWER_SETTING */
-+ return (ret ? -EOPNOTSUPP : 0);
-+}
-+
-+EXPORT_SYMBOL(hostap_restore_power);
+++ /dev/null
---- a/include/linux/stddef.h
-+++ b/include/linux/stddef.h
-@@ -16,6 +16,7 @@ enum {
- false = 0,
- true = 1
- };
-+#endif /* __KERNEL__ */
-
- #undef offsetof
- #ifdef __compiler_offsetof
-@@ -23,6 +24,5 @@ enum {
- #else
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
- #endif
--#endif /* __KERNEL__ */
-
- #endif
+++ /dev/null
---- a/arch/x86/boot/tools/build.c
-+++ b/arch/x86/boot/tools/build.c
-@@ -29,7 +29,6 @@
- #include <stdarg.h>
- #include <sys/types.h>
- #include <sys/stat.h>
--#include <sys/sysmacros.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/mman.h>
+++ /dev/null
-Fix spi-gpio for hotplug.
-
---mb
-
-
-
---- a/drivers/spi/spi_gpio.c
-+++ b/drivers/spi/spi_gpio.c
-@@ -218,7 +218,7 @@ static void spi_gpio_cleanup(struct spi_
- spi_bitbang_cleanup(spi);
- }
-
--static int __init spi_gpio_alloc(unsigned pin, const char *label, bool is_in)
-+static int __devinit spi_gpio_alloc(unsigned pin, const char *label, bool is_in)
- {
- int value;
-
-@@ -232,7 +232,7 @@ static int __init spi_gpio_alloc(unsigne
- return value;
- }
-
--static int __init
-+static int __devinit
- spi_gpio_request(struct spi_gpio_platform_data *pdata, const char *label)
- {
- int value;
-@@ -261,7 +261,7 @@ done:
- return value;
- }
-
--static int __init spi_gpio_probe(struct platform_device *pdev)
-+static int __devinit spi_gpio_probe(struct platform_device *pdev)
- {
- int status;
- struct spi_master *master;
-@@ -317,7 +317,7 @@ gpio_free:
- return status;
- }
-
--static int __exit spi_gpio_remove(struct platform_device *pdev)
-+static int __devexit spi_gpio_remove(struct platform_device *pdev)
- {
- struct spi_gpio *spi_gpio;
- struct spi_gpio_platform_data *pdata;
-@@ -344,12 +344,13 @@ MODULE_ALIAS("platform:" DRIVER_NAME);
- static struct platform_driver spi_gpio_driver = {
- .driver.name = DRIVER_NAME,
- .driver.owner = THIS_MODULE,
-- .remove = __exit_p(spi_gpio_remove),
-+ .probe = spi_gpio_probe,
-+ .remove = __devexit_p(spi_gpio_remove),
- };
-
- static int __init spi_gpio_init(void)
- {
-- return platform_driver_probe(&spi_gpio_driver, spi_gpio_probe);
-+ return platform_driver_register(&spi_gpio_driver);
- }
- module_init(spi_gpio_init);
-
+++ /dev/null
-Implement the SPI-GPIO delay function for busses that need speed limitation.
-
---mb
-
-
-
---- a/drivers/spi/spi_gpio.c
-+++ b/drivers/spi/spi_gpio.c
-@@ -21,6 +21,7 @@
- #include <linux/init.h>
- #include <linux/platform_device.h>
- #include <linux/gpio.h>
-+#include <linux/delay.h>
-
- #include <linux/spi/spi.h>
- #include <linux/spi/spi_bitbang.h>
-@@ -69,6 +70,7 @@ struct spi_gpio {
- * #define SPI_MOSI_GPIO 120
- * #define SPI_SCK_GPIO 121
- * #define SPI_N_CHIPSEL 4
-+ * #undef NEED_SPIDELAY
- * #include "spi_gpio.c"
- */
-
-@@ -76,6 +78,7 @@ struct spi_gpio {
- #define DRIVER_NAME "spi_gpio"
-
- #define GENERIC_BITBANG /* vs tight inlines */
-+#define NEED_SPIDELAY 1
-
- /* all functions referencing these symbols must define pdata */
- #define SPI_MISO_GPIO ((pdata)->miso)
-@@ -120,12 +123,20 @@ static inline int getmiso(const struct s
- #undef pdata
-
- /*
-- * NOTE: this clocks "as fast as we can". It "should" be a function of the
-- * requested device clock. Software overhead means we usually have trouble
-- * reaching even one Mbit/sec (except when we can inline bitops), so for now
-- * we'll just assume we never need additional per-bit slowdowns.
-+ * NOTE: to clock "as fast as we can", set spi_device.max_speed_hz
-+ * and spi_transfer.speed_hz to 0.
-+ * Otherwise this is a function of the requested device clock.
-+ * Software overhead means we usually have trouble
-+ * reaching even one Mbit/sec (except when we can inline bitops). So on small
-+ * embedded devices with fast SPI slaves you usually don't need a delay.
- */
--#define spidelay(nsecs) do {} while (0)
-+static inline void spidelay(unsigned nsecs)
-+{
-+#ifdef NEED_SPIDELAY
-+ if (unlikely(nsecs))
-+ ndelay(nsecs);
-+#endif /* NEED_SPIDELAY */
-+}
-
- #define EXPAND_BITBANG_TXRX
- #include <linux/spi/spi_bitbang.h>
+++ /dev/null
-THIS CODE IS DEPRECATED.
-
-Please use the new mainline SPI-GPIO driver, as of 2.6.29.
-
---mb
-
-
-
---- /dev/null
-+++ b/include/linux/spi/spi_gpio_old.h
-@@ -0,0 +1,73 @@
-+/*
-+ * spi_gpio interface to platform code
-+ *
-+ * Copyright (c) 2008 Piotr Skamruk
-+ * Copyright (c) 2008 Michael Buesch
-+ *
-+ * This program is free software; you can 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 _LINUX_SPI_SPI_GPIO
-+#define _LINUX_SPI_SPI_GPIO
-+
-+#include <linux/types.h>
-+#include <linux/spi/spi.h>
-+
-+
-+/**
-+ * struct spi_gpio_platform_data - Data definitions for a SPI-GPIO device.
-+ *
-+ * This structure holds information about a GPIO-based SPI device.
-+ *
-+ * @pin_clk: The GPIO pin number of the CLOCK pin.
-+ *
-+ * @pin_miso: The GPIO pin number of the MISO pin.
-+ *
-+ * @pin_mosi: The GPIO pin number of the MOSI pin.
-+ *
-+ * @pin_cs: The GPIO pin number of the CHIPSELECT pin.
-+ *
-+ * @cs_activelow: If true, the chip is selected when the CS line is low.
-+ *
-+ * @no_spi_delay: If true, no delay is done in the lowlevel bitbanging.
-+ * Note that doing no delay is not standards compliant,
-+ * but it might be needed to speed up transfers on some
-+ * slow embedded machines.
-+ *
-+ * @boardinfo_setup: This callback is called after the
-+ * SPI master device was registered, but before the
-+ * device is registered.
-+ * @boardinfo_setup_data: Data argument passed to boardinfo_setup().
-+ */
-+struct spi_gpio_platform_data {
-+ unsigned int pin_clk;
-+ unsigned int pin_miso;
-+ unsigned int pin_mosi;
-+ unsigned int pin_cs;
-+ bool cs_activelow;
-+ bool no_spi_delay;
-+ int (*boardinfo_setup)(struct spi_board_info *bi,
-+ struct spi_master *master,
-+ void *data);
-+ void *boardinfo_setup_data;
-+};
-+
-+/**
-+ * SPI_GPIO_PLATDEV_NAME - The platform device name string.
-+ *
-+ * The name string that has to be used for platform_device_alloc
-+ * when allocating a spi-gpio device.
-+ */
-+#define SPI_GPIO_PLATDEV_NAME "spi-gpio"
-+
-+/**
-+ * spi_gpio_next_id - Get another platform device ID number.
-+ *
-+ * This returns the next platform device ID number that has to be used
-+ * for platform_device_alloc. The ID is opaque and should not be used for
-+ * anything else.
-+ */
-+int spi_gpio_next_id(void);
-+
-+#endif /* _LINUX_SPI_SPI_GPIO */
---- /dev/null
-+++ b/drivers/spi/spi_gpio_old.c
-@@ -0,0 +1,251 @@
-+/*
-+ * Bitbanging SPI bus driver using GPIO API
-+ *
-+ * Copyright (c) 2008 Piotr Skamruk
-+ * Copyright (c) 2008 Michael Buesch
-+ *
-+ * based on spi_s3c2410_gpio.c
-+ * Copyright (c) 2006 Ben Dooks
-+ * Copyright (c) 2006 Simtec Electronics
-+ * and on i2c-gpio.c
-+ * Copyright (C) 2007 Atmel Corporation
-+ *
-+ * This program is free software; you can 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/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/spi/spi.h>
-+#include <linux/spi/spi_bitbang.h>
-+#include <linux/spi/spi_gpio_old.h>
-+#include <linux/gpio.h>
-+#include <asm/atomic.h>
-+
-+
-+struct spi_gpio {
-+ struct spi_bitbang bitbang;
-+ struct spi_gpio_platform_data *info;
-+ struct platform_device *pdev;
-+ struct spi_board_info bi;
-+};
-+
-+
-+static inline struct spi_gpio *spidev_to_sg(struct spi_device *dev)
-+{
-+ return dev->controller_data;
-+}
-+
-+static inline void setsck(struct spi_device *dev, int val)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+ gpio_set_value(sp->info->pin_clk, val ? 1 : 0);
-+}
-+
-+static inline void setmosi(struct spi_device *dev, int val)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+ gpio_set_value(sp->info->pin_mosi, val ? 1 : 0);
-+}
-+
-+static inline u32 getmiso(struct spi_device *dev)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+ return gpio_get_value(sp->info->pin_miso) ? 1 : 0;
-+}
-+
-+static inline void do_spidelay(struct spi_device *dev, unsigned nsecs)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+
-+ if (!sp->info->no_spi_delay)
-+ ndelay(nsecs);
-+}
-+
-+#define spidelay(nsecs) do { \
-+ /* Steal the spi_device pointer from our caller. \
-+ * The bitbang-API should probably get fixed here... */ \
-+ do_spidelay(spi, nsecs); \
-+ } while (0)
-+
-+#define EXPAND_BITBANG_TXRX
-+#include <linux/spi/spi_bitbang.h>
-+
-+static u32 spi_gpio_txrx_mode0(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
-+}
-+
-+static u32 spi_gpio_txrx_mode1(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits);
-+}
-+
-+static u32 spi_gpio_txrx_mode2(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits);
-+}
-+
-+static u32 spi_gpio_txrx_mode3(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits);
-+}
-+
-+static void spi_gpio_chipselect(struct spi_device *dev, int on)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+
-+ if (sp->info->cs_activelow)
-+ on = !on;
-+ gpio_set_value(sp->info->pin_cs, on ? 1 : 0);
-+}
-+
-+static int spi_gpio_probe(struct platform_device *pdev)
-+{
-+ struct spi_master *master;
-+ struct spi_gpio_platform_data *pdata;
-+ struct spi_gpio *sp;
-+ struct spi_device *spidev;
-+ int err;
-+
-+ pdata = pdev->dev.platform_data;
-+ if (!pdata)
-+ return -ENXIO;
-+
-+ err = -ENOMEM;
-+ master = spi_alloc_master(&pdev->dev, sizeof(struct spi_gpio));
-+ if (!master)
-+ goto err_alloc_master;
-+
-+ sp = spi_master_get_devdata(master);
-+ platform_set_drvdata(pdev, sp);
-+ sp->info = pdata;
-+
-+ err = gpio_request(pdata->pin_clk, "spi_clock");
-+ if (err)
-+ goto err_request_clk;
-+ err = gpio_request(pdata->pin_mosi, "spi_mosi");
-+ if (err)
-+ goto err_request_mosi;
-+ err = gpio_request(pdata->pin_miso, "spi_miso");
-+ if (err)
-+ goto err_request_miso;
-+ err = gpio_request(pdata->pin_cs, "spi_cs");
-+ if (err)
-+ goto err_request_cs;
-+
-+ sp->bitbang.master = spi_master_get(master);
-+ sp->bitbang.master->bus_num = -1;
-+ sp->bitbang.master->num_chipselect = 1;
-+ sp->bitbang.chipselect = spi_gpio_chipselect;
-+ sp->bitbang.txrx_word[SPI_MODE_0] = spi_gpio_txrx_mode0;
-+ sp->bitbang.txrx_word[SPI_MODE_1] = spi_gpio_txrx_mode1;
-+ sp->bitbang.txrx_word[SPI_MODE_2] = spi_gpio_txrx_mode2;
-+ sp->bitbang.txrx_word[SPI_MODE_3] = spi_gpio_txrx_mode3;
-+
-+ gpio_direction_output(pdata->pin_clk, 0);
-+ gpio_direction_output(pdata->pin_mosi, 0);
-+ gpio_direction_output(pdata->pin_cs,
-+ pdata->cs_activelow ? 1 : 0);
-+ gpio_direction_input(pdata->pin_miso);
-+
-+ err = spi_bitbang_start(&sp->bitbang);
-+ if (err)
-+ goto err_no_bitbang;
-+ err = pdata->boardinfo_setup(&sp->bi, master,
-+ pdata->boardinfo_setup_data);
-+ if (err)
-+ goto err_bi_setup;
-+ sp->bi.controller_data = sp;
-+ spidev = spi_new_device(master, &sp->bi);
-+ if (!spidev)
-+ goto err_new_dev;
-+
-+ return 0;
-+
-+err_new_dev:
-+err_bi_setup:
-+ spi_bitbang_stop(&sp->bitbang);
-+err_no_bitbang:
-+ spi_master_put(sp->bitbang.master);
-+ gpio_free(pdata->pin_cs);
-+err_request_cs:
-+ gpio_free(pdata->pin_miso);
-+err_request_miso:
-+ gpio_free(pdata->pin_mosi);
-+err_request_mosi:
-+ gpio_free(pdata->pin_clk);
-+err_request_clk:
-+ kfree(master);
-+
-+err_alloc_master:
-+ return err;
-+}
-+
-+static int __devexit spi_gpio_remove(struct platform_device *pdev)
-+{
-+ struct spi_gpio *sp;
-+ struct spi_gpio_platform_data *pdata;
-+
-+ pdata = pdev->dev.platform_data;
-+ sp = platform_get_drvdata(pdev);
-+
-+ gpio_free(pdata->pin_clk);
-+ gpio_free(pdata->pin_mosi);
-+ gpio_free(pdata->pin_miso);
-+ gpio_free(pdata->pin_cs);
-+ spi_bitbang_stop(&sp->bitbang);
-+ spi_master_put(sp->bitbang.master);
-+
-+ return 0;
-+}
-+
-+static struct platform_driver spi_gpio_driver = {
-+ .driver = {
-+ .name = SPI_GPIO_PLATDEV_NAME,
-+ .owner = THIS_MODULE,
-+ },
-+ .probe = spi_gpio_probe,
-+ .remove = __devexit_p(spi_gpio_remove),
-+};
-+
-+int spi_gpio_next_id(void)
-+{
-+ static atomic_t counter = ATOMIC_INIT(-1);
-+
-+ return atomic_inc_return(&counter);
-+}
-+EXPORT_SYMBOL(spi_gpio_next_id);
-+
-+static int __init spi_gpio_init(void)
-+{
-+ int err;
-+
-+ err = platform_driver_register(&spi_gpio_driver);
-+ if (err)
-+ printk(KERN_ERR "spi-gpio: register failed: %d\n", err);
-+
-+ return err;
-+}
-+module_init(spi_gpio_init);
-+
-+static void __exit spi_gpio_exit(void)
-+{
-+ platform_driver_unregister(&spi_gpio_driver);
-+}
-+module_exit(spi_gpio_exit);
-+
-+MODULE_AUTHOR("Piot Skamruk <piotr.skamruk at gmail.com>");
-+MODULE_AUTHOR("Michael Buesch");
-+MODULE_DESCRIPTION("Platform independent GPIO bitbanging SPI driver");
-+MODULE_LICENSE("GPL v2");
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -116,6 +116,15 @@ config SPI_GPIO
- GPIO operations, you should be able to leverage that for better
- speed with a custom version of this driver; see the source code.
-
-+config SPI_GPIO_OLD
-+ tristate "Old GPIO API based bitbanging SPI controller (DEPRECATED)"
-+ depends on SPI_MASTER && GENERIC_GPIO
-+ select SPI_BITBANG
-+ help
-+ This code is deprecated. Please use the new mainline SPI-GPIO driver.
-+
-+ If unsure, say N.
-+
- config SPI_IMX
- tristate "Freescale iMX SPI controller"
- depends on ARCH_MX1 && EXPERIMENTAL
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -17,6 +17,7 @@ obj-$(CONFIG_SPI_BITBANG) += spi_bitban
- obj-$(CONFIG_SPI_AU1550) += au1550_spi.o
- obj-$(CONFIG_SPI_BUTTERFLY) += spi_butterfly.o
- obj-$(CONFIG_SPI_GPIO) += spi_gpio.o
-+obj-$(CONFIG_SPI_GPIO_OLD) += spi_gpio_old.o
- obj-$(CONFIG_SPI_IMX) += spi_imx.o
- obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o
- obj-$(CONFIG_SPI_PXA2XX) += pxa2xx_spi.o
+++ /dev/null
---- /dev/null
-+++ b/drivers/mmc/host/gpiommc.c
-@@ -0,0 +1,608 @@
-+/*
-+ * Driver an MMC/SD card on a bitbanging GPIO SPI bus.
-+ * This module hooks up the mmc_spi and spi_gpio modules and also
-+ * provides a configfs interface.
-+ *
-+ * Copyright 2008 Michael Buesch <mb@bu3sch.de>
-+ *
-+ * Licensed under the GNU/GPL. See COPYING for details.
-+ */
-+
-+#include <linux/mmc/gpiommc.h>
-+#include <linux/platform_device.h>
-+#include <linux/list.h>
-+#include <linux/mutex.h>
-+#include <linux/spi/spi_gpio_old.h>
-+#include <linux/configfs.h>
-+#include <linux/gpio.h>
-+#include <asm/atomic.h>
-+
-+
-+#define PFX "gpio-mmc: "
-+
-+
-+struct gpiommc_device {
-+ struct platform_device *pdev;
-+ struct platform_device *spi_pdev;
-+ struct spi_board_info boardinfo;
-+};
-+
-+
-+MODULE_DESCRIPTION("GPIO based MMC driver");
-+MODULE_AUTHOR("Michael Buesch");
-+MODULE_LICENSE("GPL");
-+
-+
-+static int gpiommc_boardinfo_setup(struct spi_board_info *bi,
-+ struct spi_master *master,
-+ void *data)
-+{
-+ struct gpiommc_device *d = data;
-+ struct gpiommc_platform_data *pdata = d->pdev->dev.platform_data;
-+
-+ /* Bind the SPI master to the MMC-SPI host driver. */
-+ strlcpy(bi->modalias, "mmc_spi", sizeof(bi->modalias));
-+
-+ bi->max_speed_hz = pdata->max_bus_speed;
-+ bi->bus_num = master->bus_num;
-+ bi->mode = pdata->mode;
-+
-+ return 0;
-+}
-+
-+static int gpiommc_probe(struct platform_device *pdev)
-+{
-+ struct gpiommc_platform_data *mmc_pdata = pdev->dev.platform_data;
-+ struct spi_gpio_platform_data spi_pdata;
-+ struct gpiommc_device *d;
-+ int err;
-+
-+ err = -ENXIO;
-+ if (!mmc_pdata)
-+ goto error;
-+
-+#ifdef CONFIG_MMC_SPI_MODULE
-+ err = request_module("mmc_spi");
-+ if (err) {
-+ printk(KERN_WARNING PFX
-+ "Failed to request mmc_spi module.\n");
-+ }
-+#endif /* CONFIG_MMC_SPI_MODULE */
-+
-+ /* Allocate the GPIO-MMC device */
-+ err = -ENOMEM;
-+ d = kzalloc(sizeof(*d), GFP_KERNEL);
-+ if (!d)
-+ goto error;
-+ d->pdev = pdev;
-+
-+ /* Create the SPI-GPIO device */
-+ d->spi_pdev = platform_device_alloc(SPI_GPIO_PLATDEV_NAME,
-+ spi_gpio_next_id());
-+ if (!d->spi_pdev)
-+ goto err_free_d;
-+
-+ memset(&spi_pdata, 0, sizeof(spi_pdata));
-+ spi_pdata.pin_clk = mmc_pdata->pins.gpio_clk;
-+ spi_pdata.pin_miso = mmc_pdata->pins.gpio_do;
-+ spi_pdata.pin_mosi = mmc_pdata->pins.gpio_di;
-+ spi_pdata.pin_cs = mmc_pdata->pins.gpio_cs;
-+ spi_pdata.cs_activelow = mmc_pdata->pins.cs_activelow;
-+ spi_pdata.no_spi_delay = mmc_pdata->no_spi_delay;
-+ spi_pdata.boardinfo_setup = gpiommc_boardinfo_setup;
-+ spi_pdata.boardinfo_setup_data = d;
-+
-+ err = platform_device_add_data(d->spi_pdev, &spi_pdata,
-+ sizeof(spi_pdata));
-+ if (err)
-+ goto err_free_pdev;
-+ err = platform_device_add(d->spi_pdev);
-+ if (err)
-+ goto err_free_pdata;
-+ platform_set_drvdata(pdev, d);
-+
-+ printk(KERN_INFO PFX "MMC-Card \"%s\" "
-+ "attached to GPIO pins di=%u, do=%u, clk=%u, cs=%u\n",
-+ mmc_pdata->name, mmc_pdata->pins.gpio_di,
-+ mmc_pdata->pins.gpio_do,
-+ mmc_pdata->pins.gpio_clk,
-+ mmc_pdata->pins.gpio_cs);
-+
-+ return 0;
-+
-+err_free_pdata:
-+ kfree(d->spi_pdev->dev.platform_data);
-+ d->spi_pdev->dev.platform_data = NULL;
-+err_free_pdev:
-+ platform_device_put(d->spi_pdev);
-+err_free_d:
-+ kfree(d);
-+error:
-+ return err;
-+}
-+
-+static int gpiommc_remove(struct platform_device *pdev)
-+{
-+ struct gpiommc_device *d = platform_get_drvdata(pdev);
-+ struct gpiommc_platform_data *pdata = d->pdev->dev.platform_data;
-+
-+ platform_device_unregister(d->spi_pdev);
-+ printk(KERN_INFO PFX "GPIO based MMC-Card \"%s\" removed\n",
-+ pdata->name);
-+ platform_device_put(d->spi_pdev);
-+
-+ return 0;
-+}
-+
-+#ifdef CONFIG_GPIOMMC_CONFIGFS
-+
-+/* A device that was created through configfs */
-+struct gpiommc_configfs_device {
-+ struct config_item item;
-+ /* The platform device, after registration. */
-+ struct platform_device *pdev;
-+ /* The configuration */
-+ struct gpiommc_platform_data pdata;
-+};
-+
-+#define GPIO_INVALID -1
-+
-+static inline bool gpiommc_is_registered(struct gpiommc_configfs_device *dev)
-+{
-+ return (dev->pdev != NULL);
-+}
-+
-+static inline struct gpiommc_configfs_device *ci_to_gpiommc(struct config_item *item)
-+{
-+ return item ? container_of(item, struct gpiommc_configfs_device, item) : NULL;
-+}
-+
-+static struct configfs_attribute gpiommc_attr_DI = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_data_in",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_DO = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_data_out",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_CLK = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_clock",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_CS = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_chipselect",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_CS_activelow = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_chipselect_activelow",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_spimode = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "spi_mode",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_spidelay = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "spi_delay",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_max_bus_speed = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "max_bus_speed",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_register = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "register",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute *gpiommc_config_attrs[] = {
-+ &gpiommc_attr_DI,
-+ &gpiommc_attr_DO,
-+ &gpiommc_attr_CLK,
-+ &gpiommc_attr_CS,
-+ &gpiommc_attr_CS_activelow,
-+ &gpiommc_attr_spimode,
-+ &gpiommc_attr_spidelay,
-+ &gpiommc_attr_max_bus_speed,
-+ &gpiommc_attr_register,
-+ NULL,
-+};
-+
-+static ssize_t gpiommc_config_attr_show(struct config_item *item,
-+ struct configfs_attribute *attr,
-+ char *page)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+ ssize_t count = 0;
-+ unsigned int gpio;
-+ int err = 0;
-+
-+ if (attr == &gpiommc_attr_DI) {
-+ gpio = dev->pdata.pins.gpio_di;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_DO) {
-+ gpio = dev->pdata.pins.gpio_do;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CLK) {
-+ gpio = dev->pdata.pins.gpio_clk;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS) {
-+ gpio = dev->pdata.pins.gpio_cs;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS_activelow) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ dev->pdata.pins.cs_activelow);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spimode) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ dev->pdata.mode);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spidelay) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ !dev->pdata.no_spi_delay);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_max_bus_speed) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ dev->pdata.max_bus_speed);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_register) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ gpiommc_is_registered(dev));
-+ goto out;
-+ }
-+ WARN_ON(1);
-+ err = -ENOSYS;
-+out:
-+ return err ? err : count;
-+}
-+
-+static int gpiommc_do_register(struct gpiommc_configfs_device *dev,
-+ const char *name)
-+{
-+ int err;
-+
-+ if (gpiommc_is_registered(dev))
-+ return 0;
-+
-+ if (!gpio_is_valid(dev->pdata.pins.gpio_di) ||
-+ !gpio_is_valid(dev->pdata.pins.gpio_do) ||
-+ !gpio_is_valid(dev->pdata.pins.gpio_clk) ||
-+ !gpio_is_valid(dev->pdata.pins.gpio_cs)) {
-+ printk(KERN_ERR PFX
-+ "configfs: Invalid GPIO pin number(s)\n");
-+ return -EINVAL;
-+ }
-+
-+ strlcpy(dev->pdata.name, name,
-+ sizeof(dev->pdata.name));
-+
-+ dev->pdev = platform_device_alloc(GPIOMMC_PLATDEV_NAME,
-+ gpiommc_next_id());
-+ if (!dev->pdev)
-+ return -ENOMEM;
-+ err = platform_device_add_data(dev->pdev, &dev->pdata,
-+ sizeof(dev->pdata));
-+ if (err) {
-+ platform_device_put(dev->pdev);
-+ return err;
-+ }
-+ err = platform_device_add(dev->pdev);
-+ if (err) {
-+ platform_device_put(dev->pdev);
-+ return err;
-+ }
-+
-+ return 0;
-+}
-+
-+static void gpiommc_do_unregister(struct gpiommc_configfs_device *dev)
-+{
-+ if (!gpiommc_is_registered(dev))
-+ return;
-+
-+ platform_device_unregister(dev->pdev);
-+ dev->pdev = NULL;
-+}
-+
-+static ssize_t gpiommc_config_attr_store(struct config_item *item,
-+ struct configfs_attribute *attr,
-+ const char *page, size_t count)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+ int err = -EINVAL;
-+ unsigned long data;
-+
-+ if (attr == &gpiommc_attr_register) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data == 1)
-+ err = gpiommc_do_register(dev, item->ci_name);
-+ if (data == 0) {
-+ gpiommc_do_unregister(dev);
-+ err = 0;
-+ }
-+ goto out;
-+ }
-+
-+ if (gpiommc_is_registered(dev)) {
-+ /* The rest of the config parameters can only be set
-+ * as long as the device is not registered, yet. */
-+ err = -EBUSY;
-+ goto out;
-+ }
-+
-+ if (attr == &gpiommc_attr_DI) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_di = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_DO) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_do = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CLK) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_clk = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_cs = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS_activelow) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data != 0 && data != 1)
-+ goto out;
-+ dev->pdata.pins.cs_activelow = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spimode) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ switch (data) {
-+ case 0:
-+ dev->pdata.mode = SPI_MODE_0;
-+ break;
-+ case 1:
-+ dev->pdata.mode = SPI_MODE_1;
-+ break;
-+ case 2:
-+ dev->pdata.mode = SPI_MODE_2;
-+ break;
-+ case 3:
-+ dev->pdata.mode = SPI_MODE_3;
-+ break;
-+ default:
-+ goto out;
-+ }
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spidelay) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data != 0 && data != 1)
-+ goto out;
-+ dev->pdata.no_spi_delay = !data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_max_bus_speed) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data > UINT_MAX)
-+ goto out;
-+ dev->pdata.max_bus_speed = data;
-+ err = 0;
-+ goto out;
-+ }
-+ WARN_ON(1);
-+ err = -ENOSYS;
-+out:
-+ return err ? err : count;
-+}
-+
-+static void gpiommc_config_item_release(struct config_item *item)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+
-+ kfree(dev);
-+}
-+
-+static struct configfs_item_operations gpiommc_config_item_ops = {
-+ .release = gpiommc_config_item_release,
-+ .show_attribute = gpiommc_config_attr_show,
-+ .store_attribute = gpiommc_config_attr_store,
-+};
-+
-+static struct config_item_type gpiommc_dev_ci_type = {
-+ .ct_item_ops = &gpiommc_config_item_ops,
-+ .ct_attrs = gpiommc_config_attrs,
-+ .ct_owner = THIS_MODULE,
-+};
-+
-+static struct config_item *gpiommc_make_item(struct config_group *group,
-+ const char *name)
-+{
-+ struct gpiommc_configfs_device *dev;
-+
-+ if (strlen(name) > GPIOMMC_MAX_NAMELEN) {
-+ printk(KERN_ERR PFX "configfs: device name too long\n");
-+ return NULL;
-+ }
-+
-+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-+ if (!dev)
-+ return NULL;
-+
-+ config_item_init_type_name(&dev->item, name,
-+ &gpiommc_dev_ci_type);
-+
-+ /* Assign default configuration */
-+ dev->pdata.pins.gpio_di = GPIO_INVALID;
-+ dev->pdata.pins.gpio_do = GPIO_INVALID;
-+ dev->pdata.pins.gpio_clk = GPIO_INVALID;
-+ dev->pdata.pins.gpio_cs = GPIO_INVALID;
-+ dev->pdata.pins.cs_activelow = 1;
-+ dev->pdata.mode = SPI_MODE_0;
-+ dev->pdata.no_spi_delay = 0;
-+ dev->pdata.max_bus_speed = 5000000; /* 5 MHz */
-+
-+ return &(dev->item);
-+}
-+
-+static void gpiommc_drop_item(struct config_group *group,
-+ struct config_item *item)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+
-+ gpiommc_do_unregister(dev);
-+ kfree(dev);
-+}
-+
-+static struct configfs_group_operations gpiommc_ct_group_ops = {
-+ .make_item = gpiommc_make_item,
-+ .drop_item = gpiommc_drop_item,
-+};
-+
-+static struct config_item_type gpiommc_ci_type = {
-+ .ct_group_ops = &gpiommc_ct_group_ops,
-+ .ct_owner = THIS_MODULE,
-+};
-+
-+static struct configfs_subsystem gpiommc_subsys = {
-+ .su_group = {
-+ .cg_item = {
-+ .ci_namebuf = GPIOMMC_PLATDEV_NAME,
-+ .ci_type = &gpiommc_ci_type,
-+ },
-+ },
-+ .su_mutex = __MUTEX_INITIALIZER(gpiommc_subsys.su_mutex),
-+};
-+
-+#endif /* CONFIG_GPIOMMC_CONFIGFS */
-+
-+static struct platform_driver gpiommc_plat_driver = {
-+ .probe = gpiommc_probe,
-+ .remove = gpiommc_remove,
-+ .driver = {
-+ .name = GPIOMMC_PLATDEV_NAME,
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+int gpiommc_next_id(void)
-+{
-+ static atomic_t counter = ATOMIC_INIT(-1);
-+
-+ return atomic_inc_return(&counter);
-+}
-+EXPORT_SYMBOL(gpiommc_next_id);
-+
-+static int __init gpiommc_modinit(void)
-+{
-+ int err;
-+
-+ err = platform_driver_register(&gpiommc_plat_driver);
-+ if (err)
-+ return err;
-+
-+#ifdef CONFIG_GPIOMMC_CONFIGFS
-+ config_group_init(&gpiommc_subsys.su_group);
-+ err = configfs_register_subsystem(&gpiommc_subsys);
-+ if (err) {
-+ platform_driver_unregister(&gpiommc_plat_driver);
-+ return err;
-+ }
-+#endif /* CONFIG_GPIOMMC_CONFIGFS */
-+
-+ return 0;
-+}
-+module_init(gpiommc_modinit);
-+
-+static void __exit gpiommc_modexit(void)
-+{
-+#ifdef CONFIG_GPIOMMC_CONFIGFS
-+ configfs_unregister_subsystem(&gpiommc_subsys);
-+#endif
-+ platform_driver_unregister(&gpiommc_plat_driver);
-+}
-+module_exit(gpiommc_modexit);
---- a/drivers/mmc/host/Kconfig
-+++ b/drivers/mmc/host/Kconfig
-@@ -278,6 +278,31 @@ config MMC_TMIO
- This provides support for the SD/MMC cell found in TC6393XB,
- T7L66XB and also HTC ASIC3
-
-+config GPIOMMC
-+ tristate "MMC/SD over GPIO-based SPI"
-+ depends on MMC && MMC_SPI && SPI_GPIO_OLD
-+ help
-+ This driver hooks up the mmc_spi and spi_gpio modules so that
-+ MMC/SD cards can be used on a GPIO based bus by bitbanging
-+ the SPI protocol in software.
-+
-+ This driver provides a configfs interface to dynamically create
-+ and destroy GPIO-based MMC/SD card devices. It also provides
-+ a platform device interface API.
-+ See Documentation/gpiommc.txt for details.
-+
-+ The module will be called gpiommc.
-+
-+ If unsure, say N.
-+
-+config GPIOMMC_CONFIGFS
-+ bool
-+ depends on GPIOMMC && CONFIGFS_FS
-+ default y
-+ help
-+ This option automatically enables configfs support for gpiommc
-+ if configfs is available.
-+
- config MMC_CB710
- tristate "ENE CB710 MMC/SD Interface support"
- depends on PCI
---- a/drivers/mmc/host/Makefile
-+++ b/drivers/mmc/host/Makefile
-@@ -33,6 +33,7 @@ obj-$(CONFIG_MMC_SDRICOH_CS) += sdricoh_
- obj-$(CONFIG_MMC_TMIO) += tmio_mmc.o
- obj-$(CONFIG_MMC_CB710) += cb710-mmc.o
- obj-$(CONFIG_MMC_VIA_SDMMC) += via-sdmmc.o
-+obj-$(CONFIG_GPIOMMC) += gpiommc.o
-
- ifeq ($(CONFIG_CB710_DEBUG),y)
- CFLAGS-cb710-mmc += -DDEBUG
---- /dev/null
-+++ b/include/linux/mmc/gpiommc.h
-@@ -0,0 +1,71 @@
-+/*
-+ * Device driver for MMC/SD cards driven over a GPIO bus.
-+ *
-+ * Copyright (c) 2008 Michael Buesch
-+ *
-+ * Licensed under the GNU/GPL version 2.
-+ */
-+#ifndef LINUX_GPIOMMC_H_
-+#define LINUX_GPIOMMC_H_
-+
-+#include <linux/types.h>
-+
-+
-+#define GPIOMMC_MAX_NAMELEN 15
-+#define GPIOMMC_MAX_NAMELEN_STR __stringify(GPIOMMC_MAX_NAMELEN)
-+
-+/**
-+ * struct gpiommc_pins - Hardware pin assignments
-+ *
-+ * @gpio_di: The GPIO number of the DATA IN pin
-+ * @gpio_do: The GPIO number of the DATA OUT pin
-+ * @gpio_clk: The GPIO number of the CLOCK pin
-+ * @gpio_cs: The GPIO number of the CHIPSELECT pin
-+ * @cs_activelow: If true, the chip is considered selected if @gpio_cs is low.
-+ */
-+struct gpiommc_pins {
-+ unsigned int gpio_di;
-+ unsigned int gpio_do;
-+ unsigned int gpio_clk;
-+ unsigned int gpio_cs;
-+ bool cs_activelow;
-+};
-+
-+/**
-+ * struct gpiommc_platform_data - Platform data for a MMC-over-SPI-GPIO device.
-+ *
-+ * @name: The unique name string of the device.
-+ * @pins: The hardware pin assignments.
-+ * @mode: The hardware mode. This is either SPI_MODE_0,
-+ * SPI_MODE_1, SPI_MODE_2 or SPI_MODE_3. See the SPI documentation.
-+ * @no_spi_delay: Do not use delays in the lowlevel SPI bitbanging code.
-+ * This is not standards compliant, but may be required for some
-+ * embedded machines to gain reasonable speed.
-+ * @max_bus_speed: The maximum speed of the SPI bus, in Hertz.
-+ */
-+struct gpiommc_platform_data {
-+ char name[GPIOMMC_MAX_NAMELEN + 1];
-+ struct gpiommc_pins pins;
-+ u8 mode;
-+ bool no_spi_delay;
-+ unsigned int max_bus_speed;
-+};
-+
-+/**
-+ * GPIOMMC_PLATDEV_NAME - The platform device name string.
-+ *
-+ * The name string that has to be used for platform_device_alloc
-+ * when allocating a gpiommc device.
-+ */
-+#define GPIOMMC_PLATDEV_NAME "gpiommc"
-+
-+/**
-+ * gpiommc_next_id - Get another platform device ID number.
-+ *
-+ * This returns the next platform device ID number that has to be used
-+ * for platform_device_alloc. The ID is opaque and should not be used for
-+ * anything else.
-+ */
-+int gpiommc_next_id(void);
-+
-+#endif /* LINUX_GPIOMMC_H_ */
---- /dev/null
-+++ b/Documentation/gpiommc.txt
-@@ -0,0 +1,97 @@
-+GPIOMMC - Driver for an MMC/SD card on a bitbanging GPIO SPI bus
-+================================================================
-+
-+The gpiommc module hooks up the mmc_spi and spi_gpio modules for running an
-+MMC or SD card on GPIO pins.
-+
-+Two interfaces for registering a new MMC/SD card device are provided:
-+A static platform-device based mechanism and a dynamic configfs based interface.
-+
-+
-+Registering devices via platform-device
-+=======================================
-+
-+The platform-device interface is used for registering MMC/SD devices that are
-+part of the hardware platform. This is most useful only for embedded machines
-+with MMC/SD devices statically connected to the platform GPIO bus.
-+
-+The data structures are declared in <linux/mmc/gpiommc.h>.
-+
-+To register a new device, define an instance of struct gpiommc_platform_data.
-+This structure holds any information about how the device is hooked up to the
-+GPIO pins and what hardware modes the device supports. See the docbook-style
-+documentation in the header file for more information on the struct fields.
-+
-+Then allocate a new instance of a platform device by doing:
-+
-+ pdev = platform_device_alloc(GPIOMMC_PLATDEV_NAME, gpiommc_next_id());
-+
-+This will allocate the platform device data structures and hook it up to the
-+gpiommc driver.
-+Then add the gpiommc_platform_data to the platform device.
-+
-+ err = platform_device_add_data(pdev, pdata, sizeof(struct gpiommc_platform_data));
-+
-+You may free the local instance of struct gpiommc_platform_data now. (So the
-+struct may be allocated on the stack, too).
-+Now simply register the platform device.
-+
-+ err = platform_device_add(pdev);
-+
-+Done. The gpiommc probe routine will be invoked now and you should see a kernel
-+log message for the added device.
-+
-+
-+Registering devices via configfs
-+================================
-+
-+MMC/SD cards connected via GPIO often are a pretty dynamic thing, as for example
-+selfmade hacks for soldering an MMC/SD card to standard GPIO pins on embedded
-+hardware are a common situation.
-+So we provide a dynamic interface to conveniently handle adding and removing
-+devices from userspace, without the need to recompile the kernel.
-+
-+The "gpiommc" subdirectory at the configfs mountpoint is used for handling
-+the dynamic configuration.
-+
-+To create a new device, it must first be allocated with mkdir.
-+The following command will allocate a device named "my_mmc":
-+ mkdir /config/gpiommc/my_mmc
-+
-+There are several configuration files available in the new
-+/config/gpiommc/my_mmc/ directory:
-+
-+gpio_data_in = The SPI data-IN GPIO pin number.
-+gpio_data_out = The SPI data-OUT GPIO pin number.
-+gpio_clock = The SPI Clock GPIO pin number.
-+gpio_chipselect = The SPI Chipselect GPIO pin number.
-+gpio_chipselect_activelow = Boolean. If 0, Chipselect is active-HIGH.
-+ If 1, Chipselect is active-LOW.
-+spi_mode = The SPI data mode. Can be 0-3.
-+spi_delay = Enable all delays in the lowlevel bitbanging.
-+max_bus_speed = The maximum SPI bus speed. In Hertz.
-+
-+register = Not a configuration parameter.
-+ Used to register the configured card
-+ with the kernel.
-+
-+The device must first get configured and then registered by writing "1" to
-+the "register" file.
-+The configuration parameters "gpio_data_in", "gpio_data_out", "gpio_clock"
-+and "gpio_chipselect" are essential and _must_ be configured before writing
-+"1" to the "register" file. The registration will fail, otherwise.
-+
-+The default values for the other parameters are:
-+gpio_chipselect_activelow = 1 (CS active-LOW)
-+spi_mode = 0 (SPI_MODE_0)
-+spi_delay = 1 (enabled)
-+max_bus_speed = 5000000 (5 Mhz)
-+
-+Configuration values can not be changed after registration. To unregister
-+the device, write a "0" to the "register" file. The configuration can be
-+changed again after unregistering.
-+
-+To completely remove the device, simply rmdir the directory
-+(/config/gpiommc/my_mmc in this example).
-+There's no need to first unregister the device before removing it. That will
-+be done automatically.
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -2266,6 +2266,11 @@ T: git git://git.kernel.org/pub/scm/linu
- S: Maintained
- F: drivers/media/video/gspca/
-
-+GPIOMMC DRIVER
-+P: Michael Buesch
-+M: mb@bu3sch.de
-+S: Maintained
-+
- HARDWARE MONITORING
- L: lm-sensors@lm-sensors.org
- W: http://www.lm-sensors.org/
+++ /dev/null
-The gpiommc configfs context structure needs locking, as configfs
-does not lock access between files.
-
---- a/drivers/mmc/host/gpiommc.c
-+++ b/drivers/mmc/host/gpiommc.c
-@@ -143,6 +143,8 @@ struct gpiommc_configfs_device {
- struct platform_device *pdev;
- /* The configuration */
- struct gpiommc_platform_data pdata;
-+ /* Mutex to protect this structure */
-+ struct mutex mutex;
- };
-
- #define GPIO_INVALID -1
-@@ -233,6 +235,8 @@ static ssize_t gpiommc_config_attr_show(
- unsigned int gpio;
- int err = 0;
-
-+ mutex_lock(&dev->mutex);
-+
- if (attr == &gpiommc_attr_DI) {
- gpio = dev->pdata.pins.gpio_di;
- if (gpio == GPIO_INVALID)
-@@ -293,6 +297,8 @@ static ssize_t gpiommc_config_attr_show(
- WARN_ON(1);
- err = -ENOSYS;
- out:
-+ mutex_unlock(&dev->mutex);
-+
- return err ? err : count;
- }
-
-@@ -352,6 +358,8 @@ static ssize_t gpiommc_config_attr_store
- int err = -EINVAL;
- unsigned long data;
-
-+ mutex_lock(&dev->mutex);
-+
- if (attr == &gpiommc_attr_register) {
- err = strict_strtoul(page, 10, &data);
- if (err)
-@@ -477,6 +485,8 @@ static ssize_t gpiommc_config_attr_store
- WARN_ON(1);
- err = -ENOSYS;
- out:
-+ mutex_unlock(&dev->mutex);
-+
- return err ? err : count;
- }
-
-@@ -513,6 +523,7 @@ static struct config_item *gpiommc_make_
- if (!dev)
- return NULL;
-
-+ mutex_init(&dev->mutex);
- config_item_init_type_name(&dev->item, name,
- &gpiommc_dev_ci_type);
-
+++ /dev/null
---- a/drivers/char/cs5535_gpio.c
-+++ b/drivers/char/cs5535_gpio.c
-@@ -15,6 +15,7 @@
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/cdev.h>
-+#include <linux/device.h>
- #include <linux/ioport.h>
- #include <linux/pci.h>
- #include <linux/smp_lock.h>
-@@ -48,6 +49,7 @@ static struct pci_device_id divil_pci[]
- MODULE_DEVICE_TABLE(pci, divil_pci);
-
- static struct cdev cs5535_gpio_cdev;
-+static struct class *cs5535_gpio_class;
-
- /* reserve 32 entries even though some aren't usable */
- #define CS5535_GPIO_COUNT 32
-@@ -66,9 +68,14 @@ static struct gpio_regmap rm[] =
- { 0x30, 0x00, '1', '0' }, /* GPIOx_READ_BACK / GPIOx_OUT_VAL */
- { 0x20, 0x20, 'I', 'i' }, /* GPIOx_IN_EN */
- { 0x04, 0x04, 'O', 'o' }, /* GPIOx_OUT_EN */
-+ { 0x10, 0x10, 'A', 'a' }, /* GPIOx_OUT_AUX1_SEL */
-+ { 0x14, 0x14, 'B', 'b' }, /* GPIOx_OUT_AUX2_SEL */
- { 0x08, 0x08, 't', 'T' }, /* GPIOx_OUT_OD_EN */
- { 0x18, 0x18, 'P', 'p' }, /* GPIOx_OUT_PU_EN */
- { 0x1c, 0x1c, 'D', 'd' }, /* GPIOx_OUT_PD_EN */
-+ { 0x24, 0x24, 'N', 'n' }, /* GPIOx_IN_INV_EN */
-+ { 0x0c, 0x0c, 'X', 'x' }, /* GPIOx_OUT_INV_EN */
-+ { 0x00, 0x00, 'H', 'L' }, /* GPIOx_OUT_VAL */
- };
-
-
-@@ -177,7 +184,7 @@ static int __init cs5535_gpio_init(void)
- {
- dev_t dev_id;
- u32 low, hi;
-- int retval;
-+ int retval, i;
-
- if (pci_dev_present(divil_pci) == 0) {
- printk(KERN_WARNING NAME ": DIVIL not found\n");
-@@ -232,23 +239,54 @@ static int __init cs5535_gpio_init(void)
- major = MAJOR(dev_id);
- }
-
-- if (retval) {
-- release_region(gpio_base, CS5535_GPIO_SIZE);
-- return -1;
-- }
-+ if (retval)
-+ goto error;
-
- printk(KERN_DEBUG NAME ": base=%#x mask=%#lx major=%d\n",
- gpio_base, mask, major);
-
- cdev_init(&cs5535_gpio_cdev, &cs5535_gpio_fops);
-- cdev_add(&cs5535_gpio_cdev, dev_id, CS5535_GPIO_COUNT);
-+ retval = cdev_add(&cs5535_gpio_cdev, dev_id, CS5535_GPIO_COUNT);
-+ if (retval) {
-+ kobject_put(&cs5535_gpio_cdev.kobj);
-+ goto error_region;
-+ }
-+
-+ cs5535_gpio_class = class_create(THIS_MODULE, "cs5535_gpio");
-+ if (IS_ERR(cs5535_gpio_class)) {
-+ printk(KERN_ERR "Error creating cs5535_gpio class\n");
-+ cdev_del(&cs5535_gpio_cdev);
-+ retval = PTR_ERR(cs5535_gpio_class);
-+ goto error_region;
-+ }
-+
-+ for (i = 0; i < CS5535_GPIO_COUNT; i++) {
-+ if (mask & (1<<i)) {
-+ device_create(cs5535_gpio_class, NULL, MKDEV(major, i), NULL, "cs5535_gpio%d", i);
-+ }
-+ }
-
- return 0;
-+
-+error_region:
-+ unregister_chrdev_region(dev_id, CS5535_GPIO_COUNT);
-+error:
-+ release_region(gpio_base, CS5535_GPIO_SIZE);
-+ return retval;
- }
-
- static void __exit cs5535_gpio_cleanup(void)
- {
- dev_t dev_id = MKDEV(major, 0);
-+ int i;
-+
-+ for (i = 0; i < CS5535_GPIO_COUNT; i++) {
-+ if (mask & (1<<i)) {
-+ device_destroy(cs5535_gpio_class, MKDEV(major, i));
-+ }
-+ }
-+
-+ class_destroy(cs5535_gpio_class);
-
- cdev_del(&cs5535_gpio_cdev);
- unregister_chrdev_region(dev_id, CS5535_GPIO_COUNT);
+++ /dev/null
---- a/drivers/i2c/busses/i2c-gpio.c
-+++ b/drivers/i2c/busses/i2c-gpio.c
-@@ -210,7 +210,7 @@ static int __init i2c_gpio_init(void)
-
- return ret;
- }
--module_init(i2c_gpio_init);
-+subsys_initcall(i2c_gpio_init);
-
- static void __exit i2c_gpio_exit(void)
- {
+++ /dev/null
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -100,7 +100,7 @@ struct wireless_dev;
- */
-
- #if defined(CONFIG_WLAN_80211) || defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
--# if defined(CONFIG_MAC80211_MESH)
-+# if 1 || defined(CONFIG_MAC80211_MESH)
- # define LL_MAX_HEADER 128
- # else
- # define LL_MAX_HEADER 96
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -389,7 +389,7 @@ struct sk_buff {
- #ifdef CONFIG_IPV6_NDISC_NODETYPE
- __u8 ndisc_nodetype:2;
- #endif
--#if defined(CONFIG_MAC80211) || defined(CONFIG_MAC80211_MODULE)
-+#if 1
- __u8 do_not_encrypt:1;
- #endif
- kmemcheck_bitfield_end(flags2);
+++ /dev/null
---- a/drivers/ssb/driver_chipcommon_pmu.c
-+++ b/drivers/ssb/driver_chipcommon_pmu.c
-@@ -28,6 +28,21 @@ static void ssb_chipco_pll_write(struct
- chipco_write32(cc, SSB_CHIPCO_PLLCTL_DATA, value);
- }
-
-+static void ssb_chipco_regctl_maskset(struct ssb_chipcommon *cc,
-+ u32 offset, u32 mask, u32 set)
-+{
-+ u32 value;
-+
-+ chipco_read32(cc, SSB_CHIPCO_REGCTL_ADDR);
-+ chipco_write32(cc, SSB_CHIPCO_REGCTL_ADDR, offset);
-+ chipco_read32(cc, SSB_CHIPCO_REGCTL_ADDR);
-+ value = chipco_read32(cc, SSB_CHIPCO_REGCTL_DATA);
-+ value &= mask;
-+ value |= set;
-+ chipco_write32(cc, SSB_CHIPCO_REGCTL_DATA, value);
-+ chipco_read32(cc, SSB_CHIPCO_REGCTL_DATA);
-+}
-+
- struct pmu0_plltab_entry {
- u16 freq; /* Crystal frequency in kHz.*/
- u8 xf; /* Crystal frequency value for PMU control */
-@@ -506,3 +521,82 @@ void ssb_pmu_init(struct ssb_chipcommon
- ssb_pmu_pll_init(cc);
- ssb_pmu_resources_init(cc);
- }
-+
-+void ssb_pmu_set_ldo_voltage(struct ssb_chipcommon *cc,
-+ enum ssb_pmu_ldo_volt_id id, u32 voltage)
-+{
-+ struct ssb_bus *bus = cc->dev->bus;
-+ u32 addr, shift, mask;
-+
-+ switch (bus->chip_id) {
-+ case 0x4328:
-+ case 0x5354:
-+ switch (id) {
-+ case LDO_VOLT1:
-+ addr = 2;
-+ shift = 25;
-+ mask = 0xF;
-+ break;
-+ case LDO_VOLT2:
-+ addr = 3;
-+ shift = 1;
-+ mask = 0xF;
-+ break;
-+ case LDO_VOLT3:
-+ addr = 3;
-+ shift = 9;
-+ mask = 0xF;
-+ break;
-+ case LDO_PAREF:
-+ addr = 3;
-+ shift = 17;
-+ mask = 0x3F;
-+ break;
-+ default:
-+ SSB_WARN_ON(1);
-+ return;
-+ }
-+ break;
-+ case 0x4312:
-+ if (SSB_WARN_ON(id != LDO_PAREF))
-+ return;
-+ addr = 0;
-+ shift = 21;
-+ mask = 0x3F;
-+ break;
-+ default:
-+ return;
-+ }
-+
-+ ssb_chipco_regctl_maskset(cc, addr, ~(mask << shift),
-+ (voltage & mask) << shift);
-+}
-+
-+void ssb_pmu_set_ldo_paref(struct ssb_chipcommon *cc, bool on)
-+{
-+ struct ssb_bus *bus = cc->dev->bus;
-+ int ldo;
-+
-+ switch (bus->chip_id) {
-+ case 0x4312:
-+ ldo = SSB_PMURES_4312_PA_REF_LDO;
-+ break;
-+ case 0x4328:
-+ ldo = SSB_PMURES_4328_PA_REF_LDO;
-+ break;
-+ case 0x5354:
-+ ldo = SSB_PMURES_5354_PA_REF_LDO;
-+ break;
-+ default:
-+ return;
-+ }
-+
-+ if (on)
-+ chipco_set32(cc, SSB_CHIPCO_PMU_MINRES_MSK, 1 << ldo);
-+ else
-+ chipco_mask32(cc, SSB_CHIPCO_PMU_MINRES_MSK, ~(1 << ldo));
-+ chipco_read32(cc, SSB_CHIPCO_PMU_MINRES_MSK); //SPEC FIXME found via mmiotrace - dummy read?
-+}
-+
-+EXPORT_SYMBOL(ssb_pmu_set_ldo_voltage);
-+EXPORT_SYMBOL(ssb_pmu_set_ldo_paref);
---- a/drivers/ssb/main.c
-+++ b/drivers/ssb/main.c
-@@ -469,6 +469,8 @@ static int ssb_devices_register(struct s
- dev->parent = &bus->host_pcmcia->dev;
- #endif
- break;
-+ case SSB_BUSTYPE_SDIO:
-+ break;
- case SSB_BUSTYPE_SSB:
- dev->dma_mask = &dev->coherent_dma_mask;
- break;
-@@ -1358,8 +1360,10 @@ static int __init ssb_modinit(void)
- ssb_buses_lock();
- err = ssb_attach_queued_buses();
- ssb_buses_unlock();
-- if (err)
-+ if (err) {
- bus_unregister(&ssb_bustype);
-+ goto out;
-+ }
-
- err = b43_pci_ssb_bridge_init();
- if (err) {
-@@ -1375,7 +1379,7 @@ static int __init ssb_modinit(void)
- /* don't fail SSB init because of this */
- err = 0;
- }
--
-+out:
- return err;
- }
- /* ssb must be initialized after PCI but before the ssb drivers.
---- a/drivers/ssb/pci.c
-+++ b/drivers/ssb/pci.c
-@@ -169,8 +169,14 @@ err_pci:
- /* Get the word-offset for a SSB_SPROM_XXX define. */
- #define SPOFF(offset) (((offset) - SSB_SPROM_BASE) / sizeof(u16))
- /* Helper to extract some _offset, which is one of the SSB_SPROM_XXX defines. */
--#define SPEX(_outvar, _offset, _mask, _shift) \
-+#define SPEX16(_outvar, _offset, _mask, _shift) \
- out->_outvar = ((in[SPOFF(_offset)] & (_mask)) >> (_shift))
-+#define SPEX32(_outvar, _offset, _mask, _shift) \
-+ out->_outvar = ((((u32)in[SPOFF((_offset)+2)] << 16 | \
-+ in[SPOFF(_offset)]) & (_mask)) >> (_shift))
-+#define SPEX(_outvar, _offset, _mask, _shift) \
-+ SPEX16(_outvar, _offset, _mask, _shift)
-+
-
- static inline u8 ssb_crc8(u8 crc, u8 data)
- {
-@@ -474,12 +480,14 @@ static void sprom_extract_r8(struct ssb_
-
- /* extract the MAC address */
- for (i = 0; i < 3; i++) {
-- v = in[SPOFF(SSB_SPROM1_IL0MAC) + i];
-+ v = in[SPOFF(SSB_SPROM8_IL0MAC) + i];
- *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v);
- }
- SPEX(country_code, SSB_SPROM8_CCODE, 0xFFFF, 0);
- SPEX(boardflags_lo, SSB_SPROM8_BFLLO, 0xFFFF, 0);
- SPEX(boardflags_hi, SSB_SPROM8_BFLHI, 0xFFFF, 0);
-+ SPEX(boardflags2_lo, SSB_SPROM8_BFL2LO, 0xFFFF, 0);
-+ SPEX(boardflags2_hi, SSB_SPROM8_BFL2HI, 0xFFFF, 0);
- SPEX(ant_available_a, SSB_SPROM8_ANTAVAIL, SSB_SPROM8_ANTAVAIL_A,
- SSB_SPROM8_ANTAVAIL_A_SHIFT);
- SPEX(ant_available_bg, SSB_SPROM8_ANTAVAIL, SSB_SPROM8_ANTAVAIL_BG,
-@@ -490,12 +498,55 @@ static void sprom_extract_r8(struct ssb_
- SPEX(maxpwr_a, SSB_SPROM8_MAXP_A, SSB_SPROM8_MAXP_A_MASK, 0);
- SPEX(itssi_a, SSB_SPROM8_MAXP_A, SSB_SPROM8_ITSSI_A,
- SSB_SPROM8_ITSSI_A_SHIFT);
-+ SPEX(maxpwr_ah, SSB_SPROM8_MAXP_AHL, SSB_SPROM8_MAXP_AH_MASK, 0);
-+ SPEX(maxpwr_al, SSB_SPROM8_MAXP_AHL, SSB_SPROM8_MAXP_AL_MASK,
-+ SSB_SPROM8_MAXP_AL_SHIFT);
- SPEX(gpio0, SSB_SPROM8_GPIOA, SSB_SPROM8_GPIOA_P0, 0);
- SPEX(gpio1, SSB_SPROM8_GPIOA, SSB_SPROM8_GPIOA_P1,
- SSB_SPROM8_GPIOA_P1_SHIFT);
- SPEX(gpio2, SSB_SPROM8_GPIOB, SSB_SPROM8_GPIOB_P2, 0);
- SPEX(gpio3, SSB_SPROM8_GPIOB, SSB_SPROM8_GPIOB_P3,
- SSB_SPROM8_GPIOB_P3_SHIFT);
-+ SPEX(tri2g, SSB_SPROM8_TRI25G, SSB_SPROM8_TRI2G, 0);
-+ SPEX(tri5g, SSB_SPROM8_TRI25G, SSB_SPROM8_TRI5G,
-+ SSB_SPROM8_TRI5G_SHIFT);
-+ SPEX(tri5gl, SSB_SPROM8_TRI5GHL, SSB_SPROM8_TRI5GL, 0);
-+ SPEX(tri5gh, SSB_SPROM8_TRI5GHL, SSB_SPROM8_TRI5GH,
-+ SSB_SPROM8_TRI5GH_SHIFT);
-+ SPEX(rxpo2g, SSB_SPROM8_RXPO, SSB_SPROM8_RXPO2G, 0);
-+ SPEX(rxpo5g, SSB_SPROM8_RXPO, SSB_SPROM8_RXPO5G,
-+ SSB_SPROM8_RXPO5G_SHIFT);
-+ SPEX(rssismf2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_RSSISMF2G, 0);
-+ SPEX(rssismc2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_RSSISMC2G,
-+ SSB_SPROM8_RSSISMC2G_SHIFT);
-+ SPEX(rssisav2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_RSSISAV2G,
-+ SSB_SPROM8_RSSISAV2G_SHIFT);
-+ SPEX(bxa2g, SSB_SPROM8_RSSIPARM2G, SSB_SPROM8_BXA2G,
-+ SSB_SPROM8_BXA2G_SHIFT);
-+ SPEX(rssismf5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_RSSISMF5G, 0);
-+ SPEX(rssismc5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_RSSISMC5G,
-+ SSB_SPROM8_RSSISMC5G_SHIFT);
-+ SPEX(rssisav5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_RSSISAV5G,
-+ SSB_SPROM8_RSSISAV5G_SHIFT);
-+ SPEX(bxa5g, SSB_SPROM8_RSSIPARM5G, SSB_SPROM8_BXA5G,
-+ SSB_SPROM8_BXA5G_SHIFT);
-+ SPEX(pa0b0, SSB_SPROM8_PA0B0, 0xFFFF, 0);
-+ SPEX(pa0b1, SSB_SPROM8_PA0B1, 0xFFFF, 0);
-+ SPEX(pa0b2, SSB_SPROM8_PA0B2, 0xFFFF, 0);
-+ SPEX(pa1b0, SSB_SPROM8_PA1B0, 0xFFFF, 0);
-+ SPEX(pa1b1, SSB_SPROM8_PA1B1, 0xFFFF, 0);
-+ SPEX(pa1b2, SSB_SPROM8_PA1B2, 0xFFFF, 0);
-+ SPEX(pa1lob0, SSB_SPROM8_PA1LOB0, 0xFFFF, 0);
-+ SPEX(pa1lob1, SSB_SPROM8_PA1LOB1, 0xFFFF, 0);
-+ SPEX(pa1lob2, SSB_SPROM8_PA1LOB2, 0xFFFF, 0);
-+ SPEX(pa1hib0, SSB_SPROM8_PA1HIB0, 0xFFFF, 0);
-+ SPEX(pa1hib1, SSB_SPROM8_PA1HIB1, 0xFFFF, 0);
-+ SPEX(pa1hib2, SSB_SPROM8_PA1HIB2, 0xFFFF, 0);
-+ SPEX(cck2gpo, SSB_SPROM8_CCK2GPO, 0xFFFF, 0);
-+ SPEX32(ofdm2gpo, SSB_SPROM8_OFDM2GPO, 0xFFFFFFFF, 0);
-+ SPEX32(ofdm5glpo, SSB_SPROM8_OFDM5GLPO, 0xFFFFFFFF, 0);
-+ SPEX32(ofdm5gpo, SSB_SPROM8_OFDM5GPO, 0xFFFFFFFF, 0);
-+ SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, 0xFFFFFFFF, 0);
-
- /* Extract the antenna gain values. */
- SPEX(antenna_gain.ghz24.a0, SSB_SPROM8_AGAIN01,
-@@ -549,6 +600,7 @@ static int sprom_extract(struct ssb_bus
- ssb_printk(KERN_WARNING PFX "Unsupported SPROM"
- " revision %d detected. Will extract"
- " v1\n", out->revision);
-+ out->revision = 1;
- sprom_extract_r123(out, in);
- }
- }
---- a/drivers/ssb/scan.c
-+++ b/drivers/ssb/scan.c
-@@ -175,6 +175,8 @@ static u32 scan_read32(struct ssb_bus *b
- } else
- ssb_pcmcia_switch_segment(bus, 0);
- break;
-+ case SSB_BUSTYPE_SDIO:
-+ break;
- }
- return readl(bus->mmio + offset);
- }
-@@ -188,6 +190,8 @@ static int scan_switchcore(struct ssb_bu
- return ssb_pci_switch_coreidx(bus, coreidx);
- case SSB_BUSTYPE_PCMCIA:
- return ssb_pcmcia_switch_coreidx(bus, coreidx);
-+ case SSB_BUSTYPE_SDIO:
-+ break;
- }
- return 0;
- }
-@@ -206,6 +210,8 @@ void ssb_iounmap(struct ssb_bus *bus)
- SSB_BUG_ON(1); /* Can't reach this code. */
- #endif
- break;
-+ case SSB_BUSTYPE_SDIO:
-+ break;
- }
- bus->mmio = NULL;
- bus->mapped_device = NULL;
-@@ -230,6 +236,8 @@ static void __iomem *ssb_ioremap(struct
- SSB_BUG_ON(1); /* Can't reach this code. */
- #endif
- break;
-+ case SSB_BUSTYPE_SDIO:
-+ break;
- }
-
- return mmio;
---- a/include/linux/ssb/ssb.h
-+++ b/include/linux/ssb/ssb.h
-@@ -27,24 +27,54 @@ struct ssb_sprom {
- u8 et1mdcport; /* MDIO for enet1 */
- u8 board_rev; /* Board revision number from SPROM. */
- u8 country_code; /* Country Code */
-- u8 ant_available_a; /* A-PHY antenna available bits (up to 4) */
-- u8 ant_available_bg; /* B/G-PHY antenna available bits (up to 4) */
-+ u8 ant_available_a; /* 2GHz antenna available bits (up to 4) */
-+ u8 ant_available_bg; /* 5GHz antenna available bits (up to 4) */
- u16 pa0b0;
- u16 pa0b1;
- u16 pa0b2;
- u16 pa1b0;
- u16 pa1b1;
- u16 pa1b2;
-+ u16 pa1lob0;
-+ u16 pa1lob1;
-+ u16 pa1lob2;
-+ u16 pa1hib0;
-+ u16 pa1hib1;
-+ u16 pa1hib2;
- u8 gpio0; /* GPIO pin 0 */
- u8 gpio1; /* GPIO pin 1 */
- u8 gpio2; /* GPIO pin 2 */
- u8 gpio3; /* GPIO pin 3 */
-- u16 maxpwr_a; /* A-PHY Amplifier Max Power (in dBm Q5.2) */
-- u16 maxpwr_bg; /* B/G-PHY Amplifier Max Power (in dBm Q5.2) */
-+ u16 maxpwr_bg; /* 2.4GHz Amplifier Max Power (in dBm Q5.2) */
-+ u16 maxpwr_al; /* 5.2GHz Amplifier Max Power (in dBm Q5.2) */
-+ u16 maxpwr_a; /* 5.3GHz Amplifier Max Power (in dBm Q5.2) */
-+ u16 maxpwr_ah; /* 5.8GHz Amplifier Max Power (in dBm Q5.2) */
- u8 itssi_a; /* Idle TSSI Target for A-PHY */
- u8 itssi_bg; /* Idle TSSI Target for B/G-PHY */
-- u16 boardflags_lo; /* Boardflags (low 16 bits) */
-- u16 boardflags_hi; /* Boardflags (high 16 bits) */
-+ u8 tri2g; /* 2.4GHz TX isolation */
-+ u8 tri5gl; /* 5.2GHz TX isolation */
-+ u8 tri5g; /* 5.3GHz TX isolation */
-+ u8 tri5gh; /* 5.8GHz TX isolation */
-+ u8 rxpo2g; /* 2GHz RX power offset */
-+ u8 rxpo5g; /* 5GHz RX power offset */
-+ u8 rssisav2g; /* 2GHz RSSI params */
-+ u8 rssismc2g;
-+ u8 rssismf2g;
-+ u8 bxa2g; /* 2GHz BX arch */
-+ u8 rssisav5g; /* 5GHz RSSI params */
-+ u8 rssismc5g;
-+ u8 rssismf5g;
-+ u8 bxa5g; /* 5GHz BX arch */
-+ u16 cck2gpo; /* CCK power offset */
-+ u32 ofdm2gpo; /* 2.4GHz OFDM power offset */
-+ u32 ofdm5glpo; /* 5.2GHz OFDM power offset */
-+ u32 ofdm5gpo; /* 5.3GHz OFDM power offset */
-+ u32 ofdm5ghpo; /* 5.8GHz OFDM power offset */
-+ u16 boardflags_lo; /* Board flags (bits 0-15) */
-+ u16 boardflags_hi; /* Board flags (bits 16-31) */
-+ u16 boardflags2_lo; /* Board flags (bits 32-47) */
-+ u16 boardflags2_hi; /* Board flags (bits 48-63) */
-+ /* TODO store board flags in a single u64 */
-
- /* Antenna gain values for up to 4 antennas
- * on each band. Values in dBm/4 (Q5.2). Negative gain means the
-@@ -58,7 +88,7 @@ struct ssb_sprom {
- } ghz5; /* 5GHz band */
- } antenna_gain;
-
-- /* TODO - add any parameters needed from rev 2, 3, or 4 SPROMs */
-+ /* TODO - add any parameters needed from rev 2, 3, 4, 5 or 8 SPROMs */
- };
-
- /* Information about the PCB the circuitry is soldered on. */
-@@ -208,6 +238,7 @@ enum ssb_bustype {
- SSB_BUSTYPE_SSB, /* This SSB bus is the system bus */
- SSB_BUSTYPE_PCI, /* SSB is connected to PCI bus */
- SSB_BUSTYPE_PCMCIA, /* SSB is connected to PCMCIA bus */
-+ SSB_BUSTYPE_SDIO, /* SSB is connected to SDIO bus */
- };
-
- /* board_vendor */
-@@ -240,8 +271,12 @@ struct ssb_bus {
-
- /* The core in the basic address register window. (PCI bus only) */
- struct ssb_device *mapped_device;
-- /* Currently mapped PCMCIA segment. (bustype == SSB_BUSTYPE_PCMCIA only) */
-- u8 mapped_pcmcia_seg;
-+ union {
-+ /* Currently mapped PCMCIA segment. (bustype == SSB_BUSTYPE_PCMCIA only) */
-+ u8 mapped_pcmcia_seg;
-+ /* Current SSB base address window for SDIO. */
-+ u32 sdio_sbaddr;
-+ };
- /* Lock for core and segment switching.
- * On PCMCIA-host busses this is used to protect the whole MMIO access. */
- spinlock_t bar_lock;
-@@ -252,6 +287,11 @@ struct ssb_bus {
- struct pci_dev *host_pci;
- /* Pointer to the PCMCIA device (only if bustype == SSB_BUSTYPE_PCMCIA). */
- struct pcmcia_device *host_pcmcia;
-+ /* Pointer to the SDIO device (only if bustype == SSB_BUSTYPE_SDIO). */
-+ struct sdio_func *host_sdio;
-+
-+ /* See enum ssb_quirks */
-+ unsigned int quirks;
-
- #ifdef CONFIG_SSB_SPROM
- /* Mutex to protect the SPROM writing. */
-@@ -306,6 +346,11 @@ struct ssb_bus {
- #endif /* DEBUG */
- };
-
-+enum ssb_quirks {
-+ /* SDIO connected card requires performing a read after writing a 32-bit value */
-+ SSB_QUIRK_SDIO_READ_AFTER_WRITE32 = (1 << 0),
-+};
-+
- /* The initialization-invariants. */
- struct ssb_init_invariants {
- /* Versioning information about the PCB. */
---- a/include/linux/ssb/ssb_driver_chipcommon.h
-+++ b/include/linux/ssb/ssb_driver_chipcommon.h
-@@ -629,5 +629,15 @@ extern int ssb_chipco_serial_init(struct
- /* PMU support */
- extern void ssb_pmu_init(struct ssb_chipcommon *cc);
-
-+enum ssb_pmu_ldo_volt_id {
-+ LDO_PAREF = 0,
-+ LDO_VOLT1,
-+ LDO_VOLT2,
-+ LDO_VOLT3,
-+};
-+
-+void ssb_pmu_set_ldo_voltage(struct ssb_chipcommon *cc,
-+ enum ssb_pmu_ldo_volt_id id, u32 voltage);
-+void ssb_pmu_set_ldo_paref(struct ssb_chipcommon *cc, bool on);
-
- #endif /* LINUX_SSB_CHIPCO_H_ */
---- a/include/linux/ssb/ssb_regs.h
-+++ b/include/linux/ssb/ssb_regs.h
-@@ -162,7 +162,7 @@
-
- /* SPROM shadow area. If not otherwise noted, fields are
- * two bytes wide. Note that the SPROM can _only_ be read
-- * in two-byte quantinies.
-+ * in two-byte quantities.
- */
- #define SSB_SPROMSIZE_WORDS 64
- #define SSB_SPROMSIZE_BYTES (SSB_SPROMSIZE_WORDS * sizeof(u16))
-@@ -327,8 +327,11 @@
- #define SSB_SPROM5_GPIOB_P3_SHIFT 8
-
- /* SPROM Revision 8 */
--#define SSB_SPROM8_BFLLO 0x1084 /* Boardflags (low 16 bits) */
--#define SSB_SPROM8_BFLHI 0x1086 /* Boardflags Hi */
-+#define SSB_SPROM8_BOARDREV 0x1082 /* Board revision */
-+#define SSB_SPROM8_BFLLO 0x1084 /* Board flags (bits 0-15) */
-+#define SSB_SPROM8_BFLHI 0x1086 /* Board flags (bits 16-31) */
-+#define SSB_SPROM8_BFL2LO 0x1088 /* Board flags (bits 32-47) */
-+#define SSB_SPROM8_BFL2HI 0x108A /* Board flags (bits 48-63) */
- #define SSB_SPROM8_IL0MAC 0x108C /* 6 byte MAC address */
- #define SSB_SPROM8_CCODE 0x1092 /* 2 byte country code */
- #define SSB_SPROM8_ANTAVAIL 0x109C /* Antenna available bitfields*/
-@@ -354,14 +357,63 @@
- #define SSB_SPROM8_GPIOB_P2 0x00FF /* Pin 2 */
- #define SSB_SPROM8_GPIOB_P3 0xFF00 /* Pin 3 */
- #define SSB_SPROM8_GPIOB_P3_SHIFT 8
--#define SSB_SPROM8_MAXP_BG 0x10C0 /* Max Power BG in path 1 */
--#define SSB_SPROM8_MAXP_BG_MASK 0x00FF /* Mask for Max Power BG */
-+#define SSB_SPROM8_RSSIPARM2G 0x10A4 /* RSSI params for 2GHz */
-+#define SSB_SPROM8_RSSISMF2G 0x000F
-+#define SSB_SPROM8_RSSISMC2G 0x00F0
-+#define SSB_SPROM8_RSSISMC2G_SHIFT 4
-+#define SSB_SPROM8_RSSISAV2G 0x0700
-+#define SSB_SPROM8_RSSISAV2G_SHIFT 8
-+#define SSB_SPROM8_BXA2G 0x1800
-+#define SSB_SPROM8_BXA2G_SHIFT 11
-+#define SSB_SPROM8_RSSIPARM5G 0x10A6 /* RSSI params for 5GHz */
-+#define SSB_SPROM8_RSSISMF5G 0x000F
-+#define SSB_SPROM8_RSSISMC5G 0x00F0
-+#define SSB_SPROM8_RSSISMC5G_SHIFT 4
-+#define SSB_SPROM8_RSSISAV5G 0x0700
-+#define SSB_SPROM8_RSSISAV5G_SHIFT 8
-+#define SSB_SPROM8_BXA5G 0x1800
-+#define SSB_SPROM8_BXA5G_SHIFT 11
-+#define SSB_SPROM8_TRI25G 0x10A8 /* TX isolation 2.4&5.3GHz */
-+#define SSB_SPROM8_TRI2G 0x00FF /* TX isolation 2.4GHz */
-+#define SSB_SPROM8_TRI5G 0xFF00 /* TX isolation 5.3GHz */
-+#define SSB_SPROM8_TRI5G_SHIFT 8
-+#define SSB_SPROM8_TRI5GHL 0x10AA /* TX isolation 5.2/5.8GHz */
-+#define SSB_SPROM8_TRI5GL 0x00FF /* TX isolation 5.2GHz */
-+#define SSB_SPROM8_TRI5GH 0xFF00 /* TX isolation 5.8GHz */
-+#define SSB_SPROM8_TRI5GH_SHIFT 8
-+#define SSB_SPROM8_RXPO 0x10AC /* RX power offsets */
-+#define SSB_SPROM8_RXPO2G 0x00FF /* 2GHz RX power offset */
-+#define SSB_SPROM8_RXPO5G 0xFF00 /* 5GHz RX power offset */
-+#define SSB_SPROM8_RXPO5G_SHIFT 8
-+#define SSB_SPROM8_MAXP_BG 0x10C0 /* Max Power 2GHz in path 1 */
-+#define SSB_SPROM8_MAXP_BG_MASK 0x00FF /* Mask for Max Power 2GHz */
- #define SSB_SPROM8_ITSSI_BG 0xFF00 /* Mask for path 1 itssi_bg */
- #define SSB_SPROM8_ITSSI_BG_SHIFT 8
--#define SSB_SPROM8_MAXP_A 0x10C8 /* Max Power A in path 1 */
--#define SSB_SPROM8_MAXP_A_MASK 0x00FF /* Mask for Max Power A */
-+#define SSB_SPROM8_PA0B0 0x10C2 /* 2GHz power amp settings */
-+#define SSB_SPROM8_PA0B1 0x10C4
-+#define SSB_SPROM8_PA0B2 0x10C6
-+#define SSB_SPROM8_MAXP_A 0x10C8 /* Max Power 5.3GHz */
-+#define SSB_SPROM8_MAXP_A_MASK 0x00FF /* Mask for Max Power 5.3GHz */
- #define SSB_SPROM8_ITSSI_A 0xFF00 /* Mask for path 1 itssi_a */
- #define SSB_SPROM8_ITSSI_A_SHIFT 8
-+#define SSB_SPROM8_MAXP_AHL 0x10CA /* Max Power 5.2/5.8GHz */
-+#define SSB_SPROM8_MAXP_AH_MASK 0x00FF /* Mask for Max Power 5.8GHz */
-+#define SSB_SPROM8_MAXP_AL_MASK 0xFF00 /* Mask for Max Power 5.2GHz */
-+#define SSB_SPROM8_MAXP_AL_SHIFT 8
-+#define SSB_SPROM8_PA1B0 0x10CC /* 5.3GHz power amp settings */
-+#define SSB_SPROM8_PA1B1 0x10CE
-+#define SSB_SPROM8_PA1B2 0x10D0
-+#define SSB_SPROM8_PA1LOB0 0x10D2 /* 5.2GHz power amp settings */
-+#define SSB_SPROM8_PA1LOB1 0x10D4
-+#define SSB_SPROM8_PA1LOB2 0x10D6
-+#define SSB_SPROM8_PA1HIB0 0x10D8 /* 5.8GHz power amp settings */
-+#define SSB_SPROM8_PA1HIB1 0x10DA
-+#define SSB_SPROM8_PA1HIB2 0x10DC
-+#define SSB_SPROM8_CCK2GPO 0x1140 /* CCK power offset */
-+#define SSB_SPROM8_OFDM2GPO 0x1142 /* 2.4GHz OFDM power offset */
-+#define SSB_SPROM8_OFDM5GPO 0x1146 /* 5.3GHz OFDM power offset */
-+#define SSB_SPROM8_OFDM5GLPO 0x114A /* 5.2GHz OFDM power offset */
-+#define SSB_SPROM8_OFDM5GHPO 0x114E /* 5.8GHz OFDM power offset */
-
- /* Values for SSB_SPROM1_BINF_CCODE */
- enum {
+++ /dev/null
---- a/arch/powerpc/boot/crtsavres.S
-+++ /dev/null
-@@ -1,233 +0,0 @@
--/*
-- * Special support for eabi and SVR4
-- *
-- * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
-- * Copyright 2008 Freescale Semiconductor, Inc.
-- * Written By Michael Meissner
-- *
-- * Based on gcc/config/rs6000/crtsavres.asm from gcc
-- *
-- * This 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, or (at your option) any
-- * later version.
-- *
-- * In addition to the permissions in the GNU General Public License, the
-- * Free Software Foundation gives you unlimited permission to link the
-- * compiled version of this file with other programs, and to distribute
-- * those programs without any restriction coming from the use of this
-- * file. (The General Public License restrictions do apply in other
-- * respects; for example, they cover modification of the file, and
-- * distribution when not linked into another program.)
-- *
-- * This file 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; see the file COPYING. If not, write to
-- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-- * Boston, MA 02110-1301, USA.
-- *
-- * As a special exception, if you link this library with files
-- * compiled with GCC to produce an executable, this does not cause
-- * the resulting executable to be covered by the GNU General Public License.
-- * This exception does not however invalidate any other reasons why
-- * the executable file might be covered by the GNU General Public License.
-- */
--
-- .file "crtsavres.S"
-- .section ".text"
--
--/* On PowerPC64 Linux, these functions are provided by the linker. */
--#ifndef __powerpc64__
--
--#define _GLOBAL(name) \
-- .type name,@function; \
-- .globl name; \
--name:
--
--/* Routines for saving integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer save area. */
--
--_GLOBAL(_savegpr_14)
--_GLOBAL(_save32gpr_14)
-- stw 14,-72(11) /* save gp registers */
--_GLOBAL(_savegpr_15)
--_GLOBAL(_save32gpr_15)
-- stw 15,-68(11)
--_GLOBAL(_savegpr_16)
--_GLOBAL(_save32gpr_16)
-- stw 16,-64(11)
--_GLOBAL(_savegpr_17)
--_GLOBAL(_save32gpr_17)
-- stw 17,-60(11)
--_GLOBAL(_savegpr_18)
--_GLOBAL(_save32gpr_18)
-- stw 18,-56(11)
--_GLOBAL(_savegpr_19)
--_GLOBAL(_save32gpr_19)
-- stw 19,-52(11)
--_GLOBAL(_savegpr_20)
--_GLOBAL(_save32gpr_20)
-- stw 20,-48(11)
--_GLOBAL(_savegpr_21)
--_GLOBAL(_save32gpr_21)
-- stw 21,-44(11)
--_GLOBAL(_savegpr_22)
--_GLOBAL(_save32gpr_22)
-- stw 22,-40(11)
--_GLOBAL(_savegpr_23)
--_GLOBAL(_save32gpr_23)
-- stw 23,-36(11)
--_GLOBAL(_savegpr_24)
--_GLOBAL(_save32gpr_24)
-- stw 24,-32(11)
--_GLOBAL(_savegpr_25)
--_GLOBAL(_save32gpr_25)
-- stw 25,-28(11)
--_GLOBAL(_savegpr_26)
--_GLOBAL(_save32gpr_26)
-- stw 26,-24(11)
--_GLOBAL(_savegpr_27)
--_GLOBAL(_save32gpr_27)
-- stw 27,-20(11)
--_GLOBAL(_savegpr_28)
--_GLOBAL(_save32gpr_28)
-- stw 28,-16(11)
--_GLOBAL(_savegpr_29)
--_GLOBAL(_save32gpr_29)
-- stw 29,-12(11)
--_GLOBAL(_savegpr_30)
--_GLOBAL(_save32gpr_30)
-- stw 30,-8(11)
--_GLOBAL(_savegpr_31)
--_GLOBAL(_save32gpr_31)
-- stw 31,-4(11)
-- blr
--
--/* Routines for restoring integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer restore area. */
--
--_GLOBAL(_restgpr_14)
--_GLOBAL(_rest32gpr_14)
-- lwz 14,-72(11) /* restore gp registers */
--_GLOBAL(_restgpr_15)
--_GLOBAL(_rest32gpr_15)
-- lwz 15,-68(11)
--_GLOBAL(_restgpr_16)
--_GLOBAL(_rest32gpr_16)
-- lwz 16,-64(11)
--_GLOBAL(_restgpr_17)
--_GLOBAL(_rest32gpr_17)
-- lwz 17,-60(11)
--_GLOBAL(_restgpr_18)
--_GLOBAL(_rest32gpr_18)
-- lwz 18,-56(11)
--_GLOBAL(_restgpr_19)
--_GLOBAL(_rest32gpr_19)
-- lwz 19,-52(11)
--_GLOBAL(_restgpr_20)
--_GLOBAL(_rest32gpr_20)
-- lwz 20,-48(11)
--_GLOBAL(_restgpr_21)
--_GLOBAL(_rest32gpr_21)
-- lwz 21,-44(11)
--_GLOBAL(_restgpr_22)
--_GLOBAL(_rest32gpr_22)
-- lwz 22,-40(11)
--_GLOBAL(_restgpr_23)
--_GLOBAL(_rest32gpr_23)
-- lwz 23,-36(11)
--_GLOBAL(_restgpr_24)
--_GLOBAL(_rest32gpr_24)
-- lwz 24,-32(11)
--_GLOBAL(_restgpr_25)
--_GLOBAL(_rest32gpr_25)
-- lwz 25,-28(11)
--_GLOBAL(_restgpr_26)
--_GLOBAL(_rest32gpr_26)
-- lwz 26,-24(11)
--_GLOBAL(_restgpr_27)
--_GLOBAL(_rest32gpr_27)
-- lwz 27,-20(11)
--_GLOBAL(_restgpr_28)
--_GLOBAL(_rest32gpr_28)
-- lwz 28,-16(11)
--_GLOBAL(_restgpr_29)
--_GLOBAL(_rest32gpr_29)
-- lwz 29,-12(11)
--_GLOBAL(_restgpr_30)
--_GLOBAL(_rest32gpr_30)
-- lwz 30,-8(11)
--_GLOBAL(_restgpr_31)
--_GLOBAL(_rest32gpr_31)
-- lwz 31,-4(11)
-- blr
--
--/* Routines for restoring integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer restore area. */
--
--_GLOBAL(_restgpr_14_x)
--_GLOBAL(_rest32gpr_14_x)
-- lwz 14,-72(11) /* restore gp registers */
--_GLOBAL(_restgpr_15_x)
--_GLOBAL(_rest32gpr_15_x)
-- lwz 15,-68(11)
--_GLOBAL(_restgpr_16_x)
--_GLOBAL(_rest32gpr_16_x)
-- lwz 16,-64(11)
--_GLOBAL(_restgpr_17_x)
--_GLOBAL(_rest32gpr_17_x)
-- lwz 17,-60(11)
--_GLOBAL(_restgpr_18_x)
--_GLOBAL(_rest32gpr_18_x)
-- lwz 18,-56(11)
--_GLOBAL(_restgpr_19_x)
--_GLOBAL(_rest32gpr_19_x)
-- lwz 19,-52(11)
--_GLOBAL(_restgpr_20_x)
--_GLOBAL(_rest32gpr_20_x)
-- lwz 20,-48(11)
--_GLOBAL(_restgpr_21_x)
--_GLOBAL(_rest32gpr_21_x)
-- lwz 21,-44(11)
--_GLOBAL(_restgpr_22_x)
--_GLOBAL(_rest32gpr_22_x)
-- lwz 22,-40(11)
--_GLOBAL(_restgpr_23_x)
--_GLOBAL(_rest32gpr_23_x)
-- lwz 23,-36(11)
--_GLOBAL(_restgpr_24_x)
--_GLOBAL(_rest32gpr_24_x)
-- lwz 24,-32(11)
--_GLOBAL(_restgpr_25_x)
--_GLOBAL(_rest32gpr_25_x)
-- lwz 25,-28(11)
--_GLOBAL(_restgpr_26_x)
--_GLOBAL(_rest32gpr_26_x)
-- lwz 26,-24(11)
--_GLOBAL(_restgpr_27_x)
--_GLOBAL(_rest32gpr_27_x)
-- lwz 27,-20(11)
--_GLOBAL(_restgpr_28_x)
--_GLOBAL(_rest32gpr_28_x)
-- lwz 28,-16(11)
--_GLOBAL(_restgpr_29_x)
--_GLOBAL(_rest32gpr_29_x)
-- lwz 29,-12(11)
--_GLOBAL(_restgpr_30_x)
--_GLOBAL(_rest32gpr_30_x)
-- lwz 30,-8(11)
--_GLOBAL(_restgpr_31_x)
--_GLOBAL(_rest32gpr_31_x)
-- lwz 0,4(11)
-- lwz 31,-4(11)
-- mtlr 0
-- mr 1,11
-- blr
--#endif
---- a/arch/powerpc/boot/Makefile
-+++ b/arch/powerpc/boot/Makefile
-@@ -59,7 +59,7 @@ libfdtheader := fdt.h libfdt.h libfdt_in
- $(addprefix $(obj)/,$(libfdt) libfdt-wrapper.o simpleboot.o): \
- $(addprefix $(obj)/,$(libfdtheader))
-
--src-wlib := string.S crt0.S crtsavres.S stdio.c main.c \
-+src-wlib := string.S crt0.S stdio.c main.c \
- $(libfdt) libfdt-wrapper.c \
- ns16550.c serial.c simple_alloc.c div64.S util.S \
- gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \
---- a/arch/powerpc/kernel/prom_init_check.sh
-+++ b/arch/powerpc/kernel/prom_init_check.sh
-@@ -48,20 +48,6 @@ do
- fi
- done
-
-- # ignore register save/restore funcitons
-- if [ "${UNDEF:0:9}" = "_restgpr_" ]; then
-- OK=1
-- fi
-- if [ "${UNDEF:0:11}" = "_rest32gpr_" ]; then
-- OK=1
-- fi
-- if [ "${UNDEF:0:9}" = "_savegpr_" ]; then
-- OK=1
-- fi
-- if [ "${UNDEF:0:11}" = "_save32gpr_" ]; then
-- OK=1
-- fi
--
- if [ $OK -eq 0 ]; then
- ERROR=1
- echo "Error: External symbol '$UNDEF' referenced" \
---- a/arch/powerpc/lib/crtsavres.S
-+++ /dev/null
-@@ -1,229 +0,0 @@
--/*
-- * Special support for eabi and SVR4
-- *
-- * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
-- * Copyright 2008 Freescale Semiconductor, Inc.
-- * Written By Michael Meissner
-- *
-- * Based on gcc/config/rs6000/crtsavres.asm from gcc
-- *
-- * This 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, or (at your option) any
-- * later version.
-- *
-- * In addition to the permissions in the GNU General Public License, the
-- * Free Software Foundation gives you unlimited permission to link the
-- * compiled version of this file with other programs, and to distribute
-- * those programs without any restriction coming from the use of this
-- * file. (The General Public License restrictions do apply in other
-- * respects; for example, they cover modification of the file, and
-- * distribution when not linked into another program.)
-- *
-- * This file 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; see the file COPYING. If not, write to
-- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-- * Boston, MA 02110-1301, USA.
-- *
-- * As a special exception, if you link this library with files
-- * compiled with GCC to produce an executable, this does not cause
-- * the resulting executable to be covered by the GNU General Public License.
-- * This exception does not however invalidate any other reasons why
-- * the executable file might be covered by the GNU General Public License.
-- */
--
--#include <asm/ppc_asm.h>
--
-- .file "crtsavres.S"
-- .section ".text"
--
--#ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
--
--/* Routines for saving integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer save area. */
--
--_GLOBAL(_savegpr_14)
--_GLOBAL(_save32gpr_14)
-- stw 14,-72(11) /* save gp registers */
--_GLOBAL(_savegpr_15)
--_GLOBAL(_save32gpr_15)
-- stw 15,-68(11)
--_GLOBAL(_savegpr_16)
--_GLOBAL(_save32gpr_16)
-- stw 16,-64(11)
--_GLOBAL(_savegpr_17)
--_GLOBAL(_save32gpr_17)
-- stw 17,-60(11)
--_GLOBAL(_savegpr_18)
--_GLOBAL(_save32gpr_18)
-- stw 18,-56(11)
--_GLOBAL(_savegpr_19)
--_GLOBAL(_save32gpr_19)
-- stw 19,-52(11)
--_GLOBAL(_savegpr_20)
--_GLOBAL(_save32gpr_20)
-- stw 20,-48(11)
--_GLOBAL(_savegpr_21)
--_GLOBAL(_save32gpr_21)
-- stw 21,-44(11)
--_GLOBAL(_savegpr_22)
--_GLOBAL(_save32gpr_22)
-- stw 22,-40(11)
--_GLOBAL(_savegpr_23)
--_GLOBAL(_save32gpr_23)
-- stw 23,-36(11)
--_GLOBAL(_savegpr_24)
--_GLOBAL(_save32gpr_24)
-- stw 24,-32(11)
--_GLOBAL(_savegpr_25)
--_GLOBAL(_save32gpr_25)
-- stw 25,-28(11)
--_GLOBAL(_savegpr_26)
--_GLOBAL(_save32gpr_26)
-- stw 26,-24(11)
--_GLOBAL(_savegpr_27)
--_GLOBAL(_save32gpr_27)
-- stw 27,-20(11)
--_GLOBAL(_savegpr_28)
--_GLOBAL(_save32gpr_28)
-- stw 28,-16(11)
--_GLOBAL(_savegpr_29)
--_GLOBAL(_save32gpr_29)
-- stw 29,-12(11)
--_GLOBAL(_savegpr_30)
--_GLOBAL(_save32gpr_30)
-- stw 30,-8(11)
--_GLOBAL(_savegpr_31)
--_GLOBAL(_save32gpr_31)
-- stw 31,-4(11)
-- blr
--
--/* Routines for restoring integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer restore area. */
--
--_GLOBAL(_restgpr_14)
--_GLOBAL(_rest32gpr_14)
-- lwz 14,-72(11) /* restore gp registers */
--_GLOBAL(_restgpr_15)
--_GLOBAL(_rest32gpr_15)
-- lwz 15,-68(11)
--_GLOBAL(_restgpr_16)
--_GLOBAL(_rest32gpr_16)
-- lwz 16,-64(11)
--_GLOBAL(_restgpr_17)
--_GLOBAL(_rest32gpr_17)
-- lwz 17,-60(11)
--_GLOBAL(_restgpr_18)
--_GLOBAL(_rest32gpr_18)
-- lwz 18,-56(11)
--_GLOBAL(_restgpr_19)
--_GLOBAL(_rest32gpr_19)
-- lwz 19,-52(11)
--_GLOBAL(_restgpr_20)
--_GLOBAL(_rest32gpr_20)
-- lwz 20,-48(11)
--_GLOBAL(_restgpr_21)
--_GLOBAL(_rest32gpr_21)
-- lwz 21,-44(11)
--_GLOBAL(_restgpr_22)
--_GLOBAL(_rest32gpr_22)
-- lwz 22,-40(11)
--_GLOBAL(_restgpr_23)
--_GLOBAL(_rest32gpr_23)
-- lwz 23,-36(11)
--_GLOBAL(_restgpr_24)
--_GLOBAL(_rest32gpr_24)
-- lwz 24,-32(11)
--_GLOBAL(_restgpr_25)
--_GLOBAL(_rest32gpr_25)
-- lwz 25,-28(11)
--_GLOBAL(_restgpr_26)
--_GLOBAL(_rest32gpr_26)
-- lwz 26,-24(11)
--_GLOBAL(_restgpr_27)
--_GLOBAL(_rest32gpr_27)
-- lwz 27,-20(11)
--_GLOBAL(_restgpr_28)
--_GLOBAL(_rest32gpr_28)
-- lwz 28,-16(11)
--_GLOBAL(_restgpr_29)
--_GLOBAL(_rest32gpr_29)
-- lwz 29,-12(11)
--_GLOBAL(_restgpr_30)
--_GLOBAL(_rest32gpr_30)
-- lwz 30,-8(11)
--_GLOBAL(_restgpr_31)
--_GLOBAL(_rest32gpr_31)
-- lwz 31,-4(11)
-- blr
--
--/* Routines for restoring integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer restore area. */
--
--_GLOBAL(_restgpr_14_x)
--_GLOBAL(_rest32gpr_14_x)
-- lwz 14,-72(11) /* restore gp registers */
--_GLOBAL(_restgpr_15_x)
--_GLOBAL(_rest32gpr_15_x)
-- lwz 15,-68(11)
--_GLOBAL(_restgpr_16_x)
--_GLOBAL(_rest32gpr_16_x)
-- lwz 16,-64(11)
--_GLOBAL(_restgpr_17_x)
--_GLOBAL(_rest32gpr_17_x)
-- lwz 17,-60(11)
--_GLOBAL(_restgpr_18_x)
--_GLOBAL(_rest32gpr_18_x)
-- lwz 18,-56(11)
--_GLOBAL(_restgpr_19_x)
--_GLOBAL(_rest32gpr_19_x)
-- lwz 19,-52(11)
--_GLOBAL(_restgpr_20_x)
--_GLOBAL(_rest32gpr_20_x)
-- lwz 20,-48(11)
--_GLOBAL(_restgpr_21_x)
--_GLOBAL(_rest32gpr_21_x)
-- lwz 21,-44(11)
--_GLOBAL(_restgpr_22_x)
--_GLOBAL(_rest32gpr_22_x)
-- lwz 22,-40(11)
--_GLOBAL(_restgpr_23_x)
--_GLOBAL(_rest32gpr_23_x)
-- lwz 23,-36(11)
--_GLOBAL(_restgpr_24_x)
--_GLOBAL(_rest32gpr_24_x)
-- lwz 24,-32(11)
--_GLOBAL(_restgpr_25_x)
--_GLOBAL(_rest32gpr_25_x)
-- lwz 25,-28(11)
--_GLOBAL(_restgpr_26_x)
--_GLOBAL(_rest32gpr_26_x)
-- lwz 26,-24(11)
--_GLOBAL(_restgpr_27_x)
--_GLOBAL(_rest32gpr_27_x)
-- lwz 27,-20(11)
--_GLOBAL(_restgpr_28_x)
--_GLOBAL(_rest32gpr_28_x)
-- lwz 28,-16(11)
--_GLOBAL(_restgpr_29_x)
--_GLOBAL(_rest32gpr_29_x)
-- lwz 29,-12(11)
--_GLOBAL(_restgpr_30_x)
--_GLOBAL(_rest32gpr_30_x)
-- lwz 30,-8(11)
--_GLOBAL(_restgpr_31_x)
--_GLOBAL(_rest32gpr_31_x)
-- lwz 0,4(11)
-- lwz 31,-4(11)
-- mtlr 0
-- mr 1,11
-- blr
--#endif
---- a/arch/powerpc/lib/Makefile
-+++ b/arch/powerpc/lib/Makefile
-@@ -13,7 +13,7 @@ CFLAGS_REMOVE_feature-fixups.o = -pg
-
- obj-y := string.o alloc.o \
- checksum_$(CONFIG_WORD_SIZE).o
--obj-$(CONFIG_PPC32) += div64.o copy_32.o crtsavres.o
-+obj-$(CONFIG_PPC32) += div64.o copy_32.o
- obj-$(CONFIG_HAS_IOMEM) += devres.o
-
- obj-$(CONFIG_PPC64) += copypage_64.o copyuser_64.o \
---- a/arch/powerpc/Makefile
-+++ b/arch/powerpc/Makefile
-@@ -92,8 +92,6 @@ endif
- else
- KBUILD_CFLAGS += $(call cc-option,-mtune=power4)
- endif
--else
--LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
- endif
-
- ifeq ($(CONFIG_TUNE_CELL),y)
+++ /dev/null
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -788,6 +788,8 @@ config CRYPTO_ANSI_CPRNG
- for cryptographic modules. Uses the Algorithm specified in
- ANSI X9.31 A.2.4
-
-+source "crypto/ocf/Kconfig"
-+
- source "drivers/crypto/Kconfig"
-
- endif # if CRYPTO
---- a/crypto/Makefile
-+++ b/crypto/Makefile
-@@ -85,6 +85,11 @@ obj-$(CONFIG_CRYPTO_ANSI_CPRNG) += ansi_
- obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o
-
- #
-+# OCF
-+#
-+obj-$(CONFIG_OCF_OCF) += ocf/
-+
-+#
- # generic algorithms and the async_tx api
- #
- obj-$(CONFIG_XOR_BLOCKS) += xor.o
+++ /dev/null
---- a/drivers/char/random.c
-+++ b/drivers/char/random.c
-@@ -129,6 +129,9 @@
- * unsigned int value);
- * void add_interrupt_randomness(int irq);
- *
-+ * void random_input_words(__u32 *buf, size_t wordcount, int ent_count)
-+ * int random_input_wait(void);
-+ *
- * add_input_randomness() uses the input layer interrupt timing, as well as
- * the event type information from the hardware.
- *
-@@ -140,6 +143,13 @@
- * a better measure, since the timing of the disk interrupts are more
- * unpredictable.
- *
-+ * random_input_words() just provides a raw block of entropy to the input
-+ * pool, such as from a hardware entropy generator.
-+ *
-+ * random_input_wait() suspends the caller until such time as the
-+ * entropy pool falls below the write threshold, and returns a count of how
-+ * much entropy (in bits) is needed to sustain the pool.
-+ *
- * All of these routines try to estimate how many bits of randomness a
- * particular randomness source. They do this by keeping track of the
- * first and second order deltas of the event timings.
-@@ -712,6 +722,61 @@ void add_disk_randomness(struct gendisk
- }
- #endif
-
-+/*
-+ * random_input_words - add bulk entropy to pool
-+ *
-+ * @buf: buffer to add
-+ * @wordcount: number of __u32 words to add
-+ * @ent_count: total amount of entropy (in bits) to credit
-+ *
-+ * this provides bulk input of entropy to the input pool
-+ *
-+ */
-+void random_input_words(__u32 *buf, size_t wordcount, int ent_count)
-+{
-+ mix_pool_bytes(&input_pool, buf, wordcount*4);
-+
-+ credit_entropy_bits(&input_pool, ent_count);
-+
-+ DEBUG_ENT("crediting %d bits => %d\n",
-+ ent_count, input_pool.entropy_count);
-+ /*
-+ * Wake up waiting processes if we have enough
-+ * entropy.
-+ */
-+ if (input_pool.entropy_count >= random_read_wakeup_thresh)
-+ wake_up_interruptible(&random_read_wait);
-+}
-+EXPORT_SYMBOL(random_input_words);
-+
-+/*
-+ * random_input_wait - wait until random needs entropy
-+ *
-+ * this function sleeps until the /dev/random subsystem actually
-+ * needs more entropy, and then return the amount of entropy
-+ * that it would be nice to have added to the system.
-+ */
-+int random_input_wait(void)
-+{
-+ int count;
-+
-+ wait_event_interruptible(random_write_wait,
-+ input_pool.entropy_count < random_write_wakeup_thresh);
-+
-+ count = random_write_wakeup_thresh - input_pool.entropy_count;
-+
-+ /* likely we got woken up due to a signal */
-+ if (count <= 0) count = random_read_wakeup_thresh;
-+
-+ DEBUG_ENT("requesting %d bits from input_wait()er %d<%d\n",
-+ count,
-+ input_pool.entropy_count, random_write_wakeup_thresh);
-+
-+ return count;
-+}
-+EXPORT_SYMBOL(random_input_wait);
-+
-+
- #define EXTRACT_SIZE 10
-
- /*********************************************************************
---- a/fs/fcntl.c
-+++ b/fs/fcntl.c
-@@ -141,6 +141,7 @@ SYSCALL_DEFINE1(dup, unsigned int, filde
- }
- return ret;
- }
-+EXPORT_SYMBOL(sys_dup);
-
- #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME)
-
---- a/include/linux/miscdevice.h
-+++ b/include/linux/miscdevice.h
-@@ -12,6 +12,7 @@
- #define APOLLO_MOUSE_MINOR 7
- #define PC110PAD_MINOR 9
- /*#define ADB_MOUSE_MINOR 10 FIXME OBSOLETE */
-+#define CRYPTODEV_MINOR 70 /* /dev/crypto */
- #define WATCHDOG_MINOR 130 /* Watchdog timer */
- #define TEMP_MINOR 131 /* Temperature Sensor */
- #define RTC_MINOR 135
---- a/include/linux/random.h
-+++ b/include/linux/random.h
-@@ -34,6 +34,30 @@
- /* Clear the entropy pool and associated counters. (Superuser only.) */
- #define RNDCLEARPOOL _IO( 'R', 0x06 )
-
-+#ifdef CONFIG_FIPS_RNG
-+
-+/* Size of seed value - equal to AES blocksize */
-+#define AES_BLOCK_SIZE_BYTES 16
-+#define SEED_SIZE_BYTES AES_BLOCK_SIZE_BYTES
-+/* Size of AES key */
-+#define KEY_SIZE_BYTES 16
-+
-+/* ioctl() structure used by FIPS 140-2 Tests */
-+struct rand_fips_test {
-+ unsigned char key[KEY_SIZE_BYTES]; /* Input */
-+ unsigned char datetime[SEED_SIZE_BYTES]; /* Input */
-+ unsigned char seed[SEED_SIZE_BYTES]; /* Input */
-+ unsigned char result[SEED_SIZE_BYTES]; /* Output */
-+};
-+
-+/* FIPS 140-2 RNG Variable Seed Test. (Superuser only.) */
-+#define RNDFIPSVST _IOWR('R', 0x10, struct rand_fips_test)
-+
-+/* FIPS 140-2 RNG Monte Carlo Test. (Superuser only.) */
-+#define RNDFIPSMCT _IOWR('R', 0x11, struct rand_fips_test)
-+
-+#endif /* #ifdef CONFIG_FIPS_RNG */
-+
- struct rand_pool_info {
- int entropy_count;
- int buf_size;
-@@ -50,6 +74,10 @@ extern void add_input_randomness(unsigne
- unsigned int value);
- extern void add_interrupt_randomness(int irq);
-
-+extern void random_input_words(__u32 *buf, size_t wordcount, int ent_count);
-+extern int random_input_wait(void);
-+#define HAS_RANDOM_INPUT_WAIT 1
-+
- extern void get_random_bytes(void *buf, int nbytes);
- void generate_random_uuid(unsigned char uuid_out[16]);
-
+++ /dev/null
---- a/crypto/ocf/cryptosoft.c
-+++ b/crypto/ocf/cryptosoft.c
-@@ -47,7 +47,7 @@
- #include <linux/mm.h>
- #include <linux/skbuff.h>
- #include <linux/random.h>
--#include <asm/scatterlist.h>
-+#include <linux/scatterlist.h>
-
- #include <cryptodev.h>
- #include <uio.h>
+++ /dev/null
---- a/crypto/ocf/random.c
-+++ b/crypto/ocf/random.c
-@@ -49,6 +49,7 @@
- #include <linux/unistd.h>
- #include <linux/poll.h>
- #include <linux/random.h>
-+#include <linux/kthread.h>
- #include <cryptodev.h>
-
- #ifdef CONFIG_OCF_FIPS
-@@ -81,7 +82,7 @@ struct random_op {
-
- static int random_proc(void *arg);
-
--static pid_t randomproc = (pid_t) -1;
-+static struct task_struct *random_task;
- static spinlock_t random_lock;
-
- /*
-@@ -141,13 +142,18 @@ crypto_rregister(
- spin_lock_irqsave(&random_lock, flags);
- list_add_tail(&rops->random_list, &random_ops);
- if (!started) {
-- randomproc = kernel_thread(random_proc, NULL, CLONE_FS|CLONE_FILES);
-- if (randomproc < 0) {
-- ret = randomproc;
-+ struct task_struct *t;
-+
-+ t = kthread_create(random_proc, NULL, "ocf-random");
-+ if (IS_ERR(t)) {
-+ ret = PTR_ERR(t);
- printk("crypto: crypto_rregister cannot start random thread; "
- "error %d", ret);
-- } else
-+ } else {
-+ random_task = t;
-+ wake_up_process(t);
- started = 1;
-+ }
- }
- spin_unlock_irqrestore(&random_lock, flags);
-
-@@ -172,7 +178,7 @@ crypto_runregister_all(u_int32_t driveri
-
- spin_lock_irqsave(&random_lock, flags);
- if (list_empty(&random_ops) && started)
-- kill_proc(randomproc, SIGKILL, 1);
-+ send_sig(SIGKILL, random_task, 1);
- spin_unlock_irqrestore(&random_lock, flags);
- return(0);
- }
-@@ -308,7 +314,7 @@ random_proc(void *arg)
-
- bad_alloc:
- spin_lock_irq(&random_lock);
-- randomproc = (pid_t) -1;
-+ random_task = NULL;
- started = 0;
- spin_unlock_irq(&random_lock);
-
---- a/crypto/ocf/crypto.c
-+++ b/crypto/ocf/crypto.c
-@@ -74,6 +74,7 @@ __FBSDID("$FreeBSD: src/sys/opencrypto/c
- #include <linux/sched.h>
- #include <linux/spinlock.h>
- #include <linux/version.h>
-+#include <linux/kthread.h>
- #include <cryptodev.h>
-
- /*
-@@ -255,10 +256,10 @@ module_param(crypto_devallowsoft, int, 0
- MODULE_PARM_DESC(crypto_devallowsoft,
- "Enable/disable use of software crypto support");
-
--static pid_t cryptoproc = (pid_t) -1;
-+static struct task_struct *crypto_task;
- static struct completion cryptoproc_exited;
- static DECLARE_WAIT_QUEUE_HEAD(cryptoproc_wait);
--static pid_t cryptoretproc = (pid_t) -1;
-+static struct task_struct *cryptoret_task;
- static struct completion cryptoretproc_exited;
- static DECLARE_WAIT_QUEUE_HEAD(cryptoretproc_wait);
-
-@@ -1401,7 +1402,7 @@ crypto_proc(void *arg)
- wait_event_interruptible(cryptoproc_wait,
- !(list_empty(&crp_q) || crypto_all_qblocked) ||
- !(list_empty(&crp_kq) || crypto_all_kqblocked) ||
-- cryptoproc == (pid_t) -1);
-+ crypto_task == NULL);
- crp_sleep = 0;
- if (signal_pending (current)) {
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-@@ -1414,7 +1415,7 @@ crypto_proc(void *arg)
- }
- CRYPTO_Q_LOCK();
- dprintk("%s - awake\n", __FUNCTION__);
-- if (cryptoproc == (pid_t) -1)
-+ if (crypto_task == NULL)
- break;
- cryptostats.cs_intrs++;
- }
-@@ -1470,7 +1471,7 @@ crypto_ret_proc(void *arg)
- dprintk("%s - sleeping\n", __FUNCTION__);
- CRYPTO_RETQ_UNLOCK();
- wait_event_interruptible(cryptoretproc_wait,
-- cryptoretproc == (pid_t) -1 ||
-+ cryptoret_task == NULL ||
- !list_empty(&crp_ret_q) ||
- !list_empty(&crp_ret_kq));
- if (signal_pending (current)) {
-@@ -1484,7 +1485,7 @@ crypto_ret_proc(void *arg)
- }
- CRYPTO_RETQ_LOCK();
- dprintk("%s - awake\n", __FUNCTION__);
-- if (cryptoretproc == (pid_t) -1) {
-+ if (cryptoret_task == NULL) {
- dprintk("%s - EXITING!\n", __FUNCTION__);
- break;
- }
-@@ -1597,6 +1598,7 @@ DB_SHOW_COMMAND(kcrypto, db_show_kcrypto
- static int
- crypto_init(void)
- {
-+ struct task_struct *t;
- int error;
-
- dprintk("%s(0x%x)\n", __FUNCTION__, (int) crypto_init);
-@@ -1643,23 +1645,27 @@ crypto_init(void)
- init_completion(&cryptoproc_exited);
- init_completion(&cryptoretproc_exited);
-
-- cryptoproc = 0; /* to avoid race condition where proc runs first */
-- cryptoproc = kernel_thread(crypto_proc, NULL, CLONE_FS|CLONE_FILES);
-- if (cryptoproc < 0) {
-- error = cryptoproc;
-+ crypto_task = NULL; /* to avoid race condition where proc runs first */
-+ t = kthread_create(crypto_proc, NULL, "ocf-crypto");
-+ if (IS_ERR(t)) {
-+ error = PTR_ERR(t);
- printk("crypto: crypto_init cannot start crypto thread; error %d",
- error);
- goto bad;
- }
-+ wake_up_process(t);
-+ crypto_task = t;
-
-- cryptoretproc = 0; /* to avoid race condition where proc runs first */
-- cryptoretproc = kernel_thread(crypto_ret_proc, NULL, CLONE_FS|CLONE_FILES);
-- if (cryptoretproc < 0) {
-- error = cryptoretproc;
-+ cryptoret_task = NULL; /* to avoid race condition where proc runs first */
-+ t = kthread_create(crypto_ret_proc, NULL, "ocf-cryptoret");
-+ if (IS_ERR(t)) {
-+ error = PTR_ERR(t);
- printk("crypto: crypto_init cannot start cryptoret thread; error %d",
- error);
- goto bad;
- }
-+ wake_up_process(t);
-+ cryptoret_task = t;
-
- return 0;
- bad:
-@@ -1671,7 +1677,7 @@ bad:
- static void
- crypto_exit(void)
- {
-- pid_t p;
-+ struct task_struct *t;
- unsigned long d_flags;
-
- dprintk("%s()\n", __FUNCTION__);
-@@ -1681,18 +1687,18 @@ crypto_exit(void)
- */
-
- CRYPTO_DRIVER_LOCK();
-- p = cryptoproc;
-- cryptoproc = (pid_t) -1;
-- kill_proc(p, SIGTERM, 1);
-+ t = crypto_task;
-+ crypto_task = NULL;
-+ send_sig(SIGTERM, t, 1);
- wake_up_interruptible(&cryptoproc_wait);
- CRYPTO_DRIVER_UNLOCK();
-
- wait_for_completion(&cryptoproc_exited);
-
- CRYPTO_DRIVER_LOCK();
-- p = cryptoretproc;
-- cryptoretproc = (pid_t) -1;
-- kill_proc(p, SIGTERM, 1);
-+ t = cryptoret_task;
-+ cryptoret_task = NULL;
-+ send_sig(SIGTERM, t, 1);
- wake_up_interruptible(&cryptoretproc_wait);
- CRYPTO_DRIVER_UNLOCK();
-
+++ /dev/null
---- a/drivers/ssb/Kconfig
-+++ b/drivers/ssb/Kconfig
-@@ -49,7 +49,7 @@ config SSB_PCIHOST
- config SSB_B43_PCI_BRIDGE
- bool
- depends on SSB_PCIHOST
-- default n
-+ default y
-
- config SSB_PCMCIAHOST_POSSIBLE
- bool
+++ /dev/null
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -152,16 +152,16 @@ config REED_SOLOMON_DEC16
- # Textsearch support is select'ed if needed
- #
- config TEXTSEARCH
-- boolean
-+ boolean "Textsearch support"
-
- config TEXTSEARCH_KMP
-- tristate
-+ tristate "Textsearch KMP"
-
- config TEXTSEARCH_BM
-- tristate
-+ tristate "Textsearch BM"
-
- config TEXTSEARCH_FSM
-- tristate
-+ tristate "Textsearch FSM"
-
- config HAS_IOMEM
- boolean
+++ /dev/null
---- a/net/wireless/Kconfig
-+++ b/net/wireless/Kconfig
-@@ -72,13 +72,13 @@ config LIB80211
- you want this built into your kernel.
-
- config LIB80211_CRYPT_WEP
-- tristate
-+ tristate "LIB80211_CRYPT_WEP"
-
- config LIB80211_CRYPT_CCMP
-- tristate
-+ tristate "LIB80211_CRYPT_CCMP"
-
- config LIB80211_CRYPT_TKIP
-- tristate
-+ tristate "LIB80211_CRYPT_TKIP"
-
- config LIB80211_DEBUG
- bool "lib80211 debugging messages"
+++ /dev/null
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -30,7 +30,7 @@ config CRYPTO_FIPS
- this is.
-
- config CRYPTO_ALGAPI
-- tristate
-+ tristate "ALGAPI"
- select CRYPTO_ALGAPI2
- help
- This option provides the API for cryptographic algorithms.
-@@ -39,7 +39,7 @@ config CRYPTO_ALGAPI2
- tristate
-
- config CRYPTO_AEAD
-- tristate
-+ tristate "AEAD"
- select CRYPTO_AEAD2
- select CRYPTO_ALGAPI
-
-@@ -48,7 +48,7 @@ config CRYPTO_AEAD2
- select CRYPTO_ALGAPI2
-
- config CRYPTO_BLKCIPHER
-- tristate
-+ tristate "BLKCIPHER"
- select CRYPTO_BLKCIPHER2
- select CRYPTO_ALGAPI
-
-@@ -59,7 +59,7 @@ config CRYPTO_BLKCIPHER2
- select CRYPTO_WORKQUEUE
-
- config CRYPTO_HASH
-- tristate
-+ tristate "HASH"
- select CRYPTO_HASH2
- select CRYPTO_ALGAPI
-
-@@ -68,7 +68,7 @@ config CRYPTO_HASH2
- select CRYPTO_ALGAPI2
-
- config CRYPTO_RNG
-- tristate
-+ tristate "RNG"
- select CRYPTO_RNG2
- select CRYPTO_ALGAPI
-
+++ /dev/null
---- a/mm/shmem.c
-+++ b/mm/shmem.c
-@@ -2602,6 +2602,16 @@ int shmem_unuse(swp_entry_t entry, struc
-
- /* common code */
-
-+void shmem_set_file(struct vm_area_struct *vma, struct file *file)
-+{
-+ ima_counts_get(file);
-+ if (vma->vm_file)
-+ fput(vma->vm_file);
-+ vma->vm_file = file;
-+ vma->vm_ops = &shmem_vm_ops;
-+}
-+EXPORT_SYMBOL_GPL(shmem_set_file);
-+
- /**
- * shmem_file_setup - get an unlinked file living in tmpfs
- * @name: name for dentry (to be seen in /proc/<pid>/maps
-@@ -2681,10 +2691,7 @@ int shmem_zero_setup(struct vm_area_stru
- if (IS_ERR(file))
- return PTR_ERR(file);
-
-- if (vma->vm_file)
-- fput(vma->vm_file);
-- vma->vm_file = file;
-- vma->vm_ops = &shmem_vm_ops;
-+ shmem_set_file(vma, file);
- return 0;
- }
-
---- a/fs/file.c
-+++ b/fs/file.c
-@@ -270,6 +270,7 @@ int expand_files(struct files_struct *fi
- /* All good, so we try */
- return expand_fdtable(files, nr);
- }
-+EXPORT_SYMBOL_GPL(expand_files);
-
- static int count_open_files(struct fdtable *fdt)
- {
---- a/kernel/exit.c
-+++ b/kernel/exit.c
-@@ -507,6 +507,7 @@ struct files_struct *get_files_struct(st
-
- return files;
- }
-+EXPORT_SYMBOL_GPL(get_files_struct);
-
- void put_files_struct(struct files_struct *files)
- {
-@@ -526,6 +527,7 @@ void put_files_struct(struct files_struc
- free_fdtable(fdt);
- }
- }
-+EXPORT_SYMBOL_GPL(put_files_struct);
-
- void reset_files_struct(struct files_struct *files)
- {
---- a/kernel/fork.c
-+++ b/kernel/fork.c
-@@ -159,6 +159,7 @@ void __put_task_struct(struct task_struc
- if (!profile_handoff_task(tsk))
- free_task(tsk);
- }
-+EXPORT_SYMBOL_GPL(__put_task_struct);
-
- /*
- * macro override instead of weak attribute alias, to workaround
---- a/kernel/sched.c
-+++ b/kernel/sched.c
-@@ -5981,6 +5981,7 @@ int can_nice(const struct task_struct *p
- return (nice_rlim <= p->signal->rlim[RLIMIT_NICE].rlim_cur ||
- capable(CAP_SYS_NICE));
- }
-+EXPORT_SYMBOL_GPL(can_nice);
-
- #ifdef __ARCH_WANT_SYS_NICE
-
---- a/mm/memory.c
-+++ b/mm/memory.c
-@@ -1064,6 +1064,7 @@ unsigned long zap_page_range(struct vm_a
- tlb_finish_mmu(tlb, address, end);
- return end;
- }
-+EXPORT_SYMBOL_GPL(zap_page_range);
-
- /**
- * zap_vma_ptes - remove ptes mapping the vma
-@@ -2490,6 +2491,7 @@ int vmtruncate_range(struct inode *inode
-
- return 0;
- }
-+EXPORT_SYMBOL_GPL(vmtruncate_range);
-
- /*
- * We enter with non-exclusive mmap_sem (to exclude vma changes,
---- a/mm/vmalloc.c
-+++ b/mm/vmalloc.c
-@@ -1101,6 +1101,7 @@ void unmap_kernel_range(unsigned long ad
- vunmap_page_range(addr, end);
- flush_tlb_kernel_range(addr, end);
- }
-+EXPORT_SYMBOL_GPL(unmap_kernel_range);
-
- int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages)
- {
-@@ -1214,6 +1215,7 @@ struct vm_struct *get_vm_area(unsigned l
- return __get_vm_area_node(size, flags, VMALLOC_START, VMALLOC_END,
- -1, GFP_KERNEL, __builtin_return_address(0));
- }
-+EXPORT_SYMBOL_GPL(get_vm_area);
-
- struct vm_struct *get_vm_area_caller(unsigned long size, unsigned long flags,
- void *caller)
---- a/include/linux/mm.h
-+++ b/include/linux/mm.h
-@@ -711,6 +711,7 @@ static inline int shmem_lock(struct file
- #endif
- struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags);
-
-+void shmem_set_file(struct vm_area_struct *vma, struct file *file);
- int shmem_zero_setup(struct vm_area_struct *);
-
- #ifndef CONFIG_MMU
---- a/kernel/signal.c
-+++ b/kernel/signal.c
-@@ -1062,6 +1062,7 @@ struct sighand_struct *lock_task_sighand
-
- return sighand;
- }
-+EXPORT_SYMBOL(lock_task_sighand);
-
- /*
- * send signal info to all the members of a group
+++ /dev/null
---- a/arch/cris/include/arch-v10/arch/Kbuild
-+++ b/arch/cris/include/arch-v10/arch/Kbuild
-@@ -1,3 +1,5 @@
-+header-y += elf.h
-+header-y += ptrace.h
- header-y += user.h
- header-y += svinto.h
- header-y += sv_addr_ag.h
---- a/arch/cris/include/asm/Kbuild
-+++ b/arch/cris/include/asm/Kbuild
-@@ -1,11 +1,14 @@
- include include/asm-generic/Kbuild.asm
-
--header-y += arch-v10/
--header-y += arch-v32/
-+header-y += ../arch-v10/arch/
-+header-y += ../arch-v32/arch/
-
-+header-y += elf.h
- header-y += ethernet.h
-+header-y += page.h
- header-y += rtc.h
- header-y += sync_serial.h
-+header-y += user.h
-
- unifdef-y += etraxgpio.h
- unifdef-y += rs485.h
+++ /dev/null
-Upstream doesn't optimize the kernel and bootwrappers for ppc44x because
-they still want to support gcc 3.3 -- well, we don't.
-
---- a/arch/powerpc/Makefile
-+++ b/arch/powerpc/Makefile
-@@ -123,7 +123,8 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
- KBUILD_CFLAGS += -mno-sched-epilog
- endif
-
--cpu-as-$(CONFIG_4xx) += -Wa,-m405
-+cpu-as-$(CONFIG_40x) += -Wa,-m405
-+cpu-as-$(CONFIG_44x) += -Wa,-m440
- cpu-as-$(CONFIG_6xx) += -Wa,-maltivec
- cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec
- cpu-as-$(CONFIG_E500) += -Wa,-me500
---- a/arch/powerpc/boot/Makefile
-+++ b/arch/powerpc/boot/Makefile
-@@ -38,9 +38,9 @@ BOOTCFLAGS += -I$(obj) -I$(srctree)/$(ob
- DTS_FLAGS ?= -p 1024
-
- $(obj)/4xx.o: BOOTCFLAGS += -mcpu=405
--$(obj)/ebony.o: BOOTCFLAGS += -mcpu=405
--$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=405
--$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=405
-+$(obj)/ebony.o: BOOTCFLAGS += -mcpu=440
-+$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=440
-+$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=440
- $(obj)/cuboot-acadia.o: BOOTCFLAGS += -mcpu=405
- $(obj)/treeboot-walnut.o: BOOTCFLAGS += -mcpu=405
- $(obj)/virtex405-head.o: BOOTAFLAGS += -mcpu=405
+++ /dev/null
---- a/scripts/Makefile.lib
-+++ b/scripts/Makefile.lib
-@@ -228,7 +228,7 @@ cmd_bzip2 = (cat $(filter-out FORCE,$^)
-
- quiet_cmd_lzma = LZMA $@
- cmd_lzma = (cat $(filter-out FORCE,$^) | \
-- lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
-+ lzma e -lc1 -lp2 -pb2 -eos -si -so && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
- (rm -f $@ ; false)
-
- quiet_cmd_lzo = LZO $@
---- a/scripts/gen_initramfs_list.sh
-+++ b/scripts/gen_initramfs_list.sh
-@@ -225,7 +225,7 @@ cpio_list=
- output="/dev/stdout"
- output_file=""
- is_cpio_compressed=
--compr="gzip -9 -f"
-+compr="gzip -9 -f -"
-
- arg="$1"
- case "$arg" in
-@@ -239,9 +239,9 @@ case "$arg" in
- output_file="$1"
- cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)"
- output=${cpio_list}
-- echo "$output_file" | grep -q "\.gz$" && compr="gzip -9 -f"
-- echo "$output_file" | grep -q "\.bz2$" && compr="bzip2 -9 -f"
-- echo "$output_file" | grep -q "\.lzma$" && compr="lzma -9 -f"
-+ echo "$output_file" | grep -q "\.gz$" && compr="gzip -9 -f -"
-+ echo "$output_file" | grep -q "\.bz2$" && compr="bzip2 -9 -f -"
-+ echo "$output_file" | grep -q "\.lzma$" && compr="lzma e -lc1 -lp2 -pb2 -eos -si -so"
- echo "$output_file" | grep -q "\.cpio$" && compr="cat"
- shift
- ;;
-@@ -292,7 +292,7 @@ if [ ! -z ${output_file} ]; then
- if [ "${is_cpio_compressed}" = "compressed" ]; then
- cat ${cpio_tfile} > ${output_file}
- else
-- (cat ${cpio_tfile} | ${compr} - > ${output_file}) \
-+ (cat ${cpio_tfile} | ${compr} > ${output_file}) \
- || (rm -f ${output_file} ; false)
- fi
- [ -z ${cpio_file} ] && rm ${cpio_tfile}
+++ /dev/null
---- a/init/main.c
-+++ b/init/main.c
-@@ -863,10 +863,7 @@ static noinline int init_post(void)
- printk(KERN_WARNING "Failed to execute %s. Attempting "
- "defaults...\n", execute_command);
- }
-- run_init_process("/sbin/init");
-- run_init_process("/etc/init");
-- run_init_process("/bin/init");
-- run_init_process("/bin/sh");
-+ run_init_process("/etc/preinit");
-
- panic("No init found. Try passing init= option to kernel.");
- }
+++ /dev/null
-From 6c4419d997d4431bb62e73475cd6b084e83efbd1 Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Tue, 22 Sep 2009 19:25:24 +0100
-Subject: [PATCH] Squashfs: move zlib decompression wrapper code into a separate file
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/Makefile | 2 +-
- fs/squashfs/block.c | 74 ++----------------------------
- fs/squashfs/squashfs.h | 4 ++
- fs/squashfs/zlib_wrapper.c | 109 ++++++++++++++++++++++++++++++++++++++++++++
- 4 files changed, 118 insertions(+), 71 deletions(-)
- create mode 100644 fs/squashfs/zlib_wrapper.c
-
---- a/fs/squashfs/Makefile
-+++ b/fs/squashfs/Makefile
-@@ -4,4 +4,4 @@
-
- obj-$(CONFIG_SQUASHFS) += squashfs.o
- squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
--squashfs-y += namei.o super.o symlink.o
-+squashfs-y += namei.o super.o symlink.o zlib_wrapper.o
---- a/fs/squashfs/block.c
-+++ b/fs/squashfs/block.c
-@@ -29,7 +29,6 @@
- #include <linux/fs.h>
- #include <linux/vfs.h>
- #include <linux/slab.h>
--#include <linux/mutex.h>
- #include <linux/string.h>
- #include <linux/buffer_head.h>
- #include <linux/zlib.h>
-@@ -153,72 +152,10 @@ int squashfs_read_data(struct super_bloc
- }
-
- if (compressed) {
-- int zlib_err = 0, zlib_init = 0;
--
-- /*
-- * Uncompress block.
-- */
--
-- mutex_lock(&msblk->read_data_mutex);
--
-- msblk->stream.avail_out = 0;
-- msblk->stream.avail_in = 0;
--
-- bytes = length;
-- do {
-- if (msblk->stream.avail_in == 0 && k < b) {
-- avail = min(bytes, msblk->devblksize - offset);
-- bytes -= avail;
-- wait_on_buffer(bh[k]);
-- if (!buffer_uptodate(bh[k]))
-- goto release_mutex;
--
-- if (avail == 0) {
-- offset = 0;
-- put_bh(bh[k++]);
-- continue;
-- }
--
-- msblk->stream.next_in = bh[k]->b_data + offset;
-- msblk->stream.avail_in = avail;
-- offset = 0;
-- }
--
-- if (msblk->stream.avail_out == 0 && page < pages) {
-- msblk->stream.next_out = buffer[page++];
-- msblk->stream.avail_out = PAGE_CACHE_SIZE;
-- }
--
-- if (!zlib_init) {
-- zlib_err = zlib_inflateInit(&msblk->stream);
-- if (zlib_err != Z_OK) {
-- ERROR("zlib_inflateInit returned"
-- " unexpected result 0x%x,"
-- " srclength %d\n", zlib_err,
-- srclength);
-- goto release_mutex;
-- }
-- zlib_init = 1;
-- }
--
-- zlib_err = zlib_inflate(&msblk->stream, Z_SYNC_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");
-- goto release_mutex;
-- }
--
-- zlib_err = zlib_inflateEnd(&msblk->stream);
-- if (zlib_err != Z_OK) {
-- ERROR("zlib_inflate error, data probably corrupt\n");
-- goto release_mutex;
-- }
-- length = msblk->stream.total_out;
-- mutex_unlock(&msblk->read_data_mutex);
-+ length = zlib_uncompress(msblk, buffer, bh, b, offset, length,
-+ srclength, pages);
-+ if (length < 0)
-+ goto read_failure;
- } else {
- /*
- * Block is uncompressed.
-@@ -255,9 +192,6 @@ int squashfs_read_data(struct super_bloc
- kfree(bh);
- return length;
-
--release_mutex:
-- mutex_unlock(&msblk->read_data_mutex);
--
- block_release:
- for (; k < b; k++)
- put_bh(bh[k]);
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -70,6 +70,10 @@ extern struct inode *squashfs_iget(struc
- unsigned int);
- extern int squashfs_read_inode(struct inode *, long long);
-
-+/* zlib_wrapper.c */
-+extern int zlib_uncompress(struct squashfs_sb_info *, void **,
-+ struct buffer_head **, int, int, int, int, int);
-+
- /*
- * Inodes and files operations
- */
---- /dev/null
-+++ b/fs/squashfs/zlib_wrapper.c
-@@ -0,0 +1,109 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-+ * Phillip Lougher <phillip@lougher.demon.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,
-+ * 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+ *
-+ * zlib_wrapper.c
-+ */
-+
-+
-+#include <linux/mutex.h>
-+#include <linux/buffer_head.h>
-+#include <linux/zlib.h>
-+
-+#include "squashfs_fs.h"
-+#include "squashfs_fs_sb.h"
-+#include "squashfs_fs_i.h"
-+#include "squashfs.h"
-+
-+int zlib_uncompress(struct squashfs_sb_info *msblk, void **buffer,
-+ struct buffer_head **bh, int b, int offset, int length, int srclength,
-+ int pages)
-+{
-+ int zlib_err = 0, zlib_init = 0;
-+ int avail, bytes, k = 0, page = 0;
-+
-+ mutex_lock(&msblk->read_data_mutex);
-+
-+ msblk->stream.avail_out = 0;
-+ msblk->stream.avail_in = 0;
-+
-+ bytes = length;
-+ do {
-+ if (msblk->stream.avail_in == 0 && k < b) {
-+ avail = min(bytes, msblk->devblksize - offset);
-+ bytes -= avail;
-+ wait_on_buffer(bh[k]);
-+ if (!buffer_uptodate(bh[k]))
-+ goto release_mutex;
-+
-+ if (avail == 0) {
-+ offset = 0;
-+ put_bh(bh[k++]);
-+ continue;
-+ }
-+
-+ msblk->stream.next_in = bh[k]->b_data + offset;
-+ msblk->stream.avail_in = avail;
-+ offset = 0;
-+ }
-+
-+ if (msblk->stream.avail_out == 0 && page < pages) {
-+ msblk->stream.next_out = buffer[page++];
-+ msblk->stream.avail_out = PAGE_CACHE_SIZE;
-+ }
-+
-+ if (!zlib_init) {
-+ zlib_err = zlib_inflateInit(&msblk->stream);
-+ if (zlib_err != Z_OK) {
-+ ERROR("zlib_inflateInit returned unexpected "
-+ "result 0x%x, srclength %d\n",
-+ zlib_err, srclength);
-+ goto release_mutex;
-+ }
-+ zlib_init = 1;
-+ }
-+
-+ zlib_err = zlib_inflate(&msblk->stream, Z_SYNC_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");
-+ goto release_mutex;
-+ }
-+
-+ zlib_err = zlib_inflateEnd(&msblk->stream);
-+ if (zlib_err != Z_OK) {
-+ ERROR("zlib_inflate error, data probably corrupt\n");
-+ goto release_mutex;
-+ }
-+
-+ mutex_unlock(&msblk->read_data_mutex);
-+ return msblk->stream.total_out;
-+
-+release_mutex:
-+ mutex_unlock(&msblk->read_data_mutex);
-+
-+ for (; k < b; k++)
-+ put_bh(bh[k]);
-+
-+ return -EIO;
-+}
+++ /dev/null
-From 37c44e85fd49676ec15ccaeea065662c1fbcda7d Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Wed, 23 Sep 2009 19:04:49 +0100
-Subject: [PATCH] Squashfs: Factor out remaining zlib dependencies into separate wrapper file
-
-Move zlib buffer init/destroy code into separate wrapper file. Also
-make zlib z_stream field a void * removing the need to include zlib.h
-for most files.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/block.c | 1 -
- fs/squashfs/cache.c | 1 -
- fs/squashfs/dir.c | 1 -
- fs/squashfs/export.c | 1 -
- fs/squashfs/file.c | 1 -
- fs/squashfs/fragment.c | 1 -
- fs/squashfs/id.c | 1 -
- fs/squashfs/inode.c | 1 -
- fs/squashfs/namei.c | 1 -
- fs/squashfs/squashfs.h | 2 +
- fs/squashfs/squashfs_fs_sb.h | 2 +-
- fs/squashfs/super.c | 14 +++------
- fs/squashfs/symlink.c | 1 -
- fs/squashfs/zlib_wrapper.c | 56 ++++++++++++++++++++++++++++++++---------
- 14 files changed, 51 insertions(+), 33 deletions(-)
-
---- a/fs/squashfs/block.c
-+++ b/fs/squashfs/block.c
-@@ -31,7 +31,6 @@
- #include <linux/slab.h>
- #include <linux/string.h>
- #include <linux/buffer_head.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/cache.c
-+++ b/fs/squashfs/cache.c
-@@ -51,7 +51,6 @@
- #include <linux/sched.h>
- #include <linux/spinlock.h>
- #include <linux/wait.h>
--#include <linux/zlib.h>
- #include <linux/pagemap.h>
-
- #include "squashfs_fs.h"
---- a/fs/squashfs/dir.c
-+++ b/fs/squashfs/dir.c
-@@ -30,7 +30,6 @@
- #include <linux/fs.h>
- #include <linux/vfs.h>
- #include <linux/slab.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/export.c
-+++ b/fs/squashfs/export.c
-@@ -39,7 +39,6 @@
- #include <linux/vfs.h>
- #include <linux/dcache.h>
- #include <linux/exportfs.h>
--#include <linux/zlib.h>
- #include <linux/slab.h>
-
- #include "squashfs_fs.h"
---- a/fs/squashfs/file.c
-+++ b/fs/squashfs/file.c
-@@ -47,7 +47,6 @@
- #include <linux/string.h>
- #include <linux/pagemap.h>
- #include <linux/mutex.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/fragment.c
-+++ b/fs/squashfs/fragment.c
-@@ -36,7 +36,6 @@
- #include <linux/fs.h>
- #include <linux/vfs.h>
- #include <linux/slab.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/id.c
-+++ b/fs/squashfs/id.c
-@@ -34,7 +34,6 @@
- #include <linux/fs.h>
- #include <linux/vfs.h>
- #include <linux/slab.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/inode.c
-+++ b/fs/squashfs/inode.c
-@@ -40,7 +40,6 @@
-
- #include <linux/fs.h>
- #include <linux/vfs.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/namei.c
-+++ b/fs/squashfs/namei.c
-@@ -57,7 +57,6 @@
- #include <linux/slab.h>
- #include <linux/string.h>
- #include <linux/dcache.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -71,6 +71,8 @@ extern struct inode *squashfs_iget(struc
- extern int squashfs_read_inode(struct inode *, long long);
-
- /* zlib_wrapper.c */
-+extern void *zlib_init(void);
-+extern void zlib_free(void *);
- extern int zlib_uncompress(struct squashfs_sb_info *, void **,
- struct buffer_head **, int, int, int, int, int);
-
---- a/fs/squashfs/squashfs_fs_sb.h
-+++ b/fs/squashfs/squashfs_fs_sb.h
-@@ -64,7 +64,7 @@ struct squashfs_sb_info {
- struct mutex read_data_mutex;
- struct mutex meta_index_mutex;
- struct meta_index *meta_index;
-- z_stream stream;
-+ void *stream;
- __le64 *inode_lookup_table;
- u64 inode_table;
- u64 directory_table;
---- a/fs/squashfs/super.c
-+++ b/fs/squashfs/super.c
-@@ -35,7 +35,6 @@
- #include <linux/pagemap.h>
- #include <linux/init.h>
- #include <linux/module.h>
--#include <linux/zlib.h>
- #include <linux/magic.h>
-
- #include "squashfs_fs.h"
-@@ -87,12 +86,9 @@ static int squashfs_fill_super(struct su
- }
- msblk = sb->s_fs_info;
-
-- msblk->stream.workspace = kmalloc(zlib_inflate_workspacesize(),
-- GFP_KERNEL);
-- if (msblk->stream.workspace == NULL) {
-- ERROR("Failed to allocate zlib workspace\n");
-+ msblk->stream = zlib_init();
-+ if (msblk->stream == NULL)
- goto failure;
-- }
-
- sblk = kzalloc(sizeof(*sblk), GFP_KERNEL);
- if (sblk == NULL) {
-@@ -292,17 +288,17 @@ failed_mount:
- squashfs_cache_delete(msblk->block_cache);
- squashfs_cache_delete(msblk->fragment_cache);
- squashfs_cache_delete(msblk->read_page);
-+ zlib_free(msblk->stream);
- kfree(msblk->inode_lookup_table);
- kfree(msblk->fragment_index);
- kfree(msblk->id_table);
-- kfree(msblk->stream.workspace);
- kfree(sb->s_fs_info);
- sb->s_fs_info = NULL;
- kfree(sblk);
- return err;
-
- failure:
-- kfree(msblk->stream.workspace);
-+ zlib_free(msblk->stream);
- kfree(sb->s_fs_info);
- sb->s_fs_info = NULL;
- return -ENOMEM;
-@@ -346,10 +342,10 @@ static void squashfs_put_super(struct su
- squashfs_cache_delete(sbi->block_cache);
- squashfs_cache_delete(sbi->fragment_cache);
- squashfs_cache_delete(sbi->read_page);
-+ zlib_free(sbi->stream);
- kfree(sbi->id_table);
- kfree(sbi->fragment_index);
- kfree(sbi->meta_index);
-- kfree(sbi->stream.workspace);
- kfree(sb->s_fs_info);
- sb->s_fs_info = NULL;
- }
---- a/fs/squashfs/symlink.c
-+++ b/fs/squashfs/symlink.c
-@@ -36,7 +36,6 @@
- #include <linux/slab.h>
- #include <linux/string.h>
- #include <linux/pagemap.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
---- a/fs/squashfs/zlib_wrapper.c
-+++ b/fs/squashfs/zlib_wrapper.c
-@@ -31,21 +31,51 @@
- #include "squashfs_fs_i.h"
- #include "squashfs.h"
-
-+void *zlib_init()
-+{
-+ z_stream *stream = kmalloc(sizeof(z_stream), GFP_KERNEL);
-+ if (stream == NULL)
-+ goto failed;
-+ stream->workspace = kmalloc(zlib_inflate_workspacesize(),
-+ GFP_KERNEL);
-+ if (stream->workspace == NULL)
-+ goto failed;
-+
-+ return stream;
-+
-+failed:
-+ ERROR("Failed to allocate zlib workspace\n");
-+ kfree(stream);
-+ return NULL;
-+}
-+
-+
-+void zlib_free(void *strm)
-+{
-+ z_stream *stream = strm;
-+
-+ if (stream)
-+ kfree(stream->workspace);
-+ kfree(stream);
-+}
-+
-+
- int zlib_uncompress(struct squashfs_sb_info *msblk, void **buffer,
- struct buffer_head **bh, int b, int offset, int length, int srclength,
- int pages)
- {
- int zlib_err = 0, zlib_init = 0;
- int avail, bytes, k = 0, page = 0;
-+ z_stream *stream = msblk->stream;
-
- mutex_lock(&msblk->read_data_mutex);
-
-- msblk->stream.avail_out = 0;
-- msblk->stream.avail_in = 0;
-+ stream->avail_out = 0;
-+ stream->avail_in = 0;
-
- bytes = length;
- do {
-- if (msblk->stream.avail_in == 0 && k < b) {
-+ if (stream->avail_in == 0 && k < b) {
- avail = min(bytes, msblk->devblksize - offset);
- bytes -= avail;
- wait_on_buffer(bh[k]);
-@@ -58,18 +88,18 @@ int zlib_uncompress(struct squashfs_sb_i
- continue;
- }
-
-- msblk->stream.next_in = bh[k]->b_data + offset;
-- msblk->stream.avail_in = avail;
-+ stream->next_in = bh[k]->b_data + offset;
-+ stream->avail_in = avail;
- offset = 0;
- }
-
-- if (msblk->stream.avail_out == 0 && page < pages) {
-- msblk->stream.next_out = buffer[page++];
-- msblk->stream.avail_out = PAGE_CACHE_SIZE;
-+ if (stream->avail_out == 0 && page < pages) {
-+ stream->next_out = buffer[page++];
-+ stream->avail_out = PAGE_CACHE_SIZE;
- }
-
- if (!zlib_init) {
-- zlib_err = zlib_inflateInit(&msblk->stream);
-+ zlib_err = zlib_inflateInit(stream);
- if (zlib_err != Z_OK) {
- ERROR("zlib_inflateInit returned unexpected "
- "result 0x%x, srclength %d\n",
-@@ -79,9 +109,9 @@ int zlib_uncompress(struct squashfs_sb_i
- zlib_init = 1;
- }
-
-- zlib_err = zlib_inflate(&msblk->stream, Z_SYNC_FLUSH);
-+ zlib_err = zlib_inflate(stream, Z_SYNC_FLUSH);
-
-- if (msblk->stream.avail_in == 0 && k < b)
-+ if (stream->avail_in == 0 && k < b)
- put_bh(bh[k++]);
- } while (zlib_err == Z_OK);
-
-@@ -90,14 +120,14 @@ int zlib_uncompress(struct squashfs_sb_i
- goto release_mutex;
- }
-
-- zlib_err = zlib_inflateEnd(&msblk->stream);
-+ zlib_err = zlib_inflateEnd(stream);
- if (zlib_err != Z_OK) {
- ERROR("zlib_inflate error, data probably corrupt\n");
- goto release_mutex;
- }
-
- mutex_unlock(&msblk->read_data_mutex);
-- return msblk->stream.total_out;
-+ return stream->total_out;
-
- release_mutex:
- mutex_unlock(&msblk->read_data_mutex);
+++ /dev/null
-From 327fbf47a419befc6bff74f3ca42d2b6f0841903 Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Tue, 6 Oct 2009 04:04:15 +0100
-Subject: [PATCH] Squashfs: add a decompressor framework
-
-This adds a decompressor framework which allows multiple compression
-algorithms to be cleanly supported.
-
-Also update zlib wrapper and other code to use the new framework.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/Makefile | 2 +-
- fs/squashfs/block.c | 6 ++--
- fs/squashfs/decompressor.c | 58 ++++++++++++++++++++++++++++++++++++++++++
- fs/squashfs/decompressor.h | 55 +++++++++++++++++++++++++++++++++++++++
- fs/squashfs/squashfs.h | 14 +++++-----
- fs/squashfs/squashfs_fs_sb.h | 41 +++++++++++++++--------------
- fs/squashfs/super.c | 45 ++++++++++++++++++-------------
- fs/squashfs/zlib_wrapper.c | 17 ++++++++++--
- 8 files changed, 185 insertions(+), 53 deletions(-)
- create mode 100644 fs/squashfs/decompressor.c
- create mode 100644 fs/squashfs/decompressor.h
-
---- a/fs/squashfs/Makefile
-+++ b/fs/squashfs/Makefile
-@@ -4,4 +4,4 @@
-
- obj-$(CONFIG_SQUASHFS) += squashfs.o
- squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
--squashfs-y += namei.o super.o symlink.o zlib_wrapper.o
-+squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o
---- a/fs/squashfs/block.c
-+++ b/fs/squashfs/block.c
-@@ -36,7 +36,7 @@
- #include "squashfs_fs_sb.h"
- #include "squashfs_fs_i.h"
- #include "squashfs.h"
--
-+#include "decompressor.h"
- /*
- * Read the metadata block length, this is stored in the first two
- * bytes of the metadata block.
-@@ -151,8 +151,8 @@ int squashfs_read_data(struct super_bloc
- }
-
- if (compressed) {
-- length = zlib_uncompress(msblk, buffer, bh, b, offset, length,
-- srclength, pages);
-+ length = squashfs_decompress(msblk, buffer, bh, b, offset,
-+ length, srclength, pages);
- if (length < 0)
- goto read_failure;
- } else {
---- /dev/null
-+++ b/fs/squashfs/decompressor.c
-@@ -0,0 +1,58 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-+ * Phillip Lougher <phillip@lougher.demon.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,
-+ * 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+ *
-+ * decompressor.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/mutex.h>
-+#include <linux/buffer_head.h>
-+
-+#include "squashfs_fs.h"
-+#include "squashfs_fs_sb.h"
-+#include "squashfs_fs_i.h"
-+#include "decompressor.h"
-+#include "squashfs.h"
-+
-+/*
-+ * This file (and decompressor.h) implements a decompressor framework for
-+ * Squashfs, allowing multiple decompressors to be easily supported
-+ */
-+
-+static const struct squashfs_decompressor squashfs_unknown_comp_ops = {
-+ NULL, NULL, NULL, 0, "unknown", 0
-+};
-+
-+static const struct squashfs_decompressor *decompressor[] = {
-+ &squashfs_zlib_comp_ops,
-+ &squashfs_unknown_comp_ops
-+};
-+
-+
-+const struct squashfs_decompressor *squashfs_lookup_decompressor(int id)
-+{
-+ int i;
-+
-+ for (i = 0; decompressor[i]->id; i++)
-+ if (id == decompressor[i]->id)
-+ break;
-+
-+ return decompressor[i];
-+}
---- /dev/null
-+++ b/fs/squashfs/decompressor.h
-@@ -0,0 +1,55 @@
-+#ifndef DECOMPRESSOR_H
-+#define DECOMPRESSOR_H
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-+ * Phillip Lougher <phillip@lougher.demon.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,
-+ * 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+ *
-+ * decompressor.h
-+ */
-+
-+struct squashfs_decompressor {
-+ void *(*init)(void);
-+ void (*free)(void *);
-+ int (*decompress)(struct squashfs_sb_info *, void **,
-+ struct buffer_head **, int, int, int, int, int);
-+ int id;
-+ char *name;
-+ int supported;
-+};
-+
-+static inline void *squashfs_decompressor_init(struct squashfs_sb_info *msblk)
-+{
-+ return msblk->decompressor->init();
-+}
-+
-+static inline void squashfs_decompressor_free(struct squashfs_sb_info *msblk,
-+ void *s)
-+{
-+ if (msblk->decompressor)
-+ msblk->decompressor->free(s);
-+}
-+
-+static inline int squashfs_decompress(struct squashfs_sb_info *msblk,
-+ void **buffer, struct buffer_head **bh, int b, int offset, int length,
-+ int srclength, int pages)
-+{
-+ return msblk->decompressor->decompress(msblk, buffer, bh, b, offset,
-+ length, srclength, pages);
-+}
-+#endif
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -51,6 +51,9 @@ extern struct squashfs_cache_entry *squa
- u64, int);
- extern int squashfs_read_table(struct super_block *, void *, u64, int);
-
-+/* decompressor.c */
-+extern const struct squashfs_decompressor *squashfs_lookup_decompressor(int);
-+
- /* export.c */
- extern __le64 *squashfs_read_inode_lookup_table(struct super_block *, u64,
- unsigned int);
-@@ -70,14 +73,8 @@ extern struct inode *squashfs_iget(struc
- unsigned int);
- extern int squashfs_read_inode(struct inode *, long long);
-
--/* zlib_wrapper.c */
--extern void *zlib_init(void);
--extern void zlib_free(void *);
--extern int zlib_uncompress(struct squashfs_sb_info *, void **,
-- struct buffer_head **, int, int, int, int, int);
--
- /*
-- * Inodes and files operations
-+ * Inodes, files and decompressor operations
- */
-
- /* dir.c */
-@@ -94,3 +91,6 @@ extern const struct inode_operations squ
-
- /* symlink.c */
- extern const struct address_space_operations squashfs_symlink_aops;
-+
-+/* zlib_wrapper.c */
-+extern const struct squashfs_decompressor squashfs_zlib_comp_ops;
---- a/fs/squashfs/squashfs_fs_sb.h
-+++ b/fs/squashfs/squashfs_fs_sb.h
-@@ -52,25 +52,26 @@ struct squashfs_cache_entry {
- };
-
- struct squashfs_sb_info {
-- int devblksize;
-- int devblksize_log2;
-- struct squashfs_cache *block_cache;
-- struct squashfs_cache *fragment_cache;
-- struct squashfs_cache *read_page;
-- int next_meta_index;
-- __le64 *id_table;
-- __le64 *fragment_index;
-- unsigned int *fragment_index_2;
-- struct mutex read_data_mutex;
-- struct mutex meta_index_mutex;
-- struct meta_index *meta_index;
-- void *stream;
-- __le64 *inode_lookup_table;
-- u64 inode_table;
-- u64 directory_table;
-- unsigned int block_size;
-- unsigned short block_log;
-- long long bytes_used;
-- unsigned int inodes;
-+ const struct squashfs_decompressor *decompressor;
-+ int devblksize;
-+ int devblksize_log2;
-+ struct squashfs_cache *block_cache;
-+ struct squashfs_cache *fragment_cache;
-+ struct squashfs_cache *read_page;
-+ int next_meta_index;
-+ __le64 *id_table;
-+ __le64 *fragment_index;
-+ unsigned int *fragment_index_2;
-+ struct mutex read_data_mutex;
-+ struct mutex meta_index_mutex;
-+ struct meta_index *meta_index;
-+ void *stream;
-+ __le64 *inode_lookup_table;
-+ u64 inode_table;
-+ u64 directory_table;
-+ unsigned int block_size;
-+ unsigned short block_log;
-+ long long bytes_used;
-+ unsigned int inodes;
- };
- #endif
---- a/fs/squashfs/super.c
-+++ b/fs/squashfs/super.c
-@@ -41,27 +41,35 @@
- #include "squashfs_fs_sb.h"
- #include "squashfs_fs_i.h"
- #include "squashfs.h"
-+#include "decompressor.h"
-
- static struct file_system_type squashfs_fs_type;
- static const struct super_operations squashfs_super_ops;
-
--static int supported_squashfs_filesystem(short major, short minor, short comp)
-+static const struct squashfs_decompressor *supported_squashfs_filesystem(short
-+ major, short minor, short id)
- {
-+ const struct squashfs_decompressor *decompressor;
-+
- if (major < SQUASHFS_MAJOR) {
- ERROR("Major/Minor mismatch, older Squashfs %d.%d "
- "filesystems are unsupported\n", major, minor);
-- return -EINVAL;
-+ return NULL;
- } else if (major > SQUASHFS_MAJOR || minor > SQUASHFS_MINOR) {
- ERROR("Major/Minor mismatch, trying to mount newer "
- "%d.%d filesystem\n", major, minor);
- ERROR("Please update your kernel\n");
-- return -EINVAL;
-+ return NULL;
- }
-
-- if (comp != ZLIB_COMPRESSION)
-- return -EINVAL;
-+ decompressor = squashfs_lookup_decompressor(id);
-+ if (!decompressor->supported) {
-+ ERROR("Filesystem uses \"%s\" compression. This is not "
-+ "supported\n", decompressor->name);
-+ return NULL;
-+ }
-
-- return 0;
-+ return decompressor;
- }
-
-
-@@ -86,10 +94,6 @@ static int squashfs_fill_super(struct su
- }
- msblk = sb->s_fs_info;
-
-- msblk->stream = zlib_init();
-- if (msblk->stream == NULL)
-- goto failure;
--
- sblk = kzalloc(sizeof(*sblk), GFP_KERNEL);
- if (sblk == NULL) {
- ERROR("Failed to allocate squashfs_super_block\n");
-@@ -116,25 +120,25 @@ static int squashfs_fill_super(struct su
- goto failed_mount;
- }
-
-+ err = -EINVAL;
-+
- /* Check it is a SQUASHFS superblock */
- sb->s_magic = le32_to_cpu(sblk->s_magic);
- if (sb->s_magic != SQUASHFS_MAGIC) {
- if (!silent)
- ERROR("Can't find a SQUASHFS superblock on %s\n",
- bdevname(sb->s_bdev, b));
-- err = -EINVAL;
- goto failed_mount;
- }
-
-- /* Check the MAJOR & MINOR versions and compression type */
-- err = supported_squashfs_filesystem(le16_to_cpu(sblk->s_major),
-+ /* Check the MAJOR & MINOR versions and lookup compression type */
-+ msblk->decompressor = supported_squashfs_filesystem(
-+ le16_to_cpu(sblk->s_major),
- le16_to_cpu(sblk->s_minor),
- le16_to_cpu(sblk->compression));
-- if (err < 0)
-+ if (msblk->decompressor == NULL)
- goto failed_mount;
-
-- err = -EINVAL;
--
- /*
- * Check if there's xattrs in the filesystem. These are not
- * supported in this version, so warn that they will be ignored.
-@@ -201,6 +205,10 @@ static int squashfs_fill_super(struct su
-
- err = -ENOMEM;
-
-+ msblk->stream = squashfs_decompressor_init(msblk);
-+ if (msblk->stream == NULL)
-+ goto failed_mount;
-+
- msblk->block_cache = squashfs_cache_init("metadata",
- SQUASHFS_CACHED_BLKS, SQUASHFS_METADATA_SIZE);
- if (msblk->block_cache == NULL)
-@@ -288,7 +296,7 @@ failed_mount:
- squashfs_cache_delete(msblk->block_cache);
- squashfs_cache_delete(msblk->fragment_cache);
- squashfs_cache_delete(msblk->read_page);
-- zlib_free(msblk->stream);
-+ squashfs_decompressor_free(msblk, msblk->stream);
- kfree(msblk->inode_lookup_table);
- kfree(msblk->fragment_index);
- kfree(msblk->id_table);
-@@ -298,7 +306,6 @@ failed_mount:
- return err;
-
- failure:
-- zlib_free(msblk->stream);
- kfree(sb->s_fs_info);
- sb->s_fs_info = NULL;
- return -ENOMEM;
-@@ -342,7 +349,7 @@ static void squashfs_put_super(struct su
- squashfs_cache_delete(sbi->block_cache);
- squashfs_cache_delete(sbi->fragment_cache);
- squashfs_cache_delete(sbi->read_page);
-- zlib_free(sbi->stream);
-+ squashfs_decompressor_free(sbi, sbi->stream);
- kfree(sbi->id_table);
- kfree(sbi->fragment_index);
- kfree(sbi->meta_index);
---- a/fs/squashfs/zlib_wrapper.c
-+++ b/fs/squashfs/zlib_wrapper.c
-@@ -30,8 +30,9 @@
- #include "squashfs_fs_sb.h"
- #include "squashfs_fs_i.h"
- #include "squashfs.h"
-+#include "decompressor.h"
-
--void *zlib_init()
-+static void *zlib_init(void)
- {
- z_stream *stream = kmalloc(sizeof(z_stream), GFP_KERNEL);
- if (stream == NULL)
-@@ -50,7 +51,7 @@ failed:
- }
-
-
--void zlib_free(void *strm)
-+static void zlib_free(void *strm)
- {
- z_stream *stream = strm;
-
-@@ -60,7 +61,7 @@ void zlib_free(void *strm)
- }
-
-
--int zlib_uncompress(struct squashfs_sb_info *msblk, void **buffer,
-+static int zlib_uncompress(struct squashfs_sb_info *msblk, void **buffer,
- struct buffer_head **bh, int b, int offset, int length, int srclength,
- int pages)
- {
-@@ -137,3 +138,13 @@ release_mutex:
-
- return -EIO;
- }
-+
-+const struct squashfs_decompressor squashfs_zlib_comp_ops = {
-+ .init = zlib_init,
-+ .free = zlib_free,
-+ .decompress = zlib_uncompress,
-+ .id = ZLIB_COMPRESSION,
-+ .name = "zlib",
-+ .supported = 1
-+};
-+
+++ /dev/null
-From 1885ca0a1973944684f252094a703b7c80dfc974 Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Wed, 14 Oct 2009 03:58:11 +0100
-Subject: [PATCH] Squashfs: add decompressor entries for lzma and lzo
-
-Add knowledge of lzma/lzo compression formats to the decompressor
-framework. For now these are added as unsupported. Without
-these entries lzma/lzo compressed filesystems will be flagged as
-having unknown compression which is undesirable.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/decompressor.c | 10 ++++++++++
- fs/squashfs/squashfs_fs.h | 4 +++-
- 2 files changed, 13 insertions(+), 1 deletions(-)
-
---- a/fs/squashfs/decompressor.c
-+++ b/fs/squashfs/decompressor.c
-@@ -36,12 +36,22 @@
- * Squashfs, allowing multiple decompressors to be easily supported
- */
-
-+static const struct squashfs_decompressor squashfs_lzma_unsupported_comp_ops = {
-+ NULL, NULL, NULL, LZMA_COMPRESSION, "lzma", 0
-+};
-+
-+static const struct squashfs_decompressor squashfs_lzo_unsupported_comp_ops = {
-+ NULL, NULL, NULL, LZO_COMPRESSION, "lzo", 0
-+};
-+
- static const struct squashfs_decompressor squashfs_unknown_comp_ops = {
- NULL, NULL, NULL, 0, "unknown", 0
- };
-
- static const struct squashfs_decompressor *decompressor[] = {
- &squashfs_zlib_comp_ops,
-+ &squashfs_lzma_unsupported_comp_ops,
-+ &squashfs_lzo_unsupported_comp_ops,
- &squashfs_unknown_comp_ops
- };
-
---- a/fs/squashfs/squashfs_fs.h
-+++ b/fs/squashfs/squashfs_fs.h
-@@ -211,7 +211,9 @@ struct meta_index {
- /*
- * definitions for structures on disk
- */
--#define ZLIB_COMPRESSION 1
-+#define ZLIB_COMPRESSION 1
-+#define LZMA_COMPRESSION 2
-+#define LZO_COMPRESSION 3
-
- struct squashfs_super_block {
- __le32 s_magic;
+++ /dev/null
-From 5f393ede3ddb5dd4cc2a9f243182fac45f1ce10b Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Wed, 14 Oct 2009 04:07:54 +0100
-Subject: [PATCH] Squashfs: add an extra parameter to the decompressor init function
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/decompressor.h | 4 ++--
- fs/squashfs/zlib_wrapper.c | 2 +-
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
---- a/fs/squashfs/decompressor.h
-+++ b/fs/squashfs/decompressor.h
-@@ -24,7 +24,7 @@
- */
-
- struct squashfs_decompressor {
-- void *(*init)(void);
-+ void *(*init)(struct squashfs_sb_info *);
- void (*free)(void *);
- int (*decompress)(struct squashfs_sb_info *, void **,
- struct buffer_head **, int, int, int, int, int);
-@@ -35,7 +35,7 @@ struct squashfs_decompressor {
-
- static inline void *squashfs_decompressor_init(struct squashfs_sb_info *msblk)
- {
-- return msblk->decompressor->init();
-+ return msblk->decompressor->init(msblk);
- }
-
- static inline void squashfs_decompressor_free(struct squashfs_sb_info *msblk,
---- a/fs/squashfs/zlib_wrapper.c
-+++ b/fs/squashfs/zlib_wrapper.c
-@@ -32,7 +32,7 @@
- #include "squashfs.h"
- #include "decompressor.h"
-
--static void *zlib_init(void)
-+static void *zlib_init(struct squashfs_sb_info *dummy)
- {
- z_stream *stream = kmalloc(sizeof(z_stream), GFP_KERNEL);
- if (stream == NULL)
+++ /dev/null
-From f49e1efdd179d54e814ff2a8e8f469496583062c Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Tue, 20 Oct 2009 10:54:36 +0100
-Subject: [PATCH] Squashfs: add LZMA compression
-
-Add support for LZMA compressed filesystems. This is an initial
-implementation.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/Kconfig | 5 ++
- fs/squashfs/Makefile | 1 +
- fs/squashfs/decompressor.c | 4 +
- fs/squashfs/lzma_wrapper.c | 151 ++++++++++++++++++++++++++++++++++++++++++++
- fs/squashfs/squashfs.h | 3 +
- 5 files changed, 164 insertions(+), 0 deletions(-)
- create mode 100644 fs/squashfs/lzma_wrapper.c
-
---- a/fs/squashfs/Kconfig
-+++ b/fs/squashfs/Kconfig
-@@ -26,6 +26,11 @@ config SQUASHFS
-
- If unsure, say N.
-
-+config SQUASHFS_LZMA
-+ bool "Include support for LZMA compressed file systems"
-+ depends on SQUASHFS
-+ select DECOMPRESS_LZMA
-+
- config SQUASHFS_EMBEDDED
-
- bool "Additional option for memory-constrained systems"
---- a/fs/squashfs/Makefile
-+++ b/fs/squashfs/Makefile
-@@ -5,3 +5,4 @@
- obj-$(CONFIG_SQUASHFS) += squashfs.o
- squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
- squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o
-+squashfs-$(CONFIG_SQUASHFS_LZMA) += lzma_wrapper.o
---- a/fs/squashfs/decompressor.c
-+++ b/fs/squashfs/decompressor.c
-@@ -50,7 +50,11 @@ static const struct squashfs_decompresso
-
- static const struct squashfs_decompressor *decompressor[] = {
- &squashfs_zlib_comp_ops,
-+#ifdef CONFIG_SQUASHFS_LZMA
-+ &squashfs_lzma_comp_ops,
-+#else
- &squashfs_lzma_unsupported_comp_ops,
-+#endif
- &squashfs_lzo_unsupported_comp_ops,
- &squashfs_unknown_comp_ops
- };
---- /dev/null
-+++ b/fs/squashfs/lzma_wrapper.c
-@@ -0,0 +1,151 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-+ * Phillip Lougher <phillip@lougher.demon.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,
-+ * 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+ *
-+ * lzma_wrapper.c
-+ */
-+
-+#include <asm/unaligned.h>
-+#include <linux/buffer_head.h>
-+#include <linux/mutex.h>
-+#include <linux/vmalloc.h>
-+#include <linux/decompress/unlzma.h>
-+
-+#include "squashfs_fs.h"
-+#include "squashfs_fs_sb.h"
-+#include "squashfs_fs_i.h"
-+#include "squashfs.h"
-+#include "decompressor.h"
-+
-+struct squashfs_lzma {
-+ void *input;
-+ void *output;
-+};
-+
-+/* decompress_unlzma.c is currently non re-entrant... */
-+DEFINE_MUTEX(lzma_mutex);
-+
-+/* decompress_unlzma.c doesn't provide any context in its callbacks... */
-+static int lzma_error;
-+
-+static void error(char *m)
-+{
-+ ERROR("unlzma error: %s\n", m);
-+ lzma_error = 1;
-+}
-+
-+
-+static void *lzma_init(struct squashfs_sb_info *msblk)
-+{
-+ struct squashfs_lzma *stream = kzalloc(sizeof(*stream), GFP_KERNEL);
-+ if (stream == NULL)
-+ goto failed;
-+ stream->input = vmalloc(msblk->block_size);
-+ if (stream->input == NULL)
-+ goto failed;
-+ stream->output = vmalloc(msblk->block_size);
-+ if (stream->output == NULL)
-+ goto failed2;
-+
-+ return stream;
-+
-+failed2:
-+ vfree(stream->input);
-+failed:
-+ ERROR("failed to allocate lzma workspace\n");
-+ kfree(stream);
-+ return NULL;
-+}
-+
-+
-+static void lzma_free(void *strm)
-+{
-+ struct squashfs_lzma *stream = strm;
-+
-+ if (stream) {
-+ vfree(stream->input);
-+ vfree(stream->output);
-+ }
-+ kfree(stream);
-+}
-+
-+
-+static int lzma_uncompress(struct squashfs_sb_info *msblk, void **buffer,
-+ struct buffer_head **bh, int b, int offset, int length, int srclength,
-+ int pages)
-+{
-+ struct squashfs_lzma *stream = msblk->stream;
-+ void *buff = stream->input;
-+ int avail, i, bytes = length, res;
-+
-+ mutex_lock(&lzma_mutex);
-+
-+ for (i = 0; i < b; i++) {
-+ wait_on_buffer(bh[i]);
-+ if (!buffer_uptodate(bh[i]))
-+ goto block_release;
-+
-+ avail = min(bytes, msblk->devblksize - offset);
-+ memcpy(buff, bh[i]->b_data + offset, avail);
-+ buff += avail;
-+ bytes -= avail;
-+ offset = 0;
-+ put_bh(bh[i]);
-+ }
-+
-+ lzma_error = 0;
-+ res = unlzma(stream->input, length, NULL, NULL, stream->output, NULL,
-+ error);
-+ if (res || lzma_error)
-+ goto failed;
-+
-+ /* uncompressed size is stored in the LZMA header (5 byte offset) */
-+ res = bytes = get_unaligned_le32(stream->input + 5);
-+ for (i = 0, buff = stream->output; bytes && i < pages; i++) {
-+ avail = min_t(int, bytes, PAGE_CACHE_SIZE);
-+ memcpy(buffer[i], buff, avail);
-+ buff += avail;
-+ bytes -= avail;
-+ }
-+ if (bytes)
-+ goto failed;
-+
-+ mutex_unlock(&lzma_mutex);
-+ return res;
-+
-+block_release:
-+ for (; i < b; i++)
-+ put_bh(bh[i]);
-+
-+failed:
-+ mutex_unlock(&lzma_mutex);
-+
-+ ERROR("lzma decompression failed, data probably corrupt\n");
-+ return -EIO;
-+}
-+
-+const struct squashfs_decompressor squashfs_lzma_comp_ops = {
-+ .init = lzma_init,
-+ .free = lzma_free,
-+ .decompress = lzma_uncompress,
-+ .id = LZMA_COMPRESSION,
-+ .name = "lzma",
-+ .supported = 1
-+};
-+
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -94,3 +94,6 @@ extern const struct address_space_operat
-
- /* zlib_wrapper.c */
- extern const struct squashfs_decompressor squashfs_zlib_comp_ops;
-+
-+/* lzma wrapper.c */
-+extern const struct squashfs_decompressor squashfs_lzma_comp_ops;
+++ /dev/null
-From fdf23ed283bc6ef5c25076ce2065f892120ff556 Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Thu, 22 Oct 2009 04:57:38 +0100
-Subject: [PATCH] Squashfs: Make unlzma available to non initramfs/initrd code
-
-Add a config option DECOMPRESS_LZMA_NEEDED which allows subsystems to
-specify they need the unlzma code. Normally decompress_unlzma.c is
-compiled with __init and unlzma is not exported to modules.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/Kconfig | 1 +
- include/linux/decompress/bunzip2_mm.h | 12 ++++++++++++
- include/linux/decompress/inflate_mm.h | 12 ++++++++++++
- include/linux/decompress/mm.h | 3 ---
- include/linux/decompress/unlzma_mm.h | 20 ++++++++++++++++++++
- lib/Kconfig | 3 +++
- lib/decompress_bunzip2.c | 1 +
- lib/decompress_inflate.c | 1 +
- lib/decompress_unlzma.c | 5 ++++-
- 9 files changed, 54 insertions(+), 4 deletions(-)
- create mode 100644 include/linux/decompress/bunzip2_mm.h
- create mode 100644 include/linux/decompress/inflate_mm.h
- create mode 100644 include/linux/decompress/unlzma_mm.h
-
---- a/fs/squashfs/Kconfig
-+++ b/fs/squashfs/Kconfig
-@@ -30,6 +30,7 @@ config SQUASHFS_LZMA
- bool "Include support for LZMA compressed file systems"
- depends on SQUASHFS
- select DECOMPRESS_LZMA
-+ select DECOMPRESS_LZMA_NEEDED
-
- config SQUASHFS_EMBEDDED
-
---- /dev/null
-+++ b/include/linux/decompress/bunzip2_mm.h
-@@ -0,0 +1,12 @@
-+#ifndef BUNZIP2_MM_H
-+#define BUNZIP2_MM_H
-+
-+#ifdef STATIC
-+/* Code active when included from pre-boot environment: */
-+#define INIT
-+#else
-+/* Compile for initramfs/initrd code only */
-+#define INIT __init
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/include/linux/decompress/inflate_mm.h
-@@ -0,0 +1,12 @@
-+#ifndef INFLATE_MM_H
-+#define INFLATE_MM_H
-+
-+#ifdef STATIC
-+/* Code active when included from pre-boot environment: */
-+#define INIT
-+#else
-+/* Compile for initramfs/initrd code only */
-+#define INIT __init
-+#endif
-+
-+#endif
---- a/include/linux/decompress/mm.h
-+++ b/include/linux/decompress/mm.h
-@@ -53,8 +53,6 @@ static void free(void *where)
-
- #define set_error_fn(x)
-
--#define INIT
--
- #else /* STATIC */
-
- /* Code active when compiled standalone for use when loading ramdisk: */
-@@ -77,7 +75,6 @@ static void free(void *where)
- static void(*error)(char *m);
- #define set_error_fn(x) error = x;
-
--#define INIT __init
- #define STATIC
-
- #include <linux/init.h>
---- /dev/null
-+++ b/include/linux/decompress/unlzma_mm.h
-@@ -0,0 +1,20 @@
-+#ifndef UNLZMA_MM_H
-+#define UNLZMA_MM_H
-+
-+#ifdef STATIC
-+
-+/* Code active when included from pre-boot environment: */
-+#define INIT
-+
-+#elif defined(CONFIG_DECOMPRESS_LZMA_NEEDED)
-+
-+/* Make it available to non initramfs/initrd code */
-+#define INIT
-+#include <linux/module.h>
-+#else
-+
-+/* Compile for initramfs/initrd code only */
-+#define INIT __init
-+#endif
-+
-+#endif
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -121,6 +121,9 @@ config DECOMPRESS_LZO
- select LZO_DECOMPRESS
- tristate
-
-+config DECOMPRESS_LZMA_NEEDED
-+ boolean
-+
- #
- # Generic allocator support is selected if needed
- #
---- a/lib/decompress_bunzip2.c
-+++ b/lib/decompress_bunzip2.c
-@@ -52,6 +52,7 @@
- #include <linux/slab.h>
- #endif /* STATIC */
-
-+#include <linux/decompress/bunzip2_mm.h>
- #include <linux/decompress/mm.h>
-
- #ifndef INT_MAX
---- a/lib/decompress_inflate.c
-+++ b/lib/decompress_inflate.c
-@@ -23,6 +23,7 @@
-
- #endif /* STATIC */
-
-+#include <linux/decompress/inflate_mm.h>
- #include <linux/decompress/mm.h>
-
- #define GZIP_IOBUF_SIZE (16*1024)
---- a/lib/decompress_unlzma.c
-+++ b/lib/decompress_unlzma.c
-@@ -36,6 +36,7 @@
- #include <linux/slab.h>
- #endif /* STATIC */
-
-+#include <linux/decompress/unlzma_mm.h>
- #include <linux/decompress/mm.h>
-
- #define MIN(a, b) (((a) < (b)) ? (a) : (b))
-@@ -531,7 +532,7 @@ static inline void INIT process_bit1(str
-
-
-
--STATIC inline int INIT unlzma(unsigned char *buf, int in_len,
-+STATIC int INIT unlzma(unsigned char *buf, int in_len,
- int(*fill)(void*, unsigned int),
- int(*flush)(void*, unsigned int),
- unsigned char *output,
-@@ -664,4 +665,6 @@ STATIC int INIT decompress(unsigned char
- {
- return unlzma(buf, in_len - 4, fill, flush, output, posp, error_fn);
- }
-+#elif defined(CONFIG_DECOMPRESS_LZMA_NEEDED)
-+EXPORT_SYMBOL(unlzma);
- #endif
+++ /dev/null
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -121,6 +121,8 @@
- #endif
- .endm
-
-+ j kernel_entry
-+ nop
- #ifndef CONFIG_NO_EXCEPT_FILL
- /*
- * Reserved space for exception handlers.
+++ /dev/null
---- a/Makefile
-+++ b/Makefile
-@@ -529,7 +529,7 @@ all: vmlinux
- ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
- KBUILD_CFLAGS += -Os
- else
--KBUILD_CFLAGS += -O2
-+KBUILD_CFLAGS += -O2 -fno-reorder-blocks -fno-tree-ch
- endif
-
- include $(srctree)/arch/$(SRCARCH)/Makefile
-@@ -567,6 +567,9 @@ endif
- NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
- CHECKFLAGS += $(NOSTDINC_FLAGS)
-
-+# improve gcc optimization
-+CFLAGS += $(call cc-option,-funit-at-a-time,)
-+
- # warn about C99 declaration after statement
- KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
-
+++ /dev/null
---- a/arch/mips/include/asm/system.h
-+++ b/arch/mips/include/asm/system.h
-@@ -194,7 +194,7 @@ extern __u64 __xchg_u64_unsupported_on_3
- #define __xchg_u64 __xchg_u64_unsupported_on_32bit_kernels
- #endif
-
--static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-+static __always_inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
- {
- switch (size) {
- case 4:
+++ /dev/null
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -51,6 +51,7 @@
- #define SST49LF040B 0x0050
- #define SST49LF008A 0x005a
- #define AT49BV6416 0x00d6
-+#define MANUFACTURER_SAMSUNG 0x00ec
-
- static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
- static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
-@@ -375,12 +376,19 @@ struct mtd_info *cfi_cmdset_0002(struct
-
- if (extp->MajorVersion != '1' ||
- (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
-- printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query "
-- "version %c.%c.\n", extp->MajorVersion,
-- extp->MinorVersion);
-- kfree(extp);
-- kfree(mtd);
-- return NULL;
-+ if (cfi->mfr == MANUFACTURER_SAMSUNG &&
-+ (extp->MajorVersion == '3' && extp->MinorVersion == '3')) {
-+ printk(KERN_NOTICE " Newer Samsung flash detected, "
-+ "should be compatibile with Amd/Fujitsu.\n");
-+ }
-+ else {
-+ printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query "
-+ "version %c.%c.\n", extp->MajorVersion,
-+ extp->MinorVersion);
-+ kfree(extp);
-+ kfree(mtd);
-+ return NULL;
-+ }
- }
-
- /* Install our own private info structure */
+++ /dev/null
---- /dev/null
-+++ b/arch/mips/include/asm/mips_machine.h
-@@ -0,0 +1,47 @@
-+/*
-+ * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.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.
-+ *
-+ */
-+
-+#ifndef __ASM_MIPS_MACHINE_H
-+#define __ASM_MIPS_MACHINE_H
-+
-+#include <linux/init.h>
-+#include <linux/list.h>
-+
-+struct mips_machine {
-+ unsigned long mach_type;
-+ void (*mach_setup)(void);
-+ char *mach_name;
-+ struct list_head list;
-+};
-+
-+void mips_machine_register(struct mips_machine *) __init;
-+void mips_machine_setup(unsigned long machtype) __init;
-+void mips_machine_set_name(char *name) __init;
-+
-+extern char *mips_machine_name;
-+
-+#define MIPS_MACHINE(_type, _name, _setup) \
-+static char machine_name_##_type[] __initdata = _name; \
-+static struct mips_machine machine_##_type __initdata = \
-+{ \
-+ .mach_type = _type, \
-+ .mach_name = machine_name_##_type, \
-+ .mach_setup = _setup, \
-+}; \
-+ \
-+static int __init register_machine_##_type(void) \
-+{ \
-+ mips_machine_register(&machine_##_type); \
-+ return 0; \
-+} \
-+ \
-+pure_initcall(register_machine_##_type)
-+
-+#endif /* __ASM_MIPS_MACHINE_H */
-+
---- /dev/null
-+++ b/arch/mips/kernel/mips_machine.c
-@@ -0,0 +1,74 @@
-+/*
-+ * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.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.
-+ *
-+ */
-+#include <linux/mm.h>
-+
-+#include <asm/mips_machine.h>
-+#include <asm/bootinfo.h>
-+
-+static struct list_head mips_machines __initdata =
-+ LIST_HEAD_INIT(mips_machines);
-+
-+char *mips_machine_name = "Unknown";
-+
-+static struct mips_machine * __init mips_machine_find(unsigned long machtype)
-+{
-+ struct list_head *this;
-+
-+ list_for_each(this, &mips_machines) {
-+ struct mips_machine *mach;
-+
-+ mach = list_entry(this, struct mips_machine, list);
-+ if (mach->mach_type == machtype)
-+ return mach;
-+ }
-+
-+ return NULL;
-+}
-+
-+void __init mips_machine_register(struct mips_machine *mach)
-+{
-+ list_add_tail(&mach->list, &mips_machines);
-+}
-+
-+void __init mips_machine_set_name(char *name)
-+{
-+ unsigned int len;
-+ char *p;
-+
-+ if (name == NULL)
-+ return;
-+
-+ len = strlen(name);
-+ p = kmalloc(len + 1, GFP_KERNEL);
-+ if (p) {
-+ strncpy(p, name, len);
-+ p[len] = '\0';
-+ mips_machine_name = p;
-+ } else {
-+ printk(KERN_WARNING "MIPS: no memory for machine_name\n");
-+ }
-+}
-+
-+void __init mips_machine_setup(unsigned long machtype)
-+{
-+ struct mips_machine *mach;
-+
-+ mach = mips_machine_find(machtype);
-+ if (!mach) {
-+ printk(KERN_ALERT "MIPS: no machine registered for "
-+ "machtype %lu\n", machtype);
-+ return;
-+ }
-+
-+ mips_machine_set_name(mach->mach_name);
-+ printk(KERN_INFO "MIPS: machine is %s\n", mips_machine_name);
-+
-+ if (mach->mach_setup)
-+ mach->mach_setup();
-+}
---- a/arch/mips/kernel/Makefile
-+++ b/arch/mips/kernel/Makefile
-@@ -93,6 +93,7 @@ obj-$(CONFIG_GPIO_TXX9) += gpio_txx9.o
-
- obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
- obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
-+obj-$(CONFIG_MIPS_MACHINE) += mips_machine.o
-
- CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi)
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -851,6 +851,9 @@ config MIPS_DISABLE_OBSOLETE_IDE
- config SYNC_R4K
- bool
-
-+config MIPS_MACHINE
-+ def_bool n
-+
- config NO_IOPORT
- def_bool n
-
---- a/arch/mips/kernel/proc.c
-+++ b/arch/mips/kernel/proc.c
-@@ -12,6 +12,7 @@
- #include <asm/cpu-features.h>
- #include <asm/mipsregs.h>
- #include <asm/processor.h>
-+#include <asm/mips_machine.h>
-
- unsigned int vced_count, vcei_count;
-
-@@ -31,8 +32,12 @@ static int show_cpuinfo(struct seq_file
- /*
- * For the first processor also print the system type
- */
-- if (n == 0)
-+ if (n == 0) {
- seq_printf(m, "system type\t\t: %s\n", get_system_type());
-+#ifdef CONFIG_MIPS_MACHINE
-+ seq_printf(m, "machine\t\t\t: %s\n", mips_machine_name);
-+#endif
-+ }
-
- seq_printf(m, "processor\t\t: %ld\n", n);
- sprintf(fmt, "cpu model\t\t: %%s V%%d.%%d%s\n",
+++ /dev/null
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -854,6 +854,10 @@ config SYNC_R4K
- config MIPS_MACHINE
- def_bool n
-
-+config IMAGE_CMDLINE_HACK
-+ bool "OpenWrt specific image command line hack"
-+ default n
-+
- config NO_IOPORT
- def_bool n
-
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -143,6 +143,12 @@ FEXPORT(__kernel_entry)
- j kernel_entry
- #endif
-
-+#ifdef CONFIG_IMAGE_CMDLINE_HACK
-+ .ascii "CMDLINE:"
-+EXPORT(__image_cmdline)
-+ .fill 0x400
-+#endif /* CONFIG_IMAGE_CMDLINE_HACK */
-+
- __REF
-
- NESTED(kernel_entry, 16, sp) # kernel entry point
+++ /dev/null
---- a/arch/mips/include/asm/thread_info.h
-+++ b/arch/mips/include/asm/thread_info.h
-@@ -83,6 +83,7 @@ register struct thread_info *__current_t
- #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
- #define THREAD_MASK (THREAD_SIZE - 1UL)
-
-+#if 0
- #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR
-
- #ifdef CONFIG_DEBUG_STACK_USAGE
-@@ -92,6 +93,7 @@ register struct thread_info *__current_t
- #endif
-
- #define free_thread_info(info) kfree(info)
-+#endif
-
- #endif /* !__ASSEMBLY__ */
-
+++ /dev/null
-MIPS: allow disabling the kernel FPU emulator
-
-This patch allows turning off the in-kernel Algorithmics
-FPU emulator support, which allows one to save a couple of
-precious blocks on an embedded system.
-
-Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -839,6 +839,17 @@ config I8259
- config MIPS_BONITO64
- bool
-
-+config MIPS_FPU_EMU
-+ bool "Enable FPU emulation"
-+ default y
-+ help
-+ This option allows building a kernel with or without the Algorithmics
-+ FPU emulator enabled. Turning off this option results in a kernel which
-+ does not catch floating operations exceptions. Make sure that your toolchain
-+ is configured to enable software floating point emulation in that case.
-+
-+ If unsure say Y here.
-+
- config MIPS_MSC
- bool
-
---- a/arch/mips/math-emu/Makefile
-+++ b/arch/mips/math-emu/Makefile
-@@ -2,12 +2,14 @@
- # Makefile for the Linux/MIPS kernel FPU emulation.
- #
-
--obj-y := cp1emu.o ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
-+obj-y := kernel_linkage.o dsemul.o cp1emu.o
-+
-+obj-$(CONFIG_MIPS_FPU_EMU) += ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
- ieee754xcpt.o dp_frexp.o dp_modf.o dp_div.o dp_mul.o dp_sub.o \
- dp_add.o dp_fsp.o dp_cmp.o dp_logb.o dp_scalb.o dp_simple.o \
- dp_tint.o dp_fint.o dp_tlong.o dp_flong.o sp_frexp.o sp_modf.o \
- sp_div.o sp_mul.o sp_sub.o sp_add.o sp_fdp.o sp_cmp.o sp_logb.o \
- sp_scalb.o sp_simple.o sp_tint.o sp_fint.o sp_tlong.o sp_flong.o \
-- dp_sqrt.o sp_sqrt.o kernel_linkage.o dsemul.o
-+ dp_sqrt.o sp_sqrt.o
-
- EXTRA_CFLAGS += -Werror
---- a/arch/mips/math-emu/cp1emu.c
-+++ b/arch/mips/math-emu/cp1emu.c
-@@ -58,7 +58,11 @@
- #define __mips 4
-
- /* Function which emulates a floating point instruction. */
-+#ifdef CONFIG_DEBUG_FS
-+DEFINE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats);
-+#endif
-
-+#ifdef CONFIG_MIPS_FPU_EMU
- static int fpu_emu(struct pt_regs *, struct mips_fpu_struct *,
- mips_instruction);
-
-@@ -69,10 +73,6 @@ static int fpux_emu(struct pt_regs *,
-
- /* Further private data for which no space exists in mips_fpu_struct */
-
--#ifdef CONFIG_DEBUG_FS
--DEFINE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats);
--#endif
--
- /* Control registers */
-
- #define FPCREG_RID 0 /* $0 = revision id */
-@@ -1277,7 +1277,6 @@ int fpu_emulator_cop1Handler(struct pt_r
-
- return sig;
- }
--
- #ifdef CONFIG_DEBUG_FS
-
- static int fpuemu_stat_get(void *data, u64 *val)
-@@ -1326,4 +1325,11 @@ static int __init debugfs_fpuemu(void)
- return 0;
- }
- __initcall(debugfs_fpuemu);
--#endif
-+#endif /* CONFIG_DEBUGFS */
-+#else
-+int fpu_emulator_cop1Handler(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
-+ int has_fpu)
-+{
-+ return 0;
-+}
-+#endif /* CONFIG_MIPS_FPU_EMU */
---- a/arch/mips/math-emu/dsemul.c
-+++ b/arch/mips/math-emu/dsemul.c
-@@ -109,6 +109,7 @@ int mips_dsemul(struct pt_regs *regs, mi
- return SIGILL; /* force out of emulation loop */
- }
-
-+#ifdef CONFIG_MIPS_FPU_EMU
- int do_dsemulret(struct pt_regs *xcp)
- {
- struct emuframe __user *fr;
-@@ -165,3 +166,9 @@ int do_dsemulret(struct pt_regs *xcp)
-
- return 1;
- }
-+#else
-+int do_dsemulret(struct pt_regs *xcp)
-+{
-+ return 0;
-+}
-+#endif /* CONFIG_MIPS_FPU_EMU */
---- a/arch/mips/math-emu/kernel_linkage.c
-+++ b/arch/mips/math-emu/kernel_linkage.c
-@@ -29,6 +29,7 @@
-
- #define SIGNALLING_NAN 0x7ff800007ff80000LL
-
-+#ifdef CONFIG_MIPS_FPU_EMU
- void fpu_emulator_init_fpu(void)
- {
- static int first = 1;
-@@ -112,4 +113,36 @@ int fpu_emulator_restore_context32(struc
-
- return err;
- }
--#endif
-+#endif /* CONFIG_64BIT */
-+#else
-+
-+void fpu_emulator_init_fpu(void)
-+{
-+ printk(KERN_INFO "FPU emulator disabled, make sure your toolchain"
-+ "was compiled with software floating point support (soft-float)\n");
-+ return;
-+}
-+
-+int fpu_emulator_save_context(struct sigcontext __user *sc)
-+{
-+ return 0;
-+}
-+
-+int fpu_emulator_restore_context(struct sigcontext __user *sc)
-+{
-+ return 0;
-+}
-+
-+int fpu_emulator_save_context32(struct sigcontext32 __user *sc)
-+{
-+ return 0;
-+}
-+
-+int fpu_emulator_restore_context32(struct sigcontext32 __user *sc)
-+{
-+ return 0;
-+}
-+
-+#ifdef CONFIG_64BIT
-+#endif /* CONFIG_64BIT */
-+#endif /* CONFIG_MIPS_FPU_EMU */
+++ /dev/null
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -93,7 +93,7 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
- cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
- cflags-y += -msoft-float
- LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
--MODFLAGS += -mlong-calls
-+MODFLAGS += -mno-long-calls
-
- cflags-y += -ffreestanding
-
---- a/arch/mips/include/asm/module.h
-+++ b/arch/mips/include/asm/module.h
-@@ -9,6 +9,11 @@ struct mod_arch_specific {
- struct list_head dbe_list;
- const struct exception_table_entry *dbe_start;
- const struct exception_table_entry *dbe_end;
-+
-+ void *phys_plt_tbl;
-+ void *virt_plt_tbl;
-+ unsigned int phys_plt_offset;
-+ unsigned int virt_plt_offset;
- };
-
- typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */
---- a/arch/mips/kernel/module.c
-+++ b/arch/mips/kernel/module.c
-@@ -43,6 +43,117 @@ static struct mips_hi16 *mips_hi16_list;
- static LIST_HEAD(dbe_list);
- static DEFINE_SPINLOCK(dbe_lock);
-
-+/*
-+ * Get the potential max trampolines size required of the init and
-+ * non-init sections. Only used if we cannot find enough contiguous
-+ * physically mapped memory to put the module into.
-+ */
-+static unsigned int
-+get_plt_size(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
-+ const char *secstrings, unsigned int symindex, bool is_init)
-+{
-+ unsigned long ret = 0;
-+ unsigned int i, j;
-+ Elf_Sym *syms;
-+
-+ /* Everything marked ALLOC (this includes the exported symbols) */
-+ for (i = 1; i < hdr->e_shnum; ++i) {
-+ unsigned int info = sechdrs[i].sh_info;
-+
-+ if (sechdrs[i].sh_type != SHT_REL
-+ && sechdrs[i].sh_type != SHT_RELA)
-+ continue;
-+
-+ /* Not a valid relocation section? */
-+ if (info >= hdr->e_shnum)
-+ continue;
-+
-+ /* Don't bother with non-allocated sections */
-+ if (!(sechdrs[info].sh_flags & SHF_ALLOC))
-+ continue;
-+
-+ /* If it's called *.init*, and we're not init, we're
-+ not interested */
-+ if ((strstr(secstrings + sechdrs[i].sh_name, ".init") != 0)
-+ != is_init)
-+ continue;
-+
-+ syms = (Elf_Sym *) sechdrs[symindex].sh_addr;
-+ if (sechdrs[i].sh_type == SHT_REL) {
-+ Elf_Mips_Rel *rel = (void *) sechdrs[i].sh_addr;
-+ unsigned int size = sechdrs[i].sh_size / sizeof(*rel);
-+
-+ for (j = 0; j < size; ++j) {
-+ Elf_Sym *sym;
-+
-+ if (ELF_MIPS_R_TYPE(rel[j]) != R_MIPS_26)
-+ continue;
-+
-+ sym = syms + ELF_MIPS_R_SYM(rel[j]);
-+ if (!is_init && sym->st_shndx != SHN_UNDEF)
-+ continue;
-+
-+ ret += 4 * sizeof(int);
-+ }
-+ } else {
-+ Elf_Mips_Rela *rela = (void *) sechdrs[i].sh_addr;
-+ unsigned int size = sechdrs[i].sh_size / sizeof(*rela);
-+
-+ for (j = 0; j < size; ++j) {
-+ Elf_Sym *sym;
-+
-+ if (ELF_MIPS_R_TYPE(rela[j]) != R_MIPS_26)
-+ continue;
-+
-+ sym = syms + ELF_MIPS_R_SYM(rela[j]);
-+ if (!is_init && sym->st_shndx != SHN_UNDEF)
-+ continue;
-+
-+ ret += 4 * sizeof(int);
-+ }
-+ }
-+ }
-+
-+ return ret;
-+}
-+
-+#ifndef MODULE_START
-+static void *alloc_phys(unsigned long size)
-+{
-+ unsigned order;
-+ struct page *page;
-+ struct page *p;
-+
-+ size = PAGE_ALIGN(size);
-+ order = get_order(size);
-+
-+ page = alloc_pages(GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN |
-+ __GFP_THISNODE, order);
-+ if (!page)
-+ return NULL;
-+
-+ split_page(page, order);
-+
-+ for (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p)
-+ __free_page(p);
-+
-+ return page_address(page);
-+}
-+#endif
-+
-+static void free_phys(void *ptr, unsigned long size)
-+{
-+ struct page *page;
-+ struct page *end;
-+
-+ page = virt_to_page(ptr);
-+ end = page + (PAGE_ALIGN(size) >> PAGE_SHIFT);
-+
-+ for (; page < end; ++page)
-+ __free_page(page);
-+}
-+
-+
- void *module_alloc(unsigned long size)
- {
- #ifdef MODULE_START
-@@ -58,21 +169,99 @@ void *module_alloc(unsigned long size)
-
- return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL);
- #else
-+ void *ptr;
-+
- if (size == 0)
- return NULL;
-- return vmalloc(size);
-+
-+ ptr = alloc_phys(size);
-+
-+ /* If we failed to allocate physically contiguous memory,
-+ * fall back to regular vmalloc. The module loader code will
-+ * create jump tables to handle long jumps */
-+ if (!ptr)
-+ return vmalloc(size);
-+
-+ return ptr;
-+#endif
-+}
-+
-+static inline bool is_phys_addr(void *ptr)
-+{
-+#ifdef CONFIG_64BIT
-+ return (KSEGX((unsigned long)ptr) == CKSEG0);
-+#else
-+ return (KSEGX(ptr) == KSEG0);
- #endif
- }
-
- /* Free memory returned from module_alloc */
- void module_free(struct module *mod, void *module_region)
- {
-- vfree(module_region);
-+ if (is_phys_addr(module_region)) {
-+ if (mod->module_init == module_region)
-+ free_phys(module_region, mod->init_size);
-+ else if (mod->module_core == module_region)
-+ free_phys(module_region, mod->core_size);
-+ else
-+ BUG();
-+ } else {
-+ vfree(module_region);
-+ }
-+}
-+
-+static void *__module_alloc(int size, bool phys)
-+{
-+ void *ptr;
-+
-+ if (phys)
-+ ptr = kmalloc(size, GFP_KERNEL);
-+ else
-+ ptr = vmalloc(size);
-+ return ptr;
-+}
-+
-+static void __module_free(void *ptr)
-+{
-+ if (is_phys_addr(ptr))
-+ kfree(ptr);
-+ else
-+ vfree(ptr);
- }
-
- int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
- char *secstrings, struct module *mod)
- {
-+ unsigned int symindex = 0;
-+ unsigned int core_size, init_size;
-+ int i;
-+
-+ for (i = 1; i < hdr->e_shnum; i++)
-+ if (sechdrs[i].sh_type == SHT_SYMTAB)
-+ symindex = i;
-+
-+ core_size = get_plt_size(hdr, sechdrs, secstrings, symindex, false);
-+ init_size = get_plt_size(hdr, sechdrs, secstrings, symindex, true);
-+
-+ mod->arch.phys_plt_offset = 0;
-+ mod->arch.virt_plt_offset = 0;
-+ mod->arch.phys_plt_tbl = NULL;
-+ mod->arch.virt_plt_tbl = NULL;
-+
-+ if ((core_size + init_size) == 0)
-+ return 0;
-+
-+ mod->arch.phys_plt_tbl = __module_alloc(core_size + init_size, 1);
-+ if (!mod->arch.phys_plt_tbl)
-+ return -ENOMEM;
-+
-+ mod->arch.virt_plt_tbl = __module_alloc(core_size + init_size, 0);
-+ if (!mod->arch.virt_plt_tbl) {
-+ __module_free(mod->arch.phys_plt_tbl);
-+ mod->arch.phys_plt_tbl = NULL;
-+ return -ENOMEM;
-+ }
-+
- return 0;
- }
-
-@@ -95,28 +284,36 @@ static int apply_r_mips_32_rela(struct m
- return 0;
- }
-
--static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
-+static Elf_Addr add_plt_entry_to(unsigned *plt_offset,
-+ void *start, Elf_Addr v)
- {
-- if (v % 4) {
-- pr_err("module %s: dangerous R_MIPS_26 REL relocation\n",
-- me->name);
-- return -ENOEXEC;
-- }
-+ unsigned *tramp = start + *plt_offset;
-+ *plt_offset += 4 * sizeof(int);
-
-- if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
-- printk(KERN_ERR
-- "module %s: relocation overflow\n",
-- me->name);
-- return -ENOEXEC;
-- }
-+ /* adjust carry for addiu */
-+ if (v & 0x00008000)
-+ v += 0x10000;
-
-- *location = (*location & ~0x03ffffff) |
-- ((*location + (v >> 2)) & 0x03ffffff);
-+ tramp[0] = 0x3c190000 | (v >> 16); /* lui t9, hi16 */
-+ tramp[1] = 0x27390000 | (v & 0xffff); /* addiu t9, t9, lo16 */
-+ tramp[2] = 0x03200008; /* jr t9 */
-+ tramp[3] = 0x00000000; /* nop */
-
-- return 0;
-+ return (Elf_Addr) tramp;
- }
-
--static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v)
-+static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v)
-+{
-+ if (is_phys_addr(location))
-+ return add_plt_entry_to(&me->arch.phys_plt_offset,
-+ me->arch.phys_plt_tbl, v);
-+ else
-+ return add_plt_entry_to(&me->arch.virt_plt_offset,
-+ me->arch.virt_plt_tbl, v);
-+
-+}
-+
-+static int set_r_mips_26(struct module *me, u32 *location, u32 ofs, Elf_Addr v)
- {
- if (v % 4) {
- pr_err("module %s: dangerous R_MIPS_26 RELArelocation\n",
-@@ -125,17 +322,31 @@ static int apply_r_mips_26_rela(struct m
- }
-
- if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
-- printk(KERN_ERR
-+ v = add_plt_entry(me, location, v + (ofs << 2));
-+ if (!v) {
-+ printk(KERN_ERR
- "module %s: relocation overflow\n",
- me->name);
-- return -ENOEXEC;
-+ return -ENOEXEC;
-+ }
-+ ofs = 0;
- }
-
-- *location = (*location & ~0x03ffffff) | ((v >> 2) & 0x03ffffff);
-+ *location = (*location & ~0x03ffffff) | ((ofs + (v >> 2)) & 0x03ffffff);
-
- return 0;
- }
-
-+static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
-+{
-+ return set_r_mips_26(me, location, *location & 0x03ffffff, v);
-+}
-+
-+static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v)
-+{
-+ return set_r_mips_26(me, location, 0, v);
-+}
-+
- static int apply_r_mips_hi16_rel(struct module *me, u32 *location, Elf_Addr v)
- {
- struct mips_hi16 *n;
-@@ -400,11 +611,32 @@ int module_finalize(const Elf_Ehdr *hdr,
- list_add(&me->arch.dbe_list, &dbe_list);
- spin_unlock_irq(&dbe_lock);
- }
-+
-+ /* Get rid of the fixup trampoline if we're running the module
-+ * from physically mapped address space */
-+ if (me->arch.phys_plt_offset == 0) {
-+ __module_free(me->arch.phys_plt_tbl);
-+ me->arch.phys_plt_tbl = NULL;
-+ }
-+ if (me->arch.virt_plt_offset == 0) {
-+ __module_free(me->arch.virt_plt_tbl);
-+ me->arch.virt_plt_tbl = NULL;
-+ }
-+
- return 0;
- }
-
- void module_arch_cleanup(struct module *mod)
- {
-+ if (mod->arch.phys_plt_tbl) {
-+ __module_free(mod->arch.phys_plt_tbl);
-+ mod->arch.phys_plt_tbl = NULL;
-+ }
-+ if (mod->arch.virt_plt_tbl) {
-+ __module_free(mod->arch.virt_plt_tbl);
-+ mod->arch.virt_plt_tbl = NULL;
-+ }
-+
- spin_lock_irq(&dbe_lock);
- list_del(&mod->arch.dbe_list);
- spin_unlock_irq(&dbe_lock);
+++ /dev/null
---- a/include/asm-generic/vmlinux.lds.h
-+++ b/include/asm-generic/vmlinux.lds.h
-@@ -52,6 +52,27 @@
- #define LOAD_OFFSET 0
- #endif
-
-+#ifndef SYMTAB_KEEP_STR
-+#define SYMTAB_KEEP_STR *(__ksymtab_strings.*)
-+#define SYMTAB_DISCARD_STR
-+#else
-+#define SYMTAB_DISCARD_STR *(__ksymtab_strings.*)
-+#endif
-+
-+#ifndef SYMTAB_KEEP
-+#define SYMTAB_KEEP *(__ksymtab.*)
-+#define SYMTAB_DISCARD
-+#else
-+#define SYMTAB_DISCARD *(__ksymtab.*)
-+#endif
-+
-+#ifndef SYMTAB_KEEP_GPL
-+#define SYMTAB_KEEP_GPL *(__ksymtab_gpl.*)
-+#define SYMTAB_DISCARD_GPL
-+#else
-+#define SYMTAB_DISCARD_GPL *(__ksymtab_gpl.*)
-+#endif
-+
- #ifndef SYMBOL_PREFIX
- #define VMLINUX_SYMBOL(sym) sym
- #else
-@@ -258,35 +279,35 @@
- /* Kernel symbol table: Normal symbols */ \
- __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab) = .; \
-- *(__ksymtab) \
-+ SYMTAB_KEEP \
- VMLINUX_SYMBOL(__stop___ksymtab) = .; \
- } \
- \
- /* Kernel symbol table: GPL-only symbols */ \
- __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \
-- *(__ksymtab_gpl) \
-+ SYMTAB_KEEP_GPL \
- VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \
- } \
- \
- /* Kernel symbol table: Normal unused symbols */ \
- __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \
-- *(__ksymtab_unused) \
-+ *(__ksymtab_unused.*) \
- VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \
- } \
- \
- /* Kernel symbol table: GPL-only unused symbols */ \
- __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \
-- *(__ksymtab_unused_gpl) \
-+ *(__ksymtab_unused_gpl.*) \
- VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \
- } \
- \
- /* Kernel symbol table: GPL-future-only symbols */ \
- __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \
-- *(__ksymtab_gpl_future) \
-+ *(__ksymtab_gpl_future.*) \
- VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \
- } \
- \
-@@ -327,7 +348,7 @@
- \
- /* Kernel symbol table: strings */ \
- __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
-- *(__ksymtab_strings) \
-+ SYMTAB_KEEP_STR \
- } \
- \
- /* __*init sections */ \
-@@ -642,6 +663,9 @@
- EXIT_TEXT \
- EXIT_DATA \
- EXIT_CALL \
-+ SYMTAB_DISCARD \
-+ SYMTAB_DISCARD_GPL \
-+ SYMTAB_DISCARD_STR \
- *(.discard) \
- }
-
---- a/include/linux/module.h
-+++ b/include/linux/module.h
-@@ -194,16 +194,24 @@ void *__symbol_get_gpl(const char *symbo
- #define __CRC_SYMBOL(sym, sec)
- #endif
-
-+#ifdef MODULE
-+#define __EXPORT_SUFFIX(sym)
-+#else
-+#define __EXPORT_SUFFIX(sym) "." #sym
-+#endif
-+
- /* For every exported symbol, place a struct in the __ksymtab section */
- #define __EXPORT_SYMBOL(sym, sec) \
- extern typeof(sym) sym; \
- __CRC_SYMBOL(sym, sec) \
- static const char __kstrtab_##sym[] \
-- __attribute__((section("__ksymtab_strings"), aligned(1))) \
-+ __attribute__((section("__ksymtab_strings" \
-+ __EXPORT_SUFFIX(sym)), aligned(1))) \
- = MODULE_SYMBOL_PREFIX #sym; \
- static const struct kernel_symbol __ksymtab_##sym \
- __used \
-- __attribute__((section("__ksymtab" sec), unused)) \
-+ __attribute__((section("__ksymtab" sec \
-+ __EXPORT_SUFFIX(sym)), unused)) \
- = { (unsigned long)&sym, __kstrtab_##sym }
-
- #define EXPORT_SYMBOL(sym) \
+++ /dev/null
---- a/arch/arm/kernel/module.c
-+++ b/arch/arm/kernel/module.c
-@@ -121,6 +121,10 @@ apply_relocate(Elf32_Shdr *sechdrs, cons
- return -ENOEXEC;
- }
-
-+ if ((IS_ERR_VALUE(sym->st_value) || !sym->st_value) &&
-+ ELF_ST_BIND(sym->st_info) == STB_WEAK)
-+ continue;
-+
- loc = dstsec->sh_addr + rel->r_offset;
-
- switch (ELF32_R_TYPE(rel->r_info)) {
+++ /dev/null
---- a/drivers/pci/Kconfig
-+++ b/drivers/pci/Kconfig
-@@ -51,6 +51,12 @@ config PCI_STUB
-
- When in doubt, say N.
-
-+config PCI_DISABLE_COMMON_QUIRKS
-+ bool "PCI disable common quirks"
-+ depends on PCI
-+ help
-+ If you don't know what to do here, say N.
-+
- config HT_IRQ
- bool "Interrupts on hypertransport devices"
- default y
---- a/drivers/pci/quirks.c
-+++ b/drivers/pci/quirks.c
-@@ -96,6 +96,7 @@ static void __devinit quirk_resource_ali
- }
- DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, quirk_resource_alignment);
-
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
- /* The Mellanox Tavor device gives false positive parity errors
- * Mark this device with a broken_parity_status, to allow
- * PCI scanning code to "skip" this now blacklisted device.
-@@ -1905,7 +1906,9 @@ static void __devinit fixup_rev1_53c810(
- }
- }
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810);
-+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */
-
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
- /* Enable 1k I/O space granularity on the Intel P64H2 */
- static void __devinit quirk_p64h2_1k_io(struct pci_dev *dev)
- {
-@@ -2536,6 +2539,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x150d, quirk_i82576_sriov);
-
- #endif /* CONFIG_PCI_IOV */
-+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */
-
- static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,
- struct pci_fixup *end)
+++ /dev/null
-GCC 4.4.x looks to be adding support for generating out-of-line register
-saves/restores based on:
-
-http://gcc.gnu.org/ml/gcc-patches/2008-04/msg01678.html
-
-This breaks the kernel build as we'd have to link with libgcc to get the
-implementation of the register save/restores.
-
-To workaround this issue, we just stole the save/restore code from gcc
-and simplified it down for our needs (integer only). We only do this if
-PPC32 as gcc makes believe the linker on ppc64 will deal with this and
-only if CONFIG_CC_OPTIMIZE_FOR_SIZE is set (thus -Os).
-
-Signed-off-by: Kumar Gala <[EMAIL PROTECTED]>
----
-
-If someone using cutting edge toolchains for ppc64 could test and make
-sure if we enable CONFIG_CC_OPTIMIZE_FOR_SIZE things work that would be
-nice.
-
-- k
-
- arch/powerpc/kernel/misc_32.S | 77 +++++++++++++++++++++++++++
- arch/powerpc/kernel/ppc_ksyms.c | 111 +++++++++++++++++++++++++++++++++++++++
- 2 files changed, 188 insertions(+), 0 deletions(-)
-
---- a/arch/powerpc/kernel/misc_32.S
-+++ b/arch/powerpc/kernel/misc_32.S
-@@ -802,3 +802,80 @@ relocate_new_kernel_end:
- relocate_new_kernel_size:
- .long relocate_new_kernel_end - relocate_new_kernel
- #endif
-+
-+#if defined(CONFIG_PPC32) && defined(CONFIG_CC_OPTIMIZE_FOR_SIZE)
-+/* Routines for saving integer registers, called by the compiler. */
-+/* Called with r11 pointing to the stack header word of the caller of the */
-+/* function, just beyond the end of the integer save area. */
-+
-+_GLOBAL(_savegpr_14) stw 14,-72(11) /* save gp registers */
-+_GLOBAL(_savegpr_15) stw 15,-68(11)
-+_GLOBAL(_savegpr_16) stw 16,-64(11)
-+_GLOBAL(_savegpr_17) stw 17,-60(11)
-+_GLOBAL(_savegpr_18) stw 18,-56(11)
-+_GLOBAL(_savegpr_19) stw 19,-52(11)
-+_GLOBAL(_savegpr_20) stw 20,-48(11)
-+_GLOBAL(_savegpr_21) stw 21,-44(11)
-+_GLOBAL(_savegpr_22) stw 22,-40(11)
-+_GLOBAL(_savegpr_23) stw 23,-36(11)
-+_GLOBAL(_savegpr_24) stw 24,-32(11)
-+_GLOBAL(_savegpr_25) stw 25,-28(11)
-+_GLOBAL(_savegpr_26) stw 26,-24(11)
-+_GLOBAL(_savegpr_27) stw 27,-20(11)
-+_GLOBAL(_savegpr_28) stw 28,-16(11)
-+_GLOBAL(_savegpr_29) stw 29,-12(11)
-+_GLOBAL(_savegpr_30) stw 30,-8(11)
-+_GLOBAL(_savegpr_31) stw 31,-4(11)
-+ blr
-+
-+/* Routines for restoring integer registers, called by the compiler. */
-+/* Called with r11 pointing to the stack header word of the caller of the */
-+/* function, just beyond the end of the integer restore area. */
-+
-+_GLOBAL(_restgpr_14) lwz 14,-72(11) /* restore gp registers */
-+_GLOBAL(_restgpr_15) lwz 15,-68(11)
-+_GLOBAL(_restgpr_16) lwz 16,-64(11)
-+_GLOBAL(_restgpr_17) lwz 17,-60(11)
-+_GLOBAL(_restgpr_18) lwz 18,-56(11)
-+_GLOBAL(_restgpr_19) lwz 19,-52(11)
-+_GLOBAL(_restgpr_20) lwz 20,-48(11)
-+_GLOBAL(_restgpr_21) lwz 21,-44(11)
-+_GLOBAL(_restgpr_22) lwz 22,-40(11)
-+_GLOBAL(_restgpr_23) lwz 23,-36(11)
-+_GLOBAL(_restgpr_24) lwz 24,-32(11)
-+_GLOBAL(_restgpr_25) lwz 25,-28(11)
-+_GLOBAL(_restgpr_26) lwz 26,-24(11)
-+_GLOBAL(_restgpr_27) lwz 27,-20(11)
-+_GLOBAL(_restgpr_28) lwz 28,-16(11)
-+_GLOBAL(_restgpr_29) lwz 29,-12(11)
-+_GLOBAL(_restgpr_30) lwz 30,-8(11)
-+_GLOBAL(_restgpr_31) lwz 31,-4(11)
-+ blr
-+
-+/* Routines for restoring integer registers, called by the compiler. */
-+/* Called with r11 pointing to the stack header word of the caller of the */
-+/* function, just beyond the end of the integer restore area. */
-+
-+_GLOBAL(_restgpr_14_x) lwz 14,-72(11) /* restore gp registers */
-+_GLOBAL(_restgpr_15_x) lwz 15,-68(11)
-+_GLOBAL(_restgpr_16_x) lwz 16,-64(11)
-+_GLOBAL(_restgpr_17_x) lwz 17,-60(11)
-+_GLOBAL(_restgpr_18_x) lwz 18,-56(11)
-+_GLOBAL(_restgpr_19_x) lwz 19,-52(11)
-+_GLOBAL(_restgpr_20_x) lwz 20,-48(11)
-+_GLOBAL(_restgpr_21_x) lwz 21,-44(11)
-+_GLOBAL(_restgpr_22_x) lwz 22,-40(11)
-+_GLOBAL(_restgpr_23_x) lwz 23,-36(11)
-+_GLOBAL(_restgpr_24_x) lwz 24,-32(11)
-+_GLOBAL(_restgpr_25_x) lwz 25,-28(11)
-+_GLOBAL(_restgpr_26_x) lwz 26,-24(11)
-+_GLOBAL(_restgpr_27_x) lwz 27,-20(11)
-+_GLOBAL(_restgpr_28_x) lwz 28,-16(11)
-+_GLOBAL(_restgpr_29_x) lwz 29,-12(11)
-+_GLOBAL(_restgpr_30_x) lwz 30,-8(11)
-+_GLOBAL(_restgpr_31_x) lwz 0,4(11)
-+ lwz 31,-4(11)
-+ mtlr 0
-+ mr 1,11
-+ blr
-+#endif
---- a/arch/powerpc/kernel/ppc_ksyms.c
-+++ b/arch/powerpc/kernel/ppc_ksyms.c
-@@ -185,3 +185,114 @@ EXPORT_SYMBOL(__mtdcr);
- EXPORT_SYMBOL(__mfdcr);
- #endif
- EXPORT_SYMBOL(empty_zero_page);
-+
-+#if defined(CONFIG_PPC32) && defined(CONFIG_CC_OPTIMIZE_FOR_SIZE)
-+void _savegpr_14(void);
-+void _savegpr_15(void);
-+void _savegpr_16(void);
-+void _savegpr_17(void);
-+void _savegpr_18(void);
-+void _savegpr_19(void);
-+void _savegpr_20(void);
-+void _savegpr_21(void);
-+void _savegpr_22(void);
-+void _savegpr_23(void);
-+void _savegpr_24(void);
-+void _savegpr_25(void);
-+void _savegpr_26(void);
-+void _savegpr_27(void);
-+void _savegpr_28(void);
-+void _savegpr_29(void);
-+void _savegpr_30(void);
-+void _savegpr_31(void);
-+void _restgpr_14(void);
-+void _restgpr_15(void);
-+void _restgpr_16(void);
-+void _restgpr_17(void);
-+void _restgpr_18(void);
-+void _restgpr_19(void);
-+void _restgpr_20(void);
-+void _restgpr_21(void);
-+void _restgpr_22(void);
-+void _restgpr_23(void);
-+void _restgpr_24(void);
-+void _restgpr_25(void);
-+void _restgpr_26(void);
-+void _restgpr_27(void);
-+void _restgpr_28(void);
-+void _restgpr_29(void);
-+void _restgpr_30(void);
-+void _restgpr_31(void);
-+void _restgpr_14_x(void);
-+void _restgpr_15_x(void);
-+void _restgpr_16_x(void);
-+void _restgpr_17_x(void);
-+void _restgpr_18_x(void);
-+void _restgpr_19_x(void);
-+void _restgpr_20_x(void);
-+void _restgpr_21_x(void);
-+void _restgpr_22_x(void);
-+void _restgpr_23_x(void);
-+void _restgpr_24_x(void);
-+void _restgpr_25_x(void);
-+void _restgpr_26_x(void);
-+void _restgpr_27_x(void);
-+void _restgpr_28_x(void);
-+void _restgpr_29_x(void);
-+void _restgpr_30_x(void);
-+void _restgpr_31_x(void);
-+EXPORT_SYMBOL(_savegpr_14);
-+EXPORT_SYMBOL(_savegpr_15);
-+EXPORT_SYMBOL(_savegpr_16);
-+EXPORT_SYMBOL(_savegpr_17);
-+EXPORT_SYMBOL(_savegpr_18);
-+EXPORT_SYMBOL(_savegpr_19);
-+EXPORT_SYMBOL(_savegpr_20);
-+EXPORT_SYMBOL(_savegpr_21);
-+EXPORT_SYMBOL(_savegpr_22);
-+EXPORT_SYMBOL(_savegpr_23);
-+EXPORT_SYMBOL(_savegpr_24);
-+EXPORT_SYMBOL(_savegpr_25);
-+EXPORT_SYMBOL(_savegpr_26);
-+EXPORT_SYMBOL(_savegpr_27);
-+EXPORT_SYMBOL(_savegpr_28);
-+EXPORT_SYMBOL(_savegpr_29);
-+EXPORT_SYMBOL(_savegpr_30);
-+EXPORT_SYMBOL(_savegpr_31);
-+EXPORT_SYMBOL(_restgpr_14);
-+EXPORT_SYMBOL(_restgpr_15);
-+EXPORT_SYMBOL(_restgpr_16);
-+EXPORT_SYMBOL(_restgpr_17);
-+EXPORT_SYMBOL(_restgpr_18);
-+EXPORT_SYMBOL(_restgpr_19);
-+EXPORT_SYMBOL(_restgpr_20);
-+EXPORT_SYMBOL(_restgpr_21);
-+EXPORT_SYMBOL(_restgpr_22);
-+EXPORT_SYMBOL(_restgpr_23);
-+EXPORT_SYMBOL(_restgpr_24);
-+EXPORT_SYMBOL(_restgpr_25);
-+EXPORT_SYMBOL(_restgpr_26);
-+EXPORT_SYMBOL(_restgpr_27);
-+EXPORT_SYMBOL(_restgpr_28);
-+EXPORT_SYMBOL(_restgpr_29);
-+EXPORT_SYMBOL(_restgpr_30);
-+EXPORT_SYMBOL(_restgpr_31);
-+EXPORT_SYMBOL(_restgpr_14_x);
-+EXPORT_SYMBOL(_restgpr_15_x);
-+EXPORT_SYMBOL(_restgpr_16_x);
-+EXPORT_SYMBOL(_restgpr_17_x);
-+EXPORT_SYMBOL(_restgpr_18_x);
-+EXPORT_SYMBOL(_restgpr_19_x);
-+EXPORT_SYMBOL(_restgpr_20_x);
-+EXPORT_SYMBOL(_restgpr_21_x);
-+EXPORT_SYMBOL(_restgpr_22_x);
-+EXPORT_SYMBOL(_restgpr_23_x);
-+EXPORT_SYMBOL(_restgpr_24_x);
-+EXPORT_SYMBOL(_restgpr_25_x);
-+EXPORT_SYMBOL(_restgpr_26_x);
-+EXPORT_SYMBOL(_restgpr_27_x);
-+EXPORT_SYMBOL(_restgpr_28_x);
-+EXPORT_SYMBOL(_restgpr_29_x);
-+EXPORT_SYMBOL(_restgpr_30_x);
-+EXPORT_SYMBOL(_restgpr_31_x);
-+#endif /* CONFIG_PPC32 && CONFIG_CC_OPTIMIZE_FOR_SIZE */
+++ /dev/null
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -14,6 +14,7 @@
- #include <linux/list.h>
- #include <linux/init.h>
- #include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
- #include <linux/buffer_head.h>
- #include <linux/mutex.h>
- #include <linux/mount.h>
-@@ -232,10 +233,11 @@ static void block2mtd_free_device(struct
-
-
- /* FIXME: ensure that mtd->size % erase_size == 0 */
--static struct block2mtd_dev *add_device(char *devname, int erase_size)
-+static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
- {
- struct block_device *bdev;
- struct block2mtd_dev *dev;
-+ struct mtd_partition *part;
- char *name;
-
- if (!devname)
-@@ -273,17 +275,17 @@ static struct block2mtd_dev *add_device(
-
- mutex_init(&dev->write_mutex);
-
-- /* Setup the MTD structure */
-- /* make the name contain the block device in */
-- name = kmalloc(sizeof("block2mtd: ") + strlen(devname) + 1,
-- GFP_KERNEL);
-+ if (!mtdname)
-+ mtdname = devname;
-+
-+ name = kmalloc(strlen(mtdname) + 1, GFP_KERNEL);
- if (!name)
- goto devinit_err;
-
-- sprintf(name, "block2mtd: %s", devname);
-+ strcpy(name, mtdname);
- dev->mtd.name = name;
-
-- dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
-+ dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK & ~(erase_size - 1);
- dev->mtd.erasesize = erase_size;
- dev->mtd.writesize = 1;
- dev->mtd.type = MTD_RAM;
-@@ -296,14 +298,17 @@ static struct block2mtd_dev *add_device(
- dev->mtd.priv = dev;
- dev->mtd.owner = THIS_MODULE;
-
-- if (add_mtd_device(&dev->mtd)) {
-+ part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
-+ part->name = dev->mtd.name;
-+ part->offset = 0;
-+ part->size = dev->mtd.size;
-+ if (add_mtd_partitions(&dev->mtd, part, 1)) {
- /* Device didnt get added, so free the entry */
- goto devinit_err;
- }
- list_add(&dev->list, &blkmtd_device_list);
- INFO("mtd%d: [%s] erase_size = %dKiB [%d]", dev->mtd.index,
-- dev->mtd.name + strlen("block2mtd: "),
-- dev->mtd.erasesize >> 10, dev->mtd.erasesize);
-+ mtdname, dev->mtd.erasesize >> 10, dev->mtd.erasesize);
- return dev;
-
- devinit_err:
-@@ -376,9 +381,9 @@ static char block2mtd_paramline[80 + 12]
-
- static int block2mtd_setup2(const char *val)
- {
-- char buf[80 + 12]; /* 80 for device, 12 for erase size */
-+ char buf[80 + 12 + 80]; /* 80 for device, 12 for erase size, 80 for name */
- char *str = buf;
-- char *token[2];
-+ char *token[3];
- char *name;
- size_t erase_size = PAGE_SIZE;
- int i, ret;
-@@ -389,7 +394,7 @@ static int block2mtd_setup2(const char *
- strcpy(str, val);
- kill_final_newline(str);
-
-- for (i = 0; i < 2; i++)
-+ for (i = 0; i < 3; i++)
- token[i] = strsep(&str, ",");
-
- if (str)
-@@ -408,8 +413,10 @@ static int block2mtd_setup2(const char *
- parse_err("illegal erase size");
- }
- }
-+ if (token[2] && (strlen(token[2]) + 1 > 80))
-+ parse_err("mtd device name too long");
-
-- add_device(name, erase_size);
-+ add_device(name, erase_size, token[2]);
-
- return 0;
- }
-@@ -443,7 +450,7 @@ static int block2mtd_setup(const char *v
-
-
- module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
--MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>]\"");
-+MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>]]\"");
-
- static int __init block2mtd_init(void)
- {
---- a/fs/partitions/check.c
-+++ b/fs/partitions/check.c
-@@ -625,6 +625,7 @@ try_scan:
- kfree(state);
- return 0;
- }
-+EXPORT_SYMBOL(rescan_partitions);
-
- unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p)
- {
+++ /dev/null
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -53,6 +53,16 @@ config MTD_PARTITIONS
- devices. Partitioning on NFTL 'devices' is a different - that's the
- 'normal' form of partitioning used on a block device.
-
-+config MTD_ROOTFS_ROOT_DEV
-+ bool "Automatically set 'rootfs' partition to be root filesystem"
-+ depends on MTD_PARTITIONS
-+ default y
-+
-+config MTD_ROOTFS_SPLIT
-+ bool "Automatically split 'rootfs' partition for squashfs"
-+ depends on MTD_PARTITIONS
-+ default y
-+
- config MTD_REDBOOT_PARTS
- tristate "RedBoot partition table parsing"
- depends on MTD_PARTITIONS
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -18,6 +18,8 @@
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/partitions.h>
- #include <linux/mtd/compatmac.h>
-+#include <linux/root_dev.h>
-+#include <linux/magic.h>
-
- /* Our partition linked list */
- static LIST_HEAD(mtd_partitions);
-@@ -35,7 +37,7 @@ struct mtd_part {
- * the pointer to that structure with this macro.
- */
- #define PART(x) ((struct mtd_part *)(x))
--
-+#define IS_PART(mtd) (mtd->read == part_read)
-
- /*
- * MTD methods which simply translate the effective address and pass through
-@@ -503,6 +505,150 @@ out_register:
- return slave;
- }
-
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+#define ROOTFS_SPLIT_NAME "rootfs_data"
-+#define ROOTFS_REMOVED_NAME "<removed>"
-+
-+struct squashfs_super_block {
-+ __le32 s_magic;
-+ __le32 pad0[9];
-+ __le64 bytes_used;
-+};
-+
-+
-+static int split_squashfs(struct mtd_info *master, int offset, int *split_offset)
-+{
-+ struct squashfs_super_block sb;
-+ int len, ret;
-+
-+ ret = master->read(master, offset, sizeof(sb), &len, (void *) &sb);
-+ if (ret || (len != sizeof(sb))) {
-+ printk(KERN_ALERT "split_squashfs: error occured while reading "
-+ "from \"%s\"\n", master->name);
-+ return -EINVAL;
-+ }
-+
-+ if (SQUASHFS_MAGIC != le32_to_cpu(sb.s_magic) ) {
-+ printk(KERN_ALERT "split_squashfs: no squashfs found in \"%s\"\n",
-+ master->name);
-+ *split_offset = 0;
-+ return 0;
-+ }
-+
-+ if (le64_to_cpu((sb.bytes_used)) <= 0) {
-+ printk(KERN_ALERT "split_squashfs: squashfs is empty in \"%s\"\n",
-+ master->name);
-+ *split_offset = 0;
-+ return 0;
-+ }
-+
-+ len = (u32) le64_to_cpu(sb.bytes_used);
-+ len += (offset & 0x000fffff);
-+ len += (master->erasesize - 1);
-+ len &= ~(master->erasesize - 1);
-+ len -= (offset & 0x000fffff);
-+ *split_offset = offset + len;
-+
-+ return 0;
-+}
-+
-+static int split_rootfs_data(struct mtd_info *master, struct mtd_info *rpart, const struct mtd_partition *part)
-+{
-+ struct mtd_partition *dpart;
-+ struct mtd_part *slave = NULL;
-+ int split_offset = 0;
-+ int ret;
-+
-+ ret = split_squashfs(master, part->offset, &split_offset);
-+ if (ret)
-+ return ret;
-+
-+ if (split_offset <= 0)
-+ return 0;
-+
-+ dpart = kmalloc(sizeof(*part)+sizeof(ROOTFS_SPLIT_NAME)+1, GFP_KERNEL);
-+ if (dpart == NULL) {
-+ printk(KERN_INFO "split_squashfs: no memory for partition \"%s\"\n",
-+ ROOTFS_SPLIT_NAME);
-+ return -ENOMEM;
-+ }
-+
-+ memcpy(dpart, part, sizeof(*part));
-+ dpart->name = (unsigned char *)&dpart[1];
-+ strcpy(dpart->name, ROOTFS_SPLIT_NAME);
-+
-+ dpart->size -= split_offset - dpart->offset;
-+ dpart->offset = split_offset;
-+
-+ if (dpart == NULL)
-+ return 1;
-+
-+ printk(KERN_INFO "mtd: partition \"%s\" created automatically, ofs=%llX, len=%llX \n",
-+ ROOTFS_SPLIT_NAME, dpart->offset, dpart->size);
-+
-+ slave = add_one_partition(master, dpart, 0, split_offset);
-+ if (!slave) {
-+ kfree(dpart);
-+ return -ENOMEM;
-+ }
-+ rpart->split = &slave->mtd;
-+
-+ return 0;
-+}
-+
-+static int refresh_rootfs_split(struct mtd_info *mtd)
-+{
-+ struct mtd_partition tpart;
-+ struct mtd_part *part;
-+ char *name;
-+ //int index = 0;
-+ int offset, size;
-+ int ret;
-+
-+ part = PART(mtd);
-+
-+ /* check for the new squashfs offset first */
-+ ret = split_squashfs(part->master, part->offset, &offset);
-+ if (ret)
-+ return ret;
-+
-+ if ((offset > 0) && !mtd->split) {
-+ printk(KERN_INFO "%s: creating new split partition for \"%s\"\n", __func__, mtd->name);
-+ /* if we don't have a rootfs split partition, create a new one */
-+ tpart.name = (char *) mtd->name;
-+ tpart.size = mtd->size;
-+ tpart.offset = part->offset;
-+
-+ return split_rootfs_data(part->master, &part->mtd, &tpart);
-+ } else if ((offset > 0) && mtd->split) {
-+ /* update the offsets of the existing partition */
-+ size = mtd->size + part->offset - offset;
-+
-+ part = PART(mtd->split);
-+ part->offset = offset;
-+ part->mtd.size = size;
-+ printk(KERN_INFO "%s: %s partition \"" ROOTFS_SPLIT_NAME "\", offset: 0x%06x (0x%06x)\n",
-+ __func__, (!strcmp(part->mtd.name, ROOTFS_SPLIT_NAME) ? "updating" : "creating"),
-+ (u32) part->offset, (u32) part->mtd.size);
-+ name = kmalloc(sizeof(ROOTFS_SPLIT_NAME) + 1, GFP_KERNEL);
-+ strcpy(name, ROOTFS_SPLIT_NAME);
-+ part->mtd.name = name;
-+ } else if ((offset <= 0) && mtd->split) {
-+ printk(KERN_INFO "%s: removing partition \"%s\"\n", __func__, mtd->split->name);
-+
-+ /* mark existing partition as removed */
-+ part = PART(mtd->split);
-+ name = kmalloc(sizeof(ROOTFS_SPLIT_NAME) + 1, GFP_KERNEL);
-+ strcpy(name, ROOTFS_REMOVED_NAME);
-+ part->mtd.name = name;
-+ part->offset = 0;
-+ part->mtd.size = 0;
-+ }
-+
-+ return 0;
-+}
-+#endif /* CONFIG_MTD_ROOTFS_SPLIT */
-+
- /*
- * This function, given a master MTD object and a partition table, creates
- * and registers slave MTD objects which are bound to the master according to
-@@ -518,7 +664,7 @@ int add_mtd_partitions(struct mtd_info *
- {
- struct mtd_part *slave;
- uint64_t cur_offset = 0;
-- int i;
-+ int i, ret;
-
- printk(KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name);
-
-@@ -526,6 +672,21 @@ int add_mtd_partitions(struct mtd_info *
- slave = add_one_partition(master, parts + i, i, cur_offset);
- if (!slave)
- return -ENOMEM;
-+
-+ if (!strcmp(parts[i].name, "rootfs")) {
-+#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV
-+ if (ROOT_DEV == 0) {
-+ printk(KERN_NOTICE "mtd: partition \"rootfs\" "
-+ "set to be root filesystem\n");
-+ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, slave->mtd.index);
-+ }
-+#endif
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+ ret = split_rootfs_data(master, &slave->mtd, &parts[i]);
-+ /* if (ret == 0)
-+ j++; */
-+#endif
-+ }
- cur_offset = slave->offset + slave->mtd.size;
- }
-
-@@ -533,6 +694,32 @@ int add_mtd_partitions(struct mtd_info *
- }
- EXPORT_SYMBOL(add_mtd_partitions);
-
-+int refresh_mtd_partitions(struct mtd_info *mtd)
-+{
-+ int ret = 0;
-+
-+ if (IS_PART(mtd)) {
-+ struct mtd_part *part;
-+ struct mtd_info *master;
-+
-+ part = PART(mtd);
-+ master = part->master;
-+ if (master->refresh_device)
-+ ret = master->refresh_device(master);
-+ }
-+
-+ if (!ret && mtd->refresh_device)
-+ ret = mtd->refresh_device(mtd);
-+
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+ if (!ret && IS_PART(mtd) && !strcmp(mtd->name, "rootfs"))
-+ refresh_rootfs_split(mtd);
-+#endif
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(refresh_mtd_partitions);
-+
- static DEFINE_SPINLOCK(part_parser_lock);
- static LIST_HEAD(part_parsers);
-
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -29,6 +29,8 @@ struct block2mtd_dev {
- struct block_device *blkdev;
- struct mtd_info mtd;
- struct mutex write_mutex;
-+ rwlock_t bdev_mutex;
-+ char devname[0];
- };
-
-
-@@ -81,6 +83,12 @@ static int block2mtd_erase(struct mtd_in
- size_t len = instr->len;
- int err;
-
-+ read_lock(&dev->bdev_mutex);
-+ if (!dev->blkdev) {
-+ err = -EINVAL;
-+ goto done;
-+ }
-+
- instr->state = MTD_ERASING;
- mutex_lock(&dev->write_mutex);
- err = _block2mtd_erase(dev, from, len);
-@@ -93,6 +101,10 @@ static int block2mtd_erase(struct mtd_in
-
- instr->state = MTD_ERASE_DONE;
- mtd_erase_callback(instr);
-+
-+done:
-+ read_unlock(&dev->bdev_mutex);
-+
- return err;
- }
-
-@@ -104,10 +116,14 @@ static int block2mtd_read(struct mtd_inf
- struct page *page;
- int index = from >> PAGE_SHIFT;
- int offset = from & (PAGE_SIZE-1);
-- int cpylen;
-+ int cpylen, err = 0;
-+
-+ read_lock(&dev->bdev_mutex);
-+ if (!dev->blkdev || (from > mtd->size)) {
-+ err = -EINVAL;
-+ goto done;
-+ }
-
-- if (from > mtd->size)
-- return -EINVAL;
- if (from + len > mtd->size)
- len = mtd->size - from;
-
-@@ -122,10 +138,14 @@ static int block2mtd_read(struct mtd_inf
- len = len - cpylen;
-
- page = page_read(dev->blkdev->bd_inode->i_mapping, index);
-- if (!page)
-- return -ENOMEM;
-- if (IS_ERR(page))
-- return PTR_ERR(page);
-+ if (!page) {
-+ err = -ENOMEM;
-+ goto done;
-+ }
-+ if (IS_ERR(page)) {
-+ err = PTR_ERR(page);
-+ goto done;
-+ }
-
- memcpy(buf, page_address(page) + offset, cpylen);
- page_cache_release(page);
-@@ -136,7 +156,10 @@ static int block2mtd_read(struct mtd_inf
- offset = 0;
- index++;
- }
-- return 0;
-+
-+done:
-+ read_unlock(&dev->bdev_mutex);
-+ return err;
- }
-
-
-@@ -188,12 +211,22 @@ static int block2mtd_write(struct mtd_in
- size_t *retlen, const u_char *buf)
- {
- struct block2mtd_dev *dev = mtd->priv;
-- int err;
-+ int err = 0;
-+
-+ read_lock(&dev->bdev_mutex);
-+ if (!dev->blkdev) {
-+ err = -EINVAL;
-+ goto done;
-+ }
-
- if (!len)
-- return 0;
-- if (to >= mtd->size)
-- return -ENOSPC;
-+ goto done;
-+
-+ if (to >= mtd->size) {
-+ err = -ENOSPC;
-+ goto done;
-+ }
-+
- if (to + len > mtd->size)
- len = mtd->size - to;
-
-@@ -202,6 +235,9 @@ static int block2mtd_write(struct mtd_in
- mutex_unlock(&dev->write_mutex);
- if (err > 0)
- err = 0;
-+
-+done:
-+ read_unlock(&dev->bdev_mutex);
- return err;
- }
-
-@@ -210,52 +246,29 @@ static int block2mtd_write(struct mtd_in
- static void block2mtd_sync(struct mtd_info *mtd)
- {
- struct block2mtd_dev *dev = mtd->priv;
-- sync_blockdev(dev->blkdev);
-- return;
--}
--
--
--static void block2mtd_free_device(struct block2mtd_dev *dev)
--{
-- if (!dev)
-- return;
--
-- kfree(dev->mtd.name);
-
-- if (dev->blkdev) {
-- invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
-- 0, -1);
-- close_bdev_exclusive(dev->blkdev, FMODE_READ|FMODE_WRITE);
-- }
-+ read_lock(&dev->bdev_mutex);
-+ if (dev->blkdev)
-+ sync_blockdev(dev->blkdev);
-+ read_unlock(&dev->bdev_mutex);
-
-- kfree(dev);
-+ return;
- }
-
-
--/* FIXME: ensure that mtd->size % erase_size == 0 */
--static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
-+static int _open_bdev(struct block2mtd_dev *dev)
- {
- struct block_device *bdev;
-- struct block2mtd_dev *dev;
-- struct mtd_partition *part;
-- char *name;
--
-- if (!devname)
-- return NULL;
--
-- dev = kzalloc(sizeof(struct block2mtd_dev), GFP_KERNEL);
-- if (!dev)
-- return NULL;
-
- /* Get a handle on the device */
-- bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, NULL);
-+ bdev = open_bdev_exclusive(dev->devname, FMODE_READ|FMODE_WRITE, NULL);
- #ifndef MODULE
- if (IS_ERR(bdev)) {
-
- /* We might not have rootfs mounted at this point. Try
- to resolve the device name by other means. */
-
-- dev_t devt = name_to_dev_t(devname);
-+ dev_t devt = name_to_dev_t(dev->devname);
- if (devt) {
- bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
- }
-@@ -263,17 +276,98 @@ static struct block2mtd_dev *add_device(
- #endif
-
- if (IS_ERR(bdev)) {
-- ERROR("error: cannot open device %s", devname);
-- goto devinit_err;
-+ ERROR("error: cannot open device %s", dev->devname);
-+ return 1;
- }
- dev->blkdev = bdev;
-
- if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) {
- ERROR("attempting to use an MTD device as a block device");
-- goto devinit_err;
-+ return 1;
- }
-
-+ return 0;
-+}
-+
-+static void _close_bdev(struct block2mtd_dev *dev)
-+{
-+ struct block_device *bdev;
-+
-+ if (!dev->blkdev)
-+ return;
-+
-+ bdev = dev->blkdev;
-+ invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, 0, -1);
-+ close_bdev_exclusive(dev->blkdev, FMODE_READ|FMODE_WRITE);
-+ dev->blkdev = NULL;
-+}
-+
-+static void block2mtd_free_device(struct block2mtd_dev *dev)
-+{
-+ if (!dev)
-+ return;
-+
-+ kfree(dev->mtd.name);
-+ _close_bdev(dev);
-+ kfree(dev);
-+}
-+
-+
-+static int block2mtd_refresh(struct mtd_info *mtd)
-+{
-+ struct block2mtd_dev *dev = mtd->priv;
-+ struct block_device *bdev;
-+ dev_t devt;
-+ int err = 0;
-+
-+ /* no other mtd function can run at this point */
-+ write_lock(&dev->bdev_mutex);
-+
-+ /* get the device number for the whole disk */
-+ devt = MKDEV(MAJOR(dev->blkdev->bd_dev), 0);
-+
-+ /* close the old block device */
-+ _close_bdev(dev);
-+
-+ /* open the whole disk, issue a partition rescan, then */
-+ bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
-+ if (!bdev || !bdev->bd_disk)
-+ err = -EINVAL;
-+#ifndef CONFIG_MTD_BLOCK2MTD_MODULE
-+ else
-+ err = rescan_partitions(bdev->bd_disk, bdev);
-+#endif
-+ if (bdev)
-+ close_bdev_exclusive(bdev, FMODE_READ|FMODE_WRITE);
-+
-+ /* try to open the partition block device again */
-+ _open_bdev(dev);
-+ write_unlock(&dev->bdev_mutex);
-+
-+ return err;
-+}
-+
-+/* FIXME: ensure that mtd->size % erase_size == 0 */
-+static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname)
-+{
-+ struct block2mtd_dev *dev;
-+ struct mtd_partition *part;
-+ char *name;
-+
-+ if (!devname)
-+ return NULL;
-+
-+ dev = kzalloc(sizeof(struct block2mtd_dev) + strlen(devname) + 1, GFP_KERNEL);
-+ if (!dev)
-+ return NULL;
-+
-+ strcpy(dev->devname, devname);
-+
-+ if (_open_bdev(dev))
-+ goto devinit_err;
-+
- mutex_init(&dev->write_mutex);
-+ rwlock_init(&dev->bdev_mutex);
-
- if (!mtdname)
- mtdname = devname;
-@@ -297,6 +391,7 @@ static struct block2mtd_dev *add_device(
- dev->mtd.read = block2mtd_read;
- dev->mtd.priv = dev;
- dev->mtd.owner = THIS_MODULE;
-+ dev->mtd.refresh_device = block2mtd_refresh;
-
- part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
- part->name = dev->mtd.name;
---- a/drivers/mtd/mtdchar.c
-+++ b/drivers/mtd/mtdchar.c
-@@ -18,6 +18,7 @@
-
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/compatmac.h>
-+#include <linux/mtd/partitions.h>
-
- #include <asm/uaccess.h>
-
-@@ -814,6 +815,13 @@ static int mtd_ioctl(struct inode *inode
- file->f_pos = 0;
- break;
- }
-+#ifdef CONFIG_MTD_PARTITIONS
-+ case MTDREFRESH:
-+ {
-+ ret = refresh_mtd_partitions(mtd);
-+ break;
-+ }
-+#endif
-
- default:
- ret = -ENOTTY;
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -101,6 +101,7 @@ struct mtd_oob_ops {
- uint8_t *oobbuf;
- };
-
-+struct mtd_info;
- struct mtd_info {
- u_char type;
- uint32_t flags;
-@@ -241,6 +242,9 @@ struct mtd_info {
- struct device dev;
- int usecount;
-
-+ int (*refresh_device)(struct mtd_info *mtd);
-+ struct mtd_info *split;
-+
- /* If the driver is something smart, like UBI, it may need to maintain
- * its own reference counting. The below functions are only for driver.
- * The driver may register its callbacks. These callbacks are not
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -34,12 +34,14 @@
- * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK).
- */
-
-+struct mtd_partition;
- struct mtd_partition {
- char *name; /* identifier string */
- uint64_t size; /* partition size */
- uint64_t offset; /* offset within the master MTD space */
- uint32_t mask_flags; /* master MTD flags to mask out for this partition */
- struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/
-+ int (*refresh_partition)(struct mtd_info *);
- };
-
- #define MTDPART_OFS_NXTBLK (-2)
-@@ -51,6 +53,7 @@ struct mtd_info;
-
- int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
- int del_mtd_partitions(struct mtd_info *);
-+int refresh_mtd_partitions(struct mtd_info *);
-
- /*
- * Functions dealing with the various ways of partitioning the space
---- a/include/mtd/mtd-abi.h
-+++ b/include/mtd/mtd-abi.h
-@@ -110,6 +110,7 @@ struct otp_info {
- #define MEMERASE64 _IOW('M', 20, struct erase_info_user64)
- #define MEMWRITEOOB64 _IOWR('M', 21, struct mtd_oob_buf64)
- #define MEMREADOOB64 _IOWR('M', 22, struct mtd_oob_buf64)
-+#define MTDREFRESH _IO('M', 23)
-
- /*
- * Obsolete legacy interface. Keep it in order not to break userspace
+++ /dev/null
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -268,6 +268,7 @@ static int _open_bdev(struct block2mtd_d
- /* We might not have rootfs mounted at this point. Try
- to resolve the device name by other means. */
-
-+ wait_for_device_probe();
- dev_t devt = name_to_dev_t(dev->devname);
- if (devt) {
- bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
+++ /dev/null
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -249,14 +249,21 @@ static int parse_redboot_partitions(stru
- #endif
- names += strlen(names)+1;
-
--#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
- if(fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_base) {
-- i++;
-- parts[i].offset = parts[i-1].size + parts[i-1].offset;
-- parts[i].size = fl->next->img->flash_base - parts[i].offset;
-- parts[i].name = nullname;
-- }
-+ if (!strcmp(parts[i].name, "rootfs")) {
-+ parts[i].size = fl->next->img->flash_base;
-+ parts[i].size &= ~(master->erasesize - 1);
-+ parts[i].size -= parts[i].offset;
-+#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
-+ nrparts--;
-+ } else {
-+ i++;
-+ parts[i].offset = parts[i-1].size + parts[i-1].offset;
-+ parts[i].size = fl->next->img->flash_base - parts[i].offset;
-+ parts[i].name = nullname;
- #endif
-+ }
-+ }
- tmp_fl = fl;
- fl = fl->next;
- kfree(tmp_fl);
+++ /dev/null
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -11,6 +11,8 @@
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/partitions.h>
-
-+#define BOARD_CONFIG_PART "boardconfig"
-+
- struct fis_image_desc {
- unsigned char name[16]; // Null terminated name
- uint32_t flash_base; // Address within FLASH of image
-@@ -41,6 +43,7 @@ static int parse_redboot_partitions(stru
- struct mtd_partition **pparts,
- unsigned long fis_origin)
- {
-+ unsigned long max_offset = 0;
- int nrparts = 0;
- struct fis_image_desc *buf;
- struct mtd_partition *parts;
-@@ -209,14 +212,14 @@ static int parse_redboot_partitions(stru
- }
- }
- #endif
-- parts = kzalloc(sizeof(*parts)*nrparts + nulllen + namelen, GFP_KERNEL);
-+ parts = kzalloc(sizeof(*parts) * (nrparts + 1) + nulllen + namelen + sizeof(BOARD_CONFIG_PART), GFP_KERNEL);
-
- if (!parts) {
- ret = -ENOMEM;
- goto out;
- }
-
-- nullname = (char *)&parts[nrparts];
-+ nullname = (char *)&parts[nrparts + 1];
- #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
- if (nulllen > 0) {
- strcpy(nullname, nullstring);
-@@ -235,6 +238,8 @@ static int parse_redboot_partitions(stru
- }
- #endif
- for ( ; i<nrparts; i++) {
-+ if(max_offset < buf[i].flash_base + buf[i].size)
-+ max_offset = buf[i].flash_base + buf[i].size;
- parts[i].size = fl->img->size;
- parts[i].offset = fl->img->flash_base;
- parts[i].name = names;
-@@ -268,6 +273,14 @@ static int parse_redboot_partitions(stru
- fl = fl->next;
- kfree(tmp_fl);
- }
-+ if(master->size - max_offset >= master->erasesize)
-+ {
-+ parts[nrparts].size = master->size - max_offset;
-+ parts[nrparts].offset = max_offset;
-+ parts[nrparts].name = names;
-+ strcpy(names, BOARD_CONFIG_PART);
-+ nrparts++;
-+ }
- ret = nrparts;
- *pparts = parts;
- out:
+++ /dev/null
---- a/include/linux/mtd/nand.h
-+++ b/include/linux/mtd/nand.h
-@@ -491,6 +491,7 @@ struct platform_nand_chip {
- int chip_delay;
- unsigned int options;
- const char **part_probe_types;
-+ int (*chip_fixup)(struct mtd_info *mtd);
- void (*set_parts)(uint64_t size,
- struct platform_nand_chip *chip);
- void *priv;
---- a/drivers/mtd/nand/plat_nand.c
-+++ b/drivers/mtd/nand/plat_nand.c
-@@ -91,7 +91,18 @@ static int __devinit plat_nand_probe(str
- }
-
- /* Scan to find existance of the device */
-- if (nand_scan(&data->mtd, 1)) {
-+ if (nand_scan_ident(&data->mtd, 1)) {
-+ res = -ENXIO;
-+ goto out;
-+ }
-+
-+ if (pdata->chip.chip_fixup) {
-+ res = pdata->chip.chip_fixup(&data->mtd);
-+ if (res)
-+ goto out;
-+ }
-+
-+ if (nand_scan_tail(&data->mtd)) {
- err = -ENXIO;
- goto out;
- }
+++ /dev/null
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -181,6 +181,22 @@ config MTD_AR7_PARTS
- ---help---
- TI AR7 partitioning support
-
-+config MTD_MYLOADER_PARTS
-+ tristate "MyLoader partition parsing"
-+ depends on MTD_PARTITIONS && (ADM5120 || ATHEROS_AR231X || ATHEROS_AR71XX)
-+ ---help---
-+ MyLoader is a bootloader which allows the user to define partitions
-+ in flash devices, by putting a table in the second erase block
-+ on the device, similar to a partition table. This table gives the
-+ offsets and lengths of the user defined partitions.
-+
-+ If you need code which can detect and parse these tables, and
-+ register MTD 'partitions' corresponding to each image detected,
-+ enable this option.
-+
-+ You will still need the parsing functions to be called by the driver
-+ for your particular device. It won't happen automatically.
-+
- comment "User Modules And Translation Layers"
-
- config MTD_CHAR
---- a/drivers/mtd/Makefile
-+++ b/drivers/mtd/Makefile
-@@ -13,6 +13,7 @@ obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdli
- obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
- obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o
- obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
-+obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
-
- # 'Users' - code which presents functionality to userspace.
- obj-$(CONFIG_MTD_CHAR) += mtdchar.o
+++ /dev/null
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -33,6 +33,7 @@
- * Note: writeable partitions require their size and offset be
- * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK).
- */
-+struct mtd_info;
-
- struct mtd_partition;
- struct mtd_partition {
-@@ -49,7 +50,6 @@ struct mtd_partition {
- #define MTDPART_SIZ_FULL (0)
-
-
--struct mtd_info;
-
- int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
- int del_mtd_partitions(struct mtd_info *);
+++ /dev/null
---- a/drivers/mtd/nand/nand_ecc.c
-+++ b/drivers/mtd/nand/nand_ecc.c
-@@ -507,8 +507,7 @@ int __nand_correct_data(unsigned char *b
- if ((bitsperbyte[b0] + bitsperbyte[b1] + bitsperbyte[b2]) == 1)
- return 1; /* error in ecc data; no action needed */
-
-- printk(KERN_ERR "uncorrectable error : ");
-- return -1;
-+ return -EBADMSG;
- }
- EXPORT_SYMBOL(__nand_correct_data);
-
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -645,6 +645,10 @@ static const struct spi_device_id m25p_i
- { "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
- { "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
-
-+ /* PMC -- pm25x "blocks" are 32K, sectors are 4K */
-+ { "pm25lv512", INFO(0, 0, 32 * 1024, 2, SECT_4K) },
-+ { "pm25lv010", INFO(0, 0, 32 * 1024, 4, SECT_4K) },
-+
- /* Spansion -- single (large) sector size only, at least
- * for the chips listed here (without boot sectors).
- */
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -645,6 +645,10 @@ static const struct spi_device_id m25p_i
- { "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
- { "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
-
-+ /* EON -- en25pxx */
-+ { "en25p32", INFO(0x1c2016, 0, 64 * 1024, 64, 0) },
-+ { "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) },
-+
- /* PMC -- pm25x "blocks" are 32K, sectors are 4K */
- { "pm25lv512", INFO(0, 0, 32 * 1024, 2, SECT_4K) },
- { "pm25lv010", INFO(0, 0, 32 * 1024, 4, SECT_4K) },
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -649,6 +649,11 @@ static const struct spi_device_id m25p_i
- { "en25p32", INFO(0x1c2016, 0, 64 * 1024, 64, 0) },
- { "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) },
-
-+ /* Numonyx -- xxxs33b */
-+ { "160s33b", INFO(0x898911, 0, 64 * 1024, 64, 0) },
-+ { "320s33b", INFO(0x898912, 0, 64 * 1024, 128, 0) },
-+ { "640s33b", INFO(0x898913, 0, 64 * 1024, 256, 0) },
-+
- /* PMC -- pm25x "blocks" are 32K, sectors are 4K */
- { "pm25lv512", INFO(0, 0, 32 * 1024, 2, SECT_4K) },
- { "pm25lv010", INFO(0, 0, 32 * 1024, 4, SECT_4K) },
-@@ -833,11 +838,12 @@ static int __devinit m25p_probe(struct s
- dev_set_drvdata(&spi->dev, flash);
-
- /*
-- * Atmel and SST serial flash tend to power
-+ * Atmel, SST and Intel/Numonyx serial flash tend to power
- * up with the software protection bits set
- */
-
- if (info->jedec_id >> 16 == 0x1f ||
-+ info->jedec_id >> 16 == 0x89 ||
- info->jedec_id >> 16 == 0xbf) {
- write_enable(flash);
- write_sr(flash, 0);
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -706,6 +706,7 @@ static const struct spi_device_id m25p_i
- { "w25x80", INFO(0xef3014, 0, 64 * 1024, 16, SECT_4K) },
- { "w25x16", INFO(0xef3015, 0, 64 * 1024, 32, SECT_4K) },
- { "w25x32", INFO(0xef3016, 0, 64 * 1024, 64, SECT_4K) },
-+ { "w25q32", INFO(0xef4016, 0, 64 * 1024, 64, SECT_4K) },
- { "w25x64", INFO(0xef3017, 0, 64 * 1024, 128, SECT_4K) },
-
- /* Catalyst / On Semiconductor -- non-JEDEC */
+++ /dev/null
---- /dev/null
-+++ b/include/linux/netfilter/xt_layer7.h
-@@ -0,0 +1,13 @@
-+#ifndef _XT_LAYER7_H
-+#define _XT_LAYER7_H
-+
-+#define MAX_PATTERN_LEN 8192
-+#define MAX_PROTOCOL_LEN 256
-+
-+struct xt_layer7_info {
-+ char protocol[MAX_PROTOCOL_LEN];
-+ char pattern[MAX_PATTERN_LEN];
-+ u_int8_t invert;
-+};
-+
-+#endif /* _XT_LAYER7_H */
---- a/include/net/netfilter/nf_conntrack.h
-+++ b/include/net/netfilter/nf_conntrack.h
-@@ -116,6 +116,22 @@ struct nf_conn {
- u_int32_t secmark;
- #endif
-
-+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || \
-+ defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+ struct {
-+ /*
-+ * e.g. "http". NULL before decision. "unknown" after decision
-+ * if no match.
-+ */
-+ char *app_proto;
-+ /*
-+ * application layer data so far. NULL after match decision.
-+ */
-+ char *app_data;
-+ unsigned int app_data_len;
-+ } layer7;
-+#endif
-+
- /* Storage reserved for other modules: */
- union nf_conntrack_proto proto;
-
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -858,6 +858,27 @@ config NETFILTER_XT_MATCH_STATE
-
- To compile it as a module, choose M here. If unsure, say N.
-
-+config NETFILTER_XT_MATCH_LAYER7
-+ tristate '"layer7" match support'
-+ depends on NETFILTER_XTABLES
-+ depends on EXPERIMENTAL && (IP_NF_CONNTRACK || NF_CONNTRACK)
-+ depends on NF_CT_ACCT
-+ help
-+ Say Y if you want to be able to classify connections (and their
-+ packets) based on regular expression matching of their application
-+ layer data. This is one way to classify applications such as
-+ peer-to-peer filesharing systems that do not always use the same
-+ port.
-+
-+ To compile it as a module, choose M here. If unsure, say N.
-+
-+config NETFILTER_XT_MATCH_LAYER7_DEBUG
-+ bool 'Layer 7 debugging output'
-+ depends on NETFILTER_XT_MATCH_LAYER7
-+ help
-+ Say Y to get lots of debugging output.
-+
-+
- config NETFILTER_XT_MATCH_STATISTIC
- tristate '"statistic" match support'
- depends on NETFILTER_ADVANCED
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -89,6 +89,7 @@ obj-$(CONFIG_NETFILTER_XT_MATCH_RECENT)
- obj-$(CONFIG_NETFILTER_XT_MATCH_SCTP) += xt_sctp.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_SOCKET) += xt_socket.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STATE) += xt_state.o
-+obj-$(CONFIG_NETFILTER_XT_MATCH_LAYER7) += xt_layer7.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STATISTIC) += xt_statistic.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STRING) += xt_string.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_TCPMSS) += xt_tcpmss.o
---- a/net/netfilter/nf_conntrack_core.c
-+++ b/net/netfilter/nf_conntrack_core.c
-@@ -201,6 +201,14 @@ destroy_conntrack(struct nf_conntrack *n
- * too. */
- nf_ct_remove_expectations(ct);
-
-+ #if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+ if(ct->layer7.app_proto)
-+ kfree(ct->layer7.app_proto);
-+ if(ct->layer7.app_data)
-+ kfree(ct->layer7.app_data);
-+ #endif
-+
-+
- /* We overload first tuple to link into unconfirmed list. */
- if (!nf_ct_is_confirmed(ct)) {
- BUG_ON(hlist_nulls_unhashed(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode));
---- a/net/netfilter/nf_conntrack_standalone.c
-+++ b/net/netfilter/nf_conntrack_standalone.c
-@@ -171,6 +171,12 @@ static int ct_seq_show(struct seq_file *
- goto release;
- #endif
-
-+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+ if(ct->layer7.app_proto &&
-+ seq_printf(s, "l7proto=%s ", ct->layer7.app_proto))
-+ return -ENOSPC;
-+#endif
-+
- if (seq_printf(s, "use=%u\n", atomic_read(&ct->ct_general.use)))
- goto release;
-
---- /dev/null
-+++ b/net/netfilter/regexp/regexp.c
-@@ -0,0 +1,1197 @@
-+/*
-+ * regcomp and regexec -- regsub and regerror are elsewhere
-+ * @(#)regexp.c 1.3 of 18 April 87
-+ *
-+ * Copyright (c) 1986 by University of Toronto.
-+ * Written by Henry Spencer. Not derived from licensed software.
-+ *
-+ * Permission is granted to anyone to use this software for any
-+ * purpose on any computer system, and to redistribute it freely,
-+ * subject to the following restrictions:
-+ *
-+ * 1. The author is not responsible for the consequences of use of
-+ * this software, no matter how awful, even if they arise
-+ * from defects in it.
-+ *
-+ * 2. The origin of this software must not be misrepresented, either
-+ * by explicit claim or by omission.
-+ *
-+ * 3. Altered versions must be plainly marked as such, and must not
-+ * be misrepresented as being the original software.
-+ *
-+ * Beware that some of this code is subtly aware of the way operator
-+ * precedence is structured in regular expressions. Serious changes in
-+ * regular-expression syntax might require a total rethink.
-+ *
-+ * This code was modified by Ethan Sommer to work within the kernel
-+ * (it now uses kmalloc etc..)
-+ *
-+ * Modified slightly by Matthew Strait to use more modern C.
-+ */
-+
-+#include "regexp.h"
-+#include "regmagic.h"
-+
-+/* added by ethan and matt. Lets it work in both kernel and user space.
-+(So iptables can use it, for instance.) Yea, it goes both ways... */
-+#if __KERNEL__
-+ #define malloc(foo) kmalloc(foo,GFP_ATOMIC)
-+#else
-+ #define printk(format,args...) printf(format,##args)
-+#endif
-+
-+void regerror(char * s)
-+{
-+ printk("<3>Regexp: %s\n", s);
-+ /* NOTREACHED */
-+}
-+
-+/*
-+ * The "internal use only" fields in regexp.h are present to pass info from
-+ * compile to execute that permits the execute phase to run lots faster on
-+ * simple cases. They are:
-+ *
-+ * regstart char that must begin a match; '\0' if none obvious
-+ * reganch is the match anchored (at beginning-of-line only)?
-+ * regmust string (pointer into program) that match must include, or NULL
-+ * regmlen length of regmust string
-+ *
-+ * Regstart and reganch permit very fast decisions on suitable starting points
-+ * for a match, cutting down the work a lot. Regmust permits fast rejection
-+ * of lines that cannot possibly match. The regmust tests are costly enough
-+ * that regcomp() supplies a regmust only if the r.e. contains something
-+ * potentially expensive (at present, the only such thing detected is * or +
-+ * at the start of the r.e., which can involve a lot of backup). Regmlen is
-+ * supplied because the test in regexec() needs it and regcomp() is computing
-+ * it anyway.
-+ */
-+
-+/*
-+ * Structure for regexp "program". This is essentially a linear encoding
-+ * of a nondeterministic finite-state machine (aka syntax charts or
-+ * "railroad normal form" in parsing technology). Each node is an opcode
-+ * plus a "next" pointer, possibly plus an operand. "Next" pointers of
-+ * all nodes except BRANCH implement concatenation; a "next" pointer with
-+ * a BRANCH on both ends of it is connecting two alternatives. (Here we
-+ * have one of the subtle syntax dependencies: an individual BRANCH (as
-+ * opposed to a collection of them) is never concatenated with anything
-+ * because of operator precedence.) The operand of some types of node is
-+ * a literal string; for others, it is a node leading into a sub-FSM. In
-+ * particular, the operand of a BRANCH node is the first node of the branch.
-+ * (NB this is *not* a tree structure: the tail of the branch connects
-+ * to the thing following the set of BRANCHes.) The opcodes are:
-+ */
-+
-+/* definition number opnd? meaning */
-+#define END 0 /* no End of program. */
-+#define BOL 1 /* no Match "" at beginning of line. */
-+#define EOL 2 /* no Match "" at end of line. */
-+#define ANY 3 /* no Match any one character. */
-+#define ANYOF 4 /* str Match any character in this string. */
-+#define ANYBUT 5 /* str Match any character not in this string. */
-+#define BRANCH 6 /* node Match this alternative, or the next... */
-+#define BACK 7 /* no Match "", "next" ptr points backward. */
-+#define EXACTLY 8 /* str Match this string. */
-+#define NOTHING 9 /* no Match empty string. */
-+#define STAR 10 /* node Match this (simple) thing 0 or more times. */
-+#define PLUS 11 /* node Match this (simple) thing 1 or more times. */
-+#define OPEN 20 /* no Mark this point in input as start of #n. */
-+ /* OPEN+1 is number 1, etc. */
-+#define CLOSE 30 /* no Analogous to OPEN. */
-+
-+/*
-+ * Opcode notes:
-+ *
-+ * BRANCH The set of branches constituting a single choice are hooked
-+ * together with their "next" pointers, since precedence prevents
-+ * anything being concatenated to any individual branch. The
-+ * "next" pointer of the last BRANCH in a choice points to the
-+ * thing following the whole choice. This is also where the
-+ * final "next" pointer of each individual branch points; each
-+ * branch starts with the operand node of a BRANCH node.
-+ *
-+ * BACK Normal "next" pointers all implicitly point forward; BACK
-+ * exists to make loop structures possible.
-+ *
-+ * STAR,PLUS '?', and complex '*' and '+', are implemented as circular
-+ * BRANCH structures using BACK. Simple cases (one character
-+ * per match) are implemented with STAR and PLUS for speed
-+ * and to minimize recursive plunges.
-+ *
-+ * OPEN,CLOSE ...are numbered at compile time.
-+ */
-+
-+/*
-+ * A node is one char of opcode followed by two chars of "next" pointer.
-+ * "Next" pointers are stored as two 8-bit pieces, high order first. The
-+ * value is a positive offset from the opcode of the node containing it.
-+ * An operand, if any, simply follows the node. (Note that much of the
-+ * code generation knows about this implicit relationship.)
-+ *
-+ * Using two bytes for the "next" pointer is vast overkill for most things,
-+ * but allows patterns to get big without disasters.
-+ */
-+#define OP(p) (*(p))
-+#define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377))
-+#define OPERAND(p) ((p) + 3)
-+
-+/*
-+ * See regmagic.h for one further detail of program structure.
-+ */
-+
-+
-+/*
-+ * Utility definitions.
-+ */
-+#ifndef CHARBITS
-+#define UCHARAT(p) ((int)*(unsigned char *)(p))
-+#else
-+#define UCHARAT(p) ((int)*(p)&CHARBITS)
-+#endif
-+
-+#define FAIL(m) { regerror(m); return(NULL); }
-+#define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?')
-+#define META "^$.[()|?+*\\"
-+
-+/*
-+ * Flags to be passed up and down.
-+ */
-+#define HASWIDTH 01 /* Known never to match null string. */
-+#define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */
-+#define SPSTART 04 /* Starts with * or +. */
-+#define WORST 0 /* Worst case. */
-+
-+/*
-+ * Global work variables for regcomp().
-+ */
-+struct match_globals {
-+char *reginput; /* String-input pointer. */
-+char *regbol; /* Beginning of input, for ^ check. */
-+char **regstartp; /* Pointer to startp array. */
-+char **regendp; /* Ditto for endp. */
-+char *regparse; /* Input-scan pointer. */
-+int regnpar; /* () count. */
-+char regdummy;
-+char *regcode; /* Code-emit pointer; ®dummy = don't. */
-+long regsize; /* Code size. */
-+};
-+
-+/*
-+ * Forward declarations for regcomp()'s friends.
-+ */
-+#ifndef STATIC
-+#define STATIC static
-+#endif
-+STATIC char *reg(struct match_globals *g, int paren,int *flagp);
-+STATIC char *regbranch(struct match_globals *g, int *flagp);
-+STATIC char *regpiece(struct match_globals *g, int *flagp);
-+STATIC char *regatom(struct match_globals *g, int *flagp);
-+STATIC char *regnode(struct match_globals *g, char op);
-+STATIC char *regnext(struct match_globals *g, char *p);
-+STATIC void regc(struct match_globals *g, char b);
-+STATIC void reginsert(struct match_globals *g, char op, char *opnd);
-+STATIC void regtail(struct match_globals *g, char *p, char *val);
-+STATIC void regoptail(struct match_globals *g, char *p, char *val);
-+
-+
-+__kernel_size_t my_strcspn(const char *s1,const char *s2)
-+{
-+ char *scan1;
-+ char *scan2;
-+ int count;
-+
-+ count = 0;
-+ for (scan1 = (char *)s1; *scan1 != '\0'; scan1++) {
-+ for (scan2 = (char *)s2; *scan2 != '\0';) /* ++ moved down. */
-+ if (*scan1 == *scan2++)
-+ return(count);
-+ count++;
-+ }
-+ return(count);
-+}
-+
-+/*
-+ - regcomp - compile a regular expression into internal code
-+ *
-+ * We can't allocate space until we know how big the compiled form will be,
-+ * but we can't compile it (and thus know how big it is) until we've got a
-+ * place to put the code. So we cheat: we compile it twice, once with code
-+ * generation turned off and size counting turned on, and once "for real".
-+ * This also means that we don't allocate space until we are sure that the
-+ * thing really will compile successfully, and we never have to move the
-+ * code and thus invalidate pointers into it. (Note that it has to be in
-+ * one piece because free() must be able to free it all.)
-+ *
-+ * Beware that the optimization-preparation code in here knows about some
-+ * of the structure of the compiled regexp.
-+ */
-+regexp *
-+regcomp(char *exp,int *patternsize)
-+{
-+ register regexp *r;
-+ register char *scan;
-+ register char *longest;
-+ register int len;
-+ int flags;
-+ struct match_globals g;
-+
-+ /* commented out by ethan
-+ extern char *malloc();
-+ */
-+
-+ if (exp == NULL)
-+ FAIL("NULL argument");
-+
-+ /* First pass: determine size, legality. */
-+ g.regparse = exp;
-+ g.regnpar = 1;
-+ g.regsize = 0L;
-+ g.regcode = &g.regdummy;
-+ regc(&g, MAGIC);
-+ if (reg(&g, 0, &flags) == NULL)
-+ return(NULL);
-+
-+ /* Small enough for pointer-storage convention? */
-+ if (g.regsize >= 32767L) /* Probably could be 65535L. */
-+ FAIL("regexp too big");
-+
-+ /* Allocate space. */
-+ *patternsize=sizeof(regexp) + (unsigned)g.regsize;
-+ r = (regexp *)malloc(sizeof(regexp) + (unsigned)g.regsize);
-+ if (r == NULL)
-+ FAIL("out of space");
-+
-+ /* Second pass: emit code. */
-+ g.regparse = exp;
-+ g.regnpar = 1;
-+ g.regcode = r->program;
-+ regc(&g, MAGIC);
-+ if (reg(&g, 0, &flags) == NULL)
-+ return(NULL);
-+
-+ /* Dig out information for optimizations. */
-+ r->regstart = '\0'; /* Worst-case defaults. */
-+ r->reganch = 0;
-+ r->regmust = NULL;
-+ r->regmlen = 0;
-+ scan = r->program+1; /* First BRANCH. */
-+ if (OP(regnext(&g, scan)) == END) { /* Only one top-level choice. */
-+ scan = OPERAND(scan);
-+
-+ /* Starting-point info. */
-+ if (OP(scan) == EXACTLY)
-+ r->regstart = *OPERAND(scan);
-+ else if (OP(scan) == BOL)
-+ r->reganch++;
-+
-+ /*
-+ * If there's something expensive in the r.e., find the
-+ * longest literal string that must appear and make it the
-+ * regmust. Resolve ties in favor of later strings, since
-+ * the regstart check works with the beginning of the r.e.
-+ * and avoiding duplication strengthens checking. Not a
-+ * strong reason, but sufficient in the absence of others.
-+ */
-+ if (flags&SPSTART) {
-+ longest = NULL;
-+ len = 0;
-+ for (; scan != NULL; scan = regnext(&g, scan))
-+ if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) {
-+ longest = OPERAND(scan);
-+ len = strlen(OPERAND(scan));
-+ }
-+ r->regmust = longest;
-+ r->regmlen = len;
-+ }
-+ }
-+
-+ return(r);
-+}
-+
-+/*
-+ - reg - regular expression, i.e. main body or parenthesized thing
-+ *
-+ * Caller must absorb opening parenthesis.
-+ *
-+ * Combining parenthesis handling with the base level of regular expression
-+ * is a trifle forced, but the need to tie the tails of the branches to what
-+ * follows makes it hard to avoid.
-+ */
-+static char *
-+reg(struct match_globals *g, int paren, int *flagp /* Parenthesized? */ )
-+{
-+ register char *ret;
-+ register char *br;
-+ register char *ender;
-+ register int parno = 0; /* 0 makes gcc happy */
-+ int flags;
-+
-+ *flagp = HASWIDTH; /* Tentatively. */
-+
-+ /* Make an OPEN node, if parenthesized. */
-+ if (paren) {
-+ if (g->regnpar >= NSUBEXP)
-+ FAIL("too many ()");
-+ parno = g->regnpar;
-+ g->regnpar++;
-+ ret = regnode(g, OPEN+parno);
-+ } else
-+ ret = NULL;
-+
-+ /* Pick up the branches, linking them together. */
-+ br = regbranch(g, &flags);
-+ if (br == NULL)
-+ return(NULL);
-+ if (ret != NULL)
-+ regtail(g, ret, br); /* OPEN -> first. */
-+ else
-+ ret = br;
-+ if (!(flags&HASWIDTH))
-+ *flagp &= ~HASWIDTH;
-+ *flagp |= flags&SPSTART;
-+ while (*g->regparse == '|') {
-+ g->regparse++;
-+ br = regbranch(g, &flags);
-+ if (br == NULL)
-+ return(NULL);
-+ regtail(g, ret, br); /* BRANCH -> BRANCH. */
-+ if (!(flags&HASWIDTH))
-+ *flagp &= ~HASWIDTH;
-+ *flagp |= flags&SPSTART;
-+ }
-+
-+ /* Make a closing node, and hook it on the end. */
-+ ender = regnode(g, (paren) ? CLOSE+parno : END);
-+ regtail(g, ret, ender);
-+
-+ /* Hook the tails of the branches to the closing node. */
-+ for (br = ret; br != NULL; br = regnext(g, br))
-+ regoptail(g, br, ender);
-+
-+ /* Check for proper termination. */
-+ if (paren && *g->regparse++ != ')') {
-+ FAIL("unmatched ()");
-+ } else if (!paren && *g->regparse != '\0') {
-+ if (*g->regparse == ')') {
-+ FAIL("unmatched ()");
-+ } else
-+ FAIL("junk on end"); /* "Can't happen". */
-+ /* NOTREACHED */
-+ }
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regbranch - one alternative of an | operator
-+ *
-+ * Implements the concatenation operator.
-+ */
-+static char *
-+regbranch(struct match_globals *g, int *flagp)
-+{
-+ register char *ret;
-+ register char *chain;
-+ register char *latest;
-+ int flags;
-+
-+ *flagp = WORST; /* Tentatively. */
-+
-+ ret = regnode(g, BRANCH);
-+ chain = NULL;
-+ while (*g->regparse != '\0' && *g->regparse != '|' && *g->regparse != ')') {
-+ latest = regpiece(g, &flags);
-+ if (latest == NULL)
-+ return(NULL);
-+ *flagp |= flags&HASWIDTH;
-+ if (chain == NULL) /* First piece. */
-+ *flagp |= flags&SPSTART;
-+ else
-+ regtail(g, chain, latest);
-+ chain = latest;
-+ }
-+ if (chain == NULL) /* Loop ran zero times. */
-+ (void) regnode(g, NOTHING);
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regpiece - something followed by possible [*+?]
-+ *
-+ * Note that the branching code sequences used for ? and the general cases
-+ * of * and + are somewhat optimized: they use the same NOTHING node as
-+ * both the endmarker for their branch list and the body of the last branch.
-+ * It might seem that this node could be dispensed with entirely, but the
-+ * endmarker role is not redundant.
-+ */
-+static char *
-+regpiece(struct match_globals *g, int *flagp)
-+{
-+ register char *ret;
-+ register char op;
-+ register char *next;
-+ int flags;
-+
-+ ret = regatom(g, &flags);
-+ if (ret == NULL)
-+ return(NULL);
-+
-+ op = *g->regparse;
-+ if (!ISMULT(op)) {
-+ *flagp = flags;
-+ return(ret);
-+ }
-+
-+ if (!(flags&HASWIDTH) && op != '?')
-+ FAIL("*+ operand could be empty");
-+ *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH);
-+
-+ if (op == '*' && (flags&SIMPLE))
-+ reginsert(g, STAR, ret);
-+ else if (op == '*') {
-+ /* Emit x* as (x&|), where & means "self". */
-+ reginsert(g, BRANCH, ret); /* Either x */
-+ regoptail(g, ret, regnode(g, BACK)); /* and loop */
-+ regoptail(g, ret, ret); /* back */
-+ regtail(g, ret, regnode(g, BRANCH)); /* or */
-+ regtail(g, ret, regnode(g, NOTHING)); /* null. */
-+ } else if (op == '+' && (flags&SIMPLE))
-+ reginsert(g, PLUS, ret);
-+ else if (op == '+') {
-+ /* Emit x+ as x(&|), where & means "self". */
-+ next = regnode(g, BRANCH); /* Either */
-+ regtail(g, ret, next);
-+ regtail(g, regnode(g, BACK), ret); /* loop back */
-+ regtail(g, next, regnode(g, BRANCH)); /* or */
-+ regtail(g, ret, regnode(g, NOTHING)); /* null. */
-+ } else if (op == '?') {
-+ /* Emit x? as (x|) */
-+ reginsert(g, BRANCH, ret); /* Either x */
-+ regtail(g, ret, regnode(g, BRANCH)); /* or */
-+ next = regnode(g, NOTHING); /* null. */
-+ regtail(g, ret, next);
-+ regoptail(g, ret, next);
-+ }
-+ g->regparse++;
-+ if (ISMULT(*g->regparse))
-+ FAIL("nested *?+");
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regatom - the lowest level
-+ *
-+ * Optimization: gobbles an entire sequence of ordinary characters so that
-+ * it can turn them into a single node, which is smaller to store and
-+ * faster to run. Backslashed characters are exceptions, each becoming a
-+ * separate node; the code is simpler that way and it's not worth fixing.
-+ */
-+static char *
-+regatom(struct match_globals *g, int *flagp)
-+{
-+ register char *ret;
-+ int flags;
-+
-+ *flagp = WORST; /* Tentatively. */
-+
-+ switch (*g->regparse++) {
-+ case '^':
-+ ret = regnode(g, BOL);
-+ break;
-+ case '$':
-+ ret = regnode(g, EOL);
-+ break;
-+ case '.':
-+ ret = regnode(g, ANY);
-+ *flagp |= HASWIDTH|SIMPLE;
-+ break;
-+ case '[': {
-+ register int class;
-+ register int classend;
-+
-+ if (*g->regparse == '^') { /* Complement of range. */
-+ ret = regnode(g, ANYBUT);
-+ g->regparse++;
-+ } else
-+ ret = regnode(g, ANYOF);
-+ if (*g->regparse == ']' || *g->regparse == '-')
-+ regc(g, *g->regparse++);
-+ while (*g->regparse != '\0' && *g->regparse != ']') {
-+ if (*g->regparse == '-') {
-+ g->regparse++;
-+ if (*g->regparse == ']' || *g->regparse == '\0')
-+ regc(g, '-');
-+ else {
-+ class = UCHARAT(g->regparse-2)+1;
-+ classend = UCHARAT(g->regparse);
-+ if (class > classend+1)
-+ FAIL("invalid [] range");
-+ for (; class <= classend; class++)
-+ regc(g, class);
-+ g->regparse++;
-+ }
-+ } else
-+ regc(g, *g->regparse++);
-+ }
-+ regc(g, '\0');
-+ if (*g->regparse != ']')
-+ FAIL("unmatched []");
-+ g->regparse++;
-+ *flagp |= HASWIDTH|SIMPLE;
-+ }
-+ break;
-+ case '(':
-+ ret = reg(g, 1, &flags);
-+ if (ret == NULL)
-+ return(NULL);
-+ *flagp |= flags&(HASWIDTH|SPSTART);
-+ break;
-+ case '\0':
-+ case '|':
-+ case ')':
-+ FAIL("internal urp"); /* Supposed to be caught earlier. */
-+ break;
-+ case '?':
-+ case '+':
-+ case '*':
-+ FAIL("?+* follows nothing");
-+ break;
-+ case '\\':
-+ if (*g->regparse == '\0')
-+ FAIL("trailing \\");
-+ ret = regnode(g, EXACTLY);
-+ regc(g, *g->regparse++);
-+ regc(g, '\0');
-+ *flagp |= HASWIDTH|SIMPLE;
-+ break;
-+ default: {
-+ register int len;
-+ register char ender;
-+
-+ g->regparse--;
-+ len = my_strcspn((const char *)g->regparse, (const char *)META);
-+ if (len <= 0)
-+ FAIL("internal disaster");
-+ ender = *(g->regparse+len);
-+ if (len > 1 && ISMULT(ender))
-+ len--; /* Back off clear of ?+* operand. */
-+ *flagp |= HASWIDTH;
-+ if (len == 1)
-+ *flagp |= SIMPLE;
-+ ret = regnode(g, EXACTLY);
-+ while (len > 0) {
-+ regc(g, *g->regparse++);
-+ len--;
-+ }
-+ regc(g, '\0');
-+ }
-+ break;
-+ }
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regnode - emit a node
-+ */
-+static char * /* Location. */
-+regnode(struct match_globals *g, char op)
-+{
-+ register char *ret;
-+ register char *ptr;
-+
-+ ret = g->regcode;
-+ if (ret == &g->regdummy) {
-+ g->regsize += 3;
-+ return(ret);
-+ }
-+
-+ ptr = ret;
-+ *ptr++ = op;
-+ *ptr++ = '\0'; /* Null "next" pointer. */
-+ *ptr++ = '\0';
-+ g->regcode = ptr;
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regc - emit (if appropriate) a byte of code
-+ */
-+static void
-+regc(struct match_globals *g, char b)
-+{
-+ if (g->regcode != &g->regdummy)
-+ *g->regcode++ = b;
-+ else
-+ g->regsize++;
-+}
-+
-+/*
-+ - reginsert - insert an operator in front of already-emitted operand
-+ *
-+ * Means relocating the operand.
-+ */
-+static void
-+reginsert(struct match_globals *g, char op, char* opnd)
-+{
-+ register char *src;
-+ register char *dst;
-+ register char *place;
-+
-+ if (g->regcode == &g->regdummy) {
-+ g->regsize += 3;
-+ return;
-+ }
-+
-+ src = g->regcode;
-+ g->regcode += 3;
-+ dst = g->regcode;
-+ while (src > opnd)
-+ *--dst = *--src;
-+
-+ place = opnd; /* Op node, where operand used to be. */
-+ *place++ = op;
-+ *place++ = '\0';
-+ *place++ = '\0';
-+}
-+
-+/*
-+ - regtail - set the next-pointer at the end of a node chain
-+ */
-+static void
-+regtail(struct match_globals *g, char *p, char *val)
-+{
-+ register char *scan;
-+ register char *temp;
-+ register int offset;
-+
-+ if (p == &g->regdummy)
-+ return;
-+
-+ /* Find last node. */
-+ scan = p;
-+ for (;;) {
-+ temp = regnext(g, scan);
-+ if (temp == NULL)
-+ break;
-+ scan = temp;
-+ }
-+
-+ if (OP(scan) == BACK)
-+ offset = scan - val;
-+ else
-+ offset = val - scan;
-+ *(scan+1) = (offset>>8)&0377;
-+ *(scan+2) = offset&0377;
-+}
-+
-+/*
-+ - regoptail - regtail on operand of first argument; nop if operandless
-+ */
-+static void
-+regoptail(struct match_globals *g, char *p, char *val)
-+{
-+ /* "Operandless" and "op != BRANCH" are synonymous in practice. */
-+ if (p == NULL || p == &g->regdummy || OP(p) != BRANCH)
-+ return;
-+ regtail(g, OPERAND(p), val);
-+}
-+
-+/*
-+ * regexec and friends
-+ */
-+
-+
-+/*
-+ * Forwards.
-+ */
-+STATIC int regtry(struct match_globals *g, regexp *prog, char *string);
-+STATIC int regmatch(struct match_globals *g, char *prog);
-+STATIC int regrepeat(struct match_globals *g, char *p);
-+
-+#ifdef DEBUG
-+int regnarrate = 0;
-+void regdump();
-+STATIC char *regprop(char *op);
-+#endif
-+
-+/*
-+ - regexec - match a regexp against a string
-+ */
-+int
-+regexec(regexp *prog, char *string)
-+{
-+ register char *s;
-+ struct match_globals g;
-+
-+ /* Be paranoid... */
-+ if (prog == NULL || string == NULL) {
-+ printk("<3>Regexp: NULL parameter\n");
-+ return(0);
-+ }
-+
-+ /* Check validity of program. */
-+ if (UCHARAT(prog->program) != MAGIC) {
-+ printk("<3>Regexp: corrupted program\n");
-+ return(0);
-+ }
-+
-+ /* If there is a "must appear" string, look for it. */
-+ if (prog->regmust != NULL) {
-+ s = string;
-+ while ((s = strchr(s, prog->regmust[0])) != NULL) {
-+ if (strncmp(s, prog->regmust, prog->regmlen) == 0)
-+ break; /* Found it. */
-+ s++;
-+ }
-+ if (s == NULL) /* Not present. */
-+ return(0);
-+ }
-+
-+ /* Mark beginning of line for ^ . */
-+ g.regbol = string;
-+
-+ /* Simplest case: anchored match need be tried only once. */
-+ if (prog->reganch)
-+ return(regtry(&g, prog, string));
-+
-+ /* Messy cases: unanchored match. */
-+ s = string;
-+ if (prog->regstart != '\0')
-+ /* We know what char it must start with. */
-+ while ((s = strchr(s, prog->regstart)) != NULL) {
-+ if (regtry(&g, prog, s))
-+ return(1);
-+ s++;
-+ }
-+ else
-+ /* We don't -- general case. */
-+ do {
-+ if (regtry(&g, prog, s))
-+ return(1);
-+ } while (*s++ != '\0');
-+
-+ /* Failure. */
-+ return(0);
-+}
-+
-+/*
-+ - regtry - try match at specific point
-+ */
-+static int /* 0 failure, 1 success */
-+regtry(struct match_globals *g, regexp *prog, char *string)
-+{
-+ register int i;
-+ register char **sp;
-+ register char **ep;
-+
-+ g->reginput = string;
-+ g->regstartp = prog->startp;
-+ g->regendp = prog->endp;
-+
-+ sp = prog->startp;
-+ ep = prog->endp;
-+ for (i = NSUBEXP; i > 0; i--) {
-+ *sp++ = NULL;
-+ *ep++ = NULL;
-+ }
-+ if (regmatch(g, prog->program + 1)) {
-+ prog->startp[0] = string;
-+ prog->endp[0] = g->reginput;
-+ return(1);
-+ } else
-+ return(0);
-+}
-+
-+/*
-+ - regmatch - main matching routine
-+ *
-+ * Conceptually the strategy is simple: check to see whether the current
-+ * node matches, call self recursively to see whether the rest matches,
-+ * and then act accordingly. In practice we make some effort to avoid
-+ * recursion, in particular by going through "ordinary" nodes (that don't
-+ * need to know whether the rest of the match failed) by a loop instead of
-+ * by recursion.
-+ */
-+static int /* 0 failure, 1 success */
-+regmatch(struct match_globals *g, char *prog)
-+{
-+ register char *scan = prog; /* Current node. */
-+ char *next; /* Next node. */
-+
-+#ifdef DEBUG
-+ if (scan != NULL && regnarrate)
-+ fprintf(stderr, "%s(\n", regprop(scan));
-+#endif
-+ while (scan != NULL) {
-+#ifdef DEBUG
-+ if (regnarrate)
-+ fprintf(stderr, "%s...\n", regprop(scan));
-+#endif
-+ next = regnext(g, scan);
-+
-+ switch (OP(scan)) {
-+ case BOL:
-+ if (g->reginput != g->regbol)
-+ return(0);
-+ break;
-+ case EOL:
-+ if (*g->reginput != '\0')
-+ return(0);
-+ break;
-+ case ANY:
-+ if (*g->reginput == '\0')
-+ return(0);
-+ g->reginput++;
-+ break;
-+ case EXACTLY: {
-+ register int len;
-+ register char *opnd;
-+
-+ opnd = OPERAND(scan);
-+ /* Inline the first character, for speed. */
-+ if (*opnd != *g->reginput)
-+ return(0);
-+ len = strlen(opnd);
-+ if (len > 1 && strncmp(opnd, g->reginput, len) != 0)
-+ return(0);
-+ g->reginput += len;
-+ }
-+ break;
-+ case ANYOF:
-+ if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) == NULL)
-+ return(0);
-+ g->reginput++;
-+ break;
-+ case ANYBUT:
-+ if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) != NULL)
-+ return(0);
-+ g->reginput++;
-+ break;
-+ case NOTHING:
-+ case BACK:
-+ break;
-+ case OPEN+1:
-+ case OPEN+2:
-+ case OPEN+3:
-+ case OPEN+4:
-+ case OPEN+5:
-+ case OPEN+6:
-+ case OPEN+7:
-+ case OPEN+8:
-+ case OPEN+9: {
-+ register int no;
-+ register char *save;
-+
-+ no = OP(scan) - OPEN;
-+ save = g->reginput;
-+
-+ if (regmatch(g, next)) {
-+ /*
-+ * Don't set startp if some later
-+ * invocation of the same parentheses
-+ * already has.
-+ */
-+ if (g->regstartp[no] == NULL)
-+ g->regstartp[no] = save;
-+ return(1);
-+ } else
-+ return(0);
-+ }
-+ break;
-+ case CLOSE+1:
-+ case CLOSE+2:
-+ case CLOSE+3:
-+ case CLOSE+4:
-+ case CLOSE+5:
-+ case CLOSE+6:
-+ case CLOSE+7:
-+ case CLOSE+8:
-+ case CLOSE+9:
-+ {
-+ register int no;
-+ register char *save;
-+
-+ no = OP(scan) - CLOSE;
-+ save = g->reginput;
-+
-+ if (regmatch(g, next)) {
-+ /*
-+ * Don't set endp if some later
-+ * invocation of the same parentheses
-+ * already has.
-+ */
-+ if (g->regendp[no] == NULL)
-+ g->regendp[no] = save;
-+ return(1);
-+ } else
-+ return(0);
-+ }
-+ break;
-+ case BRANCH: {
-+ register char *save;
-+
-+ if (OP(next) != BRANCH) /* No choice. */
-+ next = OPERAND(scan); /* Avoid recursion. */
-+ else {
-+ do {
-+ save = g->reginput;
-+ if (regmatch(g, OPERAND(scan)))
-+ return(1);
-+ g->reginput = save;
-+ scan = regnext(g, scan);
-+ } while (scan != NULL && OP(scan) == BRANCH);
-+ return(0);
-+ /* NOTREACHED */
-+ }
-+ }
-+ break;
-+ case STAR:
-+ case PLUS: {
-+ register char nextch;
-+ register int no;
-+ register char *save;
-+ register int min;
-+
-+ /*
-+ * Lookahead to avoid useless match attempts
-+ * when we know what character comes next.
-+ */
-+ nextch = '\0';
-+ if (OP(next) == EXACTLY)
-+ nextch = *OPERAND(next);
-+ min = (OP(scan) == STAR) ? 0 : 1;
-+ save = g->reginput;
-+ no = regrepeat(g, OPERAND(scan));
-+ while (no >= min) {
-+ /* If it could work, try it. */
-+ if (nextch == '\0' || *g->reginput == nextch)
-+ if (regmatch(g, next))
-+ return(1);
-+ /* Couldn't or didn't -- back up. */
-+ no--;
-+ g->reginput = save + no;
-+ }
-+ return(0);
-+ }
-+ break;
-+ case END:
-+ return(1); /* Success! */
-+ break;
-+ default:
-+ printk("<3>Regexp: memory corruption\n");
-+ return(0);
-+ break;
-+ }
-+
-+ scan = next;
-+ }
-+
-+ /*
-+ * We get here only if there's trouble -- normally "case END" is
-+ * the terminating point.
-+ */
-+ printk("<3>Regexp: corrupted pointers\n");
-+ return(0);
-+}
-+
-+/*
-+ - regrepeat - repeatedly match something simple, report how many
-+ */
-+static int
-+regrepeat(struct match_globals *g, char *p)
-+{
-+ register int count = 0;
-+ register char *scan;
-+ register char *opnd;
-+
-+ scan = g->reginput;
-+ opnd = OPERAND(p);
-+ switch (OP(p)) {
-+ case ANY:
-+ count = strlen(scan);
-+ scan += count;
-+ break;
-+ case EXACTLY:
-+ while (*opnd == *scan) {
-+ count++;
-+ scan++;
-+ }
-+ break;
-+ case ANYOF:
-+ while (*scan != '\0' && strchr(opnd, *scan) != NULL) {
-+ count++;
-+ scan++;
-+ }
-+ break;
-+ case ANYBUT:
-+ while (*scan != '\0' && strchr(opnd, *scan) == NULL) {
-+ count++;
-+ scan++;
-+ }
-+ break;
-+ default: /* Oh dear. Called inappropriately. */
-+ printk("<3>Regexp: internal foulup\n");
-+ count = 0; /* Best compromise. */
-+ break;
-+ }
-+ g->reginput = scan;
-+
-+ return(count);
-+}
-+
-+/*
-+ - regnext - dig the "next" pointer out of a node
-+ */
-+static char*
-+regnext(struct match_globals *g, char *p)
-+{
-+ register int offset;
-+
-+ if (p == &g->regdummy)
-+ return(NULL);
-+
-+ offset = NEXT(p);
-+ if (offset == 0)
-+ return(NULL);
-+
-+ if (OP(p) == BACK)
-+ return(p-offset);
-+ else
-+ return(p+offset);
-+}
-+
-+#ifdef DEBUG
-+
-+STATIC char *regprop();
-+
-+/*
-+ - regdump - dump a regexp onto stdout in vaguely comprehensible form
-+ */
-+void
-+regdump(regexp *r)
-+{
-+ register char *s;
-+ register char op = EXACTLY; /* Arbitrary non-END op. */
-+ register char *next;
-+ /* extern char *strchr(); */
-+
-+
-+ s = r->program + 1;
-+ while (op != END) { /* While that wasn't END last time... */
-+ op = OP(s);
-+ printf("%2d%s", s-r->program, regprop(s)); /* Where, what. */
-+ next = regnext(s);
-+ if (next == NULL) /* Next ptr. */
-+ printf("(0)");
-+ else
-+ printf("(%d)", (s-r->program)+(next-s));
-+ s += 3;
-+ if (op == ANYOF || op == ANYBUT || op == EXACTLY) {
-+ /* Literal string, where present. */
-+ while (*s != '\0') {
-+ putchar(*s);
-+ s++;
-+ }
-+ s++;
-+ }
-+ putchar('\n');
-+ }
-+
-+ /* Header fields of interest. */
-+ if (r->regstart != '\0')
-+ printf("start `%c' ", r->regstart);
-+ if (r->reganch)
-+ printf("anchored ");
-+ if (r->regmust != NULL)
-+ printf("must have \"%s\"", r->regmust);
-+ printf("\n");
-+}
-+
-+/*
-+ - regprop - printable representation of opcode
-+ */
-+static char *
-+regprop(char *op)
-+{
-+#define BUFLEN 50
-+ register char *p;
-+ static char buf[BUFLEN];
-+
-+ strcpy(buf, ":");
-+
-+ switch (OP(op)) {
-+ case BOL:
-+ p = "BOL";
-+ break;
-+ case EOL:
-+ p = "EOL";
-+ break;
-+ case ANY:
-+ p = "ANY";
-+ break;
-+ case ANYOF:
-+ p = "ANYOF";
-+ break;
-+ case ANYBUT:
-+ p = "ANYBUT";
-+ break;
-+ case BRANCH:
-+ p = "BRANCH";
-+ break;
-+ case EXACTLY:
-+ p = "EXACTLY";
-+ break;
-+ case NOTHING:
-+ p = "NOTHING";
-+ break;
-+ case BACK:
-+ p = "BACK";
-+ break;
-+ case END:
-+ p = "END";
-+ break;
-+ case OPEN+1:
-+ case OPEN+2:
-+ case OPEN+3:
-+ case OPEN+4:
-+ case OPEN+5:
-+ case OPEN+6:
-+ case OPEN+7:
-+ case OPEN+8:
-+ case OPEN+9:
-+ snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "OPEN%d", OP(op)-OPEN);
-+ p = NULL;
-+ break;
-+ case CLOSE+1:
-+ case CLOSE+2:
-+ case CLOSE+3:
-+ case CLOSE+4:
-+ case CLOSE+5:
-+ case CLOSE+6:
-+ case CLOSE+7:
-+ case CLOSE+8:
-+ case CLOSE+9:
-+ snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "CLOSE%d", OP(op)-CLOSE);
-+ p = NULL;
-+ break;
-+ case STAR:
-+ p = "STAR";
-+ break;
-+ case PLUS:
-+ p = "PLUS";
-+ break;
-+ default:
-+ printk("<3>Regexp: corrupted opcode\n");
-+ break;
-+ }
-+ if (p != NULL)
-+ strncat(buf, p, BUFLEN-strlen(buf));
-+ return(buf);
-+}
-+#endif
-+
-+
---- /dev/null
-+++ b/net/netfilter/regexp/regexp.h
-@@ -0,0 +1,41 @@
-+/*
-+ * Definitions etc. for regexp(3) routines.
-+ *
-+ * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof],
-+ * not the System V one.
-+ */
-+
-+#ifndef REGEXP_H
-+#define REGEXP_H
-+
-+
-+/*
-+http://www.opensource.apple.com/darwinsource/10.3/expect-1/expect/expect.h ,
-+which contains a version of this library, says:
-+
-+ *
-+ * NSUBEXP must be at least 10, and no greater than 117 or the parser
-+ * will not work properly.
-+ *
-+
-+However, it looks rather like this library is limited to 10. If you think
-+otherwise, let us know.
-+*/
-+
-+#define NSUBEXP 10
-+typedef struct regexp {
-+ char *startp[NSUBEXP];
-+ char *endp[NSUBEXP];
-+ char regstart; /* Internal use only. */
-+ char reganch; /* Internal use only. */
-+ char *regmust; /* Internal use only. */
-+ int regmlen; /* Internal use only. */
-+ char program[1]; /* Unwarranted chumminess with compiler. */
-+} regexp;
-+
-+regexp * regcomp(char *exp, int *patternsize);
-+int regexec(regexp *prog, char *string);
-+void regsub(regexp *prog, char *source, char *dest);
-+void regerror(char *s);
-+
-+#endif
---- /dev/null
-+++ b/net/netfilter/regexp/regmagic.h
-@@ -0,0 +1,5 @@
-+/*
-+ * The first byte of the regexp internal "program" is actually this magic
-+ * number; the start node begins in the second byte.
-+ */
-+#define MAGIC 0234
---- /dev/null
-+++ b/net/netfilter/regexp/regsub.c
-@@ -0,0 +1,95 @@
-+/*
-+ * regsub
-+ * @(#)regsub.c 1.3 of 2 April 86
-+ *
-+ * Copyright (c) 1986 by University of Toronto.
-+ * Written by Henry Spencer. Not derived from licensed software.
-+ *
-+ * Permission is granted to anyone to use this software for any
-+ * purpose on any computer system, and to redistribute it freely,
-+ * subject to the following restrictions:
-+ *
-+ * 1. The author is not responsible for the consequences of use of
-+ * this software, no matter how awful, even if they arise
-+ * from defects in it.
-+ *
-+ * 2. The origin of this software must not be misrepresented, either
-+ * by explicit claim or by omission.
-+ *
-+ * 3. Altered versions must be plainly marked as such, and must not
-+ * be misrepresented as being the original software.
-+ *
-+ *
-+ * This code was modified by Ethan Sommer to work within the kernel
-+ * (it now uses kmalloc etc..)
-+ *
-+ */
-+#include "regexp.h"
-+#include "regmagic.h"
-+#include <linux/string.h>
-+
-+
-+#ifndef CHARBITS
-+#define UCHARAT(p) ((int)*(unsigned char *)(p))
-+#else
-+#define UCHARAT(p) ((int)*(p)&CHARBITS)
-+#endif
-+
-+#if 0
-+//void regerror(char * s)
-+//{
-+// printk("regexp(3): %s", s);
-+// /* NOTREACHED */
-+//}
-+#endif
-+
-+/*
-+ - regsub - perform substitutions after a regexp match
-+ */
-+void
-+regsub(regexp * prog, char * source, char * dest)
-+{
-+ register char *src;
-+ register char *dst;
-+ register char c;
-+ register int no;
-+ register int len;
-+
-+ /* Not necessary and gcc doesn't like it -MLS */
-+ /*extern char *strncpy();*/
-+
-+ if (prog == NULL || source == NULL || dest == NULL) {
-+ regerror("NULL parm to regsub");
-+ return;
-+ }
-+ if (UCHARAT(prog->program) != MAGIC) {
-+ regerror("damaged regexp fed to regsub");
-+ return;
-+ }
-+
-+ src = source;
-+ dst = dest;
-+ while ((c = *src++) != '\0') {
-+ if (c == '&')
-+ no = 0;
-+ else if (c == '\\' && '0' <= *src && *src <= '9')
-+ no = *src++ - '0';
-+ else
-+ no = -1;
-+
-+ if (no < 0) { /* Ordinary character. */
-+ if (c == '\\' && (*src == '\\' || *src == '&'))
-+ c = *src++;
-+ *dst++ = c;
-+ } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) {
-+ len = prog->endp[no] - prog->startp[no];
-+ (void) strncpy(dst, prog->startp[no], len);
-+ dst += len;
-+ if (len != 0 && *(dst-1) == '\0') { /* strncpy hit NUL. */
-+ regerror("damaged match string");
-+ return;
-+ }
-+ }
-+ }
-+ *dst++ = '\0';
-+}
---- /dev/null
-+++ b/net/netfilter/xt_layer7.c
-@@ -0,0 +1,666 @@
-+/*
-+ Kernel module to match application layer (OSI layer 7) data in connections.
-+
-+ http://l7-filter.sf.net
-+
-+ (C) 2003-2009 Matthew Strait and Ethan Sommer.
-+
-+ 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.
-+ http://www.gnu.org/licenses/gpl.txt
-+
-+ Based on ipt_string.c (C) 2000 Emmanuel Roger <winfield@freegates.be>,
-+ xt_helper.c (C) 2002 Harald Welte and cls_layer7.c (C) 2003 Matthew Strait,
-+ Ethan Sommer, Justin Levandoski.
-+*/
-+
-+#include <linux/spinlock.h>
-+#include <linux/version.h>
-+#include <net/ip.h>
-+#include <net/tcp.h>
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter.h>
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_core.h>
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
-+#include <net/netfilter/nf_conntrack_extend.h>
-+#include <net/netfilter/nf_conntrack_acct.h>
-+#endif
-+#include <linux/netfilter/x_tables.h>
-+#include <linux/netfilter/xt_layer7.h>
-+#include <linux/ctype.h>
-+#include <linux/proc_fs.h>
-+
-+#include "regexp/regexp.c"
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Matthew Strait <quadong@users.sf.net>, Ethan Sommer <sommere@users.sf.net>");
-+MODULE_DESCRIPTION("iptables application layer match module");
-+MODULE_ALIAS("ipt_layer7");
-+MODULE_VERSION("2.21");
-+
-+static int maxdatalen = 2048; // this is the default
-+module_param(maxdatalen, int, 0444);
-+MODULE_PARM_DESC(maxdatalen, "maximum bytes of data looked at by l7-filter");
-+#ifdef CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG
-+ #define DPRINTK(format,args...) printk(format,##args)
-+#else
-+ #define DPRINTK(format,args...)
-+#endif
-+
-+/* Number of packets whose data we look at.
-+This can be modified through /proc/net/layer7_numpackets */
-+static int num_packets = 10;
-+
-+static struct pattern_cache {
-+ char * regex_string;
-+ regexp * pattern;
-+ struct pattern_cache * next;
-+} * first_pattern_cache = NULL;
-+
-+DEFINE_SPINLOCK(l7_lock);
-+
-+static int total_acct_packets(struct nf_conn *ct)
-+{
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 26)
-+ BUG_ON(ct == NULL);
-+ return (ct->counters[IP_CT_DIR_ORIGINAL].packets + ct->counters[IP_CT_DIR_REPLY].packets);
-+#else
-+ struct nf_conn_counter *acct;
-+
-+ BUG_ON(ct == NULL);
-+ acct = nf_conn_acct_find(ct);
-+ if (!acct)
-+ return 0;
-+ return (acct[IP_CT_DIR_ORIGINAL].packets + acct[IP_CT_DIR_REPLY].packets);
-+#endif
-+}
-+
-+#ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
-+/* Converts an unfriendly string into a friendly one by
-+replacing unprintables with periods and all whitespace with " ". */
-+static char * friendly_print(unsigned char * s)
-+{
-+ char * f = kmalloc(strlen(s) + 1, GFP_ATOMIC);
-+ int i;
-+
-+ if(!f) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "friendly_print, bailing.\n");
-+ return NULL;
-+ }
-+
-+ for(i = 0; i < strlen(s); i++){
-+ if(isprint(s[i]) && s[i] < 128) f[i] = s[i];
-+ else if(isspace(s[i])) f[i] = ' ';
-+ else f[i] = '.';
-+ }
-+ f[i] = '\0';
-+ return f;
-+}
-+
-+static char dec2hex(int i)
-+{
-+ switch (i) {
-+ case 0 ... 9:
-+ return (i + '0');
-+ break;
-+ case 10 ... 15:
-+ return (i - 10 + 'a');
-+ break;
-+ default:
-+ if (net_ratelimit())
-+ printk("layer7: Problem in dec2hex\n");
-+ return '\0';
-+ }
-+}
-+
-+static char * hex_print(unsigned char * s)
-+{
-+ char * g = kmalloc(strlen(s)*3 + 1, GFP_ATOMIC);
-+ int i;
-+
-+ if(!g) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in hex_print, "
-+ "bailing.\n");
-+ return NULL;
-+ }
-+
-+ for(i = 0; i < strlen(s); i++) {
-+ g[i*3 ] = dec2hex(s[i]/16);
-+ g[i*3 + 1] = dec2hex(s[i]%16);
-+ g[i*3 + 2] = ' ';
-+ }
-+ g[i*3] = '\0';
-+
-+ return g;
-+}
-+#endif // DEBUG
-+
-+/* Use instead of regcomp. As we expect to be seeing the same regexps over and
-+over again, it make sense to cache the results. */
-+static regexp * compile_and_cache(const char * regex_string,
-+ const char * protocol)
-+{
-+ struct pattern_cache * node = first_pattern_cache;
-+ struct pattern_cache * last_pattern_cache = first_pattern_cache;
-+ struct pattern_cache * tmp;
-+ unsigned int len;
-+
-+ while (node != NULL) {
-+ if (!strcmp(node->regex_string, regex_string))
-+ return node->pattern;
-+
-+ last_pattern_cache = node;/* points at the last non-NULL node */
-+ node = node->next;
-+ }
-+
-+ /* If we reach the end of the list, then we have not yet cached
-+ the pattern for this regex. Let's do that now.
-+ Be paranoid about running out of memory to avoid list corruption. */
-+ tmp = kmalloc(sizeof(struct pattern_cache), GFP_ATOMIC);
-+
-+ if(!tmp) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "compile_and_cache, bailing.\n");
-+ return NULL;
-+ }
-+
-+ tmp->regex_string = kmalloc(strlen(regex_string) + 1, GFP_ATOMIC);
-+ tmp->pattern = kmalloc(sizeof(struct regexp), GFP_ATOMIC);
-+ tmp->next = NULL;
-+
-+ if(!tmp->regex_string || !tmp->pattern) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "compile_and_cache, bailing.\n");
-+ kfree(tmp->regex_string);
-+ kfree(tmp->pattern);
-+ kfree(tmp);
-+ return NULL;
-+ }
-+
-+ /* Ok. The new node is all ready now. */
-+ node = tmp;
-+
-+ if(first_pattern_cache == NULL) /* list is empty */
-+ first_pattern_cache = node; /* make node the beginning */
-+ else
-+ last_pattern_cache->next = node; /* attach node to the end */
-+
-+ /* copy the string and compile the regex */
-+ len = strlen(regex_string);
-+ DPRINTK("About to compile this: \"%s\"\n", regex_string);
-+ node->pattern = regcomp((char *)regex_string, &len);
-+ if ( !node->pattern ) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: Error compiling regexp "
-+ "\"%s\" (%s)\n",
-+ regex_string, protocol);
-+ /* pattern is now cached as NULL, so we won't try again. */
-+ }
-+
-+ strcpy(node->regex_string, regex_string);
-+ return node->pattern;
-+}
-+
-+static int can_handle(const struct sk_buff *skb)
-+{
-+ if(!ip_hdr(skb)) /* not IP */
-+ return 0;
-+ if(ip_hdr(skb)->protocol != IPPROTO_TCP &&
-+ ip_hdr(skb)->protocol != IPPROTO_UDP &&
-+ ip_hdr(skb)->protocol != IPPROTO_ICMP)
-+ return 0;
-+ return 1;
-+}
-+
-+/* Returns offset the into the skb->data that the application data starts */
-+static int app_data_offset(const struct sk_buff *skb)
-+{
-+ /* In case we are ported somewhere (ebtables?) where ip_hdr(skb)
-+ isn't set, this can be gotten from 4*(skb->data[0] & 0x0f) as well. */
-+ int ip_hl = 4*ip_hdr(skb)->ihl;
-+
-+ if( ip_hdr(skb)->protocol == IPPROTO_TCP ) {
-+ /* 12 == offset into TCP header for the header length field.
-+ Can't get this with skb->h.th->doff because the tcphdr
-+ struct doesn't get set when routing (this is confirmed to be
-+ true in Netfilter as well as QoS.) */
-+ int tcp_hl = 4*(skb->data[ip_hl + 12] >> 4);
-+
-+ return ip_hl + tcp_hl;
-+ } else if( ip_hdr(skb)->protocol == IPPROTO_UDP ) {
-+ return ip_hl + 8; /* UDP header is always 8 bytes */
-+ } else if( ip_hdr(skb)->protocol == IPPROTO_ICMP ) {
-+ return ip_hl + 8; /* ICMP header is 8 bytes */
-+ } else {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: tried to handle unknown "
-+ "protocol!\n");
-+ return ip_hl + 8; /* something reasonable */
-+ }
-+}
-+
-+/* handles whether there's a match when we aren't appending data anymore */
-+static int match_no_append(struct nf_conn * conntrack,
-+ struct nf_conn * master_conntrack,
-+ enum ip_conntrack_info ctinfo,
-+ enum ip_conntrack_info master_ctinfo,
-+ const struct xt_layer7_info * info)
-+{
-+ /* If we're in here, throw the app data away */
-+ if(master_conntrack->layer7.app_data != NULL) {
-+
-+ #ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
-+ if(!master_conntrack->layer7.app_proto) {
-+ char * f =
-+ friendly_print(master_conntrack->layer7.app_data);
-+ char * g =
-+ hex_print(master_conntrack->layer7.app_data);
-+ DPRINTK("\nl7-filter gave up after %d bytes "
-+ "(%d packets):\n%s\n",
-+ strlen(f), total_acct_packets(master_conntrack), f);
-+ kfree(f);
-+ DPRINTK("In hex: %s\n", g);
-+ kfree(g);
-+ }
-+ #endif
-+
-+ kfree(master_conntrack->layer7.app_data);
-+ master_conntrack->layer7.app_data = NULL; /* don't free again */
-+ }
-+
-+ if(master_conntrack->layer7.app_proto){
-+ /* Here child connections set their .app_proto (for /proc) */
-+ if(!conntrack->layer7.app_proto) {
-+ conntrack->layer7.app_proto =
-+ kmalloc(strlen(master_conntrack->layer7.app_proto)+1,
-+ GFP_ATOMIC);
-+ if(!conntrack->layer7.app_proto){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory "
-+ "in match_no_append, "
-+ "bailing.\n");
-+ return 1;
-+ }
-+ strcpy(conntrack->layer7.app_proto,
-+ master_conntrack->layer7.app_proto);
-+ }
-+
-+ return (!strcmp(master_conntrack->layer7.app_proto,
-+ info->protocol));
-+ }
-+ else {
-+ /* If not classified, set to "unknown" to distinguish from
-+ connections that are still being tested. */
-+ master_conntrack->layer7.app_proto =
-+ kmalloc(strlen("unknown")+1, GFP_ATOMIC);
-+ if(!master_conntrack->layer7.app_proto){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "match_no_append, bailing.\n");
-+ return 1;
-+ }
-+ strcpy(master_conntrack->layer7.app_proto, "unknown");
-+ return 0;
-+ }
-+}
-+
-+/* add the new app data to the conntrack. Return number of bytes added. */
-+static int add_data(struct nf_conn * master_conntrack,
-+ char * app_data, int appdatalen)
-+{
-+ int length = 0, i;
-+ int oldlength = master_conntrack->layer7.app_data_len;
-+
-+ /* This is a fix for a race condition by Deti Fliegl. However, I'm not
-+ clear on whether the race condition exists or whether this really
-+ fixes it. I might just be being dense... Anyway, if it's not really
-+ a fix, all it does is waste a very small amount of time. */
-+ if(!master_conntrack->layer7.app_data) return 0;
-+
-+ /* Strip nulls. Make everything lower case (our regex lib doesn't
-+ do case insensitivity). Add it to the end of the current data. */
-+ for(i = 0; i < maxdatalen-oldlength-1 &&
-+ i < appdatalen; i++) {
-+ if(app_data[i] != '\0') {
-+ /* the kernel version of tolower mungs 'upper ascii' */
-+ master_conntrack->layer7.app_data[length+oldlength] =
-+ isascii(app_data[i])?
-+ tolower(app_data[i]) : app_data[i];
-+ length++;
-+ }
-+ }
-+
-+ master_conntrack->layer7.app_data[length+oldlength] = '\0';
-+ master_conntrack->layer7.app_data_len = length + oldlength;
-+
-+ return length;
-+}
-+
-+/* taken from drivers/video/modedb.c */
-+static int my_atoi(const char *s)
-+{
-+ int val = 0;
-+
-+ for (;; s++) {
-+ switch (*s) {
-+ case '0'...'9':
-+ val = 10*val+(*s-'0');
-+ break;
-+ default:
-+ return val;
-+ }
-+ }
-+}
-+
-+/* write out num_packets to userland. */
-+static int layer7_read_proc(char* page, char ** start, off_t off, int count,
-+ int* eof, void * data)
-+{
-+ if(num_packets > 99 && net_ratelimit())
-+ printk(KERN_ERR "layer7: NOT REACHED. num_packets too big\n");
-+
-+ page[0] = num_packets/10 + '0';
-+ page[1] = num_packets%10 + '0';
-+ page[2] = '\n';
-+ page[3] = '\0';
-+
-+ *eof=1;
-+
-+ return 3;
-+}
-+
-+/* Read in num_packets from userland */
-+static int layer7_write_proc(struct file* file, const char* buffer,
-+ unsigned long count, void *data)
-+{
-+ char * foo = kmalloc(count, GFP_ATOMIC);
-+
-+ if(!foo){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory, bailing. "
-+ "num_packets unchanged.\n");
-+ return count;
-+ }
-+
-+ if(copy_from_user(foo, buffer, count)) {
-+ return -EFAULT;
-+ }
-+
-+
-+ num_packets = my_atoi(foo);
-+ kfree (foo);
-+
-+ /* This has an arbitrary limit to make the math easier. I'm lazy.
-+ But anyway, 99 is a LOT! If you want more, you're doing it wrong! */
-+ if(num_packets > 99) {
-+ printk(KERN_WARNING "layer7: num_packets can't be > 99.\n");
-+ num_packets = 99;
-+ } else if(num_packets < 1) {
-+ printk(KERN_WARNING "layer7: num_packets can't be < 1.\n");
-+ num_packets = 1;
-+ }
-+
-+ return count;
-+}
-+
-+static bool
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+match(const struct sk_buff *skbin, const struct xt_match_param *par)
-+#else
-+match(const struct sk_buff *skbin,
-+ const struct net_device *in,
-+ const struct net_device *out,
-+ const struct xt_match *match,
-+ const void *matchinfo,
-+ int offset,
-+ unsigned int protoff,
-+ bool *hotdrop)
-+#endif
-+{
-+ /* sidestep const without getting a compiler warning... */
-+ struct sk_buff * skb = (struct sk_buff *)skbin;
-+
-+ const struct xt_layer7_info * info =
-+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+ par->matchinfo;
-+ #else
-+ matchinfo;
-+ #endif
-+
-+ enum ip_conntrack_info master_ctinfo, ctinfo;
-+ struct nf_conn *master_conntrack, *conntrack;
-+ unsigned char * app_data;
-+ unsigned int pattern_result, appdatalen;
-+ regexp * comppattern;
-+
-+ /* Be paranoid/incompetent - lock the entire match function. */
-+ spin_lock_bh(&l7_lock);
-+
-+ if(!can_handle(skb)){
-+ DPRINTK("layer7: This is some protocol I can't handle.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+
-+ /* Treat parent & all its children together as one connection, except
-+ for the purpose of setting conntrack->layer7.app_proto in the actual
-+ connection. This makes /proc/net/ip_conntrack more satisfying. */
-+ if(!(conntrack = nf_ct_get(skb, &ctinfo)) ||
-+ !(master_conntrack=nf_ct_get(skb,&master_ctinfo))){
-+ DPRINTK("layer7: couldn't get conntrack.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+
-+ /* Try to get a master conntrack (and its master etc) for FTP, etc. */
-+ while (master_ct(master_conntrack) != NULL)
-+ master_conntrack = master_ct(master_conntrack);
-+
-+ /* if we've classified it or seen too many packets */
-+ if(total_acct_packets(master_conntrack) > num_packets ||
-+ master_conntrack->layer7.app_proto) {
-+
-+ pattern_result = match_no_append(conntrack, master_conntrack,
-+ ctinfo, master_ctinfo, info);
-+
-+ /* skb->cb[0] == seen. Don't do things twice if there are
-+ multiple l7 rules. I'm not sure that using cb for this purpose
-+ is correct, even though it says "put your private variables
-+ there". But it doesn't look like it is being used for anything
-+ else in the skbs that make it here. */
-+ skb->cb[0] = 1; /* marking it seen here's probably irrelevant */
-+
-+ spin_unlock_bh(&l7_lock);
-+ return (pattern_result ^ info->invert);
-+ }
-+
-+ if(skb_is_nonlinear(skb)){
-+ if(skb_linearize(skb) != 0){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: failed to linearize "
-+ "packet, bailing.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+ }
-+
-+ /* now that the skb is linearized, it's safe to set these. */
-+ app_data = skb->data + app_data_offset(skb);
-+ appdatalen = skb_tail_pointer(skb) - app_data;
-+
-+ /* the return value gets checked later, when we're ready to use it */
-+ comppattern = compile_and_cache(info->pattern, info->protocol);
-+
-+ /* On the first packet of a connection, allocate space for app data */
-+ if(total_acct_packets(master_conntrack) == 1 && !skb->cb[0] &&
-+ !master_conntrack->layer7.app_data){
-+ master_conntrack->layer7.app_data =
-+ kmalloc(maxdatalen, GFP_ATOMIC);
-+ if(!master_conntrack->layer7.app_data){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "match, bailing.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+
-+ master_conntrack->layer7.app_data[0] = '\0';
-+ }
-+
-+ /* Can be here, but unallocated, if numpackets is increased near
-+ the beginning of a connection */
-+ if(master_conntrack->layer7.app_data == NULL){
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert; /* unmatched */
-+ }
-+
-+ if(!skb->cb[0]){
-+ int newbytes;
-+ newbytes = add_data(master_conntrack, app_data, appdatalen);
-+
-+ if(newbytes == 0) { /* didn't add any data */
-+ skb->cb[0] = 1;
-+ /* Didn't match before, not going to match now */
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+ }
-+
-+ /* If looking for "unknown", then never match. "Unknown" means that
-+ we've given up; we're still trying with these packets. */
-+ if(!strcmp(info->protocol, "unknown")) {
-+ pattern_result = 0;
-+ /* If looking for "unset", then always match. "Unset" means that we
-+ haven't yet classified the connection. */
-+ } else if(!strcmp(info->protocol, "unset")) {
-+ pattern_result = 2;
-+ DPRINTK("layer7: matched unset: not yet classified "
-+ "(%d/%d packets)\n",
-+ total_acct_packets(master_conntrack), num_packets);
-+ /* If the regexp failed to compile, don't bother running it */
-+ } else if(comppattern &&
-+ regexec(comppattern, master_conntrack->layer7.app_data)){
-+ DPRINTK("layer7: matched %s\n", info->protocol);
-+ pattern_result = 1;
-+ } else pattern_result = 0;
-+
-+ if(pattern_result == 1) {
-+ master_conntrack->layer7.app_proto =
-+ kmalloc(strlen(info->protocol)+1, GFP_ATOMIC);
-+ if(!master_conntrack->layer7.app_proto){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "match, bailing.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return (pattern_result ^ info->invert);
-+ }
-+ strcpy(master_conntrack->layer7.app_proto, info->protocol);
-+ } else if(pattern_result > 1) { /* cleanup from "unset" */
-+ pattern_result = 1;
-+ }
-+
-+ /* mark the packet seen */
-+ skb->cb[0] = 1;
-+
-+ spin_unlock_bh(&l7_lock);
-+ return (pattern_result ^ info->invert);
-+}
-+
-+// load nf_conntrack_ipv4
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+static bool check(const struct xt_mtchk_param *par)
-+{
-+ if (nf_ct_l3proto_try_module_get(par->match->family) < 0) {
-+ printk(KERN_WARNING "can't load conntrack support for "
-+ "proto=%d\n", par->match->family);
-+#else
-+static bool check(const char *tablename, const void *inf,
-+ const struct xt_match *match, void *matchinfo,
-+ unsigned int hook_mask)
-+{
-+ if (nf_ct_l3proto_try_module_get(match->family) < 0) {
-+ printk(KERN_WARNING "can't load conntrack support for "
-+ "proto=%d\n", match->family);
-+#endif
-+ return 0;
-+ }
-+ return 1;
-+}
-+
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+ static void destroy(const struct xt_mtdtor_param *par)
-+ {
-+ nf_ct_l3proto_module_put(par->match->family);
-+ }
-+#else
-+ static void destroy(const struct xt_match *match, void *matchinfo)
-+ {
-+ nf_ct_l3proto_module_put(match->family);
-+ }
-+#endif
-+
-+static struct xt_match xt_layer7_match[] __read_mostly = {
-+{
-+ .name = "layer7",
-+ .family = AF_INET,
-+ .checkentry = check,
-+ .match = match,
-+ .destroy = destroy,
-+ .matchsize = sizeof(struct xt_layer7_info),
-+ .me = THIS_MODULE
-+}
-+};
-+
-+static void layer7_cleanup_proc(void)
-+{
-+ remove_proc_entry("layer7_numpackets", init_net.proc_net);
-+}
-+
-+/* register the proc file */
-+static void layer7_init_proc(void)
-+{
-+ struct proc_dir_entry* entry;
-+ entry = create_proc_entry("layer7_numpackets", 0644, init_net.proc_net);
-+ entry->read_proc = layer7_read_proc;
-+ entry->write_proc = layer7_write_proc;
-+}
-+
-+static int __init xt_layer7_init(void)
-+{
-+ need_conntrack();
-+
-+ layer7_init_proc();
-+ if(maxdatalen < 1) {
-+ printk(KERN_WARNING "layer7: maxdatalen can't be < 1, "
-+ "using 1\n");
-+ maxdatalen = 1;
-+ }
-+ /* This is not a hard limit. It's just here to prevent people from
-+ bringing their slow machines to a grinding halt. */
-+ else if(maxdatalen > 65536) {
-+ printk(KERN_WARNING "layer7: maxdatalen can't be > 65536, "
-+ "using 65536\n");
-+ maxdatalen = 65536;
-+ }
-+ return xt_register_matches(xt_layer7_match,
-+ ARRAY_SIZE(xt_layer7_match));
-+}
-+
-+static void __exit xt_layer7_fini(void)
-+{
-+ layer7_cleanup_proc();
-+ xt_unregister_matches(xt_layer7_match, ARRAY_SIZE(xt_layer7_match));
-+}
-+
-+module_init(xt_layer7_init);
-+module_exit(xt_layer7_fini);
+++ /dev/null
---- a/include/linux/netfilter/xt_layer7.h
-+++ b/include/linux/netfilter/xt_layer7.h
-@@ -8,6 +8,7 @@ struct xt_layer7_info {
- char protocol[MAX_PROTOCOL_LEN];
- char pattern[MAX_PATTERN_LEN];
- u_int8_t invert;
-+ u_int8_t pkt;
- };
-
- #endif /* _XT_LAYER7_H */
---- a/net/netfilter/xt_layer7.c
-+++ b/net/netfilter/xt_layer7.c
-@@ -314,33 +314,35 @@ static int match_no_append(struct nf_con
- }
-
- /* add the new app data to the conntrack. Return number of bytes added. */
--static int add_data(struct nf_conn * master_conntrack,
-- char * app_data, int appdatalen)
-+static int add_datastr(char *target, int offset, char *app_data, int len)
- {
- int length = 0, i;
-- int oldlength = master_conntrack->layer7.app_data_len;
--
-- /* This is a fix for a race condition by Deti Fliegl. However, I'm not
-- clear on whether the race condition exists or whether this really
-- fixes it. I might just be being dense... Anyway, if it's not really
-- a fix, all it does is waste a very small amount of time. */
-- if(!master_conntrack->layer7.app_data) return 0;
-+ if (!target) return 0;
-
- /* Strip nulls. Make everything lower case (our regex lib doesn't
- do case insensitivity). Add it to the end of the current data. */
-- for(i = 0; i < maxdatalen-oldlength-1 &&
-- i < appdatalen; i++) {
-+ for(i = 0; i < maxdatalen-offset-1 && i < len; i++) {
- if(app_data[i] != '\0') {
- /* the kernel version of tolower mungs 'upper ascii' */
-- master_conntrack->layer7.app_data[length+oldlength] =
-+ target[length+offset] =
- isascii(app_data[i])?
- tolower(app_data[i]) : app_data[i];
- length++;
- }
- }
-+ target[length+offset] = '\0';
-+
-+ return length;
-+}
-+
-+/* add the new app data to the conntrack. Return number of bytes added. */
-+static int add_data(struct nf_conn * master_conntrack,
-+ char * app_data, int appdatalen)
-+{
-+ int length;
-
-- master_conntrack->layer7.app_data[length+oldlength] = '\0';
-- master_conntrack->layer7.app_data_len = length + oldlength;
-+ length = add_datastr(master_conntrack->layer7.app_data, master_conntrack->layer7.app_data_len, app_data, appdatalen);
-+ master_conntrack->layer7.app_data_len += length;
-
- return length;
- }
-@@ -438,7 +440,7 @@ match(const struct sk_buff *skbin,
-
- enum ip_conntrack_info master_ctinfo, ctinfo;
- struct nf_conn *master_conntrack, *conntrack;
-- unsigned char * app_data;
-+ unsigned char *app_data, *tmp_data;
- unsigned int pattern_result, appdatalen;
- regexp * comppattern;
-
-@@ -466,8 +468,8 @@ match(const struct sk_buff *skbin,
- master_conntrack = master_ct(master_conntrack);
-
- /* if we've classified it or seen too many packets */
-- if(total_acct_packets(master_conntrack) > num_packets ||
-- master_conntrack->layer7.app_proto) {
-+ if(!info->pkt && (total_acct_packets(master_conntrack) > num_packets ||
-+ master_conntrack->layer7.app_proto)) {
-
- pattern_result = match_no_append(conntrack, master_conntrack,
- ctinfo, master_ctinfo, info);
-@@ -500,6 +502,25 @@ match(const struct sk_buff *skbin,
- /* the return value gets checked later, when we're ready to use it */
- comppattern = compile_and_cache(info->pattern, info->protocol);
-
-+ if (info->pkt) {
-+ tmp_data = kmalloc(maxdatalen, GFP_ATOMIC);
-+ if(!tmp_data){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in match, bailing.\n");
-+ return info->invert;
-+ }
-+
-+ tmp_data[0] = '\0';
-+ add_datastr(tmp_data, 0, app_data, appdatalen);
-+ pattern_result = ((comppattern && regexec(comppattern, tmp_data)) ? 1 : 0);
-+
-+ kfree(tmp_data);
-+ tmp_data = NULL;
-+ spin_unlock_bh(&l7_lock);
-+
-+ return (pattern_result ^ info->invert);
-+ }
-+
- /* On the first packet of a connection, allocate space for app data */
- if(total_acct_packets(master_conntrack) == 1 && !skb->cb[0] &&
- !master_conntrack->layer7.app_data){
+++ /dev/null
---- a/include/linux/netfilter_ipv4/ip_tables.h
-+++ b/include/linux/netfilter_ipv4/ip_tables.h
-@@ -62,6 +62,7 @@ struct ipt_ip {
- #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */
- #define IPT_F_GOTO 0x02 /* Set if jump is a goto */
- #define IPT_F_MASK 0x03 /* All possible flag bits mask. */
-+#define IPT_F_NO_DEF_MATCH 0x80 /* Internal: no default match rules present */
-
- /* Values for "inv" field in struct ipt_ip. */
- #define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -88,6 +88,9 @@ ip_packet_match(const struct iphdr *ip,
-
- #define FWINV(bool, invflg) ((bool) ^ !!(ipinfo->invflags & (invflg)))
-
-+ if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
-+ return true;
-+
- if (FWINV((ip->saddr&ipinfo->smsk.s_addr) != ipinfo->src.s_addr,
- IPT_INV_SRCIP) ||
- FWINV((ip->daddr&ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr,
-@@ -138,13 +141,35 @@ ip_packet_match(const struct iphdr *ip,
- return false;
- }
-
-+#undef FWINV
- return true;
- }
-
- static bool
--ip_checkentry(const struct ipt_ip *ip)
-+ip_checkentry(struct ipt_ip *ip)
- {
-- if (ip->flags & ~IPT_F_MASK) {
-+#define FWINV(bool, invflg) ((bool) || (ip->invflags & (invflg)))
-+
-+ if (FWINV(ip->smsk.s_addr, IPT_INV_SRCIP) ||
-+ FWINV(ip->dmsk.s_addr, IPT_INV_DSTIP))
-+ goto has_match_rules;
-+
-+ if (FWINV(!!((const unsigned long *)ip->iniface_mask)[0],
-+ IPT_INV_VIA_IN) ||
-+ FWINV(!!((const unsigned long *)ip->outiface_mask)[0],
-+ IPT_INV_VIA_OUT))
-+ goto has_match_rules;
-+
-+ if (FWINV(ip->proto, IPT_INV_PROTO))
-+ goto has_match_rules;
-+
-+ if (FWINV(ip->flags&IPT_F_FRAG, IPT_INV_FRAG))
-+ goto has_match_rules;
-+
-+ ip->flags |= IPT_F_NO_DEF_MATCH;
-+
-+has_match_rules:
-+ if (ip->flags & ~(IPT_F_MASK|IPT_F_NO_DEF_MATCH)) {
- duprintf("Unknown flag bits set: %08X\n",
- ip->flags & ~IPT_F_MASK);
- return false;
-@@ -154,6 +179,8 @@ ip_checkentry(const struct ipt_ip *ip)
- ip->invflags & ~IPT_INV_MASK);
- return false;
- }
-+
-+#undef FWINV
- return true;
- }
-
-@@ -196,7 +223,6 @@ static inline bool unconditional(const s
- static const struct ipt_ip uncond;
-
- return memcmp(ip, &uncond, sizeof(uncond)) == 0;
--#undef FWINV
- }
-
- #if defined(CONFIG_NETFILTER_XT_TARGET_TRACE) || \
-@@ -321,8 +347,28 @@ ipt_do_table(struct sk_buff *skb,
- struct xt_match_param mtpar;
- struct xt_target_param tgpar;
-
-- /* Initialization */
- ip = ip_hdr(skb);
-+
-+ IP_NF_ASSERT(table->valid_hooks & (1 << hook));
-+ xt_info_rdlock_bh();
-+ private = table->private;
-+ table_base = private->entries[smp_processor_id()];
-+ e = get_entry(table_base, private->hook_entry[hook]);
-+
-+ if (e->target_offset <= sizeof(struct ipt_entry) &&
-+ (e->ip.flags & IPT_F_NO_DEF_MATCH)) {
-+ struct ipt_entry_target *t = ipt_get_target(e);
-+ if (!t->u.kernel.target->target) {
-+ int v = ((struct ipt_standard_target *)t)->verdict;
-+ if ((v < 0) && (v != IPT_RETURN)) {
-+ ADD_COUNTER(e->counters, ntohs(ip->tot_len), 1);
-+ xt_info_rdunlock_bh();
-+ return (unsigned)(-v) - 1;
-+ }
-+ }
-+ }
-+
-+ /* Initialization */
- indev = in ? in->name : nulldevname;
- outdev = out ? out->name : nulldevname;
- /* We handle fragments by dealing with the first fragment as
-@@ -339,13 +385,6 @@ ipt_do_table(struct sk_buff *skb,
- mtpar.family = tgpar.family = NFPROTO_IPV4;
- mtpar.hooknum = tgpar.hooknum = hook;
-
-- IP_NF_ASSERT(table->valid_hooks & (1 << hook));
-- xt_info_rdlock_bh();
-- private = table->private;
-- table_base = private->entries[smp_processor_id()];
--
-- e = get_entry(table_base, private->hook_entry[hook]);
--
- /* For return from builtin chain */
- back = get_entry(table_base, private->underflow[hook]);
-
-@@ -992,6 +1031,7 @@ copy_entries_to_user(unsigned int total_
- unsigned int i;
- const struct ipt_entry_match *m;
- const struct ipt_entry_target *t;
-+ u8 flags;
-
- e = (struct ipt_entry *)(loc_cpu_entry + off);
- if (copy_to_user(userptr + off
-@@ -1002,6 +1042,14 @@ copy_entries_to_user(unsigned int total_
- goto free_counters;
- }
-
-+ flags = e->ip.flags & ~IPT_F_NO_DEF_MATCH;
-+ if (copy_to_user(userptr + off
-+ + offsetof(struct ipt_entry, ip.flags),
-+ &flags, sizeof(flags)) != 0) {
-+ ret = -EFAULT;
-+ goto free_counters;
-+ }
-+
- for (i = sizeof(struct ipt_entry);
- i < e->target_offset;
- i += m->u.match_size) {
+++ /dev/null
---- /dev/null
-+++ b/drivers/net/imq.c
-@@ -0,0 +1,632 @@
-+/*
-+ * Pseudo-driver for the intermediate queue device.
-+ *
-+ * 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.
-+ *
-+ * Authors: Patrick McHardy, <kaber@trash.net>
-+ *
-+ * The first version was written by Martin Devera, <devik@cdi.cz>
-+ *
-+ * Credits: Jan Rafaj <imq2t@cedric.vabo.cz>
-+ * - Update patch to 2.4.21
-+ * Sebastian Strollo <sstrollo@nortelnetworks.com>
-+ * - Fix "Dead-loop on netdevice imq"-issue
-+ * Marcel Sebek <sebek64@post.cz>
-+ * - Update to 2.6.2-rc1
-+ *
-+ * After some time of inactivity there is a group taking care
-+ * of IMQ again: http://www.linuximq.net
-+ *
-+ *
-+ * 2004/06/30 - New version of IMQ patch to kernels <=2.6.7
-+ * including the following changes:
-+ *
-+ * - Correction of ipv6 support "+"s issue (Hasso Tepper)
-+ * - Correction of imq_init_devs() issue that resulted in
-+ * kernel OOPS unloading IMQ as module (Norbert Buchmuller)
-+ * - Addition of functionality to choose number of IMQ devices
-+ * during kernel config (Andre Correa)
-+ * - Addition of functionality to choose how IMQ hooks on
-+ * PRE and POSTROUTING (after or before NAT) (Andre Correa)
-+ * - Cosmetic corrections (Norbert Buchmuller) (Andre Correa)
-+ *
-+ *
-+ * 2005/12/16 - IMQ versions between 2.6.7 and 2.6.13 were
-+ * released with almost no problems. 2.6.14-x was released
-+ * with some important changes: nfcache was removed; After
-+ * some weeks of trouble we figured out that some IMQ fields
-+ * in skb were missing in skbuff.c - skb_clone and copy_skb_header.
-+ * These functions are correctly patched by this new patch version.
-+ *
-+ * Thanks for all who helped to figure out all the problems with
-+ * 2.6.14.x: Patrick McHardy, Rune Kock, VeNoMouS, Max CtRiX,
-+ * Kevin Shanahan, Richard Lucassen, Valery Dachev (hopefully
-+ * I didn't forget anybody). I apologize again for my lack of time.
-+ *
-+ *
-+ * 2008/06/17 - 2.6.25 - Changed imq.c to use qdisc_run() instead
-+ * of qdisc_restart() and moved qdisc_run() to tasklet to avoid
-+ * recursive locking. New initialization routines to fix 'rmmod' not
-+ * working anymore. Used code from ifb.c. (Jussi Kivilinna)
-+ *
-+ * 2008/08/06 - 2.6.26 - (JK)
-+ * - Replaced tasklet with 'netif_schedule()'.
-+ * - Cleaned up and added comments for imq_nf_queue().
-+ *
-+ * 2009/04/12
-+ * - Add skb_save_cb/skb_restore_cb helper functions for backuping
-+ * control buffer. This is needed because qdisc-layer on kernels
-+ * 2.6.27 and newer overwrite control buffer. (Jussi Kivilinna)
-+ * - Add better locking for IMQ device. Hopefully this will solve
-+ * SMP issues. (Jussi Kivilinna)
-+ * - Port to 2.6.27
-+ * - Port to 2.6.28
-+ * - Port to 2.6.29 + fix rmmod not working
-+ *
-+ * 2009/04/20 - (Jussi Kivilinna)
-+ * - Use netdevice feature flags to avoid extra packet handling
-+ * by core networking layer and possibly increase performance.
-+ *
-+ * 2009/09/26 - (Jussi Kivilinna)
-+ * - Add imq_nf_reinject_lockless to fix deadlock with
-+ * imq_nf_queue/imq_nf_reinject.
-+ *
-+ * 2009/12/08 - (Jussi Kivilinna)
-+ * - Port to 2.6.32
-+ * - Add check for skb->nf_queue_entry==NULL in imq_dev_xmit()
-+ * - Also add better error checking for skb->nf_queue_entry usage
-+ *
-+ * Also, many thanks to pablo Sebastian Greco for making the initial
-+ * patch and to those who helped the testing.
-+ *
-+ * More info at: http://www.linuximq.net/ (Andre Correa)
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/moduleparam.h>
-+#include <linux/list.h>
-+#include <linux/skbuff.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/rtnetlink.h>
-+#include <linux/if_arp.h>
-+#include <linux/netfilter.h>
-+#include <linux/netfilter_ipv4.h>
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ #include <linux/netfilter_ipv6.h>
-+#endif
-+#include <linux/imq.h>
-+#include <net/pkt_sched.h>
-+#include <net/netfilter/nf_queue.h>
-+
-+static nf_hookfn imq_nf_hook;
-+
-+static struct nf_hook_ops imq_ingress_ipv4 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET,
-+ .hooknum = NF_INET_PRE_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ .priority = NF_IP_PRI_MANGLE + 1
-+#else
-+ .priority = NF_IP_PRI_NAT_DST + 1
-+#endif
-+};
-+
-+static struct nf_hook_ops imq_egress_ipv4 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET,
-+ .hooknum = NF_INET_POST_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_AA) || defined(CONFIG_IMQ_BEHAVIOR_BA)
-+ .priority = NF_IP_PRI_LAST
-+#else
-+ .priority = NF_IP_PRI_NAT_SRC - 1
-+#endif
-+};
-+
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+static struct nf_hook_ops imq_ingress_ipv6 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET6,
-+ .hooknum = NF_INET_PRE_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ .priority = NF_IP6_PRI_MANGLE + 1
-+#else
-+ .priority = NF_IP6_PRI_NAT_DST + 1
-+#endif
-+};
-+
-+static struct nf_hook_ops imq_egress_ipv6 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET6,
-+ .hooknum = NF_INET_POST_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_AA) || defined(CONFIG_IMQ_BEHAVIOR_BA)
-+ .priority = NF_IP6_PRI_LAST
-+#else
-+ .priority = NF_IP6_PRI_NAT_SRC - 1
-+#endif
-+};
-+#endif
-+
-+#if defined(CONFIG_IMQ_NUM_DEVS)
-+static unsigned int numdevs = CONFIG_IMQ_NUM_DEVS;
-+#else
-+static unsigned int numdevs = IMQ_MAX_DEVS;
-+#endif
-+
-+static DEFINE_SPINLOCK(imq_nf_queue_lock);
-+
-+static struct net_device *imq_devs_cache[IMQ_MAX_DEVS];
-+
-+
-+static struct net_device_stats *imq_get_stats(struct net_device *dev)
-+{
-+ return &dev->stats;
-+}
-+
-+/* called for packets kfree'd in qdiscs at places other than enqueue */
-+static void imq_skb_destructor(struct sk_buff *skb)
-+{
-+ struct nf_queue_entry *entry = skb->nf_queue_entry;
-+
-+ skb->nf_queue_entry = NULL;
-+
-+ if (entry) {
-+ nf_queue_entry_release_refs(entry);
-+ kfree(entry);
-+ }
-+
-+ skb_restore_cb(skb); /* kfree backup */
-+}
-+
-+/* locking not needed when called from imq_nf_queue */
-+static void imq_nf_reinject_lockless(struct nf_queue_entry *entry,
-+ unsigned int verdict)
-+{
-+ int status;
-+
-+ if (!entry->next_outfn) {
-+ nf_reinject(entry, verdict);
-+ return;
-+ }
-+
-+ status = entry->next_outfn(entry, entry->next_queuenum);
-+ if (status < 0) {
-+ nf_queue_entry_release_refs(entry);
-+ kfree_skb(entry->skb);
-+ kfree(entry);
-+ }
-+}
-+
-+static void imq_nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
-+{
-+ int status;
-+
-+ if (!entry->next_outfn) {
-+ spin_lock_bh(&imq_nf_queue_lock);
-+ nf_reinject(entry, verdict);
-+ spin_unlock_bh(&imq_nf_queue_lock);
-+ return;
-+ }
-+
-+ rcu_read_lock();
-+ local_bh_disable();
-+ status = entry->next_outfn(entry, entry->next_queuenum);
-+ local_bh_enable();
-+ if (status < 0) {
-+ nf_queue_entry_release_refs(entry);
-+ kfree_skb(entry->skb);
-+ kfree(entry);
-+ }
-+
-+ rcu_read_unlock();
-+}
-+
-+static netdev_tx_t imq_dev_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+ struct nf_queue_entry *entry = skb->nf_queue_entry;
-+
-+ skb->nf_queue_entry = NULL;
-+ dev->trans_start = jiffies;
-+
-+ dev->stats.tx_bytes += skb->len;
-+ dev->stats.tx_packets++;
-+
-+ if (entry == NULL) {
-+ /* We don't know what is going on here.. packet is queued for
-+ * imq device, but (probably) not by us.
-+ *
-+ * If this packet was not send here by imq_nf_queue(), then
-+ * skb_save_cb() was not used and skb_free() should not show:
-+ * WARNING: IMQ: kfree_skb: skb->cb_next:..
-+ * and/or
-+ * WARNING: IMQ: kfree_skb: skb->nf_queue_entry...
-+ *
-+ * However if this message is shown, then IMQ is somehow broken
-+ * and you should report this to linuximq.net.
-+ */
-+
-+ /* imq_dev_xmit is black hole that eats all packets, report that
-+ * we eat this packet happily and increase dropped counters.
-+ */
-+
-+ dev->stats.tx_dropped++;
-+ dev_kfree_skb(skb);
-+
-+ return NETDEV_TX_OK;
-+ }
-+
-+ skb_restore_cb(skb); /* restore skb->cb */
-+
-+ skb->imq_flags = 0;
-+ skb->destructor = NULL;
-+
-+ imq_nf_reinject(entry, NF_ACCEPT);
-+
-+ return NETDEV_TX_OK;
-+}
-+
-+static int imq_nf_queue(struct nf_queue_entry *entry, unsigned queue_num)
-+{
-+ struct net_device *dev;
-+ struct sk_buff *skb_orig, *skb, *skb_shared;
-+ struct Qdisc *q;
-+ struct netdev_queue *txq;
-+ int users, index;
-+ int retval = -EINVAL;
-+
-+ index = entry->skb->imq_flags & IMQ_F_IFMASK;
-+ if (unlikely(index > numdevs - 1)) {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING
-+ "IMQ: invalid device specified, highest is %u\n",
-+ numdevs - 1);
-+ retval = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* check for imq device by index from cache */
-+ dev = imq_devs_cache[index];
-+ if (unlikely(!dev)) {
-+ char buf[8];
-+
-+ /* get device by name and cache result */
-+ snprintf(buf, sizeof(buf), "imq%d", index);
-+ dev = dev_get_by_name(&init_net, buf);
-+ if (!dev) {
-+ /* not found ?!*/
-+ BUG();
-+ retval = -ENODEV;
-+ goto out;
-+ }
-+
-+ imq_devs_cache[index] = dev;
-+ dev_put(dev);
-+ }
-+
-+ if (unlikely(!(dev->flags & IFF_UP))) {
-+ entry->skb->imq_flags = 0;
-+ imq_nf_reinject_lockless(entry, NF_ACCEPT);
-+ retval = 0;
-+ goto out;
-+ }
-+ dev->last_rx = jiffies;
-+
-+ skb = entry->skb;
-+ skb_orig = NULL;
-+
-+ /* skb has owner? => make clone */
-+ if (unlikely(skb->destructor)) {
-+ skb_orig = skb;
-+ skb = skb_clone(skb, GFP_ATOMIC);
-+ if (!skb) {
-+ retval = -ENOMEM;
-+ goto out;
-+ }
-+ entry->skb = skb;
-+ }
-+
-+ skb->nf_queue_entry = entry;
-+
-+ dev->stats.rx_bytes += skb->len;
-+ dev->stats.rx_packets++;
-+
-+ txq = dev_pick_tx(dev, skb);
-+
-+ q = rcu_dereference(txq->qdisc);
-+ if (unlikely(!q->enqueue))
-+ goto packet_not_eaten_by_imq_dev;
-+
-+ spin_lock_bh(qdisc_lock(q));
-+
-+ users = atomic_read(&skb->users);
-+
-+ skb_shared = skb_get(skb); /* increase reference count by one */
-+ skb_save_cb(skb_shared); /* backup skb->cb, as qdisc layer will
-+ overwrite it */
-+ qdisc_enqueue_root(skb_shared, q); /* might kfree_skb */
-+
-+ if (likely(atomic_read(&skb_shared->users) == users + 1)) {
-+ kfree_skb(skb_shared); /* decrease reference count by one */
-+
-+ skb->destructor = &imq_skb_destructor;
-+
-+ /* cloned? */
-+ if (skb_orig)
-+ kfree_skb(skb_orig); /* free original */
-+
-+ spin_unlock_bh(qdisc_lock(q));
-+
-+ /* schedule qdisc dequeue */
-+ __netif_schedule(q);
-+
-+ retval = 0;
-+ goto out;
-+ } else {
-+ skb_restore_cb(skb_shared); /* restore skb->cb */
-+ skb->nf_queue_entry = NULL;
-+ /* qdisc dropped packet and decreased skb reference count of
-+ * skb, so we don't really want to and try refree as that would
-+ * actually destroy the skb. */
-+ spin_unlock_bh(qdisc_lock(q));
-+ goto packet_not_eaten_by_imq_dev;
-+ }
-+
-+packet_not_eaten_by_imq_dev:
-+ /* cloned? restore original */
-+ if (skb_orig) {
-+ kfree_skb(skb);
-+ entry->skb = skb_orig;
-+ }
-+ retval = -1;
-+out:
-+ return retval;
-+}
-+
-+static struct nf_queue_handler nfqh = {
-+ .name = "imq",
-+ .outfn = imq_nf_queue,
-+};
-+
-+static unsigned int imq_nf_hook(unsigned int hook, struct sk_buff *pskb,
-+ const struct net_device *indev,
-+ const struct net_device *outdev,
-+ int (*okfn)(struct sk_buff *))
-+{
-+ if (pskb->imq_flags & IMQ_F_ENQUEUE)
-+ return NF_QUEUE;
-+
-+ return NF_ACCEPT;
-+}
-+
-+static int imq_close(struct net_device *dev)
-+{
-+ netif_stop_queue(dev);
-+ return 0;
-+}
-+
-+static int imq_open(struct net_device *dev)
-+{
-+ netif_start_queue(dev);
-+ return 0;
-+}
-+
-+static const struct net_device_ops imq_netdev_ops = {
-+ .ndo_open = imq_open,
-+ .ndo_stop = imq_close,
-+ .ndo_start_xmit = imq_dev_xmit,
-+ .ndo_get_stats = imq_get_stats,
-+};
-+
-+static void imq_setup(struct net_device *dev)
-+{
-+ dev->netdev_ops = &imq_netdev_ops;
-+ dev->type = ARPHRD_VOID;
-+ dev->mtu = 16000;
-+ dev->tx_queue_len = 11000;
-+ dev->flags = IFF_NOARP;
-+ dev->features = NETIF_F_SG | NETIF_F_FRAGLIST |
-+ NETIF_F_GSO | NETIF_F_HW_CSUM |
-+ NETIF_F_HIGHDMA;
-+ dev->priv_flags &= ~IFF_XMIT_DST_RELEASE;
-+}
-+
-+static int imq_validate(struct nlattr *tb[], struct nlattr *data[])
-+{
-+ int ret = 0;
-+
-+ if (tb[IFLA_ADDRESS]) {
-+ if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN) {
-+ ret = -EINVAL;
-+ goto end;
-+ }
-+ if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS]))) {
-+ ret = -EADDRNOTAVAIL;
-+ goto end;
-+ }
-+ }
-+ return 0;
-+end:
-+ printk(KERN_WARNING "IMQ: imq_validate failed (%d)\n", ret);
-+ return ret;
-+}
-+
-+static struct rtnl_link_ops imq_link_ops __read_mostly = {
-+ .kind = "imq",
-+ .priv_size = 0,
-+ .setup = imq_setup,
-+ .validate = imq_validate,
-+};
-+
-+static int __init imq_init_hooks(void)
-+{
-+ int err;
-+
-+ nf_register_queue_imq_handler(&nfqh);
-+
-+ err = nf_register_hook(&imq_ingress_ipv4);
-+ if (err)
-+ goto err1;
-+
-+ err = nf_register_hook(&imq_egress_ipv4);
-+ if (err)
-+ goto err2;
-+
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ err = nf_register_hook(&imq_ingress_ipv6);
-+ if (err)
-+ goto err3;
-+
-+ err = nf_register_hook(&imq_egress_ipv6);
-+ if (err)
-+ goto err4;
-+#endif
-+
-+ return 0;
-+
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+err4:
-+ nf_unregister_hook(&imq_ingress_ipv6);
-+err3:
-+ nf_unregister_hook(&imq_egress_ipv4);
-+#endif
-+err2:
-+ nf_unregister_hook(&imq_ingress_ipv4);
-+err1:
-+ nf_unregister_queue_imq_handler();
-+ return err;
-+}
-+
-+static int __init imq_init_one(int index)
-+{
-+ struct net_device *dev;
-+ int ret;
-+
-+ dev = alloc_netdev(0, "imq%d", imq_setup);
-+ if (!dev)
-+ return -ENOMEM;
-+
-+ ret = dev_alloc_name(dev, dev->name);
-+ if (ret < 0)
-+ goto fail;
-+
-+ dev->rtnl_link_ops = &imq_link_ops;
-+ ret = register_netdevice(dev);
-+ if (ret < 0)
-+ goto fail;
-+
-+ return 0;
-+fail:
-+ free_netdev(dev);
-+ return ret;
-+}
-+
-+static int __init imq_init_devs(void)
-+{
-+ int err, i;
-+
-+ if (numdevs < 1 || numdevs > IMQ_MAX_DEVS) {
-+ printk(KERN_ERR "IMQ: numdevs has to be betweed 1 and %u\n",
-+ IMQ_MAX_DEVS);
-+ return -EINVAL;
-+ }
-+
-+ rtnl_lock();
-+ err = __rtnl_link_register(&imq_link_ops);
-+
-+ for (i = 0; i < numdevs && !err; i++)
-+ err = imq_init_one(i);
-+
-+ if (err) {
-+ __rtnl_link_unregister(&imq_link_ops);
-+ memset(imq_devs_cache, 0, sizeof(imq_devs_cache));
-+ }
-+ rtnl_unlock();
-+
-+ return err;
-+}
-+
-+static int __init imq_init_module(void)
-+{
-+ int err;
-+
-+#if defined(CONFIG_IMQ_NUM_DEVS)
-+ BUILD_BUG_ON(CONFIG_IMQ_NUM_DEVS > 16);
-+ BUILD_BUG_ON(CONFIG_IMQ_NUM_DEVS < 2);
-+ BUILD_BUG_ON(CONFIG_IMQ_NUM_DEVS - 1 > IMQ_F_IFMASK);
-+#endif
-+
-+ err = imq_init_devs();
-+ if (err) {
-+ printk(KERN_ERR "IMQ: Error trying imq_init_devs(net)\n");
-+ return err;
-+ }
-+
-+ err = imq_init_hooks();
-+ if (err) {
-+ printk(KERN_ERR "IMQ: Error trying imq_init_hooks()\n");
-+ rtnl_link_unregister(&imq_link_ops);
-+ memset(imq_devs_cache, 0, sizeof(imq_devs_cache));
-+ return err;
-+ }
-+
-+ printk(KERN_INFO "IMQ driver loaded successfully.\n");
-+
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ printk(KERN_INFO "\tHooking IMQ before NAT on PREROUTING.\n");
-+#else
-+ printk(KERN_INFO "\tHooking IMQ after NAT on PREROUTING.\n");
-+#endif
-+#if defined(CONFIG_IMQ_BEHAVIOR_AB) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ printk(KERN_INFO "\tHooking IMQ before NAT on POSTROUTING.\n");
-+#else
-+ printk(KERN_INFO "\tHooking IMQ after NAT on POSTROUTING.\n");
-+#endif
-+
-+ return 0;
-+}
-+
-+static void __exit imq_unhook(void)
-+{
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ nf_unregister_hook(&imq_ingress_ipv6);
-+ nf_unregister_hook(&imq_egress_ipv6);
-+#endif
-+ nf_unregister_hook(&imq_ingress_ipv4);
-+ nf_unregister_hook(&imq_egress_ipv4);
-+
-+ nf_unregister_queue_imq_handler();
-+}
-+
-+static void __exit imq_cleanup_devs(void)
-+{
-+ rtnl_link_unregister(&imq_link_ops);
-+ memset(imq_devs_cache, 0, sizeof(imq_devs_cache));
-+}
-+
-+static void __exit imq_exit_module(void)
-+{
-+ imq_unhook();
-+ imq_cleanup_devs();
-+ printk(KERN_INFO "IMQ driver unloaded successfully.\n");
-+}
-+
-+module_init(imq_init_module);
-+module_exit(imq_exit_module);
-+
-+module_param(numdevs, int, 0);
-+MODULE_PARM_DESC(numdevs, "number of IMQ devices (how many imq* devices will "
-+ "be created)");
-+MODULE_AUTHOR("http://www.linuximq.net");
-+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See "
-+ "http://www.linuximq.net/ for more information.");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS_RTNL_LINK("imq");
-+
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -109,6 +109,129 @@ config EQUALIZER
- To compile this driver as a module, choose M here: the module
- will be called eql. If unsure, say N.
-
-+config IMQ
-+ tristate "IMQ (intermediate queueing device) support"
-+ depends on NETDEVICES && NETFILTER
-+ ---help---
-+ The IMQ device(s) is used as placeholder for QoS queueing
-+ disciplines. Every packet entering/leaving the IP stack can be
-+ directed through the IMQ device where it's enqueued/dequeued to the
-+ attached qdisc. This allows you to treat network devices as classes
-+ and distribute bandwidth among them. Iptables is used to specify
-+ through which IMQ device, if any, packets travel.
-+
-+ More information at: http://www.linuximq.net/
-+
-+ To compile this driver as a module, choose M here: the module
-+ will be called imq. If unsure, say N.
-+
-+choice
-+ prompt "IMQ behavior (PRE/POSTROUTING)"
-+ depends on IMQ
-+ default IMQ_BEHAVIOR_AB
-+ help
-+
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ IMQ can work in any of the following ways:
-+
-+ PREROUTING | POSTROUTING
-+ -----------------|-------------------
-+ #1 After NAT | After NAT
-+ #2 After NAT | Before NAT
-+ #3 Before NAT | After NAT
-+ #4 Before NAT | Before NAT
-+
-+ The default behavior is to hook before NAT on PREROUTING
-+ and after NAT on POSTROUTING (#3).
-+
-+ This settings are specially usefull when trying to use IMQ
-+ to shape NATed clients.
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_AA
-+ bool "IMQ AA"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: After NAT
-+ POSTROUTING: After NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_AB
-+ bool "IMQ AB"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: After NAT
-+ POSTROUTING: Before NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_BA
-+ bool "IMQ BA"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: Before NAT
-+ POSTROUTING: After NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_BB
-+ bool "IMQ BB"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: Before NAT
-+ POSTROUTING: Before NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+endchoice
-+
-+config IMQ_NUM_DEVS
-+
-+ int "Number of IMQ devices"
-+ range 2 16
-+ depends on IMQ
-+ default "16"
-+ help
-+
-+ This settings defines how many IMQ devices will be
-+ created.
-+
-+ The default value is 16.
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
- config TUN
- tristate "Universal TUN/TAP device driver support"
- select CRC32
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -165,6 +165,7 @@ obj-$(CONFIG_SLHC) += slhc.o
- obj-$(CONFIG_XEN_NETDEV_FRONTEND) += xen-netfront.o
-
- obj-$(CONFIG_DUMMY) += dummy.o
-+obj-$(CONFIG_IMQ) += imq.o
- obj-$(CONFIG_IFB) += ifb.o
- obj-$(CONFIG_MACVLAN) += macvlan.o
- obj-$(CONFIG_DE600) += de600.o
---- /dev/null
-+++ b/include/linux/imq.h
-@@ -0,0 +1,13 @@
-+#ifndef _IMQ_H
-+#define _IMQ_H
-+
-+/* IFMASK (16 device indexes, 0 to 15) and flag(s) fit in 5 bits */
-+#define IMQ_F_BITS 5
-+
-+#define IMQ_F_IFMASK 0x0f
-+#define IMQ_F_ENQUEUE 0x10
-+
-+#define IMQ_MAX_DEVS (IMQ_F_IFMASK + 1)
-+
-+#endif /* _IMQ_H */
-+
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -1168,6 +1168,7 @@ extern int dev_alloc_name(struct net_de
- extern int dev_open(struct net_device *dev);
- extern int dev_close(struct net_device *dev);
- extern void dev_disable_lro(struct net_device *dev);
-+extern struct netdev_queue *dev_pick_tx(struct net_device *dev, struct sk_buff *skb);
- extern int dev_queue_xmit(struct sk_buff *skb);
- extern int register_netdevice(struct net_device *dev);
- extern void unregister_netdevice_queue(struct net_device *dev,
---- /dev/null
-+++ b/include/linux/netfilter/xt_IMQ.h
-@@ -0,0 +1,9 @@
-+#ifndef _XT_IMQ_H
-+#define _XT_IMQ_H
-+
-+struct xt_imq_info {
-+ unsigned int todev; /* target imq device */
-+};
-+
-+#endif /* _XT_IMQ_H */
-+
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ipt_IMQ.h
-@@ -0,0 +1,10 @@
-+#ifndef _IPT_IMQ_H
-+#define _IPT_IMQ_H
-+
-+/* Backwards compatibility for old userspace */
-+#include <linux/netfilter/xt_IMQ.h>
-+
-+#define ipt_imq_info xt_imq_info
-+
-+#endif /* _IPT_IMQ_H */
-+
---- /dev/null
-+++ b/include/linux/netfilter_ipv6/ip6t_IMQ.h
-@@ -0,0 +1,10 @@
-+#ifndef _IP6T_IMQ_H
-+#define _IP6T_IMQ_H
-+
-+/* Backwards compatibility for old userspace */
-+#include <linux/netfilter/xt_IMQ.h>
-+
-+#define ip6t_imq_info xt_imq_info
-+
-+#endif /* _IP6T_IMQ_H */
-+
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -29,6 +29,9 @@
- #include <linux/rcupdate.h>
- #include <linux/dmaengine.h>
- #include <linux/hrtimer.h>
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+#include <linux/imq.h>
-+#endif
-
- /* Don't change this without changing skb_csum_unnecessary! */
- #define CHECKSUM_NONE 0
-@@ -327,6 +330,9 @@
- * first. This is owned by whoever has the skb queued ATM.
- */
- char cb[48] __aligned(8);
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ void *cb_next;
-+#endif
-
- unsigned long _skb_dst;
- #ifdef CONFIG_XFRM
-@@ -363,6 +369,9 @@
- struct nf_conntrack *nfct;
- struct sk_buff *nfct_reasm;
- #endif
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ struct nf_queue_entry *nf_queue_entry;
-+#endif
- #ifdef CONFIG_BRIDGE_NETFILTER
- struct nf_bridge_info *nf_bridge;
- #endif
-@@ -384,6 +393,10 @@
-
- /* 0/14 bit hole */
-
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ __u8 imq_flags:IMQ_F_BITS;
-+#endif
-+
- #ifdef CONFIG_NET_DMA
- dma_cookie_t dma_cookie;
- #endif
-@@ -432,6 +445,12 @@
- return (struct rtable *)skb_dst(skb);
- }
-
-+
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+extern int skb_save_cb(struct sk_buff *skb);
-+extern int skb_restore_cb(struct sk_buff *skb);
-+#endif
-+
- extern void kfree_skb(struct sk_buff *skb);
- extern void consume_skb(struct sk_buff *skb);
- extern void __kfree_skb(struct sk_buff *skb);
-@@ -1976,6 +1995,10 @@
- dst->nfct_reasm = src->nfct_reasm;
- nf_conntrack_get_reasm(src->nfct_reasm);
- #endif
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ dst->imq_flags = src->imq_flags;
-+ dst->nf_queue_entry = src->nf_queue_entry;
-+#endif
- #ifdef CONFIG_BRIDGE_NETFILTER
- dst->nf_bridge = src->nf_bridge;
- nf_bridge_get(src->nf_bridge);
---- a/include/net/netfilter/nf_queue.h
-+++ b/include/net/netfilter/nf_queue.h
-@@ -13,6 +13,12 @@ struct nf_queue_entry {
- struct net_device *indev;
- struct net_device *outdev;
- int (*okfn)(struct sk_buff *);
-+
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ int (*next_outfn)(struct nf_queue_entry *entry,
-+ unsigned int queuenum);
-+ unsigned int next_queuenum;
-+#endif
- };
-
- #define nf_queue_entry_reroute(x) ((void *)x + sizeof(struct nf_queue_entry))
-@@ -30,5 +36,11 @@ extern int nf_unregister_queue_handler(u
- const struct nf_queue_handler *qh);
- extern void nf_unregister_queue_handlers(const struct nf_queue_handler *qh);
- extern void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict);
-+extern void nf_queue_entry_release_refs(struct nf_queue_entry *entry);
-+
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+extern void nf_register_queue_imq_handler(const struct nf_queue_handler *qh);
-+extern void nf_unregister_queue_imq_handler(void);
-+#endif
-
- #endif /* _NF_QUEUE_H */
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -97,6 +97,9 @@
- #include <net/net_namespace.h>
- #include <net/sock.h>
- #include <linux/rtnetlink.h>
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+#include <linux/imq.h>
-+#endif
- #include <linux/proc_fs.h>
- #include <linux/seq_file.h>
- #include <linux/stat.h>
-@@ -1810,7 +1813,11 @@ int dev_hard_start_xmit(struct sk_buff *
- int rc = NETDEV_TX_OK;
-
- if (likely(!skb->next)) {
-- if (!list_empty(&ptype_all))
-+ if (!list_empty(&ptype_all)
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ && !(skb->imq_flags & IMQ_F_ENQUEUE)
-+#endif
-+ )
- dev_queue_xmit_nit(skb, dev);
-
- if (netif_needs_gso(dev, skb)) {
-@@ -1912,8 +1919,7 @@ static inline u16 dev_cap_txqueue(struct
- return queue_index;
- }
-
--static struct netdev_queue *dev_pick_tx(struct net_device *dev,
-- struct sk_buff *skb)
-+struct netdev_queue *dev_pick_tx(struct net_device *dev, struct sk_buff *skb)
- {
- u16 queue_index;
- struct sock *sk = skb->sk;
-@@ -1939,6 +1945,7 @@ static struct netdev_queue *dev_pick_tx(
- skb_set_queue_mapping(skb, queue_index);
- return netdev_get_tx_queue(dev, queue_index);
- }
-+EXPORT_SYMBOL(dev_pick_tx);
-
- static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q,
- struct net_device *dev,
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
-@@ -72,6 +72,9 @@
-
- static struct kmem_cache *skbuff_head_cache __read_mostly;
- static struct kmem_cache *skbuff_fclone_cache __read_mostly;
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+static struct kmem_cache *skbuff_cb_store_cache __read_mostly;
-+#endif
-
- static void sock_pipe_buf_release(struct pipe_inode_info *pipe,
- struct pipe_buffer *buf)
-@@ -91,6 +94,83 @@ static int sock_pipe_buf_steal(struct pi
- return 1;
- }
-
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+/* Control buffer save/restore for IMQ devices */
-+struct skb_cb_table {
-+ void *cb_next;
-+ atomic_t refcnt;
-+ char cb[48];
-+};
-+
-+static DEFINE_SPINLOCK(skb_cb_store_lock);
-+
-+int skb_save_cb(struct sk_buff *skb)
-+{
-+ struct skb_cb_table *next;
-+
-+ next = kmem_cache_alloc(skbuff_cb_store_cache, GFP_ATOMIC);
-+ if (!next)
-+ return -ENOMEM;
-+
-+ BUILD_BUG_ON(sizeof(skb->cb) != sizeof(next->cb));
-+
-+ memcpy(next->cb, skb->cb, sizeof(skb->cb));
-+ next->cb_next = skb->cb_next;
-+
-+ atomic_set(&next->refcnt, 1);
-+
-+ skb->cb_next = next;
-+ return 0;
-+}
-+EXPORT_SYMBOL(skb_save_cb);
-+
-+int skb_restore_cb(struct sk_buff *skb)
-+{
-+ struct skb_cb_table *next;
-+
-+ if (!skb->cb_next)
-+ return 0;
-+
-+ next = skb->cb_next;
-+
-+ BUILD_BUG_ON(sizeof(skb->cb) != sizeof(next->cb));
-+
-+ memcpy(skb->cb, next->cb, sizeof(skb->cb));
-+ skb->cb_next = next->cb_next;
-+
-+ spin_lock(&skb_cb_store_lock);
-+
-+ if (atomic_dec_and_test(&next->refcnt)) {
-+ kmem_cache_free(skbuff_cb_store_cache, next);
-+ }
-+
-+ spin_unlock(&skb_cb_store_lock);
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL(skb_restore_cb);
-+
-+static void skb_copy_stored_cb(struct sk_buff *new, const struct sk_buff *__old)
-+{
-+ struct skb_cb_table *next;
-+ struct sk_buff *old;
-+
-+ if (!__old->cb_next) {
-+ new->cb_next = NULL;
-+ return;
-+ }
-+
-+ spin_lock(&skb_cb_store_lock);
-+
-+ old = (struct sk_buff *)__old;
-+
-+ next = old->cb_next;
-+ atomic_inc(&next->refcnt);
-+ new->cb_next = next;
-+
-+ spin_unlock(&skb_cb_store_lock);
-+}
-+#endif
-
- /* Pipe buffer operations for a socket. */
- static const struct pipe_buf_operations sock_pipe_buf_ops = {
-@@ -398,6 +478,26 @@ static void skb_release_head_state(struc
- WARN_ON(in_irq());
- skb->destructor(skb);
- }
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ /* This should not happen. When it does, avoid memleak by restoring
-+ the chain of cb-backups. */
-+ while(skb->cb_next != NULL) {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "IMQ: kfree_skb: skb->cb_next: "
-+ "%08x\n", (unsigned int)skb->cb_next);
-+
-+ skb_restore_cb(skb);
-+ }
-+ /* This should not happen either, nf_queue_entry is nullified in
-+ * imq_dev_xmit(). If we have non-NULL nf_queue_entry then we are
-+ * leaking entry pointers, maybe memory. We don't know if this is
-+ * pointer to already freed memory, or should this be freed.
-+ * If this happens we need to add refcounting, etc for nf_queue_entry.
-+ */
-+ if (skb->nf_queue_entry && net_ratelimit())
-+ printk(KERN_WARNING
-+ "IMQ: kfree_skb: skb->nf_queue_entry != NULL");
-+#endif
- #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
- nf_conntrack_put(skb->nfct);
- nf_conntrack_put_reasm(skb->nfct_reasm);
-@@ -538,6 +638,9 @@ static void __copy_skb_header(struct sk_
- new->sp = secpath_get(old->sp);
- #endif
- memcpy(new->cb, old->cb, sizeof(old->cb));
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ skb_copy_stored_cb(new, old);
-+#endif
- new->csum = old->csum;
- new->local_df = old->local_df;
- new->pkt_type = old->pkt_type;
-@@ -2779,6 +2882,13 @@ void __init skb_init(void)
- 0,
- SLAB_HWCACHE_ALIGN|SLAB_PANIC,
- NULL);
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ skbuff_cb_store_cache = kmem_cache_create("skbuff_cb_store_cache",
-+ sizeof(struct skb_cb_table),
-+ 0,
-+ SLAB_HWCACHE_ALIGN|SLAB_PANIC,
-+ NULL);
-+#endif
- }
-
- /**
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -396,6 +396,18 @@ config NETFILTER_XT_TARGET_LED
- For more information on the LEDs available on your system, see
- Documentation/leds-class.txt
-
-+config NETFILTER_XT_TARGET_IMQ
-+ tristate '"IMQ" target support'
-+ depends on NETFILTER_XTABLES
-+ depends on IP_NF_MANGLE || IP6_NF_MANGLE
-+ select IMQ
-+ default m if NETFILTER_ADVANCED=n
-+ help
-+ This option adds a `IMQ' target which is used to specify if and
-+ to which imq device packets should get enqueued/dequeued.
-+
-+ To compile it as a module, choose M here. If unsure, say N.
-+
- config NETFILTER_XT_TARGET_MARK
- tristate '"MARK" target support'
- default m if NETFILTER_ADVANCED=n
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -46,6 +46,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CONNMAR
- obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_HL) += xt_HL.o
-+obj-$(CONFIG_NETFILTER_XT_TARGET_IMQ) += xt_IMQ.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_MARK) += xt_MARK.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_NFLOG) += xt_NFLOG.o
---- a/net/netfilter/nf_queue.c
-+++ b/net/netfilter/nf_queue.c
-@@ -20,6 +20,26 @@ static const struct nf_queue_handler *qu
-
- static DEFINE_MUTEX(queue_handler_mutex);
-
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+static const struct nf_queue_handler *queue_imq_handler;
-+
-+void nf_register_queue_imq_handler(const struct nf_queue_handler *qh)
-+{
-+ mutex_lock(&queue_handler_mutex);
-+ rcu_assign_pointer(queue_imq_handler, qh);
-+ mutex_unlock(&queue_handler_mutex);
-+}
-+EXPORT_SYMBOL(nf_register_queue_imq_handler);
-+
-+void nf_unregister_queue_imq_handler(void)
-+{
-+ mutex_lock(&queue_handler_mutex);
-+ rcu_assign_pointer(queue_imq_handler, NULL);
-+ mutex_unlock(&queue_handler_mutex);
-+}
-+EXPORT_SYMBOL(nf_unregister_queue_imq_handler);
-+#endif
-+
- /* return EBUSY when somebody else is registered, return EEXIST if the
- * same handler is registered, return 0 in case of success. */
- int nf_register_queue_handler(u_int8_t pf, const struct nf_queue_handler *qh)
-@@ -80,7 +100,7 @@ void nf_unregister_queue_handlers(const
- }
- EXPORT_SYMBOL_GPL(nf_unregister_queue_handlers);
-
--static void nf_queue_entry_release_refs(struct nf_queue_entry *entry)
-+void nf_queue_entry_release_refs(struct nf_queue_entry *entry)
- {
- /* Release those devices we held, or Alexey will kill me. */
- if (entry->indev)
-@@ -100,6 +120,7 @@ static void nf_queue_entry_release_refs(
- /* Drop reference to owner of hook which queued us. */
- module_put(entry->elem->owner);
- }
-+EXPORT_SYMBOL_GPL(nf_queue_entry_release_refs);
-
- /*
- * Any packet that leaves via this function must come back
-@@ -121,12 +142,26 @@ static int __nf_queue(struct sk_buff *sk
- #endif
- const struct nf_afinfo *afinfo;
- const struct nf_queue_handler *qh;
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ const struct nf_queue_handler *qih = NULL;
-+#endif
-
- /* QUEUE == DROP if noone is waiting, to be safe. */
- rcu_read_lock();
-
- qh = rcu_dereference(queue_handler[pf]);
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ if (pf == PF_INET || pf == PF_INET6)
-+#else
-+ if (pf == PF_INET)
-+#endif
-+ qih = rcu_dereference(queue_imq_handler);
-+
-+ if (!qh && !qih)
-+#else /* !IMQ */
- if (!qh)
-+#endif
- goto err_unlock;
-
- afinfo = nf_get_afinfo(pf);
-@@ -145,6 +180,10 @@ static int __nf_queue(struct sk_buff *sk
- .indev = indev,
- .outdev = outdev,
- .okfn = okfn,
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ .next_outfn = qh ? qh->outfn : NULL,
-+ .next_queuenum = queuenum,
-+#endif
- };
-
- /* If it's going away, ignore hook. */
-@@ -170,8 +209,19 @@ static int __nf_queue(struct sk_buff *sk
- }
- #endif
- afinfo->saveroute(skb, entry);
-+
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ if (qih) {
-+ status = qih->outfn(entry, queuenum);
-+ goto imq_skip_queue;
-+ }
-+#endif
-+
- status = qh->outfn(entry, queuenum);
-
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+imq_skip_queue:
-+#endif
- rcu_read_unlock();
-
- if (status < 0) {
---- /dev/null
-+++ b/net/netfilter/xt_IMQ.c
-@@ -0,0 +1,73 @@
-+/*
-+ * This target marks packets to be enqueued to an imq device
-+ */
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter/x_tables.h>
-+#include <linux/netfilter/xt_IMQ.h>
-+#include <linux/imq.h>
-+
-+static unsigned int imq_target(struct sk_buff *pskb,
-+ const struct xt_target_param *par)
-+{
-+ const struct xt_imq_info *mr = par->targinfo;
-+
-+ pskb->imq_flags = (mr->todev & IMQ_F_IFMASK) | IMQ_F_ENQUEUE;
-+
-+ return XT_CONTINUE;
-+}
-+
-+static bool imq_checkentry(const struct xt_tgchk_param *par)
-+{
-+ struct xt_imq_info *mr = par->targinfo;
-+
-+ if (mr->todev > IMQ_MAX_DEVS - 1) {
-+ printk(KERN_WARNING
-+ "IMQ: invalid device specified, highest is %u\n",
-+ IMQ_MAX_DEVS - 1);
-+ return 0;
-+ }
-+
-+ return 1;
-+}
-+
-+static struct xt_target xt_imq_reg[] __read_mostly = {
-+ {
-+ .name = "IMQ",
-+ .family = AF_INET,
-+ .checkentry = imq_checkentry,
-+ .target = imq_target,
-+ .targetsize = sizeof(struct xt_imq_info),
-+ .table = "mangle",
-+ .me = THIS_MODULE
-+ },
-+ {
-+ .name = "IMQ",
-+ .family = AF_INET6,
-+ .checkentry = imq_checkentry,
-+ .target = imq_target,
-+ .targetsize = sizeof(struct xt_imq_info),
-+ .table = "mangle",
-+ .me = THIS_MODULE
-+ },
-+};
-+
-+static int __init imq_init(void)
-+{
-+ return xt_register_targets(xt_imq_reg, ARRAY_SIZE(xt_imq_reg));
-+}
-+
-+static void __exit imq_fini(void)
-+{
-+ xt_unregister_targets(xt_imq_reg, ARRAY_SIZE(xt_imq_reg));
-+}
-+
-+module_init(imq_init);
-+module_exit(imq_fini);
-+
-+MODULE_AUTHOR("http://www.linuximq.net");
-+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See http://www.linuximq.net/ for more information.");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS("ipt_IMQ");
-+MODULE_ALIAS("ip6t_IMQ");
-+
+++ /dev/null
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -160,7 +160,6 @@ config NF_CONNTRACK_FTP
-
- config NF_CONNTRACK_H323
- tristate "H.323 protocol support"
-- depends on (IPV6 || IPV6=n)
- depends on NETFILTER_ADVANCED
- help
- H.323 is a VoIP signalling protocol from ITU-T. As one of the most
-@@ -505,7 +504,6 @@ config NETFILTER_XT_TARGET_SECMARK
-
- config NETFILTER_XT_TARGET_TCPMSS
- tristate '"TCPMSS" target support'
-- depends on (IPV6 || IPV6=n)
- default m if NETFILTER_ADVANCED=n
- ---help---
- This option adds a `TCPMSS' target, which allows you to alter the
+++ /dev/null
---- /dev/null
-+++ b/include/linux/netfilter/nf_conntrack_rtsp.h
-@@ -0,0 +1,63 @@
-+/*
-+ * RTSP extension for IP connection tracking.
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_conntrack_irc.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.
-+ */
-+#ifndef _IP_CONNTRACK_RTSP_H
-+#define _IP_CONNTRACK_RTSP_H
-+
-+//#define IP_NF_RTSP_DEBUG 1
-+#define IP_NF_RTSP_VERSION "0.6.21"
-+
-+#ifdef __KERNEL__
-+/* port block types */
-+typedef enum {
-+ pb_single, /* client_port=x */
-+ pb_range, /* client_port=x-y */
-+ pb_discon /* client_port=x/y (rtspbis) */
-+} portblock_t;
-+
-+/* We record seq number and length of rtsp headers here, all in host order. */
-+
-+/*
-+ * This structure is per expected connection. It is a member of struct
-+ * ip_conntrack_expect. The TCP SEQ for the conntrack expect is stored
-+ * there and we are expected to only store the length of the data which
-+ * needs replaced. If a packet contains multiple RTSP messages, we create
-+ * one expected connection per message.
-+ *
-+ * We use these variables to mark the entire header block. This may seem
-+ * like overkill, but the nature of RTSP requires it. A header may appear
-+ * multiple times in a message. We must treat two Transport headers the
-+ * same as one Transport header with two entries.
-+ */
-+struct ip_ct_rtsp_expect
-+{
-+ u_int32_t len; /* length of header block */
-+ portblock_t pbtype; /* Type of port block that was requested */
-+ u_int16_t loport; /* Port that was requested, low or first */
-+ u_int16_t hiport; /* Port that was requested, high or second */
-+#if 0
-+ uint method; /* RTSP method */
-+ uint cseq; /* CSeq from request */
-+#endif
-+};
-+
-+extern unsigned int (*nf_nat_rtsp_hook)(struct sk_buff *skb,
-+ enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen,
-+ struct ip_ct_rtsp_expect *prtspexp,
-+ struct nf_conntrack_expect *exp);
-+
-+extern void (*nf_nat_rtsp_hook_expectfn)(struct nf_conn *ct, struct nf_conntrack_expect *exp);
-+
-+#define RTSP_PORT 554
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _IP_CONNTRACK_RTSP_H */
---- /dev/null
-+++ b/include/linux/netfilter_helpers.h
-@@ -0,0 +1,133 @@
-+/*
-+ * Helpers for netfiler modules. This file provides implementations for basic
-+ * functions such as strncasecmp(), etc.
-+ *
-+ * gcc will warn for defined but unused functions, so we only include the
-+ * functions requested. The following macros are used:
-+ * NF_NEED_STRNCASECMP nf_strncasecmp()
-+ * NF_NEED_STRTOU16 nf_strtou16()
-+ * NF_NEED_STRTOU32 nf_strtou32()
-+ */
-+#ifndef _NETFILTER_HELPERS_H
-+#define _NETFILTER_HELPERS_H
-+
-+/* Only include these functions for kernel code. */
-+#ifdef __KERNEL__
-+
-+#include <linux/ctype.h>
-+#define iseol(c) ( (c) == '\r' || (c) == '\n' )
-+
-+/*
-+ * The standard strncasecmp()
-+ */
-+#ifdef NF_NEED_STRNCASECMP
-+static int
-+nf_strncasecmp(const char* s1, const char* s2, u_int32_t len)
-+{
-+ if (s1 == NULL || s2 == NULL)
-+ {
-+ if (s1 == NULL && s2 == NULL)
-+ {
-+ return 0;
-+ }
-+ return (s1 == NULL) ? -1 : 1;
-+ }
-+ while (len > 0 && tolower(*s1) == tolower(*s2))
-+ {
-+ len--;
-+ s1++;
-+ s2++;
-+ }
-+ return ( (len == 0) ? 0 : (tolower(*s1) - tolower(*s2)) );
-+}
-+#endif /* NF_NEED_STRNCASECMP */
-+
-+/*
-+ * Parse a string containing a 16-bit unsigned integer.
-+ * Returns the number of chars used, or zero if no number is found.
-+ */
-+#ifdef NF_NEED_STRTOU16
-+static int
-+nf_strtou16(const char* pbuf, u_int16_t* pval)
-+{
-+ int n = 0;
-+
-+ *pval = 0;
-+ while (isdigit(pbuf[n]))
-+ {
-+ *pval = (*pval * 10) + (pbuf[n] - '0');
-+ n++;
-+ }
-+
-+ return n;
-+}
-+#endif /* NF_NEED_STRTOU16 */
-+
-+/*
-+ * Parse a string containing a 32-bit unsigned integer.
-+ * Returns the number of chars used, or zero if no number is found.
-+ */
-+#ifdef NF_NEED_STRTOU32
-+static int
-+nf_strtou32(const char* pbuf, u_int32_t* pval)
-+{
-+ int n = 0;
-+
-+ *pval = 0;
-+ while (pbuf[n] >= '0' && pbuf[n] <= '9')
-+ {
-+ *pval = (*pval * 10) + (pbuf[n] - '0');
-+ n++;
-+ }
-+
-+ return n;
-+}
-+#endif /* NF_NEED_STRTOU32 */
-+
-+/*
-+ * Given a buffer and length, advance to the next line and mark the current
-+ * line.
-+ */
-+#ifdef NF_NEED_NEXTLINE
-+static int
-+nf_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
-+{
-+ uint off = *poff;
-+ uint physlen = 0;
-+
-+ if (off >= len)
-+ {
-+ return 0;
-+ }
-+
-+ while (p[off] != '\n')
-+ {
-+ if (len-off <= 1)
-+ {
-+ return 0;
-+ }
-+
-+ physlen++;
-+ off++;
-+ }
-+
-+ /* if we saw a crlf, physlen needs adjusted */
-+ if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
-+ {
-+ physlen--;
-+ }
-+
-+ /* advance past the newline */
-+ off++;
-+
-+ *plineoff = *poff;
-+ *plinelen = physlen;
-+ *poff = off;
-+
-+ return 1;
-+}
-+#endif /* NF_NEED_NEXTLINE */
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NETFILTER_HELPERS_H */
---- /dev/null
-+++ b/include/linux/netfilter_mime.h
-@@ -0,0 +1,89 @@
-+/*
-+ * MIME functions for netfilter modules. This file provides implementations
-+ * for basic MIME parsing. MIME headers are used in many protocols, such as
-+ * HTTP, RTSP, SIP, etc.
-+ *
-+ * gcc will warn for defined but unused functions, so we only include the
-+ * functions requested. The following macros are used:
-+ * NF_NEED_MIME_NEXTLINE nf_mime_nextline()
-+ */
-+#ifndef _NETFILTER_MIME_H
-+#define _NETFILTER_MIME_H
-+
-+/* Only include these functions for kernel code. */
-+#ifdef __KERNEL__
-+
-+#include <linux/ctype.h>
-+
-+/*
-+ * Given a buffer and length, advance to the next line and mark the current
-+ * line. If the current line is empty, *plinelen will be set to zero. If
-+ * not, it will be set to the actual line length (including CRLF).
-+ *
-+ * 'line' in this context means logical line (includes LWS continuations).
-+ * Returns 1 on success, 0 on failure.
-+ */
-+#ifdef NF_NEED_MIME_NEXTLINE
-+static int
-+nf_mime_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
-+{
-+ uint off = *poff;
-+ uint physlen = 0;
-+ int is_first_line = 1;
-+
-+ if (off >= len)
-+ {
-+ return 0;
-+ }
-+
-+ do
-+ {
-+ while (p[off] != '\n')
-+ {
-+ if (len-off <= 1)
-+ {
-+ return 0;
-+ }
-+
-+ physlen++;
-+ off++;
-+ }
-+
-+ /* if we saw a crlf, physlen needs adjusted */
-+ if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
-+ {
-+ physlen--;
-+ }
-+
-+ /* advance past the newline */
-+ off++;
-+
-+ /* check for an empty line */
-+ if (physlen == 0)
-+ {
-+ break;
-+ }
-+
-+ /* check for colon on the first physical line */
-+ if (is_first_line)
-+ {
-+ is_first_line = 0;
-+ if (memchr(p+(*poff), ':', physlen) == NULL)
-+ {
-+ return 0;
-+ }
-+ }
-+ }
-+ while (p[off] == ' ' || p[off] == '\t');
-+
-+ *plineoff = *poff;
-+ *plinelen = (physlen == 0) ? 0 : (off - *poff);
-+ *poff = off;
-+
-+ return 1;
-+}
-+#endif /* NF_NEED_MIME_NEXTLINE */
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NETFILTER_MIME_H */
---- a/net/ipv4/netfilter/Makefile
-+++ b/net/ipv4/netfilter/Makefile
-@@ -26,6 +26,7 @@ obj-$(CONFIG_NF_NAT_AMANDA) += nf_nat_am
- obj-$(CONFIG_NF_NAT_FTP) += nf_nat_ftp.o
- obj-$(CONFIG_NF_NAT_H323) += nf_nat_h323.o
- obj-$(CONFIG_NF_NAT_IRC) += nf_nat_irc.o
-+obj-$(CONFIG_NF_NAT_RTSP) += nf_nat_rtsp.o
- obj-$(CONFIG_NF_NAT_PPTP) += nf_nat_pptp.o
- obj-$(CONFIG_NF_NAT_SIP) += nf_nat_sip.o
- obj-$(CONFIG_NF_NAT_SNMP_BASIC) += nf_nat_snmp_basic.o
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -267,6 +267,16 @@ config NF_CONNTRACK_TFTP
-
- To compile it as a module, choose M here. If unsure, say N.
-
-+config NF_CONNTRACK_RTSP
-+ tristate "RTSP protocol support"
-+ depends on NF_CONNTRACK
-+ help
-+ Support the RTSP protocol. This allows UDP transports to be setup
-+ properly, including RTP and RDT.
-+
-+ If you want to compile it as a module, say 'M' here and read
-+ Documentation/modules.txt. If unsure, say 'Y'.
-+
- config NF_CT_NETLINK
- tristate 'Connection tracking netlink interface'
- select NETFILTER_NETLINK
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -33,6 +33,7 @@ obj-$(CONFIG_NF_CONNTRACK_PPTP) += nf_co
- obj-$(CONFIG_NF_CONNTRACK_SANE) += nf_conntrack_sane.o
- obj-$(CONFIG_NF_CONNTRACK_SIP) += nf_conntrack_sip.o
- obj-$(CONFIG_NF_CONNTRACK_TFTP) += nf_conntrack_tftp.o
-+obj-$(CONFIG_NF_CONNTRACK_RTSP) += nf_conntrack_rtsp.o
-
- # transparent proxy support
- obj-$(CONFIG_NETFILTER_TPROXY) += nf_tproxy_core.o
---- a/net/ipv4/netfilter/Kconfig
-+++ b/net/ipv4/netfilter/Kconfig
-@@ -257,6 +257,11 @@ config NF_NAT_IRC
- depends on NF_CONNTRACK && NF_NAT
- default NF_NAT && NF_CONNTRACK_IRC
-
-+config NF_NAT_RTSP
-+ tristate
-+ depends on IP_NF_IPTABLES && NF_CONNTRACK && NF_NAT
-+ default NF_NAT && NF_CONNTRACK_RTSP
-+
- config NF_NAT_TFTP
- tristate
- depends on NF_CONNTRACK && NF_NAT
---- /dev/null
-+++ b/net/netfilter/nf_conntrack_rtsp.c
-@@ -0,0 +1,517 @@
-+/*
-+ * RTSP extension for IP connection tracking
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_conntrack_irc.c
-+ *
-+ * 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.
-+ *
-+ * Module load syntax:
-+ * insmod nf_conntrack_rtsp.o ports=port1,port2,...port<MAX_PORTS>
-+ * max_outstanding=n setup_timeout=secs
-+ *
-+ * If no ports are specified, the default will be port 554.
-+ *
-+ * With max_outstanding you can define the maximum number of not yet
-+ * answered SETUP requests per RTSP session (default 8).
-+ * With setup_timeout you can specify how long the system waits for
-+ * an expected data channel (default 300 seconds).
-+ *
-+ * 2005-02-13: Harald Welte <laforge at netfilter.org>
-+ * - port to 2.6
-+ * - update to recent post-2.6.11 api changes
-+ * 2006-09-14: Steven Van Acker <deepstar at singularity.be>
-+ * - removed calls to NAT code from conntrack helper: NAT no longer needed to use rtsp-conntrack
-+ * 2007-04-18: Michael Guntsche <mike at it-loops.com>
-+ * - Port to new NF API
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/netfilter.h>
-+#include <linux/ip.h>
-+#include <linux/inet.h>
-+#include <net/tcp.h>
-+
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_expect.h>
-+#include <net/netfilter/nf_conntrack_helper.h>
-+#include <linux/netfilter/nf_conntrack_rtsp.h>
-+
-+#define NF_NEED_STRNCASECMP
-+#define NF_NEED_STRTOU16
-+#define NF_NEED_STRTOU32
-+#define NF_NEED_NEXTLINE
-+#include <linux/netfilter_helpers.h>
-+#define NF_NEED_MIME_NEXTLINE
-+#include <linux/netfilter_mime.h>
-+
-+#include <linux/ctype.h>
-+#define MAX_SIMUL_SETUP 8 /* XXX: use max_outstanding */
-+#define INFOP(fmt, args...) printk(KERN_INFO "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#if 0
-+#define DEBUGP(fmt, args...) printk(KERN_DEBUG "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#else
-+#define DEBUGP(fmt, args...)
-+#endif
-+
-+#define MAX_PORTS 8
-+static int ports[MAX_PORTS];
-+static int num_ports = 0;
-+static int max_outstanding = 8;
-+static unsigned int setup_timeout = 300;
-+
-+MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
-+MODULE_DESCRIPTION("RTSP connection tracking module");
-+MODULE_LICENSE("GPL");
-+module_param_array(ports, int, &num_ports, 0400);
-+MODULE_PARM_DESC(ports, "port numbers of RTSP servers");
-+module_param(max_outstanding, int, 0400);
-+MODULE_PARM_DESC(max_outstanding, "max number of outstanding SETUP requests per RTSP session");
-+module_param(setup_timeout, int, 0400);
-+MODULE_PARM_DESC(setup_timeout, "timeout on for unestablished data channels");
-+
-+static char *rtsp_buffer;
-+static DEFINE_SPINLOCK(rtsp_buffer_lock);
-+
-+unsigned int (*nf_nat_rtsp_hook)(struct sk_buff *skb,
-+ enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen,struct ip_ct_rtsp_expect* prtspexp,
-+ struct nf_conntrack_expect *exp);
-+void (*nf_nat_rtsp_hook_expectfn)(struct nf_conn *ct, struct nf_conntrack_expect *exp);
-+
-+EXPORT_SYMBOL_GPL(nf_nat_rtsp_hook);
-+
-+/*
-+ * Max mappings we will allow for one RTSP connection (for RTP, the number
-+ * of allocated ports is twice this value). Note that SMIL burns a lot of
-+ * ports so keep this reasonably high. If this is too low, you will see a
-+ * lot of "no free client map entries" messages.
-+ */
-+#define MAX_PORT_MAPS 16
-+
-+/*** default port list was here in the masq code: 554, 3030, 4040 ***/
-+
-+#define SKIP_WSPACE(ptr,len,off) while(off < len && isspace(*(ptr+off))) { off++; }
-+
-+/*
-+ * Parse an RTSP packet.
-+ *
-+ * Returns zero if parsing failed.
-+ *
-+ * Parameters:
-+ * IN ptcp tcp data pointer
-+ * IN tcplen tcp data len
-+ * IN/OUT ptcpoff points to current tcp offset
-+ * OUT phdrsoff set to offset of rtsp headers
-+ * OUT phdrslen set to length of rtsp headers
-+ * OUT pcseqoff set to offset of CSeq header
-+ * OUT pcseqlen set to length of CSeq header
-+ */
-+static int
-+rtsp_parse_message(char* ptcp, uint tcplen, uint* ptcpoff,
-+ uint* phdrsoff, uint* phdrslen,
-+ uint* pcseqoff, uint* pcseqlen,
-+ uint* transoff, uint* translen)
-+{
-+ uint entitylen = 0;
-+ uint lineoff;
-+ uint linelen;
-+
-+ if (!nf_nextline(ptcp, tcplen, ptcpoff, &lineoff, &linelen))
-+ return 0;
-+
-+ *phdrsoff = *ptcpoff;
-+ while (nf_mime_nextline(ptcp, tcplen, ptcpoff, &lineoff, &linelen)) {
-+ if (linelen == 0) {
-+ if (entitylen > 0)
-+ *ptcpoff += min(entitylen, tcplen - *ptcpoff);
-+ break;
-+ }
-+ if (lineoff+linelen > tcplen) {
-+ INFOP("!! overrun !!\n");
-+ break;
-+ }
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "CSeq:", 5) == 0) {
-+ *pcseqoff = lineoff;
-+ *pcseqlen = linelen;
-+ }
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0) {
-+ *transoff = lineoff;
-+ *translen = linelen;
-+ }
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "Content-Length:", 15) == 0) {
-+ uint off = lineoff+15;
-+ SKIP_WSPACE(ptcp+lineoff, linelen, off);
-+ nf_strtou32(ptcp+off, &entitylen);
-+ }
-+ }
-+ *phdrslen = (*ptcpoff) - (*phdrsoff);
-+
-+ return 1;
-+}
-+
-+/*
-+ * Find lo/hi client ports (if any) in transport header
-+ * In:
-+ * ptcp, tcplen = packet
-+ * tranoff, tranlen = buffer to search
-+ *
-+ * Out:
-+ * pport_lo, pport_hi = lo/hi ports (host endian)
-+ *
-+ * Returns nonzero if any client ports found
-+ *
-+ * Note: it is valid (and expected) for the client to request multiple
-+ * transports, so we need to parse the entire line.
-+ */
-+static int
-+rtsp_parse_transport(char* ptran, uint tranlen,
-+ struct ip_ct_rtsp_expect* prtspexp)
-+{
-+ int rc = 0;
-+ uint off = 0;
-+
-+ if (tranlen < 10 || !iseol(ptran[tranlen-1]) ||
-+ nf_strncasecmp(ptran, "Transport:", 10) != 0) {
-+ INFOP("sanity check failed\n");
-+ return 0;
-+ }
-+
-+ DEBUGP("tran='%.*s'\n", (int)tranlen, ptran);
-+ off += 10;
-+ SKIP_WSPACE(ptran, tranlen, off);
-+
-+ /* Transport: tran;field;field=val,tran;field;field=val,... */
-+ while (off < tranlen) {
-+ const char* pparamend;
-+ uint nextparamoff;
-+
-+ pparamend = memchr(ptran+off, ',', tranlen-off);
-+ pparamend = (pparamend == NULL) ? ptran+tranlen : pparamend+1;
-+ nextparamoff = pparamend-ptran;
-+
-+ while (off < nextparamoff) {
-+ const char* pfieldend;
-+ uint nextfieldoff;
-+
-+ pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+ nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+ if (strncmp(ptran+off, "client_port=", 12) == 0) {
-+ u_int16_t port;
-+ uint numlen;
-+
-+ off += 12;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ if (prtspexp->loport != 0 && prtspexp->loport != port)
-+ DEBUGP("multiple ports found, port %hu ignored\n", port);
-+ else {
-+ DEBUGP("lo port found : %hu\n", port);
-+ prtspexp->loport = prtspexp->hiport = port;
-+ if (ptran[off] == '-') {
-+ off++;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ prtspexp->pbtype = pb_range;
-+ prtspexp->hiport = port;
-+
-+ // If we have a range, assume rtp:
-+ // loport must be even, hiport must be loport+1
-+ if ((prtspexp->loport & 0x0001) != 0 ||
-+ prtspexp->hiport != prtspexp->loport+1) {
-+ DEBUGP("incorrect range: %hu-%hu, correcting\n",
-+ prtspexp->loport, prtspexp->hiport);
-+ prtspexp->loport &= 0xfffe;
-+ prtspexp->hiport = prtspexp->loport+1;
-+ }
-+ } else if (ptran[off] == '/') {
-+ off++;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ prtspexp->pbtype = pb_discon;
-+ prtspexp->hiport = port;
-+ }
-+ rc = 1;
-+ }
-+ }
-+
-+ /*
-+ * Note we don't look for the destination parameter here.
-+ * If we are using NAT, the NAT module will handle it. If not,
-+ * and the client is sending packets elsewhere, the expectation
-+ * will quietly time out.
-+ */
-+
-+ off = nextfieldoff;
-+ }
-+
-+ off = nextparamoff;
-+ }
-+
-+ return rc;
-+}
-+
-+void expected(struct nf_conn *ct, struct nf_conntrack_expect *exp)
-+{
-+ if(nf_nat_rtsp_hook_expectfn) {
-+ nf_nat_rtsp_hook_expectfn(ct,exp);
-+ }
-+}
-+
-+/*** conntrack functions ***/
-+
-+/* outbound packet: client->server */
-+
-+static inline int
-+help_out(struct sk_buff *skb, unsigned char *rb_ptr, unsigned int datalen,
-+ struct nf_conn *ct, enum ip_conntrack_info ctinfo)
-+{
-+ struct ip_ct_rtsp_expect expinfo;
-+
-+ int dir = CTINFO2DIR(ctinfo); /* = IP_CT_DIR_ORIGINAL */
-+ //struct tcphdr* tcph = (void*)iph + iph->ihl * 4;
-+ //uint tcplen = pktlen - iph->ihl * 4;
-+ char* pdata = rb_ptr;
-+ //uint datalen = tcplen - tcph->doff * 4;
-+ uint dataoff = 0;
-+ int ret = NF_ACCEPT;
-+
-+ struct nf_conntrack_expect *exp;
-+
-+ __be16 be_loport;
-+
-+ memset(&expinfo, 0, sizeof(expinfo));
-+
-+ while (dataoff < datalen) {
-+ uint cmdoff = dataoff;
-+ uint hdrsoff = 0;
-+ uint hdrslen = 0;
-+ uint cseqoff = 0;
-+ uint cseqlen = 0;
-+ uint transoff = 0;
-+ uint translen = 0;
-+ uint off;
-+
-+ if (!rtsp_parse_message(pdata, datalen, &dataoff,
-+ &hdrsoff, &hdrslen,
-+ &cseqoff, &cseqlen,
-+ &transoff, &translen))
-+ break; /* not a valid message */
-+
-+ if (strncmp(pdata+cmdoff, "SETUP ", 6) != 0)
-+ continue; /* not a SETUP message */
-+ DEBUGP("found a setup message\n");
-+
-+ off = 0;
-+ if(translen) {
-+ rtsp_parse_transport(pdata+transoff, translen, &expinfo);
-+ }
-+
-+ if (expinfo.loport == 0) {
-+ DEBUGP("no udp transports found\n");
-+ continue; /* no udp transports found */
-+ }
-+
-+ DEBUGP("udp transport found, ports=(%d,%hu,%hu)\n",
-+ (int)expinfo.pbtype, expinfo.loport, expinfo.hiport);
-+
-+ exp = nf_ct_expect_alloc(ct);
-+ if (!exp) {
-+ ret = NF_DROP;
-+ goto out;
-+ }
-+
-+ be_loport = htons(expinfo.loport);
-+
-+ nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
-+ ct->tuplehash[!dir].tuple.src.l3num,
-+ &ct->tuplehash[!dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3,
-+ IPPROTO_UDP, NULL, &be_loport);
-+
-+ exp->master = ct;
-+
-+ exp->expectfn = expected;
-+ exp->flags = 0;
-+
-+ if (expinfo.pbtype == pb_range) {
-+ DEBUGP("Changing expectation mask to handle multiple ports\n");
-+ exp->mask.src.u.udp.port = 0xfffe;
-+ }
-+
-+ DEBUGP("expect_related %u.%u.%u.%u:%u-%u.%u.%u.%u:%u\n",
-+ NIPQUAD(exp->tuple.src.u3.ip),
-+ ntohs(exp->tuple.src.u.udp.port),
-+ NIPQUAD(exp->tuple.dst.u3.ip),
-+ ntohs(exp->tuple.dst.u.udp.port));
-+
-+ if (nf_nat_rtsp_hook)
-+ /* pass the request off to the nat helper */
-+ ret = nf_nat_rtsp_hook(skb, ctinfo, hdrsoff, hdrslen, &expinfo, exp);
-+ else if (nf_ct_expect_related(exp) != 0) {
-+ INFOP("nf_ct_expect_related failed\n");
-+ ret = NF_DROP;
-+ }
-+ nf_ct_expect_put(exp);
-+ goto out;
-+ }
-+out:
-+
-+ return ret;
-+}
-+
-+
-+static inline int
-+help_in(struct sk_buff *skb, size_t pktlen,
-+ struct nf_conn* ct, enum ip_conntrack_info ctinfo)
-+{
-+ return NF_ACCEPT;
-+}
-+
-+static int help(struct sk_buff *skb, unsigned int protoff,
-+ struct nf_conn *ct, enum ip_conntrack_info ctinfo)
-+{
-+ struct tcphdr _tcph, *th;
-+ unsigned int dataoff, datalen;
-+ char *rb_ptr;
-+ int ret = NF_DROP;
-+
-+ /* Until there's been traffic both ways, don't look in packets. */
-+ if (ctinfo != IP_CT_ESTABLISHED &&
-+ ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) {
-+ DEBUGP("conntrackinfo = %u\n", ctinfo);
-+ return NF_ACCEPT;
-+ }
-+
-+ /* Not whole TCP header? */
-+ th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph);
-+
-+ if (!th)
-+ return NF_ACCEPT;
-+
-+ /* No data ? */
-+ dataoff = protoff + th->doff*4;
-+ datalen = skb->len - dataoff;
-+ if (dataoff >= skb->len)
-+ return NF_ACCEPT;
-+
-+ spin_lock_bh(&rtsp_buffer_lock);
-+ rb_ptr = skb_header_pointer(skb, dataoff,
-+ skb->len - dataoff, rtsp_buffer);
-+ BUG_ON(rb_ptr == NULL);
-+
-+#if 0
-+ /* Checksum invalid? Ignore. */
-+ /* FIXME: Source route IP option packets --RR */
-+ if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr,
-+ csum_partial((char*)tcph, tcplen, 0)))
-+ {
-+ DEBUGP("bad csum: %p %u %u.%u.%u.%u %u.%u.%u.%u\n",
-+ tcph, tcplen, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr));
-+ return NF_ACCEPT;
-+ }
-+#endif
-+
-+ switch (CTINFO2DIR(ctinfo)) {
-+ case IP_CT_DIR_ORIGINAL:
-+ ret = help_out(skb, rb_ptr, datalen, ct, ctinfo);
-+ break;
-+ case IP_CT_DIR_REPLY:
-+ DEBUGP("IP_CT_DIR_REPLY\n");
-+ /* inbound packet: server->client */
-+ ret = NF_ACCEPT;
-+ break;
-+ }
-+
-+ spin_unlock_bh(&rtsp_buffer_lock);
-+
-+ return ret;
-+}
-+
-+static struct nf_conntrack_helper rtsp_helpers[MAX_PORTS];
-+static char rtsp_names[MAX_PORTS][10];
-+static struct nf_conntrack_expect_policy rtsp_expect_policy;
-+
-+/* This function is intentionally _NOT_ defined as __exit */
-+static void
-+fini(void)
-+{
-+ int i;
-+ for (i = 0; i < num_ports; i++) {
-+ DEBUGP("unregistering port %d\n", ports[i]);
-+ nf_conntrack_helper_unregister(&rtsp_helpers[i]);
-+ }
-+ kfree(rtsp_buffer);
-+}
-+
-+static int __init
-+init(void)
-+{
-+ int i, ret;
-+ struct nf_conntrack_helper *hlpr;
-+ char *tmpname;
-+
-+ printk("nf_conntrack_rtsp v" IP_NF_RTSP_VERSION " loading\n");
-+
-+ if (max_outstanding < 1) {
-+ printk("nf_conntrack_rtsp: max_outstanding must be a positive integer\n");
-+ return -EBUSY;
-+ }
-+ if (setup_timeout < 0) {
-+ printk("nf_conntrack_rtsp: setup_timeout must be a positive integer\n");
-+ return -EBUSY;
-+ }
-+
-+ rtsp_expect_policy.max_expected = max_outstanding;
-+ rtsp_expect_policy.timeout = setup_timeout;
-+
-+ rtsp_buffer = kmalloc(65536, GFP_KERNEL);
-+ if (!rtsp_buffer)
-+ return -ENOMEM;
-+
-+ /* If no port given, default to standard rtsp port */
-+ if (ports[0] == 0) {
-+ ports[0] = RTSP_PORT;
-+ }
-+
-+ for (i = 0; (i < MAX_PORTS) && ports[i]; i++) {
-+ hlpr = &rtsp_helpers[i];
-+ memset(hlpr, 0, sizeof(struct nf_conntrack_helper));
-+ hlpr->tuple.src.u.tcp.port = htons(ports[i]);
-+ hlpr->tuple.dst.protonum = IPPROTO_TCP;
-+ hlpr->expect_policy = &rtsp_expect_policy;
-+ hlpr->me = THIS_MODULE;
-+ hlpr->help = help;
-+
-+ tmpname = &rtsp_names[i][0];
-+ if (ports[i] == RTSP_PORT) {
-+ sprintf(tmpname, "rtsp");
-+ } else {
-+ sprintf(tmpname, "rtsp-%d", i);
-+ }
-+ hlpr->name = tmpname;
-+
-+ DEBUGP("port #%d: %d\n", i, ports[i]);
-+
-+ ret = nf_conntrack_helper_register(hlpr);
-+
-+ if (ret) {
-+ printk("nf_conntrack_rtsp: ERROR registering port %d\n", ports[i]);
-+ fini();
-+ return -EBUSY;
-+ }
-+ num_ports++;
-+ }
-+ return 0;
-+}
-+
-+module_init(init);
-+module_exit(fini);
-+
-+EXPORT_SYMBOL(nf_nat_rtsp_hook_expectfn);
-+
---- /dev/null
-+++ b/net/ipv4/netfilter/nf_nat_rtsp.c
-@@ -0,0 +1,496 @@
-+/*
-+ * RTSP extension for TCP NAT alteration
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_nat_irc.c
-+ *
-+ * 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.
-+ *
-+ * Module load syntax:
-+ * insmod nf_nat_rtsp.o ports=port1,port2,...port<MAX_PORTS>
-+ * stunaddr=<address>
-+ * destaction=[auto|strip|none]
-+ *
-+ * If no ports are specified, the default will be port 554 only.
-+ *
-+ * stunaddr specifies the address used to detect that a client is using STUN.
-+ * If this address is seen in the destination parameter, it is assumed that
-+ * the client has already punched a UDP hole in the firewall, so we don't
-+ * mangle the client_port. If none is specified, it is autodetected. It
-+ * only needs to be set if you have multiple levels of NAT. It should be
-+ * set to the external address that the STUN clients detect. Note that in
-+ * this case, it will not be possible for clients to use UDP with servers
-+ * between the NATs.
-+ *
-+ * If no destaction is specified, auto is used.
-+ * destaction=auto: strip destination parameter if it is not stunaddr.
-+ * destaction=strip: always strip destination parameter (not recommended).
-+ * destaction=none: do not touch destination parameter (not recommended).
-+ */
-+
-+#include <linux/module.h>
-+#include <net/tcp.h>
-+#include <net/netfilter/nf_nat_helper.h>
-+#include <net/netfilter/nf_nat_rule.h>
-+#include <linux/netfilter/nf_conntrack_rtsp.h>
-+#include <net/netfilter/nf_conntrack_expect.h>
-+
-+#include <linux/inet.h>
-+#include <linux/ctype.h>
-+#define NF_NEED_STRNCASECMP
-+#define NF_NEED_STRTOU16
-+#include <linux/netfilter_helpers.h>
-+#define NF_NEED_MIME_NEXTLINE
-+#include <linux/netfilter_mime.h>
-+
-+#define INFOP(fmt, args...) printk(KERN_INFO "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#if 0
-+#define DEBUGP(fmt, args...) printk(KERN_DEBUG "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#else
-+#define DEBUGP(fmt, args...)
-+#endif
-+
-+#define MAX_PORTS 8
-+#define DSTACT_AUTO 0
-+#define DSTACT_STRIP 1
-+#define DSTACT_NONE 2
-+
-+static char* stunaddr = NULL;
-+static char* destaction = NULL;
-+
-+static u_int32_t extip = 0;
-+static int dstact = 0;
-+
-+MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
-+MODULE_DESCRIPTION("RTSP network address translation module");
-+MODULE_LICENSE("GPL");
-+module_param(stunaddr, charp, 0644);
-+MODULE_PARM_DESC(stunaddr, "Address for detecting STUN");
-+module_param(destaction, charp, 0644);
-+MODULE_PARM_DESC(destaction, "Action for destination parameter (auto/strip/none)");
-+
-+#define SKIP_WSPACE(ptr,len,off) while(off < len && isspace(*(ptr+off))) { off++; }
-+
-+/*** helper functions ***/
-+
-+static void
-+get_skb_tcpdata(struct sk_buff* skb, char** pptcpdata, uint* ptcpdatalen)
-+{
-+ struct iphdr* iph = ip_hdr(skb);
-+ struct tcphdr* tcph = (void *)iph + ip_hdrlen(skb);
-+
-+ *pptcpdata = (char*)tcph + tcph->doff*4;
-+ *ptcpdatalen = ((char*)skb_transport_header(skb) + skb->len) - *pptcpdata;
-+}
-+
-+/*** nat functions ***/
-+
-+/*
-+ * Mangle the "Transport:" header:
-+ * - Replace all occurences of "client_port=<spec>"
-+ * - Handle destination parameter
-+ *
-+ * In:
-+ * ct, ctinfo = conntrack context
-+ * skb = packet
-+ * tranoff = Transport header offset from TCP data
-+ * tranlen = Transport header length (incl. CRLF)
-+ * rport_lo = replacement low port (host endian)
-+ * rport_hi = replacement high port (host endian)
-+ *
-+ * Returns packet size difference.
-+ *
-+ * Assumes that a complete transport header is present, ending with CR or LF
-+ */
-+static int
-+rtsp_mangle_tran(enum ip_conntrack_info ctinfo,
-+ struct nf_conntrack_expect* exp,
-+ struct ip_ct_rtsp_expect* prtspexp,
-+ struct sk_buff* skb, uint tranoff, uint tranlen)
-+{
-+ char* ptcp;
-+ uint tcplen;
-+ char* ptran;
-+ char rbuf1[16]; /* Replacement buffer (one port) */
-+ uint rbuf1len; /* Replacement len (one port) */
-+ char rbufa[16]; /* Replacement buffer (all ports) */
-+ uint rbufalen; /* Replacement len (all ports) */
-+ u_int32_t newip;
-+ u_int16_t loport, hiport;
-+ uint off = 0;
-+ uint diff; /* Number of bytes we removed */
-+
-+ struct nf_conn *ct = exp->master;
-+ struct nf_conntrack_tuple *t;
-+
-+ char szextaddr[15+1];
-+ uint extaddrlen;
-+ int is_stun;
-+
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ ptran = ptcp+tranoff;
-+
-+ if (tranoff+tranlen > tcplen || tcplen-tranoff < tranlen ||
-+ tranlen < 10 || !iseol(ptran[tranlen-1]) ||
-+ nf_strncasecmp(ptran, "Transport:", 10) != 0)
-+ {
-+ INFOP("sanity check failed\n");
-+ return 0;
-+ }
-+ off += 10;
-+ SKIP_WSPACE(ptcp+tranoff, tranlen, off);
-+
-+ newip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip;
-+ t = &exp->tuple;
-+ t->dst.u3.ip = newip;
-+
-+ extaddrlen = extip ? sprintf(szextaddr, "%u.%u.%u.%u", NIPQUAD(extip))
-+ : sprintf(szextaddr, "%u.%u.%u.%u", NIPQUAD(newip));
-+ DEBUGP("stunaddr=%s (%s)\n", szextaddr, (extip?"forced":"auto"));
-+
-+ rbuf1len = rbufalen = 0;
-+ switch (prtspexp->pbtype)
-+ {
-+ case pb_single:
-+ for (loport = prtspexp->loport; loport != 0; loport++) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(loport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ DEBUGP("using port %hu\n", loport);
-+ break;
-+ }
-+ }
-+ if (loport != 0)
-+ {
-+ rbuf1len = sprintf(rbuf1, "%hu", loport);
-+ rbufalen = sprintf(rbufa, "%hu", loport);
-+ }
-+ break;
-+ case pb_range:
-+ for (loport = prtspexp->loport; loport != 0; loport += 2) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(loport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ hiport = loport + ~exp->mask.src.u.udp.port;
-+ DEBUGP("using ports %hu-%hu\n", loport, hiport);
-+ break;
-+ }
-+ }
-+ if (loport != 0)
-+ {
-+ rbuf1len = sprintf(rbuf1, "%hu", loport);
-+ rbufalen = sprintf(rbufa, "%hu-%hu", loport, loport+1);
-+ }
-+ break;
-+ case pb_discon:
-+ for (loport = prtspexp->loport; loport != 0; loport++) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(loport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ DEBUGP("using port %hu (1 of 2)\n", loport);
-+ break;
-+ }
-+ }
-+ for (hiport = prtspexp->hiport; hiport != 0; hiport++) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(hiport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ DEBUGP("using port %hu (2 of 2)\n", hiport);
-+ break;
-+ }
-+ }
-+ if (loport != 0 && hiport != 0)
-+ {
-+ rbuf1len = sprintf(rbuf1, "%hu", loport);
-+ if (hiport == loport+1)
-+ {
-+ rbufalen = sprintf(rbufa, "%hu-%hu", loport, hiport);
-+ }
-+ else
-+ {
-+ rbufalen = sprintf(rbufa, "%hu/%hu", loport, hiport);
-+ }
-+ }
-+ break;
-+ }
-+
-+ if (rbuf1len == 0)
-+ {
-+ return 0; /* cannot get replacement port(s) */
-+ }
-+
-+ /* Transport: tran;field;field=val,tran;field;field=val,... */
-+ while (off < tranlen)
-+ {
-+ uint saveoff;
-+ const char* pparamend;
-+ uint nextparamoff;
-+
-+ pparamend = memchr(ptran+off, ',', tranlen-off);
-+ pparamend = (pparamend == NULL) ? ptran+tranlen : pparamend+1;
-+ nextparamoff = pparamend-ptcp;
-+
-+ /*
-+ * We pass over each param twice. On the first pass, we look for a
-+ * destination= field. It is handled by the security policy. If it
-+ * is present, allowed, and equal to our external address, we assume
-+ * that STUN is being used and we leave the client_port= field alone.
-+ */
-+ is_stun = 0;
-+ saveoff = off;
-+ while (off < nextparamoff)
-+ {
-+ const char* pfieldend;
-+ uint nextfieldoff;
-+
-+ pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+ nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+ if (dstact != DSTACT_NONE && strncmp(ptran+off, "destination=", 12) == 0)
-+ {
-+ if (strncmp(ptran+off+12, szextaddr, extaddrlen) == 0)
-+ {
-+ is_stun = 1;
-+ }
-+ if (dstact == DSTACT_STRIP || (dstact == DSTACT_AUTO && !is_stun))
-+ {
-+ diff = nextfieldoff-off;
-+ if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
-+ off, diff, NULL, 0))
-+ {
-+ /* mangle failed, all we can do is bail */
-+ nf_ct_unexpect_related(exp);
-+ return 0;
-+ }
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ ptran = ptcp+tranoff;
-+ tranlen -= diff;
-+ nextparamoff -= diff;
-+ nextfieldoff -= diff;
-+ }
-+ }
-+
-+ off = nextfieldoff;
-+ }
-+ if (is_stun)
-+ {
-+ continue;
-+ }
-+ off = saveoff;
-+ while (off < nextparamoff)
-+ {
-+ const char* pfieldend;
-+ uint nextfieldoff;
-+
-+ pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+ nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+ if (strncmp(ptran+off, "client_port=", 12) == 0)
-+ {
-+ u_int16_t port;
-+ uint numlen;
-+ uint origoff;
-+ uint origlen;
-+ char* rbuf = rbuf1;
-+ uint rbuflen = rbuf1len;
-+
-+ off += 12;
-+ origoff = (ptran-ptcp)+off;
-+ origlen = 0;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ origlen += numlen;
-+ if (port != prtspexp->loport)
-+ {
-+ DEBUGP("multiple ports found, port %hu ignored\n", port);
-+ }
-+ else
-+ {
-+ if (ptran[off] == '-' || ptran[off] == '/')
-+ {
-+ off++;
-+ origlen++;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ origlen += numlen;
-+ rbuf = rbufa;
-+ rbuflen = rbufalen;
-+ }
-+
-+ /*
-+ * note we cannot just memcpy() if the sizes are the same.
-+ * the mangle function does skb resizing, checks for a
-+ * cloned skb, and updates the checksums.
-+ *
-+ * parameter 4 below is offset from start of tcp data.
-+ */
-+ diff = origlen-rbuflen;
-+ if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
-+ origoff, origlen, rbuf, rbuflen))
-+ {
-+ /* mangle failed, all we can do is bail */
-+ nf_ct_unexpect_related(exp);
-+ return 0;
-+ }
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ ptran = ptcp+tranoff;
-+ tranlen -= diff;
-+ nextparamoff -= diff;
-+ nextfieldoff -= diff;
-+ }
-+ }
-+
-+ off = nextfieldoff;
-+ }
-+
-+ off = nextparamoff;
-+ }
-+
-+ return 1;
-+}
-+
-+static uint
-+help_out(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen, struct ip_ct_rtsp_expect* prtspexp,
-+ struct nf_conntrack_expect* exp)
-+{
-+ char* ptcp;
-+ uint tcplen;
-+ uint hdrsoff;
-+ uint hdrslen;
-+ uint lineoff;
-+ uint linelen;
-+ uint off;
-+
-+ //struct iphdr* iph = (struct iphdr*)skb->nh.iph;
-+ //struct tcphdr* tcph = (struct tcphdr*)((void*)iph + iph->ihl*4);
-+
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ hdrsoff = matchoff;//exp->seq - ntohl(tcph->seq);
-+ hdrslen = matchlen;
-+ off = hdrsoff;
-+ DEBUGP("NAT rtsp help_out\n");
-+
-+ while (nf_mime_nextline(ptcp, hdrsoff+hdrslen, &off, &lineoff, &linelen))
-+ {
-+ if (linelen == 0)
-+ {
-+ break;
-+ }
-+ if (off > hdrsoff+hdrslen)
-+ {
-+ INFOP("!! overrun !!");
-+ break;
-+ }
-+ DEBUGP("hdr: len=%u, %.*s", linelen, (int)linelen, ptcp+lineoff);
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0)
-+ {
-+ uint oldtcplen = tcplen;
-+ DEBUGP("hdr: Transport\n");
-+ if (!rtsp_mangle_tran(ctinfo, exp, prtspexp, skb, lineoff, linelen))
-+ {
-+ DEBUGP("hdr: Transport mangle failed");
-+ break;
-+ }
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ hdrslen -= (oldtcplen-tcplen);
-+ off -= (oldtcplen-tcplen);
-+ lineoff -= (oldtcplen-tcplen);
-+ linelen -= (oldtcplen-tcplen);
-+ DEBUGP("rep: len=%u, %.*s", linelen, (int)linelen, ptcp+lineoff);
-+ }
-+ }
-+
-+ return NF_ACCEPT;
-+}
-+
-+static unsigned int
-+help(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen, struct ip_ct_rtsp_expect* prtspexp,
-+ struct nf_conntrack_expect* exp)
-+{
-+ int dir = CTINFO2DIR(ctinfo);
-+ int rc = NF_ACCEPT;
-+
-+ switch (dir)
-+ {
-+ case IP_CT_DIR_ORIGINAL:
-+ rc = help_out(skb, ctinfo, matchoff, matchlen, prtspexp, exp);
-+ break;
-+ case IP_CT_DIR_REPLY:
-+ DEBUGP("unmangle ! %u\n", ctinfo);
-+ /* XXX: unmangle */
-+ rc = NF_ACCEPT;
-+ break;
-+ }
-+ //UNLOCK_BH(&ip_rtsp_lock);
-+
-+ return rc;
-+}
-+
-+static void expected(struct nf_conn* ct, struct nf_conntrack_expect *exp)
-+{
-+ struct nf_nat_multi_range_compat mr;
-+ u_int32_t newdstip, newsrcip, newip;
-+
-+ struct nf_conn *master = ct->master;
-+
-+ newdstip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+ newsrcip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+ //FIXME (how to port that ?)
-+ //code from 2.4 : newip = (HOOK2MANIP(hooknum) == IP_NAT_MANIP_SRC) ? newsrcip : newdstip;
-+ newip = newdstip;
-+
-+ DEBUGP("newsrcip=%u.%u.%u.%u, newdstip=%u.%u.%u.%u, newip=%u.%u.%u.%u\n",
-+ NIPQUAD(newsrcip), NIPQUAD(newdstip), NIPQUAD(newip));
-+
-+ mr.rangesize = 1;
-+ // We don't want to manip the per-protocol, just the IPs.
-+ mr.range[0].flags = IP_NAT_RANGE_MAP_IPS;
-+ mr.range[0].min_ip = mr.range[0].max_ip = newip;
-+
-+ nf_nat_setup_info(ct, &mr.range[0], IP_NAT_MANIP_DST);
-+}
-+
-+
-+static void __exit fini(void)
-+{
-+ nf_nat_rtsp_hook = NULL;
-+ nf_nat_rtsp_hook_expectfn = NULL;
-+ synchronize_net();
-+}
-+
-+static int __init init(void)
-+{
-+ printk("nf_nat_rtsp v" IP_NF_RTSP_VERSION " loading\n");
-+
-+ BUG_ON(nf_nat_rtsp_hook);
-+ nf_nat_rtsp_hook = help;
-+ nf_nat_rtsp_hook_expectfn = &expected;
-+
-+ if (stunaddr != NULL)
-+ extip = in_aton(stunaddr);
-+
-+ if (destaction != NULL) {
-+ if (strcmp(destaction, "auto") == 0)
-+ dstact = DSTACT_AUTO;
-+
-+ if (strcmp(destaction, "strip") == 0)
-+ dstact = DSTACT_STRIP;
-+
-+ if (strcmp(destaction, "none") == 0)
-+ dstact = DSTACT_NONE;
-+ }
-+
-+ return 0;
-+}
-+
-+module_init(init);
-+module_exit(fini);
+++ /dev/null
---- a/include/linux/pkt_sched.h
-+++ b/include/linux/pkt_sched.h
-@@ -173,8 +173,37 @@ struct tc_sfq_xstats {
- *
- * The only reason for this is efficiency, it is possible
- * to change these parameters in compile time.
-+ *
-+ * If you need to play with these values, use esfq instead.
- */
-
-+/* ESFQ section */
-+
-+enum
-+{
-+ /* traditional */
-+ TCA_SFQ_HASH_CLASSIC,
-+ TCA_SFQ_HASH_DST,
-+ TCA_SFQ_HASH_SRC,
-+ TCA_SFQ_HASH_FWMARK,
-+ /* conntrack */
-+ TCA_SFQ_HASH_CTORIGDST,
-+ TCA_SFQ_HASH_CTORIGSRC,
-+ TCA_SFQ_HASH_CTREPLDST,
-+ TCA_SFQ_HASH_CTREPLSRC,
-+ TCA_SFQ_HASH_CTNATCHG,
-+};
-+
-+struct tc_esfq_qopt
-+{
-+ unsigned quantum; /* Bytes per round allocated to flow */
-+ int perturb_period; /* Period of hash perturbation */
-+ __u32 limit; /* Maximal packets in queue */
-+ unsigned divisor; /* Hash divisor */
-+ unsigned flows; /* Maximal number of flows */
-+ unsigned hash_kind; /* Hash function to use for flow identification */
-+};
-+
- /* RED section */
-
- enum {
---- a/net/sched/Kconfig
-+++ b/net/sched/Kconfig
-@@ -137,6 +137,37 @@ config NET_SCH_SFQ
- To compile this code as a module, choose M here: the
- module will be called sch_sfq.
-
-+config NET_SCH_ESFQ
-+ tristate "Enhanced Stochastic Fairness Queueing (ESFQ)"
-+ ---help---
-+ Say Y here if you want to use the Enhanced Stochastic Fairness
-+ Queueing (ESFQ) packet scheduling algorithm for some of your network
-+ devices or as a leaf discipline for a classful qdisc such as HTB or
-+ CBQ (see the top of <file:net/sched/sch_esfq.c> for details and
-+ references to the SFQ algorithm).
-+
-+ This is an enchanced SFQ version which allows you to control some
-+ hardcoded values in the SFQ scheduler.
-+
-+ ESFQ also adds control of the hash function used to identify packet
-+ flows. The original SFQ discipline hashes by connection; ESFQ add
-+ several other hashing methods, such as by src IP or by dst IP, which
-+ can be more fair to users in some networking situations.
-+
-+ To compile this code as a module, choose M here: the
-+ module will be called sch_esfq.
-+
-+config NET_SCH_ESFQ_NFCT
-+ bool "Connection Tracking Hash Types"
-+ depends on NET_SCH_ESFQ && NF_CONNTRACK
-+ ---help---
-+ Say Y here to enable support for hashing based on netfilter connection
-+ tracking information. This is useful for a router that is also using
-+ NAT to connect privately-addressed hosts to the Internet. If you want
-+ to provide fair distribution of upstream bandwidth, ESFQ must use
-+ connection tracking information, since all outgoing packets will share
-+ the same source address.
-+
- config NET_SCH_TEQL
- tristate "True Link Equalizer (TEQL)"
- ---help---
---- a/net/sched/Makefile
-+++ b/net/sched/Makefile
-@@ -24,6 +24,7 @@ obj-$(CONFIG_NET_SCH_GRED) += sch_gred.o
- obj-$(CONFIG_NET_SCH_INGRESS) += sch_ingress.o
- obj-$(CONFIG_NET_SCH_DSMARK) += sch_dsmark.o
- obj-$(CONFIG_NET_SCH_SFQ) += sch_sfq.o
-+obj-$(CONFIG_NET_SCH_ESFQ) += sch_esfq.o
- obj-$(CONFIG_NET_SCH_TBF) += sch_tbf.o
- obj-$(CONFIG_NET_SCH_TEQL) += sch_teql.o
- obj-$(CONFIG_NET_SCH_PRIO) += sch_prio.o
---- /dev/null
-+++ b/net/sched/sch_esfq.c
-@@ -0,0 +1,702 @@
-+/*
-+ * net/sched/sch_esfq.c Extended Stochastic Fairness Queueing discipline.
-+ *
-+ * 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.
-+ *
-+ * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
-+ *
-+ * Changes: Alexander Atanasov, <alex@ssi.bg>
-+ * Added dynamic depth,limit,divisor,hash_kind options.
-+ * Added dst and src hashes.
-+ *
-+ * Alexander Clouter, <alex@digriz.org.uk>
-+ * Ported ESFQ to Linux 2.6.
-+ *
-+ * Corey Hickey, <bugfood-c@fatooh.org>
-+ * Maintenance of the Linux 2.6 port.
-+ * Added fwmark hash (thanks to Robert Kurjata).
-+ * Added usage of jhash.
-+ * Added conntrack support.
-+ * Added ctnatchg hash (thanks to Ben Pfountz).
-+ */
-+
-+#include <linux/module.h>
-+#include <asm/uaccess.h>
-+#include <asm/system.h>
-+#include <linux/bitops.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/jiffies.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/socket.h>
-+#include <linux/sockios.h>
-+#include <linux/in.h>
-+#include <linux/errno.h>
-+#include <linux/interrupt.h>
-+#include <linux/if_ether.h>
-+#include <linux/inet.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/notifier.h>
-+#include <linux/init.h>
-+#include <net/ip.h>
-+#include <net/netlink.h>
-+#include <linux/ipv6.h>
-+#include <net/route.h>
-+#include <linux/skbuff.h>
-+#include <net/sock.h>
-+#include <net/pkt_sched.h>
-+#include <linux/jhash.h>
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+#include <net/netfilter/nf_conntrack.h>
-+#endif
-+
-+/* Stochastic Fairness Queuing algorithm.
-+ For more comments look at sch_sfq.c.
-+ The difference is that you can change limit, depth,
-+ hash table size and choose alternate hash types.
-+
-+ classic: same as in sch_sfq.c
-+ dst: destination IP address
-+ src: source IP address
-+ fwmark: netfilter mark value
-+ ctorigdst: original destination IP address
-+ ctorigsrc: original source IP address
-+ ctrepldst: reply destination IP address
-+ ctreplsrc: reply source IP
-+
-+*/
-+
-+#define ESFQ_HEAD 0
-+#define ESFQ_TAIL 1
-+
-+/* This type should contain at least SFQ_DEPTH*2 values */
-+typedef unsigned int esfq_index;
-+
-+struct esfq_head
-+{
-+ esfq_index next;
-+ esfq_index prev;
-+};
-+
-+struct esfq_sched_data
-+{
-+/* Parameters */
-+ int perturb_period;
-+ unsigned quantum; /* Allotment per round: MUST BE >= MTU */
-+ int limit;
-+ unsigned depth;
-+ unsigned hash_divisor;
-+ unsigned hash_kind;
-+/* Variables */
-+ struct timer_list perturb_timer;
-+ int perturbation;
-+ esfq_index tail; /* Index of current slot in round */
-+ esfq_index max_depth; /* Maximal depth */
-+
-+ esfq_index *ht; /* Hash table */
-+ esfq_index *next; /* Active slots link */
-+ short *allot; /* Current allotment per slot */
-+ unsigned short *hash; /* Hash value indexed by slots */
-+ struct sk_buff_head *qs; /* Slot queue */
-+ struct esfq_head *dep; /* Linked list of slots, indexed by depth */
-+};
-+
-+/* This contains the info we will hash. */
-+struct esfq_packet_info
-+{
-+ u32 proto; /* protocol or port */
-+ u32 src; /* source from packet header */
-+ u32 dst; /* destination from packet header */
-+ u32 ctorigsrc; /* original source from conntrack */
-+ u32 ctorigdst; /* original destination from conntrack */
-+ u32 ctreplsrc; /* reply source from conntrack */
-+ u32 ctrepldst; /* reply destination from conntrack */
-+ u32 mark; /* netfilter mark (fwmark) */
-+};
-+
-+static __inline__ unsigned esfq_jhash_1word(struct esfq_sched_data *q,u32 a)
-+{
-+ return jhash_1word(a, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static __inline__ unsigned esfq_jhash_2words(struct esfq_sched_data *q, u32 a, u32 b)
-+{
-+ return jhash_2words(a, b, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static __inline__ unsigned esfq_jhash_3words(struct esfq_sched_data *q, u32 a, u32 b, u32 c)
-+{
-+ return jhash_3words(a, b, c, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static unsigned esfq_hash(struct esfq_sched_data *q, struct sk_buff *skb)
-+{
-+ struct esfq_packet_info info;
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+ enum ip_conntrack_info ctinfo;
-+ struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
-+#endif
-+
-+ switch (skb->protocol) {
-+ case __constant_htons(ETH_P_IP):
-+ {
-+ struct iphdr *iph = ip_hdr(skb);
-+ info.dst = iph->daddr;
-+ info.src = iph->saddr;
-+ if (!(iph->frag_off&htons(IP_MF|IP_OFFSET)) &&
-+ (iph->protocol == IPPROTO_TCP ||
-+ iph->protocol == IPPROTO_UDP ||
-+ iph->protocol == IPPROTO_SCTP ||
-+ iph->protocol == IPPROTO_DCCP ||
-+ iph->protocol == IPPROTO_ESP))
-+ info.proto = *(((u32*)iph) + iph->ihl);
-+ else
-+ info.proto = iph->protocol;
-+ break;
-+ }
-+ case __constant_htons(ETH_P_IPV6):
-+ {
-+ struct ipv6hdr *iph = ipv6_hdr(skb);
-+ /* Hash ipv6 addresses into a u32. This isn't ideal,
-+ * but the code is simple. */
-+ info.dst = jhash2(iph->daddr.s6_addr32, 4, q->perturbation);
-+ info.src = jhash2(iph->saddr.s6_addr32, 4, q->perturbation);
-+ if (iph->nexthdr == IPPROTO_TCP ||
-+ iph->nexthdr == IPPROTO_UDP ||
-+ iph->nexthdr == IPPROTO_SCTP ||
-+ iph->nexthdr == IPPROTO_DCCP ||
-+ iph->nexthdr == IPPROTO_ESP)
-+ info.proto = *(u32*)&iph[1];
-+ else
-+ info.proto = iph->nexthdr;
-+ break;
-+ }
-+ default:
-+ info.dst = (u32)(unsigned long)skb_dst(skb);
-+ info.src = (u32)(unsigned long)skb->sk;
-+ info.proto = skb->protocol;
-+ }
-+
-+ info.mark = skb->mark;
-+
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+ /* defaults if there is no conntrack info */
-+ info.ctorigsrc = info.src;
-+ info.ctorigdst = info.dst;
-+ info.ctreplsrc = info.dst;
-+ info.ctrepldst = info.src;
-+ /* collect conntrack info */
-+ if (ct && ct != &nf_conntrack_untracked) {
-+ if (skb->protocol == __constant_htons(ETH_P_IP)) {
-+ info.ctorigsrc = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+ info.ctorigdst = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip;
-+ info.ctreplsrc = ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip;
-+ info.ctrepldst = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip;
-+ }
-+ else if (skb->protocol == __constant_htons(ETH_P_IPV6)) {
-+ /* Again, hash ipv6 addresses into a single u32. */
-+ info.ctorigsrc = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip6, 4, q->perturbation);
-+ info.ctorigdst = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip6, 4, q->perturbation);
-+ info.ctreplsrc = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip6, 4, q->perturbation);
-+ info.ctrepldst = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip6, 4, q->perturbation);
-+ }
-+
-+ }
-+#endif
-+
-+ switch(q->hash_kind) {
-+ case TCA_SFQ_HASH_CLASSIC:
-+ return esfq_jhash_3words(q, info.dst, info.src, info.proto);
-+ case TCA_SFQ_HASH_DST:
-+ return esfq_jhash_1word(q, info.dst);
-+ case TCA_SFQ_HASH_SRC:
-+ return esfq_jhash_1word(q, info.src);
-+ case TCA_SFQ_HASH_FWMARK:
-+ return esfq_jhash_1word(q, info.mark);
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+ case TCA_SFQ_HASH_CTORIGDST:
-+ return esfq_jhash_1word(q, info.ctorigdst);
-+ case TCA_SFQ_HASH_CTORIGSRC:
-+ return esfq_jhash_1word(q, info.ctorigsrc);
-+ case TCA_SFQ_HASH_CTREPLDST:
-+ return esfq_jhash_1word(q, info.ctrepldst);
-+ case TCA_SFQ_HASH_CTREPLSRC:
-+ return esfq_jhash_1word(q, info.ctreplsrc);
-+ case TCA_SFQ_HASH_CTNATCHG:
-+ {
-+ if (info.ctorigdst == info.ctreplsrc)
-+ return esfq_jhash_1word(q, info.ctorigsrc);
-+ return esfq_jhash_1word(q, info.ctreplsrc);
-+ }
-+#endif
-+ default:
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "ESFQ: Unknown hash method. Falling back to classic.\n");
-+ }
-+ return esfq_jhash_3words(q, info.dst, info.src, info.proto);
-+}
-+
-+static inline void esfq_link(struct esfq_sched_data *q, esfq_index x)
-+{
-+ esfq_index p, n;
-+ int d = q->qs[x].qlen + q->depth;
-+
-+ p = d;
-+ n = q->dep[d].next;
-+ q->dep[x].next = n;
-+ q->dep[x].prev = p;
-+ q->dep[p].next = q->dep[n].prev = x;
-+}
-+
-+static inline void esfq_dec(struct esfq_sched_data *q, esfq_index x)
-+{
-+ esfq_index p, n;
-+
-+ n = q->dep[x].next;
-+ p = q->dep[x].prev;
-+ q->dep[p].next = n;
-+ q->dep[n].prev = p;
-+
-+ if (n == p && q->max_depth == q->qs[x].qlen + 1)
-+ q->max_depth--;
-+
-+ esfq_link(q, x);
-+}
-+
-+static inline void esfq_inc(struct esfq_sched_data *q, esfq_index x)
-+{
-+ esfq_index p, n;
-+ int d;
-+
-+ n = q->dep[x].next;
-+ p = q->dep[x].prev;
-+ q->dep[p].next = n;
-+ q->dep[n].prev = p;
-+ d = q->qs[x].qlen;
-+ if (q->max_depth < d)
-+ q->max_depth = d;
-+
-+ esfq_link(q, x);
-+}
-+
-+static unsigned int esfq_drop(struct Qdisc *sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_index d = q->max_depth;
-+ struct sk_buff *skb;
-+ unsigned int len;
-+
-+ /* Queue is full! Find the longest slot and
-+ drop a packet from it */
-+
-+ if (d > 1) {
-+ esfq_index x = q->dep[d+q->depth].next;
-+ skb = q->qs[x].prev;
-+ len = skb->len;
-+ __skb_unlink(skb, &q->qs[x]);
-+ kfree_skb(skb);
-+ esfq_dec(q, x);
-+ sch->q.qlen--;
-+ sch->qstats.drops++;
-+ sch->qstats.backlog -= len;
-+ return len;
-+ }
-+
-+ if (d == 1) {
-+ /* It is difficult to believe, but ALL THE SLOTS HAVE LENGTH 1. */
-+ d = q->next[q->tail];
-+ q->next[q->tail] = q->next[d];
-+ q->allot[q->next[d]] += q->quantum;
-+ skb = q->qs[d].prev;
-+ len = skb->len;
-+ __skb_unlink(skb, &q->qs[d]);
-+ kfree_skb(skb);
-+ esfq_dec(q, d);
-+ sch->q.qlen--;
-+ q->ht[q->hash[d]] = q->depth;
-+ sch->qstats.drops++;
-+ sch->qstats.backlog -= len;
-+ return len;
-+ }
-+
-+ return 0;
-+}
-+
-+static void esfq_q_enqueue(struct sk_buff *skb, struct esfq_sched_data *q, unsigned int end)
-+{
-+ unsigned hash = esfq_hash(q, skb);
-+ unsigned depth = q->depth;
-+ esfq_index x;
-+
-+ x = q->ht[hash];
-+ if (x == depth) {
-+ q->ht[hash] = x = q->dep[depth].next;
-+ q->hash[x] = hash;
-+ }
-+
-+ if (end == ESFQ_TAIL)
-+ __skb_queue_tail(&q->qs[x], skb);
-+ else
-+ __skb_queue_head(&q->qs[x], skb);
-+
-+ esfq_inc(q, x);
-+ if (q->qs[x].qlen == 1) { /* The flow is new */
-+ if (q->tail == depth) { /* It is the first flow */
-+ q->tail = x;
-+ q->next[x] = x;
-+ q->allot[x] = q->quantum;
-+ } else {
-+ q->next[x] = q->next[q->tail];
-+ q->next[q->tail] = x;
-+ q->tail = x;
-+ }
-+ }
-+}
-+
-+static int esfq_enqueue(struct sk_buff *skb, struct Qdisc* sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_q_enqueue(skb, q, ESFQ_TAIL);
-+ sch->qstats.backlog += skb->len;
-+ if (++sch->q.qlen < q->limit-1) {
-+ sch->bstats.bytes += skb->len;
-+ sch->bstats.packets++;
-+ return 0;
-+ }
-+
-+ sch->qstats.drops++;
-+ esfq_drop(sch);
-+ return NET_XMIT_CN;
-+}
-+
-+static struct sk_buff *esfq_peek(struct Qdisc* sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_index a;
-+
-+ /* No active slots */
-+ if (q->tail == q->depth)
-+ return NULL;
-+
-+ a = q->next[q->tail];
-+ return skb_peek(&q->qs[a]);
-+}
-+
-+static struct sk_buff *esfq_q_dequeue(struct esfq_sched_data *q)
-+{
-+ struct sk_buff *skb;
-+ unsigned depth = q->depth;
-+ esfq_index a, old_a;
-+
-+ /* No active slots */
-+ if (q->tail == depth)
-+ return NULL;
-+
-+ a = old_a = q->next[q->tail];
-+
-+ /* Grab packet */
-+ skb = __skb_dequeue(&q->qs[a]);
-+ esfq_dec(q, a);
-+
-+ /* Is the slot empty? */
-+ if (q->qs[a].qlen == 0) {
-+ q->ht[q->hash[a]] = depth;
-+ a = q->next[a];
-+ if (a == old_a) {
-+ q->tail = depth;
-+ return skb;
-+ }
-+ q->next[q->tail] = a;
-+ q->allot[a] += q->quantum;
-+ } else if ((q->allot[a] -= skb->len) <= 0) {
-+ q->tail = a;
-+ a = q->next[a];
-+ q->allot[a] += q->quantum;
-+ }
-+
-+ return skb;
-+}
-+
-+static struct sk_buff *esfq_dequeue(struct Qdisc* sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ struct sk_buff *skb;
-+
-+ skb = esfq_q_dequeue(q);
-+ if (skb == NULL)
-+ return NULL;
-+ sch->q.qlen--;
-+ sch->qstats.backlog -= skb->len;
-+ return skb;
-+}
-+
-+static void esfq_q_destroy(struct esfq_sched_data *q)
-+{
-+ del_timer(&q->perturb_timer);
-+ if(q->ht)
-+ kfree(q->ht);
-+ if(q->dep)
-+ kfree(q->dep);
-+ if(q->next)
-+ kfree(q->next);
-+ if(q->allot)
-+ kfree(q->allot);
-+ if(q->hash)
-+ kfree(q->hash);
-+ if(q->qs)
-+ kfree(q->qs);
-+}
-+
-+static void esfq_destroy(struct Qdisc *sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_q_destroy(q);
-+}
-+
-+
-+static void esfq_reset(struct Qdisc* sch)
-+{
-+ struct sk_buff *skb;
-+
-+ while ((skb = esfq_dequeue(sch)) != NULL)
-+ kfree_skb(skb);
-+}
-+
-+static void esfq_perturbation(unsigned long arg)
-+{
-+ struct Qdisc *sch = (struct Qdisc*)arg;
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+
-+ q->perturbation = net_random()&0x1F;
-+
-+ if (q->perturb_period) {
-+ q->perturb_timer.expires = jiffies + q->perturb_period;
-+ add_timer(&q->perturb_timer);
-+ }
-+}
-+
-+static unsigned int esfq_check_hash(unsigned int kind)
-+{
-+ switch (kind) {
-+ case TCA_SFQ_HASH_CTORIGDST:
-+ case TCA_SFQ_HASH_CTORIGSRC:
-+ case TCA_SFQ_HASH_CTREPLDST:
-+ case TCA_SFQ_HASH_CTREPLSRC:
-+ case TCA_SFQ_HASH_CTNATCHG:
-+#ifndef CONFIG_NET_SCH_ESFQ_NFCT
-+ {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "ESFQ: Conntrack hash types disabled in kernel config. Falling back to classic.\n");
-+ return TCA_SFQ_HASH_CLASSIC;
-+ }
-+#endif
-+ case TCA_SFQ_HASH_CLASSIC:
-+ case TCA_SFQ_HASH_DST:
-+ case TCA_SFQ_HASH_SRC:
-+ case TCA_SFQ_HASH_FWMARK:
-+ return kind;
-+ default:
-+ {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "ESFQ: Unknown hash type. Falling back to classic.\n");
-+ return TCA_SFQ_HASH_CLASSIC;
-+ }
-+ }
-+}
-+
-+static int esfq_q_init(struct esfq_sched_data *q, struct nlattr *opt)
-+{
-+ struct tc_esfq_qopt *ctl = nla_data(opt);
-+ esfq_index p = ~0U/2;
-+ int i;
-+
-+ if (opt && opt->nla_len < nla_attr_size(sizeof(*ctl)))
-+ return -EINVAL;
-+
-+ q->perturbation = 0;
-+ q->hash_kind = TCA_SFQ_HASH_CLASSIC;
-+ q->max_depth = 0;
-+ if (opt == NULL) {
-+ q->perturb_period = 0;
-+ q->hash_divisor = 1024;
-+ q->tail = q->limit = q->depth = 128;
-+
-+ } else {
-+ struct tc_esfq_qopt *ctl = nla_data(opt);
-+ if (ctl->quantum)
-+ q->quantum = ctl->quantum;
-+ q->perturb_period = ctl->perturb_period*HZ;
-+ q->hash_divisor = ctl->divisor ? : 1024;
-+ q->tail = q->limit = q->depth = ctl->flows ? : 128;
-+
-+ if ( q->depth > p - 1 )
-+ return -EINVAL;
-+
-+ if (ctl->limit)
-+ q->limit = min_t(u32, ctl->limit, q->depth);
-+
-+ if (ctl->hash_kind) {
-+ q->hash_kind = esfq_check_hash(ctl->hash_kind);
-+ }
-+ }
-+
-+ q->ht = kmalloc(q->hash_divisor*sizeof(esfq_index), GFP_KERNEL);
-+ if (!q->ht)
-+ goto err_case;
-+ q->dep = kmalloc((1+q->depth*2)*sizeof(struct esfq_head), GFP_KERNEL);
-+ if (!q->dep)
-+ goto err_case;
-+ q->next = kmalloc(q->depth*sizeof(esfq_index), GFP_KERNEL);
-+ if (!q->next)
-+ goto err_case;
-+ q->allot = kmalloc(q->depth*sizeof(short), GFP_KERNEL);
-+ if (!q->allot)
-+ goto err_case;
-+ q->hash = kmalloc(q->depth*sizeof(unsigned short), GFP_KERNEL);
-+ if (!q->hash)
-+ goto err_case;
-+ q->qs = kmalloc(q->depth*sizeof(struct sk_buff_head), GFP_KERNEL);
-+ if (!q->qs)
-+ goto err_case;
-+
-+ for (i=0; i< q->hash_divisor; i++)
-+ q->ht[i] = q->depth;
-+ for (i=0; i<q->depth; i++) {
-+ skb_queue_head_init(&q->qs[i]);
-+ q->dep[i+q->depth].next = i+q->depth;
-+ q->dep[i+q->depth].prev = i+q->depth;
-+ }
-+
-+ for (i=0; i<q->depth; i++)
-+ esfq_link(q, i);
-+ return 0;
-+err_case:
-+ esfq_q_destroy(q);
-+ return -ENOBUFS;
-+}
-+
-+static int esfq_init(struct Qdisc *sch, struct nlattr *opt)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ int err;
-+
-+ q->quantum = psched_mtu(qdisc_dev(sch)); /* default */
-+ if ((err = esfq_q_init(q, opt)))
-+ return err;
-+
-+ init_timer(&q->perturb_timer);
-+ q->perturb_timer.data = (unsigned long)sch;
-+ q->perturb_timer.function = esfq_perturbation;
-+ if (q->perturb_period) {
-+ q->perturb_timer.expires = jiffies + q->perturb_period;
-+ add_timer(&q->perturb_timer);
-+ }
-+
-+ return 0;
-+}
-+
-+static int esfq_change(struct Qdisc *sch, struct nlattr *opt)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ struct esfq_sched_data new;
-+ struct sk_buff *skb;
-+ int err;
-+
-+ /* set up new queue */
-+ memset(&new, 0, sizeof(struct esfq_sched_data));
-+ new.quantum = psched_mtu(qdisc_dev(sch)); /* default */
-+ if ((err = esfq_q_init(&new, opt)))
-+ return err;
-+
-+ /* copy all packets from the old queue to the new queue */
-+ sch_tree_lock(sch);
-+ while ((skb = esfq_q_dequeue(q)) != NULL)
-+ esfq_q_enqueue(skb, &new, ESFQ_TAIL);
-+
-+ /* clean up the old queue */
-+ esfq_q_destroy(q);
-+
-+ /* copy elements of the new queue into the old queue */
-+ q->perturb_period = new.perturb_period;
-+ q->quantum = new.quantum;
-+ q->limit = new.limit;
-+ q->depth = new.depth;
-+ q->hash_divisor = new.hash_divisor;
-+ q->hash_kind = new.hash_kind;
-+ q->tail = new.tail;
-+ q->max_depth = new.max_depth;
-+ q->ht = new.ht;
-+ q->dep = new.dep;
-+ q->next = new.next;
-+ q->allot = new.allot;
-+ q->hash = new.hash;
-+ q->qs = new.qs;
-+
-+ /* finish up */
-+ if (q->perturb_period) {
-+ q->perturb_timer.expires = jiffies + q->perturb_period;
-+ add_timer(&q->perturb_timer);
-+ } else {
-+ q->perturbation = 0;
-+ }
-+ sch_tree_unlock(sch);
-+ return 0;
-+}
-+
-+static int esfq_dump(struct Qdisc *sch, struct sk_buff *skb)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ unsigned char *b = skb_tail_pointer(skb);
-+ struct tc_esfq_qopt opt;
-+
-+ opt.quantum = q->quantum;
-+ opt.perturb_period = q->perturb_period/HZ;
-+
-+ opt.limit = q->limit;
-+ opt.divisor = q->hash_divisor;
-+ opt.flows = q->depth;
-+ opt.hash_kind = q->hash_kind;
-+
-+ NLA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt);
-+
-+ return skb->len;
-+
-+nla_put_failure:
-+ nlmsg_trim(skb, b);
-+ return -1;
-+}
-+
-+static struct Qdisc_ops esfq_qdisc_ops =
-+{
-+ .next = NULL,
-+ .cl_ops = NULL,
-+ .id = "esfq",
-+ .priv_size = sizeof(struct esfq_sched_data),
-+ .enqueue = esfq_enqueue,
-+ .dequeue = esfq_dequeue,
-+ .peek = esfq_peek,
-+ .drop = esfq_drop,
-+ .init = esfq_init,
-+ .reset = esfq_reset,
-+ .destroy = esfq_destroy,
-+ .change = esfq_change,
-+ .dump = esfq_dump,
-+ .owner = THIS_MODULE,
-+};
-+
-+static int __init esfq_module_init(void)
-+{
-+ return register_qdisc(&esfq_qdisc_ops);
-+}
-+static void __exit esfq_module_exit(void)
-+{
-+ unregister_qdisc(&esfq_qdisc_ops);
-+}
-+module_init(esfq_module_init)
-+module_exit(esfq_module_exit)
-+MODULE_LICENSE("GPL");
+++ /dev/null
---- a/include/linux/jhash.h
-+++ b/include/linux/jhash.h
-@@ -3,80 +3,95 @@
-
- /* jhash.h: Jenkins hash support.
- *
-- * Copyright (C) 1996 Bob Jenkins (bob_jenkins@burtleburtle.net)
-+ * Copyright (C) 2006. Bob Jenkins (bob_jenkins@burtleburtle.net)
- *
- * http://burtleburtle.net/bob/hash/
- *
- * These are the credits from Bob's sources:
- *
-- * lookup2.c, by Bob Jenkins, December 1996, Public Domain.
-- * hash(), hash2(), hash3, and mix() are externally useful functions.
-- * Routines to test the hash are included if SELF_TEST is defined.
-- * You can use this free for any purpose. It has no warranty.
-+ * lookup3.c, by Bob Jenkins, May 2006, Public Domain.
- *
-- * Copyright (C) 2003 David S. Miller (davem@redhat.com)
-+ * These are functions for producing 32-bit hashes for hash table lookup.
-+ * hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
-+ * are externally useful functions. Routines to test the hash are included
-+ * if SELF_TEST is defined. You can use this free for any purpose. It's in
-+ * the public domain. It has no warranty.
-+ *
-+ * Copyright (C) 2009 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu)
- *
- * I've modified Bob's hash to be useful in the Linux kernel, and
-- * any bugs present are surely my fault. -DaveM
-+ * any bugs present are my fault. Jozsef
- */
-
--/* NOTE: Arguments are modified. */
--#define __jhash_mix(a, b, c) \
-+#define __rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
-+
-+/* __jhash_mix - mix 3 32-bit values reversibly. */
-+#define __jhash_mix(a,b,c) \
-+{ \
-+ a -= c; a ^= __rot(c, 4); c += b; \
-+ b -= a; b ^= __rot(a, 6); a += c; \
-+ c -= b; c ^= __rot(b, 8); b += a; \
-+ a -= c; a ^= __rot(c,16); c += b; \
-+ b -= a; b ^= __rot(a,19); a += c; \
-+ c -= b; c ^= __rot(b, 4); b += a; \
-+}
-+
-+/* __jhash_final - final mixing of 3 32-bit values (a,b,c) into c */
-+#define __jhash_final(a,b,c) \
- { \
-- a -= b; a -= c; a ^= (c>>13); \
-- b -= c; b -= a; b ^= (a<<8); \
-- c -= a; c -= b; c ^= (b>>13); \
-- a -= b; a -= c; a ^= (c>>12); \
-- b -= c; b -= a; b ^= (a<<16); \
-- c -= a; c -= b; c ^= (b>>5); \
-- a -= b; a -= c; a ^= (c>>3); \
-- b -= c; b -= a; b ^= (a<<10); \
-- c -= a; c -= b; c ^= (b>>15); \
-+ c ^= b; c -= __rot(b,14); \
-+ a ^= c; a -= __rot(c,11); \
-+ b ^= a; b -= __rot(a,25); \
-+ c ^= b; c -= __rot(b,16); \
-+ a ^= c; a -= __rot(c,4); \
-+ b ^= a; b -= __rot(a,14); \
-+ c ^= b; c -= __rot(b,24); \
- }
-
--/* The golden ration: an arbitrary value */
--#define JHASH_GOLDEN_RATIO 0x9e3779b9
-+/* An arbitrary initial parameter */
-+#define JHASH_GOLDEN_RATIO 0xdeadbeef
-
- /* The most generic version, hashes an arbitrary sequence
- * of bytes. No alignment or length assumptions are made about
-- * the input key.
-+ * the input key. The result depends on endianness.
- */
- static inline u32 jhash(const void *key, u32 length, u32 initval)
- {
-- u32 a, b, c, len;
-+ u32 a,b,c;
- const u8 *k = key;
-
-- len = length;
-- a = b = JHASH_GOLDEN_RATIO;
-- c = initval;
--
-- while (len >= 12) {
-- a += (k[0] +((u32)k[1]<<8) +((u32)k[2]<<16) +((u32)k[3]<<24));
-- b += (k[4] +((u32)k[5]<<8) +((u32)k[6]<<16) +((u32)k[7]<<24));
-- c += (k[8] +((u32)k[9]<<8) +((u32)k[10]<<16)+((u32)k[11]<<24));
--
-- __jhash_mix(a,b,c);
-+ /* Set up the internal state */
-+ a = b = c = JHASH_GOLDEN_RATIO + length + initval;
-
-+ /* all but the last block: affect some 32 bits of (a,b,c) */
-+ while (length > 12) {
-+ a += (k[0] + ((u32)k[1]<<8) + ((u32)k[2]<<16) + ((u32)k[3]<<24));
-+ b += (k[4] + ((u32)k[5]<<8) + ((u32)k[6]<<16) + ((u32)k[7]<<24));
-+ c += (k[8] + ((u32)k[9]<<8) + ((u32)k[10]<<16) + ((u32)k[11]<<24));
-+ __jhash_mix(a, b, c);
-+ length -= 12;
- k += 12;
-- len -= 12;
- }
-
-- c += length;
-- switch (len) {
-- case 11: c += ((u32)k[10]<<24);
-- case 10: c += ((u32)k[9]<<16);
-- case 9 : c += ((u32)k[8]<<8);
-- case 8 : b += ((u32)k[7]<<24);
-- case 7 : b += ((u32)k[6]<<16);
-- case 6 : b += ((u32)k[5]<<8);
-+ /* last block: affect all 32 bits of (c) */
-+ /* all the case statements fall through */
-+ switch (length) {
-+ case 12: c += (u32)k[11]<<24;
-+ case 11: c += (u32)k[10]<<16;
-+ case 10: c += (u32)k[9]<<8;
-+ case 9 : c += k[8];
-+ case 8 : b += (u32)k[7]<<24;
-+ case 7 : b += (u32)k[6]<<16;
-+ case 6 : b += (u32)k[5]<<8;
- case 5 : b += k[4];
-- case 4 : a += ((u32)k[3]<<24);
-- case 3 : a += ((u32)k[2]<<16);
-- case 2 : a += ((u32)k[1]<<8);
-+ case 4 : a += (u32)k[3]<<24;
-+ case 3 : a += (u32)k[2]<<16;
-+ case 2 : a += (u32)k[1]<<8;
- case 1 : a += k[0];
-- };
--
-- __jhash_mix(a,b,c);
-+ __jhash_final(a, b, c);
-+ case 0 :
-+ break;
-+ }
-
- return c;
- }
-@@ -86,58 +101,57 @@ static inline u32 jhash(const void *key,
- */
- static inline u32 jhash2(const u32 *k, u32 length, u32 initval)
- {
-- u32 a, b, c, len;
-+ u32 a, b, c;
-
-- a = b = JHASH_GOLDEN_RATIO;
-- c = initval;
-- len = length;
-+ /* Set up the internal state */
-+ a = b = c = JHASH_GOLDEN_RATIO + (length<<2) + initval;
-
-- while (len >= 3) {
-+ /* handle most of the key */
-+ while (length > 3) {
- a += k[0];
- b += k[1];
- c += k[2];
- __jhash_mix(a, b, c);
-- k += 3; len -= 3;
-+ length -= 3;
-+ k += 3;
- }
-
-- c += length * 4;
--
-- switch (len) {
-- case 2 : b += k[1];
-- case 1 : a += k[0];
-- };
--
-- __jhash_mix(a,b,c);
-+ /* handle the last 3 u32's */
-+ /* all the case statements fall through */
-+ switch (length) {
-+ case 3: c += k[2];
-+ case 2: b += k[1];
-+ case 1: a += k[0];
-+ __jhash_final(a, b, c);
-+ case 0: /* case 0: nothing left to add */
-+ break;
-+ }
-
- return c;
- }
-
--
- /* A special ultra-optimized versions that knows they are hashing exactly
- * 3, 2 or 1 word(s).
-- *
-- * NOTE: In partilar the "c += length; __jhash_mix(a,b,c);" normally
-- * done at the end is not done here.
- */
- static inline u32 jhash_3words(u32 a, u32 b, u32 c, u32 initval)
- {
-- a += JHASH_GOLDEN_RATIO;
-- b += JHASH_GOLDEN_RATIO;
-- c += initval;
-+ a += JHASH_GOLDEN_RATIO + initval;
-+ b += JHASH_GOLDEN_RATIO + initval;
-+ c += JHASH_GOLDEN_RATIO + initval;
-
-- __jhash_mix(a, b, c);
-+ __jhash_final(a, b, c);
-
- return c;
- }
-
- static inline u32 jhash_2words(u32 a, u32 b, u32 initval)
- {
-- return jhash_3words(a, b, 0, initval);
-+ return jhash_3words(0, a, b, initval);
- }
-
- static inline u32 jhash_1word(u32 a, u32 initval)
- {
-- return jhash_3words(a, 0, 0, initval);
-+ return jhash_3words(0, 0, a, initval);
- }
-
- #endif /* _LINUX_JHASH_H */
+++ /dev/null
---- a/arch/mips/include/asm/string.h
-+++ b/arch/mips/include/asm/string.h
-@@ -133,11 +133,44 @@ strncmp(__const__ char *__cs, __const__
-
- #define __HAVE_ARCH_MEMSET
- extern void *memset(void *__s, int __c, size_t __count);
-+#define memset(__s, __c, len) \
-+({ \
-+ size_t __len = (len); \
-+ void *__ret; \
-+ if (__builtin_constant_p(len) && __len >= 64) \
-+ __ret = memset((__s), (__c), __len); \
-+ else \
-+ __ret = __builtin_memset((__s), (__c), __len); \
-+ __ret; \
-+})
-
- #define __HAVE_ARCH_MEMCPY
- extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
-+#define memcpy(dst, src, len) \
-+({ \
-+ size_t __len = (len); \
-+ void *__ret; \
-+ if (__builtin_constant_p(len) && __len >= 64) \
-+ __ret = memcpy((dst), (src), __len); \
-+ else \
-+ __ret = __builtin_memcpy((dst), (src), __len); \
-+ __ret; \
-+})
-
- #define __HAVE_ARCH_MEMMOVE
- extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
-+#define memmove(dst, src, len) \
-+({ \
-+ size_t __len = (len); \
-+ void *__ret; \
-+ if (__builtin_constant_p(len) && __len >= 64) \
-+ __ret = memmove((dst), (src), __len); \
-+ else \
-+ __ret = __builtin_memmove((dst), (src), __len); \
-+ __ret; \
-+})
-+
-+#define __HAVE_ARCH_MEMCMP
-+#define memcmp(src1, src2, len) __builtin_memcmp((src1), (src2), (len))
-
- #endif /* _ASM_STRING_H */
---- a/arch/mips/lib/Makefile
-+++ b/arch/mips/lib/Makefile
-@@ -3,7 +3,7 @@
- #
-
- lib-y += csum_partial.o delay.o memcpy.o memcpy-inatomic.o memset.o \
-- strlen_user.o strncpy_user.o strnlen_user.o uncached.o
-+ strlen_user.o strncpy_user.o strnlen_user.o uncached.o memcmp.o
-
- obj-y += iomap.o
- obj-$(CONFIG_PCI) += iomap-pci.o
---- /dev/null
-+++ b/arch/mips/lib/memcmp.c
-@@ -0,0 +1,22 @@
-+/*
-+ * copied from linux/lib/string.c
-+ *
-+ * Copyright (C) 1991, 1992 Linus Torvalds
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/string.h>
-+
-+#undef memcmp
-+int memcmp(const void *cs, const void *ct, size_t count)
-+{
-+ const unsigned char *su1, *su2;
-+ int res = 0;
-+
-+ for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
-+ if ((res = *su1 - *su2) != 0)
-+ break;
-+ return res;
-+}
-+EXPORT_SYMBOL(memcmp);
-+
+++ /dev/null
---- a/include/linux/slab.h
-+++ b/include/linux/slab.h
-@@ -124,8 +124,8 @@ int kmem_ptr_validate(struct kmem_cache
- * to do various tricks to work around compiler limitations in order to
- * ensure proper constant folding.
- */
--#define KMALLOC_SHIFT_HIGH ((MAX_ORDER + PAGE_SHIFT - 1) <= 25 ? \
-- (MAX_ORDER + PAGE_SHIFT - 1) : 25)
-+#define KMALLOC_SHIFT_HIGH ((MAX_ORDER + PAGE_SHIFT - 1) <= 17 ? \
-+ (MAX_ORDER + PAGE_SHIFT - 1) : 17)
-
- #define KMALLOC_MAX_SIZE (1UL << KMALLOC_SHIFT_HIGH)
- #define KMALLOC_MAX_ORDER (KMALLOC_SHIFT_HIGH - PAGE_SHIFT)
+++ /dev/null
---- a/fs/jffs2/build.c
-+++ b/fs/jffs2/build.c
-@@ -111,6 +111,17 @@ static int jffs2_build_filesystem(struct
- dbg_fsbuild("scanned flash completely\n");
- jffs2_dbg_dump_block_lists_nolock(c);
-
-+ if (c->flags & (1 << 7)) {
-+ printk("%s(): unlocking the mtd device... ", __func__);
-+ if (c->mtd->unlock)
-+ c->mtd->unlock(c->mtd, 0, c->mtd->size);
-+ printk("done.\n");
-+
-+ printk("%s(): erasing all blocks after the end marker... ", __func__);
-+ jffs2_erase_pending_blocks(c, -1);
-+ printk("done.\n");
-+ }
-+
- dbg_fsbuild("pass 1 starting\n");
- c->flags |= JFFS2_SB_FLAG_BUILDING;
- /* Now scan the directory tree, increasing nlink according to every dirent found. */
---- a/fs/jffs2/scan.c
-+++ b/fs/jffs2/scan.c
-@@ -72,7 +72,7 @@ static int file_dirty(struct jffs2_sb_in
- return ret;
- if ((ret = jffs2_scan_dirty_space(c, jeb, jeb->free_size)))
- return ret;
-- /* Turned wasted size into dirty, since we apparently
-+ /* Turned wasted size into dirty, since we apparently
- think it's recoverable now. */
- jeb->dirty_size += jeb->wasted_size;
- c->dirty_size += jeb->wasted_size;
-@@ -144,8 +144,11 @@ int jffs2_scan_medium(struct jffs2_sb_in
- /* reset summary info for next eraseblock scan */
- jffs2_sum_reset_collected(s);
-
-- ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
-- buf_size, s);
-+ if (c->flags & (1 << 7))
-+ ret = BLK_STATE_ALLFF;
-+ else
-+ ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
-+ buf_size, s);
-
- if (ret < 0)
- goto out;
-@@ -400,7 +403,7 @@ static int jffs2_scan_xref_node(struct j
- if (!ref)
- return -ENOMEM;
-
-- /* BEFORE jffs2_build_xattr_subsystem() called,
-+ /* BEFORE jffs2_build_xattr_subsystem() called,
- * and AFTER xattr_ref is marked as a dead xref,
- * ref->xid is used to store 32bit xid, xd is not used
- * ref->ino is used to store 32bit inode-number, ic is not used
-@@ -473,7 +476,7 @@ static int jffs2_scan_eraseblock (struct
- struct jffs2_sum_marker *sm;
- void *sumptr = NULL;
- uint32_t sumlen;
--
-+
- if (!buf_size) {
- /* XIP case. Just look, point at the summary if it's there */
- sm = (void *)buf + c->sector_size - sizeof(*sm);
-@@ -489,9 +492,9 @@ static int jffs2_scan_eraseblock (struct
- buf_len = sizeof(*sm);
-
- /* Read as much as we want into the _end_ of the preallocated buffer */
-- err = jffs2_fill_scan_buf(c, buf + buf_size - buf_len,
-+ err = jffs2_fill_scan_buf(c, buf + buf_size - buf_len,
- jeb->offset + c->sector_size - buf_len,
-- buf_len);
-+ buf_len);
- if (err)
- return err;
-
-@@ -510,9 +513,9 @@ static int jffs2_scan_eraseblock (struct
- }
- if (buf_len < sumlen) {
- /* Need to read more so that the entire summary node is present */
-- err = jffs2_fill_scan_buf(c, sumptr,
-+ err = jffs2_fill_scan_buf(c, sumptr,
- jeb->offset + c->sector_size - sumlen,
-- sumlen - buf_len);
-+ sumlen - buf_len);
- if (err)
- return err;
- }
-@@ -525,7 +528,7 @@ static int jffs2_scan_eraseblock (struct
-
- if (buf_size && sumlen > buf_size)
- kfree(sumptr);
-- /* If it returns with a real error, bail.
-+ /* If it returns with a real error, bail.
- If it returns positive, that's a block classification
- (i.e. BLK_STATE_xxx) so return that too.
- If it returns zero, fall through to full scan. */
-@@ -546,6 +549,17 @@ static int jffs2_scan_eraseblock (struct
- return err;
- }
-
-+ if ((buf[0] == 0xde) &&
-+ (buf[1] == 0xad) &&
-+ (buf[2] == 0xc0) &&
-+ (buf[3] == 0xde)) {
-+ /* end of filesystem. erase everything after this point */
-+ printk("%s(): End of filesystem marker found at 0x%x\n", __func__, jeb->offset);
-+ c->flags |= (1 << 7);
-+
-+ return BLK_STATE_ALLFF;
-+ }
-+
- /* We temporarily use 'ofs' as a pointer into the buffer/jeb */
- ofs = 0;
-
-@@ -671,7 +685,7 @@ scan_more:
- scan_end = buf_len;
- goto more_empty;
- }
--
-+
- /* See how much more there is to read in this eraseblock... */
- buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
- if (!buf_len) {
-@@ -907,7 +921,7 @@ scan_more:
-
- D1(printk(KERN_DEBUG "Block at 0x%08x: free 0x%08x, dirty 0x%08x, unchecked 0x%08x, used 0x%08x, wasted 0x%08x\n",
- jeb->offset,jeb->free_size, jeb->dirty_size, jeb->unchecked_size, jeb->used_size, jeb->wasted_size));
--
-+
- /* mark_node_obsolete can add to wasted !! */
- if (jeb->wasted_size) {
- jeb->dirty_size += jeb->wasted_size;
+++ /dev/null
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -1377,11 +1377,18 @@ static inline int skb_network_offset(con
- *
- * Various parts of the networking layer expect at least 32 bytes of
- * headroom, you should not reduce this.
-+ *
-+ * This has been changed to 64 to acommodate for routing between ethernet
-+ * and wireless, but only for new allocations
- */
- #ifndef NET_SKB_PAD
- #define NET_SKB_PAD 32
- #endif
-
-+#ifndef NET_SKB_PAD_ALLOC
-+#define NET_SKB_PAD_ALLOC 64
-+#endif
-+
- extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
-
- static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
-@@ -1471,9 +1478,9 @@ static inline void __skb_queue_purge(str
- static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
- gfp_t gfp_mask)
- {
-- struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD, gfp_mask);
-+ struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD_ALLOC, gfp_mask);
- if (likely(skb))
-- skb_reserve(skb, NET_SKB_PAD);
-+ skb_reserve(skb, NET_SKB_PAD_ALLOC);
- return skb;
- }
-
-@@ -1556,7 +1563,7 @@ static inline int __skb_cow(struct sk_bu
- delta = headroom - skb_headroom(skb);
-
- if (delta || cloned)
-- return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD), 0,
-+ return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD_ALLOC), 0,
- GFP_ATOMIC);
- return 0;
- }
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
-@@ -339,9 +339,9 @@ struct sk_buff *__netdev_alloc_skb(struc
- int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1;
- struct sk_buff *skb;
-
-- skb = __alloc_skb(length + NET_SKB_PAD, gfp_mask, 0, node);
-+ skb = __alloc_skb(length + NET_SKB_PAD_ALLOC, gfp_mask, 0, node);
- if (likely(skb)) {
-- skb_reserve(skb, NET_SKB_PAD);
-+ skb_reserve(skb, NET_SKB_PAD_ALLOC);
- skb->dev = dev;
- }
- return skb;
+++ /dev/null
---- /dev/null
-+++ b/include/asm-powerpc/segment.h
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_SEGMENT_H
-+#define _ASM_SEGMENT_H
-+
-+/* Only here because we have some old header files that expect it.. */
-+
-+#endif /* _ASM_SEGMENT_H */
+++ /dev/null
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -49,7 +49,9 @@ ifneq ($(SUBARCH),$(ARCH))
- endif
-
- ifndef CONFIG_FUNCTION_TRACER
--cflags-y := -ffunction-sections
-+ ifndef CONFIG_PROFILING
-+ cflags-y := -ffunction-sections
-+ endif
- endif
- ifdef CONFIG_FUNCTION_GRAPH_TRACER
- ifndef KBUILD_MCOUNT_RA_ADDRESS
---- a/arch/mips/oprofile/op_model_mipsxx.c
-+++ b/arch/mips/oprofile/op_model_mipsxx.c
-@@ -298,6 +298,11 @@ static void reset_counters(void *arg)
- }
- }
-
-+static irqreturn_t mipsxx_perfcount_int(int irq, void *dev_id)
-+{
-+ return mipsxx_perfcount_handler();
-+}
-+
- static int __init mipsxx_init(void)
- {
- int counters;
-@@ -374,6 +379,10 @@ static int __init mipsxx_init(void)
- save_perf_irq = perf_irq;
- perf_irq = mipsxx_perfcount_handler;
-
-+ if (cp0_perfcount_irq >= 0)
-+ return request_irq(cp0_perfcount_irq, mipsxx_perfcount_int,
-+ IRQF_SHARED, "Perfcounter", save_perf_irq);
-+
- return 0;
- }
-
-@@ -381,6 +390,9 @@ static void mipsxx_exit(void)
- {
- int counters = op_model_mipsxx_ops.num_counters;
-
-+ if (cp0_perfcount_irq >= 0)
-+ free_irq(cp0_perfcount_irq, save_perf_irq);
-+
- counters = counters_per_cpu_to_total(counters);
- on_each_cpu(reset_counters, (void *)(long)counters, 1);
-
+++ /dev/null
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -180,6 +180,7 @@ source "fs/ubifs/Kconfig"
- source "fs/cramfs/Kconfig"
- source "fs/squashfs/Kconfig"
- source "fs/freevxfs/Kconfig"
-+source "fs/mini_fo/Kconfig"
- source "fs/minix/Kconfig"
- source "fs/omfs/Kconfig"
- source "fs/hpfs/Kconfig"
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -77,6 +77,7 @@ obj-$(CONFIG_SQUASHFS) += squashfs/
- obj-y += ramfs/
- obj-$(CONFIG_HUGETLBFS) += hugetlbfs/
- obj-$(CONFIG_CODA_FS) += coda/
-+obj-$(CONFIG_MINI_FO) += mini_fo/
- obj-$(CONFIG_MINIX_FS) += minix/
- obj-$(CONFIG_FAT_FS) += fat/
- obj-$(CONFIG_BFS_FS) += bfs/
---- /dev/null
-+++ b/fs/mini_fo/aux.c
-@@ -0,0 +1,577 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+/* check if file exists in storage */
-+int exists_in_storage(dentry_t *dentry)
-+{
-+ check_mini_fo_dentry(dentry);
-+ if(dtost(dentry) == MODIFIED || dtost(dentry) == CREATED || dtost(dentry) == DEL_REWRITTEN)
-+ return 1;
-+ return 0;
-+}
-+
-+/* check if dentry is in an existing state */
-+int is_mini_fo_existant(dentry_t *dentry)
-+{
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) == DELETED || dtost(dentry) == NON_EXISTANT)
-+ return 0;
-+ else
-+ return 1;
-+}
-+
-+/*
-+ * This function will create a negative storage dentry for
-+ * dentry, what is required for many create like options.
-+ * It will create the storage structure if necessary.
-+ */
-+int get_neg_sto_dentry(dentry_t *dentry)
-+{
-+ int err = 0;
-+ unsigned int len;
-+ const unsigned char *name;
-+
-+ if(!dentry ||
-+ !dtopd(dentry) ||
-+ !(dtost(dentry) == UNMODIFIED ||
-+ dtost(dentry) == NON_EXISTANT ||
-+ dtost(dentry) == DELETED)) {
-+ printk(KERN_CRIT "mini_fo: get_neg_sto_dentry: invalid dentry passed.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ /* Have we got a neg. dentry already? */
-+ if(dtohd2(dentry)) {
-+ err = 0;
-+ goto out;
-+ }
-+ if(dtost(dentry->d_parent) == UNMODIFIED) {
-+ /* build sto struct */
-+ err = build_sto_structure(dentry->d_parent->d_parent, dentry->d_parent);
-+ if(err ||
-+ dtost(dentry->d_parent) != MODIFIED) {
-+ printk(KERN_CRIT "mini_fo: get_neg_sto_dentry: ERROR building sto structure.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ }
-+
-+ len = dentry->d_name.len;
-+ name = dentry->d_name.name;
-+
-+ dtohd2(dentry) =
-+ lookup_one_len(name, dtohd2(dentry->d_parent), len);
-+
-+ out:
-+ return err;
-+}
-+
-+int check_mini_fo_dentry(dentry_t *dentry)
-+{
-+ ASSERT(dentry != NULL);
-+ ASSERT(dtopd(dentry) != NULL);
-+ ASSERT((dtohd(dentry) != NULL) || (dtohd2(dentry) != NULL));
-+
-+/* if(dtost(dentry) == MODIFIED) { */
-+/* ASSERT(dentry->d_inode != NULL); */
-+/* ASSERT(dtohd(dentry) != NULL); */
-+/* ASSERT(dtohd(dentry)->d_inode != NULL); */
-+/* ASSERT(dtohd2(dentry) != NULL); */
-+/* ASSERT(dtohd2(dentry)->d_inode != NULL); */
-+/* } */
-+/* else if(dtost(dentry) == UNMODIFIED) { */
-+/* ASSERT(dentry->d_inode != NULL); */
-+/* ASSERT( */
-+/* } */
-+ return 0;
-+}
-+
-+int check_mini_fo_file(file_t *file)
-+{
-+ ASSERT(file != NULL);
-+ ASSERT(ftopd(file) != NULL);
-+ ASSERT(file->f_dentry != NULL);
-+
-+ /* violent checking, check depending of state and type
-+ * if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {}
-+ */
-+ ASSERT((ftohf(file) != NULL) || (ftohf2(file) != NULL));
-+ return 0;
-+}
-+
-+int check_mini_fo_inode(inode_t *inode)
-+{
-+ ASSERT(inode != NULL);
-+ ASSERT(itopd(inode) != NULL);
-+ ASSERT((itohi(inode) != NULL) || (itohi2(inode) != NULL));
-+ return 0;
-+}
-+
-+/*
-+ * will walk a base path as provided by get_mini_fo_bpath and return
-+ * the (hopefully ;-) ) positive dentry of the renamed base dir.
-+ *
-+ * This does some work of path_init.
-+ */
-+dentry_t *bpath_walk(super_block_t *sb, char *bpath)
-+{
-+ int err;
-+ struct vfsmount *mnt;
-+ struct nameidata nd;
-+
-+ /* be paranoid */
-+ if(!bpath || bpath[0] != '/') {
-+ printk(KERN_CRIT "mini_fo: bpath_walk: Invalid string.\n");
-+ return NULL;
-+ }
-+ if(!sb || !stopd(sb)) {
-+ printk(KERN_CRIT "mini_fo: bpath_walk: Invalid sb.\n");
-+ return NULL;
-+ }
-+
-+ /* fix this: how do I reach this lock?
-+ * read_lock(¤t->fs->lock); */
-+ mnt = mntget(stopd(sb)->hidden_mnt);
-+ /* read_unlock(¤t->fs->lock); */
-+
-+ err = vfs_path_lookup(mnt->mnt_root, mnt, bpath+1, 0, &nd);
-+
-+ /* validate */
-+ if (err || !nd.dentry || !nd.dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: bpath_walk: path_walk failed.\n");
-+ return NULL;
-+ }
-+ return nd.dentry;
-+}
-+
-+
-+/* returns the full path of the basefile incl. its name */
-+int get_mini_fo_bpath(dentry_t *dentry, char **bpath, int *bpath_len)
-+{
-+ char *buf_walker;
-+ int len = 0;
-+ dentry_t *sky_walker;
-+
-+ if(!dentry || !dtohd(dentry)) {
-+ printk(KERN_CRIT "mini_fo: get_mini_fo_bpath: invalid dentry passed.\n");
-+ return -1;
-+ }
-+ sky_walker = dtohd(dentry);
-+
-+ do {
-+ len += sky_walker->d_name.len + 1 ; /* 1 for '/' */
-+ sky_walker = sky_walker->d_parent;
-+ } while(sky_walker != stopd(dentry->d_inode->i_sb)->base_dir_dentry);
-+
-+ /* 1 to oil the loop */
-+ *bpath = (char*) kmalloc(len + 1, GFP_KERNEL);
-+ if(!*bpath) {
-+ printk(KERN_CRIT "mini_fo: get_mini_fo_bpath: out of mem.\n");
-+ return -1;
-+ }
-+ buf_walker = *bpath+len; /* put it on last char */
-+ *buf_walker = '\n';
-+ sky_walker = dtohd(dentry);
-+
-+ do {
-+ buf_walker -= sky_walker->d_name.len;
-+ strncpy(buf_walker,
-+ sky_walker->d_name.name,
-+ sky_walker->d_name.len);
-+ *(--buf_walker) = '/';
-+ sky_walker = sky_walker->d_parent;
-+ } while(sky_walker != stopd(dentry->d_inode->i_sb)->base_dir_dentry);
-+
-+ /* bpath_len doesn't count newline! */
-+ *bpath_len = len;
-+ return 0;
-+}
-+
-+int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
-+ dentry_t *src_dentry, struct vfsmount *src_mnt)
-+{
-+ void *buf;
-+ mm_segment_t old_fs;
-+ file_t *tgt_file;
-+ file_t *src_file;
-+ int bytes, len, tmp, err;
-+ err = 0;
-+
-+ if(!(tgt_dentry->d_inode && src_dentry->d_inode)) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, neg. dentry passed.\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ dget(tgt_dentry);
-+ dget(src_dentry);
-+ mntget(tgt_mnt);
-+ mntget(src_mnt);
-+
-+ /* open file write only */
-+ tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1);
-+ if(!tgt_file || IS_ERR(tgt_file)) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening target file.\n");
-+ err = PTR_ERR(tgt_file);
-+ goto out_err;
-+ }
-+
-+ /* open file read only */
-+ src_file = dentry_open(src_dentry, src_mnt, 0x0);
-+ if(!src_file || IS_ERR(src_file)) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening source file.\n");
-+ err = PTR_ERR(src_file);
-+
-+ /* close target file */
-+ fput(tgt_file);
-+ goto out_err;
-+ }
-+
-+ /* check if the filesystem(s) support read respective write */
-+ if(!src_file->f_op->read || !tgt_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, no fs read or write support.\n");
-+ err = -EPERM;
-+ goto out_close;
-+ }
-+
-+ /* allocate a page for transfering the data */
-+ buf = (void *) __get_free_page(GFP_KERNEL);
-+ if(!buf) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, out of kernel mem.\n");
-+ goto out_err;
-+ }
-+
-+ tgt_file->f_pos = 0;
-+ src_file->f_pos = 0;
-+
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* Doing this I assume that a read operation will return a full
-+ * buffer while there is still data to read, and a less than
-+ * full buffer when all data has been read.
-+ */
-+ bytes = len = PAGE_SIZE;
-+ while(bytes == len) {
-+ bytes = src_file->f_op->read(src_file, buf, len,
-+ &src_file->f_pos);
-+ tmp = tgt_file->f_op->write(tgt_file, buf, bytes,
-+ &tgt_file->f_pos);
-+ if(tmp != bytes) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR writing.\n");
-+ goto out_close_unset;
-+ }
-+ }
-+
-+ free_page((unsigned long) buf);
-+ set_fs(old_fs);
-+ fput(tgt_file);
-+ fput(src_file);
-+ goto out;
-+
-+ out_close_unset:
-+ free_page((unsigned long) buf);
-+ set_fs(old_fs);
-+
-+ out_close:
-+ fput(tgt_file);
-+ fput(src_file);
-+
-+ out_err:
-+ dput(tgt_dentry);
-+ dput(src_dentry);
-+
-+ /* mk: not sure if this need to be done */
-+ mntput(tgt_mnt);
-+ mntput(src_mnt);
-+
-+ out:
-+ return err;
-+}
-+
-+/* mk:
-+ * ndl (no-duplicate list) stuff
-+ * This is used in mini_fo_readdir, to save the storage directory contents
-+ * and later when reading base, match them against the list in order
-+ * to avoid duplicates.
-+ */
-+
-+/* add a file specified by name and len to the ndl
-+ * Return values: 0 on success, <0 on failure.
-+ */
-+int ndl_add_entry(struct readdir_data *rd, const char *name, int len)
-+{
-+ struct ndl_entry *tmp_entry;
-+
-+ tmp_entry = (struct ndl_entry *)
-+ kmalloc(sizeof(struct ndl_entry), GFP_KERNEL);
-+ if(!tmp_entry) {
-+ printk(KERN_CRIT "mini_fo: ndl_add_entry: out of mem.\n");
-+ return -ENOMEM;
-+ }
-+ tmp_entry->name = (char*) kmalloc(len, GFP_KERNEL);
-+ if(!tmp_entry->name) {
-+ printk(KERN_CRIT "mini_fo: ndl_add_entry: out of mem.\n");
-+ return -ENOMEM;
-+ }
-+ strncpy(tmp_entry->name, name, len);
-+ tmp_entry->len = len;
-+
-+ list_add(&tmp_entry->list, &rd->ndl_list);
-+ rd->ndl_size++;
-+ return 0;
-+}
-+
-+/* delete all list entries and free memory */
-+void ndl_put_list(struct readdir_data *rd)
-+{
-+ struct list_head *tmp;
-+ struct ndl_entry *tmp_entry;
-+
-+ if(rd->ndl_size <= 0)
-+ return;
-+ while(!list_empty(&rd->ndl_list)) {
-+ tmp = rd->ndl_list.next;
-+ list_del(tmp);
-+ tmp_entry = list_entry(tmp, struct ndl_entry, list);
-+ kfree(tmp_entry->name);
-+ kfree(tmp_entry);
-+ }
-+ rd->ndl_size = 0;
-+}
-+
-+/* Check if a file specified by name and len is in the ndl
-+ * Return value: 0 if not in list, 1 if file is found in ndl.
-+ */
-+int ndl_check_entry(struct readdir_data *rd, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct ndl_entry *tmp_entry;
-+
-+ if(rd->ndl_size <= 0)
-+ return 0;
-+
-+ list_for_each(tmp, &rd->ndl_list) {
-+ tmp_entry = list_entry(tmp, struct ndl_entry, list);
-+ if(tmp_entry->len != len)
-+ continue;
-+ if(!strncmp(tmp_entry->name, name, len))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/* mk:
-+ * Recursive function to create corresponding directorys in the storage fs.
-+ * The function will build the storage directorys up to dentry.
-+ */
-+int build_sto_structure(dentry_t *dir, dentry_t *dentry)
-+{
-+ int err;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ if(dentry->d_parent != dir) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: invalid parameter or meta data corruption [1].\n");
-+ return 1;
-+ }
-+
-+ if(dtost(dir) != MODIFIED) {
-+ err = build_sto_structure(dir->d_parent, dentry->d_parent);
-+ if(err)
-+ return err;
-+ }
-+
-+ /* ok, coming back again. */
-+ check_mini_fo_dentry(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(!hidden_sto_dentry) {
-+ /*
-+ * This is the case after creating the first
-+ * hidden_sto_dentry.
-+ * After one negative storage_dentry, all pointers to
-+ * hidden_storage dentries are set to NULL. We need to
-+ * create the negative dentry before we create the storage
-+ * file.
-+ */
-+ unsigned int len;
-+ const unsigned char *name;
-+ len = dtohd(dentry)->d_name.len;
-+ name = dtohd(dentry)->d_name.name;
-+ hidden_sto_dentry = lookup_one_len(name, dtohd2(dir), len);
-+ dtohd2(dentry) = hidden_sto_dentry;
-+ }
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ /* lets be safe */
-+ if(dtohd2(dir) != hidden_sto_dir_dentry) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: invalid parameter or meta data corruption [2].\n");
-+ return 1;
-+ }
-+
-+ /* check for errors in lock_parent */
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if(IS_ERR(hidden_sto_dir_dentry)) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: lock_parent failed.\n");
-+ return err;
-+ }
-+
-+ err = vfs_mkdir(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dir->d_inode->i_mode);
-+
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: failed to create storage dir [1].\n");
-+ /* was: unlock_dir(dir); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&dir->d_inode->i_mutex);
-+#else
-+ up(&dir->d_inode->i_sem);
-+#endif
-+ dput(dir);
-+ return err;
-+ }
-+
-+ /* everything ok! */
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: failed to create storage dir [2].\n");
-+ /* was: unlock_dir(dir); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&dir->d_inode->i_mutex);
-+#else
-+ up(&dir->d_inode->i_sem);
-+#endif
-+ dput(dir);
-+ return 1;
-+ }
-+
-+ /* interpose the new inode and set new state */
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ dtopd(dentry)->state = MODIFIED;
-+
-+ /* initalize the wol list */
-+ itopd(dentry->d_inode)->deleted_list_size = -1;
-+ itopd(dentry->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(dentry);
-+
-+ fist_copy_attr_all(dentry->d_inode, itohi2(dentry->d_inode));
-+ fist_copy_attr_timesizes(dir->d_inode,
-+ hidden_sto_dir_dentry->d_inode);
-+ dir->d_inode->i_nlink++;
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ return 0;
-+}
-+
-+
-+#if 0 /* unused */
-+
-+/*
-+ * Read "len" bytes from "filename" into "buf".
-+ * "buf" is in kernel space.
-+ */
-+int
-+mini_fo_read_file(const char *filename, void *buf, int len)
-+{
-+ file_t *filp;
-+ mm_segment_t oldfs;
-+ int bytes;
-+ /* Chroot? Maybe NULL isn't right here */
-+ filp = filp_open(filename, O_RDONLY, 0);
-+ if (!filp || IS_ERR(filp)) {
-+ printk("mini_fo_read_file err %d\n", (int) PTR_ERR(filp));
-+ return -1; /* or do something else */
-+ }
-+
-+ if (!filp->f_op->read)
-+ return -2; /* file(system) doesn't allow reads */
-+
-+ /* now read len bytes from offset 0 */
-+ filp->f_pos = 0; /* start offset */
-+ oldfs = get_fs();
-+ set_fs(KERNEL_DS);
-+ bytes = filp->f_op->read(filp, buf, len, &filp->f_pos);
-+ set_fs(oldfs);
-+
-+ /* close the file */
-+ fput(filp);
-+
-+ return bytes;
-+}
-+
-+
-+
-+/*
-+ * Write "len" bytes from "buf" to "filename"
-+ * "buf" is in kernel space.
-+ */
-+int
-+mini_fo_write_file(const char *filename, void *buf, int len)
-+{
-+ file_t *filp;
-+ mm_segment_t oldfs;
-+ int bytes;
-+ /* Chroot? Maybe NULL isn't right here */
-+ filp = filp_open(filename, O_RDWR|O_CREAT, 0640);
-+ if (!filp || IS_ERR(filp)) {
-+ printk("mini_fo_write_file err %d\n", (int) PTR_ERR(filp));
-+ return -1; /* or do something else */
-+ }
-+
-+ if (!filp->f_op->write)
-+ return -2; /* file(system) doesn't allow writes */
-+
-+ /* now write len bytes from offset 0 */
-+ filp->f_pos = 0; /* start offset */
-+ oldfs = get_fs();
-+ set_fs(KERNEL_DS);
-+ bytes = filp->f_op->write(filp, buf, len, &filp->f_pos);
-+ set_fs(oldfs);
-+
-+ /* close the file */
-+ fput(filp);
-+
-+ return bytes;
-+}
-+
-+#endif /* unused */
-+
---- /dev/null
-+++ b/fs/mini_fo/ChangeLog
-@@ -0,0 +1,281 @@
-+2006-01-24 Markus Klotzbuecher <mk@mary.denx.de>
-+
-+ * Add tons of ugly ifdefs to Ed L. Cashin's mutex patch to
-+ retain backwards compatibility.
-+
-+2006-01-24 Ed L. Cashin <ecashin@coraid.com>
-+
-+ * Support for the new mutex infrastructure
-+ (7892f2f48d165a34b0b8130c8a195dfd807b8cb6)
-+
-+2005-10-15 Markus Klotzbuecher <mk@localhost.localdomain>
-+
-+ * Bugfix for a serious memory leak in mini_fo_follow_link.
-+
-+2005-09-21 Markus Klotzbuecher <mk@mary>
-+
-+ * new release 0.6.1
-+
-+ * fix of a compiler warning due to changes in 2.6.13
-+
-+2005-09-21 Klaus Wenninger <klaus.wenninger@siemens.com>
-+
-+ * file.c: readdir: fix for a bug that caused directory entries
-+ to show up twice when using storage filesystems such as
-+ minixfs or pramfs.
-+
-+2005-06-30 Eric Lammerts <eric@lammerts.org>
-+
-+ * fix for an oops when overwriting a binary thats beeing
-+ executed.
-+
-+2005-06-09 <mk@mary>
-+
-+ * Renamed overlay to mini_fo-overlay.
-+
-+ * Added mini_fo-merge script to allow merging of storage and base
-+ after making modifications.
-+
-+2005-05-22 root <mk@mary>
-+
-+ * Added overlay script that allows to easily mount mini_fo ontop
-+ of a given base directory
-+
-+2005-05-10 <mk@mary>
-+
-+ * inode.c: xattr functions return -EOPNOSUPP instead of
-+ -ENOSUPP, what confuses "ls -l"
-+
-+ * Changed license from LGPL to GPL.
-+
-+2005-05-08 root <mk@mary>
-+
-+ * Makefile: clean it up and added make install and make
-+ uninstall.
-+
-+2005-05-06 <mk@mary>
-+
-+ * merged devel branch back to main. [v0-6-0-pre3]
-+
-+ * removed unused files print.c and fist_ioctl. [devel-0-0-18]
-+
-+ * ioctl: removed fist_ioctl stuff, that is not needed for
-+ now.
-+
-+2005-05-03 <mk@mary>
-+
-+ * file.c: simplified mini_fo_open and mini_fo_setattr using
-+ new state changing functions. [devel-0-0-17]
-+
-+ * inode.c: Fixed getattr state bug (see below) in 2.4 function
-+ mini_fo_inode revalidate.
-+
-+ * inode.c: found an other bug in mini_fo_getattr. States are not
-+ reliable in this function, as a file can be opened, unlinked and
-+ the getattr function called. This results in a deleted dentry
-+ with an inode. Fix is to ignore states and simply use the inode
-+ available.
-+
-+2005-04-29 <mk@mary>
-+
-+ * file.c: Bugfix and cleanup in fasync and fsync. [devel-0-0-16]
-+
-+ * file.c: do not use mini_fo_lock so the generic version is
-+ used (I guess).
-+
-+ * inode.c: getattr, never call getattr on lower files, as this
-+ will cause the inum to change.
-+
-+ * inode.c: rename_reg_file renamed to rename_nondir, as it
-+ doesn't matter as long it't not a dir. Removed all
-+ rename_dev_file etc.
-+
-+ * tagged as devel-0-0-15
-+
-+ * inode.c: added support for chosing support for extended
-+ attrs at compile time by XATTR define in mini_fo.h .
-+
-+ * inode.c: fixed mini_fo_getattr to use mini_fo inode and not
-+ lower again, what avoids inode number changes that confused
-+ rm again. This is the proper solution.
-+
-+2005-04-24 <mk@mary>
-+
-+ * all files: updated Copyright notive to 2005. [devel-0-0-14]
-+
-+ * inode.c: fixed mini_fo_getattr to not change the inode
-+ number, even if lower files change.
-+
-+ * super.c: fixed a bug that caused deleted base file to show
-+ up suddenly after some time, or after creating a special
-+ file. The problem was that after some time or after special
-+ file creating sync_sb_inodes is called by the vfs, that
-+ called our mini_fo_put_inode. There was (wrongly) called
-+ __meta_put_lists, that nuked the lists, although the inode
-+ was going to continue its life. Moving __meta_put_lists to
-+ mini_fo_clear_inode, where an inode is really destroyed,
-+ solved the problem.
-+
-+
-+2005-04-23 <mk@mary>
-+
-+ * state.c, aux.c: more cleaning up and
-+ simplifications. [devel-0-0-13]
-+
-+ * inode.c: implemented mini_fo_getattr, that was required for
-+ 2.6 because inode_revalidate has been remove there, and the
-+ old "du" bug returned.
-+
-+
-+2005-04-20 <mk@mary>
-+
-+ * aux.c: get_neg_sto_dentry(): allow to be called for dentries
-+ in state UNMODIFIED, NON_EXISTANT _and_ DELETED.
-+
-+2005-04-19 <mk@mary>
-+
-+ * Fixed a bug under 2.6 that caused files deleted via mini_fo
-+ not to be deleted properly and therefore the fs filled up
-+ untill no memory was left. [devel-0-0-12]
-+
-+ * Added basic hard link support. This means that creating
-+ hardlinks will work, but existing ones will be treated as
-+ individual files. [devel-0-0-11]
-+
-+2005-04-17 <mk@mary>
-+
-+ * Bugfixes
-+
-+2005-04-13 root <mk@mary>
-+
-+ * Added file state.c for the state transition
-+ functions. Doesn't work very well yet, though...
-+
-+2005-04-12 <mk@mary>
-+
-+ * Porting to 2.6 started, which is easier than expected, also
-+ due to Olivier previous work.
-+
-+2005-04-08 <mk@mary>
-+
-+ * Fixed the bug that caused du to return invalid sizes of
-+ directory trees. The problem was that
-+ mini_fo_inode_revalidate didn't always copy the attributes
-+ from the base inode properly.
-+
-+2005-04-01 Markus Klotzbuecher <mk@chasey>
-+
-+ * Merged devel branch back to main trunk and updated the
-+ RELEASE notes. This will be 0-6-0-pre1.
-+
-+2005-03-31 Markus Klotzbuecher <mk@chasey>
-+
-+ * Fixed some bugs in rename_reg_file, that only showed up in
-+ the kernel compile test. Kernel compiles cleanly ontop of
-+ mini_fo, now also make mrproper etc. work. Seems pretty stable.
-+
-+2005-03-28 Markus Klotzbuecher <mk@chasey>
-+
-+ * Many, many directory renaming bugfixes and a lot of other
-+ cleanup. Dir renaming seems to work relatively stable.
-+
-+2005-03-22 Markus Klotzbuecher <mk@chasey>
-+
-+ * Finished implementing lightweight directory renaming. Some
-+ basic testing indicates it works fine.
-+ Next is to implement testcases for the testsuite and confirm
-+ everything is really working ok.
-+
-+2005-03-18 Markus Klotzbuecher <mk@chasey>
-+
-+ * Finished implementing meta.c stuff required for directory
-+ renaming.
-+
-+2005-03-17 Markus Klotzbuecher <mk@chasey>
-+
-+ * Fixed all compile warnings + an extremly old bug that
-+ somehow crept in while reworking the wol stuff to the META
-+ system. Turning on -Werror again... :-)
-+
-+ * Fixed some bugs in the new rename_reg_file function.
-+
-+ * Rewrote mini_fo rename and split it into several
-+ subfunctions, that handle the different types
-+ seperately. Rewrote the regular file function aswell, as it
-+ was implemented somewhat inefficient.
-+
-+2005-03-16 Markus Klotzbuecher <mk@chasey>
-+
-+ * Implemented new META subsystem, removed old WOL stuff in favor
-+ if it.
-+
-+ * After some basic testing everything seems ok...
-+
-+2005-03-11 Markus Klotzbuecher <mk@chasey>
-+
-+ * Renaming a non regular file caused trouble because I always
-+ tried to copy the contents. Now I only do this for regular
-+ files. mini_fo_rename still isn't implemented properly, renaming
-+ of device files, symlinks etc. results in a empty regular file
-+ instead of the proper type.
-+
-+ * Directory renaming suddenly works! What a surprise! I guess
-+ this is because renaming is implemented as making a copy and
-+ removing the original. Still this might not work
-+ everywhere...
-+
-+2005-03-09 Markus Klotzbuecher <mk@chasey>
-+
-+ * Bugfix, when a mini_fo directory that exists in storage
-+ (state: MODIFIED, CREATED and DEL_REWRITTEN) is deleted, a
-+ possibly existing WOL file contained in it needs to be
-+ deleted too.
-+
-+ * Starting cleanup: defined state names in order to get rid of
-+ the state numbers.
-+
-+2005-03-08 Markus Klotzbuecher <mk@chasey>
-+
-+ * Makefile fix, fist_ioctl was built against wrong sources if ARCH=um
-+
-+ * Fixed a bug in dentry.c, mini_fo_d_hash. In state 4 =
-+ DEL_REWRITTEN the hash was calculated from the base dentry,
-+ which was wrong and and caused assertions in
-+ __mini_fo_hidden_dentry to fail.
-+
-+2005-02-21 <mk@mary>
-+
-+ * Implemented directory deleting (inode.c)
-+
-+ * main.c: made mini_fo_parse_options a little more robust.
-+
-+2004-12-22 <mk@mary>
-+
-+ * Makefile cleanup and uml stuff, removed unneccessary files
-+
-+ * Created a new and hopefully more informative README
-+
-+ * CHANGELOG: created a new CHANGELOG and added old entries reversely
-+
-+
-+2004-10-24 Gleb Natapov <gleb@nbase.co.il>
-+
-+ * Fix: owner and group where not correctly copied from base to
-+ storage.
-+
-+
-+2004-10-05 Gleb Natapov <gleb@nbase.co.il>
-+
-+ * Implementation of fsync, fasync and lock mini_fo functions.
-+
-+
-+2004-09-29 Bob Lee <bob@pantasys.com>
-+
-+ * Fix of a serious pointer bug
-+
-+
-+2004-09-28 Gleb Natapov <gleb@nbase.co.il>
-+
-+ * Implementation of mini_fo_mknod and mini_fo_rename, support
-+ for device files.
-+
---- /dev/null
-+++ b/fs/mini_fo/dentry.c
-@@ -0,0 +1,244 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+/*
-+ * THIS IS A BOOLEAN FUNCTION: returns 1 if valid, 0 otherwise.
-+ */
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_d_revalidate(dentry_t *dentry, struct nameidata *nd)
-+#else
-+mini_fo_d_revalidate(dentry_t *dentry, int flags)
-+#endif
-+{
-+ int err1 = 1; /* valid = 1, invalid = 0 */
-+ int err2 = 1;
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ hidden_dentry = dtohd(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(hidden_dentry &&
-+ hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_revalidate) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err1 = hidden_dentry->d_op->d_revalidate(hidden_dentry, nd);
-+#else
-+ err1 = hidden_dentry->d_op->d_revalidate(hidden_dentry, flags);
-+#endif
-+ }
-+ if(hidden_sto_dentry &&
-+ hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_revalidate) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err2 = hidden_sto_dentry->d_op->d_revalidate(hidden_sto_dentry,
-+ nd);
-+#else
-+ err2 = hidden_sto_dentry->d_op->d_revalidate(hidden_sto_dentry,
-+ flags);
-+#endif
-+ }
-+
-+ /* mk: if one of the lower level dentries are valid,
-+ * the mini_fo dentry is too.
-+ */
-+ return (err1 || err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_d_hash(dentry_t *dentry, qstr_t *name)
-+{
-+ int err = 0;
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+ /* hidden_dentry = mini_fo_hidden_dentry(dentry);
-+ * hidden_sto_dentry = mini_fo_hidden_sto_dentry(dentry); */
-+
-+ /* state 1, 3, 4, 5: build the hash for the storage dentry */
-+ if((dtopd(dentry)->state == MODIFIED) ||
-+ (dtopd(dentry)->state == CREATED) ||
-+ (dtopd(dentry)->state == DEL_REWRITTEN) ||
-+ (dtopd(dentry)->state == DELETED)) {
-+ hidden_sto_dentry = dtohd2(dentry);
-+ if(hidden_sto_dentry &&
-+ hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_hash) {
-+ err = hidden_sto_dentry->d_op->d_hash(hidden_sto_dentry, name);
-+ }
-+ goto out;
-+ }
-+ /* state 2: build the hash for the base dentry */
-+ if(dtopd(dentry)->state == UNMODIFIED) {
-+ hidden_dentry = dtohd(dentry);
-+ if(hidden_dentry &&
-+ hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_hash) {
-+ err = hidden_dentry->d_op->d_hash(hidden_dentry, name);
-+ }
-+ goto out;
-+ }
-+ /* state 6: build hash for the dentry that exists */
-+ if(dtopd(dentry)->state == NON_EXISTANT) {
-+ hidden_sto_dentry = dtohd2(dentry);
-+ if(hidden_sto_dentry &&
-+ hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_hash) {
-+ err = hidden_sto_dentry->d_op->d_hash(hidden_sto_dentry, name);
-+ goto out;
-+ }
-+ hidden_dentry = dtohd(dentry);
-+ if(hidden_dentry &&
-+ hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_hash) {
-+ err = hidden_dentry->d_op->d_hash(hidden_dentry, name);
-+ goto out;
-+ }
-+ }
-+
-+ printk(KERN_CRIT "mini_fo: d_hash: invalid state detected.\n");
-+
-+ out:
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_d_compare(dentry_t *dentry, qstr_t *a, qstr_t *b)
-+{
-+ int err;
-+ dentry_t *hidden_dentry=NULL;
-+
-+ /* hidden_dentry = mini_fo_hidden_dentry(dentry); */
-+ if(dtohd2(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else if(dtohd(dentry))
-+ hidden_dentry = dtohd(dentry);
-+
-+ if (hidden_dentry && hidden_dentry->d_op && hidden_dentry->d_op->d_compare) {
-+ err = hidden_dentry->d_op->d_compare(hidden_dentry, a, b);
-+ } else {
-+ err = ((a->len != b->len) || memcmp(a->name, b->name, b->len));
-+ }
-+
-+ return err;
-+}
-+
-+
-+int
-+mini_fo_d_delete(dentry_t *dentry)
-+{
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+ int err = 0;
-+
-+ /* this could be a negative dentry, so check first */
-+ if (!dtopd(dentry)) {
-+ printk(KERN_CRIT "mini_fo_d_delete: negative dentry passed.\n");
-+ goto out;
-+ }
-+ hidden_dentry = dtohd(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(hidden_dentry) {
-+ if(hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_delete) {
-+ err = hidden_dentry->d_op->d_delete(hidden_dentry);
-+ }
-+ }
-+ if(hidden_sto_dentry) {
-+ if(hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_delete) {
-+ err = hidden_sto_dentry->d_op->d_delete(hidden_sto_dentry);
-+ }
-+ }
-+
-+ out:
-+ return err;
-+}
-+
-+
-+void
-+mini_fo_d_release(dentry_t *dentry)
-+{
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+
-+ /* this could be a negative dentry, so check first */
-+ if (!dtopd(dentry)) {
-+ printk(KERN_CRIT "mini_fo_d_release: no private data.\n");
-+ goto out;
-+ }
-+ hidden_dentry = dtohd(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(hidden_dentry) {
-+ /* decrement hidden dentry's counter and free its inode */
-+ dput(hidden_dentry);
-+ }
-+ if(hidden_sto_dentry) {
-+ /* decrement hidden dentry's counter and free its inode */
-+ dput(hidden_sto_dentry);
-+ }
-+
-+ /* free private data (mini_fo_dentry_info) here */
-+ kfree(dtopd(dentry));
-+ __dtopd(dentry) = NULL; /* just to be safe */
-+ out:
-+ return;
-+}
-+
-+
-+/*
-+ * we don't really need mini_fo_d_iput, because dentry_iput will call iput() if
-+ * mini_fo_d_iput is not defined. We left this implemented for ease of
-+ * tracing/debugging.
-+ */
-+void
-+mini_fo_d_iput(dentry_t *dentry, inode_t *inode)
-+{
-+ iput(inode);
-+}
-+
-+
-+struct dentry_operations mini_fo_dops = {
-+ d_revalidate: mini_fo_d_revalidate,
-+ d_hash: mini_fo_d_hash,
-+ d_compare: mini_fo_d_compare,
-+ d_release: mini_fo_d_release,
-+ d_delete: mini_fo_d_delete,
-+ d_iput: mini_fo_d_iput,
-+};
---- /dev/null
-+++ b/fs/mini_fo/file.c
-@@ -0,0 +1,713 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+#define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1))
-+
-+/*******************
-+ * File Operations *
-+ *******************/
-+
-+STATIC loff_t
-+mini_fo_llseek(file_t *file, loff_t offset, int origin)
-+{
-+ loff_t err;
-+ file_t *hidden_file = NULL;
-+
-+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+ /* Check if trying to llseek from a directory */
-+ err = -EISDIR;
-+ goto out;
-+ }
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ /* always set hidden position to this one */
-+ hidden_file->f_pos = file->f_pos;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ memcpy(&(hidden_file->f_ra),
-+ &(file->f_ra),
-+ sizeof(struct file_ra_state));
-+#else
-+ if (file->f_reada) { /* update readahead information if needed */
-+ hidden_file->f_reada = file->f_reada;
-+ hidden_file->f_ramax = file->f_ramax;
-+ hidden_file->f_raend = file->f_raend;
-+ hidden_file->f_ralen = file->f_ralen;
-+ hidden_file->f_rawin = file->f_rawin;
-+ }
-+#endif
-+ if (hidden_file->f_op && hidden_file->f_op->llseek)
-+ err = hidden_file->f_op->llseek(hidden_file, offset, origin);
-+ else
-+ err = generic_file_llseek(hidden_file, offset, origin);
-+
-+ if (err < 0)
-+ goto out;
-+
-+ if (err != file->f_pos) {
-+ file->f_pos = err;
-+ // ION maybe this?
-+ // file->f_pos = hidden_file->f_pos;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ file->f_reada = 0;
-+#endif
-+ file->f_version++;
-+ }
-+
-+ out:
-+ return err;
-+}
-+
-+
-+/* mk: fanout capable */
-+STATIC ssize_t
-+mini_fo_read(file_t *file, char *buf, size_t count, loff_t *ppos)
-+{
-+ int err = -EINVAL;
-+ file_t *hidden_file = NULL;
-+ loff_t pos = *ppos;
-+
-+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+ /* Check if trying to read from a directory */
-+ /* printk(KERN_CRIT "mini_fo_read: ERROR: trying to read data from a directory.\n"); */
-+ err = -EISDIR;
-+ goto out;
-+ }
-+
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ if (!hidden_file->f_op || !hidden_file->f_op->read)
-+ goto out;
-+
-+ err = hidden_file->f_op->read(hidden_file, buf, count, &pos);
-+ *ppos = pos;
-+
-+ if (err >= 0) {
-+ /* atime should also be updated for reads of size zero or more */
-+ fist_copy_attr_atime(file->f_dentry->d_inode,
-+ hidden_file->f_dentry->d_inode);
-+ }
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ /*
-+ * MAJOR HACK
-+ * because pread() does not have any way to tell us that it is
-+ * our caller, then we don't know for sure if we have to update
-+ * the file positions. This hack relies on read() having passed us
-+ * the "real" pointer of its struct file's f_pos field.
-+ */
-+ if (ppos == &file->f_pos)
-+ hidden_file->f_pos = *ppos = pos;
-+ if (hidden_file->f_reada) { /* update readahead information if needed */
-+ file->f_reada = hidden_file->f_reada;
-+ file->f_ramax = hidden_file->f_ramax;
-+ file->f_raend = hidden_file->f_raend;
-+ file->f_ralen = hidden_file->f_ralen;
-+ file->f_rawin = hidden_file->f_rawin;
-+ }
-+#else
-+ memcpy(&(file->f_ra),&(hidden_file->f_ra),sizeof(struct file_ra_state));
-+#endif
-+
-+ out:
-+ return err;
-+}
-+
-+
-+/* this mini_fo_write() does not modify data pages! */
-+STATIC ssize_t
-+mini_fo_write(file_t *file, const char *buf, size_t count, loff_t *ppos)
-+{
-+ int err = -EINVAL;
-+ file_t *hidden_file = NULL;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ loff_t pos = *ppos;
-+
-+ /* mk: fan out: */
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ /* This is bad! We have no storage file to write to. This
-+ * should never happen because if a file is opened for
-+ * writing, a copy should have been made earlier.
-+ */
-+ printk(KERN_CRIT "mini_fo: write : ERROR, no storage file to write.\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ }
-+
-+ inode = file->f_dentry->d_inode;
-+ hidden_inode = itohi2(inode);
-+ if(!hidden_inode) {
-+ printk(KERN_CRIT "mini_fo: write: no sto inode found, not good.\n");
-+ goto out;
-+ }
-+
-+ if (!hidden_file->f_op || !hidden_file->f_op->write)
-+ goto out;
-+
-+ /* adjust for append -- seek to the end of the file */
-+ if (file->f_flags & O_APPEND)
-+ pos = inode->i_size;
-+
-+ err = hidden_file->f_op->write(hidden_file, buf, count, &pos);
-+
-+ /*
-+ * copy ctime and mtime from lower layer attributes
-+ * atime is unchanged for both layers
-+ */
-+ if (err >= 0)
-+ fist_copy_attr_times(inode, hidden_inode);
-+
-+ *ppos = pos;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ /*
-+ * XXX: MAJOR HACK
-+ *
-+ * because pwrite() does not have any way to tell us that it is
-+ * our caller, then we don't know for sure if we have to update
-+ * the file positions. This hack relies on write() having passed us
-+ * the "real" pointer of its struct file's f_pos field.
-+ */
-+ if (ppos == &file->f_pos)
-+ hidden_file->f_pos = *ppos = pos;
-+#endif
-+ /* update this inode's size */
-+ if (pos > inode->i_size)
-+ inode->i_size = pos;
-+
-+ out:
-+ return err;
-+}
-+
-+/* Global variable to hold a file_t pointer.
-+ * This serves to allow mini_fo_filldir function to know which file is
-+ * beeing read, which is required for two reasons:
-+ *
-+ * - be able to call wol functions in order to avoid listing deleted
-+ * base files.
-+ * - if we're reading a directory which is in state 1, we need to
-+ * maintain a list (in mini_fo_filldir) of which files allready
-+ * have been copied to userspace,to detect files existing in base
-+ * and storage and not list them twice.
-+ */
-+filldir_t mini_fo_filldir_orig;
-+file_t *mini_fo_filldir_file;
-+
-+/* mainly copied from fs/readdir.c */
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_filldir(void * __buf, const char * name, int namlen, loff_t offset,
-+ u64 ino, unsigned int d_type)
-+#else
-+mini_fo_filldir(void * __buf, const char * name, int namlen, loff_t offset,
-+ ino_t ino, unsigned int d_type)
-+#endif
-+{
-+ struct getdents_callback * buf = (struct getdents_callback *) __buf;
-+ file_t* file = mini_fo_filldir_file;
-+
-+ /* In theses states we filter meta files in storage (WOL) */
-+ if(file && (dtopd(file->f_dentry)->state == MODIFIED ||
-+ dtopd(file->f_dentry)->state == CREATED ||
-+ dtopd(file->f_dentry)->state == DEL_REWRITTEN)) {
-+
-+ int tmp = strlen(META_FILENAME);
-+ if(tmp == namlen) {
-+ if(!strncmp(name, META_FILENAME, namlen))
-+ return 0;
-+ }
-+ }
-+
-+ /* check if we are merging the contents of storage and base */
-+ if(file && dtopd(file->f_dentry)->state == MODIFIED) {
-+ /* check if we are still reading storage contents, if
-+ * yes, we just save the name of the file for duplicate
-+ * checking later. */
-+
-+ if(!ftopd(file)->rd.sto_done) {
-+ /* put file into ndl list */
-+ if(ndl_add_entry(&ftopd(file)->rd, name, namlen))
-+ printk(KERN_CRIT "mini_fo_filldir: Error adding to ndl.\n");
-+ } else {
-+ /* check if file has been deleted */
-+ if(meta_check_d_entry(file->f_dentry, name, namlen))
-+ return 0;
-+
-+ /* do duplicate checking */
-+ if(ndl_check_entry(&ftopd(file)->rd, name, namlen))
-+ return 0;
-+ }
-+ }
-+
-+ return mini_fo_filldir_orig(buf, name, namlen, offset, ino, d_type);
-+}
-+
-+
-+STATIC int
-+mini_fo_readdir(file_t *file, void *dirent, filldir_t filldir)
-+{
-+ int err = 0;/* mk: ??? -ENOTDIR; */
-+ file_t *hidden_file = NULL;
-+ file_t *hidden_sto_file = NULL;
-+ inode_t *inode;
-+ struct getdents_callback *buf;
-+ int oldcount;
-+
-+#if defined(FIST_FILTER_NAME) || defined(FIST_FILTER_SCA)
-+ struct mini_fo_getdents_callback buf;
-+#endif /* FIST_FILTER_NAME || FIST_FILTER_SCA */
-+
-+ buf = (struct getdents_callback *) dirent;
-+ oldcount = buf->count;
-+ inode = file->f_dentry->d_inode;
-+ mini_fo_filldir_file = file;
-+ mini_fo_filldir_orig = filldir;
-+
-+ ftopd(file)->rd.sto_done = 0;
-+ do {
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_sto_file = ftohf2(file);
-+ err = vfs_readdir(hidden_sto_file, mini_fo_filldir, dirent);
-+ file->f_pos = hidden_sto_file->f_pos;
-+ if (err > 0)
-+ fist_copy_attr_atime(inode, hidden_sto_file->f_dentry->d_inode);
-+ /* not finshed yet, we'll be called again */
-+ if (buf->count != oldcount)
-+ break;
-+ }
-+
-+ ftopd(file)->rd.sto_done = 1;
-+
-+ if(ftohf(file)) {
-+ hidden_file = ftohf(file);
-+ err = vfs_readdir(hidden_file, mini_fo_filldir, dirent);
-+ file->f_pos = hidden_file->f_pos;
-+ if (err > 0)
-+ fist_copy_attr_atime(inode, hidden_file->f_dentry->d_inode);
-+ }
-+
-+ }
-+ } while (0);
-+
-+ /* mk:
-+ * we need to check if all the directory data has been copied to userspace,
-+ * or if we will be called again by userspace to complete the operation.
-+ */
-+ if(buf->count == oldcount) {
-+ ndl_put_list(&ftopd(file)->rd);
-+ }
-+
-+ /* unset this, safe */
-+ mini_fo_filldir_file = NULL;
-+ return err;
-+}
-+
-+
-+STATIC unsigned int
-+mini_fo_poll(file_t *file, poll_table *wait)
-+{
-+ unsigned int mask = DEFAULT_POLLMASK;
-+ file_t *hidden_file = NULL;
-+
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ if (!hidden_file->f_op || !hidden_file->f_op->poll)
-+ goto out;
-+
-+ mask = hidden_file->f_op->poll(hidden_file, wait);
-+
-+ out:
-+ return mask;
-+}
-+
-+/* FIST-LITE special version of mmap */
-+STATIC int
-+mini_fo_mmap(file_t *file, vm_area_t *vma)
-+{
-+ int err = 0;
-+ file_t *hidden_file = NULL;
-+
-+ /* fanout capability */
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ ASSERT(hidden_file != NULL);
-+ ASSERT(hidden_file->f_op != NULL);
-+ ASSERT(hidden_file->f_op->mmap != NULL);
-+
-+ vma->vm_file = hidden_file;
-+ err = hidden_file->f_op->mmap(hidden_file, vma);
-+ get_file(hidden_file); /* make sure it doesn't get freed on us */
-+ fput(file); /* no need to keep extra ref on ours */
-+
-+ return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_open(inode_t *inode, file_t *file)
-+{
-+ int err = 0;
-+ int hidden_flags;
-+ file_t *hidden_file = NULL;
-+ dentry_t *hidden_dentry = NULL;
-+
-+ /* fanout stuff */
-+ file_t *hidden_sto_file = NULL;
-+ dentry_t *hidden_sto_dentry = NULL;
-+
-+ __ftopd(file) =
-+ kmalloc(sizeof(struct mini_fo_file_info), GFP_KERNEL);
-+ if (!ftopd(file)) {
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+
-+ /* init the readdir_helper structure */
-+ INIT_LIST_HEAD(&ftopd(file)->rd.ndl_list);
-+ ftopd(file)->rd.ndl_size = 0;
-+
-+ /* In certain paths this could stay uninitalized and cause trouble */
-+ ftohf(file) = NULL;
-+ ftohf2(file) = NULL;
-+ hidden_flags = file->f_flags;
-+
-+ /* create storage files? */
-+ if(dtost(file->f_dentry) == UNMODIFIED) {
-+ if(!IS_WRITE_FLAG(file->f_flags)) {
-+ hidden_dentry = dtohd(file->f_dentry);
-+ dget(hidden_dentry);
-+ /* dentry_open will decrement mnt refcnt if err.
-+ * otherwise fput() will do an mntput() for us upon file close. */
-+ mntget(stopd(inode->i_sb)->hidden_mnt);
-+ hidden_file = dentry_open(hidden_dentry,
-+ stopd(inode->i_sb)->hidden_mnt,
-+ hidden_flags);
-+ if (IS_ERR(hidden_file)) {
-+ err = PTR_ERR(hidden_file);
-+ dput(hidden_dentry);
-+ goto out;
-+ }
-+ ftohf(file) = hidden_file; /* link two files */
-+ goto out;
-+ }
-+ else {
-+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+ err = dir_unmod_to_mod(file->f_dentry);
-+ } else
-+ err = nondir_unmod_to_mod(file->f_dentry, 1);
-+
-+ if (err) {
-+ printk("mini_fo_open: ERROR creating storage file.\n");
-+ goto out;
-+ }
-+ }
-+ }
-+ hidden_sto_dentry = dtohd2(file->f_dentry);
-+ dget(hidden_sto_dentry);
-+
-+ if(dtopd(file->f_dentry)->state == MODIFIED) {
-+ /* Directorys are special, interpose on both lower level files */
-+ if(S_ISDIR(itohi(inode)->i_mode)) {
-+ /* check for invalid file types of lower level files */
-+ if(!(S_ISDIR(itohi(inode)->i_mode) && S_ISDIR(itohi2(inode)->i_mode))) {
-+ printk(KERN_CRIT "mini_fo_open: meta data corruption detected.\n");
-+ dput(hidden_sto_dentry);
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* lower level directorys are ok, open the base file */
-+ hidden_dentry = dtohd(file->f_dentry);
-+ dget(hidden_dentry);
-+
-+ mntget(stopd(inode->i_sb)->hidden_mnt);
-+ hidden_file = dentry_open(hidden_dentry,
-+ stopd(inode->i_sb)->hidden_mnt,
-+ hidden_flags);
-+ if (IS_ERR(hidden_file)) {
-+ err = PTR_ERR(hidden_file);
-+ dput(hidden_dentry);
-+ dput(hidden_sto_dentry);
-+ goto out;
-+ }
-+ ftohf(file) = hidden_file; /* link the two files */
-+ }
-+ }
-+
-+ if(!exists_in_storage(file->f_dentry)) {
-+ printk(KERN_CRIT "mini_fo_open: invalid file state detected.\n");
-+ err = -EINVAL;
-+ dput(hidden_sto_dentry);
-+
-+ /* If the base file has been opened, we need to close it here */
-+ if(ftohf(file)) {
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ hidden_file->f_op->flush(hidden_file, NULL);
-+#else
-+ hidden_file->f_op->flush(hidden_file);
-+#endif
-+ dput(hidden_dentry);
-+ }
-+ goto out;
-+ }
-+
-+ /* ok, now we can safely open the storage file */
-+ mntget(stopd(inode->i_sb)->hidden_mnt2);
-+ hidden_sto_file = dentry_open(hidden_sto_dentry,
-+ stopd(inode->i_sb)->hidden_mnt2,
-+ hidden_flags);
-+
-+ /* dentry_open dputs the dentry if it fails */
-+ if (IS_ERR(hidden_sto_file)) {
-+ err = PTR_ERR(hidden_sto_file);
-+ /* close base file if open */
-+ if(ftohf(file)) {
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ hidden_file->f_op->flush(hidden_file, NULL);
-+#else
-+ hidden_file->f_op->flush(hidden_file);
-+#endif
-+ dput(hidden_dentry);
-+ }
-+ goto out;
-+ }
-+ ftohf2(file) = hidden_sto_file; /* link storage file */
-+
-+ out:
-+ if (err < 0 && ftopd(file)) {
-+ kfree(ftopd(file));
-+ }
-+ return err;
-+}
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_flush(file_t *file, fl_owner_t id)
-+#else
-+mini_fo_flush(file_t *file)
-+#endif
-+{
-+ int err1 = 0; /* assume ok (see open.c:close_fp) */
-+ int err2 = 0;
-+ file_t *hidden_file = NULL;
-+
-+ check_mini_fo_file(file);
-+
-+ /* mk: we don't do any state checking here, as its not worth the time.
-+ * Just flush the lower level files if they exist.
-+ */
-+ if(ftopd(file) != NULL) {
-+ if(ftohf(file) != NULL) {
-+ hidden_file = ftohf(file);
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ err1 = hidden_file->f_op->flush(hidden_file, id);
-+#else
-+ err1 = hidden_file->f_op->flush(hidden_file);
-+#endif
-+ }
-+ if(ftohf2(file) != NULL) {
-+ hidden_file = ftohf2(file);
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ err2 = hidden_file->f_op->flush(hidden_file, id);
-+#else
-+ err2 = hidden_file->f_op->flush(hidden_file);
-+#endif
-+ }
-+ }
-+ return (err1 | err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_release(inode_t *inode, file_t *file)
-+{
-+ int err = 0;
-+ file_t *hidden_file = NULL;
-+
-+ if (ftopd(file) != NULL) {
-+ if(ftohf(file)) {
-+ hidden_file = ftohf(file);
-+ fput(hidden_file);
-+ }
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ fput(hidden_file);
-+ }
-+ kfree(ftopd(file));
-+ }
-+ return err;
-+}
-+
-+STATIC int
-+mini_fo_fsync(file_t *file, dentry_t *dentry, int datasync)
-+{
-+ int err1 = 0;
-+ int err2 = 0;
-+ file_t *hidden_file = NULL;
-+ dentry_t *hidden_dentry;
-+
-+ check_mini_fo_file(file);
-+
-+ if ((hidden_file = ftohf(file)) != NULL) {
-+ hidden_dentry = dtohd(dentry);
-+ if (hidden_file->f_op && hidden_file->f_op->fsync) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ err1 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ }
-+
-+ if ((hidden_file = ftohf2(file)) != NULL) {
-+ hidden_dentry = dtohd2(dentry);
-+ if (hidden_file->f_op && hidden_file->f_op->fsync) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ err2 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ }
-+ else
-+ goto err;
-+
-+err:
-+ return (err1 || err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_fasync(int fd, file_t *file, int flag)
-+{
-+ int err1 = 0;
-+ int err2 = 0;
-+
-+ file_t *hidden_file = NULL;
-+
-+ check_mini_fo_file(file);
-+
-+ if((hidden_file = ftohf(file)) != NULL) {
-+ err1 = hidden_file->f_op->fasync(fd, hidden_file, flag);
-+ }
-+ if((hidden_file = ftohf2(file)) != NULL) {
-+ err2 = hidden_file->f_op->fasync(fd, hidden_file, flag);
-+ }
-+
-+ return (err1 || err2);
-+}
-+
-+
-+
-+struct file_operations mini_fo_dir_fops =
-+ {
-+ read: generic_read_dir,
-+ write: mini_fo_write,
-+ readdir: mini_fo_readdir,
-+ poll: mini_fo_poll,
-+ /* ioctl: mini_fo_ioctl, */
-+ mmap: mini_fo_mmap,
-+ open: mini_fo_open,
-+ flush: mini_fo_flush,
-+ release: mini_fo_release,
-+ fsync: mini_fo_fsync,
-+ fasync: mini_fo_fasync,
-+ /* not needed lock: mini_fo_lock, */
-+ /* not needed: readv */
-+ /* not needed: writev */
-+ /* not implemented: sendpage */
-+ /* not implemented: get_unmapped_area */
-+ };
-+
-+struct file_operations mini_fo_main_fops =
-+ {
-+ llseek: mini_fo_llseek,
-+ read: mini_fo_read,
-+ write: mini_fo_write,
-+ readdir: mini_fo_readdir,
-+ poll: mini_fo_poll,
-+ /* ioctl: mini_fo_ioctl, */
-+ mmap: mini_fo_mmap,
-+ open: mini_fo_open,
-+ flush: mini_fo_flush,
-+ release: mini_fo_release,
-+ fsync: mini_fo_fsync,
-+ fasync: mini_fo_fasync,
-+ /* not needed: lock: mini_fo_lock, */
-+ /* not needed: readv */
-+ /* not needed: writev */
-+ /* not implemented: sendpage */
-+ /* not implemented: get_unmapped_area */
-+ };
---- /dev/null
-+++ b/fs/mini_fo/fist.h
-@@ -0,0 +1,254 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifndef __FIST_H_
-+#define __FIST_H_
-+
-+/*
-+ * KERNEL ONLY CODE:
-+ */
-+#ifdef __KERNEL__
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33)
-+#include <generated/autoconf.h>
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
-+#include <linux/autoconf.h>
-+#else
-+#include <linux/config.h>
-+#endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+#ifdef CONFIG_MODVERSIONS
-+# define MODVERSIONS
-+# include <linux/modversions.h>
-+#endif /* CONFIG_MODVERSIONS */
-+#endif /* KERNEL_VERSION < 2.6.0 */
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/string.h>
-+#include <linux/stat.h>
-+#include <linux/errno.h>
-+#include <linux/wait.h>
-+#include <linux/limits.h>
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+#include <linux/locks.h>
-+#else
-+#include <linux/buffer_head.h>
-+#include <linux/pagemap.h>
-+#include <linux/namei.h>
-+#include <linux/module.h>
-+#include <linux/mount.h>
-+#include <linux/page-flags.h>
-+#include <linux/writeback.h>
-+#include <linux/statfs.h>
-+#endif
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/file.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <linux/poll.h>
-+#include <linux/list.h>
-+#include <linux/init.h>
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)
-+#include <linux/xattr.h>
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#include <linux/security.h>
-+#endif
-+
-+#include <linux/swap.h>
-+
-+#include <asm/system.h>
-+/* #include <asm/segment.h> */
-+#include <asm/mman.h>
-+#include <linux/seq_file.h>
-+
-+/*
-+ * MACROS:
-+ */
-+
-+/* those mapped to ATTR_* were copied from linux/fs.h */
-+#define FA_MODE ATTR_MODE
-+#define FA_UID ATTR_UID
-+#define FA_GID ATTR_GID
-+#define FA_SIZE ATTR_SIZE
-+#define FA_ATIME ATTR_ATIME
-+#define FA_MTIME ATTR_MTIME
-+#define FA_CTIME ATTR_CTIME
-+#define FA_ATIME_SET ATTR_ATIME_SET
-+#define FA_MTIME_SET ATTR_MTIME_SET
-+#define FA_FORCE ATTR_FORCE
-+#define FA_ATTR_FLAGS ATTR_ATTR_FLAG
-+
-+/* must be greater than all other ATTR_* flags! */
-+#define FA_NLINK 2048
-+#define FA_BLKSIZE 4096
-+#define FA_BLOCKS 8192
-+#define FA_TIMES (FA_ATIME|FA_MTIME|FA_CTIME)
-+#define FA_ALL 0
-+
-+/* macros to manage changes between kernels */
-+#define INODE_DATA(i) (&(i)->i_data)
-+
-+#define MIN(x,y) ((x < y) ? (x) : (y))
-+#define MAX(x,y) ((x > y) ? (x) : (y))
-+#define MAXPATHLEN PATH_MAX
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5)
-+# define lookup_one_len(a,b,c) lookup_one(a,b)
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) */
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8)
-+# define generic_file_llseek default_llseek
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8) */
-+
-+#ifndef SEEK_SET
-+# define SEEK_SET 0
-+#endif /* not SEEK_SET */
-+
-+#ifndef SEEK_CUR
-+# define SEEK_CUR 1
-+#endif /* not SEEK_CUR */
-+
-+#ifndef SEEK_END
-+# define SEEK_END 2
-+#endif /* not SEEK_END */
-+
-+#ifndef DEFAULT_POLLMASK
-+# define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)
-+#endif /* not DEFAULT_POLLMASK */
-+
-+/* XXX: fix this so fistgen generates kfree() code directly */
-+#define kfree_s(a,b) kfree(a)
-+
-+/*
-+ * TYPEDEFS:
-+ */
-+typedef struct dentry dentry_t;
-+typedef struct file file_t;
-+typedef struct inode inode_t;
-+typedef inode_t vnode_t;
-+typedef struct page page_t;
-+typedef struct qstr qstr_t;
-+typedef struct super_block super_block_t;
-+typedef super_block_t vfs_t;
-+typedef struct vm_area_struct vm_area_t;
-+
-+
-+/*
-+ * EXTERNALS:
-+ */
-+
-+#define FPPF(str,page) printk("PPF %s 0x%x/%d: Lck:%d Err:%d Ref:%d Upd:%d Other::%d:%d:%d:%d:\n", \
-+ str, \
-+ (int) page, \
-+ (int) page->index, \
-+ (PageLocked(page) ? 1 : 0), \
-+ (PageError(page) ? 1 : 0), \
-+ (PageReferenced(page) ? 1 : 0), \
-+ (Page_Uptodate(page) ? 1 : 0), \
-+ (PageDecrAfter(page) ? 1 : 0), \
-+ (PageSlab(page) ? 1 : 0), \
-+ (PageSwapCache(page) ? 1 : 0), \
-+ (PageReserved(page) ? 1 : 0) \
-+ )
-+#define EZKDBG printk("EZK %s:%d:%s\n",__FILE__,__LINE__,__FUNCTION__)
-+#if 0
-+# define EZKDBG1 printk("EZK %s:%d\n",__FILE__,__LINE__)
-+#else
-+# define EZKDBG1
-+#endif
-+
-+extern int fist_get_debug_value(void);
-+extern int fist_set_debug_value(int val);
-+#if 0 /* mini_fo doesn't need these */
-+extern void fist_dprint_internal(int level, char *str,...);
-+extern void fist_print_dentry(char *str, const dentry_t *dentry);
-+extern void fist_print_inode(char *str, const inode_t *inode);
-+extern void fist_print_file(char *str, const file_t *file);
-+extern void fist_print_buffer_flags(char *str, struct buffer_head *buffer);
-+extern void fist_print_page_flags(char *str, page_t *page);
-+extern void fist_print_page_bytes(char *str, page_t *page);
-+extern void fist_print_pte_flags(char *str, const page_t *page);
-+extern void fist_checkinode(inode_t *inode, char *msg);
-+extern void fist_print_sb(char *str, const super_block_t *sb);
-+
-+/* §$% by mk: special debug functions */
-+extern void fist_mk_print_dentry(char *str, const dentry_t *dentry);
-+extern void fist_mk_print_inode(char *str, const inode_t *inode);
-+
-+extern char *add_indent(void);
-+extern char *del_indent(void);
-+#endif/* mini_fo doesn't need these */
-+
-+
-+#define STATIC
-+#define ASSERT(EX) \
-+do { \
-+ if (!(EX)) { \
-+ printk(KERN_CRIT "ASSERTION FAILED: %s at %s:%d (%s)\n", #EX, \
-+ __FILE__, __LINE__, __FUNCTION__); \
-+ (*((char *)0))=0; \
-+ } \
-+} while (0)
-+/* same ASSERT, but tell me who was the caller of the function */
-+#define ASSERT2(EX) \
-+do { \
-+ if (!(EX)) { \
-+ printk(KERN_CRIT "ASSERTION FAILED (caller): %s at %s:%d (%s)\n", #EX, \
-+ file, line, func); \
-+ (*((char *)0))=0; \
-+ } \
-+} while (0)
-+
-+#if 0 /* mini_fo doesn't need these */
-+#define dprintk(format, args...) printk(KERN_DEBUG format, ##args)
-+#define fist_dprint(level, str, args...) fist_dprint_internal(level, KERN_DEBUG str, ## args)
-+#define print_entry_location() fist_dprint(4, "%sIN: %s %s:%d\n", add_indent(), __FUNCTION__, __FILE__, __LINE__)
-+#define print_exit_location() fist_dprint(4, "%s OUT: %s %s:%d\n", del_indent(), __FUNCTION__, __FILE__, __LINE__)
-+#define print_exit_status(status) fist_dprint(4, "%s OUT: %s %s:%d, STATUS: %d\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, status)
-+#define print_exit_pointer(status) \
-+do { \
-+ if (IS_ERR(status)) \
-+ fist_dprint(4, "%s OUT: %s %s:%d, RESULT: %ld\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, PTR_ERR(status)); \
-+ else \
-+ fist_dprint(4, "%s OUT: %s %s:%d, RESULT: 0x%x\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, PTR_ERR(status)); \
-+} while (0)
-+#endif/* mini_fo doesn't need these */
-+
-+#endif /* __KERNEL__ */
-+
-+
-+/*
-+ * DEFINITIONS FOR USER AND KERNEL CODE:
-+ * (Note: ioctl numbers 1--9 are reserved for fistgen, the rest
-+ * are auto-generated automatically based on the user's .fist file.)
-+ */
-+# define FIST_IOCTL_GET_DEBUG_VALUE _IOR(0x15, 1, int)
-+# define FIST_IOCTL_SET_DEBUG_VALUE _IOW(0x15, 2, int)
-+
-+#endif /* not __FIST_H_ */
---- /dev/null
-+++ b/fs/mini_fo/inode.c
-@@ -0,0 +1,1564 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd)
-+#else
-+mini_fo_create(inode_t *dir, dentry_t *dentry, int mode)
-+#endif
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = create_sto_reg_file(dentry, mode, nd);
-+#else
-+ err = create_sto_reg_file(dentry, mode);
-+#endif
-+ check_mini_fo_dentry(dentry);
-+ return err;
-+}
-+
-+
-+STATIC dentry_t *
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_lookup(inode_t *dir, dentry_t *dentry, struct nameidata* nd)
-+#else
-+mini_fo_lookup(inode_t *dir, dentry_t *dentry)
-+#endif
-+{
-+ int err = 0;
-+ dentry_t *hidden_dir_dentry;
-+ dentry_t *hidden_dentry = NULL;
-+
-+ dentry_t *hidden_sto_dir_dentry;
-+ dentry_t *hidden_sto_dentry = NULL;
-+
-+ /* whiteout flag */
-+ int del_flag = 0;
-+ char *bpath = NULL;
-+
-+ const char *name;
-+ unsigned int namelen;
-+
-+ /* Don't allow lookups of META-files */
-+ namelen = strlen(META_FILENAME);
-+ if(namelen == dentry->d_name.len) {
-+ if(!strncmp(dentry->d_name.name, META_FILENAME, namelen)) {
-+ err = -ENOENT;
-+ goto out;
-+ }
-+ }
-+
-+ hidden_dir_dentry = dtohd(dentry->d_parent);
-+ hidden_sto_dir_dentry = dtohd2(dentry->d_parent);
-+
-+ name = dentry->d_name.name;
-+ namelen = dentry->d_name.len;
-+
-+ /* must initialize dentry operations */
-+ dentry->d_op = &mini_fo_dops;
-+
-+ /* setup the del_flag */
-+ del_flag = __meta_check_d_entry(dir, name, namelen);
-+ bpath = __meta_check_r_entry(dir, name, namelen);
-+
-+ /* perform the lookups of base and storage files:
-+ *
-+ * This caused some serious trouble, as a lookup_one_len passing
-+ * a negative dentry oopses. Solution is to only do the lookup
-+ * if the dentry is positive, else we set it to NULL
-+ * More trouble, who said a *_dir_dentry can't be NULL?
-+ */
-+ if(bpath) {
-+ /* Cross-Interposing (C), yeah! */
-+ hidden_dentry = bpath_walk(dir->i_sb, bpath);
-+ if(!hidden_dentry || !hidden_dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo_lookup: bpath_walk failed.\n");
-+ err= -EINVAL;
-+ goto out;
-+ }
-+
-+ /* this can be set up safely without fear of spaghetti
-+ * interposing as it is only used for copying times */
-+ hidden_dir_dentry = hidden_dentry->d_parent;
-+ kfree(bpath);
-+ }
-+ else if(hidden_dir_dentry && hidden_dir_dentry->d_inode)
-+ hidden_dentry =
-+ lookup_one_len(name, hidden_dir_dentry, namelen);
-+ else
-+ hidden_dentry = NULL;
-+
-+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+ hidden_sto_dentry =
-+ lookup_one_len(name, hidden_sto_dir_dentry, namelen);
-+ else
-+ hidden_sto_dentry = NULL;
-+
-+ /* catch error in lookup */
-+ if (IS_ERR(hidden_dentry) || IS_ERR(hidden_sto_dentry)) {
-+ /* mk: we need to call dput on the dentry, whose
-+ * lookup_one_len operation failed, in order to avoid
-+ * unmount trouble.
-+ */
-+ if(IS_ERR(hidden_dentry)) {
-+ printk(KERN_CRIT "mini_fo_lookup: ERR from base dentry, lookup failed.\n");
-+ err = PTR_ERR(hidden_dentry);
-+ } else {
-+ dput(hidden_dentry);
-+ }
-+ if(IS_ERR(hidden_sto_dentry)) {
-+ printk(KERN_CRIT "mini_fo_lookup: ERR from storage dentry, lookup failed.\n");
-+ err = PTR_ERR(hidden_sto_dentry);
-+ } else {
-+ dput(hidden_sto_dentry);
-+ }
-+ goto out;
-+ }
-+
-+ /* allocate dentry private data */
-+ __dtopd(dentry) = (struct mini_fo_dentry_info *)
-+ kmalloc(sizeof(struct mini_fo_dentry_info), GFP_KERNEL);
-+
-+ if (!dtopd(dentry)) {
-+ err = -ENOMEM;
-+ goto out_dput;
-+ }
-+
-+ /* check for different states of the mini_fo file to be looked up. */
-+
-+ /* state 1, file has been modified */
-+ if(hidden_dentry && hidden_sto_dentry &&
-+ hidden_dentry->d_inode && hidden_sto_dentry->d_inode && !del_flag) {
-+
-+ /* update parent directory's atime */
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = MODIFIED;
-+ dtohd(dentry) = hidden_dentry;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ err = mini_fo_tri_interpose(hidden_dentry,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state1).\n");
-+ goto out_free;
-+ }
-+ goto out;
-+ }
-+ /* state 2, file is unmodified */
-+ if(hidden_dentry && hidden_dentry->d_inode && !del_flag) {
-+
-+ fist_copy_attr_atime(dir, hidden_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = UNMODIFIED;
-+ dtohd(dentry) = hidden_dentry;
-+ dtohd2(dentry) = hidden_sto_dentry; /* could be negative */
-+
-+ err = mini_fo_tri_interpose(hidden_dentry,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state2).\n");
-+ goto out_free;
-+ }
-+ goto out;
-+ }
-+ /* state 3, file has been newly created */
-+ if(hidden_sto_dentry && hidden_sto_dentry->d_inode && !del_flag) {
-+
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+ dtopd(dentry)->state = CREATED;
-+ dtohd(dentry) = hidden_dentry; /* could be negative */
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ err = mini_fo_tri_interpose(hidden_dentry,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state3).\n");
-+ goto out_free;
-+ }
-+ goto out;
-+ }
-+
-+ /* state 4, file has deleted and created again. */
-+ if(hidden_dentry && hidden_sto_dentry &&
-+ hidden_dentry->d_inode &&
-+ hidden_sto_dentry->d_inode && del_flag) {
-+
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+ dtopd(dentry)->state = DEL_REWRITTEN;
-+ dtohd(dentry) = NULL;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ err = mini_fo_tri_interpose(NULL,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state4).\n");
-+ goto out_free;
-+ }
-+ /* We will never need this dentry again, as the file has been
-+ * deleted from base */
-+ dput(hidden_dentry);
-+ goto out;
-+ }
-+ /* state 5, file has been deleted in base */
-+ if(hidden_dentry && hidden_sto_dentry &&
-+ hidden_dentry->d_inode &&
-+ !hidden_sto_dentry->d_inode && del_flag) {
-+
-+ /* check which parents atime we need for updating */
-+ if(hidden_sto_dir_dentry->d_inode)
-+ fist_copy_attr_atime(dir,
-+ hidden_sto_dir_dentry->d_inode);
-+ else
-+ fist_copy_attr_atime(dir,
-+ hidden_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = DELETED;
-+ dtohd(dentry) = NULL;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ /* add negative dentry to dcache to speed up lookups */
-+ d_add(dentry, NULL);
-+ dput(hidden_dentry);
-+ goto out;
-+ }
-+ /* state 6, file does not exist */
-+ if(((hidden_dentry && !hidden_dentry->d_inode) ||
-+ (hidden_sto_dentry && !hidden_sto_dentry->d_inode)) && !del_flag)
-+ {
-+ /* check which parents atime we need for updating */
-+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+ else
-+ fist_copy_attr_atime(dir, hidden_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = NON_EXISTANT;
-+ dtohd(dentry) = hidden_dentry;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+ d_add(dentry, NULL);
-+ goto out;
-+ }
-+
-+ /* if we get to here, were in an invalid state. bad. */
-+ printk(KERN_CRIT "mini_fo_lookup: ERROR, meta data corruption detected.\n");
-+
-+ /* end state checking */
-+ out_free:
-+ d_drop(dentry); /* so that our bad dentry will get destroyed */
-+ kfree(dtopd(dentry));
-+ __dtopd(dentry) = NULL; /* be safe */
-+
-+ out_dput:
-+ if(hidden_dentry)
-+ dput(hidden_dentry);
-+ if(hidden_sto_dentry)
-+ dput(hidden_sto_dentry); /* drops usage count and marks for release */
-+
-+ out:
-+ /* initalize wol if file exists and is directory */
-+ if(dentry->d_inode) {
-+ if(S_ISDIR(dentry->d_inode->i_mode)) {
-+ itopd(dentry->d_inode)->deleted_list_size = -1;
-+ itopd(dentry->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(dentry);
-+ }
-+ }
-+ return ERR_PTR(err);
-+}
-+
-+
-+STATIC int
-+mini_fo_link(dentry_t *old_dentry, inode_t *dir, dentry_t *new_dentry)
-+{
-+ int err;
-+ dentry_t *hidden_old_dentry;
-+ dentry_t *hidden_new_dentry;
-+ dentry_t *hidden_dir_dentry;
-+
-+
-+ check_mini_fo_dentry(old_dentry);
-+ check_mini_fo_dentry(new_dentry);
-+ check_mini_fo_inode(dir);
-+
-+ /* no links to directorys and existing targets target allowed */
-+ if(S_ISDIR(old_dentry->d_inode->i_mode) ||
-+ is_mini_fo_existant(new_dentry)) {
-+ err = -EPERM;
-+ goto out;
-+ }
-+
-+ /* bring it directly from unmod to del_rew */
-+ if(dtost(old_dentry) == UNMODIFIED) {
-+ err = nondir_unmod_to_mod(old_dentry, 1);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ err = meta_add_d_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ dput(dtohd(old_dentry));
-+ dtohd(old_dentry) = NULL;
-+ dtost(old_dentry) = DEL_REWRITTEN;
-+ }
-+
-+ err = get_neg_sto_dentry(new_dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ hidden_old_dentry = dtohd2(old_dentry);
-+ hidden_new_dentry = dtohd2(new_dentry);
-+
-+ dget(hidden_old_dentry);
-+ dget(hidden_new_dentry);
-+
-+ /* was: hidden_dir_dentry = lock_parent(hidden_new_dentry); */
-+ hidden_dir_dentry = dget(hidden_new_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = vfs_link(hidden_old_dentry,
-+ hidden_dir_dentry->d_inode,
-+ hidden_new_dentry);
-+ if (err || !hidden_new_dentry->d_inode)
-+ goto out_lock;
-+
-+ dtost(new_dentry) = CREATED;
-+ err = mini_fo_tri_interpose(NULL, hidden_new_dentry, new_dentry, dir->i_sb, 0);
-+ if (err)
-+ goto out_lock;
-+
-+ fist_copy_attr_timesizes(dir, hidden_new_dentry->d_inode);
-+ /* propagate number of hard-links */
-+ old_dentry->d_inode->i_nlink = itohi2(old_dentry->d_inode)->i_nlink;
-+
-+ out_lock:
-+ /* was: unlock_dir(hidden_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_dir_dentry);
-+
-+ dput(hidden_new_dentry);
-+ dput(hidden_old_dentry);
-+ if (!new_dentry->d_inode)
-+ d_drop(new_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_unlink(inode_t *dir, dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ dget(dentry);
-+ if(dtopd(dentry)->state == MODIFIED) {
-+ err = nondir_mod_to_del(dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == UNMODIFIED) {
-+ err = nondir_unmod_to_del(dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == CREATED) {
-+ err = nondir_creat_to_del(dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == DEL_REWRITTEN) {
-+ err = nondir_del_rew_to_del(dentry);
-+ goto out;
-+ }
-+
-+ printk(KERN_CRIT "mini_fo_unlink: ERROR, invalid state detected.\n");
-+
-+ out:
-+ fist_copy_attr_times(dir, itohi2(dentry->d_parent->d_inode));
-+
-+ if(!err) {
-+ /* is this causing my pain? d_delete(dentry); */
-+ d_drop(dentry);
-+ }
-+
-+ dput(dentry);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_symlink(inode_t *dir, dentry_t *dentry, const char *symname)
-+{
-+ int err=0;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ umode_t mode;
-+#endif
-+
-+ /* Fail if the symlink file exists */
-+ if(!(dtost(dentry) == DELETED ||
-+ dtost(dentry) == NON_EXISTANT)) {
-+ err = -EEXIST;
-+ goto out;
-+ }
-+
-+ err = get_neg_sto_dentry(dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ dget(hidden_sto_dentry);
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ mode = S_IALLUGO;
-+ err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry, symname, mode);
-+#else
-+ err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ symname);
-+#endif
-+ if (err || !hidden_sto_dentry->d_inode)
-+ goto out_lock;
-+
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ } else if(dtost(dentry) == NON_EXISTANT) {
-+ dtost(dentry) = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ dput(hidden_sto_dentry);
-+ if (!dentry->d_inode)
-+ d_drop(dentry);
-+ out:
-+ return err;
-+}
-+
-+STATIC int
-+mini_fo_mkdir(inode_t *dir, dentry_t *dentry, int mode)
-+{
-+ int err;
-+
-+ err = create_sto_dir(dentry, mode);
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_rmdir(inode_t *dir, dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+ dentry_t *meta_dentry;
-+ inode_t *hidden_sto_dir = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+ check_mini_fo_inode(dir);
-+
-+ dget(dentry);
-+ if(dtopd(dentry)->state == MODIFIED) {
-+ /* XXX: disabled, because it does not bother to check files on
-+ * the original filesystem - just a hack, but better than simply
-+ * removing it without testing */
-+ err = -EINVAL;
-+ goto out;
-+
-+ hidden_sto_dir = itohi2(dir);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was:hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* Delete an old WOL file contained in the storage dir */
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ hidden_sto_dentry,
-+ strlen(META_FILENAME));
-+ if(meta_dentry->d_inode) {
-+ err = vfs_unlink(hidden_sto_dentry->d_inode, meta_dentry);
-+ dput(meta_dentry);
-+ if(!err)
-+ d_delete(meta_dentry);
-+ }
-+
-+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+ dput(dtohd(dentry));
-+
-+ dtohd(dentry) = NULL;
-+ dtopd(dentry)->state = DELETED;
-+
-+ /* carefull with R files */
-+ if( __meta_is_r_entry(dir,
-+ dentry->d_name.name,
-+ dentry->d_name.len) == 1) {
-+ err = meta_remove_r_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: rmdir: meta_remove_r_entry failed.\n");
-+ goto out;
-+ }
-+ }
-+ else {
-+ /* ok, add deleted file to META */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+ }
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == UNMODIFIED) {
-+ /* XXX: simply adding it to the delete list here is fscking dangerous!
-+ * as a temporary hack, i will disable rmdir on unmodified directories
-+ * for now.
-+ */
-+ err = -EINVAL;
-+ goto out;
-+
-+ err = get_neg_sto_dentry(dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* dput base dentry, this will relase the inode and free the
-+ * dentry, as we will never need it again. */
-+ dput(dtohd(dentry));
-+ dtohd(dentry) = NULL;
-+ dtopd(dentry)->state = DELETED;
-+
-+ /* add deleted file to META-file */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == CREATED) {
-+ hidden_sto_dir = itohi2(dir);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* Delete an old WOL file contained in the storage dir */
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ hidden_sto_dentry,
-+ strlen(META_FILENAME));
-+ if(meta_dentry->d_inode) {
-+ /* is this necessary? dget(meta_dentry); */
-+ err = vfs_unlink(hidden_sto_dentry->d_inode,
-+ meta_dentry);
-+ dput(meta_dentry);
-+ if(!err)
-+ d_delete(meta_dentry);
-+ }
-+
-+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+ dtopd(dentry)->state = NON_EXISTANT;
-+
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == DEL_REWRITTEN) {
-+ hidden_sto_dir = itohi2(dir);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* Delete an old WOL file contained in the storage dir */
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ hidden_sto_dentry,
-+ strlen(META_FILENAME));
-+ if(meta_dentry->d_inode) {
-+ /* is this necessary? dget(meta_dentry); */
-+ err = vfs_unlink(hidden_sto_dentry->d_inode,
-+ meta_dentry);
-+ dput(meta_dentry);
-+ if(!err)
-+ d_delete(meta_dentry);
-+ }
-+
-+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+ dtopd(dentry)->state = DELETED;
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ goto out;
-+ }
-+
-+ printk(KERN_CRIT "mini_fo_rmdir: ERROR, invalid state detected.\n");
-+
-+ out:
-+ if(!err) {
-+ d_drop(dentry);
-+ }
-+
-+ fist_copy_attr_times(dir, itohi2(dentry->d_parent->d_inode));
-+ dput(dentry);
-+
-+ return err;
-+}
-+
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_mknod(inode_t *dir, dentry_t *dentry, int mode, dev_t dev)
-+#else
-+mini_fo_mknod(inode_t *dir, dentry_t *dentry, int mode, int dev)
-+#endif
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ err = create_sto_nod(dentry, mode, dev);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo_mknod: creating sto nod failed.\n");
-+ err = -EINVAL;
-+ }
-+
-+ check_mini_fo_dentry(dentry);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_rename(inode_t *old_dir, dentry_t *old_dentry,
-+ inode_t *new_dir, dentry_t *new_dentry)
-+{
-+ /* dispatch */
-+ if(S_ISDIR(old_dentry->d_inode->i_mode))
-+ return rename_directory(old_dir, old_dentry, new_dir, new_dentry);
-+ return rename_nondir(old_dir, old_dentry, new_dir, new_dentry);
-+
-+}
-+
-+int rename_directory(inode_t *old_dir, dentry_t *old_dentry,
-+ inode_t *new_dir, dentry_t *new_dentry)
-+{
-+ int err, bpath_len;
-+ char *bpath;
-+
-+ dentry_t *hidden_old_dentry;
-+ dentry_t *hidden_new_dentry;
-+ dentry_t *hidden_old_dir_dentry;
-+ dentry_t *hidden_new_dir_dentry;
-+
-+ err = 0;
-+ bpath = NULL;
-+ bpath_len = 0;
-+
-+ /* this is a test, chuck out if it works */
-+ if(!(dtopd(new_dentry)->state == DELETED ||
-+ dtopd(new_dentry)->state == NON_EXISTANT)) {
-+ printk(KERN_CRIT "mini_fo: rename_directory: \
-+ uh, ah, new_dentry not negative.\n");
-+ /* return -1; */
-+ }
-+
-+ /* state = UNMODIFIED */
-+ if(dtopd(old_dentry)->state == UNMODIFIED) {
-+ err = dir_unmod_to_mod(old_dentry);
-+ if (err)
-+ goto out;
-+ }
-+
-+ /* state = MODIFIED */
-+ if(dtopd(old_dentry)->state == MODIFIED) {
-+ bpath = meta_check_r_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if(bpath) {
-+ err = meta_remove_r_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: rename_directory:\
-+ meta_remove_r_entry \
-+ failed.\n");
-+ goto out;
-+ }
-+ err = meta_add_r_entry(new_dentry->d_parent,
-+ bpath,
-+ strlen(bpath),
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+ kfree(bpath);
-+ }
-+ else {/* wol it */
-+ err = meta_add_d_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if (err)
-+ goto out;
-+ /* put it on rename list */
-+ err = get_mini_fo_bpath(old_dentry,
-+ &bpath,
-+ &bpath_len);
-+ if (err)
-+ goto out;
-+ err = meta_add_r_entry(new_dentry->d_parent,
-+ bpath, bpath_len,
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+ if (err)
-+ goto out;
-+ }
-+ /* no state change, MODIFIED stays MODIFIED */
-+ }
-+ /* state = CREATED */
-+ if(dtopd(old_dentry)->state == CREATED ||
-+ dtopd(old_dentry)->state == DEL_REWRITTEN) {
-+ if(dtohd(old_dentry))
-+ dput(dtohd(old_dentry));
-+
-+ if(dtopd(new_dentry)->state == DELETED) {
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ dtohd(old_dentry) = NULL;
-+ }
-+ else if(dtopd(new_dentry)->state == NON_EXISTANT) {
-+ dtopd(old_dentry)->state = CREATED;
-+ /* steal new dentry's neg. base dentry */
-+ dtohd(old_dentry) = dtohd(new_dentry);
-+ dtohd(new_dentry) = NULL;
-+ }
-+ }
-+ if(dtopd(new_dentry)->state == UNMODIFIED ||
-+ dtopd(new_dentry)->state == NON_EXISTANT) {
-+ err = get_neg_sto_dentry(new_dentry);
-+ if(err)
-+ goto out;
-+ }
-+
-+ /* now move sto file */
-+ hidden_old_dentry = dtohd2(old_dentry);
-+ hidden_new_dentry = dtohd2(new_dentry);
-+
-+ dget(hidden_old_dentry);
-+ dget(hidden_new_dentry);
-+
-+ hidden_old_dir_dentry = dget(hidden_old_dentry->d_parent);
-+ hidden_new_dir_dentry = dget(hidden_new_dentry->d_parent);
-+ double_lock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+
-+ err = vfs_rename(hidden_old_dir_dentry->d_inode, hidden_old_dentry,
-+ hidden_new_dir_dentry->d_inode, hidden_new_dentry);
-+ if(err)
-+ goto out_lock;
-+
-+ fist_copy_attr_all(new_dir, hidden_new_dir_dentry->d_inode);
-+ if (new_dir != old_dir)
-+ fist_copy_attr_all(old_dir,
-+ hidden_old_dir_dentry->d_inode);
-+
-+ out_lock:
-+ /* double_unlock will dput the new/old parent dentries
-+ * whose refcnts were incremented via get_parent above. */
-+ double_unlock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+ dput(hidden_new_dentry);
-+ dput(hidden_old_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+int rename_nondir(inode_t *old_dir, dentry_t *old_dentry,
-+ inode_t *new_dir, dentry_t *new_dentry)
-+{
-+ int err=0;
-+
-+ check_mini_fo_dentry(old_dentry);
-+ check_mini_fo_dentry(new_dentry);
-+ check_mini_fo_inode(old_dir);
-+ check_mini_fo_inode(new_dir);
-+
-+ /* state: UNMODIFIED */
-+ if(dtost(old_dentry) == UNMODIFIED) {
-+ err = nondir_unmod_to_mod(old_dentry, 1);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ }
-+
-+ /* the easy states */
-+ if(exists_in_storage(old_dentry)) {
-+
-+ dentry_t *hidden_old_dentry;
-+ dentry_t *hidden_new_dentry;
-+ dentry_t *hidden_old_dir_dentry;
-+ dentry_t *hidden_new_dir_dentry;
-+
-+ /* if old file is MODIFIED, add it to the deleted_list */
-+ if(dtopd(old_dentry)->state == MODIFIED) {
-+ meta_add_d_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+
-+ dput(dtohd(old_dentry));
-+ }
-+ /* if old file is CREATED, we only release the base dentry */
-+ if(dtopd(old_dentry)->state == CREATED) {
-+ if(dtohd(old_dentry))
-+ dput(dtohd(old_dentry));
-+ }
-+
-+ /* now setup the new states (depends on new_dentry state) */
-+ /* new dentry state = MODIFIED */
-+ if(dtopd(new_dentry)->state == MODIFIED) {
-+ meta_add_d_entry(new_dentry->d_parent,
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+
-+ /* new dentry will be d_put'ed later by the vfs
-+ * so don't do it here
-+ * dput(dtohd(new_dentry));
-+ */
-+ dtohd(old_dentry) = NULL;
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ }
-+ /* new dentry state = UNMODIFIED */
-+ else if(dtopd(new_dentry)->state == UNMODIFIED) {
-+ if(get_neg_sto_dentry(new_dentry))
-+ return -EINVAL;
-+
-+ meta_add_d_entry(new_dentry->d_parent,
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+
-+ /* is this right??? */
-+ /*dput(dtohd(new_dentry));*/
-+ dtohd(old_dentry) = NULL;
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ }
-+ /* new dentry state = CREATED */
-+ else if(dtopd(new_dentry)->state == CREATED) {
-+ /* we keep the neg. base dentry (if exists) */
-+ dtohd(old_dentry) = dtohd(new_dentry);
-+ /* ...and set it to Null, or we'll get
-+ * dcache.c:345 if it gets dput twice... */
-+ dtohd(new_dentry) = NULL;
-+ dtopd(old_dentry)->state = CREATED;
-+ }
-+ /* new dentry state = NON_EXISTANT */
-+ else if(dtopd(new_dentry)->state == NON_EXISTANT) {
-+ if(get_neg_sto_dentry(new_dentry))
-+ return -EINVAL;
-+
-+ /* we keep the neg. base dentry (if exists) */
-+ dtohd(old_dentry) = dtohd(new_dentry);
-+ /* ...and set it to Null, or we'll get
-+ * Dr. dcache.c:345 if it gets dput twice... */
-+ dtohd(new_dentry) = NULL;
-+ dtopd(old_dentry)->state = CREATED;
-+ }
-+ /* new dentry state = DEL_REWRITTEN or DELETED */
-+ else if(dtopd(new_dentry)->state == DEL_REWRITTEN ||
-+ dtopd(new_dentry)->state == DELETED) {
-+ dtohd(old_dentry) = NULL;
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ }
-+ else { /* not possible, uhh, ahh */
-+ printk(KERN_CRIT
-+ "mini_fo: rename_reg_file: invalid state detected [1].\n");
-+ return -1;
-+ }
-+
-+ /* now we definitely have a sto file */
-+ hidden_old_dentry = dtohd2(old_dentry);
-+ hidden_new_dentry = dtohd2(new_dentry);
-+
-+ dget(hidden_old_dentry);
-+ dget(hidden_new_dentry);
-+
-+ hidden_old_dir_dentry = dget(hidden_old_dentry->d_parent);
-+ hidden_new_dir_dentry = dget(hidden_new_dentry->d_parent);
-+ double_lock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+
-+ err = vfs_rename(hidden_old_dir_dentry->d_inode,
-+ hidden_old_dentry,
-+ hidden_new_dir_dentry->d_inode,
-+ hidden_new_dentry);
-+ if(err)
-+ goto out_lock;
-+
-+ fist_copy_attr_all(new_dir, hidden_new_dir_dentry->d_inode);
-+ if (new_dir != old_dir)
-+ fist_copy_attr_all(old_dir, hidden_old_dir_dentry->d_inode);
-+
-+ out_lock:
-+ /* double_unlock will dput the new/old parent dentries
-+ * whose refcnts were incremented via get_parent above.
-+ */
-+ double_unlock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+ dput(hidden_new_dentry);
-+ dput(hidden_old_dentry);
-+ out:
-+ return err;
-+ }
-+ else { /* invalid state */
-+ printk(KERN_CRIT "mini_fo: rename_reg_file: ERROR: invalid state detected [2].\n");
-+ return -1;
-+ }
-+}
-+
-+
-+STATIC int
-+mini_fo_readlink(dentry_t *dentry, char *buf, int bufsiz)
-+{
-+ int err=0;
-+ dentry_t *hidden_dentry = NULL;
-+
-+ if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+ hidden_dentry = dtohd2(dentry);
-+ } else if(dtohd(dentry) && dtohd(dentry)->d_inode) {
-+ hidden_dentry = dtohd(dentry);
-+ } else {
-+ goto out;
-+ }
-+
-+ if (!hidden_dentry->d_inode->i_op ||
-+ !hidden_dentry->d_inode->i_op->readlink) {
-+ err = -EINVAL; goto out;
-+ }
-+
-+ err = hidden_dentry->d_inode->i_op->readlink(hidden_dentry,
-+ buf,
-+ bufsiz);
-+ if (err > 0)
-+ fist_copy_attr_atime(dentry->d_inode, hidden_dentry->d_inode);
-+
-+ out:
-+ return err;
-+}
-+
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+static int mini_fo_follow_link(dentry_t *dentry, struct nameidata *nd)
-+#else
-+static void* mini_fo_follow_link(dentry_t *dentry, struct nameidata *nd)
-+#endif
-+{
-+ char *buf;
-+ int len = PAGE_SIZE, err;
-+ mm_segment_t old_fs;
-+
-+ /* in 2.6 this is freed by mini_fo_put_link called by __do_follow_link */
-+ buf = kmalloc(len, GFP_KERNEL);
-+ if (!buf) {
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+
-+ /* read the symlink, and then we will follow it */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+ err = dentry->d_inode->i_op->readlink(dentry, buf, len);
-+ set_fs(old_fs);
-+ if (err < 0) {
-+ kfree(buf);
-+ buf = NULL;
-+ goto out;
-+ }
-+ buf[err] = 0;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ nd_set_link(nd, buf);
-+ err = 0;
-+#else
-+ err = vfs_follow_link(nd, buf);
-+#endif
-+
-+ out:
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ kfree(buf);
-+#endif
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+ return err;
-+#else
-+ return ERR_PTR(err);
-+#endif
-+}
-+
-+STATIC
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+void mini_fo_put_link(struct dentry *dentry, struct nameidata *nd)
-+#else
-+void mini_fo_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
-+#endif
-+{
-+ char *link;
-+ link = nd_get_link(nd);
-+ kfree(link);
-+}
-+#endif
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_permission(inode_t *inode, int mask, struct nameidata *nd)
-+#else
-+mini_fo_permission(inode_t *inode, int mask)
-+#endif
-+{
-+ inode_t *hidden_inode;
-+ int mode;
-+ int err;
-+
-+ if(itohi2(inode)) {
-+ hidden_inode = itohi2(inode);
-+ } else {
-+ hidden_inode = itohi(inode);
-+ }
-+ mode = inode->i_mode;
-+
-+ /* not really needed, as permission handles everything:
-+ * err = vfs_permission(inode, mask);
-+ * if (err)
-+ * goto out;
-+ */
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = permission(hidden_inode, mask, nd);
-+#else
-+ err = permission(hidden_inode, mask);
-+#endif
-+
-+ /* out: */
-+ return err;
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+STATIC int
-+mini_fo_inode_revalidate(dentry_t *dentry)
-+{
-+ int err = 0;
-+ dentry_t *hidden_dentry;
-+ inode_t *hidden_inode;
-+
-+ ASSERT(dentry->d_inode);
-+ ASSERT(itopd(dentry->d_inode));
-+
-+ if(itohi2(dentry->d_inode)) {
-+ hidden_dentry = dtohd2(dentry);
-+ hidden_inode = hidden_dentry->d_inode;
-+ } else if(itohi(dentry->d_inode)) {
-+ hidden_dentry = dtohd(dentry);
-+ hidden_inode = hidden_dentry->d_inode;
-+ } else {
-+ printk(KERN_CRIT "mini_fo_inode_revalidate: ERROR, invalid state detected.\n");
-+ err = -ENOENT;
-+ goto out;
-+ }
-+ if (hidden_inode && hidden_inode->i_op && hidden_inode->i_op->revalidate){
-+ err = hidden_inode->i_op->revalidate(hidden_dentry);
-+ if (err)
-+ goto out;
-+ }
-+ fist_copy_attr_all(dentry->d_inode, hidden_inode);
-+ out:
-+ return err;
-+}
-+#endif
-+
-+STATIC int
-+mini_fo_setattr(dentry_t *dentry, struct iattr *ia)
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(!is_mini_fo_existant(dentry)) {
-+ printk(KERN_CRIT "mini_fo_setattr: ERROR, invalid state detected [1].\n");
-+ goto out;
-+ }
-+
-+ if(dtost(dentry) == UNMODIFIED) {
-+ if(!IS_COPY_FLAG(ia->ia_valid))
-+ goto out; /* we ignore these changes to base */
-+
-+ if(S_ISDIR(dentry->d_inode->i_mode)) {
-+ err = dir_unmod_to_mod(dentry);
-+ } else {
-+ /* we copy contents if file is not beeing truncated */
-+ if(S_ISREG(dentry->d_inode->i_mode) &&
-+ !(ia->ia_size == 0 && (ia->ia_valid & ATTR_SIZE))) {
-+ err = nondir_unmod_to_mod(dentry, 1);
-+ } else
-+ err = nondir_unmod_to_mod(dentry, 0);
-+ }
-+ if(err) {
-+ err = -EINVAL;
-+ printk(KERN_CRIT "mini_fo_setattr: ERROR changing states.\n");
-+ goto out;
-+ }
-+ }
-+ if(!exists_in_storage(dentry)) {
-+ printk(KERN_CRIT "mini_fo_setattr: ERROR, invalid state detected [2].\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ ASSERT(dentry->d_inode);
-+ ASSERT(dtohd2(dentry));
-+ ASSERT(itopd(dentry->d_inode));
-+ ASSERT(itohi2(dentry->d_inode));
-+
-+ err = notify_change(dtohd2(dentry), ia);
-+ fist_copy_attr_all(dentry->d_inode, itohi2(dentry->d_inode));
-+ out:
-+ return err;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+STATIC int
-+mini_fo_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
-+{
-+ int err = 0;
-+ dentry_t *hidden_dentry;
-+
-+ ASSERT(dentry->d_inode);
-+ ASSERT(itopd(dentry->d_inode));
-+
-+ if(itohi2(dentry->d_inode)) {
-+ hidden_dentry = dtohd2(dentry);
-+ } else if(itohi(dentry->d_inode)) {
-+ hidden_dentry = dtohd(dentry);
-+ } else {
-+ printk(KERN_CRIT "mini_fo_getattr: ERROR, invalid state detected.\n");
-+ err = -ENOENT;
-+ goto out;
-+ }
-+ fist_copy_attr_all(dentry->d_inode, hidden_dentry->d_inode);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ generic_fillattr(dentry->d_inode, stat);
-+ if (!stat->blksize) {
-+ struct super_block *s = hidden_dentry->d_inode->i_sb;
-+ unsigned blocks;
-+ blocks = (stat->size+s->s_blocksize-1) >> s->s_blocksize_bits;
-+ stat->blocks = (s->s_blocksize / 512) * blocks;
-+ stat->blksize = s->s_blocksize;
-+ }
-+ out:
-+ return err;
-+}
-+#endif
-+
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+#if 0 /* no xattr_alloc() and xattr_free() */
-+/* This is lifted from fs/xattr.c */
-+static void *
-+xattr_alloc(size_t size, size_t limit)
-+{
-+ void *ptr;
-+
-+ if (size > limit)
-+ return ERR_PTR(-E2BIG);
-+
-+ if (!size) /* size request, no buffer is needed */
-+ return NULL;
-+ else if (size <= PAGE_SIZE)
-+ ptr = kmalloc((unsigned long) size, GFP_KERNEL);
-+ else
-+ ptr = vmalloc((unsigned long) size);
-+ if (!ptr)
-+ return ERR_PTR(-ENOMEM);
-+ return ptr;
-+}
-+
-+static void
-+xattr_free(void *ptr, size_t size)
-+{
-+ if (!size) /* size request, no buffer was needed */
-+ return;
-+ else if (size <= PAGE_SIZE)
-+ kfree(ptr);
-+ else
-+ vfree(ptr);
-+}
-+#endif /* no xattr_alloc() and xattr_free() */
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_getxattr(struct dentry *dentry, const char *name, void *value, size_t size) {
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+ /* Define these anyway so we don't need as much ifdef'ed code. */
-+ char *encoded_name = NULL;
-+ char *encoded_value = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->getxattr) {
-+ encoded_name = (char *)name;
-+ encoded_value = (char *)value;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->getxattr(hidden_dentry, encoded_name, encoded_value, size);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21) \
-+ && LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,23)) \
-+ || LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
-+mini_fo_setxattr(struct dentry *dentry, const char *name,
-+ const void *value, size_t size, int flags)
-+#else
-+mini_fo_setxattr(struct dentry *dentry, const char *name,
-+ void *value, size_t size, int flags)
-+#endif
-+
-+{
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+
-+ /* Define these anyway, so we don't have as much ifdef'ed code. */
-+ char *encoded_value = NULL;
-+ char *encoded_name = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->setxattr) {
-+ encoded_name = (char *)name;
-+ encoded_value = (char *)value;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->setxattr(hidden_dentry, encoded_name, encoded_value, size, flags);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_removexattr(struct dentry *dentry, const char *name) {
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+ char *encoded_name;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->removexattr) {
-+ encoded_name = (char *)name;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->removexattr(hidden_dentry, encoded_name);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_listxattr(struct dentry *dentry, char *list, size_t size) {
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+ char *encoded_list = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->listxattr) {
-+ encoded_list = list;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->listxattr(hidden_dentry, encoded_list, size);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+# endif /* defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) */
-+
-+struct inode_operations mini_fo_symlink_iops =
-+ {
-+ readlink: mini_fo_readlink,
-+ follow_link: mini_fo_follow_link,
-+ /* mk: permission: mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ revalidate: mini_fo_inode_revalidate,
-+#endif
-+ setattr: mini_fo_setattr,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ getattr: mini_fo_getattr,
-+ put_link: mini_fo_put_link,
-+#endif
-+
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+ setxattr: mini_fo_setxattr,
-+ getxattr: mini_fo_getxattr,
-+ listxattr: mini_fo_listxattr,
-+ removexattr: mini_fo_removexattr
-+# endif /* defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) */
-+ };
-+
-+struct inode_operations mini_fo_dir_iops =
-+ {
-+ create: mini_fo_create,
-+ lookup: mini_fo_lookup,
-+ link: mini_fo_link,
-+ unlink: mini_fo_unlink,
-+ symlink: mini_fo_symlink,
-+ mkdir: mini_fo_mkdir,
-+ rmdir: mini_fo_rmdir,
-+ mknod: mini_fo_mknod,
-+ rename: mini_fo_rename,
-+ /* no readlink/follow_link for non-symlinks */
-+ // off because we have setattr
-+ // truncate: mini_fo_truncate,
-+ /* mk:permission: mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ revalidate: mini_fo_inode_revalidate,
-+#endif
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ getattr: mini_fo_getattr,
-+#endif
-+ setattr: mini_fo_setattr,
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+ setxattr: mini_fo_setxattr,
-+ getxattr: mini_fo_getxattr,
-+ listxattr: mini_fo_listxattr,
-+ removexattr: mini_fo_removexattr
-+# endif /* XATTR && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) */
-+ };
-+
-+struct inode_operations mini_fo_main_iops =
-+ {
-+ /* permission: mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ revalidate: mini_fo_inode_revalidate,
-+#endif
-+ setattr: mini_fo_setattr,
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ getattr: mini_fo_getattr,
-+#endif
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+ setxattr: mini_fo_setxattr,
-+ getxattr: mini_fo_getxattr,
-+ listxattr: mini_fo_listxattr,
-+ removexattr: mini_fo_removexattr
-+# endif /* XATTR && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) */
-+ };
---- /dev/null
-+++ b/fs/mini_fo/main.c
-@@ -0,0 +1,423 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+#include <linux/module.h>
-+
-+/* This definition must only appear after we include <linux/module.h> */
-+#ifndef MODULE_LICENSE
-+# define MODULE_LICENSE(bison)
-+#endif /* not MODULE_LICENSE */
-+
-+/*
-+ * This is the mini_fo tri interpose function, which extends the
-+ * functionality of the regular interpose by interposing a higher
-+ * level inode on top of two lower level ones: the base filesystem
-+ * inode and the storage filesystem inode.
-+ *
-+ * sb we pass is mini_fo's super_block
-+ */
-+int
-+mini_fo_tri_interpose(dentry_t *hidden_dentry,
-+ dentry_t *hidden_sto_dentry,
-+ dentry_t *dentry, super_block_t *sb, int flag)
-+{
-+ inode_t *hidden_inode = NULL;
-+ inode_t *hidden_sto_inode = NULL; /* store corresponding storage inode */
-+ int err = 0;
-+ inode_t *inode;
-+
-+ /* Pointer to hidden_sto_inode if exists, else to hidden_inode.
-+ * This is used to copy the attributes of the correct inode. */
-+ inode_t *master_inode;
-+
-+ if(hidden_dentry)
-+ hidden_inode = hidden_dentry->d_inode;
-+ if(hidden_sto_dentry)
-+ hidden_sto_inode = hidden_sto_dentry->d_inode;
-+
-+ ASSERT(dentry->d_inode == NULL);
-+
-+ /* mk: One of the inodes associated with the dentrys is likely to
-+ * be NULL, so carefull:
-+ */
-+ ASSERT((hidden_inode != NULL) || (hidden_sto_inode != NULL));
-+
-+ if(hidden_sto_inode)
-+ master_inode = hidden_sto_inode;
-+ else
-+ master_inode = hidden_inode;
-+
-+ /*
-+ * We allocate our new inode below, by calling iget.
-+ * iget will call our read_inode which will initialize some
-+ * of the new inode's fields
-+ */
-+
-+ /*
-+ * original: inode = iget(sb, hidden_inode->i_ino);
-+ */
-+ inode = iget(sb, iunique(sb, 25));
-+ if (!inode) {
-+ err = -EACCES; /* should be impossible??? */
-+ goto out;
-+ }
-+
-+ /*
-+ * interpose the inode if not already interposed
-+ * this is possible if the inode is being reused
-+ * XXX: what happens if we get_empty_inode() but there's another already?
-+ * for now, ASSERT() that this can't happen; fix later.
-+ */
-+ if (itohi(inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo_tri_interpose: itohi(inode) != NULL.\n");
-+ }
-+ if (itohi2(inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo_tri_interpose: itohi2(inode) != NULL.\n");
-+ }
-+
-+ /* mk: Carefull, igrab can't handle NULL inodes (ok, why should it?), so
-+ * we need to check here:
-+ */
-+ if(hidden_inode)
-+ itohi(inode) = igrab(hidden_inode);
-+ else
-+ itohi(inode) = NULL;
-+
-+ if(hidden_sto_inode)
-+ itohi2(inode) = igrab(hidden_sto_inode);
-+ else
-+ itohi2(inode) = NULL;
-+
-+
-+ /* Use different set of inode ops for symlinks & directories*/
-+ if (S_ISLNK(master_inode->i_mode))
-+ inode->i_op = &mini_fo_symlink_iops;
-+ else if (S_ISDIR(master_inode->i_mode))
-+ inode->i_op = &mini_fo_dir_iops;
-+
-+ /* Use different set of file ops for directories */
-+ if (S_ISDIR(master_inode->i_mode))
-+ inode->i_fop = &mini_fo_dir_fops;
-+
-+ /* properly initialize special inodes */
-+ if (S_ISBLK(master_inode->i_mode) || S_ISCHR(master_inode->i_mode) ||
-+ S_ISFIFO(master_inode->i_mode) || S_ISSOCK(master_inode->i_mode)) {
-+ init_special_inode(inode, master_inode->i_mode, master_inode->i_rdev);
-+ }
-+
-+ /* Fix our inode's address operations to that of the lower inode */
-+ if (inode->i_mapping->a_ops != master_inode->i_mapping->a_ops) {
-+ inode->i_mapping->a_ops = master_inode->i_mapping->a_ops;
-+ }
-+
-+ /* only (our) lookup wants to do a d_add */
-+ if (flag)
-+ d_add(dentry, inode);
-+ else
-+ d_instantiate(dentry, inode);
-+
-+ ASSERT(dtopd(dentry) != NULL);
-+
-+ /* all well, copy inode attributes */
-+ fist_copy_attr_all(inode, master_inode);
-+
-+ out:
-+ return err;
-+}
-+
-+/* parse mount options "base=" and "sto=" */
-+dentry_t *
-+mini_fo_parse_options(super_block_t *sb, char *options)
-+{
-+ dentry_t *hidden_root = ERR_PTR(-EINVAL);
-+ dentry_t *hidden_root2 = ERR_PTR(-EINVAL);
-+ struct nameidata nd, nd2;
-+ char *name, *tmp, *end;
-+ int err = 0;
-+
-+ /* We don't want to go off the end of our arguments later on. */
-+ for (end = options; *end; end++);
-+
-+ while (options < end) {
-+ tmp = options;
-+ while (*tmp && *tmp != ',')
-+ tmp++;
-+ *tmp = '\0';
-+ if (!strncmp("base=", options, 5)) {
-+ name = options + 5;
-+ printk(KERN_INFO "mini_fo: using base directory: %s\n", name);
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ if (path_init(name, LOOKUP_FOLLOW, &nd))
-+ err = path_walk(name, &nd);
-+#else
-+ err = path_lookup(name, LOOKUP_FOLLOW, &nd);
-+#endif
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: error accessing hidden directory '%s'\n", name);
-+ hidden_root = ERR_PTR(err);
-+ goto out;
-+ }
-+ hidden_root = nd.dentry;
-+ stopd(sb)->base_dir_dentry = nd.dentry;
-+ stopd(sb)->hidden_mnt = nd.mnt;
-+
-+ } else if(!strncmp("sto=", options, 4)) {
-+ /* parse the storage dir */
-+ name = options + 4;
-+ printk(KERN_INFO "mini_fo: using storage directory: %s\n", name);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ if(path_init(name, LOOKUP_FOLLOW, &nd2))
-+ err = path_walk(name, &nd2);
-+#else
-+ err = path_lookup(name, LOOKUP_FOLLOW, &nd2);
-+#endif
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: error accessing hidden storage directory '%s'\n", name);
-+
-+ hidden_root2 = ERR_PTR(err);
-+ goto out;
-+ }
-+ hidden_root2 = nd2.dentry;
-+ stopd(sb)->storage_dir_dentry = nd2.dentry;
-+ stopd(sb)->hidden_mnt2 = nd2.mnt;
-+ stohs2(sb) = hidden_root2->d_sb;
-+
-+ /* validate storage dir, this is done in
-+ * mini_fo_read_super for the base directory.
-+ */
-+ if (IS_ERR(hidden_root2)) {
-+ printk(KERN_WARNING "mini_fo_parse_options: storage dentry lookup failed (err = %ld)\n", PTR_ERR(hidden_root2));
-+ goto out;
-+ }
-+ if (!hidden_root2->d_inode) {
-+ printk(KERN_WARNING "mini_fo_parse_options: no storage dir to interpose on.\n");
-+ goto out;
-+ }
-+ stohs2(sb) = hidden_root2->d_sb;
-+ } else {
-+ printk(KERN_WARNING "mini_fo: unrecognized option '%s'\n", options);
-+ hidden_root = ERR_PTR(-EINVAL);
-+ goto out;
-+ }
-+ options = tmp + 1;
-+ }
-+
-+ out:
-+ if(IS_ERR(hidden_root2))
-+ return hidden_root2;
-+ return hidden_root;
-+}
-+
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+static int
-+#else
-+super_block_t *
-+#endif
-+mini_fo_read_super(super_block_t *sb, void *raw_data, int silent)
-+{
-+ dentry_t *hidden_root;
-+ int err = 0;
-+
-+ if (!raw_data) {
-+ printk(KERN_WARNING "mini_fo_read_super: missing argument\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ /*
-+ * Allocate superblock private data
-+ */
-+ __stopd(sb) = kmalloc(sizeof(struct mini_fo_sb_info), GFP_KERNEL);
-+ if (!stopd(sb)) {
-+ printk(KERN_WARNING "%s: out of memory\n", __FUNCTION__);
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+ stohs(sb) = NULL;
-+
-+ hidden_root = mini_fo_parse_options(sb, raw_data);
-+ if (IS_ERR(hidden_root)) {
-+ printk(KERN_WARNING "mini_fo_read_super: lookup_dentry failed (err = %ld)\n", PTR_ERR(hidden_root));
-+ err = PTR_ERR(hidden_root);
-+ goto out_free;
-+ }
-+ if (!hidden_root->d_inode) {
-+ printk(KERN_WARNING "mini_fo_read_super: no directory to interpose on\n");
-+ goto out_free;
-+ }
-+ stohs(sb) = hidden_root->d_sb;
-+
-+ /*
-+ * Linux 2.4.2-ac3 and beyond has code in
-+ * mm/filemap.c:generic_file_write() that requires sb->s_maxbytes
-+ * to be populated. If not set, all write()s under that sb will
-+ * return 0.
-+ *
-+ * Linux 2.4.4+ automatically sets s_maxbytes to MAX_NON_LFS;
-+ * the filesystem should override it only if it supports LFS.
-+ */
-+ /* non-SCA code is good to go with LFS */
-+ sb->s_maxbytes = hidden_root->d_sb->s_maxbytes;
-+
-+ sb->s_op = &mini_fo_sops;
-+ /*
-+ * we can't use d_alloc_root if we want to use
-+ * our own interpose function unchanged,
-+ * so we simply replicate *most* of the code in d_alloc_root here
-+ */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ sb->s_root = d_alloc(NULL, &(const struct qstr) { "/", 1, 0 });
-+#else
-+ sb->s_root = d_alloc(NULL, &(const struct qstr){hash: 0, name: "/", len : 1});
-+#endif
-+ if (IS_ERR(sb->s_root)) {
-+ printk(KERN_WARNING "mini_fo_read_super: d_alloc failed\n");
-+ err = -ENOMEM;
-+ goto out_dput;
-+ }
-+
-+ sb->s_root->d_op = &mini_fo_dops;
-+ sb->s_root->d_sb = sb;
-+ sb->s_root->d_parent = sb->s_root;
-+
-+ /* link the upper and lower dentries */
-+ __dtopd(sb->s_root) = (struct mini_fo_dentry_info *)
-+ kmalloc(sizeof(struct mini_fo_dentry_info), GFP_KERNEL);
-+ if (!dtopd(sb->s_root)) {
-+ err = -ENOMEM;
-+ goto out_dput2;
-+ }
-+ dtopd(sb->s_root)->state = MODIFIED;
-+ dtohd(sb->s_root) = hidden_root;
-+
-+ /* fanout relevant, interpose on storage root dentry too */
-+ dtohd2(sb->s_root) = stopd(sb)->storage_dir_dentry;
-+
-+ /* ...and call tri-interpose to interpose root dir inodes
-+ * if (mini_fo_interpose(hidden_root, sb->s_root, sb, 0))
-+ */
-+ if(mini_fo_tri_interpose(hidden_root, dtohd2(sb->s_root), sb->s_root, sb, 0))
-+ goto out_dput2;
-+
-+ /* initalize the wol list */
-+ itopd(sb->s_root->d_inode)->deleted_list_size = -1;
-+ itopd(sb->s_root->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(sb->s_root);
-+
-+ goto out;
-+
-+ out_dput2:
-+ dput(sb->s_root);
-+ out_dput:
-+ dput(hidden_root);
-+ dput(dtohd2(sb->s_root)); /* release the hidden_sto_dentry too */
-+ out_free:
-+ kfree(stopd(sb));
-+ __stopd(sb) = NULL;
-+ out:
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ return err;
-+#else
-+ if (err) {
-+ return ERR_PTR(err);
-+ } else {
-+ return sb;
-+ }
-+#endif
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+static int mini_fo_get_sb(struct file_system_type *fs_type,
-+ int flags, const char *dev_name,
-+ void *raw_data, struct vfsmount *mnt)
-+{
-+ return get_sb_nodev(fs_type, flags, raw_data, mini_fo_read_super, mnt);
-+}
-+#else
-+static struct super_block *mini_fo_get_sb(struct file_system_type *fs_type,
-+ int flags, const char *dev_name,
-+ void *raw_data)
-+{
-+ return get_sb_nodev(fs_type, flags, raw_data, mini_fo_read_super);
-+}
-+#endif
-+
-+void mini_fo_kill_block_super(struct super_block *sb)
-+{
-+ generic_shutdown_super(sb);
-+ /*
-+ * XXX: BUG: Halcrow: Things get unstable sometime after this point:
-+ * lib/rwsem-spinlock.c:127: spin_is_locked on uninitialized
-+ * fs/fs-writeback.c:402: spin_lock(fs/super.c:a0381828) already
-+ * locked by fs/fs-writeback.c/402
-+ *
-+ * Apparently, someone's not releasing a lock on sb_lock...
-+ */
-+}
-+
-+static struct file_system_type mini_fo_fs_type = {
-+ .owner = THIS_MODULE,
-+ .name = "mini_fo",
-+ .get_sb = mini_fo_get_sb,
-+ .kill_sb = mini_fo_kill_block_super,
-+ .fs_flags = 0,
-+};
-+
-+
-+#else
-+static DECLARE_FSTYPE(mini_fo_fs_type, "mini_fo", mini_fo_read_super, 0);
-+#endif
-+
-+static int __init init_mini_fo_fs(void)
-+{
-+ printk("Registering mini_fo version $Id$\n");
-+ return register_filesystem(&mini_fo_fs_type);
-+}
-+static void __exit exit_mini_fo_fs(void)
-+{
-+ printk("Unregistering mini_fo version $Id$\n");
-+ unregister_filesystem(&mini_fo_fs_type);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+EXPORT_NO_SYMBOLS;
-+#endif
-+
-+MODULE_AUTHOR("Erez Zadok <ezk@cs.sunysb.edu>");
-+MODULE_DESCRIPTION("FiST-generated mini_fo filesystem");
-+MODULE_LICENSE("GPL");
-+
-+/* MODULE_PARM(fist_debug_var, "i"); */
-+/* MODULE_PARM_DESC(fist_debug_var, "Debug level"); */
-+
-+module_init(init_mini_fo_fs)
-+module_exit(exit_mini_fo_fs)
---- /dev/null
-+++ b/fs/mini_fo/Makefile
-@@ -0,0 +1,17 @@
-+#
-+# Makefile for mini_fo 2.4 and 2.6 Linux kernels
-+#
-+# Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+#
-+# 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.
-+#
-+
-+obj-$(CONFIG_MINI_FO) := mini_fo.o
-+mini_fo-objs := meta.o dentry.o file.o inode.o main.o super.o state.o aux.o
-+
-+# dependencies
-+${mini_fo-objs}: mini_fo.h fist.h
-+
---- /dev/null
-+++ b/fs/mini_fo/meta.c
-@@ -0,0 +1,1000 @@
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+int meta_build_lists(dentry_t *dentry)
-+{
-+ struct mini_fo_inode_info *inode_info;
-+
-+ dentry_t *meta_dentry = 0;
-+ file_t *meta_file = 0;
-+ mm_segment_t old_fs;
-+ void *buf;
-+
-+ int bytes, len;
-+ struct vfsmount *meta_mnt;
-+ char *entry;
-+
-+ inode_info = itopd(dentry->d_inode);
-+ if(!(inode_info->deleted_list_size == -1 &&
-+ inode_info->renamed_list_size == -1)) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ Error, list(s) not virgin.\n");
-+ return -1;
-+ }
-+
-+ /* init our meta lists */
-+ INIT_LIST_HEAD(&inode_info->deleted_list);
-+ inode_info->deleted_list_size = 0;
-+
-+ INIT_LIST_HEAD(&inode_info->renamed_list);
-+ inode_info->renamed_list_size = 0;
-+
-+ /* might there be a META-file? */
-+ if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen(META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ dput(meta_dentry);
-+ goto out_ok;
-+ }
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
-+
-+ /* open META-file for reading */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x0);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ ERROR opening META file.\n");
-+ goto out_err;
-+ }
-+
-+ /* check if fs supports reading */
-+ if(!meta_file->f_op->read) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ ERROR, fs does not support reading.\n");
-+ goto out_err_close;
-+ }
-+
-+ /* allocate a page for transfering the data */
-+ buf = (void *) __get_free_page(GFP_KERNEL);
-+ if(!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ ERROR, out of mem.\n");
-+ goto out_err_close;
-+ }
-+ meta_file->f_pos = 0;
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+ do {
-+ char *c;
-+ bytes = meta_file->f_op->read(meta_file, buf, PAGE_SIZE, &meta_file->f_pos);
-+ if(bytes == PAGE_SIZE) {
-+ /* trim a cut off filename and adjust f_pos to get it next time */
-+ for(c = (char*) buf+PAGE_SIZE;
-+ *c != '\n';
-+ c--, bytes--, meta_file->f_pos--);
-+ }
-+ entry = (char *) buf;
-+ while(entry < (char *) buf+bytes) {
-+
-+ char *old_path;
-+ char *dir_name;
-+ int old_len, new_len;
-+
-+ /* len without '\n'*/
-+ len = (int) (strchr(entry, '\n') - entry);
-+ switch (*entry) {
-+ case 'D':
-+ /* format: "D filename" */
-+ meta_list_add_d_entry(dentry,
-+ entry+2,
-+ len-2);
-+ break;
-+ case 'R':
-+ /* format: "R path/xy/dir newDir" */
-+ old_path = entry+2;
-+ dir_name = strchr(old_path, ' ') + 1;
-+ old_len = dir_name - old_path - 1;
-+ new_len = ((int) entry) + len - ((int ) dir_name);
-+ meta_list_add_r_entry(dentry,
-+ old_path,
-+ old_len,
-+ dir_name,
-+ new_len);
-+ break;
-+ default:
-+ /* unknown entry type detected */
-+ break;
-+ }
-+ entry += len+1;
-+ }
-+
-+ } while(meta_file->f_pos < meta_dentry->d_inode->i_size);
-+
-+ free_page((unsigned long) buf);
-+ set_fs(old_fs);
-+ fput(meta_file);
-+ }
-+ goto out_ok;
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out_err:
-+ mntput(meta_mnt);
-+ dput(meta_dentry);
-+ return -1;
-+ out_ok:
-+ return 1; /* check this!!! inode_info->wol_size; */
-+}
-+
-+/* cleanups up all lists and free's the mem by dentry */
-+int meta_put_lists(dentry_t *dentry)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk("mini_fo: meta_put_lists: invalid dentry passed.\n");
-+ return -1;
-+ }
-+ return __meta_put_lists(dentry->d_inode);
-+}
-+
-+/* cleanups up all lists and free's the mem by inode */
-+int __meta_put_lists(inode_t *inode)
-+{
-+ int err = 0;
-+ if(!inode || !itopd(inode)) {
-+ printk("mini_fo: __meta_put_lists: invalid inode passed.\n");
-+ return -1;
-+ }
-+ err = __meta_put_d_list(inode);
-+ err |= __meta_put_r_list(inode);
-+ return err;
-+}
-+
-+int meta_sync_lists(dentry_t *dentry)
-+{
-+ int err = 0;
-+ if(!dentry || !dentry->d_inode) {
-+ printk("mini_fo: meta_sync_lists: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ err = meta_sync_d_list(dentry, 0);
-+ err |= meta_sync_r_list(dentry, 1);
-+ return err;
-+}
-+
-+
-+/* remove all D entries from the renamed list and free the mem */
-+int __meta_put_d_list(inode_t *inode)
-+{
-+ struct list_head *tmp;
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: __meta_put_d_list: \
-+ invalid inode passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(inode);
-+
-+ /* nuke the DELETED-list */
-+ if(inode_info->deleted_list_size <= 0)
-+ return 0;
-+
-+ while(!list_empty(&inode_info->deleted_list)) {
-+ tmp = inode_info->deleted_list.next;
-+ list_del(tmp);
-+ del_entry = list_entry(tmp, struct deleted_entry, list);
-+ kfree(del_entry->name);
-+ kfree(del_entry);
-+ }
-+ inode_info->deleted_list_size = 0;
-+
-+ return 0;
-+}
-+
-+/* remove all R entries from the renamed list and free the mem */
-+int __meta_put_r_list(inode_t *inode)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: meta_put_r_list: invalid inode.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(inode);
-+
-+ /* nuke the RENAMED-list */
-+ if(inode_info->renamed_list_size <= 0)
-+ return 0;
-+
-+ while(!list_empty(&inode_info->renamed_list)) {
-+ tmp = inode_info->renamed_list.next;
-+ list_del(tmp);
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ kfree(ren_entry->new_name);
-+ kfree(ren_entry->old_name);
-+ kfree(ren_entry);
-+ }
-+ inode_info->renamed_list_size = 0;
-+
-+ return 0;
-+}
-+
-+int meta_add_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ int err = 0;
-+ err = meta_list_add_d_entry(dentry, name, len);
-+ err |= meta_write_d_entry(dentry,name,len);
-+ return err;
-+}
-+
-+/* add a D entry to the deleted list */
-+int meta_list_add_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_d_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->deleted_list_size < 0)
-+ return -1;
-+
-+ del_entry = (struct deleted_entry *)
-+ kmalloc(sizeof(struct deleted_entry), GFP_KERNEL);
-+ del_entry->name = (char*) kmalloc(len, GFP_KERNEL);
-+ if(!del_entry || !del_entry->name) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_d_entry: \
-+ out of mem.\n");
-+ kfree(del_entry->name);
-+ kfree(del_entry);
-+ return -ENOMEM;
-+ }
-+
-+ strncpy(del_entry->name, name, len);
-+ del_entry->len = len;
-+
-+ list_add(&del_entry->list, &inode_info->deleted_list);
-+ inode_info->deleted_list_size++;
-+ return 0;
-+}
-+
-+int meta_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len)
-+{
-+ int err = 0;
-+ err = meta_list_add_r_entry(dentry,
-+ old_name, old_len,
-+ new_name, new_len);
-+ err |= meta_write_r_entry(dentry,
-+ old_name, old_len,
-+ new_name, new_len);
-+ return err;
-+}
-+
-+/* add a R entry to the renamed list */
-+int meta_list_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len)
-+{
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_r_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->renamed_list_size < 0)
-+ return -1;
-+
-+ ren_entry = (struct renamed_entry *)
-+ kmalloc(sizeof(struct renamed_entry), GFP_KERNEL);
-+ ren_entry->old_name = (char*) kmalloc(old_len, GFP_KERNEL);
-+ ren_entry->new_name = (char*) kmalloc(new_len, GFP_KERNEL);
-+
-+ if(!ren_entry || !ren_entry->old_name || !ren_entry->new_name) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_r_entry: \
-+ out of mem.\n");
-+ kfree(ren_entry->new_name);
-+ kfree(ren_entry->old_name);
-+ kfree(ren_entry);
-+ return -ENOMEM;
-+ }
-+
-+ strncpy(ren_entry->old_name, old_name, old_len);
-+ ren_entry->old_len = old_len;
-+ strncpy(ren_entry->new_name, new_name, new_len);
-+ ren_entry->new_len = new_len;
-+
-+ list_add(&ren_entry->list, &inode_info->renamed_list);
-+ inode_info->renamed_list_size++;
-+ return 0;
-+}
-+
-+
-+int meta_remove_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ int err = 0;
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT
-+ "mini_fo: meta_remove_r_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+
-+ err = meta_list_remove_r_entry(dentry, name, len);
-+ err |= meta_sync_lists(dentry);
-+ return err;
-+}
-+
-+int meta_list_remove_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT
-+ "mini_fo: meta_list_remove_r_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ return __meta_list_remove_r_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_list_remove_r_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode))
-+ printk(KERN_CRIT
-+ "mini_fo: __meta_list_remove_r_entry: \
-+ invalid inode passed.\n");
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->renamed_list_size < 0)
-+ return -1;
-+ if(inode_info->renamed_list_size == 0)
-+ return 1;
-+
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ if(ren_entry->new_len != len)
-+ continue;
-+
-+ if(!strncmp(ren_entry->new_name, name, len)) {
-+ list_del(tmp);
-+ kfree(ren_entry->new_name);
-+ kfree(ren_entry->old_name);
-+ kfree(ren_entry);
-+ inode_info->renamed_list_size--;
-+ return 0;
-+ }
-+ }
-+ return 1;
-+}
-+
-+
-+/* append a single D entry to the meta file */
-+int meta_write_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ dentry_t *meta_dentry = 0;
-+ file_t *meta_file = 0;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err;
-+ struct vfsmount *meta_mnt = 0;
-+ char *buf;
-+
-+ err = 0;
-+
-+ if(itopd(dentry->d_inode)->deleted_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ if(dtopd(dentry)->state == UNMODIFIED) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry), strlen (META_FILENAME));
-+
-+ /* We need to create a META-file */
-+ if(!meta_dentry->d_inode) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry,
-+ S_IRUSR | S_IWUSR,
-+ NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry,
-+ S_IRUSR | S_IWUSR);
-+#endif
-+ }
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ ERROR opening meta file.\n");
-+ mntput(meta_mnt); /* $%& is this necessary? */
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* size: len for name, 1 for \n and 2 for "D " */
-+ buf = (char *) kmalloc(len+3, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ out of mem.\n");
-+ return -ENOMEM;
-+ }
-+
-+ buf[0] = 'D';
-+ buf[1] = ' ';
-+ strncpy(buf+2, name, len);
-+ buf[len+2] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf, len+3,
-+ &meta_file->f_pos);
-+ if(bytes != len+3) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ ERROR writing.\n");
-+ err = -1;
-+ }
-+ kfree(buf);
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+}
-+
-+/* append a single R entry to the meta file */
-+int meta_write_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len)
-+{
-+ dentry_t *meta_dentry = 0;
-+ file_t *meta_file = 0;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err, buf_len;
-+ struct vfsmount *meta_mnt = 0;
-+ char *buf;
-+
-+
-+ err = 0;
-+
-+ if(itopd(dentry->d_inode)->renamed_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* build the storage structure? */
-+ if(dtopd(dentry)->state == UNMODIFIED) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen (META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+ }
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+ ERROR opening meta file.\n");
-+ mntput(meta_mnt);
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* size: 2 for "R ", old_len+new_len for names, 1 blank+1 \n */
-+ buf_len = old_len + new_len + 4;
-+ buf = (char *) kmalloc(buf_len, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: out of mem.\n");
-+ return -ENOMEM;
-+ }
-+
-+ buf[0] = 'R';
-+ buf[1] = ' ';
-+ strncpy(buf + 2, old_name, old_len);
-+ buf[old_len + 2] = ' ';
-+ strncpy(buf + old_len + 3, new_name, new_len);
-+ buf[buf_len -1] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf, buf_len, &meta_file->f_pos);
-+ if(bytes != buf_len) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: ERROR writing.\n");
-+ err = -1;
-+ }
-+
-+ kfree(buf);
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+}
-+
-+/* sync D list to disk, append data if app_flag is 1 */
-+/* check the meta_mnt, which seems not to be used (properly) */
-+
-+int meta_sync_d_list(dentry_t *dentry, int app_flag)
-+{
-+ dentry_t *meta_dentry;
-+ file_t *meta_file;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err;
-+ struct vfsmount *meta_mnt;
-+ char *buf;
-+
-+ struct list_head *tmp;
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ err = 0;
-+ meta_file=0;
-+ meta_mnt=0;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ invalid inode passed.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->deleted_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* ok, there is something to sync */
-+
-+ /* build the storage structure? */
-+ if(!dtohd2(dentry) && !itohi2(dentry->d_inode)) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen(META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+ app_flag = 0;
-+ }
-+ /* need we truncate the meta file? */
-+ if(!app_flag) {
-+ struct iattr newattrs;
-+ newattrs.ia_size = 0;
-+ newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ down(&meta_dentry->d_inode->i_sem);
-+#endif
-+ err = notify_change(meta_dentry, &newattrs);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ up(&meta_dentry->d_inode->i_sem);
-+#endif
-+
-+ if(err || meta_dentry->d_inode->i_size != 0) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR truncating meta file.\n");
-+ goto out_err_close;
-+ }
-+ }
-+
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR opening meta file.\n");
-+ /* we don't mntget so we dont't mntput (for now)
-+ * mntput(meta_mnt);
-+ */
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* here we go... */
-+ list_for_each(tmp, &inode_info->deleted_list) {
-+ del_entry = list_entry(tmp, struct deleted_entry, list);
-+
-+ /* size: len for name, 1 for \n and 2 for "D " */
-+ buf = (char *) kmalloc(del_entry->len+3, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ out of mem.\n");
-+ return -ENOMEM;
-+ }
-+
-+ buf[0] = 'D';
-+ buf[1] = ' ';
-+ strncpy(buf+2, del_entry->name, del_entry->len);
-+ buf[del_entry->len+2] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf,
-+ del_entry->len+3,
-+ &meta_file->f_pos);
-+ if(bytes != del_entry->len+3) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR writing.\n");
-+ err |= -1;
-+ }
-+ kfree(buf);
-+ }
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+
-+}
-+
-+int meta_sync_r_list(dentry_t *dentry, int app_flag)
-+{
-+ dentry_t *meta_dentry;
-+ file_t *meta_file;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err, buf_len;
-+ struct vfsmount *meta_mnt;
-+ char *buf;
-+
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ err = 0;
-+ meta_file=0;
-+ meta_mnt=0;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ invalid dentry passed.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->deleted_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* ok, there is something to sync */
-+
-+ /* build the storage structure? */
-+ if(!dtohd2(dentry) && !itohi2(dentry->d_inode)) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen(META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+ app_flag = 0;
-+ }
-+ /* need we truncate the meta file? */
-+ if(!app_flag) {
-+ struct iattr newattrs;
-+ newattrs.ia_size = 0;
-+ newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ down(&meta_dentry->d_inode->i_sem);
-+#endif
-+ err = notify_change(meta_dentry, &newattrs);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ up(&meta_dentry->d_inode->i_sem);
-+#endif
-+ if(err || meta_dentry->d_inode->i_size != 0) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR truncating meta file.\n");
-+ goto out_err_close;
-+ }
-+ }
-+
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR opening meta file.\n");
-+ /* we don't mntget so we dont't mntput (for now)
-+ * mntput(meta_mnt);
-+ */
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* here we go... */
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ /* size:
-+ * 2 for "R ", old_len+new_len for names, 1 blank+1 \n */
-+ buf_len = ren_entry->old_len + ren_entry->new_len + 4;
-+ buf = (char *) kmalloc(buf_len, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ out of mem.\n");
-+ return -ENOMEM;
-+ }
-+ buf[0] = 'R';
-+ buf[1] = ' ';
-+ strncpy(buf + 2, ren_entry->old_name, ren_entry->old_len);
-+ buf[ren_entry->old_len + 2] = ' ';
-+ strncpy(buf + ren_entry->old_len + 3,
-+ ren_entry->new_name, ren_entry->new_len);
-+ buf[buf_len - 1] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf,
-+ buf_len, &meta_file->f_pos);
-+ if(bytes != buf_len) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR writing.\n");
-+ err |= -1;
-+ }
-+ kfree(buf);
-+ }
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+}
-+
-+int meta_check_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode)
-+ printk(KERN_CRIT "mini_fo: meta_check_d_dentry: \
-+ invalid dentry passed.\n");
-+ return __meta_check_d_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_check_d_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode))
-+ printk(KERN_CRIT "mini_fo: __meta_check_d_dentry: \
-+ invalid inode passed.\n");
-+
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->deleted_list_size <= 0)
-+ return 0;
-+
-+ list_for_each(tmp, &inode_info->deleted_list) {
-+ del_entry = list_entry(tmp, struct deleted_entry, list);
-+ if(del_entry->len != len)
-+ continue;
-+
-+ if(!strncmp(del_entry->name, name, len))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/*
-+ * check if file has been renamed and return path to orig. base dir.
-+ * Implements no error return values so far, what of course sucks.
-+ * String is null terminated.'
-+ */
-+char* meta_check_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry: \
-+ invalid dentry passed.\n");
-+ return NULL;
-+ }
-+ return __meta_check_r_entry(dentry->d_inode, name, len);
-+}
-+
-+char* __meta_check_r_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+ char *old_path;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry: \
-+ invalid inode passed.\n");
-+ return NULL;
-+ }
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->renamed_list_size <= 0)
-+ return NULL;
-+
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ if(ren_entry->new_len != len)
-+ continue;
-+
-+ if(!strncmp(ren_entry->new_name, name, len)) {
-+ old_path = (char *)
-+ kmalloc(ren_entry->old_len+1, GFP_KERNEL);
-+ strncpy(old_path,
-+ ren_entry->old_name,
-+ ren_entry->old_len);
-+ old_path[ren_entry->old_len]='\0';
-+ return old_path;
-+ }
-+ }
-+ return NULL;
-+}
-+
-+/*
-+ * This version only checks if entry exists and return:
-+ * 1 if exists,
-+ * 0 if not,
-+ * -1 if error.
-+ */
-+int meta_is_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry [2]: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ return __meta_is_r_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_is_r_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry [2]: \
-+ invalid inode passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->renamed_list_size <= 0)
-+ return -1;
-+
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ if(ren_entry->new_len != len)
-+ continue;
-+
-+ if(!strncmp(ren_entry->new_name, name, len))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
---- /dev/null
-+++ b/fs/mini_fo/mini_fo.h
-@@ -0,0 +1,510 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifndef __MINI_FO_H_
-+#define __MINI_FO_H_
-+
-+#ifdef __KERNEL__
-+
-+/* META stuff */
-+#define META_FILENAME "META_dAfFgHE39ktF3HD2sr"
-+
-+/* use xattrs? */
-+#define XATTR
-+
-+/* File attributes that when changed, result in a file beeing copied to storage */
-+#define COPY_FLAGS ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_SIZE
-+
-+/*
-+ * mini_fo filestates
-+ */
-+#define MODIFIED 1
-+#define UNMODIFIED 2
-+#define CREATED 3
-+#define DEL_REWRITTEN 4
-+#define DELETED 5
-+#define NON_EXISTANT 6
-+
-+/* fist file systems superblock magic */
-+# define MINI_FO_SUPER_MAGIC 0xf15f
-+
-+/*
-+ * STRUCTURES:
-+ */
-+
-+/* mini_fo inode data in memory */
-+struct mini_fo_inode_info {
-+ inode_t *wii_inode;
-+ inode_t *wii_inode2; /* pointer to storage inode */
-+
-+ /* META-data lists */
-+ /* deleted list, ex wol */
-+ struct list_head deleted_list;
-+ int deleted_list_size;
-+
-+ /* renamed list */
-+ struct list_head renamed_list;
-+ int renamed_list_size;
-+
-+ /* add other lists here ... */
-+};
-+
-+/* mini_fo dentry data in memory */
-+struct mini_fo_dentry_info {
-+ dentry_t *wdi_dentry;
-+ dentry_t *wdi_dentry2; /* pointer to storage dentry */
-+ unsigned int state; /* state of the mini_fo dentry */
-+};
-+
-+
-+/* mini_fo super-block data in memory */
-+struct mini_fo_sb_info {
-+ super_block_t *wsi_sb, *wsi_sb2; /* mk: might point to the same sb */
-+ struct vfsmount *hidden_mnt, *hidden_mnt2;
-+ dentry_t *base_dir_dentry;
-+ dentry_t *storage_dir_dentry;
-+ ;
-+};
-+
-+/* readdir_data, readdir helper struct */
-+struct readdir_data {
-+ struct list_head ndl_list; /* linked list head ptr */
-+ int ndl_size; /* list size */
-+ int sto_done; /* flag to show that the storage dir entries have
-+ * all been read an now follow base entries */
-+};
-+
-+/* file private data. */
-+struct mini_fo_file_info {
-+ struct file *wfi_file;
-+ struct file *wfi_file2; /* pointer to storage file */
-+ struct readdir_data rd;
-+};
-+
-+/* struct ndl_entry */
-+struct ndl_entry {
-+ struct list_head list;
-+ char *name;
-+ int len;
-+};
-+
-+/********************************
-+ * META-data structures
-+ ********************************/
-+
-+/* deleted entry */
-+struct deleted_entry {
-+ struct list_head list;
-+ char *name;
-+ int len;
-+};
-+
-+/* renamed entry */
-+struct renamed_entry {
-+ struct list_head list;
-+ char *old_name; /* old directory with full path */
-+ int old_len; /* length of above string */
-+ char *new_name; /* new directory name */
-+ int new_len; /* length of above string */
-+};
-+
-+/* attr_change entry */
-+struct attr_change_entry {
-+ struct list_head list;
-+ char *name;
-+ int len;
-+};
-+
-+/* link entry */
-+struct link_entry {
-+ struct list_head list;
-+ int links_moved;
-+ int inum_base;
-+ int inum_sto;
-+ char *weird_name;
-+ int weird_name_len;
-+};
-+
-+
-+/* Some other stuff required for mini_fo_filldir64, copied from
-+ * fs/readdir.c
-+ */
-+
-+#define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1))
-+#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
-+
-+
-+struct linux_dirent64 {
-+ u64 d_ino;
-+ s64 d_off;
-+ unsigned short d_reclen;
-+ unsigned char d_type;
-+ char d_name[0];
-+};
-+
-+
-+struct getdents_callback64 {
-+ struct linux_dirent64 * current_dir;
-+ struct linux_dirent64 * previous;
-+ int count;
-+ int error;
-+};
-+
-+struct linux_dirent {
-+ unsigned long d_ino;
-+ unsigned long d_off;
-+ unsigned short d_reclen;
-+ char d_name[1];
-+};
-+
-+struct getdents_callback {
-+ struct linux_dirent * current_dir;
-+ struct linux_dirent * previous;
-+ int count;
-+ int error;
-+};
-+
-+
-+/*
-+ * MACROS:
-+ */
-+
-+/* file TO private_data */
-+# define ftopd(file) ((struct mini_fo_file_info *)((file)->private_data))
-+# define __ftopd(file) ((file)->private_data)
-+/* file TO hidden_file */
-+# define ftohf(file) ((ftopd(file))->wfi_file)
-+# define ftohf2(file) ((ftopd(file))->wfi_file2)
-+
-+/* inode TO private_data */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+# define itopd(ino) ((struct mini_fo_inode_info *)(ino)->i_private)
-+# define __itopd(ino) ((ino)->i_private)
-+#else
-+# define itopd(ino) ((struct mini_fo_inode_info *)(ino)->u.generic_ip)
-+# define __itopd(ino) ((ino)->u.generic_ip)
-+#endif
-+/* inode TO hidden_inode */
-+# define itohi(ino) (itopd(ino)->wii_inode)
-+# define itohi2(ino) (itopd(ino)->wii_inode2)
-+
-+/* superblock TO private_data */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+# define stopd(super) ((struct mini_fo_sb_info *)(super)->s_fs_info)
-+# define __stopd(super) ((super)->s_fs_info)
-+#else
-+# define stopd(super) ((struct mini_fo_sb_info *)(super)->u.generic_sbp)
-+# define __stopd(super) ((super)->u.generic_sbp)
-+#endif
-+
-+/* unused? # define vfs2priv stopd */
-+/* superblock TO hidden_superblock */
-+
-+# define stohs(super) (stopd(super)->wsi_sb)
-+# define stohs2(super) (stopd(super)->wsi_sb2)
-+
-+/* dentry TO private_data */
-+# define dtopd(dentry) ((struct mini_fo_dentry_info *)(dentry)->d_fsdata)
-+# define __dtopd(dentry) ((dentry)->d_fsdata)
-+/* dentry TO hidden_dentry */
-+# define dtohd(dent) (dtopd(dent)->wdi_dentry)
-+# define dtohd2(dent) (dtopd(dent)->wdi_dentry2)
-+
-+/* dentry to state */
-+# define dtost(dent) (dtopd(dent)->state)
-+# define sbt(sb) ((sb)->s_type->name)
-+
-+#define IS_WRITE_FLAG(flag) (flag & (O_RDWR | O_WRONLY | O_APPEND))
-+#define IS_COPY_FLAG(flag) (flag & (COPY_FLAGS))
-+
-+/* macros to simplify non-SCA code */
-+# define MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages)
-+# define MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages)
-+# define FREE_PAGE_POINTERS(hidden_pages, num)
-+# define FREE_PAGEDATA_POINTERS(hidden_pages_data, num)
-+# define FOR_EACH_PAGE
-+# define CURRENT_HIDDEN_PAGE hidden_page
-+# define CURRENT_HIDDEN_PAGEDATA hidden_page_data
-+# define CURRENT_HIDDEN_PAGEINDEX page->index
-+
-+/*
-+ * EXTERNALS:
-+ */
-+extern struct file_operations mini_fo_main_fops;
-+extern struct file_operations mini_fo_dir_fops;
-+extern struct inode_operations mini_fo_main_iops;
-+extern struct inode_operations mini_fo_dir_iops;
-+extern struct inode_operations mini_fo_symlink_iops;
-+extern struct super_operations mini_fo_sops;
-+extern struct dentry_operations mini_fo_dops;
-+extern struct vm_operations_struct mini_fo_shared_vmops;
-+extern struct vm_operations_struct mini_fo_private_vmops;
-+extern struct address_space_operations mini_fo_aops;
-+
-+#if 0 /* unused by mini_fo */
-+extern int mini_fo_interpose(dentry_t *hidden_dentry, dentry_t *this_dentry, super_block_t *sb, int flag);
-+#if defined(FIST_FILTER_DATA) || defined(FIST_FILTER_SCA)
-+extern page_t *mini_fo_get1page(file_t *file, int index);
-+extern int mini_fo_fill_zeros(file_t *file, page_t *page, unsigned from);
-+# endif /* FIST_FILTER_DATA || FIST_FILTER_SCA */
-+
-+
-+# define mini_fo_hidden_dentry(d) __mini_fo_hidden_dentry(__FILE__,__FUNCTION__,__LINE__,(d))
-+# define mini_fo_hidden_sto_dentry(d) __mini_fo_hidden_sto_dentry(__FILE__,__FUNCTION__,__LINE__,(d))
-+
-+extern dentry_t *__mini_fo_hidden_dentry(char *file, char *func, int line, dentry_t *this_dentry);
-+extern dentry_t *__mini_fo_hidden_sto_dentry(char *file, char *func, int line, dentry_t *this_dentry);
-+
-+extern int mini_fo_read_file(const char *filename, void *buf, int len);
-+extern int mini_fo_write_file(const char *filename, void *buf, int len);
-+extern dentry_t *fist_lookup(dentry_t *dir, const char *name, vnode_t **out, uid_t uid, gid_t gid);
-+#endif /* unused by mini_fo */
-+
-+/* state transition functions */
-+extern int nondir_unmod_to_mod(dentry_t *dentry, int cp_flag);
-+extern int nondir_del_rew_to_del(dentry_t *dentry);
-+extern int nondir_creat_to_del(dentry_t *dentry);
-+extern int nondir_mod_to_del(dentry_t *dentry);
-+extern int nondir_unmod_to_del(dentry_t *dentry);
-+
-+extern int dir_unmod_to_mod(dentry_t *dentry);
-+
-+/* rename specials */
-+extern int rename_directory(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry);
-+extern int rename_nondir(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry);
-+
-+/* misc stuff */
-+extern int mini_fo_tri_interpose(dentry_t *hidden_dentry,
-+ dentry_t *hidden_sto_dentry,
-+ dentry_t *dentry,
-+ super_block_t *sb, int flag);
-+
-+extern int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
-+ dentry_t *src_dentry, struct vfsmount *src_mnt);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd);
-+
-+extern int create_sto_nod(dentry_t *dentry, int mode, dev_t dev);
-+extern int create_sto_reg_file(dentry_t *dentry, int mode, struct nameidata *nd);
-+#else
-+extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode);
-+
-+extern int create_sto_nod(dentry_t *dentry, int mode, int dev);
-+extern int create_sto_reg_file(dentry_t *dentry, int mode);
-+#endif
-+
-+extern int create_sto_dir(dentry_t *dentry, int mode);
-+
-+extern int exists_in_storage(dentry_t *dentry);
-+extern int is_mini_fo_existant(dentry_t *dentry);
-+extern int get_neg_sto_dentry(dentry_t *dentry);
-+extern int build_sto_structure(dentry_t *dir, dentry_t *dentry);
-+extern int get_mini_fo_bpath(dentry_t *dentry, char **bpath, int *bpath_len);
-+extern dentry_t *bpath_walk(super_block_t *sb, char *bpath);
-+extern int bpath_put(dentry_t *dentry);
-+
-+/* check_mini_fo types functions */
-+extern int check_mini_fo_dentry(dentry_t *dentry);
-+extern int check_mini_fo_file(file_t *file);
-+extern int check_mini_fo_inode(inode_t *inode);
-+
-+/* General meta functions, can be called from outside of meta.c */
-+extern int meta_build_lists(dentry_t *dentry);
-+extern int meta_put_lists(dentry_t *dentry);
-+extern int __meta_put_lists(inode_t *inode);
-+
-+extern int meta_add_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int meta_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len);
-+
-+extern int meta_remove_r_entry(dentry_t *dentry, const char *name, int len);
-+
-+extern int meta_check_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int __meta_check_d_entry(inode_t *inode, const char *name, int len);
-+
-+extern char* meta_check_r_entry(dentry_t *dentry, const char *name, int len);
-+extern char* __meta_check_r_entry(inode_t *inode, const char *name, int len);
-+extern int meta_is_r_entry(dentry_t *dentry, const char *name, int len);
-+extern int __meta_is_r_entry(inode_t *inode, const char *name, int len);
-+
-+/* Specific meta functions, should be called only inside meta.c */
-+extern int __meta_put_d_list(inode_t *inode);
-+extern int __meta_put_r_list(inode_t *inode);
-+
-+extern int meta_list_add_d_entry(dentry_t *dentry,
-+ const char *name, int len);
-+extern int meta_list_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len);
-+
-+extern int meta_list_remove_r_entry(dentry_t *dentry,
-+ const char *name, int len);
-+
-+extern int __meta_list_remove_r_entry(inode_t *inode,
-+ const char *name, int len);
-+
-+extern int meta_write_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int meta_write_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len);
-+
-+extern int meta_sync_lists(dentry_t *dentry);
-+extern int meta_sync_d_list(dentry_t *dentry, int app_flag);
-+extern int meta_sync_r_list(dentry_t *dentry, int app_flag);
-+
-+/* ndl stuff */
-+extern int ndl_add_entry(struct readdir_data *rd, const char *name, int len);
-+extern void ndl_put_list(struct readdir_data *rd);
-+extern int ndl_check_entry(struct readdir_data *rd,
-+ const char *name, int len);
-+
-+
-+# define copy_inode_size(dst, src) \
-+ dst->i_size = src->i_size; \
-+ dst->i_blocks = src->i_blocks;
-+
-+static inline void
-+fist_copy_attr_atime(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_atime = src->i_atime;
-+}
-+static inline void
-+fist_copy_attr_times(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_atime = src->i_atime;
-+ dest->i_mtime = src->i_mtime;
-+ dest->i_ctime = src->i_ctime;
-+}
-+static inline void
-+fist_copy_attr_timesizes(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_atime = src->i_atime;
-+ dest->i_mtime = src->i_mtime;
-+ dest->i_ctime = src->i_ctime;
-+ copy_inode_size(dest, src);
-+}
-+static inline void
-+fist_copy_attr_all(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_mode = src->i_mode;
-+ dest->i_nlink = src->i_nlink;
-+ dest->i_uid = src->i_uid;
-+ dest->i_gid = src->i_gid;
-+ dest->i_rdev = src->i_rdev;
-+ dest->i_atime = src->i_atime;
-+ dest->i_mtime = src->i_mtime;
-+ dest->i_ctime = src->i_ctime;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+ dest->i_blksize = src->i_blksize;
-+#endif
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,12)
-+ dest->i_blkbits = src->i_blkbits;
-+# endif /* linux 2.4.12 and newer */
-+ copy_inode_size(dest, src);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ dest->i_attr_flags = src->i_attr_flags;
-+#else
-+ dest->i_flags = src->i_flags;
-+#endif
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+/* copied from linux/fs.h */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+static inline void double_lock(struct dentry *d1, struct dentry *d2)
-+{
-+ struct mutex *m1 = &d1->d_inode->i_mutex;
-+ struct mutex *m2 = &d2->d_inode->i_mutex;
-+ if (m1 != m2) {
-+ if ((unsigned long) m1 < (unsigned long) m2) {
-+ struct mutex *tmp = m2;
-+ m2 = m1; m1 = tmp;
-+ }
-+ mutex_lock(m1);
-+ }
-+ mutex_lock(m2);
-+}
-+
-+static inline void double_unlock(struct dentry *d1, struct dentry *d2)
-+{
-+ struct mutex *m1 = &d1->d_inode->i_mutex;
-+ struct mutex *m2 = &d2->d_inode->i_mutex;
-+ mutex_unlock(m1);
-+ if (m1 != m2)
-+ mutex_unlock(m2);
-+ dput(d1);
-+ dput(d2);
-+}
-+
-+#else
-+static inline void double_down(struct semaphore *s1, struct semaphore *s2)
-+{
-+ if (s1 != s2) {
-+ if ((unsigned long) s1 < (unsigned long) s2) {
-+ struct semaphore *tmp = s2;
-+ s2 = s1; s1 = tmp;
-+ }
-+ down(s1);
-+ }
-+ down(s2);
-+}
-+
-+static inline void double_up(struct semaphore *s1, struct semaphore *s2)
-+{
-+ up(s1);
-+ if (s1 != s2)
-+ up(s2);
-+}
-+
-+static inline void double_lock(struct dentry *d1, struct dentry *d2)
-+{
-+ double_down(&d1->d_inode->i_sem, &d2->d_inode->i_sem);
-+}
-+
-+static inline void double_unlock(struct dentry *d1, struct dentry *d2)
-+{
-+ double_up(&d1->d_inode->i_sem,&d2->d_inode->i_sem);
-+ dput(d1);
-+ dput(d2);
-+}
-+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) */
-+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
-+#endif /* __KERNEL__ */
-+
-+/*
-+ * Definitions for user and kernel code
-+ */
-+
-+/* ioctls */
-+
-+#endif /* not __MINI_FO_H_ */
---- /dev/null
-+++ b/fs/mini_fo/mini_fo-merge
-@@ -0,0 +1,180 @@
-+#!/bin/bash
-+#
-+# Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.de>
-+# 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.
-+#
-+
-+BASE=
-+STO=
-+HELP=
-+DRYRUN=
-+VERBOSE=
-+TMP="/tmp/"
-+META_NAME="META_dAfFgHE39ktF3HD2sr"
-+SKIP_DEL_LIST="skip-delete-list.mini_fo-merge"
-+
-+COMMAND=
-+exec_command()
-+{
-+ if [ x$DRYRUN == "xset" ]; then
-+ echo " would run: $COMMAND"
-+ elif ! [ x$DRYRUN == "xset" ]; then
-+ if [ x$VERBOSE == "xset" ]; then
-+ echo " running: $COMMAND"
-+ fi
-+ eval $COMMAND
-+ fi
-+}
-+
-+usage()
-+{
-+cat <<EOF
-+
-+USAGE: $0 -b <base dir> -s <storage dir>
-+Version 0.1
-+
-+This script merges the contents of a mini_fo storage file system back
-+to the base file system.
-+
-+!!! Warning: This will modify the base filesystem and can destroy data
-+ if used wrongly.
-+
-+Options:
-+ -b <base dir>
-+ the directory of the base file system.
-+
-+ -s <storage dir>
-+ the directory of the storage file system.
-+
-+ -d dry run, will not change anything and print the commands that
-+ would be executed.
-+
-+ -t tmp dir for storing temporary file. default: $TMP
-+
-+ -v show what operations are performed.
-+
-+ -h displays this message.
-+
-+EOF
-+}
-+
-+# parse parameters
-+while getopts hdvt:b:s: OPTS
-+ do
-+ case $OPTS in
-+ h) HELP="set";;
-+ d) DRYRUN="set";;
-+ v) VERBOSE="set";;
-+ b) BASE="$OPTARG";;
-+ s) STO="$OPTARG";;
-+ t) TMP="$OPTARG";;
-+ ?) usage
-+ exit 1;;
-+ esac
-+done
-+
-+if [ "x$HELP" == "xset" ]; then
-+ usage
-+ exit -1
-+fi
-+
-+if ! [ -d "$BASE" ] || ! [ -d "$STO" ]; then
-+ echo -e "$0:\n Error, -s and/or -b argument missing. type $0 -h for help."
-+ exit -1;
-+fi
-+
-+# get full paths
-+pushd $STO; STO=`pwd`; popd
-+pushd $BASE; BASE=`pwd`; popd
-+TMP=${TMP%/}
-+
-+
-+cat<<EOF
-+###############################################################################
-+# mini_fo-merge
-+#
-+# base dir: $BASE
-+# storage dir: $STO
-+# meta filename: $META_NAME
-+# dry run: $DRYRUN
-+# verbose: $VERBOSE
-+# tmp files: $TMP
-+###############################################################################
-+
-+EOF
-+
-+rm $TMP/$SKIP_DEL_LIST
-+
-+# first process all renamed dirs
-+echo "Merging renamed directories..."
-+pushd $STO &> /dev/null
-+find . -name $META_NAME -type f -print0 | xargs -0 -e grep -e '^R ' | tr -s ':R' ' ' | while read ENTRY; do
-+ echo "entry: $ENTRY"
-+ META_FILE=`echo $ENTRY | cut -d ' ' -f 1`
-+ OLD_B_DIR=`echo $ENTRY | cut -d ' ' -f 2 | sed -e 's/\///'`
-+ NEW_NAME=`echo $ENTRY | cut -d ' ' -f 3`
-+ NEW_B_DIR=`echo $META_FILE | sed -e "s/$META_NAME/$NEW_NAME/" | sed -e 's/^\.\///'`
-+ echo "META_FILE: $META_FILE"
-+ echo "OLD_B_DIR: $OLD_B_DIR"
-+ echo "NEW_NAME: $NEW_NAME"
-+ echo "NEW_B_DIR: $NEW_B_DIR"
-+
-+ pushd $BASE &> /dev/null
-+ # remove an existing dir in storage
-+ COMMAND="rm -rf $NEW_B_DIR"; exec_command
-+ COMMAND="cp -R $OLD_B_DIR $NEW_B_DIR"; exec_command
-+ echo ""
-+ popd &> /dev/null
-+
-+ # remember this dir to exclude it from deleting later
-+ echo $NEW_B_DIR >> $TMP/$SKIP_DEL_LIST
-+done
-+
-+# delete all whiteouted files from base
-+echo -e "\nDeleting whiteout'ed files from base file system..."
-+find . -name $META_NAME -type f -print0 | xargs -0 -e grep -e '^D ' | sed -e 's/:D//' | while read ENTRY; do
-+ META_FILE=`echo $ENTRY | cut -d ' ' -f 1`
-+ DEL_NAME=`echo $ENTRY | cut -d ' ' -f 2`
-+ DEL_FILE=`echo $META_FILE | sed -e "s/$META_NAME/$DEL_NAME/" | sed -e 's/^\.\///'`
-+ grep -x $DEL_FILE $TMP/$SKIP_DEL_LIST &> /dev/null
-+ if [ $? -ne 0 ]; then
-+ pushd $BASE &> /dev/null
-+ COMMAND="rm -rf $DEL_FILE"; exec_command
-+ popd &> /dev/null
-+ else
-+ echo " excluding: $DEL_FILE as in skip-del-list."
-+ fi
-+done
-+
-+# create all dirs and update permissions
-+echo -e "\nSetting up directory structures in base file system..."
-+find . -type d | sed -e 's/^\.\///' | while read DIR; do
-+ PERMS=`stat -c %a $DIR`
-+ DIR_UID=`stat -c %u $DIR`
-+ DIR_GID=`stat -c %g $DIR`
-+ pushd $BASE &> /dev/null
-+ if ! [ -d $DIR ]; then
-+ COMMAND="mkdir -p $DIR"; exec_command
-+ fi
-+ COMMAND="chmod $PERMS $DIR"; exec_command
-+ COMMAND="chown $DIR_UID:$DIR_GID $DIR"; exec_command
-+ popd &> /dev/null
-+done
-+
-+# merge all non-directory files
-+echo -e "\nMerging all non-directory files...."
-+for i in b c p f l s; do
-+ find . -type $i | sed -e 's/^\.\///' | grep -v "$META_NAME" | while read FILE; do
-+ pushd $BASE #&> /dev/null
-+ COMMAND="cp -df $STO/$FILE $BASE/$FILE"; exec_command
-+ popd &> /dev/null
-+ done
-+done
-+popd &> /dev/null
-+
-+#rm $TMP/$SKIP_DEL_LIST
-+
-+echo "Done!"
---- /dev/null
-+++ b/fs/mini_fo/mini_fo-overlay
-@@ -0,0 +1,130 @@
-+#!/bin/bash
-+#
-+# Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.de>
-+# 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.
-+#
-+
-+HELP=
-+SUFF=
-+MNTP=
-+MNT_DIR="/mnt"
-+STO=
-+STO_DIR="/tmp"
-+BASE=
-+
-+usage()
-+{
-+cat <<EOF
-+
-+Usage: $0 [-s suffix] [-d sto_dir_dir] [-m mount point] base_dir
-+Version 0.1
-+
-+This script overlays the given base directory using the mini_fo file
-+system. If only the base directory base_dir is given, $0
-+will use a storage directory called "sto-<base_dir_name>" in $STO_DIR,
-+and mount point "mini_fo-<base_dir_dir>" in $MNT_DIR.
-+
-+Options:
-+ -s <suffix>
-+ add given suffix to storage directory and the mount
-+ point. This is usefull for overlaying one base directory
-+ several times and avoiding conflicts with storage directory
-+ names and mount points.
-+
-+ -d <sto_dir_dir>
-+ change the directory in which the storage directory will be
-+ created (default is currently "$STO_DIR".
-+
-+ -m <mount point>
-+ use an alternative directory to create the mini_fo
-+ mountpoint (default is currently "$MNT_DIR".
-+
-+ -h displays this message.
-+
-+EOF
-+exit 1;
-+}
-+
-+while getopts hm:s:d: OPTS
-+ do
-+ case $OPTS in
-+ s) SUFF="$OPTARG";;
-+ d) STO_DIR="$OPTARG";;
-+ m) MNT_DIR="$OPTARG";;
-+ h) HELP="set";;
-+ ?) usage
-+ exit 1;;
-+ esac
-+done
-+shift $(($OPTIND - 1))
-+
-+BASE="$1"
-+
-+if [ "x$HELP" == "xset" ]; then
-+ usage
-+ exit -1
-+fi
-+
-+# fix suffix
-+if [ "x$SUFF" != "x" ]; then
-+ SUFF="-$SUFF"
-+fi
-+
-+# kill trailing slashes
-+MNT_DIR=${MNT_DIR%/}
-+STO_DIR=${STO_DIR%/}
-+BASE=${BASE%/}
-+
-+
-+if ! [ -d "$BASE" ]; then
-+ echo "invalid base dir $BASE, run $0 -h for help."
-+ exit -1
-+fi
-+
-+# check opts
-+if ! [ -d "$MNT_DIR" ]; then
-+ echo "invalid mount dir $MNT_DIR, run $0 -h for help."
-+ exit -1
-+fi
-+
-+if ! [ -d "$STO_DIR" ]; then
-+ echo "invalid sto_dir_dir $STO_DIR, run $0 -h for help."
-+ exit -1
-+fi
-+
-+MNTP="$MNT_DIR/mini_fo-`basename $BASE`$SUFF"
-+STO="$STO_DIR/sto-`basename $BASE`$SUFF"
-+
-+# create the mount point if it doesn't exist
-+mkdir -p $MNTP
-+if [ $? -ne 0 ]; then
-+ echo "Error, failed to create mount point $MNTP"
-+fi
-+
-+mkdir -p $STO
-+if [ $? -ne 0 ]; then
-+ echo "Error, failed to create storage dir $STO"
-+fi
-+
-+# check if fs is already mounted
-+mount | grep mini_fo | grep $MNTP &> /dev/null
-+if [ $? -eq 0 ]; then
-+ echo "Error, existing mini_fo mount at $MNTP."
-+ exit -1
-+fi
-+
-+mount | grep mini_fo | grep $STO &> /dev/null
-+if [ $? -eq 0 ]; then
-+ echo "Error, $STO seems to be used already."
-+ exit -1
-+fi
-+
-+# mount
-+mount -t mini_fo -o base=$BASE,sto=$STO $BASE $MNTP
-+
-+if [ $? -ne 0 ]; then
-+ echo "Error, mounting failed, maybe no permisson to mount?"
-+fi
---- /dev/null
-+++ b/fs/mini_fo/mmap.c
-@@ -0,0 +1,637 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+#ifdef FIST_COUNT_WRITES
-+/* for counting writes in the middle vs. regular writes */
-+unsigned long count_writes = 0, count_writes_middle = 0;
-+#endif /* FIST_COUNT_WRITES */
-+
-+/* forward declaration of commit write and prepare write */
-+STATIC int mini_fo_commit_write(file_t *file, page_t *page, unsigned from, unsigned to);
-+STATIC int mini_fo_prepare_write(file_t *file, page_t *page, unsigned from, unsigned to);
-+
-+
-+/*
-+ * Function for handling creation of holes when lseek-ing past the
-+ * end of the file and then writing some data.
-+ */
-+int
-+mini_fo_fill_zeros(file_t* file, page_t *page, unsigned from)
-+{
-+ int err = 0;
-+ dentry_t *dentry = file->f_dentry;
-+ inode_t *inode = dentry->d_inode;
-+ page_t *tmp_page;
-+ int index;
-+
-+ print_entry_location();
-+
-+ for (index = inode->i_size >> PAGE_CACHE_SHIFT; index < page->index; index++) {
-+ tmp_page = mini_fo_get1page(file, index);
-+ if (IS_ERR(tmp_page)) {
-+ err = PTR_ERR(tmp_page);
-+ goto out;
-+ }
-+
-+ /*
-+ * zero out rest of the contents of the page between the appropriate
-+ * offsets.
-+ */
-+ memset((char*)page_address(tmp_page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, PAGE_CACHE_SIZE - (inode->i_size & ~PAGE_CACHE_MASK));
-+
-+ if (! (err = mini_fo_prepare_write(file, tmp_page, 0, PAGE_CACHE_SIZE)))
-+ err = mini_fo_commit_write(file, tmp_page, 0, PAGE_CACHE_SIZE);
-+
-+ page_cache_release(tmp_page);
-+ if (err < 0)
-+ goto out;
-+ if (current->need_resched)
-+ schedule();
-+ }
-+
-+ /* zero out appropriate parts of last page */
-+
-+ /*
-+ * if the encoding type is block, then adjust the 'from' (where the
-+ * zeroing will start) offset appropriately
-+ */
-+ from = from & (~(FIST_ENCODING_BLOCKSIZE - 1));
-+
-+ if ((from - (inode->i_size & ~PAGE_CACHE_MASK)) > 0) {
-+
-+ memset((char*)page_address(page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, from - (inode->i_size & ~PAGE_CACHE_MASK));
-+ if (! (err = mini_fo_prepare_write(file, page, 0, PAGE_CACHE_SIZE)))
-+ err = mini_fo_commit_write(file, page, 0, PAGE_CACHE_SIZE);
-+
-+ if (err < 0)
-+ goto out;
-+ if (current->need_resched)
-+ schedule();
-+ }
-+
-+ out:
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_writepage(page_t *page)
-+{
-+ int err = -EIO;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ page_t *hidden_page;
-+ char *kaddr, *hidden_kaddr;
-+
-+ print_entry_location();
-+
-+ inode = page->mapping->host;
-+ hidden_inode = itohi(inode);
-+
-+ /*
-+ * writepage is called when shared mmap'ed files need to write
-+ * their pages, while prepare/commit_write are called from the
-+ * non-paged write() interface. (However, in 2.3 the two interfaces
-+ * share the same cache, while in 2.2 they didn't.)
-+ *
-+ * So we pretty much have to duplicate much of what commit_write does.
-+ */
-+
-+ /* find lower page (returns a locked page) */
-+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+ if (!hidden_page)
-+ goto out;
-+
-+ /* get page address, and encode it */
-+ kaddr = (char *) kmap(page);
-+ hidden_kaddr = (char*) kmap(hidden_page);
-+ mini_fo_encode_block(kaddr, hidden_kaddr, PAGE_CACHE_SIZE, inode, inode->i_sb, page->index);
-+ /* if encode_block could fail, then return error */
-+ kunmap(page);
-+ kunmap(hidden_page);
-+
-+ /* call lower writepage (expects locked page) */
-+ err = hidden_inode->i_mapping->a_ops->writepage(hidden_page);
-+
-+ /*
-+ * update mtime and ctime of lower level file system
-+ * mini_fo' mtime and ctime are updated by generic_file_write
-+ */
-+ hidden_inode->i_mtime = hidden_inode->i_ctime = CURRENT_TIME;
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,1)
-+ UnlockPage(hidden_page); /* b/c grab_cache_page locked it */
-+# endif /* kernel older than 2.4.1 */
-+ page_cache_release(hidden_page); /* b/c grab_cache_page increased refcnt */
-+
-+ if (err)
-+ ClearPageUptodate(page);
-+ else
-+ SetPageUptodate(page);
-+ out:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,1)
-+ UnlockPage(page);
-+# endif /* kernel 2.4.1 and newer */
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+/*
-+ * get one page from cache or lower f/s, return error otherwise.
-+ * returns unlocked, up-to-date page (if ok), with increased refcnt.
-+ */
-+page_t *
-+mini_fo_get1page(file_t *file, int index)
-+{
-+ page_t *page;
-+ dentry_t *dentry;
-+ inode_t *inode;
-+ struct address_space *mapping;
-+ int err;
-+
-+ print_entry_location();
-+
-+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+ inode = dentry->d_inode;
-+ mapping = inode->i_mapping;
-+
-+ fist_dprint(8, "%s: read page index %d pid %d\n", __FUNCTION__, index, current->pid);
-+ if (index < 0) {
-+ printk("%s BUG: index=%d\n", __FUNCTION__, index);
-+ page = ERR_PTR(-EIO);
-+ goto out;
-+ }
-+ page = read_cache_page(mapping,
-+ index,
-+ (filler_t *) mapping->a_ops->readpage,
-+ (void *) file);
-+ if (IS_ERR(page))
-+ goto out;
-+ wait_on_page(page);
-+ if (!Page_Uptodate(page)) {
-+ lock_page(page);
-+ err = mapping->a_ops->readpage(file, page);
-+ if (err) {
-+ page = ERR_PTR(err);
-+ goto out;
-+ }
-+ wait_on_page(page);
-+ if (!Page_Uptodate(page)) {
-+ page = ERR_PTR(-EIO);
-+ goto out;
-+ }
-+ }
-+
-+ out:
-+ print_exit_pointer(page);
-+ return page;
-+}
-+
-+
-+/*
-+ * get one page from cache or lower f/s, return error otherwise.
-+ * similar to get1page, but doesn't guarantee that it will return
-+ * an unlocked page.
-+ */
-+page_t *
-+mini_fo_get1page_cached(file_t *file, int index)
-+{
-+ page_t *page;
-+ dentry_t *dentry;
-+ inode_t *inode;
-+ struct address_space *mapping;
-+ int err;
-+
-+ print_entry_location();
-+
-+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+ inode = dentry->d_inode;
-+ mapping = inode->i_mapping;
-+
-+ fist_dprint(8, "%s: read page index %d pid %d\n", __FUNCTION__, index, current->pid);
-+ if (index < 0) {
-+ printk("%s BUG: index=%d\n", __FUNCTION__, index);
-+ page = ERR_PTR(-EIO);
-+ goto out;
-+ }
-+ page = read_cache_page(mapping,
-+ index,
-+ (filler_t *) mapping->a_ops->readpage,
-+ (void *) file);
-+ if (IS_ERR(page))
-+ goto out;
-+
-+ out:
-+ print_exit_pointer(page);
-+ return page;
-+}
-+
-+
-+/*
-+ * readpage is called from generic_page_read and the fault handler.
-+ * If your file system uses generic_page_read for the read op, it
-+ * must implement readpage.
-+ *
-+ * Readpage expects a locked page, and must unlock it.
-+ */
-+STATIC int
-+mini_fo_do_readpage(file_t *file, page_t *page)
-+{
-+ int err = -EIO;
-+ dentry_t *dentry;
-+ file_t *hidden_file = NULL;
-+ dentry_t *hidden_dentry;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ char *page_data;
-+ page_t *hidden_page;
-+ char *hidden_page_data;
-+ int real_size;
-+
-+ print_entry_location();
-+
-+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+ if (ftopd(file) != NULL)
-+ hidden_file = ftohf(file);
-+ hidden_dentry = dtohd(dentry);
-+ inode = dentry->d_inode;
-+ hidden_inode = itohi(inode);
-+
-+ fist_dprint(7, "%s: requesting page %d from file %s\n", __FUNCTION__, page->index, dentry->d_name.name);
-+
-+ MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages);
-+ MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages);
-+ FOR_EACH_PAGE
-+ CURRENT_HIDDEN_PAGE = NULL;
-+
-+ /* find lower page (returns a locked page) */
-+ FOR_EACH_PAGE {
-+ fist_dprint(8, "%s: Current page index = %d\n", __FUNCTION__, CURRENT_HIDDEN_PAGEINDEX);
-+ CURRENT_HIDDEN_PAGE = read_cache_page(hidden_inode->i_mapping,
-+ CURRENT_HIDDEN_PAGEINDEX,
-+ (filler_t *) hidden_inode->i_mapping->a_ops->readpage,
-+ (void *) hidden_file);
-+ if (IS_ERR(CURRENT_HIDDEN_PAGE)) {
-+ err = PTR_ERR(CURRENT_HIDDEN_PAGE);
-+ CURRENT_HIDDEN_PAGE = NULL;
-+ goto out_release;
-+ }
-+ }
-+
-+ /*
-+ * wait for the page data to show up
-+ * (signaled by readpage as unlocking the page)
-+ */
-+ FOR_EACH_PAGE {
-+ wait_on_page(CURRENT_HIDDEN_PAGE);
-+ if (!Page_Uptodate(CURRENT_HIDDEN_PAGE)) {
-+ /*
-+ * call readpage() again if we returned from wait_on_page with a
-+ * page that's not up-to-date; that can happen when a partial
-+ * page has a few buffers which are ok, but not the whole
-+ * page.
-+ */
-+ lock_page(CURRENT_HIDDEN_PAGE);
-+ err = hidden_inode->i_mapping->a_ops->readpage(hidden_file,
-+ CURRENT_HIDDEN_PAGE);
-+ if (err) {
-+ CURRENT_HIDDEN_PAGE = NULL;
-+ goto out_release;
-+ }
-+ wait_on_page(CURRENT_HIDDEN_PAGE);
-+ if (!Page_Uptodate(CURRENT_HIDDEN_PAGE)) {
-+ err = -EIO;
-+ goto out_release;
-+ }
-+ }
-+ }
-+
-+ /* map pages, get their addresses */
-+ page_data = (char *) kmap(page);
-+ FOR_EACH_PAGE
-+ CURRENT_HIDDEN_PAGEDATA = (char *) kmap(CURRENT_HIDDEN_PAGE);
-+
-+ /* if decode_block could fail, then return error */
-+ err = 0;
-+ real_size = hidden_inode->i_size - (page->index << PAGE_CACHE_SHIFT);
-+ if (real_size <= 0)
-+ memset(page_data, 0, PAGE_CACHE_SIZE);
-+ else if (real_size < PAGE_CACHE_SIZE) {
-+ mini_fo_decode_block(hidden_page_data, page_data, real_size, inode, inode->i_sb, page->index);
-+ memset(page_data + real_size, 0, PAGE_CACHE_SIZE - real_size);
-+ } else
-+ mini_fo_decode_block(hidden_page_data, page_data, PAGE_CACHE_SIZE, inode, inode->i_sb, page->index);
-+
-+ FOR_EACH_PAGE
-+ kunmap(CURRENT_HIDDEN_PAGE);
-+ kunmap(page);
-+
-+ out_release:
-+ FOR_EACH_PAGE
-+ if (CURRENT_HIDDEN_PAGE)
-+ page_cache_release(CURRENT_HIDDEN_PAGE); /* undo read_cache_page */
-+
-+ FREE_PAGE_POINTERS(hidden_pages, num_hidden_pages);
-+ FREE_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages);
-+
-+ out:
-+ if (err == 0)
-+ SetPageUptodate(page);
-+ else
-+ ClearPageUptodate(page);
-+
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_readpage(file_t *file, page_t *page)
-+{
-+ int err;
-+ print_entry_location();
-+
-+ err = mini_fo_do_readpage(file, page);
-+
-+ /*
-+ * we have to unlock our page, b/c we _might_ have gotten a locked page.
-+ * but we no longer have to wakeup on our page here, b/c UnlockPage does
-+ * it
-+ */
-+ UnlockPage(page);
-+
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_prepare_write(file_t *file, page_t *page, unsigned from, unsigned to)
-+{
-+ int err = 0;
-+
-+ print_entry_location();
-+
-+ /*
-+ * we call kmap(page) only here, and do the kunmap
-+ * and the actual downcalls, including unlockpage and uncache
-+ * in commit_write.
-+ */
-+ kmap(page);
-+
-+ /* fast path for whole page writes */
-+ if (from == 0 && to == PAGE_CACHE_SIZE)
-+ goto out;
-+ /* read the page to "revalidate" our data */
-+ /* call the helper function which doesn't unlock the page */
-+ if (!Page_Uptodate(page))
-+ err = mini_fo_do_readpage(file, page);
-+
-+ out:
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_commit_write(file_t *file, page_t *page, unsigned from, unsigned to)
-+{
-+ int err = -ENOMEM;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ page_t *hidden_page;
-+ file_t *hidden_file = NULL;
-+ loff_t pos;
-+ unsigned bytes = to - from;
-+ unsigned hidden_from, hidden_to, hidden_bytes;
-+
-+ print_entry_location();
-+
-+ inode = page->mapping->host; /* CPW: Moved below print_entry_location */
-+ hidden_inode = itohi(inode);
-+
-+ ASSERT(file != NULL);
-+ /*
-+ * here we have a kmapped page, with data from the user copied
-+ * into it. we need to encode_block it, and then call the lower
-+ * commit_write. We also need to simulate same behavior of
-+ * generic_file_write, and call prepare_write on the lower f/s first.
-+ */
-+#ifdef FIST_COUNT_WRITES
-+ count_writes++;
-+# endif /* FIST_COUNT_WRITES */
-+
-+ /* this is append and/or extend -- we can't have holes so fill them in */
-+ if (page->index > (hidden_inode->i_size >> PAGE_CACHE_SHIFT)) {
-+ page_t *tmp_page;
-+ int index;
-+ for (index = hidden_inode->i_size >> PAGE_CACHE_SHIFT; index < page->index; index++) {
-+ tmp_page = mini_fo_get1page(file, index);
-+ if (IS_ERR(tmp_page)) {
-+ err = PTR_ERR(tmp_page);
-+ goto out;
-+ }
-+ /* zero out the contents of the page at the appropriate offsets */
-+ memset((char*)page_address(tmp_page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, PAGE_CACHE_SIZE - (inode->i_size & ~PAGE_CACHE_MASK));
-+ if (!(err = mini_fo_prepare_write(file, tmp_page, 0, PAGE_CACHE_SIZE)))
-+ err = mini_fo_commit_write(file, tmp_page, 0, PAGE_CACHE_SIZE);
-+ page_cache_release(tmp_page);
-+ if (err < 0)
-+ goto out;
-+ if (current->need_resched)
-+ schedule();
-+ }
-+ }
-+
-+ if (ftopd(file) != NULL)
-+ hidden_file = ftohf(file);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_inode->i_mutex);
-+#else
-+ down(&hidden_inode->i_sem);
-+#endif
-+ /* find lower page (returns a locked page) */
-+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+ if (!hidden_page)
-+ goto out;
-+
-+#if FIST_ENCODING_BLOCKSIZE > 1
-+# error encoding_blocksize greater than 1 is not yet supported
-+# endif /* FIST_ENCODING_BLOCKSIZE > 1 */
-+
-+ hidden_from = from & (~(FIST_ENCODING_BLOCKSIZE - 1));
-+ hidden_to = ((to + FIST_ENCODING_BLOCKSIZE - 1) & (~(FIST_ENCODING_BLOCKSIZE - 1)));
-+ if ((page->index << PAGE_CACHE_SHIFT) + to > hidden_inode->i_size) {
-+
-+ /*
-+ * if this call to commit_write had introduced holes and the code
-+ * for handling holes was invoked, then the beginning of this page
-+ * must be zeroed out
-+ * zero out bytes from 'size_of_file%pagesize' to 'from'.
-+ */
-+ if ((hidden_from - (inode->i_size & ~PAGE_CACHE_MASK)) > 0)
-+ memset((char*)page_address(page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, hidden_from - (inode->i_size & ~PAGE_CACHE_MASK));
-+
-+ }
-+ hidden_bytes = hidden_to - hidden_from;
-+
-+ /* call lower prepare_write */
-+ err = -EINVAL;
-+ if (hidden_inode->i_mapping &&
-+ hidden_inode->i_mapping->a_ops &&
-+ hidden_inode->i_mapping->a_ops->prepare_write)
-+ err = hidden_inode->i_mapping->a_ops->prepare_write(hidden_file,
-+ hidden_page,
-+ hidden_from,
-+ hidden_to);
-+ if (err)
-+ /* don't leave locked pages behind, esp. on an ENOSPC */
-+ goto out_unlock;
-+
-+ fist_dprint(8, "%s: encoding %d bytes\n", __FUNCTION__, hidden_bytes);
-+ mini_fo_encode_block((char *) page_address(page) + hidden_from, (char*) page_address(hidden_page) + hidden_from, hidden_bytes, inode, inode->i_sb, page->index);
-+ /* if encode_block could fail, then goto unlock and return error */
-+
-+ /* call lower commit_write */
-+ err = hidden_inode->i_mapping->a_ops->commit_write(hidden_file,
-+ hidden_page,
-+ hidden_from,
-+ hidden_to);
-+
-+ if (err < 0)
-+ goto out_unlock;
-+
-+ err = bytes; /* convert error to no. of bytes */
-+
-+ inode->i_blocks = hidden_inode->i_blocks;
-+ /* we may have to update i_size */
-+ pos = (page->index << PAGE_CACHE_SHIFT) + to;
-+ if (pos > inode->i_size)
-+ inode->i_size = pos;
-+
-+ /*
-+ * update mtime and ctime of lower level file system
-+ * mini_fo' mtime and ctime are updated by generic_file_write
-+ */
-+ hidden_inode->i_mtime = hidden_inode->i_ctime = CURRENT_TIME;
-+
-+ mark_inode_dirty_sync(inode);
-+
-+ out_unlock:
-+ UnlockPage(hidden_page);
-+ page_cache_release(hidden_page);
-+ kunmap(page); /* kmap was done in prepare_write */
-+ out:
-+ /* we must set our page as up-to-date */
-+ if (err < 0)
-+ ClearPageUptodate(page);
-+ else
-+ SetPageUptodate(page);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_inode->i_mutex);
-+#else
-+ up(&hidden_inode->i_sem);
-+#endif
-+ print_exit_status(err);
-+ return err; /* assume all is ok */
-+}
-+
-+
-+STATIC int
-+mini_fo_bmap(struct address_space *mapping, long block)
-+{
-+ int err = 0;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+
-+ print_entry_location();
-+
-+ inode = (inode_t *) mapping->host;
-+ hidden_inode = itohi(inode);
-+
-+ if (hidden_inode->i_mapping->a_ops->bmap)
-+ err = hidden_inode->i_mapping->a_ops->bmap(hidden_inode->i_mapping, block);
-+ print_exit_location();
-+ return err;
-+}
-+
-+
-+/*
-+ * This function is copied verbatim from mm/filemap.c.
-+ * XXX: It should be simply moved to some header file instead -- bug Al about it!
-+ */
-+static inline int sync_page(struct page *page)
-+{
-+ struct address_space *mapping = page->mapping;
-+
-+ if (mapping && mapping->a_ops && mapping->a_ops->sync_page)
-+ return mapping->a_ops->sync_page(page);
-+ return 0;
-+}
-+
-+
-+/*
-+ * XXX: we may not need this function if not FIST_FILTER_DATA.
-+ * FIXME: for FIST_FILTER_SCA, get all lower pages and sync them each.
-+ */
-+STATIC int
-+mini_fo_sync_page(page_t *page)
-+{
-+ int err = 0;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ page_t *hidden_page;
-+
-+ print_entry_location();
-+
-+ inode = page->mapping->host; /* CPW: Moved below print_entry_location */
-+ hidden_inode = itohi(inode);
-+
-+ /* find lower page (returns a locked page) */
-+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+ if (!hidden_page)
-+ goto out;
-+
-+ err = sync_page(hidden_page);
-+
-+ UnlockPage(hidden_page); /* b/c grab_cache_page locked it */
-+ page_cache_release(hidden_page); /* b/c grab_cache_page increased refcnt */
-+
-+ out:
-+ print_exit_status(err);
-+ return err;
-+}
---- /dev/null
-+++ b/fs/mini_fo/README
-@@ -0,0 +1,163 @@
-+README for the mini_fo overlay file system
-+=========================================
-+
-+
-+WHAT IS MINI_FO?
-+----------------
-+
-+mini_fo is a virtual kernel file system that can make read-only
-+file systems writable. This is done by redirecting modifying operations
-+to a writeable location called "storage directory", and leaving the
-+original data in the "base directory" untouched. When reading, the
-+file system merges the modifed and original data so that only the
-+newest versions will appear. This occurs transparently to the user,
-+who can access the data like on any other read-write file system.
-+
-+Base and storage directories may be located on the same or on
-+different partitions and may be of different file system types. While
-+the storage directory obviously needs to be writable, the base may or
-+may not be writable, what doesn't matter as it will no be modified
-+anyway.
-+
-+
-+WHAT IS GOOD FOR?
-+-----------------
-+
-+The primary purpose of the mini_fo file system is to allow easy
-+software updates to embedded systems, that often store their root
-+file system in a read-only flash file system, but there are many
-+more as for example sandboxing, or for allowing live-cds to
-+permanently store information.
-+
-+
-+BUILDING
-+--------
-+This should be simple. Adjust the Makefile to point to the correct
-+kernel headers you want to build the module for. Then:
-+
-+ # make
-+
-+should build "mini_fo.o" for a 2.4 kernel or "mini_fo.ko" for a 2.6
-+kernel.
-+
-+If you are building the module for you current kernel, you can install
-+the module (as root):
-+
-+ # make install
-+
-+or uninstall with
-+
-+ # make uninstall
-+
-+
-+USING THE FILE SYSTEM
-+--------------------
-+
-+the general mount syntax is:
-+
-+ mount -t mini_fo -o base=<base directory>,sto=<storage directory>\
-+ <base directory> <mount point>
-+
-+Example:
-+
-+You have mounted a cdrom to /mnt/cdrom and want to modifiy some files
-+on it:
-+
-+load the module (as root)
-+
-+ # insmod mini_fo.o for a 2.4 kernel or
-+
-+ # insmod mini_fo.ko for a 2.6 kernel
-+
-+
-+create a storage dir in tmp and a mountpoint for mini_fo:
-+
-+ # mkdir /tmp/sto
-+ # mkdir /mnt/mini_fo
-+
-+and mount the mini_fo file system:
-+
-+ # mount -t mini_fo -o base=/mnt/cdrom,sto=/tmp/sto /mnt/cdrom /mnt/mini_fo
-+
-+
-+Now the data stored on the cd can be accessed via the mini_fo
-+mountpoint just like any read-write file system, files can be modified
-+and deleted, new ones can be created and so on. When done unmount the
-+file system:
-+
-+ # unmount /mnt/mini_fo
-+
-+Note that if the file system is mounted again using the same storage
-+file system, of course it will appear in the modified state again. If
-+you remount it using an new empty storage directory, it will be
-+unmodified. Therefore by executing:
-+
-+ # cd /tmp/sto
-+ # rm -rf *
-+
-+you can nuke all the changes you made to the original file system. But
-+ remember NEVER do this while the mini_fo file system is mounted!
-+
-+
-+Alternatively you can use the mini_fo-overlay bash script, that
-+simplifies managing mini_fo mounts. See TOOLS Section.
-+
-+
-+TOOLS
-+-----
-+
-+mini_fo-merge (experimental):
-+
-+This is a bash script that will merge changes contained in the storage
-+directory back to the base directory. This allows mini_fo to function
-+as a cache file system by overlaying a slow (network, ...) file system
-+and using a fast (ramdisk, ...) as storage. When done, changes can be
-+merged back to the (slow) base with mini_fo-merge. See "mini_fo-merge
-+-h" for details.
-+
-+It can be usefull for merging changes back after a successfull test
-+(patches, software updates...)
-+
-+
-+mini_fo-overlay:
-+
-+This bash script simplifies managing one or more mini_fo mounts. For
-+overlaying a directory called "basedir1", you can just call:
-+
-+ # mini_fo-overlay basedir1
-+
-+This will mount mini_fo with "basedir1" as base, "/tmp/sto-basedir1/"
-+as storage to "/mnt/mini_fo-basedir1/". It has more options though,
-+type "mini_fo-overlay -h" for details.
-+
-+
-+DOCUMENTATION, REPORTING BUGS, GETTING HELP
-+-------------------------------------------
-+
-+Please visit the mini_fo project page at:
-+
-+http://www.denx.de/twiki/bin/view/Know/MiniFOHome
-+
-+
-+WARNINGS
-+--------
-+
-+Never modify the base or the storage directorys while the mini_fo
-+file system is mounted, or you might crash you system. Simply accessing
-+and reading should not cause any trouble.
-+
-+Exporting a mini_fo mount point via NFS has not been tested, and may
-+or may not work.
-+
-+Check the RELEASE_NOTES for details on bugs and features.
-+
-+
-+
-+Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+
-+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.
-+
-+
---- /dev/null
-+++ b/fs/mini_fo/RELEASE_NOTES
-@@ -0,0 +1,111 @@
-+Release: mini_fo-0.6.1 (v0-6-1)
-+Date: 21.09.2005
-+
-+
-+Changes:
-+--------
-+v0-6-1:
-+
-+- bugfixes (see ChangeLog)
-+
-+- two helper scripts "mini_fo_merge" and "mini_fo_overlay" (see
-+ README for details).
-+
-+v0-6-0:
-+
-+- Support for 2.4 and 2.6 (see Makefile)
-+
-+- Partial hard link support (creating works as expected, but already
-+ existing links in the base file system will be treated as if they
-+ were individual files).
-+
-+- Various bugfixes and cleanups.
-+
-+
-+v0-6-0-pre1:
-+
-+- This is mini_fo-0-6-0-pre1! This release is a complete rewrite of
-+ many vital mini_fo parts such as the old whiteout list code which
-+ has been replaced by the new META subsystem.
-+
-+- Light weight directory renaming implemented. This means if a
-+ directory is renamed via the mini_fo filesystem this will no longer
-+ result in a complete copy in storage, instead only one empty
-+ directory will be created. All base filed contained in the original
-+ directory stay there until modified.
-+
-+- Special files (creating, renaming, deleting etc.) now working.
-+
-+- Many bugfixes and cleanup, mini_fo is now a lot more stable.
-+
-+
-+v0-5-10:
-+
-+- Final release of the 0-5-* versions. Next will be a complete rewrite
-+ of many features. This release contains several bugfixes related to
-+ directory renaming.
-+
-+
-+v0-5-10-pre6:
-+
-+- Lots of cleanup and several bugfixes related to directory deleting
-+
-+- Directory renaming suddenly works, what is most likely due to the
-+ fact tha that "mv" is smart: if the classic rename doesn't work it
-+ will assume that source and target file are on different fs and will
-+ copy the directory and try to remove the source directory. Until
-+ directory removing wasn't implemented, it would fail to do this and
-+ rollback.
-+ So, directory renaming works for now, but it doesn't yet do what you
-+ would expect from a overlay fs, so use with care.
-+
-+
-+v0-5-10-pre5:
-+
-+- implemented directory deleting
-+- made parsing of mount options more stable
-+- New format of mount options! (See README)
-+- I can't reproduce the unknown panic with 2.4.25 anymore, so I'll
-+ happily assume it never existed!
-+
-+
-+Implemented features:
-+---------------------
-+
-+- creating hard links (see BUGS on already existing hard links)
-+- lightweight directory renaming
-+- renaming device files, pipes, sockets, etc.
-+- creating, renaming, deleting of special files
-+- deleting directorys
-+- general directory reading (simple "ls" )
-+- creating files in existing directorys
-+- creating directorys
-+- renaming files.
-+- reading and writing files (involves opening)
-+- appending to files (creates copy in storage)
-+- deleting files
-+- llseek works too, what allows editors to work
-+- persistency (a deleted file stay deleted over remounts)
-+- use of symbolic links
-+- creating of device files
-+
-+
-+Not (yet) implemented features:
-+-------------------------------
-+
-+- full hard link support.
-+
-+
-+
-+BUGS:
-+-----
-+
-+Hard links in the base file system will be treated as individual
-+files, not as links to one inode.
-+
-+The main problem with hard links isn't allowing to create them, but
-+their pure existence. If you modify a base hard link, the changes made
-+will only show up on this link, the other link will remain in the
-+original state. I hope to fix this someday. Please note that this does
-+not effect the special hard links '.' and '..', that are handled
-+seperately by the lower fs.
---- /dev/null
-+++ b/fs/mini_fo/state.c
-@@ -0,0 +1,620 @@
-+/*
-+ * Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+/* create the storage file, setup new states */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+int create_sto_reg_file(dentry_t *dentry, int mode, struct nameidata *nd)
-+#else
-+int create_sto_reg_file(dentry_t *dentry, int mode)
-+#endif
-+{
-+ int err = 0;
-+ inode_t *dir;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ if(exists_in_storage(dentry)) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: wrong type or state.\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR getting neg. sto dentry.\n");
-+ goto out;
-+ }
-+
-+ dir = dentry->d_parent->d_inode;
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* lock parent */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ mode, nd);
-+#else
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ mode);
-+#endif
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR creating sto file.\n");
-+ goto out_lock;
-+ }
-+
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR creating sto file [2].\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+
-+ /* interpose the new inode */
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == NON_EXISTANT) {
-+ dtost(dentry) = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == UNMODIFIED) {
-+ dtost(dentry) = MODIFIED;
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ }
-+ fist_copy_attr_timesizes(dentry->d_parent->d_inode,
-+ hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+/* create the sto dir, setup states */
-+int create_sto_dir(dentry_t *dentry, int mode)
-+{
-+ int err = 0;
-+ inode_t *dir;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ /* had to take the "!S_ISDIR(mode))" check out, because it failed */
-+ if(exists_in_storage(dentry)) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: wrong type or state.\\
-+n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ err = get_neg_sto_dentry(dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ dir = dentry->d_parent->d_inode;
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+ err = vfs_mkdir(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ mode);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR creating sto dir.\n");
-+ goto out_lock;
-+ }
-+
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR creating sto dir [2].\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+
-+ /* interpose the new inode */
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtopd(dentry)->state == NON_EXISTANT) {
-+ dtopd(dentry)->state = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtopd(dentry)->state == UNMODIFIED) {
-+ dtopd(dentry)->state = MODIFIED;
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR, invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ }
-+
-+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ /* initalize the wol list */
-+ itopd(dentry->d_inode)->deleted_list_size = -1;
-+ itopd(dentry->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(dentry);
-+
-+
-+ out_lock:
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+int create_sto_nod(dentry_t *dentry, int mode, dev_t dev)
-+#else
-+int create_sto_nod(dentry_t *dentry, int mode, int dev)
-+#endif
-+{
-+ int err = 0;
-+ inode_t *dir;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ if(exists_in_storage(dentry)) {
-+ err = -EEXIST;
-+ goto out;
-+ }
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_nod: ERROR getting neg. sto dentry.\n");
-+ goto out;
-+ }
-+
-+ dir = dentry->d_parent->d_inode;
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* lock parent */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+ err = vfs_mknod(hidden_sto_dir_dentry->d_inode, hidden_sto_dentry, mode, dev);
-+ if(err)
-+ goto out_lock;
-+
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: create_sto_nod: creating storage inode failed [1].\n");
-+ err = -EINVAL; /* return something indicating failure */
-+ goto out_lock;
-+ }
-+
-+ /* interpose the new inode */
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == NON_EXISTANT) {
-+ dtost(dentry) = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == UNMODIFIED) {
-+ dtost(dentry) = MODIFIED;
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: create_sto_nod: error, invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ }
-+
-+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+
-+/* unimplemented (and possibly not usefull):
-+
-+ nondir-del_to_del_rew
-+ nondir-non_exist_to_creat
-+
-+ dir-unmod_to_del
-+ dir-mod_to_del
-+ dir-creat_to_del
-+ dir-del_rew_to_del
-+ dir-del_to_del_rew
-+ dir-non_exist_to_creat
-+*/
-+
-+
-+/* bring a file of any type from state UNMODIFIED to MODIFIED */
-+int nondir_unmod_to_mod(dentry_t *dentry, int cp_flag)
-+{
-+ int err = 0;
-+ struct vfsmount *tgt_mnt;
-+ struct vfsmount *src_mnt;
-+ dentry_t *tgt_dentry;
-+ dentry_t *src_dentry;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if((dtost(dentry) != UNMODIFIED) ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR getting neg. sto dentry.\n");
-+ goto out;
-+ }
-+
-+ /* create sto file */
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* lock parent */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+ /* handle different types of nondirs */
-+ if(S_ISCHR(dentry->d_inode->i_mode) ||
-+ S_ISBLK(dentry->d_inode->i_mode)) {
-+ err = vfs_mknod(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dtohd(dentry)->d_inode->i_mode,
-+ dtohd(dentry)->d_inode->i_rdev);
-+ }
-+
-+ else if(S_ISREG(dentry->d_inode->i_mode)) {
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dtohd(dentry)->d_inode->i_mode, NULL);
-+#else
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dtohd(dentry)->d_inode->i_mode);
-+#endif
-+ }
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR creating sto file.\n");
-+ goto out_lock;
-+ }
-+
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR, invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+
-+ fist_copy_attr_timesizes(dentry->d_parent->d_inode,
-+ hidden_sto_dir_dentry->d_inode);
-+ dtost(dentry) = MODIFIED;
-+
-+ /* copy contents if regular file and cp_flag = 1 */
-+ if((cp_flag == 1) && S_ISREG(dentry->d_inode->i_mode)) {
-+
-+ /* unlock first */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ dput(hidden_sto_dir_dentry);
-+
-+ tgt_dentry = dtohd2(dentry);
-+ tgt_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ src_dentry = dtohd(dentry);
-+ src_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt;
-+
-+ err = mini_fo_cp_cont(tgt_dentry, tgt_mnt,
-+ src_dentry, src_mnt);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR copying contents.\n");
-+ }
-+ goto out;
-+ }
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+/* this function is currently identical to nondir_creat_to_del */
-+int nondir_del_rew_to_del(dentry_t *dentry)
-+{
-+ return nondir_creat_to_del(dentry);
-+}
-+
-+int nondir_creat_to_del(dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ inode_t *hidden_sto_dir_inode;
-+ dentry_t *hidden_sto_dir_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ /* for now this function serves for both state DEL_REWRITTEN and
-+ * CREATED */
-+ if(!(dtost(dentry) == CREATED || (dtost(dentry) == DEL_REWRITTEN)) ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_mod_to_del/del_rew_to_del: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ hidden_sto_dir_inode = itohi2(dentry->d_parent->d_inode);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* avoid destroying the hidden inode if the file is in use */
-+ dget(hidden_sto_dentry);
-+ err = vfs_unlink(hidden_sto_dir_inode, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+ dtost(dentry) = NON_EXISTANT;
-+
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+int nondir_mod_to_del(dentry_t *dentry)
-+{
-+ int err;
-+ dentry_t *hidden_sto_dentry;
-+ inode_t *hidden_sto_dir_inode;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) != MODIFIED ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_mod_to_del: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ hidden_sto_dir_inode = itohi2(dentry->d_parent->d_inode);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* avoid destroying the hidden inode if the file is in use */
-+ dget(hidden_sto_dentry);
-+ err = vfs_unlink(hidden_sto_dir_inode, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+ /* dput base dentry, this will relase the inode and free the
-+ * dentry, as we will never need it again. */
-+ dput(dtohd(dentry));
-+ dtohd(dentry) = NULL;
-+ dtost(dentry) = DELETED;
-+
-+ /* add deleted file to META-file */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+int nondir_unmod_to_del(dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) != UNMODIFIED ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_del: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* next we have to get a negative dentry for the storage file */
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if(err)
-+ goto out;
-+
-+ /* add deleted file to META lists */
-+ err = meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+
-+ if(err)
-+ goto out;
-+
-+ /* dput base dentry, this will relase the inode and free the
-+ * dentry, as we will never need it again. */
-+ dput(dtohd(dentry));
-+ dtohd(dentry) = NULL;
-+ dtost(dentry) = DELETED;
-+
-+ out:
-+ return err;
-+}
-+
-+/* bring a dir from state UNMODIFIED to MODIFIED */
-+int dir_unmod_to_mod(dentry_t *dentry)
-+{
-+ int err;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) != UNMODIFIED ||
-+ !S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: dir_unmod_to_mod: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* this creates our dir incl. sto. structure */
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: dir_unmod_to_mod: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ out:
-+ return err;
-+}
-+
---- /dev/null
-+++ b/fs/mini_fo/super.c
-@@ -0,0 +1,281 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+STATIC void
-+mini_fo_read_inode(inode_t *inode)
-+{
-+ static struct address_space_operations mini_fo_empty_aops;
-+
-+ __itopd(inode) = kmalloc(sizeof(struct mini_fo_inode_info), GFP_KERNEL);
-+ if (!itopd(inode)) {
-+ printk("<0>%s:%s:%d: No kernel memory!\n", __FILE__, __FUNCTION__, __LINE__);
-+ ASSERT(NULL);
-+ }
-+ itohi(inode) = NULL;
-+ itohi2(inode) = NULL;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ inode->i_version++;
-+#else
-+ inode->i_version = ++event; /* increment inode version */
-+#endif
-+ inode->i_op = &mini_fo_main_iops;
-+ inode->i_fop = &mini_fo_main_fops;
-+#if 0
-+ /*
-+ * XXX: To export a file system via NFS, it has to have the
-+ * FS_REQUIRES_DEV flag, so turn it on. But should we inherit it from
-+ * the lower file system, or can we allow our file system to be exported
-+ * even if the lower one cannot be natively exported.
-+ */
-+ inode->i_sb->s_type->fs_flags |= FS_REQUIRES_DEV;
-+ /*
-+ * OK, the above was a hack, which is now turned off because it may
-+ * cause a panic/oops on some systems. The correct way to export a
-+ * "nodev" filesystem is via using nfs-utils > 1.0 and the "fsid=" export
-+ * parameter, which requires 2.4.20 or later.
-+ */
-+#endif
-+ /* I don't think ->a_ops is ever allowed to be NULL */
-+ inode->i_mapping->a_ops = &mini_fo_empty_aops;
-+}
-+
-+
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+/*
-+ * No need to call write_inode() on the lower inode, as it
-+ * will have been marked 'dirty' anyway. But we might need
-+ * to write some of our own stuff to disk.
-+ */
-+STATIC void
-+mini_fo_write_inode(inode_t *inode, int sync)
-+{
-+ print_entry_location();
-+ print_exit_location();
-+}
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+
-+
-+STATIC void
-+mini_fo_put_inode(inode_t *inode)
-+{
-+ /*
-+ * This is really funky stuff:
-+ * Basically, if i_count == 1, iput will then decrement it and this inode will be destroyed.
-+ * It is currently holding a reference to the hidden inode.
-+ * Therefore, it needs to release that reference by calling iput on the hidden inode.
-+ * iput() _will_ do it for us (by calling our clear_inode), but _only_ if i_nlink == 0.
-+ * The problem is, NFS keeps i_nlink == 1 for silly_rename'd files.
-+ * So we must for our i_nlink to 0 here to trick iput() into calling our clear_inode.
-+ */
-+ if (atomic_read(&inode->i_count) == 1)
-+ inode->i_nlink = 0;
-+}
-+
-+
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+/*
-+ * we now define delete_inode, because there are two VFS paths that may
-+ * destroy an inode: one of them calls clear inode before doing everything
-+ * else that's needed, and the other is fine. This way we truncate the inode
-+ * size (and its pages) and then clear our own inode, which will do an iput
-+ * on our and the lower inode.
-+ */
-+STATIC void
-+mini_fo_delete_inode(inode_t *inode)
-+{
-+ print_entry_location();
-+
-+ fist_checkinode(inode, "mini_fo_delete_inode IN");
-+ inode->i_size = 0; /* every f/s seems to do that */
-+ clear_inode(inode);
-+
-+ print_exit_location();
-+}
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+
-+
-+/* final actions when unmounting a file system */
-+STATIC void
-+mini_fo_put_super(super_block_t *sb)
-+{
-+ if (stopd(sb)) {
-+ mntput(stopd(sb)->hidden_mnt);
-+ mntput(stopd(sb)->hidden_mnt2);
-+
-+ /* mk: no! dput(stopd(sb)->base_dir_dentry);
-+ dput(stopd(sb)->storage_dir_dentry); */
-+
-+ kfree(stopd(sb));
-+ __stopd(sb) = NULL;
-+ }
-+}
-+
-+
-+#ifdef NOT_NEEDED
-+/*
-+ * This is called in do_umount before put_super.
-+ * The superblock lock is not held yet.
-+ * We probably do not need to define this or call write_super
-+ * on the hidden_sb, because sync_supers() will get to hidden_sb
-+ * sooner or later. But it is also called from file_fsync()...
-+ */
-+STATIC void
-+mini_fo_write_super(super_block_t *sb)
-+{
-+ return;
-+}
-+#endif /* NOT_NEEDED */
-+
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_statfs(struct dentry *d, struct kstatfs *buf)
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_statfs(super_block_t *sb, struct kstatfs *buf)
-+#else
-+mini_fo_statfs(super_block_t *sb, struct statfs *buf)
-+#endif
-+{
-+ int err = 0;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ struct dentry *hidden_d;
-+
-+ hidden_d = dtohd(d);
-+ err = vfs_statfs(hidden_d, buf);
-+#else
-+ super_block_t *hidden_sb;
-+
-+ hidden_sb = stohs(sb);
-+ err = vfs_statfs(hidden_sb, buf);
-+#endif
-+
-+ return err;
-+}
-+
-+
-+/*
-+ * XXX: not implemented. This is not allowed yet.
-+ * Should we call this on the hidden_sb? Probably not.
-+ */
-+STATIC int
-+mini_fo_remount_fs(super_block_t *sb, int *flags, char *data)
-+{
-+ //printk(KERN_CRIT "mini_fo_remount_fs: WARNING, this function is umimplemented.\n");
-+ return -ENOSYS;
-+}
-+
-+
-+/*
-+ * Called by iput() when the inode reference count reached zero
-+ * and the inode is not hashed anywhere. Used to clear anything
-+ * that needs to be, before the inode is completely destroyed and put
-+ * on the inode free list.
-+ */
-+STATIC void
-+mini_fo_clear_inode(inode_t *inode)
-+{
-+ /*
-+ * Decrement a reference to a hidden_inode, which was incremented
-+ * by our read_inode when it was created initially.
-+ */
-+
-+ /* release the wol_list */
-+ if(S_ISDIR(inode->i_mode)) {
-+ __meta_put_lists(inode);
-+ }
-+
-+ /* mk: fan out fun */
-+ if(itohi(inode))
-+ iput(itohi(inode));
-+ if(itohi2(inode))
-+ iput(itohi2(inode));
-+
-+ // XXX: why this assertion fails?
-+ // because it doesn't like us
-+ // ASSERT((inode->i_state & I_DIRTY) == 0);
-+ kfree(itopd(inode));
-+ __itopd(inode) = NULL;
-+}
-+
-+
-+/*
-+ * Called in do_umount() if the MNT_FORCE flag was used and this
-+ * function is defined. See comment in linux/fs/super.c:do_umount().
-+ * Used only in nfs, to kill any pending RPC tasks, so that subsequent
-+ * code can actually succeed and won't leave tasks that need handling.
-+ *
-+ * PS. I wonder if this is somehow useful to undo damage that was
-+ * left in the kernel after a user level file server (such as amd)
-+ * dies.
-+ */
-+STATIC void
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_umount_begin(struct vfsmount *mnt, int flags)
-+{
-+ struct vfsmount *hidden_mnt;
-+
-+ hidden_mnt = stopd(mnt->mnt_sb)->hidden_mnt;
-+
-+ if (hidden_mnt->mnt_sb->s_op->umount_begin)
-+ hidden_mnt->mnt_sb->s_op->umount_begin(hidden_mnt, flags);
-+
-+}
-+#else
-+mini_fo_umount_begin(super_block_t *sb)
-+{
-+ super_block_t *hidden_sb;
-+
-+ hidden_sb = stohs(sb);
-+
-+ if (hidden_sb->s_op->umount_begin)
-+ hidden_sb->s_op->umount_begin(hidden_sb);
-+
-+}
-+#endif
-+
-+
-+struct super_operations mini_fo_sops =
-+{
-+ read_inode: mini_fo_read_inode,
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+ write_inode: mini_fo_write_inode,
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+ put_inode: mini_fo_put_inode,
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+ delete_inode: mini_fo_delete_inode,
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+ put_super: mini_fo_put_super,
-+ statfs: mini_fo_statfs,
-+ remount_fs: mini_fo_remount_fs,
-+ clear_inode: mini_fo_clear_inode,
-+ umount_begin: mini_fo_umount_begin,
-+};
---- /dev/null
-+++ b/fs/mini_fo/Kconfig
-@@ -0,0 +1,3 @@
-+config MINI_FO
-+ tristate "Mini fanout overlay filesystem"
-+
+++ /dev/null
---- a/fs/mini_fo/main.c
-+++ b/fs/mini_fo/main.c
-@@ -79,6 +79,7 @@ mini_fo_tri_interpose(dentry_t *hidden_d
- * of the new inode's fields
- */
-
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
- /*
- * original: inode = iget(sb, hidden_inode->i_ino);
- */
-@@ -87,6 +88,13 @@ mini_fo_tri_interpose(dentry_t *hidden_d
- err = -EACCES; /* should be impossible??? */
- goto out;
- }
-+#else
-+ inode = mini_fo_iget(sb, iunique(sb, 25));
-+ if (IS_ERR(inode)) {
-+ err = PTR_ERR(inode);
-+ goto out;
-+ }
-+#endif
-
- /*
- * interpose the inode if not already interposed
-@@ -184,9 +192,9 @@ mini_fo_parse_options(super_block_t *sb,
- hidden_root = ERR_PTR(err);
- goto out;
- }
-- hidden_root = nd.dentry;
-- stopd(sb)->base_dir_dentry = nd.dentry;
-- stopd(sb)->hidden_mnt = nd.mnt;
-+ hidden_root = nd_get_dentry(&nd);
-+ stopd(sb)->base_dir_dentry = nd_get_dentry(&nd);
-+ stopd(sb)->hidden_mnt = nd_get_mnt(&nd);
-
- } else if(!strncmp("sto=", options, 4)) {
- /* parse the storage dir */
-@@ -204,9 +212,9 @@ mini_fo_parse_options(super_block_t *sb,
- hidden_root2 = ERR_PTR(err);
- goto out;
- }
-- hidden_root2 = nd2.dentry;
-- stopd(sb)->storage_dir_dentry = nd2.dentry;
-- stopd(sb)->hidden_mnt2 = nd2.mnt;
-+ hidden_root2 = nd_get_dentry(&nd2);
-+ stopd(sb)->storage_dir_dentry = nd_get_dentry(&nd2);
-+ stopd(sb)->hidden_mnt2 = nd_get_mnt(&nd2);
- stohs2(sb) = hidden_root2->d_sb;
-
- /* validate storage dir, this is done in
---- a/fs/mini_fo/mini_fo.h
-+++ b/fs/mini_fo/mini_fo.h
-@@ -302,6 +302,10 @@ extern int mini_fo_tri_interpose(dentry_
- extern int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
- dentry_t *src_dentry, struct vfsmount *src_mnt);
-
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+extern struct inode *mini_fo_iget(struct super_block *sb, unsigned long ino);
-+#endif
-+
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
- extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd);
-
-@@ -501,6 +505,29 @@ static inline void double_unlock(struct
- #endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
- #endif /* __KERNEL__ */
-
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+static inline dentry_t *nd_get_dentry(struct nameidata *nd)
-+{
-+ return (nd->path.dentry);
-+}
-+
-+static inline struct vfsmount *nd_get_mnt(struct nameidata *nd)
-+{
-+ return (nd->path.mnt);
-+}
-+#else
-+static inline dentry_t *nd_get_dentry(struct nameidata *nd)
-+{
-+ return (nd->dentry);
-+}
-+
-+static inline struct vfsmount *nd_get_mnt(struct nameidata *nd)
-+{
-+ return (nd->mnt);
-+}
-+#endif
-+
- /*
- * Definitions for user and kernel code
- */
---- a/fs/mini_fo/super.c
-+++ b/fs/mini_fo/super.c
-@@ -262,10 +262,31 @@ mini_fo_umount_begin(super_block_t *sb)
- }
- #endif
-
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+struct inode *
-+mini_fo_iget(struct super_block *sb, unsigned long ino)
-+{
-+ struct inode *inode;
-+
-+ inode = iget_locked(sb, ino);
-+ if (!inode)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (!(inode->i_state & I_NEW))
-+ return inode;
-+
-+ mini_fo_read_inode(inode);
-+
-+ unlock_new_inode(inode);
-+ return inode;
-+}
-+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25) */
-
- struct super_operations mini_fo_sops =
- {
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
- read_inode: mini_fo_read_inode,
-+#endif
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
- write_inode: mini_fo_write_inode,
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
---- a/fs/mini_fo/aux.c
-+++ b/fs/mini_fo/aux.c
-@@ -164,11 +164,11 @@ dentry_t *bpath_walk(super_block_t *sb,
- err = vfs_path_lookup(mnt->mnt_root, mnt, bpath+1, 0, &nd);
-
- /* validate */
-- if (err || !nd.dentry || !nd.dentry->d_inode) {
-+ if (err || !nd_get_dentry(&nd) || !nd_get_dentry(&nd)->d_inode) {
- printk(KERN_CRIT "mini_fo: bpath_walk: path_walk failed.\n");
- return NULL;
- }
-- return nd.dentry;
-+ return nd_get_dentry(&nd);
- }
-
-
+++ /dev/null
---- a/fs/mini_fo/meta.c
-+++ b/fs/mini_fo/meta.c
-@@ -442,6 +442,11 @@ int meta_write_d_entry(dentry_t *dentry,
- S_IRUSR | S_IWUSR);
- #endif
- }
-+
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
-@@ -535,6 +540,11 @@ int meta_write_r_entry(dentry_t *dentry,
- meta_dentry, S_IRUSR | S_IWUSR);
- #endif
- }
-+
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
-@@ -671,14 +681,16 @@ int meta_sync_d_list(dentry_t *dentry, i
- }
- }
-
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
- ERROR opening meta file.\n");
-- /* we don't mntget so we dont't mntput (for now)
-- * mntput(meta_mnt);
-- */
-+ mntput(meta_mnt);
- dput(meta_dentry);
- err = -1;
- goto out;
-@@ -811,14 +823,16 @@ int meta_sync_r_list(dentry_t *dentry, i
- }
- }
-
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
- ERROR opening meta file.\n");
-- /* we don't mntget so we dont't mntput (for now)
-- * mntput(meta_mnt);
-- */
-+ mntput(meta_mnt);
- dput(meta_dentry);
- err = -1;
- goto out;
+++ /dev/null
---- a/fs/mini_fo/super.c
-+++ b/fs/mini_fo/super.c
-@@ -84,6 +84,7 @@ mini_fo_write_inode(inode_t *inode, int
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-
-
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
- STATIC void
- mini_fo_put_inode(inode_t *inode)
- {
-@@ -99,6 +100,7 @@ mini_fo_put_inode(inode_t *inode)
- if (atomic_read(&inode->i_count) == 1)
- inode->i_nlink = 0;
- }
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) */
-
-
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-@@ -238,7 +240,7 @@ mini_fo_clear_inode(inode_t *inode)
- * dies.
- */
- STATIC void
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
- mini_fo_umount_begin(struct vfsmount *mnt, int flags)
- {
- struct vfsmount *hidden_mnt;
-@@ -290,7 +292,9 @@ struct super_operations mini_fo_sops =
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
- write_inode: mini_fo_write_inode,
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
- put_inode: mini_fo_put_inode,
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) */
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
- delete_inode: mini_fo_delete_inode,
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
+++ /dev/null
---- a/fs/mini_fo/inode.c
-+++ b/fs/mini_fo/inode.c
-@@ -439,7 +439,7 @@ mini_fo_symlink(inode_t *dir, dentry_t *
- int err=0;
- dentry_t *hidden_sto_dentry;
- dentry_t *hidden_sto_dir_dentry;
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
- umode_t mode;
- #endif
-
-@@ -466,7 +466,7 @@ mini_fo_symlink(inode_t *dir, dentry_t *
- down(&hidden_sto_dir_dentry->d_inode->i_sem);
- #endif
-
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
- mode = S_IALLUGO;
- err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
- hidden_sto_dentry, symname, mode);
-@@ -1128,7 +1128,7 @@ void mini_fo_put_link(struct dentry *den
- #endif
-
- STATIC int
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
- mini_fo_permission(inode_t *inode, int mask, struct nameidata *nd)
- #else
- mini_fo_permission(inode_t *inode, int mask)
-@@ -1150,8 +1150,9 @@ mini_fo_permission(inode_t *inode, int m
- * if (err)
- * goto out;
- */
--
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
-+ err = inode_permission(hidden_inode, mask);
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
- err = permission(hidden_inode, mask, nd);
- #else
- err = permission(hidden_inode, mask);
+++ /dev/null
---- a/fs/mini_fo/aux.c
-+++ b/fs/mini_fo/aux.c
-@@ -236,7 +236,7 @@ int mini_fo_cp_cont(dentry_t *tgt_dentry
- mntget(src_mnt);
-
- /* open file write only */
-- tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1);
-+ tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1, current_cred());
- if(!tgt_file || IS_ERR(tgt_file)) {
- printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening target file.\n");
- err = PTR_ERR(tgt_file);
-@@ -244,7 +244,7 @@ int mini_fo_cp_cont(dentry_t *tgt_dentry
- }
-
- /* open file read only */
-- src_file = dentry_open(src_dentry, src_mnt, 0x0);
-+ src_file = dentry_open(src_dentry, src_mnt, 0x0, current_cred());
- if(!src_file || IS_ERR(src_file)) {
- printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening source file.\n");
- err = PTR_ERR(src_file);
---- a/fs/mini_fo/file.c
-+++ b/fs/mini_fo/file.c
-@@ -437,7 +437,7 @@ mini_fo_open(inode_t *inode, file_t *fil
- mntget(stopd(inode->i_sb)->hidden_mnt);
- hidden_file = dentry_open(hidden_dentry,
- stopd(inode->i_sb)->hidden_mnt,
-- hidden_flags);
-+ hidden_flags, file->f_cred);
- if (IS_ERR(hidden_file)) {
- err = PTR_ERR(hidden_file);
- dput(hidden_dentry);
-@@ -479,7 +479,7 @@ mini_fo_open(inode_t *inode, file_t *fil
- mntget(stopd(inode->i_sb)->hidden_mnt);
- hidden_file = dentry_open(hidden_dentry,
- stopd(inode->i_sb)->hidden_mnt,
-- hidden_flags);
-+ hidden_flags, file->f_cred);
- if (IS_ERR(hidden_file)) {
- err = PTR_ERR(hidden_file);
- dput(hidden_dentry);
-@@ -512,7 +512,7 @@ mini_fo_open(inode_t *inode, file_t *fil
- mntget(stopd(inode->i_sb)->hidden_mnt2);
- hidden_sto_file = dentry_open(hidden_sto_dentry,
- stopd(inode->i_sb)->hidden_mnt2,
-- hidden_flags);
-+ hidden_flags, file->f_cred);
-
- /* dentry_open dputs the dentry if it fails */
- if (IS_ERR(hidden_sto_file)) {
---- a/fs/mini_fo/meta.c
-+++ b/fs/mini_fo/meta.c
-@@ -56,7 +56,7 @@ int meta_build_lists(dentry_t *dentry)
-
-
- /* open META-file for reading */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x0);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x0, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_build_lists: \
- ERROR opening META file.\n");
-@@ -448,7 +448,7 @@ int meta_write_d_entry(dentry_t *dentry,
- mntget(meta_mnt);
-
- /* open META-file for writing */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
- ERROR opening meta file.\n");
-@@ -546,7 +546,7 @@ int meta_write_r_entry(dentry_t *dentry,
- mntget(meta_mnt);
-
- /* open META-file for writing */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
- ERROR opening meta file.\n");
-@@ -686,7 +686,7 @@ int meta_sync_d_list(dentry_t *dentry, i
- mntget(meta_mnt);
-
- /* open META-file for writing */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
- ERROR opening meta file.\n");
-@@ -828,7 +828,7 @@ int meta_sync_r_list(dentry_t *dentry, i
- mntget(meta_mnt);
-
- /* open META-file for writing */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
- ERROR opening meta file.\n");
+++ /dev/null
---- a/fs/mini_fo/aux.c
-+++ b/fs/mini_fo/aux.c
-@@ -86,8 +86,10 @@ int get_neg_sto_dentry(dentry_t *dentry)
- len = dentry->d_name.len;
- name = dentry->d_name.name;
-
-+ mutex_lock(&dtohd2(dentry->d_parent)->d_inode->i_mutex);
- dtohd2(dentry) =
- lookup_one_len(name, dtohd2(dentry->d_parent), len);
-+ mutex_unlock(&dtohd2(dentry->d_parent)->d_inode->i_mutex);
-
- out:
- return err;
-@@ -426,7 +428,9 @@ int build_sto_structure(dentry_t *dir, d
- const unsigned char *name;
- len = dtohd(dentry)->d_name.len;
- name = dtohd(dentry)->d_name.name;
-+ mutex_lock(&dtohd2(dir)->d_inode->i_mutex);
- hidden_sto_dentry = lookup_one_len(name, dtohd2(dir), len);
-+ mutex_unlock(&dtohd2(dir)->d_inode->i_mutex);
- dtohd2(dentry) = hidden_sto_dentry;
- }
-
---- a/fs/mini_fo/inode.c
-+++ b/fs/mini_fo/inode.c
-@@ -113,17 +113,23 @@ mini_fo_lookup(inode_t *dir, dentry_t *d
- hidden_dir_dentry = hidden_dentry->d_parent;
- kfree(bpath);
- }
-- else if(hidden_dir_dentry && hidden_dir_dentry->d_inode)
-+ else if(hidden_dir_dentry && hidden_dir_dentry->d_inode) {
-+ mutex_lock(&hidden_dir_dentry->d_inode->i_mutex);
- hidden_dentry =
- lookup_one_len(name, hidden_dir_dentry, namelen);
-- else
-+ mutex_unlock(&hidden_dir_dentry->d_inode->i_mutex);
-+ } else {
- hidden_dentry = NULL;
-+ }
-
-- if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode) {
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
- hidden_sto_dentry =
- lookup_one_len(name, hidden_sto_dir_dentry, namelen);
-- else
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+ } else {
- hidden_sto_dentry = NULL;
-+ }
-
- /* catch error in lookup */
- if (IS_ERR(hidden_dentry) || IS_ERR(hidden_sto_dentry)) {
-@@ -553,9 +559,11 @@ mini_fo_rmdir(inode_t *dir, dentry_t *de
- #endif
-
- /* Delete an old WOL file contained in the storage dir */
-+ mutex_lock(&hidden_sto_dentry->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- hidden_sto_dentry,
- strlen(META_FILENAME));
-+ mutex_unlock(&hidden_sto_dentry->d_inode->i_mutex);
- if(meta_dentry->d_inode) {
- err = vfs_unlink(hidden_sto_dentry->d_inode, meta_dentry);
- dput(meta_dentry);
-@@ -643,9 +651,11 @@ mini_fo_rmdir(inode_t *dir, dentry_t *de
- #endif
-
- /* Delete an old WOL file contained in the storage dir */
-+ mutex_lock(&hidden_sto_dentry->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- hidden_sto_dentry,
- strlen(META_FILENAME));
-+ mutex_unlock(&hidden_sto_dentry->d_inode->i_mutex);
- if(meta_dentry->d_inode) {
- /* is this necessary? dget(meta_dentry); */
- err = vfs_unlink(hidden_sto_dentry->d_inode,
-@@ -688,9 +698,11 @@ mini_fo_rmdir(inode_t *dir, dentry_t *de
- #endif
-
- /* Delete an old WOL file contained in the storage dir */
-+ mutex_lock(&hidden_sto_dentry->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- hidden_sto_dentry,
- strlen(META_FILENAME));
-+ mutex_unlock(&hidden_sto_dentry->d_inode->i_mutex);
- if(meta_dentry->d_inode) {
- /* is this necessary? dget(meta_dentry); */
- err = vfs_unlink(hidden_sto_dentry->d_inode,
---- a/fs/mini_fo/meta.c
-+++ b/fs/mini_fo/meta.c
-@@ -43,9 +43,11 @@ int meta_build_lists(dentry_t *dentry)
-
- /* might there be a META-file? */
- if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry),
- strlen(META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
- if(!meta_dentry->d_inode) {
- dput(meta_dentry);
- goto out_ok;
-@@ -426,8 +428,11 @@ int meta_write_d_entry(dentry_t *dentry,
- goto out;
- }
- }
-+
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry), strlen (META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
-
- /* We need to create a META-file */
- if(!meta_dentry->d_inode) {
-@@ -527,9 +532,13 @@ int meta_write_r_entry(dentry_t *dentry,
- goto out;
- }
- }
-+
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry),
- strlen (META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
-+
- if(!meta_dentry->d_inode) {
- /* We need to create a META-file */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-@@ -641,9 +650,13 @@ int meta_sync_d_list(dentry_t *dentry, i
- goto out;
- }
- }
-+
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry),
- strlen(META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
-+
- if(!meta_dentry->d_inode) {
- /* We need to create a META-file */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-@@ -784,9 +797,13 @@ int meta_sync_r_list(dentry_t *dentry, i
- goto out;
- }
- }
-+
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry),
- strlen(META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
-+
- if(!meta_dentry->d_inode) {
- /* We need to create a META-file */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+++ /dev/null
---- a/fs/mini_fo/state.c
-+++ b/fs/mini_fo/state.c
-@@ -537,17 +537,17 @@ int nondir_mod_to_del(dentry_t *dentry)
- dtohd(dentry) = NULL;
- dtost(dentry) = DELETED;
-
-- /* add deleted file to META-file */
-- meta_add_d_entry(dentry->d_parent,
-- dentry->d_name.name,
-- dentry->d_name.len);
--
- /* was: unlock_dir(hidden_sto_dir_dentry); */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
- mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
- #else
- up(&hidden_sto_dir_dentry->d_inode->i_sem);
- #endif
-+ /* add deleted file to META-file */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+
- dput(hidden_sto_dir_dentry);
-
- out:
+++ /dev/null
---- a/lib/kobject_uevent.c
-+++ b/lib/kobject_uevent.c
-@@ -29,7 +29,8 @@ u64 uevent_seqnum;
- char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH;
- static DEFINE_SPINLOCK(sequence_lock);
- #if defined(CONFIG_NET)
--static struct sock *uevent_sock;
-+struct sock *uevent_sock = NULL;
-+EXPORT_SYMBOL_GPL(uevent_sock);
- #endif
-
- /* the strings here must match the enum in include/linux/kobject.h */
-@@ -42,6 +43,18 @@ static const char *kobject_actions[] = {
- [KOBJ_OFFLINE] = "offline",
- };
-
-+u64 uevent_next_seqnum(void)
-+{
-+ u64 seq;
-+
-+ spin_lock(&sequence_lock);
-+ seq = ++uevent_seqnum;
-+ spin_unlock(&sequence_lock);
-+
-+ return seq;
-+}
-+EXPORT_SYMBOL_GPL(uevent_next_seqnum);
-+
- /**
- * kobject_action_type - translate action string to numeric type
- *
-@@ -201,9 +214,7 @@ int kobject_uevent_env(struct kobject *k
- kobj->state_remove_uevent_sent = 1;
-
- /* we will send an event, so request a new sequence number */
-- spin_lock(&sequence_lock);
-- seq = ++uevent_seqnum;
-- spin_unlock(&sequence_lock);
-+ seq = uevent_next_seqnum();
- retval = add_uevent_var(env, "SEQNUM=%llu", (unsigned long long)seq);
- if (retval)
- goto exit;
+++ /dev/null
---- a/sound/core/Kconfig
-+++ b/sound/core/Kconfig
-@@ -8,7 +8,7 @@ config SND_PCM
- select GCD
-
- config SND_HWDEP
-- tristate
-+ tristate "Sound hardware support"
-
- config SND_RAWMIDI
- tristate
+++ /dev/null
---- a/fs/binfmt_elf.c
-+++ b/fs/binfmt_elf.c
-@@ -1165,7 +1165,7 @@ static unsigned long vma_dump_size(struc
- if (FILTER(ELF_HEADERS) &&
- vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
- u32 __user *header = (u32 __user *) vma->vm_start;
-- u32 word;
-+ u32 word = 0;
- mm_segment_t fs = get_fs();
- /*
- * Doing it this way gets the constant folded by GCC.
+++ /dev/null
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -21,6 +21,8 @@
- #include <linux/root_dev.h>
- #include <linux/magic.h>
-
-+#define MTD_ERASE_PARTIAL 0x8000 /* partition only covers parts of an erase block */
-+
- /* Our partition linked list */
- static LIST_HEAD(mtd_partitions);
-
-@@ -226,13 +228,60 @@ static int part_erase(struct mtd_info *m
- return -EROFS;
- if (instr->addr >= mtd->size)
- return -EINVAL;
-+
-+ instr->partial_start = false;
-+ if (mtd->flags & MTD_ERASE_PARTIAL) {
-+ size_t readlen = 0;
-+ u64 mtd_ofs;
-+
-+ instr->erase_buf = kmalloc(part->master->erasesize, GFP_ATOMIC);
-+ if (!instr->erase_buf)
-+ return -ENOMEM;
-+
-+ mtd_ofs = part->offset + instr->addr;
-+ instr->erase_buf_ofs = do_div(mtd_ofs, part->master->erasesize);
-+
-+ if (instr->erase_buf_ofs > 0) {
-+ instr->addr -= instr->erase_buf_ofs;
-+ ret = part->master->read(part->master,
-+ instr->addr + part->offset,
-+ part->master->erasesize,
-+ &readlen, instr->erase_buf);
-+
-+ instr->partial_start = true;
-+ } else {
-+ mtd_ofs = part->offset + part->mtd.size;
-+ instr->erase_buf_ofs = part->master->erasesize -
-+ do_div(mtd_ofs, part->master->erasesize);
-+
-+ if (instr->erase_buf_ofs > 0) {
-+ instr->len += instr->erase_buf_ofs;
-+ ret = part->master->read(part->master,
-+ part->offset + instr->addr +
-+ instr->len - part->master->erasesize,
-+ part->master->erasesize, &readlen,
-+ instr->erase_buf);
-+ } else {
-+ ret = 0;
-+ }
-+ }
-+ if (ret < 0) {
-+ kfree(instr->erase_buf);
-+ return ret;
-+ }
-+
-+ }
-+
- instr->addr += part->offset;
- ret = part->master->erase(part->master, instr);
- if (ret) {
- if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
- instr->fail_addr -= part->offset;
- instr->addr -= part->offset;
-+ if (mtd->flags & MTD_ERASE_PARTIAL)
-+ kfree(instr->erase_buf);
- }
-+
- return ret;
- }
-
-@@ -240,7 +289,25 @@ void mtd_erase_callback(struct erase_inf
- {
- if (instr->mtd->erase == part_erase) {
- struct mtd_part *part = PART(instr->mtd);
-+ size_t wrlen = 0;
-
-+ if (instr->mtd->flags & MTD_ERASE_PARTIAL) {
-+ if (instr->partial_start) {
-+ part->master->write(part->master,
-+ instr->addr, instr->erase_buf_ofs,
-+ &wrlen, instr->erase_buf);
-+ instr->addr += instr->erase_buf_ofs;
-+ } else {
-+ instr->len -= instr->erase_buf_ofs;
-+ part->master->write(part->master,
-+ instr->addr + instr->len,
-+ instr->erase_buf_ofs, &wrlen,
-+ instr->erase_buf +
-+ part->master->erasesize -
-+ instr->erase_buf_ofs);
-+ }
-+ kfree(instr->erase_buf);
-+ }
- if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
- instr->fail_addr -= part->offset;
- instr->addr -= part->offset;
-@@ -473,18 +540,24 @@ static struct mtd_part *add_one_partitio
- if ((slave->mtd.flags & MTD_WRITEABLE) &&
- mtd_mod_by_eb(slave->offset, &slave->mtd)) {
- /* Doesn't start on a boundary of major erase size */
-- /* FIXME: Let it be writable if it is on a boundary of
-- * _minor_ erase size though */
-- slave->mtd.flags &= ~MTD_WRITEABLE;
-- printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n",
-- part->name);
-+ slave->mtd.flags |= MTD_ERASE_PARTIAL;
-+ if (((u32) slave->mtd.size) > master->erasesize)
-+ slave->mtd.flags &= ~MTD_WRITEABLE;
-+ else
-+ slave->mtd.erasesize = slave->mtd.size;
- }
- if ((slave->mtd.flags & MTD_WRITEABLE) &&
-- mtd_mod_by_eb(slave->mtd.size, &slave->mtd)) {
-- slave->mtd.flags &= ~MTD_WRITEABLE;
-- printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n",
-- part->name);
-- }
-+ mtd_mod_by_eb(slave->offset + slave->mtd.size, &slave->mtd)) {
-+ slave->mtd.flags |= MTD_ERASE_PARTIAL;
-+
-+ if ((u32) slave->mtd.size > master->erasesize)
-+ slave->mtd.flags &= ~MTD_WRITEABLE;
-+ else
-+ slave->mtd.erasesize = slave->mtd.size;
-+ }
-+ if ((slave->mtd.flags & (MTD_ERASE_PARTIAL|MTD_WRITEABLE)) == MTD_ERASE_PARTIAL)
-+ printk(KERN_WARNING"mtd: partition \"%s\" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only\n",
-+ part->name);
-
- slave->mtd.ecclayout = master->ecclayout;
- if (master->block_isbad) {
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -46,6 +46,10 @@ struct erase_info {
- u_long priv;
- u_char state;
- struct erase_info *next;
-+
-+ u8 *erase_buf;
-+ u32 erase_buf_ofs;
-+ bool partial_start;
- };
-
- struct mtd_erase_region_info {
+++ /dev/null
-This patch allows the user to specify desired packet types (outgoing,
-broadcast, unicast, etc.) on packet sockets via setsockopt.
-This can reduce the load in situations where only a limited number
-of packet types are necessary
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-
---- a/include/linux/if_packet.h
-+++ b/include/linux/if_packet.h
-@@ -29,6 +29,8 @@ struct sockaddr_ll {
- /* These ones are invisible by user level */
- #define PACKET_LOOPBACK 5 /* MC/BRD frame looped back */
- #define PACKET_FASTROUTE 6 /* Fastrouted frame */
-+#define PACKET_MASK_ANY 0xffffffff /* mask for packet type bits */
-+
-
- /* Packet socket options */
-
-@@ -46,6 +48,7 @@ struct sockaddr_ll {
- #define PACKET_RESERVE 12
- #define PACKET_TX_RING 13
- #define PACKET_LOSS 14
-+#define PACKET_RECV_TYPE 15
-
- struct tpacket_stats {
- unsigned int tp_packets;
---- a/net/packet/af_packet.c
-+++ b/net/packet/af_packet.c
-@@ -205,6 +205,7 @@ struct packet_sock {
- unsigned int tp_loss:1;
- #endif
- struct packet_type prot_hook ____cacheline_aligned_in_smp;
-+ __u8 pkt_type:3;
- };
-
- struct packet_skb_cb {
-@@ -343,6 +344,7 @@ static int packet_rcv_spkt(struct sk_buf
- {
- struct sock *sk;
- struct sockaddr_pkt *spkt;
-+ struct packet_sock *po;
-
- /*
- * When we registered the protocol we saved the socket in the data
-@@ -350,6 +352,7 @@ static int packet_rcv_spkt(struct sk_buf
- */
-
- sk = pt->af_packet_priv;
-+ po = pkt_sk(sk);
-
- /*
- * Yank back the headers [hope the device set this
-@@ -362,7 +365,7 @@ static int packet_rcv_spkt(struct sk_buf
- * so that this procedure is noop.
- */
-
-- if (skb->pkt_type == PACKET_LOOPBACK)
-+ if (!(po->pkt_type & (1 << skb->pkt_type)))
- goto out;
-
- if (!net_eq(dev_net(dev), sock_net(sk)))
-@@ -538,12 +541,12 @@ static int packet_rcv(struct sk_buff *sk
- int skb_len = skb->len;
- unsigned int snaplen, res;
-
-- if (skb->pkt_type == PACKET_LOOPBACK)
-- goto drop;
--
- sk = pt->af_packet_priv;
- po = pkt_sk(sk);
-
-+ if (!(po->pkt_type & (1 << skb->pkt_type)))
-+ goto drop;
-+
- if (!net_eq(dev_net(dev), sock_net(sk)))
- goto drop;
-
-@@ -659,12 +662,12 @@ static int tpacket_rcv(struct sk_buff *s
- struct timeval tv;
- struct timespec ts;
-
-- if (skb->pkt_type == PACKET_LOOPBACK)
-- goto drop;
--
- sk = pt->af_packet_priv;
- po = pkt_sk(sk);
-
-+ if (!(po->pkt_type & (1 << skb->pkt_type)))
-+ goto drop;
-+
- if (!net_eq(dev_net(dev), sock_net(sk)))
- goto drop;
-
-@@ -1386,6 +1389,7 @@ static int packet_create(struct net *net
- 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);
-
- if (sock->type == SOCK_PACKET)
- po->prot_hook.func = packet_rcv_spkt;
-@@ -1731,6 +1735,16 @@ packet_setsockopt(struct socket *sock, i
- ret = packet_mc_drop(sk, &mreq);
- return ret;
- }
-+ case PACKET_RECV_TYPE:
-+ {
-+ unsigned int val;
-+ if (optlen != sizeof(val))
-+ return -EINVAL;
-+ if (copy_from_user(&val, optval, sizeof(val)))
-+ return -EFAULT;
-+ po->pkt_type = val & ~PACKET_LOOPBACK;
-+ return 0;
-+ }
-
- #ifdef CONFIG_PACKET_MMAP
- case PACKET_RX_RING:
-@@ -1876,6 +1890,13 @@ static int packet_getsockopt(struct sock
-
- data = &val;
- break;
-+ case PACKET_RECV_TYPE:
-+ if (len > sizeof(unsigned int))
-+ len = sizeof(unsigned int);
-+ val = po->pkt_type;
-+
-+ data = &val;
-+ break;
- #ifdef CONFIG_PACKET_MMAP
- case PACKET_VERSION:
- if (len > sizeof(int))
+++ /dev/null
---- a/drivers/net/pppoe.c
-+++ b/drivers/net/pppoe.c
-@@ -862,7 +862,7 @@ static int pppoe_sendmsg(struct kiocb *i
- goto end;
-
-
-- skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32,
-+ skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32 + NET_SKB_PAD,
- 0, GFP_KERNEL);
- if (!skb) {
- error = -ENOMEM;
-@@ -870,7 +870,7 @@ static int pppoe_sendmsg(struct kiocb *i
- }
-
- /* Reserve space for headers. */
-- skb_reserve(skb, dev->hard_header_len);
-+ skb_reserve(skb, dev->hard_header_len + NET_SKB_PAD);
- skb_reset_network_header(skb);
-
- skb->dev = dev;
+++ /dev/null
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -96,6 +96,10 @@ config CRYPTO_MANAGER2
- select CRYPTO_BLKCIPHER2
- select CRYPTO_PCOMP
-
-+config CRYPTO_MANAGER_NO_TESTS
-+ bool "Disable internal testsuite to save space"
-+ depends on CRYPTO_MANAGER
-+
- config CRYPTO_GF128MUL
- tristate "GF(2^128) multiplication functions (EXPERIMENTAL)"
- depends on EXPERIMENTAL
---- a/crypto/testmgr.c
-+++ b/crypto/testmgr.c
-@@ -47,6 +47,8 @@
- #define ENCRYPT 1
- #define DECRYPT 0
-
-+#ifndef CONFIG_CRYPTO_MANAGER_NO_TESTS
-+
- struct tcrypt_result {
- struct completion completion;
- int err;
-@@ -2359,8 +2361,11 @@ static int alg_find_test(const char *alg
- return -1;
- }
-
-+#endif /* CONFIG_CRYPTO_MANAGER_NO_TESTS */
-+
- int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
- {
-+#ifndef CONFIG_CRYPTO_MANAGER_NO_TESTS
- int i;
- int j;
- int rc;
-@@ -2415,5 +2420,8 @@ notest:
- return 0;
- non_fips_alg:
- return -EINVAL;
-+#else /* CONFIG_CRYPTO_MANAGER_NO_TESTS */
-+ return 0;
-+#endif /* CONFIG_CRYPTO_MANAGER_NO_TESTS */
- }
- EXPORT_SYMBOL_GPL(alg_test);
---- a/crypto/testmgr.h
-+++ b/crypto/testmgr.h
-@@ -20,6 +20,8 @@
-
- #include <crypto/compress.h>
-
-+#ifndef CONFIG_CRYPTO_MANAGER_NO_TESTS
-+
- #define MAX_DIGEST_SIZE 64
- #define MAX_TAP 8
-
-@@ -9552,4 +9554,6 @@ static struct hash_testvec crc32c_tv_tem
- },
- };
-
-+#endif /* CONFIG_CRYPTO_MANAGER_NO_TESTS */
-+
- #endif /* _CRYPTO_TESTMGR_H */
+++ /dev/null
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -337,4 +337,8 @@ config LEDS_TRIGGER_DEFAULT_ON
- comment "iptables trigger is under Netfilter config (LED target)"
- depends on LEDS_TRIGGERS
-
-+config LEDS_TRIGGER_MORSE
-+ tristate "LED Morse Trigger"
-+ depends on LEDS_TRIGGERS
-+
- endif # NEW_LEDS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -44,3 +44,4 @@ obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) +=
- obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) += ledtrig-backlight.o
- obj-$(CONFIG_LEDS_TRIGGER_GPIO) += ledtrig-gpio.o
- obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o
-+obj-$(CONFIG_LEDS_TRIGGER_MORSE) += ledtrig-morse.o
+++ /dev/null
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -341,4 +341,11 @@ config LEDS_TRIGGER_MORSE
- tristate "LED Morse Trigger"
- depends on LEDS_TRIGGERS
-
-+config LEDS_TRIGGER_NETDEV
-+ tristate "LED Netdev Trigger"
-+ depends on LEDS_TRIGGERS
-+ help
-+ This allows LEDs to be controlled by network device activity.
-+ If unsure, say Y.
-+
- endif # NEW_LEDS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -45,3 +45,4 @@ obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) +=
- obj-$(CONFIG_LEDS_TRIGGER_GPIO) += ledtrig-gpio.o
- obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o
- obj-$(CONFIG_LEDS_TRIGGER_MORSE) += ledtrig-morse.o
-+obj-$(CONFIG_LEDS_TRIGGER_NETDEV) += ledtrig-netdev.o
+++ /dev/null
---- a/drivers/input/misc/Kconfig
-+++ b/drivers/input/misc/Kconfig
-@@ -319,4 +319,20 @@ config INPUT_PCAP
- To compile this driver as a module, choose M here: the
- module will be called pcap_keys.
-
-+config INPUT_GPIO_BUTTONS
-+ tristate "Polled GPIO buttons interface"
-+ depends on GENERIC_GPIO
-+ select INPUT_POLLDEV
-+ help
-+ This driver implements support for buttons connected
-+ to GPIO pins of various CPUs (and some other chips).
-+
-+ Say Y here if your device has buttons connected
-+ directly to such GPIO pins. Your board-specific
-+ setup logic must also provide a platform device,
-+ with configuration data saying which GPIOs are used.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called gpio-buttons.
-+
- endif
---- a/drivers/input/misc/Makefile
-+++ b/drivers/input/misc/Makefile
-@@ -30,4 +30,5 @@ obj-$(CONFIG_INPUT_WINBOND_CIR) += winb
- obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o
- obj-$(CONFIG_INPUT_WM831X_ON) += wm831x-on.o
- obj-$(CONFIG_INPUT_YEALINK) += yealink.o
-+obj-$(CONFIG_INPUT_GPIO_BUTTONS) += gpio_buttons.o
-
+++ /dev/null
---- a/drivers/char/Kconfig
-+++ b/drivers/char/Kconfig
-@@ -1016,6 +1016,14 @@ config CS5535_GPIO
-
- If compiled as a module, it will be called cs5535_gpio.
-
-+config GPIO_DEVICE
-+ tristate "GPIO device support"
-+ depends on GENERIC_GPIO
-+ help
-+ Say Y to enable Linux GPIO device support. This allows control of
-+ GPIO pins using a character device
-+
-+
- config RAW_DRIVER
- tristate "RAW driver (/dev/raw/rawN)"
- depends on BLOCK
---- a/drivers/char/Makefile
-+++ b/drivers/char/Makefile
-@@ -95,6 +95,7 @@ obj-$(CONFIG_SCx200_GPIO) += scx200_gpio
- obj-$(CONFIG_PC8736x_GPIO) += pc8736x_gpio.o
- obj-$(CONFIG_NSC_GPIO) += nsc_gpio.o
- obj-$(CONFIG_CS5535_GPIO) += cs5535_gpio.o
-+obj-$(CONFIG_GPIO_DEVICE) += gpio_dev.o
- obj-$(CONFIG_GPIO_TB0219) += tb0219.o
- obj-$(CONFIG_TELCLOCK) += tlclk.o
-
+++ /dev/null
---- a/include/scsi/scsi.h
-+++ b/include/scsi/scsi.h
-@@ -149,10 +149,10 @@ struct scsi_cmnd;
-
- /* defined in T10 SCSI Primary Commands-2 (SPC2) */
- struct scsi_varlen_cdb_hdr {
-- u8 opcode; /* opcode always == VARIABLE_LENGTH_CMD */
-- u8 control;
-- u8 misc[5];
-- u8 additional_cdb_length; /* total cdb length - 8 */
-+ __u8 opcode; /* opcode always == VARIABLE_LENGTH_CMD */
-+ __u8 control;
-+ __u8 misc[5];
-+ __u8 additional_cdb_length; /* total cdb length - 8 */
- __be16 service_action;
- /* service specific data follows */
- };
+++ /dev/null
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -44,6 +44,7 @@ source "fs/gfs2/Kconfig"
- source "fs/ocfs2/Kconfig"
- source "fs/btrfs/Kconfig"
- source "fs/nilfs2/Kconfig"
-+source "fs/yaffs2/Kconfig"
-
- endif # BLOCK
-
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -125,3 +125,4 @@ obj-$(CONFIG_OCFS2_FS) += ocfs2/
- obj-$(CONFIG_BTRFS_FS) += btrfs/
- obj-$(CONFIG_GFS2_FS) += gfs2/
- obj-$(CONFIG_EXOFS_FS) += exofs/
-+obj-$(CONFIG_YAFFS_FS) += yaffs2/
+++ /dev/null
---- a/fs/yaffs2/devextras.h
-+++ b/fs/yaffs2/devextras.h
-@@ -14,194 +14,135 @@
- */
-
- /*
-- * This file is just holds extra declarations used during development.
-- * Most of these are from kernel includes placed here so we can use them in
-- * applications.
-+ * This file is just holds extra declarations of macros that would normally
-+ * be providesd in the Linux kernel. These macros have been written from
-+ * scratch but are functionally equivalent to the Linux ones.
- *
- */
-
- #ifndef __EXTRAS_H__
- #define __EXTRAS_H__
-
--#if defined WIN32
--#define __inline__ __inline
--#define new newHack
--#endif
--
--#if !(defined __KERNEL__) || (defined WIN32)
-
--/* User space defines */
-+#if !(defined __KERNEL__)
-
-+/* Definition of types */
- typedef unsigned char __u8;
- typedef unsigned short __u16;
- typedef unsigned __u32;
-
-+#endif
-+
- /*
-- * Simple doubly linked list implementation.
-- *
-- * Some of the internal functions ("__xxx") are useful when
-- * manipulating whole lists rather than single entries, as
-- * sometimes we already know the next/prev entries and we can
-- * generate better code by using them directly rather than
-- * using the generic single-entry routines.
-+ * This is a simple doubly linked list implementation that matches the
-+ * way the Linux kernel doubly linked list implementation works.
- */
-
--#define prefetch(x) 1
--
--struct list_head {
-- struct list_head *next, *prev;
-+struct ylist_head {
-+ struct ylist_head *next; /* next in chain */
-+ struct ylist_head *prev; /* previous in chain */
- };
-
--#define LIST_HEAD_INIT(name) { &(name), &(name) }
-
--#define LIST_HEAD(name) \
-- struct list_head name = LIST_HEAD_INIT(name)
-+/* Initialise a static list */
-+#define YLIST_HEAD(name) \
-+struct ylist_head name = { &(name), &(name)}
-+
-
--#define INIT_LIST_HEAD(ptr) do { \
-- (ptr)->next = (ptr); (ptr)->prev = (ptr); \
-+
-+/* Initialise a list head to an empty list */
-+#define YINIT_LIST_HEAD(p) \
-+do { \
-+ (p)->next = (p);\
-+ (p)->prev = (p); \
- } while (0)
-
--/*
-- * Insert a new entry between two known consecutive entries.
-- *
-- * This is only for internal list manipulation where we know
-- * the prev/next entries already!
-- */
--static __inline__ void __list_add(struct list_head *new,
-- struct list_head *prev,
-- struct list_head *next)
--{
-- next->prev = new;
-- new->next = next;
-- new->prev = prev;
-- prev->next = new;
--}
-
--/**
-- * list_add - add a new entry
-- * @new: new entry to be added
-- * @head: list head to add it after
-- *
-- * Insert a new entry after the specified head.
-- * This is good for implementing stacks.
-- */
--static __inline__ void list_add(struct list_head *new, struct list_head *head)
-+/* Add an element to a list */
-+static __inline__ void ylist_add(struct ylist_head *newEntry,
-+ struct ylist_head *list)
- {
-- __list_add(new, head, head->next);
--}
-+ struct ylist_head *listNext = list->next;
-+
-+ list->next = newEntry;
-+ newEntry->prev = list;
-+ newEntry->next = listNext;
-+ listNext->prev = newEntry;
-
--/**
-- * list_add_tail - add a new entry
-- * @new: new entry to be added
-- * @head: list head to add it before
-- *
-- * Insert a new entry before the specified head.
-- * This is useful for implementing queues.
-- */
--static __inline__ void list_add_tail(struct list_head *new,
-- struct list_head *head)
--{
-- __list_add(new, head->prev, head);
- }
-
--/*
-- * Delete a list entry by making the prev/next entries
-- * point to each other.
-- *
-- * This is only for internal list manipulation where we know
-- * the prev/next entries already!
-- */
--static __inline__ void __list_del(struct list_head *prev,
-- struct list_head *next)
-+static __inline__ void ylist_add_tail(struct ylist_head *newEntry,
-+ struct ylist_head *list)
- {
-- next->prev = prev;
-- prev->next = next;
-+ struct ylist_head *listPrev = list->prev;
-+
-+ list->prev = newEntry;
-+ newEntry->next = list;
-+ newEntry->prev = listPrev;
-+ listPrev->next = newEntry;
-+
- }
-
--/**
-- * list_del - deletes entry from list.
-- * @entry: the element to delete from the list.
-- * Note: list_empty on entry does not return true after this, the entry is
-- * in an undefined state.
-- */
--static __inline__ void list_del(struct list_head *entry)
-+
-+/* Take an element out of its current list, with or without
-+ * reinitialising the links.of the entry*/
-+static __inline__ void ylist_del(struct ylist_head *entry)
- {
-- __list_del(entry->prev, entry->next);
-+ struct ylist_head *listNext = entry->next;
-+ struct ylist_head *listPrev = entry->prev;
-+
-+ listNext->prev = listPrev;
-+ listPrev->next = listNext;
-+
- }
-
--/**
-- * list_del_init - deletes entry from list and reinitialize it.
-- * @entry: the element to delete from the list.
-- */
--static __inline__ void list_del_init(struct list_head *entry)
-+static __inline__ void ylist_del_init(struct ylist_head *entry)
- {
-- __list_del(entry->prev, entry->next);
-- INIT_LIST_HEAD(entry);
-+ ylist_del(entry);
-+ entry->next = entry->prev = entry;
- }
-
--/**
-- * list_empty - tests whether a list is empty
-- * @head: the list to test.
-- */
--static __inline__ int list_empty(struct list_head *head)
-+
-+/* Test if the list is empty */
-+static __inline__ int ylist_empty(struct ylist_head *entry)
- {
-- return head->next == head;
-+ return (entry->next == entry);
- }
-
--/**
-- * list_splice - join two lists
-- * @list: the new list to add.
-- * @head: the place to add it in the first list.
-+
-+/* ylist_entry takes a pointer to a list entry and offsets it to that
-+ * we can find a pointer to the object it is embedded in.
- */
--static __inline__ void list_splice(struct list_head *list,
-- struct list_head *head)
--{
-- struct list_head *first = list->next;
-
-- if (first != list) {
-- struct list_head *last = list->prev;
-- struct list_head *at = head->next;
--
-- first->prev = head;
-- head->next = first;
--
-- last->next = at;
-- at->prev = last;
-- }
--}
-
--/**
-- * list_entry - get the struct for this entry
-- * @ptr: the &struct list_head pointer.
-- * @type: the type of the struct this is embedded in.
-- * @member: the name of the list_struct within the struct.
-- */
--#define list_entry(ptr, type, member) \
-- ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
--
--/**
-- * list_for_each - iterate over a list
-- * @pos: the &struct list_head to use as a loop counter.
-- * @head: the head for your list.
-- */
--#define list_for_each(pos, head) \
-- for (pos = (head)->next, prefetch(pos->next); pos != (head); \
-- pos = pos->next, prefetch(pos->next))
--
--/**
-- * list_for_each_safe - iterate over a list safe against removal
-- * of list entry
-- * @pos: the &struct list_head to use as a loop counter.
-- * @n: another &struct list_head to use as temporary storage
-- * @head: the head for your list.
-- */
--#define list_for_each_safe(pos, n, head) \
-- for (pos = (head)->next, n = pos->next; pos != (head); \
-- pos = n, n = pos->next)
-+#define ylist_entry(entry, type, member) \
-+ ((type *)((char *)(entry)-(unsigned long)(&((type *)NULL)->member)))
-
--/*
-- * File types
-+
-+/* ylist_for_each and list_for_each_safe iterate over lists.
-+ * ylist_for_each_safe uses temporary storage to make the list delete safe
- */
-+
-+#define ylist_for_each(itervar, list) \
-+ for (itervar = (list)->next; itervar != (list); itervar = itervar->next)
-+
-+#define ylist_for_each_safe(itervar, saveVar, list) \
-+ for (itervar = (list)->next, saveVar = (list)->next->next; \
-+ itervar != (list); itervar = saveVar, saveVar = saveVar->next)
-+
-+
-+#if !(defined __KERNEL__)
-+
-+
-+#ifndef WIN32
-+#include <sys/stat.h>
-+#endif
-+
-+
-+#ifdef CONFIG_YAFFS_PROVIDE_DEFS
-+/* File types */
-+
-+
- #define DT_UNKNOWN 0
- #define DT_FIFO 1
- #define DT_CHR 2
-@@ -212,6 +153,7 @@ static __inline__ void list_splice(struc
- #define DT_SOCK 12
- #define DT_WHT 14
-
-+
- #ifndef WIN32
- #include <sys/stat.h>
- #endif
-@@ -227,10 +169,6 @@ static __inline__ void list_splice(struc
- #define ATTR_ATIME 16
- #define ATTR_MTIME 32
- #define ATTR_CTIME 64
--#define ATTR_ATIME_SET 128
--#define ATTR_MTIME_SET 256
--#define ATTR_FORCE 512 /* Not a change, but a change it */
--#define ATTR_ATTR_FLAG 1024
-
- struct iattr {
- unsigned int ia_valid;
-@@ -244,21 +182,15 @@ struct iattr {
- unsigned int ia_attr_flags;
- };
-
--#define KERN_DEBUG
-+#endif
-
- #else
-
--#ifndef WIN32
- #include <linux/types.h>
--#include <linux/list.h>
- #include <linux/fs.h>
- #include <linux/stat.h>
--#endif
-
- #endif
-
--#if defined WIN32
--#undef new
--#endif
-
- #endif
---- a/fs/yaffs2/Kconfig
-+++ b/fs/yaffs2/Kconfig
-@@ -5,7 +5,7 @@
- config YAFFS_FS
- tristate "YAFFS2 file system support"
- default n
-- depends on MTD
-+ depends on MTD_BLOCK
- select YAFFS_YAFFS1
- select YAFFS_YAFFS2
- help
-@@ -43,7 +43,8 @@ config YAFFS_9BYTE_TAGS
- format that you need to continue to support. New data written
- also uses the older-style format. Note: Use of this option
- generally requires that MTD's oob layout be adjusted to use the
-- older-style format. See notes on tags formats and MTD versions.
-+ older-style format. See notes on tags formats and MTD versions
-+ in yaffs_mtdif1.c.
-
- If unsure, say N.
-
-@@ -109,26 +110,6 @@ config YAFFS_DISABLE_LAZY_LOAD
-
- If unsure, say N.
-
--config YAFFS_CHECKPOINT_RESERVED_BLOCKS
-- int "Reserved blocks for checkpointing"
-- depends on YAFFS_YAFFS2
-- default 10
-- help
-- Give the number of Blocks to reserve for checkpointing.
-- Checkpointing saves the state at unmount so that mounting is
-- much faster as a scan of all the flash to regenerate this state
-- is not needed. These Blocks are reserved per partition, so if
-- you have very small partitions the default (10) may be a mess
-- for you. You can set this value to 0, but that does not mean
-- checkpointing is disabled at all. There only won't be any
-- specially reserved blocks for checkpointing, so if there is
-- enough free space on the filesystem, it will be used for
-- checkpointing.
--
-- If unsure, leave at default (10), but don't wonder if there are
-- always 2MB used on your large page device partition (10 x 2k
-- pagesize). When using small partitions or when being very small
-- on space, you probably want to set this to zero.
-
- config YAFFS_DISABLE_WIDE_TNODES
- bool "Turn off wide tnodes"
---- a/fs/yaffs2/Makefile
-+++ b/fs/yaffs2/Makefile
-@@ -5,7 +5,6 @@
- obj-$(CONFIG_YAFFS_FS) += yaffs.o
-
- yaffs-y := yaffs_ecc.o yaffs_fs.o yaffs_guts.o yaffs_checkptrw.o
--yaffs-y += yaffs_packedtags2.o yaffs_nand.o yaffs_qsort.o
-+yaffs-y += yaffs_packedtags1.o yaffs_packedtags2.o yaffs_nand.o yaffs_qsort.o
- yaffs-y += yaffs_tagscompat.o yaffs_tagsvalidity.o
--yaffs-y += yaffs_mtdif1.o yaffs_packedtags1.o
--yaffs-y += yaffs_mtdif.o yaffs_mtdif2.o
-+yaffs-y += yaffs_mtdif.o yaffs_mtdif1.o yaffs_mtdif2.o
---- a/fs/yaffs2/moduleconfig.h
-+++ b/fs/yaffs2/moduleconfig.h
-@@ -27,12 +27,12 @@
-
- /* Default: Not selected */
- /* Meaning: Yaffs does its own ECC, rather than using MTD ECC */
--//#define CONFIG_YAFFS_DOES_ECC
-+/* #define CONFIG_YAFFS_DOES_ECC */
-
- /* Default: Not selected */
- /* Meaning: ECC byte order is 'wrong'. Only meaningful if */
- /* CONFIG_YAFFS_DOES_ECC is set */
--//#define CONFIG_YAFFS_ECC_WRONG_ORDER
-+/* #define CONFIG_YAFFS_ECC_WRONG_ORDER */
-
- /* Default: Selected */
- /* Meaning: Disables testing whether chunks are erased before writing to them*/
-@@ -54,11 +54,11 @@ that you need to continue to support. N
- older-style format.
- Note: Use of this option generally requires that MTD's oob layout be
- adjusted to use the older-style format. See notes on tags formats and
--MTD versions.
-+MTD versions in yaffs_mtdif1.c.
- */
- /* Default: Not selected */
- /* Meaning: Use older-style on-NAND data format with pageStatus byte */
--#define CONFIG_YAFFS_9BYTE_TAGS
-+/* #define CONFIG_YAFFS_9BYTE_TAGS */
-
- #endif /* YAFFS_OUT_OF_TREE */
-
---- a/fs/yaffs2/yaffs_checkptrw.c
-+++ b/fs/yaffs2/yaffs_checkptrw.c
-@@ -12,48 +12,43 @@
- */
-
- const char *yaffs_checkptrw_c_version =
-- "$Id: yaffs_checkptrw.c,v 1.14 2007-05-15 20:07:40 charles Exp $";
-+ "$Id: yaffs_checkptrw.c,v 1.18 2009-03-06 17:20:49 wookey Exp $";
-
-
- #include "yaffs_checkptrw.h"
--
-+#include "yaffs_getblockinfo.h"
-
- static int yaffs_CheckpointSpaceOk(yaffs_Device *dev)
- {
--
- int blocksAvailable = dev->nErasedBlocks - dev->nReservedBlocks;
-
- T(YAFFS_TRACE_CHECKPOINT,
- (TSTR("checkpt blocks available = %d" TENDSTR),
- blocksAvailable));
-
--
- return (blocksAvailable <= 0) ? 0 : 1;
- }
-
-
- static int yaffs_CheckpointErase(yaffs_Device *dev)
- {
--
- int i;
-
--
-- if(!dev->eraseBlockInNAND)
-+ if (!dev->eraseBlockInNAND)
- return 0;
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("checking blocks %d to %d"TENDSTR),
-- dev->internalStartBlock,dev->internalEndBlock));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checking blocks %d to %d"TENDSTR),
-+ dev->internalStartBlock, dev->internalEndBlock));
-
-- for(i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) {
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i);
-- if(bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("erasing checkpt block %d"TENDSTR),i));
-- if(dev->eraseBlockInNAND(dev,i- dev->blockOffset /* realign */)){
-+ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) {
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i);
-+ if (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("erasing checkpt block %d"TENDSTR), i));
-+ if (dev->eraseBlockInNAND(dev, i - dev->blockOffset /* realign */)) {
- bi->blockState = YAFFS_BLOCK_STATE_EMPTY;
- dev->nErasedBlocks++;
- dev->nFreeChunks += dev->nChunksPerBlock;
-- }
-- else {
-- dev->markNANDBlockBad(dev,i);
-+ } else {
-+ dev->markNANDBlockBad(dev, i);
- bi->blockState = YAFFS_BLOCK_STATE_DEAD;
- }
- }
-@@ -71,23 +66,23 @@ static void yaffs_CheckpointFindNextEras
- int blocksAvailable = dev->nErasedBlocks - dev->nReservedBlocks;
- T(YAFFS_TRACE_CHECKPOINT,
- (TSTR("allocating checkpt block: erased %d reserved %d avail %d next %d "TENDSTR),
-- dev->nErasedBlocks,dev->nReservedBlocks,blocksAvailable,dev->checkpointNextBlock));
-+ dev->nErasedBlocks, dev->nReservedBlocks, blocksAvailable, dev->checkpointNextBlock));
-
-- if(dev->checkpointNextBlock >= 0 &&
-- dev->checkpointNextBlock <= dev->internalEndBlock &&
-- blocksAvailable > 0){
--
-- for(i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++){
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i);
-- if(bi->blockState == YAFFS_BLOCK_STATE_EMPTY){
-+ if (dev->checkpointNextBlock >= 0 &&
-+ dev->checkpointNextBlock <= dev->internalEndBlock &&
-+ blocksAvailable > 0) {
-+
-+ for (i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++) {
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i);
-+ if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY) {
- dev->checkpointNextBlock = i + 1;
- dev->checkpointCurrentBlock = i;
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("allocating checkpt block %d"TENDSTR),i));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("allocating checkpt block %d"TENDSTR), i));
- return;
- }
- }
- }
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("out of checkpt blocks"TENDSTR)));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("out of checkpt blocks"TENDSTR)));
-
- dev->checkpointNextBlock = -1;
- dev->checkpointCurrentBlock = -1;
-@@ -98,30 +93,31 @@ static void yaffs_CheckpointFindNextChec
- int i;
- yaffs_ExtendedTags tags;
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("find next checkpt block: start: blocks %d next %d" TENDSTR),
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("find next checkpt block: start: blocks %d next %d" TENDSTR),
- dev->blocksInCheckpoint, dev->checkpointNextBlock));
-
-- if(dev->blocksInCheckpoint < dev->checkpointMaxBlocks)
-- for(i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++){
-+ if (dev->blocksInCheckpoint < dev->checkpointMaxBlocks)
-+ for (i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++) {
- int chunk = i * dev->nChunksPerBlock;
- int realignedChunk = chunk - dev->chunkOffset;
-
-- dev->readChunkWithTagsFromNAND(dev,realignedChunk,NULL,&tags);
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("find next checkpt block: search: block %d oid %d seq %d eccr %d" TENDSTR),
-- i, tags.objectId,tags.sequenceNumber,tags.eccResult));
-+ dev->readChunkWithTagsFromNAND(dev, realignedChunk,
-+ NULL, &tags);
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("find next checkpt block: search: block %d oid %d seq %d eccr %d" TENDSTR),
-+ i, tags.objectId, tags.sequenceNumber, tags.eccResult));
-
-- if(tags.sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA){
-+ if (tags.sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA) {
- /* Right kind of block */
- dev->checkpointNextBlock = tags.objectId;
- dev->checkpointCurrentBlock = i;
- dev->checkpointBlockList[dev->blocksInCheckpoint] = i;
- dev->blocksInCheckpoint++;
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("found checkpt block %d"TENDSTR),i));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("found checkpt block %d"TENDSTR), i));
- return;
- }
- }
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("found no more checkpt blocks"TENDSTR)));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("found no more checkpt blocks"TENDSTR)));
-
- dev->checkpointNextBlock = -1;
- dev->checkpointCurrentBlock = -1;
-@@ -133,17 +129,17 @@ int yaffs_CheckpointOpen(yaffs_Device *d
-
- /* Got the functions we need? */
- if (!dev->writeChunkWithTagsToNAND ||
-- !dev->readChunkWithTagsFromNAND ||
-- !dev->eraseBlockInNAND ||
-- !dev->markNANDBlockBad)
-+ !dev->readChunkWithTagsFromNAND ||
-+ !dev->eraseBlockInNAND ||
-+ !dev->markNANDBlockBad)
- return 0;
-
-- if(forWriting && !yaffs_CheckpointSpaceOk(dev))
-+ if (forWriting && !yaffs_CheckpointSpaceOk(dev))
- return 0;
-
-- if(!dev->checkpointBuffer)
-- dev->checkpointBuffer = YMALLOC_DMA(dev->nDataBytesPerChunk);
-- if(!dev->checkpointBuffer)
-+ if (!dev->checkpointBuffer)
-+ dev->checkpointBuffer = YMALLOC_DMA(dev->totalBytesPerChunk);
-+ if (!dev->checkpointBuffer)
- return 0;
-
-
-@@ -159,12 +155,10 @@ int yaffs_CheckpointOpen(yaffs_Device *d
- dev->checkpointNextBlock = dev->internalStartBlock;
-
- /* Erase all the blocks in the checkpoint area */
-- if(forWriting){
-- memset(dev->checkpointBuffer,0,dev->nDataBytesPerChunk);
-+ if (forWriting) {
-+ memset(dev->checkpointBuffer, 0, dev->nDataBytesPerChunk);
- dev->checkpointByteOffset = 0;
- return yaffs_CheckpointErase(dev);
--
--
- } else {
- int i;
- /* Set to a value that will kick off a read */
-@@ -174,7 +168,7 @@ int yaffs_CheckpointOpen(yaffs_Device *d
- dev->blocksInCheckpoint = 0;
- dev->checkpointMaxBlocks = (dev->internalEndBlock - dev->internalStartBlock)/16 + 2;
- dev->checkpointBlockList = YMALLOC(sizeof(int) * dev->checkpointMaxBlocks);
-- for(i = 0; i < dev->checkpointMaxBlocks; i++)
-+ for (i = 0; i < dev->checkpointMaxBlocks; i++)
- dev->checkpointBlockList[i] = -1;
- }
-
-@@ -191,18 +185,17 @@ int yaffs_GetCheckpointSum(yaffs_Device
-
- static int yaffs_CheckpointFlushBuffer(yaffs_Device *dev)
- {
--
- int chunk;
- int realignedChunk;
-
- yaffs_ExtendedTags tags;
-
-- if(dev->checkpointCurrentBlock < 0){
-+ if (dev->checkpointCurrentBlock < 0) {
- yaffs_CheckpointFindNextErasedBlock(dev);
- dev->checkpointCurrentChunk = 0;
- }
-
-- if(dev->checkpointCurrentBlock < 0)
-+ if (dev->checkpointCurrentBlock < 0)
- return 0;
-
- tags.chunkDeleted = 0;
-@@ -210,10 +203,10 @@ static int yaffs_CheckpointFlushBuffer(y
- tags.chunkId = dev->checkpointPageSequence + 1;
- tags.sequenceNumber = YAFFS_SEQUENCE_CHECKPOINT_DATA;
- tags.byteCount = dev->nDataBytesPerChunk;
-- if(dev->checkpointCurrentChunk == 0){
-+ if (dev->checkpointCurrentChunk == 0) {
- /* First chunk we write for the block? Set block state to
- checkpoint */
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,dev->checkpointCurrentBlock);
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, dev->checkpointCurrentBlock);
- bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT;
- dev->blocksInCheckpoint++;
- }
-@@ -221,28 +214,29 @@ static int yaffs_CheckpointFlushBuffer(y
- chunk = dev->checkpointCurrentBlock * dev->nChunksPerBlock + dev->checkpointCurrentChunk;
-
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint wite buffer nand %d(%d:%d) objid %d chId %d" TENDSTR),
-- chunk, dev->checkpointCurrentBlock, dev->checkpointCurrentChunk,tags.objectId,tags.chunkId));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint wite buffer nand %d(%d:%d) objid %d chId %d" TENDSTR),
-+ chunk, dev->checkpointCurrentBlock, dev->checkpointCurrentChunk, tags.objectId, tags.chunkId));
-
- realignedChunk = chunk - dev->chunkOffset;
-
-- dev->writeChunkWithTagsToNAND(dev,realignedChunk,dev->checkpointBuffer,&tags);
-+ dev->writeChunkWithTagsToNAND(dev, realignedChunk,
-+ dev->checkpointBuffer, &tags);
- dev->checkpointByteOffset = 0;
- dev->checkpointPageSequence++;
- dev->checkpointCurrentChunk++;
-- if(dev->checkpointCurrentChunk >= dev->nChunksPerBlock){
-+ if (dev->checkpointCurrentChunk >= dev->nChunksPerBlock) {
- dev->checkpointCurrentChunk = 0;
- dev->checkpointCurrentBlock = -1;
- }
-- memset(dev->checkpointBuffer,0,dev->nDataBytesPerChunk);
-+ memset(dev->checkpointBuffer, 0, dev->nDataBytesPerChunk);
-
- return 1;
- }
-
-
--int yaffs_CheckpointWrite(yaffs_Device *dev,const void *data, int nBytes)
-+int yaffs_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes)
- {
-- int i=0;
-+ int i = 0;
- int ok = 1;
-
-
-@@ -250,17 +244,14 @@ int yaffs_CheckpointWrite(yaffs_Device *
-
-
-
-- if(!dev->checkpointBuffer)
-+ if (!dev->checkpointBuffer)
- return 0;
-
-- if(!dev->checkpointOpenForWrite)
-+ if (!dev->checkpointOpenForWrite)
- return -1;
-
-- while(i < nBytes && ok) {
--
--
--
-- dev->checkpointBuffer[dev->checkpointByteOffset] = *dataBytes ;
-+ while (i < nBytes && ok) {
-+ dev->checkpointBuffer[dev->checkpointByteOffset] = *dataBytes;
- dev->checkpointSum += *dataBytes;
- dev->checkpointXor ^= *dataBytes;
-
-@@ -270,18 +261,17 @@ int yaffs_CheckpointWrite(yaffs_Device *
- dev->checkpointByteCount++;
-
-
-- if(dev->checkpointByteOffset < 0 ||
-+ if (dev->checkpointByteOffset < 0 ||
- dev->checkpointByteOffset >= dev->nDataBytesPerChunk)
- ok = yaffs_CheckpointFlushBuffer(dev);
--
- }
-
-- return i;
-+ return i;
- }
-
- int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes)
- {
-- int i=0;
-+ int i = 0;
- int ok = 1;
- yaffs_ExtendedTags tags;
-
-@@ -291,52 +281,54 @@ int yaffs_CheckpointRead(yaffs_Device *d
-
- __u8 *dataBytes = (__u8 *)data;
-
-- if(!dev->checkpointBuffer)
-+ if (!dev->checkpointBuffer)
- return 0;
-
-- if(dev->checkpointOpenForWrite)
-+ if (dev->checkpointOpenForWrite)
- return -1;
-
-- while(i < nBytes && ok) {
-+ while (i < nBytes && ok) {
-
-
-- if(dev->checkpointByteOffset < 0 ||
-- dev->checkpointByteOffset >= dev->nDataBytesPerChunk) {
-+ if (dev->checkpointByteOffset < 0 ||
-+ dev->checkpointByteOffset >= dev->nDataBytesPerChunk) {
-
-- if(dev->checkpointCurrentBlock < 0){
-+ if (dev->checkpointCurrentBlock < 0) {
- yaffs_CheckpointFindNextCheckpointBlock(dev);
- dev->checkpointCurrentChunk = 0;
- }
-
-- if(dev->checkpointCurrentBlock < 0)
-+ if (dev->checkpointCurrentBlock < 0)
- ok = 0;
- else {
--
-- chunk = dev->checkpointCurrentBlock * dev->nChunksPerBlock +
-- dev->checkpointCurrentChunk;
-+ chunk = dev->checkpointCurrentBlock *
-+ dev->nChunksPerBlock +
-+ dev->checkpointCurrentChunk;
-
- realignedChunk = chunk - dev->chunkOffset;
-
-- /* read in the next chunk */
-- /* printf("read checkpoint page %d\n",dev->checkpointPage); */
-- dev->readChunkWithTagsFromNAND(dev, realignedChunk,
-- dev->checkpointBuffer,
-- &tags);
--
-- if(tags.chunkId != (dev->checkpointPageSequence + 1) ||
-- tags.sequenceNumber != YAFFS_SEQUENCE_CHECKPOINT_DATA)
-- ok = 0;
-+ /* read in the next chunk */
-+ /* printf("read checkpoint page %d\n",dev->checkpointPage); */
-+ dev->readChunkWithTagsFromNAND(dev,
-+ realignedChunk,
-+ dev->checkpointBuffer,
-+ &tags);
-+
-+ if (tags.chunkId != (dev->checkpointPageSequence + 1) ||
-+ tags.eccResult > YAFFS_ECC_RESULT_FIXED ||
-+ tags.sequenceNumber != YAFFS_SEQUENCE_CHECKPOINT_DATA)
-+ ok = 0;
-
- dev->checkpointByteOffset = 0;
- dev->checkpointPageSequence++;
- dev->checkpointCurrentChunk++;
-
-- if(dev->checkpointCurrentChunk >= dev->nChunksPerBlock)
-+ if (dev->checkpointCurrentChunk >= dev->nChunksPerBlock)
- dev->checkpointCurrentBlock = -1;
- }
- }
-
-- if(ok){
-+ if (ok) {
- *dataBytes = dev->checkpointBuffer[dev->checkpointByteOffset];
- dev->checkpointSum += *dataBytes;
- dev->checkpointXor ^= *dataBytes;
-@@ -353,17 +345,17 @@ int yaffs_CheckpointRead(yaffs_Device *d
- int yaffs_CheckpointClose(yaffs_Device *dev)
- {
-
-- if(dev->checkpointOpenForWrite){
-- if(dev->checkpointByteOffset != 0)
-+ if (dev->checkpointOpenForWrite) {
-+ if (dev->checkpointByteOffset != 0)
- yaffs_CheckpointFlushBuffer(dev);
- } else {
- int i;
-- for(i = 0; i < dev->blocksInCheckpoint && dev->checkpointBlockList[i] >= 0; i++){
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,dev->checkpointBlockList[i]);
-- if(bi->blockState == YAFFS_BLOCK_STATE_EMPTY)
-+ for (i = 0; i < dev->blocksInCheckpoint && dev->checkpointBlockList[i] >= 0; i++) {
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, dev->checkpointBlockList[i]);
-+ if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY)
- bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT;
- else {
-- // Todo this looks odd...
-+ /* Todo this looks odd... */
- }
- }
- YFREE(dev->checkpointBlockList);
-@@ -374,27 +366,25 @@ int yaffs_CheckpointClose(yaffs_Device *
- dev->nErasedBlocks -= dev->blocksInCheckpoint;
-
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint byte count %d" TENDSTR),
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint byte count %d" TENDSTR),
- dev->checkpointByteCount));
-
-- if(dev->checkpointBuffer){
-+ if (dev->checkpointBuffer) {
- /* free the buffer */
- YFREE(dev->checkpointBuffer);
- dev->checkpointBuffer = NULL;
- return 1;
-- }
-- else
-+ } else
- return 0;
--
- }
-
- int yaffs_CheckpointInvalidateStream(yaffs_Device *dev)
- {
- /* Erase the first checksum block */
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint invalidate"TENDSTR)));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint invalidate"TENDSTR)));
-
-- if(!yaffs_CheckpointSpaceOk(dev))
-+ if (!yaffs_CheckpointSpaceOk(dev))
- return 0;
-
- return yaffs_CheckpointErase(dev);
---- a/fs/yaffs2/yaffs_checkptrw.h
-+++ b/fs/yaffs2/yaffs_checkptrw.h
-@@ -20,9 +20,9 @@
-
- int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting);
-
--int yaffs_CheckpointWrite(yaffs_Device *dev,const void *data, int nBytes);
-+int yaffs_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes);
-
--int yaffs_CheckpointRead(yaffs_Device *dev,void *data, int nBytes);
-+int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes);
-
- int yaffs_GetCheckpointSum(yaffs_Device *dev, __u32 *sum);
-
---- a/fs/yaffs2/yaffs_ecc.c
-+++ b/fs/yaffs2/yaffs_ecc.c
-@@ -29,7 +29,7 @@
- */
-
- const char *yaffs_ecc_c_version =
-- "$Id: yaffs_ecc.c,v 1.9 2007-02-14 01:09:06 wookey Exp $";
-+ "$Id: yaffs_ecc.c,v 1.11 2009-03-06 17:20:50 wookey Exp $";
-
- #include "yportenv.h"
-
-@@ -109,12 +109,10 @@ void yaffs_ECCCalculate(const unsigned c
- b = column_parity_table[*data++];
- col_parity ^= b;
-
-- if (b & 0x01) // odd number of bits in the byte
-- {
-+ if (b & 0x01) { /* odd number of bits in the byte */
- line_parity ^= i;
- line_parity_prime ^= ~i;
- }
--
- }
-
- ecc[2] = (~col_parity) | 0x03;
-@@ -158,7 +156,7 @@ void yaffs_ECCCalculate(const unsigned c
- ecc[0] = ~t;
-
- #ifdef CONFIG_YAFFS_ECC_WRONG_ORDER
-- // Swap the bytes into the wrong order
-+ /* Swap the bytes into the wrong order */
- t = ecc[0];
- ecc[0] = ecc[1];
- ecc[1] = t;
-@@ -189,7 +187,7 @@ int yaffs_ECCCorrect(unsigned char *data
- unsigned bit;
-
- #ifdef CONFIG_YAFFS_ECC_WRONG_ORDER
-- // swap the bytes to correct for the wrong order
-+ /* swap the bytes to correct for the wrong order */
- unsigned char t;
-
- t = d0;
-@@ -251,7 +249,7 @@ int yaffs_ECCCorrect(unsigned char *data
- * ECCxxxOther does ECC calcs on arbitrary n bytes of data
- */
- void yaffs_ECCCalculateOther(const unsigned char *data, unsigned nBytes,
-- yaffs_ECCOther * eccOther)
-+ yaffs_ECCOther *eccOther)
- {
- unsigned int i;
-
-@@ -278,8 +276,8 @@ void yaffs_ECCCalculateOther(const unsig
- }
-
- int yaffs_ECCCorrectOther(unsigned char *data, unsigned nBytes,
-- yaffs_ECCOther * read_ecc,
-- const yaffs_ECCOther * test_ecc)
-+ yaffs_ECCOther *read_ecc,
-+ const yaffs_ECCOther *test_ecc)
- {
- unsigned char cDelta; /* column parity delta */
- unsigned lDelta; /* line parity delta */
-@@ -294,8 +292,7 @@ int yaffs_ECCCorrectOther(unsigned char
- return 0; /* no error */
-
- if (lDelta == ~lDeltaPrime &&
-- (((cDelta ^ (cDelta >> 1)) & 0x15) == 0x15))
-- {
-+ (((cDelta ^ (cDelta >> 1)) & 0x15) == 0x15)) {
- /* Single bit (recoverable) error in data */
-
- bit = 0;
-@@ -307,7 +304,7 @@ int yaffs_ECCCorrectOther(unsigned char
- if (cDelta & 0x02)
- bit |= 0x01;
-
-- if(lDelta >= nBytes)
-+ if (lDelta >= nBytes)
- return -1;
-
- data[lDelta] ^= (1 << bit);
-@@ -316,7 +313,7 @@ int yaffs_ECCCorrectOther(unsigned char
- }
-
- if ((yaffs_CountBits32(lDelta) + yaffs_CountBits32(lDeltaPrime) +
-- yaffs_CountBits(cDelta)) == 1) {
-+ yaffs_CountBits(cDelta)) == 1) {
- /* Reccoverable error in ecc */
-
- *read_ecc = *test_ecc;
-@@ -326,6 +323,4 @@ int yaffs_ECCCorrectOther(unsigned char
- /* Unrecoverable error */
-
- return -1;
--
- }
--
---- a/fs/yaffs2/yaffs_ecc.h
-+++ b/fs/yaffs2/yaffs_ecc.h
-@@ -13,15 +13,15 @@
- * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
- */
-
-- /*
-- * This code implements the ECC algorithm used in SmartMedia.
-- *
-- * The ECC comprises 22 bits of parity information and is stuffed into 3 bytes.
-- * The two unused bit are set to 1.
-- * The ECC can correct single bit errors in a 256-byte page of data. Thus, two such ECC
-- * blocks are used on a 512-byte NAND page.
-- *
-- */
-+/*
-+ * This code implements the ECC algorithm used in SmartMedia.
-+ *
-+ * The ECC comprises 22 bits of parity information and is stuffed into 3 bytes.
-+ * The two unused bit are set to 1.
-+ * The ECC can correct single bit errors in a 256-byte page of data. Thus, two such ECC
-+ * blocks are used on a 512-byte NAND page.
-+ *
-+ */
-
- #ifndef __YAFFS_ECC_H__
- #define __YAFFS_ECC_H__
-@@ -34,11 +34,11 @@ typedef struct {
-
- void yaffs_ECCCalculate(const unsigned char *data, unsigned char *ecc);
- int yaffs_ECCCorrect(unsigned char *data, unsigned char *read_ecc,
-- const unsigned char *test_ecc);
-+ const unsigned char *test_ecc);
-
- void yaffs_ECCCalculateOther(const unsigned char *data, unsigned nBytes,
-- yaffs_ECCOther * ecc);
-+ yaffs_ECCOther *ecc);
- int yaffs_ECCCorrectOther(unsigned char *data, unsigned nBytes,
-- yaffs_ECCOther * read_ecc,
-- const yaffs_ECCOther * test_ecc);
-+ yaffs_ECCOther *read_ecc,
-+ const yaffs_ECCOther *test_ecc);
- #endif
---- a/fs/yaffs2/yaffs_fs.c
-+++ b/fs/yaffs2/yaffs_fs.c
-@@ -1,7 +1,7 @@
- /*
- * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
- *
-- * Copyright (C) 2002-2007 Aleph One Ltd.
-+ * Copyright (C) 2002-2009 Aleph One Ltd.
- * for Toby Churchill Ltd and Brightstar Engineering
- *
- * Created by Charles Manning <charles@aleph1.co.uk>
-@@ -32,18 +32,17 @@
- */
-
- const char *yaffs_fs_c_version =
-- "$Id: yaffs_fs.c,v 1.63 2007-09-19 20:35:40 imcd Exp $";
-+ "$Id: yaffs_fs.c,v 1.79 2009-03-17 01:12:00 wookey Exp $";
- extern const char *yaffs_guts_c_version;
-
- #include <linux/version.h>
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
- #include <linux/config.h>
- #endif
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/slab.h>
- #include <linux/init.h>
--#include <linux/list.h>
- #include <linux/fs.h>
- #include <linux/proc_fs.h>
- #include <linux/smp_lock.h>
-@@ -53,10 +52,12 @@ extern const char *yaffs_guts_c_version;
- #include <linux/string.h>
- #include <linux/ctype.h>
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#include "asm/div64.h"
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-
- #include <linux/statfs.h> /* Added NCB 15-8-2003 */
--#include <asm/statfs.h>
-+#include <linux/statfs.h>
- #define UnlockPage(p) unlock_page(p)
- #define Page_Uptodate(page) test_bit(PG_uptodate, &(page)->flags)
-
-@@ -69,22 +70,45 @@ extern const char *yaffs_guts_c_version;
- #define BDEVNAME_SIZE 0
- #define yaffs_devname(sb, buf) kdevname(sb->s_dev)
-
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0))
- /* added NCB 26/5/2006 for 2.4.25-vrs2-tcl1 kernel */
- #define __user
- #endif
-
- #endif
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26))
-+#define YPROC_ROOT (&proc_root)
-+#else
-+#define YPROC_ROOT NULL
-+#endif
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- #define WRITE_SIZE_STR "writesize"
--#define WRITE_SIZE(mtd) (mtd)->writesize
-+#define WRITE_SIZE(mtd) ((mtd)->writesize)
- #else
- #define WRITE_SIZE_STR "oobblock"
--#define WRITE_SIZE(mtd) (mtd)->oobblock
-+#define WRITE_SIZE(mtd) ((mtd)->oobblock)
- #endif
-
--#include <asm/uaccess.h>
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 27))
-+#define YAFFS_USE_WRITE_BEGIN_END 1
-+#else
-+#define YAFFS_USE_WRITE_BEGIN_END 0
-+#endif
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 28))
-+static uint32_t YCALCBLOCKS(uint64_t partition_size, uint32_t block_size)
-+{
-+ uint64_t result = partition_size;
-+ do_div(result, block_size);
-+ return (uint32_t)result;
-+}
-+#else
-+#define YCALCBLOCKS(s, b) ((s)/(b))
-+#endif
-+
-+#include <linux/uaccess.h>
-
- #include "yportenv.h"
- #include "yaffs_guts.h"
-@@ -96,28 +120,44 @@ extern const char *yaffs_guts_c_version;
-
- unsigned int yaffs_traceMask = YAFFS_TRACE_BAD_BLOCKS;
- unsigned int yaffs_wr_attempts = YAFFS_WR_ATTEMPTS;
-+unsigned int yaffs_auto_checkpoint = 1;
-
- /* Module Parameters */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
--module_param(yaffs_traceMask,uint,0644);
--module_param(yaffs_wr_attempts,uint,0644);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-+module_param(yaffs_traceMask, uint, 0644);
-+module_param(yaffs_wr_attempts, uint, 0644);
-+module_param(yaffs_auto_checkpoint, uint, 0644);
-+#else
-+MODULE_PARM(yaffs_traceMask, "i");
-+MODULE_PARM(yaffs_wr_attempts, "i");
-+MODULE_PARM(yaffs_auto_checkpoint, "i");
-+#endif
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 25))
-+/* use iget and read_inode */
-+#define Y_IGET(sb, inum) iget((sb), (inum))
-+static void yaffs_read_inode(struct inode *inode);
-+
- #else
--MODULE_PARM(yaffs_traceMask,"i");
--MODULE_PARM(yaffs_wr_attempts,"i");
-+/* Call local equivalent */
-+#define YAFFS_USE_OWN_IGET
-+#define Y_IGET(sb, inum) yaffs_iget((sb), (inum))
-+
-+static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino);
- #endif
-
- /*#define T(x) printk x */
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
--#define yaffs_InodeToObjectLV(iptr) (iptr)->i_private
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18))
-+#define yaffs_InodeToObjectLV(iptr) ((iptr)->i_private)
- #else
--#define yaffs_InodeToObjectLV(iptr) (iptr)->u.generic_ip
-+#define yaffs_InodeToObjectLV(iptr) ((iptr)->u.generic_ip)
- #endif
-
- #define yaffs_InodeToObject(iptr) ((yaffs_Object *)(yaffs_InodeToObjectLV(iptr)))
- #define yaffs_DentryToObject(dptr) yaffs_InodeToObject((dptr)->d_inode)
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- #define yaffs_SuperToDevice(sb) ((yaffs_Device *)sb->s_fs_info)
- #else
- #define yaffs_SuperToDevice(sb) ((yaffs_Device *)sb->u.generic_sbp)
-@@ -126,47 +166,49 @@ MODULE_PARM(yaffs_wr_attempts,"i");
- static void yaffs_put_super(struct super_block *sb);
-
- static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n,
-- loff_t * pos);
-+ loff_t *pos);
-+static ssize_t yaffs_hold_space(struct file *f);
-+static void yaffs_release_space(struct file *f);
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_file_flush(struct file *file, fl_owner_t id);
- #else
- static int yaffs_file_flush(struct file *file);
- #endif
-
- static int yaffs_sync_object(struct file *file, struct dentry *dentry,
-- int datasync);
-+ int datasync);
-
- static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir);
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode,
- struct nameidata *n);
- static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry,
-- struct nameidata *n);
-+ struct nameidata *n);
- #else
- static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode);
- static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry);
- #endif
- static int yaffs_link(struct dentry *old_dentry, struct inode *dir,
-- struct dentry *dentry);
-+ struct dentry *dentry);
- static int yaffs_unlink(struct inode *dir, struct dentry *dentry);
- static int yaffs_symlink(struct inode *dir, struct dentry *dentry,
-- const char *symname);
-+ const char *symname);
- static int yaffs_mkdir(struct inode *dir, struct dentry *dentry, int mode);
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
-- dev_t dev);
-+ dev_t dev);
- #else
- static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
-- int dev);
-+ int dev);
- #endif
- static int yaffs_rename(struct inode *old_dir, struct dentry *old_dentry,
- struct inode *new_dir, struct dentry *new_dentry);
- static int yaffs_setattr(struct dentry *dentry, struct iattr *attr);
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_sync_fs(struct super_block *sb, int wait);
- static void yaffs_write_super(struct super_block *sb);
- #else
-@@ -174,33 +216,47 @@ static int yaffs_sync_fs(struct super_bl
- static int yaffs_write_super(struct super_block *sb);
- #endif
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_statfs(struct dentry *dentry, struct kstatfs *buf);
--#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_statfs(struct super_block *sb, struct kstatfs *buf);
- #else
- static int yaffs_statfs(struct super_block *sb, struct statfs *buf);
- #endif
--static void yaffs_read_inode(struct inode *inode);
-
-+#ifdef YAFFS_HAS_PUT_INODE
- static void yaffs_put_inode(struct inode *inode);
-+#endif
-+
- static void yaffs_delete_inode(struct inode *);
- static void yaffs_clear_inode(struct inode *);
-
- static int yaffs_readpage(struct file *file, struct page *page);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_writepage(struct page *page, struct writeback_control *wbc);
- #else
- static int yaffs_writepage(struct page *page);
- #endif
-+
-+
-+#if (YAFFS_USE_WRITE_BEGIN_END != 0)
-+static int yaffs_write_begin(struct file *filp, struct address_space *mapping,
-+ loff_t pos, unsigned len, unsigned flags,
-+ struct page **pagep, void **fsdata);
-+static int yaffs_write_end(struct file *filp, struct address_space *mapping,
-+ loff_t pos, unsigned len, unsigned copied,
-+ struct page *pg, void *fsdadata);
-+#else
- static int yaffs_prepare_write(struct file *f, struct page *pg,
-- unsigned offset, unsigned to);
-+ unsigned offset, unsigned to);
- static int yaffs_commit_write(struct file *f, struct page *pg, unsigned offset,
-- unsigned to);
-+ unsigned to);
-
--static int yaffs_readlink(struct dentry *dentry, char __user * buffer,
-- int buflen);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-+#endif
-+
-+static int yaffs_readlink(struct dentry *dentry, char __user *buffer,
-+ int buflen);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
- static void *yaffs_follow_link(struct dentry *dentry, struct nameidata *nd);
- #else
- static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd);
-@@ -209,12 +265,17 @@ static int yaffs_follow_link(struct dent
- static struct address_space_operations yaffs_file_address_operations = {
- .readpage = yaffs_readpage,
- .writepage = yaffs_writepage,
-+#if (YAFFS_USE_WRITE_BEGIN_END > 0)
-+ .write_begin = yaffs_write_begin,
-+ .write_end = yaffs_write_end,
-+#else
- .prepare_write = yaffs_prepare_write,
- .commit_write = yaffs_commit_write,
-+#endif
- };
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22))
--static struct file_operations yaffs_file_operations = {
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22))
-+static const struct file_operations yaffs_file_operations = {
- .read = do_sync_read,
- .write = do_sync_write,
- .aio_read = generic_file_aio_read,
-@@ -224,11 +285,12 @@ static struct file_operations yaffs_file
- .fsync = yaffs_sync_object,
- .splice_read = generic_file_splice_read,
- .splice_write = generic_file_splice_write,
-+ .llseek = generic_file_llseek,
- };
-
--#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
-+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18))
-
--static struct file_operations yaffs_file_operations = {
-+static const struct file_operations yaffs_file_operations = {
- .read = do_sync_read,
- .write = do_sync_write,
- .aio_read = generic_file_aio_read,
-@@ -241,29 +303,29 @@ static struct file_operations yaffs_file
-
- #else
-
--static struct file_operations yaffs_file_operations = {
-+static const struct file_operations yaffs_file_operations = {
- .read = generic_file_read,
- .write = generic_file_write,
- .mmap = generic_file_mmap,
- .flush = yaffs_file_flush,
- .fsync = yaffs_sync_object,
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- .sendfile = generic_file_sendfile,
- #endif
- };
- #endif
-
--static struct inode_operations yaffs_file_inode_operations = {
-+static const struct inode_operations yaffs_file_inode_operations = {
- .setattr = yaffs_setattr,
- };
-
--static struct inode_operations yaffs_symlink_inode_operations = {
-+static const struct inode_operations yaffs_symlink_inode_operations = {
- .readlink = yaffs_readlink,
- .follow_link = yaffs_follow_link,
- .setattr = yaffs_setattr,
- };
-
--static struct inode_operations yaffs_dir_inode_operations = {
-+static const struct inode_operations yaffs_dir_inode_operations = {
- .create = yaffs_create,
- .lookup = yaffs_lookup,
- .link = yaffs_link,
-@@ -276,16 +338,21 @@ static struct inode_operations yaffs_dir
- .setattr = yaffs_setattr,
- };
-
--static struct file_operations yaffs_dir_operations = {
-+static const struct file_operations yaffs_dir_operations = {
- .read = generic_read_dir,
- .readdir = yaffs_readdir,
- .fsync = yaffs_sync_object,
- };
-
--static struct super_operations yaffs_super_ops = {
-+static const struct super_operations yaffs_super_ops = {
- .statfs = yaffs_statfs,
-+
-+#ifndef YAFFS_USE_OWN_IGET
- .read_inode = yaffs_read_inode,
-+#endif
-+#ifdef YAFFS_HAS_PUT_INODE
- .put_inode = yaffs_put_inode,
-+#endif
- .put_super = yaffs_put_super,
- .delete_inode = yaffs_delete_inode,
- .clear_inode = yaffs_clear_inode,
-@@ -293,22 +360,21 @@ static struct super_operations yaffs_sup
- .write_super = yaffs_write_super,
- };
-
--static void yaffs_GrossLock(yaffs_Device * dev)
-+static void yaffs_GrossLock(yaffs_Device *dev)
- {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs locking\n"));
--
-+ T(YAFFS_TRACE_OS, ("yaffs locking %p\n", current));
- down(&dev->grossLock);
-+ T(YAFFS_TRACE_OS, ("yaffs locked %p\n", current));
- }
-
--static void yaffs_GrossUnlock(yaffs_Device * dev)
-+static void yaffs_GrossUnlock(yaffs_Device *dev)
- {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs unlocking\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs unlocking %p\n", current));
- up(&dev->grossLock);
--
- }
-
--static int yaffs_readlink(struct dentry *dentry, char __user * buffer,
-- int buflen)
-+static int yaffs_readlink(struct dentry *dentry, char __user *buffer,
-+ int buflen)
- {
- unsigned char *alias;
- int ret;
-@@ -329,7 +395,7 @@ static int yaffs_readlink(struct dentry
- return ret;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
- static void *yaffs_follow_link(struct dentry *dentry, struct nameidata *nd)
- #else
- static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd)
-@@ -345,32 +411,31 @@ static int yaffs_follow_link(struct dent
-
- yaffs_GrossUnlock(dev);
-
-- if (!alias)
-- {
-+ if (!alias) {
- ret = -ENOMEM;
- goto out;
-- }
-+ }
-
- ret = vfs_follow_link(nd, alias);
- kfree(alias);
- out:
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-- return ERR_PTR (ret);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
-+ return ERR_PTR(ret);
- #else
- return ret;
- #endif
- }
-
- struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev,
-- yaffs_Object * obj);
-+ yaffs_Object *obj);
-
- /*
- * Lookup is used to find objects in the fs
- */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-
- static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry,
-- struct nameidata *n)
-+ struct nameidata *n)
- #else
- static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry)
- #endif
-@@ -383,12 +448,11 @@ static struct dentry *yaffs_lookup(struc
- yaffs_GrossLock(dev);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_lookup for %d:%s\n",
-- yaffs_InodeToObject(dir)->objectId, dentry->d_name.name));
-+ ("yaffs_lookup for %d:%s\n",
-+ yaffs_InodeToObject(dir)->objectId, dentry->d_name.name));
-
-- obj =
-- yaffs_FindObjectByName(yaffs_InodeToObject(dir),
-- dentry->d_name.name);
-+ obj = yaffs_FindObjectByName(yaffs_InodeToObject(dir),
-+ dentry->d_name.name);
-
- obj = yaffs_GetEquivalentObject(obj); /* in case it was a hardlink */
-
-@@ -397,13 +461,13 @@ static struct dentry *yaffs_lookup(struc
-
- if (obj) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_lookup found %d\n", obj->objectId));
-+ ("yaffs_lookup found %d\n", obj->objectId));
-
- inode = yaffs_get_inode(dir->i_sb, obj->yst_mode, 0, obj);
-
- if (inode) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_loookup dentry \n"));
-+ ("yaffs_loookup dentry \n"));
- /* #if 0 asserted by NCB for 2.5/6 compatability - falls through to
- * d_add even if NULL inode */
- #if 0
-@@ -416,7 +480,7 @@ static struct dentry *yaffs_lookup(struc
- }
-
- } else {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_lookup not found\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_lookup not found\n"));
-
- }
-
-@@ -425,20 +489,22 @@ static struct dentry *yaffs_lookup(struc
- d_add(dentry, inode);
-
- return NULL;
-- /* return (ERR_PTR(-EIO)); */
--
- }
-
-+
-+#ifdef YAFFS_HAS_PUT_INODE
-+
- /* For now put inode is just for debugging
- * Put inode is called when the inode **structure** is put.
- */
- static void yaffs_put_inode(struct inode *inode)
- {
- T(YAFFS_TRACE_OS,
-- ("yaffs_put_inode: ino %d, count %d\n", (int)inode->i_ino,
-- atomic_read(&inode->i_count)));
-+ ("yaffs_put_inode: ino %d, count %d\n", (int)inode->i_ino,
-+ atomic_read(&inode->i_count)));
-
- }
-+#endif
-
- /* clear is called to tell the fs to release any per-inode data it holds */
- static void yaffs_clear_inode(struct inode *inode)
-@@ -449,9 +515,9 @@ static void yaffs_clear_inode(struct ino
- obj = yaffs_InodeToObject(inode);
-
- T(YAFFS_TRACE_OS,
-- ("yaffs_clear_inode: ino %d, count %d %s\n", (int)inode->i_ino,
-- atomic_read(&inode->i_count),
-- obj ? "object exists" : "null object"));
-+ ("yaffs_clear_inode: ino %d, count %d %s\n", (int)inode->i_ino,
-+ atomic_read(&inode->i_count),
-+ obj ? "object exists" : "null object"));
-
- if (obj) {
- dev = obj->myDev;
-@@ -486,23 +552,23 @@ static void yaffs_delete_inode(struct in
- yaffs_Device *dev;
-
- T(YAFFS_TRACE_OS,
-- ("yaffs_delete_inode: ino %d, count %d %s\n", (int)inode->i_ino,
-- atomic_read(&inode->i_count),
-- obj ? "object exists" : "null object"));
-+ ("yaffs_delete_inode: ino %d, count %d %s\n", (int)inode->i_ino,
-+ atomic_read(&inode->i_count),
-+ obj ? "object exists" : "null object"));
-
- if (obj) {
- dev = obj->myDev;
- yaffs_GrossLock(dev);
-- yaffs_DeleteFile(obj);
-+ yaffs_DeleteObject(obj);
- yaffs_GrossUnlock(dev);
- }
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-- truncate_inode_pages (&inode->i_data, 0);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
-+ truncate_inode_pages(&inode->i_data, 0);
- #endif
- clear_inode(inode);
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_file_flush(struct file *file, fl_owner_t id)
- #else
- static int yaffs_file_flush(struct file *file)
-@@ -513,8 +579,8 @@ static int yaffs_file_flush(struct file
- yaffs_Device *dev = obj->myDev;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_file_flush object %d (%s)\n", obj->objectId,
-- obj->dirty ? "dirty" : "clean"));
-+ ("yaffs_file_flush object %d (%s)\n", obj->objectId,
-+ obj->dirty ? "dirty" : "clean"));
-
- yaffs_GrossLock(dev);
-
-@@ -535,15 +601,15 @@ static int yaffs_readpage_nolock(struct
-
- yaffs_Device *dev;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_readpage at %08x, size %08x\n",
-- (unsigned)(pg->index << PAGE_CACHE_SHIFT),
-- (unsigned)PAGE_CACHE_SIZE));
-+ T(YAFFS_TRACE_OS, ("yaffs_readpage at %08x, size %08x\n",
-+ (unsigned)(pg->index << PAGE_CACHE_SHIFT),
-+ (unsigned)PAGE_CACHE_SIZE));
-
- obj = yaffs_DentryToObject(f->f_dentry);
-
- dev = obj->myDev;
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- BUG_ON(!PageLocked(pg));
- #else
- if (!PageLocked(pg))
-@@ -555,9 +621,9 @@ static int yaffs_readpage_nolock(struct
-
- yaffs_GrossLock(dev);
-
-- ret =
-- yaffs_ReadDataFromFile(obj, pg_buf, pg->index << PAGE_CACHE_SHIFT,
-- PAGE_CACHE_SIZE);
-+ ret = yaffs_ReadDataFromFile(obj, pg_buf,
-+ pg->index << PAGE_CACHE_SHIFT,
-+ PAGE_CACHE_SIZE);
-
- yaffs_GrossUnlock(dev);
-
-@@ -575,7 +641,7 @@ static int yaffs_readpage_nolock(struct
- flush_dcache_page(pg);
- kunmap(pg);
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_readpage done\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_readpage done\n"));
- return ret;
- }
-
-@@ -593,7 +659,7 @@ static int yaffs_readpage(struct file *f
-
- /* writepage inspired by/stolen from smbfs */
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_writepage(struct page *page, struct writeback_control *wbc)
- #else
- static int yaffs_writepage(struct page *page)
-@@ -616,12 +682,11 @@ static int yaffs_writepage(struct page *
-
- if (offset > inode->i_size) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_writepage at %08x, inode size = %08x!!!\n",
-- (unsigned)(page->index << PAGE_CACHE_SHIFT),
-- (unsigned)inode->i_size));
-+ ("yaffs_writepage at %08x, inode size = %08x!!!\n",
-+ (unsigned)(page->index << PAGE_CACHE_SHIFT),
-+ (unsigned)inode->i_size));
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG " -> don't care!!\n"));
-+ (" -> don't care!!\n"));
- unlock_page(page);
- return 0;
- }
-@@ -629,11 +694,10 @@ static int yaffs_writepage(struct page *
- end_index = inode->i_size >> PAGE_CACHE_SHIFT;
-
- /* easy case */
-- if (page->index < end_index) {
-+ if (page->index < end_index)
- nBytes = PAGE_CACHE_SIZE;
-- } else {
-+ else
- nBytes = inode->i_size & (PAGE_CACHE_SIZE - 1);
-- }
-
- get_page(page);
-
-@@ -643,19 +707,18 @@ static int yaffs_writepage(struct page *
- yaffs_GrossLock(obj->myDev);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_writepage at %08x, size %08x\n",
-- (unsigned)(page->index << PAGE_CACHE_SHIFT), nBytes));
-+ ("yaffs_writepage at %08x, size %08x\n",
-+ (unsigned)(page->index << PAGE_CACHE_SHIFT), nBytes));
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "writepag0: obj = %05x, ino = %05x\n",
-- (int)obj->variant.fileVariant.fileSize, (int)inode->i_size));
-+ ("writepag0: obj = %05x, ino = %05x\n",
-+ (int)obj->variant.fileVariant.fileSize, (int)inode->i_size));
-
-- nWritten =
-- yaffs_WriteDataToFile(obj, buffer, page->index << PAGE_CACHE_SHIFT,
-- nBytes, 0);
-+ nWritten = yaffs_WriteDataToFile(obj, buffer,
-+ page->index << PAGE_CACHE_SHIFT, nBytes, 0);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "writepag1: obj = %05x, ino = %05x\n",
-- (int)obj->variant.fileVariant.fileSize, (int)inode->i_size));
-+ ("writepag1: obj = %05x, ino = %05x\n",
-+ (int)obj->variant.fileVariant.fileSize, (int)inode->i_size));
-
- yaffs_GrossUnlock(obj->myDev);
-
-@@ -667,100 +730,207 @@ static int yaffs_writepage(struct page *
- return (nWritten == nBytes) ? 0 : -ENOSPC;
- }
-
-+
-+#if (YAFFS_USE_WRITE_BEGIN_END > 0)
-+static int yaffs_write_begin(struct file *filp, struct address_space *mapping,
-+ loff_t pos, unsigned len, unsigned flags,
-+ struct page **pagep, void **fsdata)
-+{
-+ struct page *pg = NULL;
-+ pgoff_t index = pos >> PAGE_CACHE_SHIFT;
-+ uint32_t offset = pos & (PAGE_CACHE_SIZE - 1);
-+ uint32_t to = offset + len;
-+
-+ int ret = 0;
-+ int space_held = 0;
-+
-+ T(YAFFS_TRACE_OS, ("start yaffs_write_begin\n"));
-+ /* Get a page */
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 28)
-+ pg = grab_cache_page_write_begin(mapping, index, flags);
-+#else
-+ pg = __grab_cache_page(mapping, index);
-+#endif
-+
-+ *pagep = pg;
-+ if (!pg) {
-+ ret = -ENOMEM;
-+ goto out;
-+ }
-+ /* Get fs space */
-+ space_held = yaffs_hold_space(filp);
-+
-+ if (!space_held) {
-+ ret = -ENOSPC;
-+ goto out;
-+ }
-+
-+ /* Update page if required */
-+
-+ if (!Page_Uptodate(pg) && (offset || to < PAGE_CACHE_SIZE))
-+ ret = yaffs_readpage_nolock(filp, pg);
-+
-+ if (ret)
-+ goto out;
-+
-+ /* Happy path return */
-+ T(YAFFS_TRACE_OS, ("end yaffs_write_begin - ok\n"));
-+
-+ return 0;
-+
-+out:
-+ T(YAFFS_TRACE_OS, ("end yaffs_write_begin fail returning %d\n", ret));
-+ if (space_held)
-+ yaffs_release_space(filp);
-+ if (pg) {
-+ unlock_page(pg);
-+ page_cache_release(pg);
-+ }
-+ return ret;
-+}
-+
-+#else
-+
- static int yaffs_prepare_write(struct file *f, struct page *pg,
-- unsigned offset, unsigned to)
-+ unsigned offset, unsigned to)
- {
-+ T(YAFFS_TRACE_OS, ("yaffs_prepair_write\n"));
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_prepair_write\n"));
- if (!Page_Uptodate(pg) && (offset || to < PAGE_CACHE_SIZE))
- return yaffs_readpage_nolock(f, pg);
--
- return 0;
-+}
-+#endif
-+
-+#if (YAFFS_USE_WRITE_BEGIN_END > 0)
-+static int yaffs_write_end(struct file *filp, struct address_space *mapping,
-+ loff_t pos, unsigned len, unsigned copied,
-+ struct page *pg, void *fsdadata)
-+{
-+ int ret = 0;
-+ void *addr, *kva;
-+ uint32_t offset_into_page = pos & (PAGE_CACHE_SIZE - 1);
-+
-+ kva = kmap(pg);
-+ addr = kva + offset_into_page;
-+
-+ T(YAFFS_TRACE_OS,
-+ ("yaffs_write_end addr %x pos %x nBytes %d\n",
-+ (unsigned) addr,
-+ (int)pos, copied));
-+
-+ ret = yaffs_file_write(filp, addr, copied, &pos);
-+
-+ if (ret != copied) {
-+ T(YAFFS_TRACE_OS,
-+ ("yaffs_write_end not same size ret %d copied %d\n",
-+ ret, copied));
-+ SetPageError(pg);
-+ ClearPageUptodate(pg);
-+ } else {
-+ SetPageUptodate(pg);
-+ }
-+
-+ kunmap(pg);
-
-+ yaffs_release_space(filp);
-+ unlock_page(pg);
-+ page_cache_release(pg);
-+ return ret;
- }
-+#else
-
- static int yaffs_commit_write(struct file *f, struct page *pg, unsigned offset,
-- unsigned to)
-+ unsigned to)
- {
-+ void *addr, *kva;
-
-- void *addr = page_address(pg) + offset;
- loff_t pos = (((loff_t) pg->index) << PAGE_CACHE_SHIFT) + offset;
- int nBytes = to - offset;
- int nWritten;
-
- unsigned spos = pos;
-- unsigned saddr = (unsigned)addr;
-+ unsigned saddr;
-+
-+ kva = kmap(pg);
-+ addr = kva + offset;
-+
-+ saddr = (unsigned) addr;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_commit_write addr %x pos %x nBytes %d\n", saddr,
-- spos, nBytes));
-+ ("yaffs_commit_write addr %x pos %x nBytes %d\n",
-+ saddr, spos, nBytes));
-
- nWritten = yaffs_file_write(f, addr, nBytes, &pos);
-
- if (nWritten != nBytes) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_commit_write not same size nWritten %d nBytes %d\n",
-- nWritten, nBytes));
-+ ("yaffs_commit_write not same size nWritten %d nBytes %d\n",
-+ nWritten, nBytes));
- SetPageError(pg);
- ClearPageUptodate(pg);
- } else {
- SetPageUptodate(pg);
- }
-
-+ kunmap(pg);
-+
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_commit_write returning %d\n",
-- nWritten == nBytes ? 0 : nWritten));
-+ ("yaffs_commit_write returning %d\n",
-+ nWritten == nBytes ? 0 : nWritten));
-
- return nWritten == nBytes ? 0 : nWritten;
--
- }
-+#endif
-+
-
--static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object * obj)
-+static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object *obj)
- {
- if (inode && obj) {
-
-
- /* Check mode against the variant type and attempt to repair if broken. */
-- __u32 mode = obj->yst_mode;
-- switch( obj->variantType ){
-- case YAFFS_OBJECT_TYPE_FILE :
-- if( ! S_ISREG(mode) ){
-- obj->yst_mode &= ~S_IFMT;
-- obj->yst_mode |= S_IFREG;
-- }
--
-- break;
-- case YAFFS_OBJECT_TYPE_SYMLINK :
-- if( ! S_ISLNK(mode) ){
-- obj->yst_mode &= ~S_IFMT;
-- obj->yst_mode |= S_IFLNK;
-- }
--
-- break;
-- case YAFFS_OBJECT_TYPE_DIRECTORY :
-- if( ! S_ISDIR(mode) ){
-- obj->yst_mode &= ~S_IFMT;
-- obj->yst_mode |= S_IFDIR;
-- }
--
-- break;
-- case YAFFS_OBJECT_TYPE_UNKNOWN :
-- case YAFFS_OBJECT_TYPE_HARDLINK :
-- case YAFFS_OBJECT_TYPE_SPECIAL :
-- default:
-- /* TODO? */
-- break;
-- }
-+ __u32 mode = obj->yst_mode;
-+ switch (obj->variantType) {
-+ case YAFFS_OBJECT_TYPE_FILE:
-+ if (!S_ISREG(mode)) {
-+ obj->yst_mode &= ~S_IFMT;
-+ obj->yst_mode |= S_IFREG;
-+ }
-+
-+ break;
-+ case YAFFS_OBJECT_TYPE_SYMLINK:
-+ if (!S_ISLNK(mode)) {
-+ obj->yst_mode &= ~S_IFMT;
-+ obj->yst_mode |= S_IFLNK;
-+ }
-+
-+ break;
-+ case YAFFS_OBJECT_TYPE_DIRECTORY:
-+ if (!S_ISDIR(mode)) {
-+ obj->yst_mode &= ~S_IFMT;
-+ obj->yst_mode |= S_IFDIR;
-+ }
-+
-+ break;
-+ case YAFFS_OBJECT_TYPE_UNKNOWN:
-+ case YAFFS_OBJECT_TYPE_HARDLINK:
-+ case YAFFS_OBJECT_TYPE_SPECIAL:
-+ default:
-+ /* TODO? */
-+ break;
-+ }
-+
-+ inode->i_flags |= S_NOATIME;
-
- inode->i_ino = obj->objectId;
- inode->i_mode = obj->yst_mode;
- inode->i_uid = obj->yst_uid;
- inode->i_gid = obj->yst_gid;
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
- inode->i_blksize = inode->i_sb->s_blocksize;
- #endif
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-
- inode->i_rdev = old_decode_dev(obj->yst_rdev);
- inode->i_atime.tv_sec = (time_t) (obj->yst_atime);
-@@ -781,26 +951,25 @@ static void yaffs_FillInodeFromObject(st
- inode->i_nlink = yaffs_GetObjectLinkCount(obj);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_FillInode mode %x uid %d gid %d size %d count %d\n",
-- inode->i_mode, inode->i_uid, inode->i_gid,
-- (int)inode->i_size, atomic_read(&inode->i_count)));
-+ ("yaffs_FillInode mode %x uid %d gid %d size %d count %d\n",
-+ inode->i_mode, inode->i_uid, inode->i_gid,
-+ (int)inode->i_size, atomic_read(&inode->i_count)));
-
- switch (obj->yst_mode & S_IFMT) {
- default: /* fifo, device or socket */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- init_special_inode(inode, obj->yst_mode,
-- old_decode_dev(obj->yst_rdev));
-+ old_decode_dev(obj->yst_rdev));
- #else
- init_special_inode(inode, obj->yst_mode,
-- (dev_t) (obj->yst_rdev));
-+ (dev_t) (obj->yst_rdev));
- #endif
- break;
- case S_IFREG: /* file */
- inode->i_op = &yaffs_file_inode_operations;
- inode->i_fop = &yaffs_file_operations;
- inode->i_mapping->a_ops =
-- &yaffs_file_address_operations;
-+ &yaffs_file_address_operations;
- break;
- case S_IFDIR: /* directory */
- inode->i_op = &yaffs_dir_inode_operations;
-@@ -817,34 +986,36 @@ static void yaffs_FillInodeFromObject(st
-
- } else {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_FileInode invalid parameters\n"));
-+ ("yaffs_FileInode invalid parameters\n"));
- }
-
- }
-
- struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev,
-- yaffs_Object * obj)
-+ yaffs_Object *obj)
- {
- struct inode *inode;
-
- if (!sb) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_get_inode for NULL super_block!!\n"));
-+ ("yaffs_get_inode for NULL super_block!!\n"));
- return NULL;
-
- }
-
- if (!obj) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_get_inode for NULL object!!\n"));
-+ ("yaffs_get_inode for NULL object!!\n"));
- return NULL;
-
- }
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_get_inode for object %d\n", obj->objectId));
-+ ("yaffs_get_inode for object %d\n", obj->objectId));
-
-- inode = iget(sb, obj->objectId);
-+ inode = Y_IGET(sb, obj->objectId);
-+ if (IS_ERR(inode))
-+ return NULL;
-
- /* NB Side effect: iget calls back to yaffs_read_inode(). */
- /* iget also increments the inode's i_count */
-@@ -854,7 +1025,7 @@ struct inode *yaffs_get_inode(struct sup
- }
-
- static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n,
-- loff_t * pos)
-+ loff_t *pos)
- {
- yaffs_Object *obj;
- int nWritten, ipos;
-@@ -869,28 +1040,26 @@ static ssize_t yaffs_file_write(struct f
-
- inode = f->f_dentry->d_inode;
-
-- if (!S_ISBLK(inode->i_mode) && f->f_flags & O_APPEND) {
-+ if (!S_ISBLK(inode->i_mode) && f->f_flags & O_APPEND)
- ipos = inode->i_size;
-- } else {
-+ else
- ipos = *pos;
-- }
-
-- if (!obj) {
-+ if (!obj)
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_file_write: hey obj is null!\n"));
-- } else {
-+ ("yaffs_file_write: hey obj is null!\n"));
-+ else
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_file_write about to write writing %d bytes"
-- "to object %d at %d\n",
-- n, obj->objectId, ipos));
-- }
-+ ("yaffs_file_write about to write writing %zu bytes"
-+ "to object %d at %d\n",
-+ n, obj->objectId, ipos));
-
- nWritten = yaffs_WriteDataToFile(obj, buf, ipos, n, 0);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_file_write writing %d bytes, %d written at %d\n",
-- n, nWritten, ipos));
-+ ("yaffs_file_write writing %zu bytes, %d written at %d\n",
-+ n, nWritten, ipos));
-+
- if (nWritten > 0) {
- ipos += nWritten;
- *pos = ipos;
-@@ -899,10 +1068,9 @@ static ssize_t yaffs_file_write(struct f
- inode->i_blocks = (ipos + 511) >> 9;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_file_write size updated to %d bytes, "
-- "%d blocks\n",
-- ipos, (int)(inode->i_blocks)));
-+ ("yaffs_file_write size updated to %d bytes, "
-+ "%d blocks\n",
-+ ipos, (int)(inode->i_blocks)));
- }
-
- }
-@@ -910,13 +1078,54 @@ static ssize_t yaffs_file_write(struct f
- return nWritten == 0 ? -ENOSPC : nWritten;
- }
-
-+/* Space holding and freeing is done to ensure we have space available for write_begin/end */
-+/* For now we just assume few parallel writes and check against a small number. */
-+/* Todo: need to do this with a counter to handle parallel reads better */
-+
-+static ssize_t yaffs_hold_space(struct file *f)
-+{
-+ yaffs_Object *obj;
-+ yaffs_Device *dev;
-+
-+ int nFreeChunks;
-+
-+
-+ obj = yaffs_DentryToObject(f->f_dentry);
-+
-+ dev = obj->myDev;
-+
-+ yaffs_GrossLock(dev);
-+
-+ nFreeChunks = yaffs_GetNumberOfFreeChunks(dev);
-+
-+ yaffs_GrossUnlock(dev);
-+
-+ return (nFreeChunks > 20) ? 1 : 0;
-+}
-+
-+static void yaffs_release_space(struct file *f)
-+{
-+ yaffs_Object *obj;
-+ yaffs_Device *dev;
-+
-+
-+ obj = yaffs_DentryToObject(f->f_dentry);
-+
-+ dev = obj->myDev;
-+
-+ yaffs_GrossLock(dev);
-+
-+
-+ yaffs_GrossUnlock(dev);
-+}
-+
- static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir)
- {
- yaffs_Object *obj;
- yaffs_Device *dev;
- struct inode *inode = f->f_dentry->d_inode;
- unsigned long offset, curoffs;
-- struct list_head *i;
-+ struct ylist_head *i;
- yaffs_Object *l;
-
- char name[YAFFS_MAX_NAME_LENGTH + 1];
-@@ -932,24 +1141,20 @@ static int yaffs_readdir(struct file *f,
-
- if (offset == 0) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_readdir: entry . ino %d \n",
-- (int)inode->i_ino));
-- if (filldir(dirent, ".", 1, offset, inode->i_ino, DT_DIR)
-- < 0) {
-+ ("yaffs_readdir: entry . ino %d \n",
-+ (int)inode->i_ino));
-+ if (filldir(dirent, ".", 1, offset, inode->i_ino, DT_DIR) < 0)
- goto out;
-- }
- offset++;
- f->f_pos++;
- }
- if (offset == 1) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_readdir: entry .. ino %d \n",
-- (int)f->f_dentry->d_parent->d_inode->i_ino));
-- if (filldir
-- (dirent, "..", 2, offset,
-- f->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0) {
-+ ("yaffs_readdir: entry .. ino %d \n",
-+ (int)f->f_dentry->d_parent->d_inode->i_ino));
-+ if (filldir(dirent, "..", 2, offset,
-+ f->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0)
- goto out;
-- }
- offset++;
- f->f_pos++;
- }
-@@ -965,35 +1170,32 @@ static int yaffs_readdir(struct file *f,
- f->f_version = inode->i_version;
- }
-
-- list_for_each(i, &obj->variant.directoryVariant.children) {
-+ ylist_for_each(i, &obj->variant.directoryVariant.children) {
- curoffs++;
- if (curoffs >= offset) {
-- l = list_entry(i, yaffs_Object, siblings);
-+ l = ylist_entry(i, yaffs_Object, siblings);
-
- yaffs_GetObjectName(l, name,
- YAFFS_MAX_NAME_LENGTH + 1);
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_readdir: %s inode %d\n", name,
-+ ("yaffs_readdir: %s inode %d\n", name,
- yaffs_GetObjectInode(l)));
-
- if (filldir(dirent,
-- name,
-- strlen(name),
-- offset,
-- yaffs_GetObjectInode(l),
-- yaffs_GetObjectType(l))
-- < 0) {
-+ name,
-+ strlen(name),
-+ offset,
-+ yaffs_GetObjectInode(l),
-+ yaffs_GetObjectType(l)) < 0)
- goto up_and_out;
-- }
-
- offset++;
- f->f_pos++;
- }
- }
-
-- up_and_out:
-- out:
--
-+up_and_out:
-+out:
- yaffs_GrossUnlock(dev);
-
- return 0;
-@@ -1002,12 +1204,19 @@ static int yaffs_readdir(struct file *f,
- /*
- * File creation. Allocate an inode, and we're done..
- */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29)
-+#define YCRED(x) x
-+#else
-+#define YCRED(x) (x->cred)
-+#endif
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
-- dev_t rdev)
-+ dev_t rdev)
- #else
- static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
-- int rdev)
-+ int rdev)
- #endif
- {
- struct inode *inode;
-@@ -1018,25 +1227,25 @@ static int yaffs_mknod(struct inode *dir
- yaffs_Object *parent = yaffs_InodeToObject(dir);
-
- int error = -ENOSPC;
-- uid_t uid = current->fsuid;
-- gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid;
-+ uid_t uid = YCRED(current)->fsuid;
-+ gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid;
-
-- if((dir->i_mode & S_ISGID) && S_ISDIR(mode))
-+ if ((dir->i_mode & S_ISGID) && S_ISDIR(mode))
- mode |= S_ISGID;
-
- if (parent) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod: parent object %d type %d\n",
-- parent->objectId, parent->variantType));
-+ ("yaffs_mknod: parent object %d type %d\n",
-+ parent->objectId, parent->variantType));
- } else {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod: could not get parent object\n"));
-+ ("yaffs_mknod: could not get parent object\n"));
- return -EPERM;
- }
-
- T(YAFFS_TRACE_OS, ("yaffs_mknod: making oject for %s, "
-- "mode %x dev %x\n",
-- dentry->d_name.name, mode, rdev));
-+ "mode %x dev %x\n",
-+ dentry->d_name.name, mode, rdev));
-
- dev = parent->myDev;
-
-@@ -1045,33 +1254,28 @@ static int yaffs_mknod(struct inode *dir
- switch (mode & S_IFMT) {
- default:
- /* Special (socket, fifo, device...) */
-- T(YAFFS_TRACE_OS, (KERN_DEBUG
-- "yaffs_mknod: making special\n"));
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-- obj =
-- yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid,
-- gid, old_encode_dev(rdev));
--#else
-- obj =
-- yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid,
-- gid, rdev);
-+ T(YAFFS_TRACE_OS, ("yaffs_mknod: making special\n"));
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-+ obj = yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid,
-+ gid, old_encode_dev(rdev));
-+#else
-+ obj = yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid,
-+ gid, rdev);
- #endif
- break;
- case S_IFREG: /* file */
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_mknod: making file\n"));
-- obj =
-- yaffs_MknodFile(parent, dentry->d_name.name, mode, uid,
-- gid);
-+ T(YAFFS_TRACE_OS, ("yaffs_mknod: making file\n"));
-+ obj = yaffs_MknodFile(parent, dentry->d_name.name, mode, uid,
-+ gid);
- break;
- case S_IFDIR: /* directory */
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod: making directory\n"));
-- obj =
-- yaffs_MknodDirectory(parent, dentry->d_name.name, mode,
-- uid, gid);
-+ ("yaffs_mknod: making directory\n"));
-+ obj = yaffs_MknodDirectory(parent, dentry->d_name.name, mode,
-+ uid, gid);
- break;
- case S_IFLNK: /* symlink */
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_mknod: making file\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_mknod: making symlink\n"));
- obj = NULL; /* Do we ever get here? */
- break;
- }
-@@ -1083,12 +1287,12 @@ static int yaffs_mknod(struct inode *dir
- inode = yaffs_get_inode(dir->i_sb, mode, rdev, obj);
- d_instantiate(dentry, inode);
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod created object %d count = %d\n",
-- obj->objectId, atomic_read(&inode->i_count)));
-+ ("yaffs_mknod created object %d count = %d\n",
-+ obj->objectId, atomic_read(&inode->i_count)));
- error = 0;
- } else {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod failed making object\n"));
-+ ("yaffs_mknod failed making object\n"));
- error = -ENOMEM;
- }
-
-@@ -1098,25 +1302,19 @@ static int yaffs_mknod(struct inode *dir
- static int yaffs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
- {
- int retVal;
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_mkdir\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_mkdir\n"));
- retVal = yaffs_mknod(dir, dentry, mode | S_IFDIR, 0);
--#if 0
-- /* attempt to fix dir bug - didn't work */
-- if (!retVal) {
-- dget(dentry);
-- }
--#endif
- return retVal;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode,
- struct nameidata *n)
- #else
- static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode)
- #endif
- {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_create\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_create\n"));
- return yaffs_mknod(dir, dentry, mode | S_IFREG, 0);
- }
-
-@@ -1127,8 +1325,8 @@ static int yaffs_unlink(struct inode *di
- yaffs_Device *dev;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_unlink %d:%s\n", (int)(dir->i_ino),
-- dentry->d_name.name));
-+ ("yaffs_unlink %d:%s\n", (int)(dir->i_ino),
-+ dentry->d_name.name));
-
- dev = yaffs_InodeToObject(dir)->myDev;
-
-@@ -1151,82 +1349,74 @@ static int yaffs_unlink(struct inode *di
- * Create a link...
- */
- static int yaffs_link(struct dentry *old_dentry, struct inode *dir,
-- struct dentry *dentry)
-+ struct dentry *dentry)
- {
- struct inode *inode = old_dentry->d_inode;
- yaffs_Object *obj = NULL;
- yaffs_Object *link = NULL;
- yaffs_Device *dev;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_link\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_link\n"));
-
- obj = yaffs_InodeToObject(inode);
- dev = obj->myDev;
-
- yaffs_GrossLock(dev);
-
-- if (!S_ISDIR(inode->i_mode)) /* Don't link directories */
-- {
-- link =
-- yaffs_Link(yaffs_InodeToObject(dir), dentry->d_name.name,
-- obj);
-- }
-+ if (!S_ISDIR(inode->i_mode)) /* Don't link directories */
-+ link = yaffs_Link(yaffs_InodeToObject(dir), dentry->d_name.name,
-+ obj);
-
- if (link) {
- old_dentry->d_inode->i_nlink = yaffs_GetObjectLinkCount(obj);
- d_instantiate(dentry, old_dentry->d_inode);
- atomic_inc(&old_dentry->d_inode->i_count);
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_link link count %d i_count %d\n",
-- old_dentry->d_inode->i_nlink,
-- atomic_read(&old_dentry->d_inode->i_count)));
--
-+ ("yaffs_link link count %d i_count %d\n",
-+ old_dentry->d_inode->i_nlink,
-+ atomic_read(&old_dentry->d_inode->i_count)));
- }
-
- yaffs_GrossUnlock(dev);
-
-- if (link) {
--
-+ if (link)
- return 0;
-- }
-
- return -EPERM;
- }
-
- static int yaffs_symlink(struct inode *dir, struct dentry *dentry,
-- const char *symname)
-+ const char *symname)
- {
- yaffs_Object *obj;
- yaffs_Device *dev;
-- uid_t uid = current->fsuid;
-- gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid;
-+ uid_t uid = YCRED(current)->fsuid;
-+ gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_symlink\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_symlink\n"));
-
- dev = yaffs_InodeToObject(dir)->myDev;
- yaffs_GrossLock(dev);
- obj = yaffs_MknodSymLink(yaffs_InodeToObject(dir), dentry->d_name.name,
-- S_IFLNK | S_IRWXUGO, uid, gid, symname);
-+ S_IFLNK | S_IRWXUGO, uid, gid, symname);
- yaffs_GrossUnlock(dev);
-
- if (obj) {
--
- struct inode *inode;
-
- inode = yaffs_get_inode(dir->i_sb, obj->yst_mode, 0, obj);
- d_instantiate(dentry, inode);
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "symlink created OK\n"));
-+ T(YAFFS_TRACE_OS, ("symlink created OK\n"));
- return 0;
- } else {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "symlink not created\n"));
--
-+ T(YAFFS_TRACE_OS, ("symlink not created\n"));
- }
-
- return -ENOMEM;
- }
-
- static int yaffs_sync_object(struct file *file, struct dentry *dentry,
-- int datasync)
-+ int datasync)
- {
-
- yaffs_Object *obj;
-@@ -1236,7 +1426,7 @@ static int yaffs_sync_object(struct file
-
- dev = obj->myDev;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_sync_object\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_sync_object\n"));
- yaffs_GrossLock(dev);
- yaffs_FlushFile(obj, 1);
- yaffs_GrossUnlock(dev);
-@@ -1255,41 +1445,36 @@ static int yaffs_rename(struct inode *ol
- int retVal = YAFFS_FAIL;
- yaffs_Object *target;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_rename\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_rename\n"));
- dev = yaffs_InodeToObject(old_dir)->myDev;
-
- yaffs_GrossLock(dev);
-
- /* Check if the target is an existing directory that is not empty. */
-- target =
-- yaffs_FindObjectByName(yaffs_InodeToObject(new_dir),
-- new_dentry->d_name.name);
-+ target = yaffs_FindObjectByName(yaffs_InodeToObject(new_dir),
-+ new_dentry->d_name.name);
-
-
-
-- if (target &&
-- target->variantType == YAFFS_OBJECT_TYPE_DIRECTORY &&
-- !list_empty(&target->variant.directoryVariant.children)) {
-+ if (target && target->variantType == YAFFS_OBJECT_TYPE_DIRECTORY &&
-+ !ylist_empty(&target->variant.directoryVariant.children)) {
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "target is non-empty dir\n"));
-+ T(YAFFS_TRACE_OS, ("target is non-empty dir\n"));
-
- retVal = YAFFS_FAIL;
- } else {
--
- /* Now does unlinking internally using shadowing mechanism */
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "calling yaffs_RenameObject\n"));
--
-- retVal =
-- yaffs_RenameObject(yaffs_InodeToObject(old_dir),
-- old_dentry->d_name.name,
-- yaffs_InodeToObject(new_dir),
-- new_dentry->d_name.name);
-+ T(YAFFS_TRACE_OS, ("calling yaffs_RenameObject\n"));
-
-+ retVal = yaffs_RenameObject(yaffs_InodeToObject(old_dir),
-+ old_dentry->d_name.name,
-+ yaffs_InodeToObject(new_dir),
-+ new_dentry->d_name.name);
- }
- yaffs_GrossUnlock(dev);
-
- if (retVal == YAFFS_OK) {
-- if(target) {
-+ if (target) {
- new_dentry->d_inode->i_nlink--;
- mark_inode_dirty(new_dentry->d_inode);
- }
-@@ -1298,7 +1483,6 @@ static int yaffs_rename(struct inode *ol
- } else {
- return -ENOTEMPTY;
- }
--
- }
-
- static int yaffs_setattr(struct dentry *dentry, struct iattr *attr)
-@@ -1308,15 +1492,15 @@ static int yaffs_setattr(struct dentry *
- yaffs_Device *dev;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_setattr of object %d\n",
-- yaffs_InodeToObject(inode)->objectId));
--
-- if ((error = inode_change_ok(inode, attr)) == 0) {
-+ ("yaffs_setattr of object %d\n",
-+ yaffs_InodeToObject(inode)->objectId));
-
-+ error = inode_change_ok(inode, attr);
-+ if (error == 0) {
- dev = yaffs_InodeToObject(inode)->myDev;
- yaffs_GrossLock(dev);
- if (yaffs_SetAttributes(yaffs_InodeToObject(inode), attr) ==
-- YAFFS_OK) {
-+ YAFFS_OK) {
- error = 0;
- } else {
- error = -EPERM;
-@@ -1328,12 +1512,12 @@ static int yaffs_setattr(struct dentry *
- return error;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_statfs(struct dentry *dentry, struct kstatfs *buf)
- {
- yaffs_Device *dev = yaffs_DentryToObject(dentry)->myDev;
- struct super_block *sb = dentry->d_sb;
--#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_statfs(struct super_block *sb, struct kstatfs *buf)
- {
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-@@ -1343,32 +1527,53 @@ static int yaffs_statfs(struct super_blo
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
- #endif
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_statfs\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_statfs\n"));
-
- yaffs_GrossLock(dev);
-
- buf->f_type = YAFFS_MAGIC;
- buf->f_bsize = sb->s_blocksize;
- buf->f_namelen = 255;
-- if (sb->s_blocksize > dev->nDataBytesPerChunk) {
-+
-+ if (dev->nDataBytesPerChunk & (dev->nDataBytesPerChunk - 1)) {
-+ /* Do this if chunk size is not a power of 2 */
-+
-+ uint64_t bytesInDev;
-+ uint64_t bytesFree;
-+
-+ bytesInDev = ((uint64_t)((dev->endBlock - dev->startBlock + 1))) *
-+ ((uint64_t)(dev->nChunksPerBlock * dev->nDataBytesPerChunk));
-+
-+ do_div(bytesInDev, sb->s_blocksize); /* bytesInDev becomes the number of blocks */
-+ buf->f_blocks = bytesInDev;
-+
-+ bytesFree = ((uint64_t)(yaffs_GetNumberOfFreeChunks(dev))) *
-+ ((uint64_t)(dev->nDataBytesPerChunk));
-+
-+ do_div(bytesFree, sb->s_blocksize);
-+
-+ buf->f_bfree = bytesFree;
-+
-+ } else if (sb->s_blocksize > dev->nDataBytesPerChunk) {
-
- buf->f_blocks =
-- (dev->endBlock - dev->startBlock +
-- 1) * dev->nChunksPerBlock / (sb->s_blocksize /
-- dev->nDataBytesPerChunk);
-+ (dev->endBlock - dev->startBlock + 1) *
-+ dev->nChunksPerBlock /
-+ (sb->s_blocksize / dev->nDataBytesPerChunk);
- buf->f_bfree =
-- yaffs_GetNumberOfFreeChunks(dev) / (sb->s_blocksize /
-- dev->nDataBytesPerChunk);
-+ yaffs_GetNumberOfFreeChunks(dev) /
-+ (sb->s_blocksize / dev->nDataBytesPerChunk);
- } else {
--
- buf->f_blocks =
-- (dev->endBlock - dev->startBlock +
-- 1) * dev->nChunksPerBlock * (dev->nDataBytesPerChunk /
-- sb->s_blocksize);
-+ (dev->endBlock - dev->startBlock + 1) *
-+ dev->nChunksPerBlock *
-+ (dev->nDataBytesPerChunk / sb->s_blocksize);
-+
- buf->f_bfree =
-- yaffs_GetNumberOfFreeChunks(dev) * (dev->nDataBytesPerChunk /
-- sb->s_blocksize);
-+ yaffs_GetNumberOfFreeChunks(dev) *
-+ (dev->nDataBytesPerChunk / sb->s_blocksize);
- }
-+
- buf->f_files = 0;
- buf->f_ffree = 0;
- buf->f_bavail = buf->f_bfree;
-@@ -1378,18 +1583,19 @@ static int yaffs_statfs(struct super_blo
- }
-
-
--/**
- static int yaffs_do_sync_fs(struct super_block *sb)
- {
-
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_do_sync_fs\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_do_sync_fs\n"));
-
-- if(sb->s_dirt) {
-+ if (sb->s_dirt) {
- yaffs_GrossLock(dev);
-
-- if(dev)
-+ if (dev) {
-+ yaffs_FlushEntireDeviceCache(dev);
- yaffs_CheckpointSave(dev);
-+ }
-
- yaffs_GrossUnlock(dev);
-
-@@ -1397,35 +1603,73 @@ static int yaffs_do_sync_fs(struct super
- }
- return 0;
- }
--**/
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static void yaffs_write_super(struct super_block *sb)
- #else
- static int yaffs_write_super(struct super_block *sb)
- #endif
- {
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_write_super\n"));
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18))
-- return 0; /* yaffs_do_sync_fs(sb);*/
-+ T(YAFFS_TRACE_OS, ("yaffs_write_super\n"));
-+ if (yaffs_auto_checkpoint >= 2)
-+ yaffs_do_sync_fs(sb);
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
-+ return 0;
- #endif
- }
-
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_sync_fs(struct super_block *sb, int wait)
- #else
- static int yaffs_sync_fs(struct super_block *sb)
- #endif
- {
-+ T(YAFFS_TRACE_OS, ("yaffs_sync_fs\n"));
-+
-+ if (yaffs_auto_checkpoint >= 1)
-+ yaffs_do_sync_fs(sb);
-+
-+ return 0;
-+}
-+
-+#ifdef YAFFS_USE_OWN_IGET
-+
-+static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino)
-+{
-+ struct inode *inode;
-+ yaffs_Object *obj;
-+ yaffs_Device *dev = yaffs_SuperToDevice(sb);
-+
-+ T(YAFFS_TRACE_OS,
-+ ("yaffs_iget for %lu\n", ino));
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_sync_fs\n"));
-+ inode = iget_locked(sb, ino);
-+ if (!inode)
-+ return ERR_PTR(-ENOMEM);
-+ if (!(inode->i_state & I_NEW))
-+ return inode;
-+
-+ /* NB This is called as a side effect of other functions, but
-+ * we had to release the lock to prevent deadlocks, so
-+ * need to lock again.
-+ */
-
-- return 0; /* yaffs_do_sync_fs(sb);*/
-+ yaffs_GrossLock(dev);
-
-+ obj = yaffs_FindObjectByNumber(dev, inode->i_ino);
-+
-+ yaffs_FillInodeFromObject(inode, obj);
-+
-+ yaffs_GrossUnlock(dev);
-+
-+ unlock_new_inode(inode);
-+ return inode;
- }
-
-+#else
-
- static void yaffs_read_inode(struct inode *inode)
- {
-@@ -1438,7 +1682,7 @@ static void yaffs_read_inode(struct inod
- yaffs_Device *dev = yaffs_SuperToDevice(inode->i_sb);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_read_inode for %d\n", (int)inode->i_ino));
-+ ("yaffs_read_inode for %d\n", (int)inode->i_ino));
-
- yaffs_GrossLock(dev);
-
-@@ -1449,18 +1693,20 @@ static void yaffs_read_inode(struct inod
- yaffs_GrossUnlock(dev);
- }
-
--static LIST_HEAD(yaffs_dev_list);
-+#endif
-+
-+static YLIST_HEAD(yaffs_dev_list);
-
--#if 0 // not used
-+#if 0 /* not used */
- static int yaffs_remount_fs(struct super_block *sb, int *flags, char *data)
- {
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-
-- if( *flags & MS_RDONLY ) {
-+ if (*flags & MS_RDONLY) {
- struct mtd_info *mtd = yaffs_SuperToDevice(sb)->genericDevice;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_remount_fs: %s: RO\n", dev->name ));
-+ ("yaffs_remount_fs: %s: RO\n", dev->name));
-
- yaffs_GrossLock(dev);
-
-@@ -1472,10 +1718,9 @@ static int yaffs_remount_fs(struct super
- mtd->sync(mtd);
-
- yaffs_GrossUnlock(dev);
-- }
-- else {
-+ } else {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_remount_fs: %s: RW\n", dev->name ));
-+ ("yaffs_remount_fs: %s: RW\n", dev->name));
- }
-
- return 0;
-@@ -1486,7 +1731,7 @@ static void yaffs_put_super(struct super
- {
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_put_super\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_put_super\n"));
-
- yaffs_GrossLock(dev);
-
-@@ -1494,18 +1739,17 @@ static void yaffs_put_super(struct super
-
- yaffs_CheckpointSave(dev);
-
-- if (dev->putSuperFunc) {
-+ if (dev->putSuperFunc)
- dev->putSuperFunc(sb);
-- }
-
- yaffs_Deinitialise(dev);
-
- yaffs_GrossUnlock(dev);
-
- /* we assume this is protected by lock_kernel() in mount/umount */
-- list_del(&dev->devList);
-+ ylist_del(&dev->devList);
-
-- if(dev->spareBuffer){
-+ if (dev->spareBuffer) {
- YFREE(dev->spareBuffer);
- dev->spareBuffer = NULL;
- }
-@@ -1516,12 +1760,10 @@ static void yaffs_put_super(struct super
-
- static void yaffs_MTDPutSuper(struct super_block *sb)
- {
--
- struct mtd_info *mtd = yaffs_SuperToDevice(sb)->genericDevice;
-
-- if (mtd->sync) {
-+ if (mtd->sync)
- mtd->sync(mtd);
-- }
-
- put_mtd_device(mtd);
- }
-@@ -1531,9 +1773,9 @@ static void yaffs_MarkSuperBlockDirty(vo
- {
- struct super_block *sb = (struct super_block *)vsb;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_MarkSuperBlockDirty() sb = %p\n",sb));
--// if(sb)
--// sb->s_dirt = 1;
-+ T(YAFFS_TRACE_OS, ("yaffs_MarkSuperBlockDirty() sb = %p\n", sb));
-+ if (sb)
-+ sb->s_dirt = 1;
- }
-
- typedef struct {
-@@ -1546,48 +1788,48 @@ typedef struct {
- #define MAX_OPT_LEN 20
- static int yaffs_parse_options(yaffs_options *options, const char *options_str)
- {
-- char cur_opt[MAX_OPT_LEN+1];
-+ char cur_opt[MAX_OPT_LEN + 1];
- int p;
- int error = 0;
-
- /* Parse through the options which is a comma seperated list */
-
-- while(options_str && *options_str && !error){
-- memset(cur_opt,0,MAX_OPT_LEN+1);
-+ while (options_str && *options_str && !error) {
-+ memset(cur_opt, 0, MAX_OPT_LEN + 1);
- p = 0;
-
-- while(*options_str && *options_str != ','){
-- if(p < MAX_OPT_LEN){
-+ while (*options_str && *options_str != ',') {
-+ if (p < MAX_OPT_LEN) {
- cur_opt[p] = *options_str;
- p++;
- }
- options_str++;
- }
-
-- if(!strcmp(cur_opt,"inband-tags"))
-+ if (!strcmp(cur_opt, "inband-tags"))
- options->inband_tags = 1;
-- else if(!strcmp(cur_opt,"no-cache"))
-+ else if (!strcmp(cur_opt, "no-cache"))
- options->no_cache = 1;
-- else if(!strcmp(cur_opt,"no-checkpoint-read"))
-+ else if (!strcmp(cur_opt, "no-checkpoint-read"))
- options->skip_checkpoint_read = 1;
-- else if(!strcmp(cur_opt,"no-checkpoint-write"))
-+ else if (!strcmp(cur_opt, "no-checkpoint-write"))
- options->skip_checkpoint_write = 1;
-- else if(!strcmp(cur_opt,"no-checkpoint")){
-+ else if (!strcmp(cur_opt, "no-checkpoint")) {
- options->skip_checkpoint_read = 1;
- options->skip_checkpoint_write = 1;
- } else {
-- printk(KERN_INFO "yaffs: Bad mount option \"%s\"\n",cur_opt);
-+ printk(KERN_INFO "yaffs: Bad mount option \"%s\"\n",
-+ cur_opt);
- error = 1;
- }
--
- }
-
- return error;
- }
-
- static struct super_block *yaffs_internal_read_super(int yaffsVersion,
-- struct super_block *sb,
-- void *data, int silent)
-+ struct super_block *sb,
-+ void *data, int silent)
- {
- int nBlocks;
- struct inode *inode = NULL;
-@@ -1602,6 +1844,7 @@ static struct super_block *yaffs_interna
-
- sb->s_magic = YAFFS_MAGIC;
- sb->s_op = &yaffs_super_ops;
-+ sb->s_flags |= MS_NOATIME;
-
- if (!sb)
- printk(KERN_INFO "yaffs: sb is NULL\n");
-@@ -1614,14 +1857,14 @@ static struct super_block *yaffs_interna
- sb->s_dev,
- yaffs_devname(sb, devname_buf));
-
-- if(!data_str)
-+ if (!data_str)
- data_str = "";
-
-- printk(KERN_INFO "yaffs: passed flags \"%s\"\n",data_str);
-+ printk(KERN_INFO "yaffs: passed flags \"%s\"\n", data_str);
-
-- memset(&options,0,sizeof(options));
-+ memset(&options, 0, sizeof(options));
-
-- if(yaffs_parse_options(&options,data_str)){
-+ if (yaffs_parse_options(&options, data_str)) {
- /* Option parsing failed */
- return NULL;
- }
-@@ -1645,9 +1888,9 @@ static struct super_block *yaffs_interna
- yaffs_devname(sb, devname_buf)));
-
- /* Check it's an mtd device..... */
-- if (MAJOR(sb->s_dev) != MTD_BLOCK_MAJOR) {
-+ if (MAJOR(sb->s_dev) != MTD_BLOCK_MAJOR)
- return NULL; /* This isn't an mtd device */
-- }
-+
- /* Get the device */
- mtd = get_mtd_device(NULL, MINOR(sb->s_dev));
- if (!mtd) {
-@@ -1673,29 +1916,23 @@ static struct super_block *yaffs_interna
- T(YAFFS_TRACE_OS, (" %s %d\n", WRITE_SIZE_STR, WRITE_SIZE(mtd)));
- T(YAFFS_TRACE_OS, (" oobsize %d\n", mtd->oobsize));
- T(YAFFS_TRACE_OS, (" erasesize %d\n", mtd->erasesize));
-- T(YAFFS_TRACE_OS, (" size %d\n", mtd->size));
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29)
-+ T(YAFFS_TRACE_OS, (" size %u\n", mtd->size));
-+#else
-+ T(YAFFS_TRACE_OS, (" size %lld\n", mtd->size));
-+#endif
-
- #ifdef CONFIG_YAFFS_AUTO_YAFFS2
-
-- if (yaffsVersion == 1 &&
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- mtd->writesize >= 2048) {
--#else
-- mtd->oobblock >= 2048) {
--#endif
-- T(YAFFS_TRACE_ALWAYS,("yaffs: auto selecting yaffs2\n"));
-- yaffsVersion = 2;
-+ if (yaffsVersion == 1 && WRITE_SIZE(mtd) >= 2048) {
-+ T(YAFFS_TRACE_ALWAYS, ("yaffs: auto selecting yaffs2\n"));
-+ yaffsVersion = 2;
- }
-
- /* Added NCB 26/5/2006 for completeness */
-- if (yaffsVersion == 2 &&
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- mtd->writesize == 512) {
--#else
-- mtd->oobblock == 512) {
--#endif
-- T(YAFFS_TRACE_ALWAYS,("yaffs: auto selecting yaffs1\n"));
-- yaffsVersion = 1;
-+ if (yaffsVersion == 2 && !options.inband_tags && WRITE_SIZE(mtd) == 512) {
-+ T(YAFFS_TRACE_ALWAYS, ("yaffs: auto selecting yaffs1\n"));
-+ yaffsVersion = 1;
- }
-
- #endif
-@@ -1707,7 +1944,7 @@ static struct super_block *yaffs_interna
- !mtd->block_markbad ||
- !mtd->read ||
- !mtd->write ||
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- !mtd->read_oob || !mtd->write_oob) {
- #else
- !mtd->write_ecc ||
-@@ -1719,12 +1956,9 @@ static struct super_block *yaffs_interna
- return NULL;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- if (mtd->writesize < YAFFS_MIN_YAFFS2_CHUNK_SIZE ||
--#else
-- if (mtd->oobblock < YAFFS_MIN_YAFFS2_CHUNK_SIZE ||
--#endif
-- mtd->oobsize < YAFFS_MIN_YAFFS2_SPARE_SIZE) {
-+ if ((WRITE_SIZE(mtd) < YAFFS_MIN_YAFFS2_CHUNK_SIZE ||
-+ mtd->oobsize < YAFFS_MIN_YAFFS2_SPARE_SIZE) &&
-+ !options.inband_tags) {
- T(YAFFS_TRACE_ALWAYS,
- ("yaffs: MTD device does not have the "
- "right page sizes\n"));
-@@ -1735,7 +1969,7 @@ static struct super_block *yaffs_interna
- if (!mtd->erase ||
- !mtd->read ||
- !mtd->write ||
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- !mtd->read_oob || !mtd->write_oob) {
- #else
- !mtd->write_ecc ||
-@@ -1761,7 +1995,7 @@ static struct super_block *yaffs_interna
- * Set the yaffs_Device up for mtd
- */
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- sb->s_fs_info = dev = kmalloc(sizeof(yaffs_Device), GFP_KERNEL);
- #else
- sb->u.generic_sbp = dev = kmalloc(sizeof(yaffs_Device), GFP_KERNEL);
-@@ -1780,13 +2014,15 @@ static struct super_block *yaffs_interna
-
- /* Set up the memory size parameters.... */
-
-- nBlocks = mtd->size / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
-+ nBlocks = YCALCBLOCKS(mtd->size, (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK));
-+
- dev->startBlock = 0;
- dev->endBlock = nBlocks - 1;
- dev->nChunksPerBlock = YAFFS_CHUNKS_PER_BLOCK;
-- dev->nDataBytesPerChunk = YAFFS_BYTES_PER_CHUNK;
-+ dev->totalBytesPerChunk = YAFFS_BYTES_PER_CHUNK;
- dev->nReservedBlocks = 5;
- dev->nShortOpCaches = (options.no_cache) ? 0 : 10;
-+ dev->inbandTags = options.inband_tags;
-
- /* ... and the functions. */
- if (yaffsVersion == 2) {
-@@ -1798,20 +2034,19 @@ static struct super_block *yaffs_interna
- dev->queryNANDBlock = nandmtd2_QueryNANDBlock;
- dev->spareBuffer = YMALLOC(mtd->oobsize);
- dev->isYaffs2 = 1;
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- dev->nDataBytesPerChunk = mtd->writesize;
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
-+ dev->totalBytesPerChunk = mtd->writesize;
- dev->nChunksPerBlock = mtd->erasesize / mtd->writesize;
- #else
-- dev->nDataBytesPerChunk = mtd->oobblock;
-+ dev->totalBytesPerChunk = mtd->oobblock;
- dev->nChunksPerBlock = mtd->erasesize / mtd->oobblock;
- #endif
-- nBlocks = mtd->size / mtd->erasesize;
-+ nBlocks = YCALCBLOCKS(mtd->size, mtd->erasesize);
-
-- dev->nCheckpointReservedBlocks = CONFIG_YAFFS_CHECKPOINT_RESERVED_BLOCKS;
- dev->startBlock = 0;
- dev->endBlock = nBlocks - 1;
- } else {
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- /* use the MTD interface in yaffs_mtdif1.c */
- dev->writeChunkWithTagsToNAND =
- nandmtd1_WriteChunkWithTagsToNAND;
-@@ -1847,7 +2082,7 @@ static struct super_block *yaffs_interna
- dev->skipCheckpointWrite = options.skip_checkpoint_write;
-
- /* we assume this is protected by lock_kernel() in mount/umount */
-- list_add_tail(&dev->devList, &yaffs_dev_list);
-+ ylist_add_tail(&dev->devList, &yaffs_dev_list);
-
- init_MUTEX(&dev->grossLock);
-
-@@ -1884,20 +2119,23 @@ static struct super_block *yaffs_interna
- return NULL;
- }
- sb->s_root = root;
-+ sb->s_dirt = !dev->isCheckpointed;
-+ T(YAFFS_TRACE_ALWAYS,
-+ ("yaffs_read_super: isCheckpointed %d\n", dev->isCheckpointed));
-
- T(YAFFS_TRACE_OS, ("yaffs_read_super: done\n"));
- return sb;
- }
-
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_internal_read_super_mtd(struct super_block *sb, void *data,
- int silent)
- {
- return yaffs_internal_read_super(1, sb, data, silent) ? 0 : -EINVAL;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_read_super(struct file_system_type *fs,
- int flags, const char *dev_name,
- void *data, struct vfsmount *mnt)
-@@ -1938,14 +2176,14 @@ static DECLARE_FSTYPE(yaffs_fs_type, "ya
-
- #ifdef CONFIG_YAFFS_YAFFS2
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs2_internal_read_super_mtd(struct super_block *sb, void *data,
- int silent)
- {
- return yaffs_internal_read_super(2, sb, data, silent) ? 0 : -EINVAL;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs2_read_super(struct file_system_type *fs,
- int flags, const char *dev_name, void *data,
- struct vfsmount *mnt)
-@@ -1990,12 +2228,12 @@ static char *yaffs_dump_dev(char *buf, y
- {
- buf += sprintf(buf, "startBlock......... %d\n", dev->startBlock);
- buf += sprintf(buf, "endBlock........... %d\n", dev->endBlock);
-+ buf += sprintf(buf, "totalBytesPerChunk. %d\n", dev->totalBytesPerChunk);
- buf += sprintf(buf, "nDataBytesPerChunk. %d\n", dev->nDataBytesPerChunk);
- buf += sprintf(buf, "chunkGroupBits..... %d\n", dev->chunkGroupBits);
- buf += sprintf(buf, "chunkGroupSize..... %d\n", dev->chunkGroupSize);
- buf += sprintf(buf, "nErasedBlocks...... %d\n", dev->nErasedBlocks);
- buf += sprintf(buf, "nReservedBlocks.... %d\n", dev->nReservedBlocks);
-- buf += sprintf(buf, "nCheckptResBlocks.. %d\n", dev->nCheckpointReservedBlocks);
- buf += sprintf(buf, "blocksInCheckpoint. %d\n", dev->blocksInCheckpoint);
- buf += sprintf(buf, "nTnodesCreated..... %d\n", dev->nTnodesCreated);
- buf += sprintf(buf, "nFreeTnodes........ %d\n", dev->nFreeTnodes);
-@@ -2006,10 +2244,8 @@ static char *yaffs_dump_dev(char *buf, y
- buf += sprintf(buf, "nPageReads......... %d\n", dev->nPageReads);
- buf += sprintf(buf, "nBlockErasures..... %d\n", dev->nBlockErasures);
- buf += sprintf(buf, "nGCCopies.......... %d\n", dev->nGCCopies);
-- buf +=
-- sprintf(buf, "garbageCollections. %d\n", dev->garbageCollections);
-- buf +=
-- sprintf(buf, "passiveGCs......... %d\n",
-+ buf += sprintf(buf, "garbageCollections. %d\n", dev->garbageCollections);
-+ buf += sprintf(buf, "passiveGCs......... %d\n",
- dev->passiveGarbageCollections);
- buf += sprintf(buf, "nRetriedWrites..... %d\n", dev->nRetriedWrites);
- buf += sprintf(buf, "nShortOpCaches..... %d\n", dev->nShortOpCaches);
-@@ -2025,6 +2261,7 @@ static char *yaffs_dump_dev(char *buf, y
- sprintf(buf, "nBackgroudDeletions %d\n", dev->nBackgroundDeletions);
- buf += sprintf(buf, "useNANDECC......... %d\n", dev->useNANDECC);
- buf += sprintf(buf, "isYaffs2........... %d\n", dev->isYaffs2);
-+ buf += sprintf(buf, "inbandTags......... %d\n", dev->inbandTags);
-
- return buf;
- }
-@@ -2033,7 +2270,7 @@ static int yaffs_proc_read(char *page,
- char **start,
- off_t offset, int count, int *eof, void *data)
- {
-- struct list_head *item;
-+ struct ylist_head *item;
- char *buf = page;
- int step = offset;
- int n = 0;
-@@ -2057,8 +2294,8 @@ static int yaffs_proc_read(char *page,
- lock_kernel();
-
- /* Locate and print the Nth entry. Order N-squared but N is small. */
-- list_for_each(item, &yaffs_dev_list) {
-- yaffs_Device *dev = list_entry(item, yaffs_Device, devList);
-+ ylist_for_each(item, &yaffs_dev_list) {
-+ yaffs_Device *dev = ylist_entry(item, yaffs_Device, devList);
- if (n < step) {
- n++;
- continue;
-@@ -2119,7 +2356,7 @@ static int yaffs_proc_write(struct file
- char *end;
- char *mask_name;
- const char *x;
-- char substring[MAX_MASK_NAME_LENGTH+1];
-+ char substring[MAX_MASK_NAME_LENGTH + 1];
- int i;
- int done = 0;
- int add, len = 0;
-@@ -2129,9 +2366,8 @@ static int yaffs_proc_write(struct file
-
- while (!done && (pos < count)) {
- done = 1;
-- while ((pos < count) && isspace(buf[pos])) {
-+ while ((pos < count) && isspace(buf[pos]))
- pos++;
-- }
-
- switch (buf[pos]) {
- case '+':
-@@ -2148,20 +2384,21 @@ static int yaffs_proc_write(struct file
- mask_name = NULL;
-
- mask_bitfield = simple_strtoul(buf + pos, &end, 0);
-+
- if (end > buf + pos) {
- mask_name = "numeral";
- len = end - (buf + pos);
- pos += len;
- done = 0;
- } else {
-- for(x = buf + pos, i = 0;
-- (*x == '_' || (*x >='a' && *x <= 'z')) &&
-- i <MAX_MASK_NAME_LENGTH; x++, i++, pos++)
-- substring[i] = *x;
-+ for (x = buf + pos, i = 0;
-+ (*x == '_' || (*x >= 'a' && *x <= 'z')) &&
-+ i < MAX_MASK_NAME_LENGTH; x++, i++, pos++)
-+ substring[i] = *x;
- substring[i] = '\0';
-
- for (i = 0; mask_flags[i].mask_name != NULL; i++) {
-- if(strcmp(substring,mask_flags[i].mask_name) == 0){
-+ if (strcmp(substring, mask_flags[i].mask_name) == 0) {
- mask_name = mask_flags[i].mask_name;
- mask_bitfield = mask_flags[i].mask_bitfield;
- done = 0;
-@@ -2172,7 +2409,7 @@ static int yaffs_proc_write(struct file
-
- if (mask_name != NULL) {
- done = 0;
-- switch(add) {
-+ switch (add) {
- case '-':
- rg &= ~mask_bitfield;
- break;
-@@ -2191,13 +2428,13 @@ static int yaffs_proc_write(struct file
-
- yaffs_traceMask = rg | YAFFS_TRACE_ALWAYS;
-
-- printk("new trace = 0x%08X\n",yaffs_traceMask);
-+ printk(KERN_DEBUG "new trace = 0x%08X\n", yaffs_traceMask);
-
- if (rg & YAFFS_TRACE_ALWAYS) {
- for (i = 0; mask_flags[i].mask_name != NULL; i++) {
- char flag;
- flag = ((rg & mask_flags[i].mask_bitfield) == mask_flags[i].mask_bitfield) ? '+' : '-';
-- printk("%c%s\n", flag, mask_flags[i].mask_name);
-+ printk(KERN_DEBUG "%c%s\n", flag, mask_flags[i].mask_name);
- }
- }
-
-@@ -2211,12 +2448,8 @@ struct file_system_to_install {
- };
-
- static struct file_system_to_install fs_to_install[] = {
--//#ifdef CONFIG_YAFFS_YAFFS1
- {&yaffs_fs_type, 0},
--//#endif
--//#ifdef CONFIG_YAFFS_YAFFS2
- {&yaffs2_fs_type, 0},
--//#endif
- {NULL, 0}
- };
-
-@@ -2231,15 +2464,14 @@ static int __init init_yaffs_fs(void)
- /* Install the proc_fs entry */
- my_proc_entry = create_proc_entry("yaffs",
- S_IRUGO | S_IFREG,
-- &proc_root);
-+ YPROC_ROOT);
-
- if (my_proc_entry) {
- my_proc_entry->write_proc = yaffs_proc_write;
- my_proc_entry->read_proc = yaffs_proc_read;
- my_proc_entry->data = NULL;
-- } else {
-+ } else
- return -ENOMEM;
-- }
-
- /* Now add the file system entries */
-
-@@ -2247,9 +2479,8 @@ static int __init init_yaffs_fs(void)
-
- while (fsinst->fst && !error) {
- error = register_filesystem(fsinst->fst);
-- if (!error) {
-+ if (!error)
- fsinst->installed = 1;
-- }
- fsinst++;
- }
-
-@@ -2277,7 +2508,7 @@ static void __exit exit_yaffs_fs(void)
- T(YAFFS_TRACE_ALWAYS, ("yaffs " __DATE__ " " __TIME__
- " removing. \n"));
-
-- remove_proc_entry("yaffs", &proc_root);
-+ remove_proc_entry("yaffs", YPROC_ROOT);
-
- fsinst = fs_to_install;
-
-@@ -2288,7 +2519,6 @@ static void __exit exit_yaffs_fs(void)
- }
- fsinst++;
- }
--
- }
-
- module_init(init_yaffs_fs)
---- /dev/null
-+++ b/fs/yaffs2/yaffs_getblockinfo.h
-@@ -0,0 +1,34 @@
-+/*
-+ * YAFFS: Yet another Flash File System . A NAND-flash specific file system.
-+ *
-+ * Copyright (C) 2002-2007 Aleph One Ltd.
-+ * for Toby Churchill Ltd and Brightstar Engineering
-+ *
-+ * Created by Charles Manning <charles@aleph1.co.uk>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU Lesser General Public License version 2.1 as
-+ * published by the Free Software Foundation.
-+ *
-+ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
-+ */
-+
-+#ifndef __YAFFS_GETBLOCKINFO_H__
-+#define __YAFFS_GETBLOCKINFO_H__
-+
-+#include "yaffs_guts.h"
-+
-+/* Function to manipulate block info */
-+static Y_INLINE yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blk)
-+{
-+ if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) {
-+ T(YAFFS_TRACE_ERROR,
-+ (TSTR
-+ ("**>> yaffs: getBlockInfo block %d is not valid" TENDSTR),
-+ blk));
-+ YBUG();
-+ }
-+ return &dev->blockInfo[blk - dev->internalStartBlock];
-+}
-+
-+#endif
---- a/fs/yaffs2/yaffs_guts.c
-+++ b/fs/yaffs2/yaffs_guts.c
-@@ -12,16 +12,17 @@
- */
-
- const char *yaffs_guts_c_version =
-- "$Id: yaffs_guts.c,v 1.49 2007-05-15 20:07:40 charles Exp $";
-+ "$Id: yaffs_guts.c,v 1.82 2009-03-09 04:24:17 charles Exp $";
-
- #include "yportenv.h"
-
- #include "yaffsinterface.h"
- #include "yaffs_guts.h"
- #include "yaffs_tagsvalidity.h"
-+#include "yaffs_getblockinfo.h"
-
- #include "yaffs_tagscompat.h"
--#ifndef CONFIG_YAFFS_USE_OWN_SORT
-+#ifndef CONFIG_YAFFS_USE_OWN_SORT
- #include "yaffs_qsort.h"
- #endif
- #include "yaffs_nand.h"
-@@ -32,116 +33,116 @@ const char *yaffs_guts_c_version =
- #include "yaffs_packedtags2.h"
-
-
--#ifdef CONFIG_YAFFS_WINCE
--void yfsd_LockYAFFS(BOOL fsLockOnly);
--void yfsd_UnlockYAFFS(BOOL fsLockOnly);
--#endif
--
- #define YAFFS_PASSIVE_GC_CHUNKS 2
-
- #include "yaffs_ecc.h"
-
-
- /* Robustification (if it ever comes about...) */
--static void yaffs_RetireBlock(yaffs_Device * dev, int blockInNAND);
--static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND, int erasedOk);
--static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags * tags);
--static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,
-- const yaffs_ExtendedTags * tags);
-+static void yaffs_RetireBlock(yaffs_Device *dev, int blockInNAND);
-+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND,
-+ int erasedOk);
-+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
-+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND,
-+ const yaffs_ExtendedTags *tags);
-
- /* Other local prototypes */
--static int yaffs_UnlinkObject( yaffs_Object *obj);
-+static int yaffs_UnlinkObject(yaffs_Object *obj);
- static int yaffs_ObjectHasCachedWriteData(yaffs_Object *obj);
-
- static void yaffs_HardlinkFixup(yaffs_Device *dev, yaffs_Object *hardList);
-
--static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device * dev,
-- const __u8 * buffer,
-- yaffs_ExtendedTags * tags,
-- int useReserve);
--static int yaffs_PutChunkIntoFile(yaffs_Object * in, int chunkInInode,
-- int chunkInNAND, int inScan);
--
--static yaffs_Object *yaffs_CreateNewObject(yaffs_Device * dev, int number,
-- yaffs_ObjectType type);
--static void yaffs_AddObjectToDirectory(yaffs_Object * directory,
-- yaffs_Object * obj);
--static int yaffs_UpdateObjectHeader(yaffs_Object * in, const YCHAR * name,
-- int force, int isShrink, int shadows);
--static void yaffs_RemoveObjectFromDirectory(yaffs_Object * obj);
-+static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device *dev,
-+ const __u8 *buffer,
-+ yaffs_ExtendedTags *tags,
-+ int useReserve);
-+static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode,
-+ int chunkInNAND, int inScan);
-+
-+static yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number,
-+ yaffs_ObjectType type);
-+static void yaffs_AddObjectToDirectory(yaffs_Object *directory,
-+ yaffs_Object *obj);
-+static int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name,
-+ int force, int isShrink, int shadows);
-+static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj);
- static int yaffs_CheckStructures(void);
--static int yaffs_DeleteWorker(yaffs_Object * in, yaffs_Tnode * tn, __u32 level,
-- int chunkOffset, int *limit);
--static int yaffs_DoGenericObjectDeletion(yaffs_Object * in);
--
--static yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blockNo);
--
--static __u8 *yaffs_GetTempBuffer(yaffs_Device * dev, int lineNo);
--static void yaffs_ReleaseTempBuffer(yaffs_Device * dev, __u8 * buffer,
-- int lineNo);
-+static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level,
-+ int chunkOffset, int *limit);
-+static int yaffs_DoGenericObjectDeletion(yaffs_Object *in);
-+
-+static yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device *dev, int blockNo);
-
--static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND);
-
--static int yaffs_UnlinkWorker(yaffs_Object * obj);
--static void yaffs_DestroyObject(yaffs_Object * obj);
-+static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND);
-
--static int yaffs_TagsMatch(const yaffs_ExtendedTags * tags, int objectId,
-- int chunkInObject);
-+static int yaffs_UnlinkWorker(yaffs_Object *obj);
-
--loff_t yaffs_GetFileSize(yaffs_Object * obj);
-+static int yaffs_TagsMatch(const yaffs_ExtendedTags *tags, int objectId,
-+ int chunkInObject);
-
--static int yaffs_AllocateChunk(yaffs_Device * dev, int useReserve, yaffs_BlockInfo **blockUsedPtr);
-+static int yaffs_AllocateChunk(yaffs_Device *dev, int useReserve,
-+ yaffs_BlockInfo **blockUsedPtr);
-
--static void yaffs_VerifyFreeChunks(yaffs_Device * dev);
-+static void yaffs_VerifyFreeChunks(yaffs_Device *dev);
-
- static void yaffs_CheckObjectDetailsLoaded(yaffs_Object *in);
-
-+static void yaffs_VerifyDirectory(yaffs_Object *directory);
- #ifdef YAFFS_PARANOID
--static int yaffs_CheckFileSanity(yaffs_Object * in);
-+static int yaffs_CheckFileSanity(yaffs_Object *in);
- #else
- #define yaffs_CheckFileSanity(in)
- #endif
-
--static void yaffs_InvalidateWholeChunkCache(yaffs_Object * in);
--static void yaffs_InvalidateChunkCache(yaffs_Object * object, int chunkId);
-+static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in);
-+static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId);
-
- static void yaffs_InvalidateCheckpoint(yaffs_Device *dev);
-
--static int yaffs_FindChunkInFile(yaffs_Object * in, int chunkInInode,
-- yaffs_ExtendedTags * tags);
-+static int yaffs_FindChunkInFile(yaffs_Object *in, int chunkInInode,
-+ yaffs_ExtendedTags *tags);
-
--static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos);
--static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device * dev,
-- yaffs_FileStructure * fStruct,
-- __u32 chunkId);
-+static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn,
-+ unsigned pos);
-+static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device *dev,
-+ yaffs_FileStructure *fStruct,
-+ __u32 chunkId);
-
-
- /* Function to calculate chunk and offset */
-
--static void yaffs_AddrToChunk(yaffs_Device *dev, loff_t addr, __u32 *chunk, __u32 *offset)
-+static void yaffs_AddrToChunk(yaffs_Device *dev, loff_t addr, int *chunkOut,
-+ __u32 *offsetOut)
- {
-- if(dev->chunkShift){
-- /* Easy-peasy power of 2 case */
-- *chunk = (__u32)(addr >> dev->chunkShift);
-- *offset = (__u32)(addr & dev->chunkMask);
-- }
-- else if(dev->crumbsPerChunk)
-- {
-- /* Case where we're using "crumbs" */
-- *offset = (__u32)(addr & dev->crumbMask);
-- addr >>= dev->crumbShift;
-- *chunk = ((__u32)addr)/dev->crumbsPerChunk;
-- *offset += ((addr - (*chunk * dev->crumbsPerChunk)) << dev->crumbShift);
-+ int chunk;
-+ __u32 offset;
-+
-+ chunk = (__u32)(addr >> dev->chunkShift);
-+
-+ if (dev->chunkDiv == 1) {
-+ /* easy power of 2 case */
-+ offset = (__u32)(addr & dev->chunkMask);
-+ } else {
-+ /* Non power-of-2 case */
-+
-+ loff_t chunkBase;
-+
-+ chunk /= dev->chunkDiv;
-+
-+ chunkBase = ((loff_t)chunk) * dev->nDataBytesPerChunk;
-+ offset = (__u32)(addr - chunkBase);
- }
-- else
-- YBUG();
-+
-+ *chunkOut = chunk;
-+ *offsetOut = offset;
- }
-
--/* Function to return the number of shifts for a power of 2 greater than or equal
-- * to the given number
-+/* Function to return the number of shifts for a power of 2 greater than or
-+ * equal to the given number
- * Note we don't try to cater for all possible numbers and this does not have to
- * be hellishly efficient.
- */
-@@ -153,13 +154,14 @@ static __u32 ShiftsGE(__u32 x)
-
- nShifts = extraBits = 0;
-
-- while(x>1){
-- if(x & 1) extraBits++;
-- x>>=1;
-+ while (x > 1) {
-+ if (x & 1)
-+ extraBits++;
-+ x >>= 1;
- nShifts++;
- }
-
-- if(extraBits)
-+ if (extraBits)
- nShifts++;
-
- return nShifts;
-@@ -168,16 +170,17 @@ static __u32 ShiftsGE(__u32 x)
- /* Function to return the number of shifts to get a 1 in bit 0
- */
-
--static __u32 ShiftDiv(__u32 x)
-+static __u32 Shifts(__u32 x)
- {
- int nShifts;
-
- nShifts = 0;
-
-- if(!x) return 0;
-+ if (!x)
-+ return 0;
-
-- while( !(x&1)){
-- x>>=1;
-+ while (!(x&1)) {
-+ x >>= 1;
- nShifts++;
- }
-
-@@ -195,21 +198,25 @@ static int yaffs_InitialiseTempBuffers(y
- int i;
- __u8 *buf = (__u8 *)1;
-
-- memset(dev->tempBuffer,0,sizeof(dev->tempBuffer));
-+ memset(dev->tempBuffer, 0, sizeof(dev->tempBuffer));
-
- for (i = 0; buf && i < YAFFS_N_TEMP_BUFFERS; i++) {
- dev->tempBuffer[i].line = 0; /* not in use */
- dev->tempBuffer[i].buffer = buf =
-- YMALLOC_DMA(dev->nDataBytesPerChunk);
-+ YMALLOC_DMA(dev->totalBytesPerChunk);
- }
-
- return buf ? YAFFS_OK : YAFFS_FAIL;
--
- }
-
--static __u8 *yaffs_GetTempBuffer(yaffs_Device * dev, int lineNo)
-+__u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo)
- {
- int i, j;
-+
-+ dev->tempInUse++;
-+ if (dev->tempInUse > dev->maxTemp)
-+ dev->maxTemp = dev->tempInUse;
-+
- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
- if (dev->tempBuffer[i].line == 0) {
- dev->tempBuffer[i].line = lineNo;
-@@ -227,9 +234,9 @@ static __u8 *yaffs_GetTempBuffer(yaffs_D
- T(YAFFS_TRACE_BUFFERS,
- (TSTR("Out of temp buffers at line %d, other held by lines:"),
- lineNo));
-- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
-+ for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++)
- T(YAFFS_TRACE_BUFFERS, (TSTR(" %d "), dev->tempBuffer[i].line));
-- }
-+
- T(YAFFS_TRACE_BUFFERS, (TSTR(" " TENDSTR)));
-
- /*
-@@ -242,10 +249,13 @@ static __u8 *yaffs_GetTempBuffer(yaffs_D
-
- }
-
--static void yaffs_ReleaseTempBuffer(yaffs_Device * dev, __u8 * buffer,
-+void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer,
- int lineNo)
- {
- int i;
-+
-+ dev->tempInUse--;
-+
- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
- if (dev->tempBuffer[i].buffer == buffer) {
- dev->tempBuffer[i].line = 0;
-@@ -267,27 +277,26 @@ static void yaffs_ReleaseTempBuffer(yaff
- /*
- * Determine if we have a managed buffer.
- */
--int yaffs_IsManagedTempBuffer(yaffs_Device * dev, const __u8 * buffer)
-+int yaffs_IsManagedTempBuffer(yaffs_Device *dev, const __u8 *buffer)
- {
- int i;
-+
- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
- if (dev->tempBuffer[i].buffer == buffer)
- return 1;
-+ }
-
-+ for (i = 0; i < dev->nShortOpCaches; i++) {
-+ if (dev->srCache[i].data == buffer)
-+ return 1;
- }
-
-- for (i = 0; i < dev->nShortOpCaches; i++) {
-- if( dev->srCache[i].data == buffer )
-- return 1;
--
-- }
--
-- if (buffer == dev->checkpointBuffer)
-- return 1;
--
-- T(YAFFS_TRACE_ALWAYS,
-- (TSTR("yaffs: unmaged buffer detected.\n" TENDSTR)));
-- return 0;
-+ if (buffer == dev->checkpointBuffer)
-+ return 1;
-+
-+ T(YAFFS_TRACE_ALWAYS,
-+ (TSTR("yaffs: unmaged buffer detected.\n" TENDSTR)));
-+ return 0;
- }
-
-
-@@ -296,62 +305,63 @@ int yaffs_IsManagedTempBuffer(yaffs_Devi
- * Chunk bitmap manipulations
- */
-
--static Y_INLINE __u8 *yaffs_BlockBits(yaffs_Device * dev, int blk)
-+static Y_INLINE __u8 *yaffs_BlockBits(yaffs_Device *dev, int blk)
- {
- if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) {
- T(YAFFS_TRACE_ERROR,
-- (TSTR("**>> yaffs: BlockBits block %d is not valid" TENDSTR),
-- blk));
-+ (TSTR("**>> yaffs: BlockBits block %d is not valid" TENDSTR),
-+ blk));
- YBUG();
- }
- return dev->chunkBits +
-- (dev->chunkBitmapStride * (blk - dev->internalStartBlock));
-+ (dev->chunkBitmapStride * (blk - dev->internalStartBlock));
- }
-
- static Y_INLINE void yaffs_VerifyChunkBitId(yaffs_Device *dev, int blk, int chunk)
- {
-- if(blk < dev->internalStartBlock || blk > dev->internalEndBlock ||
-- chunk < 0 || chunk >= dev->nChunksPerBlock) {
-- T(YAFFS_TRACE_ERROR,
-- (TSTR("**>> yaffs: Chunk Id (%d:%d) invalid"TENDSTR),blk,chunk));
-- YBUG();
-+ if (blk < dev->internalStartBlock || blk > dev->internalEndBlock ||
-+ chunk < 0 || chunk >= dev->nChunksPerBlock) {
-+ T(YAFFS_TRACE_ERROR,
-+ (TSTR("**>> yaffs: Chunk Id (%d:%d) invalid"TENDSTR),
-+ blk, chunk));
-+ YBUG();
- }
- }
-
--static Y_INLINE void yaffs_ClearChunkBits(yaffs_Device * dev, int blk)
-+static Y_INLINE void yaffs_ClearChunkBits(yaffs_Device *dev, int blk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
-
- memset(blkBits, 0, dev->chunkBitmapStride);
- }
-
--static Y_INLINE void yaffs_ClearChunkBit(yaffs_Device * dev, int blk, int chunk)
-+static Y_INLINE void yaffs_ClearChunkBit(yaffs_Device *dev, int blk, int chunk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
-
-- yaffs_VerifyChunkBitId(dev,blk,chunk);
-+ yaffs_VerifyChunkBitId(dev, blk, chunk);
-
- blkBits[chunk / 8] &= ~(1 << (chunk & 7));
- }
-
--static Y_INLINE void yaffs_SetChunkBit(yaffs_Device * dev, int blk, int chunk)
-+static Y_INLINE void yaffs_SetChunkBit(yaffs_Device *dev, int blk, int chunk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
-
-- yaffs_VerifyChunkBitId(dev,blk,chunk);
-+ yaffs_VerifyChunkBitId(dev, blk, chunk);
-
- blkBits[chunk / 8] |= (1 << (chunk & 7));
- }
-
--static Y_INLINE int yaffs_CheckChunkBit(yaffs_Device * dev, int blk, int chunk)
-+static Y_INLINE int yaffs_CheckChunkBit(yaffs_Device *dev, int blk, int chunk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
-- yaffs_VerifyChunkBitId(dev,blk,chunk);
-+ yaffs_VerifyChunkBitId(dev, blk, chunk);
-
- return (blkBits[chunk / 8] & (1 << (chunk & 7))) ? 1 : 0;
- }
-
--static Y_INLINE int yaffs_StillSomeChunkBits(yaffs_Device * dev, int blk)
-+static Y_INLINE int yaffs_StillSomeChunkBits(yaffs_Device *dev, int blk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
- int i;
-@@ -363,17 +373,17 @@ static Y_INLINE int yaffs_StillSomeChunk
- return 0;
- }
-
--static int yaffs_CountChunkBits(yaffs_Device * dev, int blk)
-+static int yaffs_CountChunkBits(yaffs_Device *dev, int blk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
- int i;
- int n = 0;
- for (i = 0; i < dev->chunkBitmapStride; i++) {
- __u8 x = *blkBits;
-- while(x){
-- if(x & 1)
-+ while (x) {
-+ if (x & 1)
- n++;
-- x >>=1;
-+ x >>= 1;
- }
-
- blkBits++;
-@@ -400,7 +410,7 @@ static int yaffs_SkipNANDVerification(ya
- return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY_NAND));
- }
-
--static const char * blockStateName[] = {
-+static const char *blockStateName[] = {
- "Unknown",
- "Needs scanning",
- "Scanning",
-@@ -413,64 +423,65 @@ static const char * blockStateName[] = {
- "Dead"
- };
-
--static void yaffs_VerifyBlock(yaffs_Device *dev,yaffs_BlockInfo *bi,int n)
-+static void yaffs_VerifyBlock(yaffs_Device *dev, yaffs_BlockInfo *bi, int n)
- {
- int actuallyUsed;
- int inUse;
-
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
- /* Report illegal runtime states */
-- if(bi->blockState <0 || bi->blockState >= YAFFS_NUMBER_OF_BLOCK_STATES)
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has undefined state %d"TENDSTR),n,bi->blockState));
-+ if (bi->blockState >= YAFFS_NUMBER_OF_BLOCK_STATES)
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has undefined state %d"TENDSTR), n, bi->blockState));
-
-- switch(bi->blockState){
-- case YAFFS_BLOCK_STATE_UNKNOWN:
-- case YAFFS_BLOCK_STATE_SCANNING:
-- case YAFFS_BLOCK_STATE_NEEDS_SCANNING:
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has bad run-state %s"TENDSTR),
-- n,blockStateName[bi->blockState]));
-+ switch (bi->blockState) {
-+ case YAFFS_BLOCK_STATE_UNKNOWN:
-+ case YAFFS_BLOCK_STATE_SCANNING:
-+ case YAFFS_BLOCK_STATE_NEEDS_SCANNING:
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has bad run-state %s"TENDSTR),
-+ n, blockStateName[bi->blockState]));
- }
-
- /* Check pages in use and soft deletions are legal */
-
- actuallyUsed = bi->pagesInUse - bi->softDeletions;
-
-- if(bi->pagesInUse < 0 || bi->pagesInUse > dev->nChunksPerBlock ||
-+ if (bi->pagesInUse < 0 || bi->pagesInUse > dev->nChunksPerBlock ||
- bi->softDeletions < 0 || bi->softDeletions > dev->nChunksPerBlock ||
- actuallyUsed < 0 || actuallyUsed > dev->nChunksPerBlock)
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has illegal values pagesInUsed %d softDeletions %d"TENDSTR),
-- n,bi->pagesInUse,bi->softDeletions));
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has illegal values pagesInUsed %d softDeletions %d"TENDSTR),
-+ n, bi->pagesInUse, bi->softDeletions));
-
-
- /* Check chunk bitmap legal */
-- inUse = yaffs_CountChunkBits(dev,n);
-- if(inUse != bi->pagesInUse)
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has inconsistent values pagesInUse %d counted chunk bits %d"TENDSTR),
-- n,bi->pagesInUse,inUse));
-+ inUse = yaffs_CountChunkBits(dev, n);
-+ if (inUse != bi->pagesInUse)
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has inconsistent values pagesInUse %d counted chunk bits %d"TENDSTR),
-+ n, bi->pagesInUse, inUse));
-
- /* Check that the sequence number is valid.
- * Ten million is legal, but is very unlikely
- */
-- if(dev->isYaffs2 &&
-+ if (dev->isYaffs2 &&
- (bi->blockState == YAFFS_BLOCK_STATE_ALLOCATING || bi->blockState == YAFFS_BLOCK_STATE_FULL) &&
-- (bi->sequenceNumber < YAFFS_LOWEST_SEQUENCE_NUMBER || bi->sequenceNumber > 10000000 ))
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has suspect sequence number of %d"TENDSTR),
-- n,bi->sequenceNumber));
--
-+ (bi->sequenceNumber < YAFFS_LOWEST_SEQUENCE_NUMBER || bi->sequenceNumber > 10000000))
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has suspect sequence number of %d"TENDSTR),
-+ n, bi->sequenceNumber));
- }
-
--static void yaffs_VerifyCollectedBlock(yaffs_Device *dev,yaffs_BlockInfo *bi,int n)
-+static void yaffs_VerifyCollectedBlock(yaffs_Device *dev, yaffs_BlockInfo *bi,
-+ int n)
- {
-- yaffs_VerifyBlock(dev,bi,n);
-+ yaffs_VerifyBlock(dev, bi, n);
-
- /* After collection the block should be in the erased state */
-- /* TODO: This will need to change if we do partial gc */
-+ /* This will need to change if we do partial gc */
-
-- if(bi->blockState != YAFFS_BLOCK_STATE_EMPTY){
-- T(YAFFS_TRACE_ERROR,(TSTR("Block %d is in state %d after gc, should be erased"TENDSTR),
-- n,bi->blockState));
-+ if (bi->blockState != YAFFS_BLOCK_STATE_COLLECTING &&
-+ bi->blockState != YAFFS_BLOCK_STATE_EMPTY) {
-+ T(YAFFS_TRACE_ERROR, (TSTR("Block %d is in state %d after gc, should be erased"TENDSTR),
-+ n, bi->blockState));
- }
- }
-
-@@ -480,52 +491,49 @@ static void yaffs_VerifyBlocks(yaffs_Dev
- int nBlocksPerState[YAFFS_NUMBER_OF_BLOCK_STATES];
- int nIllegalBlockStates = 0;
-
--
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
-- memset(nBlocksPerState,0,sizeof(nBlocksPerState));
--
-+ memset(nBlocksPerState, 0, sizeof(nBlocksPerState));
-
-- for(i = dev->internalStartBlock; i <= dev->internalEndBlock; i++){
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i);
-- yaffs_VerifyBlock(dev,bi,i);
-+ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) {
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i);
-+ yaffs_VerifyBlock(dev, bi, i);
-
-- if(bi->blockState >=0 && bi->blockState < YAFFS_NUMBER_OF_BLOCK_STATES)
-+ if (bi->blockState < YAFFS_NUMBER_OF_BLOCK_STATES)
- nBlocksPerState[bi->blockState]++;
- else
- nIllegalBlockStates++;
--
- }
-
-- T(YAFFS_TRACE_VERIFY,(TSTR(""TENDSTR)));
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block summary"TENDSTR)));
-+ T(YAFFS_TRACE_VERIFY, (TSTR(""TENDSTR)));
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block summary"TENDSTR)));
-
-- T(YAFFS_TRACE_VERIFY,(TSTR("%d blocks have illegal states"TENDSTR),nIllegalBlockStates));
-- if(nBlocksPerState[YAFFS_BLOCK_STATE_ALLOCATING] > 1)
-- T(YAFFS_TRACE_VERIFY,(TSTR("Too many allocating blocks"TENDSTR)));
-+ T(YAFFS_TRACE_VERIFY, (TSTR("%d blocks have illegal states"TENDSTR), nIllegalBlockStates));
-+ if (nBlocksPerState[YAFFS_BLOCK_STATE_ALLOCATING] > 1)
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Too many allocating blocks"TENDSTR)));
-
-- for(i = 0; i < YAFFS_NUMBER_OF_BLOCK_STATES; i++)
-+ for (i = 0; i < YAFFS_NUMBER_OF_BLOCK_STATES; i++)
- T(YAFFS_TRACE_VERIFY,
- (TSTR("%s %d blocks"TENDSTR),
-- blockStateName[i],nBlocksPerState[i]));
-+ blockStateName[i], nBlocksPerState[i]));
-
-- if(dev->blocksInCheckpoint != nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT])
-+ if (dev->blocksInCheckpoint != nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT])
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Checkpoint block count wrong dev %d count %d"TENDSTR),
- dev->blocksInCheckpoint, nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT]));
-
-- if(dev->nErasedBlocks != nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY])
-+ if (dev->nErasedBlocks != nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY])
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Erased block count wrong dev %d count %d"TENDSTR),
- dev->nErasedBlocks, nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY]));
-
-- if(nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING] > 1)
-+ if (nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING] > 1)
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Too many collecting blocks %d (max is 1)"TENDSTR),
- nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING]));
-
-- T(YAFFS_TRACE_VERIFY,(TSTR(""TENDSTR)));
-+ T(YAFFS_TRACE_VERIFY, (TSTR(""TENDSTR)));
-
- }
-
-@@ -535,26 +543,26 @@ static void yaffs_VerifyBlocks(yaffs_Dev
- */
- static void yaffs_VerifyObjectHeader(yaffs_Object *obj, yaffs_ObjectHeader *oh, yaffs_ExtendedTags *tags, int parentCheck)
- {
-- if(yaffs_SkipVerification(obj->myDev))
-+ if (obj && yaffs_SkipVerification(obj->myDev))
- return;
-
-- if(!(tags && obj && oh)){
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Verifying object header tags %x obj %x oh %x"TENDSTR),
-- (__u32)tags,(__u32)obj,(__u32)oh));
-+ if (!(tags && obj && oh)) {
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Verifying object header tags %x obj %x oh %x"TENDSTR),
-+ (__u32)tags, (__u32)obj, (__u32)oh));
- return;
- }
-
-- if(oh->type <= YAFFS_OBJECT_TYPE_UNKNOWN ||
-- oh->type > YAFFS_OBJECT_TYPE_MAX)
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header type is illegal value 0x%x"TENDSTR),
-- tags->objectId, oh->type));
--
-- if(tags->objectId != obj->objectId)
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header mismatch objectId %d"TENDSTR),
-- tags->objectId, obj->objectId));
-+ if (oh->type <= YAFFS_OBJECT_TYPE_UNKNOWN ||
-+ oh->type > YAFFS_OBJECT_TYPE_MAX)
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d header type is illegal value 0x%x"TENDSTR),
-+ tags->objectId, oh->type));
-+
-+ if (tags->objectId != obj->objectId)
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d header mismatch objectId %d"TENDSTR),
-+ tags->objectId, obj->objectId));
-
-
- /*
-@@ -563,46 +571,43 @@ static void yaffs_VerifyObjectHeader(yaf
- * Tests do not apply to the root object.
- */
-
-- if(parentCheck && tags->objectId > 1 && !obj->parent)
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header mismatch parentId %d obj->parent is NULL"TENDSTR),
-- tags->objectId, oh->parentObjectId));
--
--
-- if(parentCheck && obj->parent &&
-- oh->parentObjectId != obj->parent->objectId &&
-- (oh->parentObjectId != YAFFS_OBJECTID_UNLINKED ||
-- obj->parent->objectId != YAFFS_OBJECTID_DELETED))
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header mismatch parentId %d parentObjectId %d"TENDSTR),
-- tags->objectId, oh->parentObjectId, obj->parent->objectId));
-+ if (parentCheck && tags->objectId > 1 && !obj->parent)
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d header mismatch parentId %d obj->parent is NULL"TENDSTR),
-+ tags->objectId, oh->parentObjectId));
-
-+ if (parentCheck && obj->parent &&
-+ oh->parentObjectId != obj->parent->objectId &&
-+ (oh->parentObjectId != YAFFS_OBJECTID_UNLINKED ||
-+ obj->parent->objectId != YAFFS_OBJECTID_DELETED))
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d header mismatch parentId %d parentObjectId %d"TENDSTR),
-+ tags->objectId, oh->parentObjectId, obj->parent->objectId));
-
-- if(tags->objectId > 1 && oh->name[0] == 0) /* Null name */
-+ if (tags->objectId > 1 && oh->name[0] == 0) /* Null name */
- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header name is NULL"TENDSTR),
-- obj->objectId));
-+ (TSTR("Obj %d header name is NULL"TENDSTR),
-+ obj->objectId));
-
-- if(tags->objectId > 1 && ((__u8)(oh->name[0])) == 0xff) /* Trashed name */
-+ if (tags->objectId > 1 && ((__u8)(oh->name[0])) == 0xff) /* Trashed name */
- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header name is 0xFF"TENDSTR),
-- obj->objectId));
-+ (TSTR("Obj %d header name is 0xFF"TENDSTR),
-+ obj->objectId));
- }
-
-
-
--static int yaffs_VerifyTnodeWorker(yaffs_Object * obj, yaffs_Tnode * tn,
-- __u32 level, int chunkOffset)
-+static int yaffs_VerifyTnodeWorker(yaffs_Object *obj, yaffs_Tnode *tn,
-+ __u32 level, int chunkOffset)
- {
- int i;
- yaffs_Device *dev = obj->myDev;
- int ok = 1;
-- int nTnodeBytes = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-
- if (tn) {
- if (level > 0) {
-
-- for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++){
-+ for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++) {
- if (tn->internal[i]) {
- ok = yaffs_VerifyTnodeWorker(obj,
- tn->internal[i],
-@@ -611,20 +616,19 @@ static int yaffs_VerifyTnodeWorker(yaffs
- }
- }
- } else if (level == 0) {
-- int i;
- yaffs_ExtendedTags tags;
- __u32 objectId = obj->objectId;
-
- chunkOffset <<= YAFFS_TNODES_LEVEL0_BITS;
-
-- for(i = 0; i < YAFFS_NTNODES_LEVEL0; i++){
-- __u32 theChunk = yaffs_GetChunkGroupBase(dev,tn,i);
-+ for (i = 0; i < YAFFS_NTNODES_LEVEL0; i++) {
-+ __u32 theChunk = yaffs_GetChunkGroupBase(dev, tn, i);
-
-- if(theChunk > 0){
-+ if (theChunk > 0) {
- /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),tags.objectId,tags.chunkId,theChunk)); */
-- yaffs_ReadChunkWithTagsFromNAND(dev,theChunk,NULL, &tags);
-- if(tags.objectId != objectId || tags.chunkId != chunkOffset){
-- T(~0,(TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR),
-+ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL, &tags);
-+ if (tags.objectId != objectId || tags.chunkId != chunkOffset) {
-+ T(~0, (TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR),
- objectId, chunkOffset, theChunk,
- tags.objectId, tags.chunkId));
- }
-@@ -646,13 +650,15 @@ static void yaffs_VerifyFile(yaffs_Objec
- __u32 lastChunk;
- __u32 x;
- __u32 i;
-- int ok;
- yaffs_Device *dev;
- yaffs_ExtendedTags tags;
- yaffs_Tnode *tn;
- __u32 objectId;
-
-- if(obj && yaffs_SkipVerification(obj->myDev))
-+ if (!obj)
-+ return;
-+
-+ if (yaffs_SkipVerification(obj->myDev))
- return;
-
- dev = obj->myDev;
-@@ -662,17 +668,17 @@ static void yaffs_VerifyFile(yaffs_Objec
- lastChunk = obj->variant.fileVariant.fileSize / dev->nDataBytesPerChunk + 1;
- x = lastChunk >> YAFFS_TNODES_LEVEL0_BITS;
- requiredTallness = 0;
-- while (x> 0) {
-+ while (x > 0) {
- x >>= YAFFS_TNODES_INTERNAL_BITS;
- requiredTallness++;
- }
-
- actualTallness = obj->variant.fileVariant.topLevel;
-
-- if(requiredTallness > actualTallness )
-+ if (requiredTallness > actualTallness)
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Obj %d had tnode tallness %d, needs to be %d"TENDSTR),
-- obj->objectId,actualTallness, requiredTallness));
-+ obj->objectId, actualTallness, requiredTallness));
-
-
- /* Check that the chunks in the tnode tree are all correct.
-@@ -680,39 +686,31 @@ static void yaffs_VerifyFile(yaffs_Objec
- * checking the tags for every chunk match.
- */
-
-- if(yaffs_SkipNANDVerification(dev))
-+ if (yaffs_SkipNANDVerification(dev))
- return;
-
-- for(i = 1; i <= lastChunk; i++){
-- tn = yaffs_FindLevel0Tnode(dev, &obj->variant.fileVariant,i);
-+ for (i = 1; i <= lastChunk; i++) {
-+ tn = yaffs_FindLevel0Tnode(dev, &obj->variant.fileVariant, i);
-
- if (tn) {
-- __u32 theChunk = yaffs_GetChunkGroupBase(dev,tn,i);
-- if(theChunk > 0){
-+ __u32 theChunk = yaffs_GetChunkGroupBase(dev, tn, i);
-+ if (theChunk > 0) {
- /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),objectId,i,theChunk)); */
-- yaffs_ReadChunkWithTagsFromNAND(dev,theChunk,NULL, &tags);
-- if(tags.objectId != objectId || tags.chunkId != i){
-- T(~0,(TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR),
-+ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL, &tags);
-+ if (tags.objectId != objectId || tags.chunkId != i) {
-+ T(~0, (TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR),
- objectId, i, theChunk,
- tags.objectId, tags.chunkId));
- }
- }
- }
--
- }
--
- }
-
--static void yaffs_VerifyDirectory(yaffs_Object *obj)
--{
-- if(obj && yaffs_SkipVerification(obj->myDev))
-- return;
--
--}
-
- static void yaffs_VerifyHardLink(yaffs_Object *obj)
- {
-- if(obj && yaffs_SkipVerification(obj->myDev))
-+ if (obj && yaffs_SkipVerification(obj->myDev))
- return;
-
- /* Verify sane equivalent object */
-@@ -720,7 +718,7 @@ static void yaffs_VerifyHardLink(yaffs_O
-
- static void yaffs_VerifySymlink(yaffs_Object *obj)
- {
-- if(obj && yaffs_SkipVerification(obj->myDev))
-+ if (obj && yaffs_SkipVerification(obj->myDev))
- return;
-
- /* Verify symlink string */
-@@ -728,7 +726,7 @@ static void yaffs_VerifySymlink(yaffs_Ob
-
- static void yaffs_VerifySpecial(yaffs_Object *obj)
- {
-- if(obj && yaffs_SkipVerification(obj->myDev))
-+ if (obj && yaffs_SkipVerification(obj->myDev))
- return;
- }
-
-@@ -740,14 +738,19 @@ static void yaffs_VerifyObject(yaffs_Obj
- __u32 chunkMax;
-
- __u32 chunkIdOk;
-- __u32 chunkIsLive;
-+ __u32 chunkInRange;
-+ __u32 chunkShouldNotBeDeleted;
-+ __u32 chunkValid;
-+
-+ if (!obj)
-+ return;
-
-- if(!obj)
-+ if (obj->beingCreated)
- return;
-
- dev = obj->myDev;
-
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
- /* Check sane object header chunk */
-@@ -755,50 +758,54 @@ static void yaffs_VerifyObject(yaffs_Obj
- chunkMin = dev->internalStartBlock * dev->nChunksPerBlock;
- chunkMax = (dev->internalEndBlock+1) * dev->nChunksPerBlock - 1;
-
-- chunkIdOk = (obj->chunkId >= chunkMin && obj->chunkId <= chunkMax);
-- chunkIsLive = chunkIdOk &&
-+ chunkInRange = (((unsigned)(obj->hdrChunk)) >= chunkMin && ((unsigned)(obj->hdrChunk)) <= chunkMax);
-+ chunkIdOk = chunkInRange || obj->hdrChunk == 0;
-+ chunkValid = chunkInRange &&
- yaffs_CheckChunkBit(dev,
-- obj->chunkId / dev->nChunksPerBlock,
-- obj->chunkId % dev->nChunksPerBlock);
-- if(!obj->fake &&
-- (!chunkIdOk || !chunkIsLive)) {
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d has chunkId %d %s %s"TENDSTR),
-- obj->objectId,obj->chunkId,
-- chunkIdOk ? "" : ",out of range",
-- chunkIsLive || !chunkIdOk ? "" : ",marked as deleted"));
-+ obj->hdrChunk / dev->nChunksPerBlock,
-+ obj->hdrChunk % dev->nChunksPerBlock);
-+ chunkShouldNotBeDeleted = chunkInRange && !chunkValid;
-+
-+ if (!obj->fake &&
-+ (!chunkIdOk || chunkShouldNotBeDeleted)) {
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d has chunkId %d %s %s"TENDSTR),
-+ obj->objectId, obj->hdrChunk,
-+ chunkIdOk ? "" : ",out of range",
-+ chunkShouldNotBeDeleted ? ",marked as deleted" : ""));
- }
-
-- if(chunkIdOk && chunkIsLive &&!yaffs_SkipNANDVerification(dev)) {
-+ if (chunkValid && !yaffs_SkipNANDVerification(dev)) {
- yaffs_ExtendedTags tags;
- yaffs_ObjectHeader *oh;
-- __u8 *buffer = yaffs_GetTempBuffer(dev,__LINE__);
-+ __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__);
-
- oh = (yaffs_ObjectHeader *)buffer;
-
-- yaffs_ReadChunkWithTagsFromNAND(dev, obj->chunkId,buffer, &tags);
-+ yaffs_ReadChunkWithTagsFromNAND(dev, obj->hdrChunk, buffer,
-+ &tags);
-
-- yaffs_VerifyObjectHeader(obj,oh,&tags,1);
-+ yaffs_VerifyObjectHeader(obj, oh, &tags, 1);
-
-- yaffs_ReleaseTempBuffer(dev,buffer,__LINE__);
-+ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__);
- }
-
- /* Verify it has a parent */
-- if(obj && !obj->fake &&
-- (!obj->parent || obj->parent->myDev != dev)){
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d has parent pointer %p which does not look like an object"TENDSTR),
-- obj->objectId,obj->parent));
-+ if (obj && !obj->fake &&
-+ (!obj->parent || obj->parent->myDev != dev)) {
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d has parent pointer %p which does not look like an object"TENDSTR),
-+ obj->objectId, obj->parent));
- }
-
- /* Verify parent is a directory */
-- if(obj->parent && obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY){
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d's parent is not a directory (type %d)"TENDSTR),
-- obj->objectId,obj->parent->variantType));
-+ if (obj->parent && obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d's parent is not a directory (type %d)"TENDSTR),
-+ obj->objectId, obj->parent->variantType));
- }
-
-- switch(obj->variantType){
-+ switch (obj->variantType) {
- case YAFFS_OBJECT_TYPE_FILE:
- yaffs_VerifyFile(obj);
- break;
-@@ -818,33 +825,30 @@ static void yaffs_VerifyObject(yaffs_Obj
- default:
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Obj %d has illegaltype %d"TENDSTR),
-- obj->objectId,obj->variantType));
-+ obj->objectId, obj->variantType));
- break;
- }
--
--
- }
-
- static void yaffs_VerifyObjects(yaffs_Device *dev)
- {
- yaffs_Object *obj;
- int i;
-- struct list_head *lh;
-+ struct ylist_head *lh;
-
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
- /* Iterate through the objects in each hash entry */
-
-- for(i = 0; i < YAFFS_NOBJECT_BUCKETS; i++){
-- list_for_each(lh, &dev->objectBucket[i].list) {
-+ for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) {
-+ ylist_for_each(lh, &dev->objectBucket[i].list) {
- if (lh) {
-- obj = list_entry(lh, yaffs_Object, hashLink);
-+ obj = ylist_entry(lh, yaffs_Object, hashLink);
- yaffs_VerifyObject(obj);
- }
- }
-- }
--
-+ }
- }
-
-
-@@ -855,19 +859,20 @@ static void yaffs_VerifyObjects(yaffs_De
- static Y_INLINE int yaffs_HashFunction(int n)
- {
- n = abs(n);
-- return (n % YAFFS_NOBJECT_BUCKETS);
-+ return n % YAFFS_NOBJECT_BUCKETS;
- }
-
- /*
-- * Access functions to useful fake objects
-+ * Access functions to useful fake objects.
-+ * Note that root might have a presence in NAND if permissions are set.
- */
-
--yaffs_Object *yaffs_Root(yaffs_Device * dev)
-+yaffs_Object *yaffs_Root(yaffs_Device *dev)
- {
- return dev->rootDir;
- }
-
--yaffs_Object *yaffs_LostNFound(yaffs_Device * dev)
-+yaffs_Object *yaffs_LostNFound(yaffs_Device *dev)
- {
- return dev->lostNFoundDir;
- }
-@@ -877,7 +882,7 @@ yaffs_Object *yaffs_LostNFound(yaffs_Dev
- * Erased NAND checking functions
- */
-
--int yaffs_CheckFF(__u8 * buffer, int nBytes)
-+int yaffs_CheckFF(__u8 *buffer, int nBytes)
- {
- /* Horrible, slow implementation */
- while (nBytes--) {
-@@ -889,9 +894,8 @@ int yaffs_CheckFF(__u8 * buffer, int nBy
- }
-
- static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND)
-+ int chunkInNAND)
- {
--
- int retval = YAFFS_OK;
- __u8 *data = yaffs_GetTempBuffer(dev, __LINE__);
- yaffs_ExtendedTags tags;
-@@ -899,10 +903,9 @@ static int yaffs_CheckChunkErased(struct
-
- result = yaffs_ReadChunkWithTagsFromNAND(dev, chunkInNAND, data, &tags);
-
-- if(tags.eccResult > YAFFS_ECC_RESULT_NO_ERROR)
-+ if (tags.eccResult > YAFFS_ECC_RESULT_NO_ERROR)
- retval = YAFFS_FAIL;
-
--
- if (!yaffs_CheckFF(data, dev->nDataBytesPerChunk) || tags.chunkUsed) {
- T(YAFFS_TRACE_NANDACCESS,
- (TSTR("Chunk %d not erased" TENDSTR), chunkInNAND));
-@@ -915,11 +918,10 @@ static int yaffs_CheckChunkErased(struct
-
- }
-
--
- static int yaffs_WriteNewChunkWithTagsToNAND(struct yaffs_DeviceStruct *dev,
-- const __u8 * data,
-- yaffs_ExtendedTags * tags,
-- int useReserve)
-+ const __u8 *data,
-+ yaffs_ExtendedTags *tags,
-+ int useReserve)
- {
- int attempts = 0;
- int writeOk = 0;
-@@ -972,7 +974,7 @@ static int yaffs_WriteNewChunkWithTagsTo
- erasedOk = yaffs_CheckChunkErased(dev, chunk);
- if (erasedOk != YAFFS_OK) {
- T(YAFFS_TRACE_ERROR,
-- (TSTR ("**>> yaffs chunk %d was not erased"
-+ (TSTR("**>> yaffs chunk %d was not erased"
- TENDSTR), chunk));
-
- /* try another chunk */
-@@ -992,7 +994,11 @@ static int yaffs_WriteNewChunkWithTagsTo
- /* Copy the data into the robustification buffer */
- yaffs_HandleWriteChunkOk(dev, chunk, data, tags);
-
-- } while (writeOk != YAFFS_OK && attempts < yaffs_wr_attempts);
-+ } while (writeOk != YAFFS_OK &&
-+ (yaffs_wr_attempts <= 0 || attempts <= yaffs_wr_attempts));
-+
-+ if (!writeOk)
-+ chunk = -1;
-
- if (attempts > 1) {
- T(YAFFS_TRACE_ERROR,
-@@ -1009,13 +1015,35 @@ static int yaffs_WriteNewChunkWithTagsTo
- * Block retiring for handling a broken block.
- */
-
--static void yaffs_RetireBlock(yaffs_Device * dev, int blockInNAND)
-+static void yaffs_RetireBlock(yaffs_Device *dev, int blockInNAND)
- {
- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockInNAND);
-
- yaffs_InvalidateCheckpoint(dev);
-
-- yaffs_MarkBlockBad(dev, blockInNAND);
-+ if (yaffs_MarkBlockBad(dev, blockInNAND) != YAFFS_OK) {
-+ if (yaffs_EraseBlockInNAND(dev, blockInNAND) != YAFFS_OK) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR(
-+ "yaffs: Failed to mark bad and erase block %d"
-+ TENDSTR), blockInNAND));
-+ } else {
-+ yaffs_ExtendedTags tags;
-+ int chunkId = blockInNAND * dev->nChunksPerBlock;
-+
-+ __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__);
-+
-+ memset(buffer, 0xff, dev->nDataBytesPerChunk);
-+ yaffs_InitialiseTags(&tags);
-+ tags.sequenceNumber = YAFFS_SEQUENCE_BAD_BLOCK;
-+ if (dev->writeChunkWithTagsToNAND(dev, chunkId -
-+ dev->chunkOffset, buffer, &tags) != YAFFS_OK)
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Failed to "
-+ TCONT("write bad block marker to block %d")
-+ TENDSTR), blockInNAND));
-+
-+ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__);
-+ }
-+ }
-
- bi->blockState = YAFFS_BLOCK_STATE_DEAD;
- bi->gcPrioritise = 0;
-@@ -1029,49 +1057,45 @@ static void yaffs_RetireBlock(yaffs_Devi
- *
- */
-
--static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags * tags)
-+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags)
- {
- }
-
--static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,
-- const yaffs_ExtendedTags * tags)
-+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND,
-+ const yaffs_ExtendedTags *tags)
- {
- }
-
- void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi)
- {
-- if(!bi->gcPrioritise){
-+ if (!bi->gcPrioritise) {
- bi->gcPrioritise = 1;
- dev->hasPendingPrioritisedGCs = 1;
-- bi->chunkErrorStrikes ++;
-+ bi->chunkErrorStrikes++;
-
-- if(bi->chunkErrorStrikes > 3){
-+ if (bi->chunkErrorStrikes > 3) {
- bi->needsRetiring = 1; /* Too many stikes, so retire this */
- T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Block struck out" TENDSTR)));
-
- }
--
- }
- }
-
--static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND, int erasedOk)
-+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND,
-+ int erasedOk)
- {
--
- int blockInNAND = chunkInNAND / dev->nChunksPerBlock;
- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockInNAND);
-
-- yaffs_HandleChunkError(dev,bi);
-+ yaffs_HandleChunkError(dev, bi);
-
--
-- if(erasedOk ) {
-+ if (erasedOk) {
- /* Was an actual write failure, so mark the block for retirement */
- bi->needsRetiring = 1;
- T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS,
- (TSTR("**>> Block %d needs retiring" TENDSTR), blockInNAND));
--
--
- }
-
- /* Delete the chunk */
-@@ -1081,12 +1105,12 @@ static void yaffs_HandleWriteChunkError(
-
- /*---------------- Name handling functions ------------*/
-
--static __u16 yaffs_CalcNameSum(const YCHAR * name)
-+static __u16 yaffs_CalcNameSum(const YCHAR *name)
- {
- __u16 sum = 0;
- __u16 i = 1;
-
-- YUCHAR *bname = (YUCHAR *) name;
-+ const YUCHAR *bname = (const YUCHAR *) name;
- if (bname) {
- while ((*bname) && (i < (YAFFS_MAX_NAME_LENGTH/2))) {
-
-@@ -1102,14 +1126,14 @@ static __u16 yaffs_CalcNameSum(const YCH
- return sum;
- }
-
--static void yaffs_SetObjectName(yaffs_Object * obj, const YCHAR * name)
-+static void yaffs_SetObjectName(yaffs_Object *obj, const YCHAR *name)
- {
- #ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM
-- if (name && yaffs_strlen(name) <= YAFFS_SHORT_NAME_LENGTH) {
-+ memset(obj->shortName, 0, sizeof(YCHAR) * (YAFFS_SHORT_NAME_LENGTH+1));
-+ if (name && yaffs_strlen(name) <= YAFFS_SHORT_NAME_LENGTH)
- yaffs_strcpy(obj->shortName, name);
-- } else {
-+ else
- obj->shortName[0] = _Y('\0');
-- }
- #endif
- obj->sum = yaffs_CalcNameSum(name);
- }
-@@ -1126,7 +1150,7 @@ static void yaffs_SetObjectName(yaffs_Ob
- * Don't use this function directly
- */
-
--static int yaffs_CreateTnodes(yaffs_Device * dev, int nTnodes)
-+static int yaffs_CreateTnodes(yaffs_Device *dev, int nTnodes)
- {
- int i;
- int tnodeSize;
-@@ -1143,6 +1167,9 @@ static int yaffs_CreateTnodes(yaffs_Devi
- * Must be a multiple of 32-bits */
- tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-+
- /* make these things */
-
- newTnodes = YMALLOC(nTnodes * tnodeSize);
-@@ -1150,7 +1177,7 @@ static int yaffs_CreateTnodes(yaffs_Devi
-
- if (!newTnodes) {
- T(YAFFS_TRACE_ERROR,
-- (TSTR("yaffs: Could not allocate Tnodes" TENDSTR)));
-+ (TSTR("yaffs: Could not allocate Tnodes" TENDSTR)));
- return YAFFS_FAIL;
- }
-
-@@ -1170,7 +1197,7 @@ static int yaffs_CreateTnodes(yaffs_Devi
- dev->freeTnodes = newTnodes;
- #else
- /* New hookup for wide tnodes */
-- for(i = 0; i < nTnodes -1; i++) {
-+ for (i = 0; i < nTnodes - 1; i++) {
- curr = (yaffs_Tnode *) &mem[i * tnodeSize];
- next = (yaffs_Tnode *) &mem[(i+1) * tnodeSize];
- curr->internal[0] = next;
-@@ -1197,7 +1224,6 @@ static int yaffs_CreateTnodes(yaffs_Devi
- (TSTR
- ("yaffs: Could not add tnodes to management list" TENDSTR)));
- return YAFFS_FAIL;
--
- } else {
- tnl->tnodes = newTnodes;
- tnl->next = dev->allocatedTnodeList;
-@@ -1211,14 +1237,13 @@ static int yaffs_CreateTnodes(yaffs_Devi
-
- /* GetTnode gets us a clean tnode. Tries to make allocate more if we run out */
-
--static yaffs_Tnode *yaffs_GetTnodeRaw(yaffs_Device * dev)
-+static yaffs_Tnode *yaffs_GetTnodeRaw(yaffs_Device *dev)
- {
- yaffs_Tnode *tn = NULL;
-
- /* If there are none left make more */
-- if (!dev->freeTnodes) {
-+ if (!dev->freeTnodes)
- yaffs_CreateTnodes(dev, YAFFS_ALLOCATION_NTNODES);
-- }
-
- if (dev->freeTnodes) {
- tn = dev->freeTnodes;
-@@ -1233,21 +1258,27 @@ static yaffs_Tnode *yaffs_GetTnodeRaw(ya
- dev->nFreeTnodes--;
- }
-
-+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
-+
- return tn;
- }
-
--static yaffs_Tnode *yaffs_GetTnode(yaffs_Device * dev)
-+static yaffs_Tnode *yaffs_GetTnode(yaffs_Device *dev)
- {
- yaffs_Tnode *tn = yaffs_GetTnodeRaw(dev);
-+ int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-
-- if(tn)
-- memset(tn, 0, (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8);
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-+
-+ if (tn)
-+ memset(tn, 0, tnodeSize);
-
- return tn;
- }
-
- /* FreeTnode frees up a tnode and puts it back on the free list */
--static void yaffs_FreeTnode(yaffs_Device * dev, yaffs_Tnode * tn)
-+static void yaffs_FreeTnode(yaffs_Device *dev, yaffs_Tnode *tn)
- {
- if (tn) {
- #ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG
-@@ -1262,9 +1293,10 @@ static void yaffs_FreeTnode(yaffs_Device
- dev->freeTnodes = tn;
- dev->nFreeTnodes++;
- }
-+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
- }
-
--static void yaffs_DeinitialiseTnodes(yaffs_Device * dev)
-+static void yaffs_DeinitialiseTnodes(yaffs_Device *dev)
- {
- /* Free the list of allocated tnodes */
- yaffs_TnodeList *tmp;
-@@ -1282,71 +1314,72 @@ static void yaffs_DeinitialiseTnodes(yaf
- dev->nFreeTnodes = 0;
- }
-
--static void yaffs_InitialiseTnodes(yaffs_Device * dev)
-+static void yaffs_InitialiseTnodes(yaffs_Device *dev)
- {
- dev->allocatedTnodeList = NULL;
- dev->freeTnodes = NULL;
- dev->nFreeTnodes = 0;
- dev->nTnodesCreated = 0;
--
- }
-
-
--void yaffs_PutLevel0Tnode(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos, unsigned val)
-+void yaffs_PutLevel0Tnode(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos,
-+ unsigned val)
- {
-- __u32 *map = (__u32 *)tn;
-- __u32 bitInMap;
-- __u32 bitInWord;
-- __u32 wordInMap;
-- __u32 mask;
-+ __u32 *map = (__u32 *)tn;
-+ __u32 bitInMap;
-+ __u32 bitInWord;
-+ __u32 wordInMap;
-+ __u32 mask;
-
-- pos &= YAFFS_TNODES_LEVEL0_MASK;
-- val >>= dev->chunkGroupBits;
-+ pos &= YAFFS_TNODES_LEVEL0_MASK;
-+ val >>= dev->chunkGroupBits;
-
-- bitInMap = pos * dev->tnodeWidth;
-- wordInMap = bitInMap /32;
-- bitInWord = bitInMap & (32 -1);
-+ bitInMap = pos * dev->tnodeWidth;
-+ wordInMap = bitInMap / 32;
-+ bitInWord = bitInMap & (32 - 1);
-
-- mask = dev->tnodeMask << bitInWord;
-+ mask = dev->tnodeMask << bitInWord;
-
-- map[wordInMap] &= ~mask;
-- map[wordInMap] |= (mask & (val << bitInWord));
-+ map[wordInMap] &= ~mask;
-+ map[wordInMap] |= (mask & (val << bitInWord));
-
-- if(dev->tnodeWidth > (32-bitInWord)) {
-- bitInWord = (32 - bitInWord);
-- wordInMap++;;
-- mask = dev->tnodeMask >> (/*dev->tnodeWidth -*/ bitInWord);
-- map[wordInMap] &= ~mask;
-- map[wordInMap] |= (mask & (val >> bitInWord));
-- }
-+ if (dev->tnodeWidth > (32 - bitInWord)) {
-+ bitInWord = (32 - bitInWord);
-+ wordInMap++;;
-+ mask = dev->tnodeMask >> (/*dev->tnodeWidth -*/ bitInWord);
-+ map[wordInMap] &= ~mask;
-+ map[wordInMap] |= (mask & (val >> bitInWord));
-+ }
- }
-
--static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos)
-+static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn,
-+ unsigned pos)
- {
-- __u32 *map = (__u32 *)tn;
-- __u32 bitInMap;
-- __u32 bitInWord;
-- __u32 wordInMap;
-- __u32 val;
-+ __u32 *map = (__u32 *)tn;
-+ __u32 bitInMap;
-+ __u32 bitInWord;
-+ __u32 wordInMap;
-+ __u32 val;
-
-- pos &= YAFFS_TNODES_LEVEL0_MASK;
-+ pos &= YAFFS_TNODES_LEVEL0_MASK;
-
-- bitInMap = pos * dev->tnodeWidth;
-- wordInMap = bitInMap /32;
-- bitInWord = bitInMap & (32 -1);
-+ bitInMap = pos * dev->tnodeWidth;
-+ wordInMap = bitInMap / 32;
-+ bitInWord = bitInMap & (32 - 1);
-
-- val = map[wordInMap] >> bitInWord;
-+ val = map[wordInMap] >> bitInWord;
-
-- if(dev->tnodeWidth > (32-bitInWord)) {
-- bitInWord = (32 - bitInWord);
-- wordInMap++;;
-- val |= (map[wordInMap] << bitInWord);
-- }
-+ if (dev->tnodeWidth > (32 - bitInWord)) {
-+ bitInWord = (32 - bitInWord);
-+ wordInMap++;;
-+ val |= (map[wordInMap] << bitInWord);
-+ }
-
-- val &= dev->tnodeMask;
-- val <<= dev->chunkGroupBits;
-+ val &= dev->tnodeMask;
-+ val <<= dev->chunkGroupBits;
-
-- return val;
-+ return val;
- }
-
- /* ------------------- End of individual tnode manipulation -----------------*/
-@@ -1357,24 +1390,21 @@ static __u32 yaffs_GetChunkGroupBase(yaf
- */
-
- /* FindLevel0Tnode finds the level 0 tnode, if one exists. */
--static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device * dev,
-- yaffs_FileStructure * fStruct,
-- __u32 chunkId)
-+static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device *dev,
-+ yaffs_FileStructure *fStruct,
-+ __u32 chunkId)
- {
--
- yaffs_Tnode *tn = fStruct->top;
- __u32 i;
- int requiredTallness;
- int level = fStruct->topLevel;
-
- /* Check sane level and chunk Id */
-- if (level < 0 || level > YAFFS_TNODES_MAX_LEVEL) {
-+ if (level < 0 || level > YAFFS_TNODES_MAX_LEVEL)
- return NULL;
-- }
-
-- if (chunkId > YAFFS_MAX_CHUNK_ID) {
-+ if (chunkId > YAFFS_MAX_CHUNK_ID)
- return NULL;
-- }
-
- /* First check we're tall enough (ie enough topLevel) */
-
-@@ -1385,22 +1415,17 @@ static yaffs_Tnode *yaffs_FindLevel0Tnod
- requiredTallness++;
- }
-
-- if (requiredTallness > fStruct->topLevel) {
-- /* Not tall enough, so we can't find it, return NULL. */
-- return NULL;
-- }
-+ if (requiredTallness > fStruct->topLevel)
-+ return NULL; /* Not tall enough, so we can't find it */
-
- /* Traverse down to level 0 */
- while (level > 0 && tn) {
-- tn = tn->
-- internal[(chunkId >>
-- ( YAFFS_TNODES_LEVEL0_BITS +
-- (level - 1) *
-- YAFFS_TNODES_INTERNAL_BITS)
-- ) &
-- YAFFS_TNODES_INTERNAL_MASK];
-+ tn = tn->internal[(chunkId >>
-+ (YAFFS_TNODES_LEVEL0_BITS +
-+ (level - 1) *
-+ YAFFS_TNODES_INTERNAL_BITS)) &
-+ YAFFS_TNODES_INTERNAL_MASK];
- level--;
--
- }
-
- return tn;
-@@ -1417,12 +1442,11 @@ static yaffs_Tnode *yaffs_FindLevel0Tnod
- * be plugged into the ttree.
- */
-
--static yaffs_Tnode *yaffs_AddOrFindLevel0Tnode(yaffs_Device * dev,
-- yaffs_FileStructure * fStruct,
-- __u32 chunkId,
-- yaffs_Tnode *passedTn)
-+static yaffs_Tnode *yaffs_AddOrFindLevel0Tnode(yaffs_Device *dev,
-+ yaffs_FileStructure *fStruct,
-+ __u32 chunkId,
-+ yaffs_Tnode *passedTn)
- {
--
- int requiredTallness;
- int i;
- int l;
-@@ -1432,13 +1456,11 @@ static yaffs_Tnode *yaffs_AddOrFindLevel
-
-
- /* Check sane level and page Id */
-- if (fStruct->topLevel < 0 || fStruct->topLevel > YAFFS_TNODES_MAX_LEVEL) {
-+ if (fStruct->topLevel < 0 || fStruct->topLevel > YAFFS_TNODES_MAX_LEVEL)
- return NULL;
-- }
-
-- if (chunkId > YAFFS_MAX_CHUNK_ID) {
-+ if (chunkId > YAFFS_MAX_CHUNK_ID)
- return NULL;
-- }
-
- /* First check we're tall enough (ie enough topLevel) */
-
-@@ -1451,7 +1473,7 @@ static yaffs_Tnode *yaffs_AddOrFindLevel
-
-
- if (requiredTallness > fStruct->topLevel) {
-- /* Not tall enough,gotta make the tree taller */
-+ /* Not tall enough, gotta make the tree taller */
- for (i = fStruct->topLevel; i < requiredTallness; i++) {
-
- tn = yaffs_GetTnode(dev);
-@@ -1473,27 +1495,27 @@ static yaffs_Tnode *yaffs_AddOrFindLevel
- l = fStruct->topLevel;
- tn = fStruct->top;
-
-- if(l > 0) {
-+ if (l > 0) {
- while (l > 0 && tn) {
- x = (chunkId >>
-- ( YAFFS_TNODES_LEVEL0_BITS +
-+ (YAFFS_TNODES_LEVEL0_BITS +
- (l - 1) * YAFFS_TNODES_INTERNAL_BITS)) &
- YAFFS_TNODES_INTERNAL_MASK;
-
-
-- if((l>1) && !tn->internal[x]){
-+ if ((l > 1) && !tn->internal[x]) {
- /* Add missing non-level-zero tnode */
- tn->internal[x] = yaffs_GetTnode(dev);
-
-- } else if(l == 1) {
-+ } else if (l == 1) {
- /* Looking from level 1 at level 0 */
-- if (passedTn) {
-+ if (passedTn) {
- /* If we already have one, then release it.*/
-- if(tn->internal[x])
-- yaffs_FreeTnode(dev,tn->internal[x]);
-+ if (tn->internal[x])
-+ yaffs_FreeTnode(dev, tn->internal[x]);
- tn->internal[x] = passedTn;
-
-- } else if(!tn->internal[x]) {
-+ } else if (!tn->internal[x]) {
- /* Don't have one, none passed in */
- tn->internal[x] = yaffs_GetTnode(dev);
- }
-@@ -1504,31 +1526,29 @@ static yaffs_Tnode *yaffs_AddOrFindLevel
- }
- } else {
- /* top is level 0 */
-- if(passedTn) {
-- memcpy(tn,passedTn,(dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8);
-- yaffs_FreeTnode(dev,passedTn);
-+ if (passedTn) {
-+ memcpy(tn, passedTn, (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8);
-+ yaffs_FreeTnode(dev, passedTn);
- }
- }
-
- return tn;
- }
-
--static int yaffs_FindChunkInGroup(yaffs_Device * dev, int theChunk,
-- yaffs_ExtendedTags * tags, int objectId,
-- int chunkInInode)
-+static int yaffs_FindChunkInGroup(yaffs_Device *dev, int theChunk,
-+ yaffs_ExtendedTags *tags, int objectId,
-+ int chunkInInode)
- {
- int j;
-
- for (j = 0; theChunk && j < dev->chunkGroupSize; j++) {
-- if (yaffs_CheckChunkBit
-- (dev, theChunk / dev->nChunksPerBlock,
-- theChunk % dev->nChunksPerBlock)) {
-+ if (yaffs_CheckChunkBit(dev, theChunk / dev->nChunksPerBlock,
-+ theChunk % dev->nChunksPerBlock)) {
- yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL,
- tags);
- if (yaffs_TagsMatch(tags, objectId, chunkInInode)) {
- /* found it; */
- return theChunk;
--
- }
- }
- theChunk++;
-@@ -1543,7 +1563,7 @@ static int yaffs_FindChunkInGroup(yaffs_
- * Returns 0 if it stopped early due to hitting the limit and the delete is incomplete.
- */
-
--static int yaffs_DeleteWorker(yaffs_Object * in, yaffs_Tnode * tn, __u32 level,
-+static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level,
- int chunkOffset, int *limit)
- {
- int i;
-@@ -1557,7 +1577,6 @@ static int yaffs_DeleteWorker(yaffs_Obje
-
- if (tn) {
- if (level > 0) {
--
- for (i = YAFFS_NTNODES_INTERNAL - 1; allDone && i >= 0;
- i--) {
- if (tn->internal[i]) {
-@@ -1565,17 +1584,17 @@ static int yaffs_DeleteWorker(yaffs_Obje
- allDone = 0;
- } else {
- allDone =
-- yaffs_DeleteWorker(in,
-- tn->
-- internal
-- [i],
-- level -
-- 1,
-- (chunkOffset
-+ yaffs_DeleteWorker(in,
-+ tn->
-+ internal
-+ [i],
-+ level -
-+ 1,
-+ (chunkOffset
- <<
- YAFFS_TNODES_INTERNAL_BITS)
-- + i,
-- limit);
-+ + i,
-+ limit);
- }
- if (allDone) {
- yaffs_FreeTnode(dev,
-@@ -1584,27 +1603,25 @@ static int yaffs_DeleteWorker(yaffs_Obje
- tn->internal[i] = NULL;
- }
- }
--
- }
- return (allDone) ? 1 : 0;
- } else if (level == 0) {
- int hitLimit = 0;
-
- for (i = YAFFS_NTNODES_LEVEL0 - 1; i >= 0 && !hitLimit;
-- i--) {
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,i);
-+ i--) {
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, i);
- if (theChunk) {
-
-- chunkInInode =
-- (chunkOffset <<
-- YAFFS_TNODES_LEVEL0_BITS) + i;
-+ chunkInInode = (chunkOffset <<
-+ YAFFS_TNODES_LEVEL0_BITS) + i;
-
- foundChunk =
-- yaffs_FindChunkInGroup(dev,
-- theChunk,
-- &tags,
-- in->objectId,
-- chunkInInode);
-+ yaffs_FindChunkInGroup(dev,
-+ theChunk,
-+ &tags,
-+ in->objectId,
-+ chunkInInode);
-
- if (foundChunk > 0) {
- yaffs_DeleteChunk(dev,
-@@ -1613,14 +1630,13 @@ static int yaffs_DeleteWorker(yaffs_Obje
- in->nDataChunks--;
- if (limit) {
- *limit = *limit - 1;
-- if (*limit <= 0) {
-+ if (*limit <= 0)
- hitLimit = 1;
-- }
- }
-
- }
-
-- yaffs_PutLevel0Tnode(dev,tn,i,0);
-+ yaffs_PutLevel0Tnode(dev, tn, i, 0);
- }
-
- }
-@@ -1634,9 +1650,8 @@ static int yaffs_DeleteWorker(yaffs_Obje
-
- }
-
--static void yaffs_SoftDeleteChunk(yaffs_Device * dev, int chunk)
-+static void yaffs_SoftDeleteChunk(yaffs_Device *dev, int chunk)
- {
--
- yaffs_BlockInfo *theBlock;
-
- T(YAFFS_TRACE_DELETION, (TSTR("soft delete chunk %d" TENDSTR), chunk));
-@@ -1654,7 +1669,7 @@ static void yaffs_SoftDeleteChunk(yaffs_
- * Thus, essentially this is the same as DeleteWorker except that the chunks are soft deleted.
- */
-
--static int yaffs_SoftDeleteWorker(yaffs_Object * in, yaffs_Tnode * tn,
-+static int yaffs_SoftDeleteWorker(yaffs_Object *in, yaffs_Tnode *tn,
- __u32 level, int chunkOffset)
- {
- int i;
-@@ -1691,14 +1706,14 @@ static int yaffs_SoftDeleteWorker(yaffs_
- } else if (level == 0) {
-
- for (i = YAFFS_NTNODES_LEVEL0 - 1; i >= 0; i--) {
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,i);
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, i);
- if (theChunk) {
- /* Note this does not find the real chunk, only the chunk group.
- * We make an assumption that a chunk group is not larger than
- * a block.
- */
- yaffs_SoftDeleteChunk(dev, theChunk);
-- yaffs_PutLevel0Tnode(dev,tn,i,0);
-+ yaffs_PutLevel0Tnode(dev, tn, i, 0);
- }
-
- }
-@@ -1712,7 +1727,7 @@ static int yaffs_SoftDeleteWorker(yaffs_
-
- }
-
--static void yaffs_SoftDeleteFile(yaffs_Object * obj)
-+static void yaffs_SoftDeleteFile(yaffs_Object *obj)
- {
- if (obj->deleted &&
- obj->variantType == YAFFS_OBJECT_TYPE_FILE && !obj->softDeleted) {
-@@ -1746,8 +1761,8 @@ static void yaffs_SoftDeleteFile(yaffs_O
- * by a special case.
- */
-
--static yaffs_Tnode *yaffs_PruneWorker(yaffs_Device * dev, yaffs_Tnode * tn,
-- __u32 level, int del0)
-+static yaffs_Tnode *yaffs_PruneWorker(yaffs_Device *dev, yaffs_Tnode *tn,
-+ __u32 level, int del0)
- {
- int i;
- int hasData;
-@@ -1763,9 +1778,8 @@ static yaffs_Tnode *yaffs_PruneWorker(ya
- (i == 0) ? del0 : 1);
- }
-
-- if (tn->internal[i]) {
-+ if (tn->internal[i])
- hasData++;
-- }
- }
-
- if (hasData == 0 && del0) {
-@@ -1781,8 +1795,8 @@ static yaffs_Tnode *yaffs_PruneWorker(ya
-
- }
-
--static int yaffs_PruneFileStructure(yaffs_Device * dev,
-- yaffs_FileStructure * fStruct)
-+static int yaffs_PruneFileStructure(yaffs_Device *dev,
-+ yaffs_FileStructure *fStruct)
- {
- int i;
- int hasData;
-@@ -1805,9 +1819,8 @@ static int yaffs_PruneFileStructure(yaff
-
- hasData = 0;
- for (i = 1; i < YAFFS_NTNODES_INTERNAL; i++) {
-- if (tn->internal[i]) {
-+ if (tn->internal[i])
- hasData++;
-- }
- }
-
- if (!hasData) {
-@@ -1828,7 +1841,7 @@ static int yaffs_PruneFileStructure(yaff
- /* yaffs_CreateFreeObjects creates a bunch more objects and
- * adds them to the object free list.
- */
--static int yaffs_CreateFreeObjects(yaffs_Device * dev, int nObjects)
-+static int yaffs_CreateFreeObjects(yaffs_Device *dev, int nObjects)
- {
- int i;
- yaffs_Object *newObjects;
-@@ -1842,9 +1855,9 @@ static int yaffs_CreateFreeObjects(yaffs
- list = YMALLOC(sizeof(yaffs_ObjectList));
-
- if (!newObjects || !list) {
-- if(newObjects)
-+ if (newObjects)
- YFREE(newObjects);
-- if(list)
-+ if (list)
- YFREE(list);
- T(YAFFS_TRACE_ALLOCATE,
- (TSTR("yaffs: Could not allocate more objects" TENDSTR)));
-@@ -1854,7 +1867,7 @@ static int yaffs_CreateFreeObjects(yaffs
- /* Hook them into the free list */
- for (i = 0; i < nObjects - 1; i++) {
- newObjects[i].siblings.next =
-- (struct list_head *)(&newObjects[i + 1]);
-+ (struct ylist_head *)(&newObjects[i + 1]);
- }
-
- newObjects[nObjects - 1].siblings.next = (void *)dev->freeObjects;
-@@ -1873,85 +1886,109 @@ static int yaffs_CreateFreeObjects(yaffs
-
-
- /* AllocateEmptyObject gets us a clean Object. Tries to make allocate more if we run out */
--static yaffs_Object *yaffs_AllocateEmptyObject(yaffs_Device * dev)
-+static yaffs_Object *yaffs_AllocateEmptyObject(yaffs_Device *dev)
- {
- yaffs_Object *tn = NULL;
-
-+#ifdef VALGRIND_TEST
-+ tn = YMALLOC(sizeof(yaffs_Object));
-+#else
- /* If there are none left make more */
-- if (!dev->freeObjects) {
-+ if (!dev->freeObjects)
- yaffs_CreateFreeObjects(dev, YAFFS_ALLOCATION_NOBJECTS);
-- }
-
- if (dev->freeObjects) {
- tn = dev->freeObjects;
- dev->freeObjects =
-- (yaffs_Object *) (dev->freeObjects->siblings.next);
-+ (yaffs_Object *) (dev->freeObjects->siblings.next);
- dev->nFreeObjects--;
--
-+ }
-+#endif
-+ if (tn) {
- /* Now sweeten it up... */
-
- memset(tn, 0, sizeof(yaffs_Object));
-+ tn->beingCreated = 1;
-+
- tn->myDev = dev;
-- tn->chunkId = -1;
-+ tn->hdrChunk = 0;
- tn->variantType = YAFFS_OBJECT_TYPE_UNKNOWN;
-- INIT_LIST_HEAD(&(tn->hardLinks));
-- INIT_LIST_HEAD(&(tn->hashLink));
-- INIT_LIST_HEAD(&tn->siblings);
-+ YINIT_LIST_HEAD(&(tn->hardLinks));
-+ YINIT_LIST_HEAD(&(tn->hashLink));
-+ YINIT_LIST_HEAD(&tn->siblings);
-+
-+
-+ /* Now make the directory sane */
-+ if (dev->rootDir) {
-+ tn->parent = dev->rootDir;
-+ ylist_add(&(tn->siblings), &dev->rootDir->variant.directoryVariant.children);
-+ }
-
- /* Add it to the lost and found directory.
- * NB Can't put root or lostNFound in lostNFound so
- * check if lostNFound exists first
- */
-- if (dev->lostNFoundDir) {
-+ if (dev->lostNFoundDir)
- yaffs_AddObjectToDirectory(dev->lostNFoundDir, tn);
-- }
-+
-+ tn->beingCreated = 0;
- }
-
-+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
-+
- return tn;
- }
-
--static yaffs_Object *yaffs_CreateFakeDirectory(yaffs_Device * dev, int number,
-+static yaffs_Object *yaffs_CreateFakeDirectory(yaffs_Device *dev, int number,
- __u32 mode)
- {
-
- yaffs_Object *obj =
- yaffs_CreateNewObject(dev, number, YAFFS_OBJECT_TYPE_DIRECTORY);
- if (obj) {
-- obj->fake = 1; /* it is fake so it has no NAND presence... */
-+ obj->fake = 1; /* it is fake so it might have no NAND presence... */
- obj->renameAllowed = 0; /* ... and we're not allowed to rename it... */
- obj->unlinkAllowed = 0; /* ... or unlink it */
- obj->deleted = 0;
- obj->unlinked = 0;
- obj->yst_mode = mode;
- obj->myDev = dev;
-- obj->chunkId = 0; /* Not a valid chunk. */
-+ obj->hdrChunk = 0; /* Not a valid chunk. */
- }
-
- return obj;
-
- }
-
--static void yaffs_UnhashObject(yaffs_Object * tn)
-+static void yaffs_UnhashObject(yaffs_Object *tn)
- {
- int bucket;
- yaffs_Device *dev = tn->myDev;
-
- /* If it is still linked into the bucket list, free from the list */
-- if (!list_empty(&tn->hashLink)) {
-- list_del_init(&tn->hashLink);
-+ if (!ylist_empty(&tn->hashLink)) {
-+ ylist_del_init(&tn->hashLink);
- bucket = yaffs_HashFunction(tn->objectId);
- dev->objectBucket[bucket].count--;
- }
--
- }
-
- /* FreeObject frees up a Object and puts it back on the free list */
--static void yaffs_FreeObject(yaffs_Object * tn)
-+static void yaffs_FreeObject(yaffs_Object *tn)
- {
--
- yaffs_Device *dev = tn->myDev;
-
--#ifdef __KERNEL__
-+#ifdef __KERNEL__
-+ T(YAFFS_TRACE_OS, (TSTR("FreeObject %p inode %p"TENDSTR), tn, tn->myInode));
-+#endif
-+
-+ if (tn->parent)
-+ YBUG();
-+ if (!ylist_empty(&tn->siblings))
-+ YBUG();
-+
-+
-+#ifdef __KERNEL__
- if (tn->myInode) {
- /* We're still hooked up to a cached inode.
- * Don't delete now, but mark for later deletion
-@@ -1963,24 +2000,28 @@ static void yaffs_FreeObject(yaffs_Objec
-
- yaffs_UnhashObject(tn);
-
-+#ifdef VALGRIND_TEST
-+ YFREE(tn);
-+#else
- /* Link into the free list. */
-- tn->siblings.next = (struct list_head *)(dev->freeObjects);
-+ tn->siblings.next = (struct ylist_head *)(dev->freeObjects);
- dev->freeObjects = tn;
- dev->nFreeObjects++;
-+#endif
-+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
- }
-
- #ifdef __KERNEL__
-
--void yaffs_HandleDeferedFree(yaffs_Object * obj)
-+void yaffs_HandleDeferedFree(yaffs_Object *obj)
- {
-- if (obj->deferedFree) {
-+ if (obj->deferedFree)
- yaffs_FreeObject(obj);
-- }
- }
-
- #endif
-
--static void yaffs_DeinitialiseObjects(yaffs_Device * dev)
-+static void yaffs_DeinitialiseObjects(yaffs_Device *dev)
- {
- /* Free the list of allocated Objects */
-
-@@ -1998,7 +2039,7 @@ static void yaffs_DeinitialiseObjects(ya
- dev->nFreeObjects = 0;
- }
-
--static void yaffs_InitialiseObjects(yaffs_Device * dev)
-+static void yaffs_InitialiseObjects(yaffs_Device *dev)
- {
- int i;
-
-@@ -2007,15 +2048,14 @@ static void yaffs_InitialiseObjects(yaff
- dev->nFreeObjects = 0;
-
- for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) {
-- INIT_LIST_HEAD(&dev->objectBucket[i].list);
-+ YINIT_LIST_HEAD(&dev->objectBucket[i].list);
- dev->objectBucket[i].count = 0;
- }
--
- }
-
--static int yaffs_FindNiceObjectBucket(yaffs_Device * dev)
-+static int yaffs_FindNiceObjectBucket(yaffs_Device *dev)
- {
-- static int x = 0;
-+ static int x;
- int i;
- int l = 999;
- int lowest = 999999;
-@@ -2049,7 +2089,7 @@ static int yaffs_FindNiceObjectBucket(ya
- return l;
- }
-
--static int yaffs_CreateNewObjectNumber(yaffs_Device * dev)
-+static int yaffs_CreateNewObjectNumber(yaffs_Device *dev)
- {
- int bucket = yaffs_FindNiceObjectBucket(dev);
-
-@@ -2058,7 +2098,7 @@ static int yaffs_CreateNewObjectNumber(y
- */
-
- int found = 0;
-- struct list_head *i;
-+ struct ylist_head *i;
-
- __u32 n = (__u32) bucket;
-
-@@ -2068,41 +2108,38 @@ static int yaffs_CreateNewObjectNumber(y
- found = 1;
- n += YAFFS_NOBJECT_BUCKETS;
- if (1 || dev->objectBucket[bucket].count > 0) {
-- list_for_each(i, &dev->objectBucket[bucket].list) {
-+ ylist_for_each(i, &dev->objectBucket[bucket].list) {
- /* If there is already one in the list */
-- if (i
-- && list_entry(i, yaffs_Object,
-- hashLink)->objectId == n) {
-+ if (i && ylist_entry(i, yaffs_Object,
-+ hashLink)->objectId == n) {
- found = 0;
- }
- }
- }
- }
-
--
- return n;
- }
-
--static void yaffs_HashObject(yaffs_Object * in)
-+static void yaffs_HashObject(yaffs_Object *in)
- {
- int bucket = yaffs_HashFunction(in->objectId);
- yaffs_Device *dev = in->myDev;
-
-- list_add(&in->hashLink, &dev->objectBucket[bucket].list);
-+ ylist_add(&in->hashLink, &dev->objectBucket[bucket].list);
- dev->objectBucket[bucket].count++;
--
- }
-
--yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device * dev, __u32 number)
-+yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev, __u32 number)
- {
- int bucket = yaffs_HashFunction(number);
-- struct list_head *i;
-+ struct ylist_head *i;
- yaffs_Object *in;
-
-- list_for_each(i, &dev->objectBucket[bucket].list) {
-+ ylist_for_each(i, &dev->objectBucket[bucket].list) {
- /* Look if it is in the list */
- if (i) {
-- in = list_entry(i, yaffs_Object, hashLink);
-+ in = ylist_entry(i, yaffs_Object, hashLink);
- if (in->objectId == number) {
- #ifdef __KERNEL__
- /* Don't tell the VFS about this one if it is defered free */
-@@ -2118,31 +2155,27 @@ yaffs_Object *yaffs_FindObjectByNumber(y
- return NULL;
- }
-
--yaffs_Object *yaffs_CreateNewObject(yaffs_Device * dev, int number,
-+yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number,
- yaffs_ObjectType type)
- {
--
- yaffs_Object *theObject;
-- yaffs_Tnode *tn;
-+ yaffs_Tnode *tn = NULL;
-
-- if (number < 0) {
-+ if (number < 0)
- number = yaffs_CreateNewObjectNumber(dev);
-- }
-
- theObject = yaffs_AllocateEmptyObject(dev);
-- if(!theObject)
-+ if (!theObject)
- return NULL;
-
-- if(type == YAFFS_OBJECT_TYPE_FILE){
-+ if (type == YAFFS_OBJECT_TYPE_FILE) {
- tn = yaffs_GetTnode(dev);
-- if(!tn){
-+ if (!tn) {
- yaffs_FreeObject(theObject);
- return NULL;
- }
- }
-
--
--
- if (theObject) {
- theObject->fake = 0;
- theObject->renameAllowed = 1;
-@@ -2171,8 +2204,8 @@ yaffs_Object *yaffs_CreateNewObject(yaff
- theObject->variant.fileVariant.top = tn;
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-- INIT_LIST_HEAD(&theObject->variant.directoryVariant.
-- children);
-+ YINIT_LIST_HEAD(&theObject->variant.directoryVariant.
-+ children);
- break;
- case YAFFS_OBJECT_TYPE_SYMLINK:
- case YAFFS_OBJECT_TYPE_HARDLINK:
-@@ -2188,32 +2221,30 @@ yaffs_Object *yaffs_CreateNewObject(yaff
- return theObject;
- }
-
--static yaffs_Object *yaffs_FindOrCreateObjectByNumber(yaffs_Device * dev,
-+static yaffs_Object *yaffs_FindOrCreateObjectByNumber(yaffs_Device *dev,
- int number,
- yaffs_ObjectType type)
- {
- yaffs_Object *theObject = NULL;
-
-- if (number > 0) {
-+ if (number > 0)
- theObject = yaffs_FindObjectByNumber(dev, number);
-- }
-
-- if (!theObject) {
-+ if (!theObject)
- theObject = yaffs_CreateNewObject(dev, number, type);
-- }
-
- return theObject;
-
- }
-
-
--static YCHAR *yaffs_CloneString(const YCHAR * str)
-+static YCHAR *yaffs_CloneString(const YCHAR *str)
- {
- YCHAR *newStr = NULL;
-
- if (str && *str) {
- newStr = YMALLOC((yaffs_strlen(str) + 1) * sizeof(YCHAR));
-- if(newStr)
-+ if (newStr)
- yaffs_strcpy(newStr, str);
- }
-
-@@ -2229,29 +2260,31 @@ static YCHAR *yaffs_CloneString(const YC
- */
-
- static yaffs_Object *yaffs_MknodObject(yaffs_ObjectType type,
-- yaffs_Object * parent,
-- const YCHAR * name,
-+ yaffs_Object *parent,
-+ const YCHAR *name,
- __u32 mode,
- __u32 uid,
- __u32 gid,
-- yaffs_Object * equivalentObject,
-- const YCHAR * aliasString, __u32 rdev)
-+ yaffs_Object *equivalentObject,
-+ const YCHAR *aliasString, __u32 rdev)
- {
- yaffs_Object *in;
-- YCHAR *str;
-+ YCHAR *str = NULL;
-
- yaffs_Device *dev = parent->myDev;
-
- /* Check if the entry exists. If it does then fail the call since we don't want a dup.*/
-- if (yaffs_FindObjectByName(parent, name)) {
-+ if (yaffs_FindObjectByName(parent, name))
- return NULL;
-- }
-
- in = yaffs_CreateNewObject(dev, -1, type);
-
-- if(type == YAFFS_OBJECT_TYPE_SYMLINK){
-+ if (!in)
-+ return YAFFS_FAIL;
-+
-+ if (type == YAFFS_OBJECT_TYPE_SYMLINK) {
- str = yaffs_CloneString(aliasString);
-- if(!str){
-+ if (!str) {
- yaffs_FreeObject(in);
- return NULL;
- }
-@@ -2260,7 +2293,7 @@ static yaffs_Object *yaffs_MknodObject(y
-
-
- if (in) {
-- in->chunkId = -1;
-+ in->hdrChunk = 0;
- in->valid = 1;
- in->variantType = type;
-
-@@ -2293,10 +2326,10 @@ static yaffs_Object *yaffs_MknodObject(y
- break;
- case YAFFS_OBJECT_TYPE_HARDLINK:
- in->variant.hardLinkVariant.equivalentObject =
-- equivalentObject;
-+ equivalentObject;
- in->variant.hardLinkVariant.equivalentObjectId =
-- equivalentObject->objectId;
-- list_add(&in->hardLinks, &equivalentObject->hardLinks);
-+ equivalentObject->objectId;
-+ ylist_add(&in->hardLinks, &equivalentObject->hardLinks);
- break;
- case YAFFS_OBJECT_TYPE_FILE:
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-@@ -2308,7 +2341,7 @@ static yaffs_Object *yaffs_MknodObject(y
-
- if (yaffs_UpdateObjectHeader(in, name, 0, 0, 0) < 0) {
- /* Could not create the object header, fail the creation */
-- yaffs_DestroyObject(in);
-+ yaffs_DeleteObject(in);
- in = NULL;
- }
-
-@@ -2317,38 +2350,38 @@ static yaffs_Object *yaffs_MknodObject(y
- return in;
- }
-
--yaffs_Object *yaffs_MknodFile(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid)
-+yaffs_Object *yaffs_MknodFile(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid)
- {
- return yaffs_MknodObject(YAFFS_OBJECT_TYPE_FILE, parent, name, mode,
-- uid, gid, NULL, NULL, 0);
-+ uid, gid, NULL, NULL, 0);
- }
-
--yaffs_Object *yaffs_MknodDirectory(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid)
-+yaffs_Object *yaffs_MknodDirectory(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid)
- {
- return yaffs_MknodObject(YAFFS_OBJECT_TYPE_DIRECTORY, parent, name,
- mode, uid, gid, NULL, NULL, 0);
- }
-
--yaffs_Object *yaffs_MknodSpecial(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid, __u32 rdev)
-+yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid, __u32 rdev)
- {
- return yaffs_MknodObject(YAFFS_OBJECT_TYPE_SPECIAL, parent, name, mode,
- uid, gid, NULL, NULL, rdev);
- }
-
--yaffs_Object *yaffs_MknodSymLink(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid,
-- const YCHAR * alias)
-+yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid,
-+ const YCHAR *alias)
- {
- return yaffs_MknodObject(YAFFS_OBJECT_TYPE_SYMLINK, parent, name, mode,
-- uid, gid, NULL, alias, 0);
-+ uid, gid, NULL, alias, 0);
- }
-
- /* yaffs_Link returns the object id of the equivalent object.*/
--yaffs_Object *yaffs_Link(yaffs_Object * parent, const YCHAR * name,
-- yaffs_Object * equivalentObject)
-+yaffs_Object *yaffs_Link(yaffs_Object *parent, const YCHAR *name,
-+ yaffs_Object *equivalentObject)
- {
- /* Get the real object in case we were fed a hard link as an equivalent object */
- equivalentObject = yaffs_GetEquivalentObject(equivalentObject);
-@@ -2363,33 +2396,31 @@ yaffs_Object *yaffs_Link(yaffs_Object *
-
- }
-
--static int yaffs_ChangeObjectName(yaffs_Object * obj, yaffs_Object * newDir,
-- const YCHAR * newName, int force, int shadows)
-+static int yaffs_ChangeObjectName(yaffs_Object *obj, yaffs_Object *newDir,
-+ const YCHAR *newName, int force, int shadows)
- {
- int unlinkOp;
- int deleteOp;
-
- yaffs_Object *existingTarget;
-
-- if (newDir == NULL) {
-+ if (newDir == NULL)
- newDir = obj->parent; /* use the old directory */
-- }
-
- if (newDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
-- ("tragendy: yaffs_ChangeObjectName: newDir is not a directory"
-+ ("tragedy: yaffs_ChangeObjectName: newDir is not a directory"
- TENDSTR)));
- YBUG();
- }
-
- /* TODO: Do we need this different handling for YAFFS2 and YAFFS1?? */
-- if (obj->myDev->isYaffs2) {
-+ if (obj->myDev->isYaffs2)
- unlinkOp = (newDir == obj->myDev->unlinkedDir);
-- } else {
-+ else
- unlinkOp = (newDir == obj->myDev->unlinkedDir
- && obj->variantType == YAFFS_OBJECT_TYPE_FILE);
-- }
-
- deleteOp = (newDir == obj->myDev->deletedDir);
-
-@@ -2415,40 +2446,40 @@ static int yaffs_ChangeObjectName(yaffs_
- obj->unlinked = 1;
-
- /* If it is a deletion then we mark it as a shrink for gc purposes. */
-- if (yaffs_UpdateObjectHeader(obj, newName, 0, deleteOp, shadows)>= 0)
-+ if (yaffs_UpdateObjectHeader(obj, newName, 0, deleteOp, shadows) >= 0)
- return YAFFS_OK;
- }
-
- return YAFFS_FAIL;
- }
-
--int yaffs_RenameObject(yaffs_Object * oldDir, const YCHAR * oldName,
-- yaffs_Object * newDir, const YCHAR * newName)
-+int yaffs_RenameObject(yaffs_Object *oldDir, const YCHAR *oldName,
-+ yaffs_Object *newDir, const YCHAR *newName)
- {
-- yaffs_Object *obj;
-- yaffs_Object *existingTarget;
-+ yaffs_Object *obj = NULL;
-+ yaffs_Object *existingTarget = NULL;
- int force = 0;
-
-+
-+ if (!oldDir || oldDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY)
-+ YBUG();
-+ if (!newDir || newDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY)
-+ YBUG();
-+
- #ifdef CONFIG_YAFFS_CASE_INSENSITIVE
- /* Special case for case insemsitive systems (eg. WinCE).
- * While look-up is case insensitive, the name isn't.
- * Therefore we might want to change x.txt to X.txt
- */
-- if (oldDir == newDir && yaffs_strcmp(oldName, newName) == 0) {
-+ if (oldDir == newDir && yaffs_strcmp(oldName, newName) == 0)
- force = 1;
-- }
- #endif
-
-+ else if (yaffs_strlen(newName) > YAFFS_MAX_NAME_LENGTH)
-+ /* ENAMETOOLONG */
-+ return YAFFS_FAIL;
-+
- obj = yaffs_FindObjectByName(oldDir, oldName);
-- /* Check new name to long. */
-- if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK &&
-- yaffs_strlen(newName) > YAFFS_MAX_ALIAS_LENGTH)
-- /* ENAMETOOLONG */
-- return YAFFS_FAIL;
-- else if (obj->variantType != YAFFS_OBJECT_TYPE_SYMLINK &&
-- yaffs_strlen(newName) > YAFFS_MAX_NAME_LENGTH)
-- /* ENAMETOOLONG */
-- return YAFFS_FAIL;
-
- if (obj && obj->renameAllowed) {
-
-@@ -2456,8 +2487,8 @@ int yaffs_RenameObject(yaffs_Object * ol
-
- existingTarget = yaffs_FindObjectByName(newDir, newName);
- if (existingTarget &&
-- existingTarget->variantType == YAFFS_OBJECT_TYPE_DIRECTORY &&
-- !list_empty(&existingTarget->variant.directoryVariant.children)) {
-+ existingTarget->variantType == YAFFS_OBJECT_TYPE_DIRECTORY &&
-+ !ylist_empty(&existingTarget->variant.directoryVariant.children)) {
- /* There is a target that is a non-empty directory, so we fail */
- return YAFFS_FAIL; /* EEXIST or ENOTEMPTY */
- } else if (existingTarget && existingTarget != obj) {
-@@ -2465,7 +2496,7 @@ int yaffs_RenameObject(yaffs_Object * ol
- * but only if it isn't the same object
- */
- yaffs_ChangeObjectName(obj, newDir, newName, force,
-- existingTarget->objectId);
-+ existingTarget->objectId);
- yaffs_UnlinkObject(existingTarget);
- }
-
-@@ -2476,7 +2507,7 @@ int yaffs_RenameObject(yaffs_Object * ol
-
- /*------------------------- Block Management and Page Allocation ----------------*/
-
--static int yaffs_InitialiseBlocks(yaffs_Device * dev)
-+static int yaffs_InitialiseBlocks(yaffs_Device *dev)
- {
- int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1;
-
-@@ -2487,23 +2518,20 @@ static int yaffs_InitialiseBlocks(yaffs_
-
- /* If the first allocation strategy fails, thry the alternate one */
- dev->blockInfo = YMALLOC(nBlocks * sizeof(yaffs_BlockInfo));
-- if(!dev->blockInfo){
-+ if (!dev->blockInfo) {
- dev->blockInfo = YMALLOC_ALT(nBlocks * sizeof(yaffs_BlockInfo));
- dev->blockInfoAlt = 1;
-- }
-- else
-+ } else
- dev->blockInfoAlt = 0;
-
-- if(dev->blockInfo){
--
-+ if (dev->blockInfo) {
- /* Set up dynamic blockinfo stuff. */
- dev->chunkBitmapStride = (dev->nChunksPerBlock + 7) / 8; /* round up bytes */
- dev->chunkBits = YMALLOC(dev->chunkBitmapStride * nBlocks);
-- if(!dev->chunkBits){
-+ if (!dev->chunkBits) {
- dev->chunkBits = YMALLOC_ALT(dev->chunkBitmapStride * nBlocks);
- dev->chunkBitsAlt = 1;
-- }
-- else
-+ } else
- dev->chunkBitsAlt = 0;
- }
-
-@@ -2514,30 +2542,29 @@ static int yaffs_InitialiseBlocks(yaffs_
- }
-
- return YAFFS_FAIL;
--
- }
-
--static void yaffs_DeinitialiseBlocks(yaffs_Device * dev)
-+static void yaffs_DeinitialiseBlocks(yaffs_Device *dev)
- {
-- if(dev->blockInfoAlt && dev->blockInfo)
-+ if (dev->blockInfoAlt && dev->blockInfo)
- YFREE_ALT(dev->blockInfo);
-- else if(dev->blockInfo)
-+ else if (dev->blockInfo)
- YFREE(dev->blockInfo);
-
- dev->blockInfoAlt = 0;
-
- dev->blockInfo = NULL;
-
-- if(dev->chunkBitsAlt && dev->chunkBits)
-+ if (dev->chunkBitsAlt && dev->chunkBits)
- YFREE_ALT(dev->chunkBits);
-- else if(dev->chunkBits)
-+ else if (dev->chunkBits)
- YFREE(dev->chunkBits);
- dev->chunkBitsAlt = 0;
- dev->chunkBits = NULL;
- }
-
--static int yaffs_BlockNotDisqualifiedFromGC(yaffs_Device * dev,
-- yaffs_BlockInfo * bi)
-+static int yaffs_BlockNotDisqualifiedFromGC(yaffs_Device *dev,
-+ yaffs_BlockInfo *bi)
- {
- int i;
- __u32 seq;
-@@ -2556,7 +2583,7 @@ static int yaffs_BlockNotDisqualifiedFro
- seq = dev->sequenceNumber;
-
- for (i = dev->internalStartBlock; i <= dev->internalEndBlock;
-- i++) {
-+ i++) {
- b = yaffs_GetBlockInfo(dev, i);
- if (b->blockState == YAFFS_BLOCK_STATE_FULL &&
- (b->pagesInUse - b->softDeletions) <
-@@ -2571,38 +2598,36 @@ static int yaffs_BlockNotDisqualifiedFro
- * discarded pages.
- */
- return (bi->sequenceNumber <= dev->oldestDirtySequence);
--
- }
-
- /* FindDiretiestBlock is used to select the dirtiest block (or close enough)
- * for garbage collection.
- */
-
--static int yaffs_FindBlockForGarbageCollection(yaffs_Device * dev,
-- int aggressive)
-+static int yaffs_FindBlockForGarbageCollection(yaffs_Device *dev,
-+ int aggressive)
- {
--
- int b = dev->currentDirtyChecker;
-
- int i;
- int iterations;
- int dirtiest = -1;
- int pagesInUse = 0;
-- int prioritised=0;
-+ int prioritised = 0;
- yaffs_BlockInfo *bi;
- int pendingPrioritisedExist = 0;
-
- /* First let's see if we need to grab a prioritised block */
-- if(dev->hasPendingPrioritisedGCs){
-- for(i = dev->internalStartBlock; i < dev->internalEndBlock && !prioritised; i++){
-+ if (dev->hasPendingPrioritisedGCs) {
-+ for (i = dev->internalStartBlock; i < dev->internalEndBlock && !prioritised; i++) {
-
- bi = yaffs_GetBlockInfo(dev, i);
-- //yaffs_VerifyBlock(dev,bi,i);
-+ /* yaffs_VerifyBlock(dev,bi,i); */
-
-- if(bi->gcPrioritise) {
-+ if (bi->gcPrioritise) {
- pendingPrioritisedExist = 1;
-- if(bi->blockState == YAFFS_BLOCK_STATE_FULL &&
-- yaffs_BlockNotDisqualifiedFromGC(dev, bi)){
-+ if (bi->blockState == YAFFS_BLOCK_STATE_FULL &&
-+ yaffs_BlockNotDisqualifiedFromGC(dev, bi)) {
- pagesInUse = (bi->pagesInUse - bi->softDeletions);
- dirtiest = i;
- prioritised = 1;
-@@ -2611,7 +2636,7 @@ static int yaffs_FindBlockForGarbageColl
- }
- }
-
-- if(!pendingPrioritisedExist) /* None found, so we can clear this */
-+ if (!pendingPrioritisedExist) /* None found, so we can clear this */
- dev->hasPendingPrioritisedGCs = 0;
- }
-
-@@ -2623,31 +2648,28 @@ static int yaffs_FindBlockForGarbageColl
-
- dev->nonAggressiveSkip--;
-
-- if (!aggressive && (dev->nonAggressiveSkip > 0)) {
-+ if (!aggressive && (dev->nonAggressiveSkip > 0))
- return -1;
-- }
-
-- if(!prioritised)
-+ if (!prioritised)
- pagesInUse =
-- (aggressive) ? dev->nChunksPerBlock : YAFFS_PASSIVE_GC_CHUNKS + 1;
-+ (aggressive) ? dev->nChunksPerBlock : YAFFS_PASSIVE_GC_CHUNKS + 1;
-
-- if (aggressive) {
-+ if (aggressive)
- iterations =
- dev->internalEndBlock - dev->internalStartBlock + 1;
-- } else {
-+ else {
- iterations =
- dev->internalEndBlock - dev->internalStartBlock + 1;
- iterations = iterations / 16;
-- if (iterations > 200) {
-+ if (iterations > 200)
- iterations = 200;
-- }
- }
-
- for (i = 0; i <= iterations && pagesInUse > 0 && !prioritised; i++) {
- b++;
-- if (b < dev->internalStartBlock || b > dev->internalEndBlock) {
-+ if (b < dev->internalStartBlock || b > dev->internalEndBlock)
- b = dev->internalStartBlock;
-- }
-
- if (b < dev->internalStartBlock || b > dev->internalEndBlock) {
- T(YAFFS_TRACE_ERROR,
-@@ -2657,17 +2679,9 @@ static int yaffs_FindBlockForGarbageColl
-
- bi = yaffs_GetBlockInfo(dev, b);
-
--#if 0
-- if (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT) {
-- dirtiest = b;
-- pagesInUse = 0;
-- }
-- else
--#endif
--
- if (bi->blockState == YAFFS_BLOCK_STATE_FULL &&
-- (bi->pagesInUse - bi->softDeletions) < pagesInUse &&
-- yaffs_BlockNotDisqualifiedFromGC(dev, bi)) {
-+ (bi->pagesInUse - bi->softDeletions) < pagesInUse &&
-+ yaffs_BlockNotDisqualifiedFromGC(dev, bi)) {
- dirtiest = b;
- pagesInUse = (bi->pagesInUse - bi->softDeletions);
- }
-@@ -2678,19 +2692,18 @@ static int yaffs_FindBlockForGarbageColl
- if (dirtiest > 0) {
- T(YAFFS_TRACE_GC,
- (TSTR("GC Selected block %d with %d free, prioritised:%d" TENDSTR), dirtiest,
-- dev->nChunksPerBlock - pagesInUse,prioritised));
-+ dev->nChunksPerBlock - pagesInUse, prioritised));
- }
-
- dev->oldestDirtySequence = 0;
-
-- if (dirtiest > 0) {
-+ if (dirtiest > 0)
- dev->nonAggressiveSkip = 4;
-- }
-
- return dirtiest;
- }
-
--static void yaffs_BlockBecameDirty(yaffs_Device * dev, int blockNo)
-+static void yaffs_BlockBecameDirty(yaffs_Device *dev, int blockNo)
- {
- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockNo);
-
-@@ -2752,7 +2765,7 @@ static void yaffs_BlockBecameDirty(yaffs
- }
- }
-
--static int yaffs_FindBlockForAllocation(yaffs_Device * dev)
-+static int yaffs_FindBlockForAllocation(yaffs_Device *dev)
- {
- int i;
-
-@@ -2763,7 +2776,7 @@ static int yaffs_FindBlockForAllocation(
- * Can't get space to gc
- */
- T(YAFFS_TRACE_ERROR,
-- (TSTR("yaffs tragedy: no more eraased blocks" TENDSTR)));
-+ (TSTR("yaffs tragedy: no more erased blocks" TENDSTR)));
-
- return -1;
- }
-@@ -2794,31 +2807,74 @@ static int yaffs_FindBlockForAllocation(
-
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
-- ("yaffs tragedy: no more eraased blocks, but there should have been %d"
-+ ("yaffs tragedy: no more erased blocks, but there should have been %d"
- TENDSTR), dev->nErasedBlocks));
-
- return -1;
- }
-
-
--// Check if there's space to allocate...
--// Thinks.... do we need top make this ths same as yaffs_GetFreeChunks()?
--static int yaffs_CheckSpaceForAllocation(yaffs_Device * dev)
-+
-+static int yaffs_CalcCheckpointBlocksRequired(yaffs_Device *dev)
-+{
-+ if (!dev->nCheckpointBlocksRequired &&
-+ dev->isYaffs2) {
-+ /* Not a valid value so recalculate */
-+ int nBytes = 0;
-+ int nBlocks;
-+ int devBlocks = (dev->endBlock - dev->startBlock + 1);
-+ int tnodeSize;
-+
-+ tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-+
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-+
-+ nBytes += sizeof(yaffs_CheckpointValidity);
-+ nBytes += sizeof(yaffs_CheckpointDevice);
-+ nBytes += devBlocks * sizeof(yaffs_BlockInfo);
-+ nBytes += devBlocks * dev->chunkBitmapStride;
-+ nBytes += (sizeof(yaffs_CheckpointObject) + sizeof(__u32)) * (dev->nObjectsCreated - dev->nFreeObjects);
-+ nBytes += (tnodeSize + sizeof(__u32)) * (dev->nTnodesCreated - dev->nFreeTnodes);
-+ nBytes += sizeof(yaffs_CheckpointValidity);
-+ nBytes += sizeof(__u32); /* checksum*/
-+
-+ /* Round up and add 2 blocks to allow for some bad blocks, so add 3 */
-+
-+ nBlocks = (nBytes/(dev->nDataBytesPerChunk * dev->nChunksPerBlock)) + 3;
-+
-+ dev->nCheckpointBlocksRequired = nBlocks;
-+ }
-+
-+ return dev->nCheckpointBlocksRequired;
-+}
-+
-+/*
-+ * Check if there's space to allocate...
-+ * Thinks.... do we need top make this ths same as yaffs_GetFreeChunks()?
-+ */
-+static int yaffs_CheckSpaceForAllocation(yaffs_Device *dev)
- {
- int reservedChunks;
- int reservedBlocks = dev->nReservedBlocks;
- int checkpointBlocks;
-
-- checkpointBlocks = dev->nCheckpointReservedBlocks - dev->blocksInCheckpoint;
-- if(checkpointBlocks < 0)
-+ if (dev->isYaffs2) {
-+ checkpointBlocks = yaffs_CalcCheckpointBlocksRequired(dev) -
-+ dev->blocksInCheckpoint;
-+ if (checkpointBlocks < 0)
-+ checkpointBlocks = 0;
-+ } else {
- checkpointBlocks = 0;
-+ }
-
- reservedChunks = ((reservedBlocks + checkpointBlocks) * dev->nChunksPerBlock);
-
- return (dev->nFreeChunks > reservedChunks);
- }
-
--static int yaffs_AllocateChunk(yaffs_Device * dev, int useReserve, yaffs_BlockInfo **blockUsedPtr)
-+static int yaffs_AllocateChunk(yaffs_Device *dev, int useReserve,
-+ yaffs_BlockInfo **blockUsedPtr)
- {
- int retVal;
- yaffs_BlockInfo *bi;
-@@ -2835,7 +2891,7 @@ static int yaffs_AllocateChunk(yaffs_Dev
- }
-
- if (dev->nErasedBlocks < dev->nReservedBlocks
-- && dev->allocationPage == 0) {
-+ && dev->allocationPage == 0) {
- T(YAFFS_TRACE_ALLOCATE, (TSTR("Allocating reserve" TENDSTR)));
- }
-
-@@ -2844,10 +2900,10 @@ static int yaffs_AllocateChunk(yaffs_Dev
- bi = yaffs_GetBlockInfo(dev, dev->allocationBlock);
-
- retVal = (dev->allocationBlock * dev->nChunksPerBlock) +
-- dev->allocationPage;
-+ dev->allocationPage;
- bi->pagesInUse++;
- yaffs_SetChunkBit(dev, dev->allocationBlock,
-- dev->allocationPage);
-+ dev->allocationPage);
-
- dev->allocationPage++;
-
-@@ -2859,43 +2915,43 @@ static int yaffs_AllocateChunk(yaffs_Dev
- dev->allocationBlock = -1;
- }
-
-- if(blockUsedPtr)
-+ if (blockUsedPtr)
- *blockUsedPtr = bi;
-
- return retVal;
- }
-
- T(YAFFS_TRACE_ERROR,
-- (TSTR("!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!" TENDSTR)));
-+ (TSTR("!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!" TENDSTR)));
-
- return -1;
- }
-
--static int yaffs_GetErasedChunks(yaffs_Device * dev)
-+static int yaffs_GetErasedChunks(yaffs_Device *dev)
- {
- int n;
-
- n = dev->nErasedBlocks * dev->nChunksPerBlock;
-
-- if (dev->allocationBlock > 0) {
-+ if (dev->allocationBlock > 0)
- n += (dev->nChunksPerBlock - dev->allocationPage);
-- }
-
- return n;
-
- }
-
--static int yaffs_GarbageCollectBlock(yaffs_Device * dev, int block)
-+static int yaffs_GarbageCollectBlock(yaffs_Device *dev, int block,
-+ int wholeBlock)
- {
- int oldChunk;
- int newChunk;
-- int chunkInBlock;
- int markNAND;
- int retVal = YAFFS_OK;
- int cleanups = 0;
- int i;
- int isCheckpointBlock;
- int matchingChunk;
-+ int maxCopies;
-
- int chunksBefore = yaffs_GetErasedChunks(dev);
- int chunksAfter;
-@@ -2911,8 +2967,11 @@ static int yaffs_GarbageCollectBlock(yaf
- bi->blockState = YAFFS_BLOCK_STATE_COLLECTING;
-
- T(YAFFS_TRACE_TRACING,
-- (TSTR("Collecting block %d, in use %d, shrink %d, " TENDSTR), block,
-- bi->pagesInUse, bi->hasShrinkHeader));
-+ (TSTR("Collecting block %d, in use %d, shrink %d, wholeBlock %d" TENDSTR),
-+ block,
-+ bi->pagesInUse,
-+ bi->hasShrinkHeader,
-+ wholeBlock));
-
- /*yaffs_VerifyFreeChunks(dev); */
-
-@@ -2926,26 +2985,33 @@ static int yaffs_GarbageCollectBlock(yaf
- dev->isDoingGC = 1;
-
- if (isCheckpointBlock ||
-- !yaffs_StillSomeChunkBits(dev, block)) {
-+ !yaffs_StillSomeChunkBits(dev, block)) {
- T(YAFFS_TRACE_TRACING,
-- (TSTR
-- ("Collecting block %d that has no chunks in use" TENDSTR),
-- block));
-+ (TSTR
-+ ("Collecting block %d that has no chunks in use" TENDSTR),
-+ block));
- yaffs_BlockBecameDirty(dev, block);
- } else {
-
- __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__);
-
-- yaffs_VerifyBlock(dev,bi,block);
-+ yaffs_VerifyBlock(dev, bi, block);
-
-- for (chunkInBlock = 0, oldChunk = block * dev->nChunksPerBlock;
-- chunkInBlock < dev->nChunksPerBlock
-- && yaffs_StillSomeChunkBits(dev, block);
-- chunkInBlock++, oldChunk++) {
-- if (yaffs_CheckChunkBit(dev, block, chunkInBlock)) {
-+ maxCopies = (wholeBlock) ? dev->nChunksPerBlock : 10;
-+ oldChunk = block * dev->nChunksPerBlock + dev->gcChunk;
-+
-+ for (/* init already done */;
-+ retVal == YAFFS_OK &&
-+ dev->gcChunk < dev->nChunksPerBlock &&
-+ (bi->blockState == YAFFS_BLOCK_STATE_COLLECTING) &&
-+ maxCopies > 0;
-+ dev->gcChunk++, oldChunk++) {
-+ if (yaffs_CheckChunkBit(dev, block, dev->gcChunk)) {
-
- /* This page is in use and might need to be copied off */
-
-+ maxCopies--;
-+
- markNAND = 1;
-
- yaffs_InitialiseTags(&tags);
-@@ -2959,22 +3025,22 @@ static int yaffs_GarbageCollectBlock(yaf
-
- T(YAFFS_TRACE_GC_DETAIL,
- (TSTR
-- ("Collecting page %d, %d %d %d " TENDSTR),
-- chunkInBlock, tags.objectId, tags.chunkId,
-+ ("Collecting chunk in block %d, %d %d %d " TENDSTR),
-+ dev->gcChunk, tags.objectId, tags.chunkId,
- tags.byteCount));
-
-- if(object && !yaffs_SkipVerification(dev)){
-- if(tags.chunkId == 0)
-- matchingChunk = object->chunkId;
-- else if(object->softDeleted)
-+ if (object && !yaffs_SkipVerification(dev)) {
-+ if (tags.chunkId == 0)
-+ matchingChunk = object->hdrChunk;
-+ else if (object->softDeleted)
- matchingChunk = oldChunk; /* Defeat the test */
- else
-- matchingChunk = yaffs_FindChunkInFile(object,tags.chunkId,NULL);
-+ matchingChunk = yaffs_FindChunkInFile(object, tags.chunkId, NULL);
-
-- if(oldChunk != matchingChunk)
-+ if (oldChunk != matchingChunk)
- T(YAFFS_TRACE_ERROR,
- (TSTR("gc: page in gc mismatch: %d %d %d %d"TENDSTR),
-- oldChunk,matchingChunk,tags.objectId, tags.chunkId));
-+ oldChunk, matchingChunk, tags.objectId, tags.chunkId));
-
- }
-
-@@ -2986,9 +3052,11 @@ static int yaffs_GarbageCollectBlock(yaf
- tags.objectId, tags.chunkId, tags.byteCount));
- }
-
-- if (object && object->deleted
-- && tags.chunkId != 0) {
-- /* Data chunk in a deleted file, throw it away
-+ if (object &&
-+ object->deleted &&
-+ object->softDeleted &&
-+ tags.chunkId != 0) {
-+ /* Data chunk in a soft deleted file, throw it away
- * It's a soft deleted data chunk,
- * No need to copy this, just forget about it and
- * fix up the object.
-@@ -3003,13 +3071,12 @@ static int yaffs_GarbageCollectBlock(yaf
- cleanups++;
- }
- markNAND = 0;
-- } else if (0
-- /* Todo object && object->deleted && object->nDataChunks == 0 */
-- ) {
-+ } else if (0) {
-+ /* Todo object && object->deleted && object->nDataChunks == 0 */
- /* Deleted object header with no data chunks.
- * Can be discarded and the file deleted.
- */
-- object->chunkId = 0;
-+ object->hdrChunk = 0;
- yaffs_FreeTnode(object->myDev,
- object->variant.
- fileVariant.top);
-@@ -3031,17 +3098,14 @@ static int yaffs_GarbageCollectBlock(yaf
- * We need to nuke the shrinkheader flags first
- * We no longer want the shrinkHeader flag since its work is done
- * and if it is left in place it will mess up scanning.
-- * Also, clear out any shadowing stuff
- */
-
- yaffs_ObjectHeader *oh;
- oh = (yaffs_ObjectHeader *)buffer;
- oh->isShrink = 0;
-- oh->shadowsObject = -1;
-- tags.extraShadows = 0;
- tags.extraIsShrinkHeader = 0;
-
-- yaffs_VerifyObjectHeader(object,oh,&tags,1);
-+ yaffs_VerifyObjectHeader(object, oh, &tags, 1);
- }
-
- newChunk =
-@@ -3055,7 +3119,7 @@ static int yaffs_GarbageCollectBlock(yaf
-
- if (tags.chunkId == 0) {
- /* It's a header */
-- object->chunkId = newChunk;
-+ object->hdrChunk = newChunk;
- object->serial = tags.serialNumber;
- } else {
- /* It's a data chunk */
-@@ -3067,7 +3131,8 @@ static int yaffs_GarbageCollectBlock(yaf
- }
- }
-
-- yaffs_DeleteChunk(dev, oldChunk, markNAND, __LINE__);
-+ if (retVal == YAFFS_OK)
-+ yaffs_DeleteChunk(dev, oldChunk, markNAND, __LINE__);
-
- }
- }
-@@ -3098,18 +3163,25 @@ static int yaffs_GarbageCollectBlock(yaf
-
- }
-
-- yaffs_VerifyCollectedBlock(dev,bi,block);
-+ yaffs_VerifyCollectedBlock(dev, bi, block);
-
-- if (chunksBefore >= (chunksAfter = yaffs_GetErasedChunks(dev))) {
-+ chunksAfter = yaffs_GetErasedChunks(dev);
-+ if (chunksBefore >= chunksAfter) {
- T(YAFFS_TRACE_GC,
- (TSTR
- ("gc did not increase free chunks before %d after %d"
- TENDSTR), chunksBefore, chunksAfter));
- }
-
-+ /* If the gc completed then clear the current gcBlock so that we find another. */
-+ if (bi->blockState != YAFFS_BLOCK_STATE_COLLECTING) {
-+ dev->gcBlock = -1;
-+ dev->gcChunk = 0;
-+ }
-+
- dev->isDoingGC = 0;
-
-- return YAFFS_OK;
-+ return retVal;
- }
-
- /* New garbage collector
-@@ -3121,7 +3193,7 @@ static int yaffs_GarbageCollectBlock(yaf
- * The idea is to help clear out space in a more spread-out manner.
- * Dunno if it really does anything useful.
- */
--static int yaffs_CheckGarbageCollection(yaffs_Device * dev)
-+static int yaffs_CheckGarbageCollection(yaffs_Device *dev)
- {
- int block;
- int aggressive;
-@@ -3142,8 +3214,8 @@ static int yaffs_CheckGarbageCollection(
- do {
- maxTries++;
-
-- checkpointBlockAdjust = (dev->nCheckpointReservedBlocks - dev->blocksInCheckpoint);
-- if(checkpointBlockAdjust < 0)
-+ checkpointBlockAdjust = yaffs_CalcCheckpointBlocksRequired(dev) - dev->blocksInCheckpoint;
-+ if (checkpointBlockAdjust < 0)
- checkpointBlockAdjust = 0;
-
- if (dev->nErasedBlocks < (dev->nReservedBlocks + checkpointBlockAdjust + 2)) {
-@@ -3154,20 +3226,24 @@ static int yaffs_CheckGarbageCollection(
- aggressive = 0;
- }
-
-- block = yaffs_FindBlockForGarbageCollection(dev, aggressive);
-+ if (dev->gcBlock <= 0) {
-+ dev->gcBlock = yaffs_FindBlockForGarbageCollection(dev, aggressive);
-+ dev->gcChunk = 0;
-+ }
-+
-+ block = dev->gcBlock;
-
- if (block > 0) {
- dev->garbageCollections++;
-- if (!aggressive) {
-+ if (!aggressive)
- dev->passiveGarbageCollections++;
-- }
-
- T(YAFFS_TRACE_GC,
- (TSTR
- ("yaffs: GC erasedBlocks %d aggressive %d" TENDSTR),
- dev->nErasedBlocks, aggressive));
-
-- gcOk = yaffs_GarbageCollectBlock(dev, block);
-+ gcOk = yaffs_GarbageCollectBlock(dev, block, aggressive);
- }
-
- if (dev->nErasedBlocks < (dev->nReservedBlocks) && block > 0) {
-@@ -3176,15 +3252,16 @@ static int yaffs_CheckGarbageCollection(
- ("yaffs: GC !!!no reclaim!!! erasedBlocks %d after try %d block %d"
- TENDSTR), dev->nErasedBlocks, maxTries, block));
- }
-- } while ((dev->nErasedBlocks < dev->nReservedBlocks) && (block > 0)
-- && (maxTries < 2));
-+ } while ((dev->nErasedBlocks < dev->nReservedBlocks) &&
-+ (block > 0) &&
-+ (maxTries < 2));
-
- return aggressive ? gcOk : YAFFS_OK;
- }
-
- /*------------------------- TAGS --------------------------------*/
-
--static int yaffs_TagsMatch(const yaffs_ExtendedTags * tags, int objectId,
-+static int yaffs_TagsMatch(const yaffs_ExtendedTags *tags, int objectId,
- int chunkInObject)
- {
- return (tags->chunkId == chunkInObject &&
-@@ -3195,8 +3272,8 @@ static int yaffs_TagsMatch(const yaffs_E
-
- /*-------------------- Data file manipulation -----------------*/
-
--static int yaffs_FindChunkInFile(yaffs_Object * in, int chunkInInode,
-- yaffs_ExtendedTags * tags)
-+static int yaffs_FindChunkInFile(yaffs_Object *in, int chunkInInode,
-+ yaffs_ExtendedTags *tags)
- {
- /*Get the Tnode, then get the level 0 offset chunk offset */
- yaffs_Tnode *tn;
-@@ -3214,7 +3291,7 @@ static int yaffs_FindChunkInFile(yaffs_O
- tn = yaffs_FindLevel0Tnode(dev, &in->variant.fileVariant, chunkInInode);
-
- if (tn) {
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,chunkInInode);
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode);
-
- retVal =
- yaffs_FindChunkInGroup(dev, theChunk, tags, in->objectId,
-@@ -3223,8 +3300,8 @@ static int yaffs_FindChunkInFile(yaffs_O
- return retVal;
- }
-
--static int yaffs_FindAndDeleteChunkInFile(yaffs_Object * in, int chunkInInode,
-- yaffs_ExtendedTags * tags)
-+static int yaffs_FindAndDeleteChunkInFile(yaffs_Object *in, int chunkInInode,
-+ yaffs_ExtendedTags *tags)
- {
- /* Get the Tnode, then get the level 0 offset chunk offset */
- yaffs_Tnode *tn;
-@@ -3243,29 +3320,23 @@ static int yaffs_FindAndDeleteChunkInFil
-
- if (tn) {
-
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,chunkInInode);
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode);
-
- retVal =
- yaffs_FindChunkInGroup(dev, theChunk, tags, in->objectId,
- chunkInInode);
-
- /* Delete the entry in the filestructure (if found) */
-- if (retVal != -1) {
-- yaffs_PutLevel0Tnode(dev,tn,chunkInInode,0);
-- }
-- } else {
-- /*T(("No level 0 found for %d\n", chunkInInode)); */
-+ if (retVal != -1)
-+ yaffs_PutLevel0Tnode(dev, tn, chunkInInode, 0);
- }
-
-- if (retVal == -1) {
-- /* T(("Could not find %d to delete\n",chunkInInode)); */
-- }
- return retVal;
- }
-
- #ifdef YAFFS_PARANOID
-
--static int yaffs_CheckFileSanity(yaffs_Object * in)
-+static int yaffs_CheckFileSanity(yaffs_Object *in)
- {
- int chunk;
- int nChunks;
-@@ -3278,10 +3349,8 @@ static int yaffs_CheckFileSanity(yaffs_O
- int theChunk;
- int chunkDeleted;
-
-- if (in->variantType != YAFFS_OBJECT_TYPE_FILE) {
-- /* T(("Object not a file\n")); */
-+ if (in->variantType != YAFFS_OBJECT_TYPE_FILE)
- return YAFFS_FAIL;
-- }
-
- objId = in->objectId;
- fSize = in->variant.fileVariant.fileSize;
-@@ -3294,7 +3363,7 @@ static int yaffs_CheckFileSanity(yaffs_O
-
- if (tn) {
-
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,chunk);
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunk);
-
- if (yaffs_CheckChunkBits
- (dev, theChunk / dev->nChunksPerBlock,
-@@ -3323,7 +3392,7 @@ static int yaffs_CheckFileSanity(yaffs_O
-
- #endif
-
--static int yaffs_PutChunkIntoFile(yaffs_Object * in, int chunkInInode,
-+static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode,
- int chunkInNAND, int inScan)
- {
- /* NB inScan is zero unless scanning.
-@@ -3358,11 +3427,10 @@ static int yaffs_PutChunkIntoFile(yaffs_
- &in->variant.fileVariant,
- chunkInInode,
- NULL);
-- if (!tn) {
-+ if (!tn)
- return YAFFS_FAIL;
-- }
-
-- existingChunk = yaffs_GetChunkGroupBase(dev,tn,chunkInInode);
-+ existingChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode);
-
- if (inScan != 0) {
- /* If we're scanning then we need to test for duplicates
-@@ -3374,7 +3442,7 @@ static int yaffs_PutChunkIntoFile(yaffs_
- * Update: For backward scanning we don't need to re-read tags so this is quite cheap.
- */
-
-- if (existingChunk != 0) {
-+ if (existingChunk > 0) {
- /* NB Right now existing chunk will not be real chunkId if the device >= 32MB
- * thus we have to do a FindChunkInFile to get the real chunk id.
- *
-@@ -3411,8 +3479,10 @@ static int yaffs_PutChunkIntoFile(yaffs_
- * not be loaded during a scan
- */
-
-- newSerial = newTags.serialNumber;
-- existingSerial = existingTags.serialNumber;
-+ if (inScan > 0) {
-+ newSerial = newTags.serialNumber;
-+ existingSerial = existingTags.serialNumber;
-+ }
-
- if ((inScan > 0) &&
- (in->myDev->isYaffs2 ||
-@@ -3437,24 +3507,23 @@ static int yaffs_PutChunkIntoFile(yaffs_
-
- }
-
-- if (existingChunk == 0) {
-+ if (existingChunk == 0)
- in->nDataChunks++;
-- }
-
-- yaffs_PutLevel0Tnode(dev,tn,chunkInInode,chunkInNAND);
-+ yaffs_PutLevel0Tnode(dev, tn, chunkInInode, chunkInNAND);
-
- return YAFFS_OK;
- }
-
--static int yaffs_ReadChunkDataFromObject(yaffs_Object * in, int chunkInInode,
-- __u8 * buffer)
-+static int yaffs_ReadChunkDataFromObject(yaffs_Object *in, int chunkInInode,
-+ __u8 *buffer)
- {
- int chunkInNAND = yaffs_FindChunkInFile(in, chunkInInode, NULL);
-
-- if (chunkInNAND >= 0) {
-+ if (chunkInNAND >= 0)
- return yaffs_ReadChunkWithTagsFromNAND(in->myDev, chunkInNAND,
-- buffer,NULL);
-- } else {
-+ buffer, NULL);
-+ else {
- T(YAFFS_TRACE_NANDACCESS,
- (TSTR("Chunk %d not found zero instead" TENDSTR),
- chunkInNAND));
-@@ -3465,7 +3534,7 @@ static int yaffs_ReadChunkDataFromObject
-
- }
-
--void yaffs_DeleteChunk(yaffs_Device * dev, int chunkId, int markNAND, int lyn)
-+void yaffs_DeleteChunk(yaffs_Device *dev, int chunkId, int markNAND, int lyn)
- {
- int block;
- int page;
-@@ -3475,16 +3544,15 @@ void yaffs_DeleteChunk(yaffs_Device * de
- if (chunkId <= 0)
- return;
-
--
- dev->nDeletions++;
- block = chunkId / dev->nChunksPerBlock;
- page = chunkId % dev->nChunksPerBlock;
-
-
-- if(!yaffs_CheckChunkBit(dev,block,page))
-+ if (!yaffs_CheckChunkBit(dev, block, page))
- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Deleting invalid chunk %d"TENDSTR),
-- chunkId));
-+ (TSTR("Deleting invalid chunk %d"TENDSTR),
-+ chunkId));
-
- bi = yaffs_GetBlockInfo(dev, block);
-
-@@ -3524,14 +3592,12 @@ void yaffs_DeleteChunk(yaffs_Device * de
- yaffs_BlockBecameDirty(dev, block);
- }
-
-- } else {
-- /* T(("Bad news deleting chunk %d\n",chunkId)); */
- }
-
- }
-
--static int yaffs_WriteChunkDataToObject(yaffs_Object * in, int chunkInInode,
-- const __u8 * buffer, int nBytes,
-+static int yaffs_WriteChunkDataToObject(yaffs_Object *in, int chunkInInode,
-+ const __u8 *buffer, int nBytes,
- int useReserve)
- {
- /* Find old chunk Need to do this to get serial number
-@@ -3561,6 +3627,12 @@ static int yaffs_WriteChunkDataToObject(
- (prevChunkId >= 0) ? prevTags.serialNumber + 1 : 1;
- newTags.byteCount = nBytes;
-
-+ if (nBytes < 1 || nBytes > dev->totalBytesPerChunk) {
-+ T(YAFFS_TRACE_ERROR,
-+ (TSTR("Writing %d bytes to chunk!!!!!!!!!" TENDSTR), nBytes));
-+ YBUG();
-+ }
-+
- newChunkId =
- yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags,
- useReserve);
-@@ -3568,11 +3640,9 @@ static int yaffs_WriteChunkDataToObject(
- if (newChunkId >= 0) {
- yaffs_PutChunkIntoFile(in, chunkInInode, newChunkId, 0);
-
-- if (prevChunkId >= 0) {
-+ if (prevChunkId >= 0)
- yaffs_DeleteChunk(dev, prevChunkId, 1, __LINE__);
-
-- }
--
- yaffs_CheckFileSanity(in);
- }
- return newChunkId;
-@@ -3582,7 +3652,7 @@ static int yaffs_WriteChunkDataToObject(
- /* UpdateObjectHeader updates the header on NAND for an object.
- * If name is not NULL, then that new name is used.
- */
--int yaffs_UpdateObjectHeader(yaffs_Object * in, const YCHAR * name, int force,
-+int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name, int force,
- int isShrink, int shadows)
- {
-
-@@ -3603,9 +3673,12 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
-
- yaffs_ObjectHeader *oh = NULL;
-
-- yaffs_strcpy(oldName,"silly old name");
-+ yaffs_strcpy(oldName, _Y("silly old name"));
-
-- if (!in->fake || force) {
-+
-+ if (!in->fake ||
-+ in == dev->rootDir || /* The rootDir should also be saved */
-+ force) {
-
- yaffs_CheckGarbageCollection(dev);
- yaffs_CheckObjectDetailsLoaded(in);
-@@ -3613,13 +3686,13 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
- buffer = yaffs_GetTempBuffer(in->myDev, __LINE__);
- oh = (yaffs_ObjectHeader *) buffer;
-
-- prevChunkId = in->chunkId;
-+ prevChunkId = in->hdrChunk;
-
-- if (prevChunkId >= 0) {
-+ if (prevChunkId > 0) {
- result = yaffs_ReadChunkWithTagsFromNAND(dev, prevChunkId,
- buffer, &oldTags);
-
-- yaffs_VerifyObjectHeader(in,oh,&oldTags,0);
-+ yaffs_VerifyObjectHeader(in, oh, &oldTags, 0);
-
- memcpy(oldName, oh->name, sizeof(oh->name));
- }
-@@ -3628,7 +3701,7 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
-
- oh->type = in->variantType;
- oh->yst_mode = in->yst_mode;
-- oh->shadowsObject = shadows;
-+ oh->shadowsObject = oh->inbandShadowsObject = shadows;
-
- #ifdef CONFIG_YAFFS_WINCE
- oh->win_atime[0] = in->win_atime[0];
-@@ -3645,20 +3718,18 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
- oh->yst_ctime = in->yst_ctime;
- oh->yst_rdev = in->yst_rdev;
- #endif
-- if (in->parent) {
-+ if (in->parent)
- oh->parentObjectId = in->parent->objectId;
-- } else {
-+ else
- oh->parentObjectId = 0;
-- }
-
- if (name && *name) {
- memset(oh->name, 0, sizeof(oh->name));
- yaffs_strncpy(oh->name, name, YAFFS_MAX_NAME_LENGTH);
-- } else if (prevChunkId>=0) {
-+ } else if (prevChunkId >= 0)
- memcpy(oh->name, oldName, sizeof(oh->name));
-- } else {
-+ else
- memset(oh->name, 0, sizeof(oh->name));
-- }
-
- oh->isShrink = isShrink;
-
-@@ -3708,7 +3779,7 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
- newTags.extraShadows = (oh->shadowsObject > 0) ? 1 : 0;
- newTags.extraObjectType = in->variantType;
-
-- yaffs_VerifyObjectHeader(in,oh,&newTags,1);
-+ yaffs_VerifyObjectHeader(in, oh, &newTags, 1);
-
- /* Create new chunk in NAND */
- newChunkId =
-@@ -3717,20 +3788,20 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
-
- if (newChunkId >= 0) {
-
-- in->chunkId = newChunkId;
-+ in->hdrChunk = newChunkId;
-
- if (prevChunkId >= 0) {
- yaffs_DeleteChunk(dev, prevChunkId, 1,
- __LINE__);
- }
-
-- if(!yaffs_ObjectHasCachedWriteData(in))
-+ if (!yaffs_ObjectHasCachedWriteData(in))
- in->dirty = 0;
-
- /* If this was a shrink, then mark the block that the chunk lives on */
- if (isShrink) {
- bi = yaffs_GetBlockInfo(in->myDev,
-- newChunkId /in->myDev-> nChunksPerBlock);
-+ newChunkId / in->myDev->nChunksPerBlock);
- bi->hasShrinkHeader = 1;
- }
-
-@@ -3766,7 +3837,7 @@ static int yaffs_ObjectHasCachedWriteDat
- yaffs_ChunkCache *cache;
- int nCaches = obj->myDev->nShortOpCaches;
-
-- for(i = 0; i < nCaches; i++){
-+ for (i = 0; i < nCaches; i++) {
- cache = &dev->srCache[i];
- if (cache->object == obj &&
- cache->dirty)
-@@ -3777,7 +3848,7 @@ static int yaffs_ObjectHasCachedWriteDat
- }
-
-
--static void yaffs_FlushFilesChunkCache(yaffs_Object * obj)
-+static void yaffs_FlushFilesChunkCache(yaffs_Object *obj)
- {
- yaffs_Device *dev = obj->myDev;
- int lowest = -99; /* Stop compiler whining. */
-@@ -3844,16 +3915,16 @@ void yaffs_FlushEntireDeviceCache(yaffs_
- */
- do {
- obj = NULL;
-- for( i = 0; i < nCaches && !obj; i++) {
-+ for (i = 0; i < nCaches && !obj; i++) {
- if (dev->srCache[i].object &&
- dev->srCache[i].dirty)
- obj = dev->srCache[i].object;
-
- }
-- if(obj)
-+ if (obj)
- yaffs_FlushFilesChunkCache(obj);
-
-- } while(obj);
-+ } while (obj);
-
- }
-
-@@ -3863,41 +3934,21 @@ void yaffs_FlushEntireDeviceCache(yaffs_
- * Then look for the least recently used non-dirty one.
- * Then look for the least recently used dirty one...., flush and look again.
- */
--static yaffs_ChunkCache *yaffs_GrabChunkCacheWorker(yaffs_Device * dev)
-+static yaffs_ChunkCache *yaffs_GrabChunkCacheWorker(yaffs_Device *dev)
- {
- int i;
-- int usage;
-- int theOne;
-
- if (dev->nShortOpCaches > 0) {
- for (i = 0; i < dev->nShortOpCaches; i++) {
- if (!dev->srCache[i].object)
- return &dev->srCache[i];
- }
-+ }
-
-- return NULL;
-+ return NULL;
-+}
-
-- theOne = -1;
-- usage = 0; /* just to stop the compiler grizzling */
--
-- for (i = 0; i < dev->nShortOpCaches; i++) {
-- if (!dev->srCache[i].dirty &&
-- ((dev->srCache[i].lastUse < usage && theOne >= 0) ||
-- theOne < 0)) {
-- usage = dev->srCache[i].lastUse;
-- theOne = i;
-- }
-- }
--
--
-- return theOne >= 0 ? &dev->srCache[theOne] : NULL;
-- } else {
-- return NULL;
-- }
--
--}
--
--static yaffs_ChunkCache *yaffs_GrabChunkCache(yaffs_Device * dev)
-+static yaffs_ChunkCache *yaffs_GrabChunkCache(yaffs_Device *dev)
- {
- yaffs_ChunkCache *cache;
- yaffs_Object *theObj;
-@@ -3927,8 +3978,7 @@ static yaffs_ChunkCache *yaffs_GrabChunk
- for (i = 0; i < dev->nShortOpCaches; i++) {
- if (dev->srCache[i].object &&
- !dev->srCache[i].locked &&
-- (dev->srCache[i].lastUse < usage || !cache))
-- {
-+ (dev->srCache[i].lastUse < usage || !cache)) {
- usage = dev->srCache[i].lastUse;
- theObj = dev->srCache[i].object;
- cache = &dev->srCache[i];
-@@ -3950,7 +4000,7 @@ static yaffs_ChunkCache *yaffs_GrabChunk
- }
-
- /* Find a cached chunk */
--static yaffs_ChunkCache *yaffs_FindChunkCache(const yaffs_Object * obj,
-+static yaffs_ChunkCache *yaffs_FindChunkCache(const yaffs_Object *obj,
- int chunkId)
- {
- yaffs_Device *dev = obj->myDev;
-@@ -3969,7 +4019,7 @@ static yaffs_ChunkCache *yaffs_FindChunk
- }
-
- /* Mark the chunk for the least recently used algorithym */
--static void yaffs_UseChunkCache(yaffs_Device * dev, yaffs_ChunkCache * cache,
-+static void yaffs_UseChunkCache(yaffs_Device *dev, yaffs_ChunkCache *cache,
- int isAWrite)
- {
-
-@@ -3977,9 +4027,9 @@ static void yaffs_UseChunkCache(yaffs_De
- if (dev->srLastUse < 0 || dev->srLastUse > 100000000) {
- /* Reset the cache usages */
- int i;
-- for (i = 1; i < dev->nShortOpCaches; i++) {
-+ for (i = 1; i < dev->nShortOpCaches; i++)
- dev->srCache[i].lastUse = 0;
-- }
-+
- dev->srLastUse = 0;
- }
-
-@@ -3987,9 +4037,8 @@ static void yaffs_UseChunkCache(yaffs_De
-
- cache->lastUse = dev->srLastUse;
-
-- if (isAWrite) {
-+ if (isAWrite)
- cache->dirty = 1;
-- }
- }
- }
-
-@@ -3997,21 +4046,20 @@ static void yaffs_UseChunkCache(yaffs_De
- * Do this when a whole page gets written,
- * ie the short cache for this page is no longer valid.
- */
--static void yaffs_InvalidateChunkCache(yaffs_Object * object, int chunkId)
-+static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId)
- {
- if (object->myDev->nShortOpCaches > 0) {
- yaffs_ChunkCache *cache = yaffs_FindChunkCache(object, chunkId);
-
-- if (cache) {
-+ if (cache)
- cache->object = NULL;
-- }
- }
- }
-
- /* Invalidate all the cache pages associated with this object
- * Do this whenever ther file is deleted or resized.
- */
--static void yaffs_InvalidateWholeChunkCache(yaffs_Object * in)
-+static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in)
- {
- int i;
- yaffs_Device *dev = in->myDev;
-@@ -4019,9 +4067,8 @@ static void yaffs_InvalidateWholeChunkCa
- if (dev->nShortOpCaches > 0) {
- /* Invalidate it. */
- for (i = 0; i < dev->nShortOpCaches; i++) {
-- if (dev->srCache[i].object == in) {
-+ if (dev->srCache[i].object == in)
- dev->srCache[i].object = NULL;
-- }
- }
- }
- }
-@@ -4029,18 +4076,18 @@ static void yaffs_InvalidateWholeChunkCa
- /*--------------------- Checkpointing --------------------*/
-
-
--static int yaffs_WriteCheckpointValidityMarker(yaffs_Device *dev,int head)
-+static int yaffs_WriteCheckpointValidityMarker(yaffs_Device *dev, int head)
- {
- yaffs_CheckpointValidity cp;
-
-- memset(&cp,0,sizeof(cp));
-+ memset(&cp, 0, sizeof(cp));
-
- cp.structType = sizeof(cp);
- cp.magic = YAFFS_MAGIC;
- cp.version = YAFFS_CHECKPOINT_VERSION;
- cp.head = (head) ? 1 : 0;
-
-- return (yaffs_CheckpointWrite(dev,&cp,sizeof(cp)) == sizeof(cp))?
-+ return (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)) ?
- 1 : 0;
- }
-
-@@ -4049,9 +4096,9 @@ static int yaffs_ReadCheckpointValidityM
- yaffs_CheckpointValidity cp;
- int ok;
-
-- ok = (yaffs_CheckpointRead(dev,&cp,sizeof(cp)) == sizeof(cp));
-+ ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp));
-
-- if(ok)
-+ if (ok)
- ok = (cp.structType == sizeof(cp)) &&
- (cp.magic == YAFFS_MAGIC) &&
- (cp.version == YAFFS_CHECKPOINT_VERSION) &&
-@@ -4100,21 +4147,21 @@ static int yaffs_WriteCheckpointDevice(y
- int ok;
-
- /* Write device runtime values*/
-- yaffs_DeviceToCheckpointDevice(&cp,dev);
-+ yaffs_DeviceToCheckpointDevice(&cp, dev);
- cp.structType = sizeof(cp);
-
-- ok = (yaffs_CheckpointWrite(dev,&cp,sizeof(cp)) == sizeof(cp));
-+ ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp));
-
- /* Write block info */
-- if(ok) {
-+ if (ok) {
- nBytes = nBlocks * sizeof(yaffs_BlockInfo);
-- ok = (yaffs_CheckpointWrite(dev,dev->blockInfo,nBytes) == nBytes);
-+ ok = (yaffs_CheckpointWrite(dev, dev->blockInfo, nBytes) == nBytes);
- }
-
- /* Write chunk bits */
-- if(ok) {
-+ if (ok) {
- nBytes = nBlocks * dev->chunkBitmapStride;
-- ok = (yaffs_CheckpointWrite(dev,dev->chunkBits,nBytes) == nBytes);
-+ ok = (yaffs_CheckpointWrite(dev, dev->chunkBits, nBytes) == nBytes);
- }
- return ok ? 1 : 0;
-
-@@ -4128,25 +4175,25 @@ static int yaffs_ReadCheckpointDevice(ya
-
- int ok;
-
-- ok = (yaffs_CheckpointRead(dev,&cp,sizeof(cp)) == sizeof(cp));
-- if(!ok)
-+ ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp));
-+ if (!ok)
- return 0;
-
-- if(cp.structType != sizeof(cp))
-+ if (cp.structType != sizeof(cp))
- return 0;
-
-
-- yaffs_CheckpointDeviceToDevice(dev,&cp);
-+ yaffs_CheckpointDeviceToDevice(dev, &cp);
-
- nBytes = nBlocks * sizeof(yaffs_BlockInfo);
-
-- ok = (yaffs_CheckpointRead(dev,dev->blockInfo,nBytes) == nBytes);
-+ ok = (yaffs_CheckpointRead(dev, dev->blockInfo, nBytes) == nBytes);
-
-- if(!ok)
-+ if (!ok)
- return 0;
- nBytes = nBlocks * dev->chunkBitmapStride;
-
-- ok = (yaffs_CheckpointRead(dev,dev->chunkBits,nBytes) == nBytes);
-+ ok = (yaffs_CheckpointRead(dev, dev->chunkBits, nBytes) == nBytes);
-
- return ok ? 1 : 0;
- }
-@@ -4157,7 +4204,7 @@ static void yaffs_ObjectToCheckpointObje
-
- cp->objectId = obj->objectId;
- cp->parentId = (obj->parent) ? obj->parent->objectId : 0;
-- cp->chunkId = obj->chunkId;
-+ cp->hdrChunk = obj->hdrChunk;
- cp->variantType = obj->variantType;
- cp->deleted = obj->deleted;
- cp->softDeleted = obj->softDeleted;
-@@ -4168,20 +4215,28 @@ static void yaffs_ObjectToCheckpointObje
- cp->serial = obj->serial;
- cp->nDataChunks = obj->nDataChunks;
-
-- if(obj->variantType == YAFFS_OBJECT_TYPE_FILE)
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE)
- cp->fileSizeOrEquivalentObjectId = obj->variant.fileVariant.fileSize;
-- else if(obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK)
-+ else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK)
- cp->fileSizeOrEquivalentObjectId = obj->variant.hardLinkVariant.equivalentObjectId;
- }
-
--static void yaffs_CheckpointObjectToObject( yaffs_Object *obj,yaffs_CheckpointObject *cp)
-+static int yaffs_CheckpointObjectToObject(yaffs_Object *obj, yaffs_CheckpointObject *cp)
- {
-
- yaffs_Object *parent;
-
-+ if (obj->variantType != cp->variantType) {
-+ T(YAFFS_TRACE_ERROR, (TSTR("Checkpoint read object %d type %d "
-+ TCONT("chunk %d does not match existing object type %d")
-+ TENDSTR), cp->objectId, cp->variantType, cp->hdrChunk,
-+ obj->variantType));
-+ return 0;
-+ }
-+
- obj->objectId = cp->objectId;
-
-- if(cp->parentId)
-+ if (cp->parentId)
- parent = yaffs_FindOrCreateObjectByNumber(
- obj->myDev,
- cp->parentId,
-@@ -4189,10 +4244,19 @@ static void yaffs_CheckpointObjectToObje
- else
- parent = NULL;
-
-- if(parent)
-+ if (parent) {
-+ if (parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Checkpoint read object %d parent %d type %d"
-+ TCONT(" chunk %d Parent type, %d, not directory")
-+ TENDSTR),
-+ cp->objectId, cp->parentId, cp->variantType,
-+ cp->hdrChunk, parent->variantType));
-+ return 0;
-+ }
- yaffs_AddObjectToDirectory(parent, obj);
-+ }
-
-- obj->chunkId = cp->chunkId;
-+ obj->hdrChunk = cp->hdrChunk;
- obj->variantType = cp->variantType;
- obj->deleted = cp->deleted;
- obj->softDeleted = cp->softDeleted;
-@@ -4203,29 +4267,34 @@ static void yaffs_CheckpointObjectToObje
- obj->serial = cp->serial;
- obj->nDataChunks = cp->nDataChunks;
-
-- if(obj->variantType == YAFFS_OBJECT_TYPE_FILE)
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE)
- obj->variant.fileVariant.fileSize = cp->fileSizeOrEquivalentObjectId;
-- else if(obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK)
-+ else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK)
- obj->variant.hardLinkVariant.equivalentObjectId = cp->fileSizeOrEquivalentObjectId;
-
-- if(obj->objectId >= YAFFS_NOBJECT_BUCKETS)
-+ if (obj->hdrChunk > 0)
- obj->lazyLoaded = 1;
-+ return 1;
- }
-
-
-
--static int yaffs_CheckpointTnodeWorker(yaffs_Object * in, yaffs_Tnode * tn,
-- __u32 level, int chunkOffset)
-+static int yaffs_CheckpointTnodeWorker(yaffs_Object *in, yaffs_Tnode *tn,
-+ __u32 level, int chunkOffset)
- {
- int i;
- yaffs_Device *dev = in->myDev;
- int ok = 1;
-- int nTnodeBytes = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-+ int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-+
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-+
-
- if (tn) {
- if (level > 0) {
-
-- for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++){
-+ for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++) {
- if (tn->internal[i]) {
- ok = yaffs_CheckpointTnodeWorker(in,
- tn->internal[i],
-@@ -4235,10 +4304,9 @@ static int yaffs_CheckpointTnodeWorker(y
- }
- } else if (level == 0) {
- __u32 baseOffset = chunkOffset << YAFFS_TNODES_LEVEL0_BITS;
-- /* printf("write tnode at %d\n",baseOffset); */
-- ok = (yaffs_CheckpointWrite(dev,&baseOffset,sizeof(baseOffset)) == sizeof(baseOffset));
-- if(ok)
-- ok = (yaffs_CheckpointWrite(dev,tn,nTnodeBytes) == nTnodeBytes);
-+ ok = (yaffs_CheckpointWrite(dev, &baseOffset, sizeof(baseOffset)) == sizeof(baseOffset));
-+ if (ok)
-+ ok = (yaffs_CheckpointWrite(dev, tn, tnodeSize) == tnodeSize);
- }
- }
-
-@@ -4251,13 +4319,13 @@ static int yaffs_WriteCheckpointTnodes(y
- __u32 endMarker = ~0;
- int ok = 1;
-
-- if(obj->variantType == YAFFS_OBJECT_TYPE_FILE){
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) {
- ok = yaffs_CheckpointTnodeWorker(obj,
- obj->variant.fileVariant.top,
- obj->variant.fileVariant.topLevel,
- 0);
-- if(ok)
-- ok = (yaffs_CheckpointWrite(obj->myDev,&endMarker,sizeof(endMarker)) ==
-+ if (ok)
-+ ok = (yaffs_CheckpointWrite(obj->myDev, &endMarker, sizeof(endMarker)) ==
- sizeof(endMarker));
- }
-
-@@ -4272,38 +4340,38 @@ static int yaffs_ReadCheckpointTnodes(ya
- yaffs_FileStructure *fileStructPtr = &obj->variant.fileVariant;
- yaffs_Tnode *tn;
- int nread = 0;
-+ int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-
-- ok = (yaffs_CheckpointRead(dev,&baseChunk,sizeof(baseChunk)) == sizeof(baseChunk));
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-
-- while(ok && (~baseChunk)){
-+ ok = (yaffs_CheckpointRead(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk));
-+
-+ while (ok && (~baseChunk)) {
- nread++;
- /* Read level 0 tnode */
-
-
-- /* printf("read tnode at %d\n",baseChunk); */
- tn = yaffs_GetTnodeRaw(dev);
-- if(tn)
-- ok = (yaffs_CheckpointRead(dev,tn,(dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8) ==
-- (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8);
-+ if (tn)
-+ ok = (yaffs_CheckpointRead(dev, tn, tnodeSize) == tnodeSize);
- else
- ok = 0;
-
-- if(tn && ok){
-+ if (tn && ok)
- ok = yaffs_AddOrFindLevel0Tnode(dev,
-- fileStructPtr,
-- baseChunk,
-- tn) ? 1 : 0;
-+ fileStructPtr,
-+ baseChunk,
-+ tn) ? 1 : 0;
-
-- }
--
-- if(ok)
-- ok = (yaffs_CheckpointRead(dev,&baseChunk,sizeof(baseChunk)) == sizeof(baseChunk));
-+ if (ok)
-+ ok = (yaffs_CheckpointRead(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk));
-
- }
-
-- T(YAFFS_TRACE_CHECKPOINT,(
-+ T(YAFFS_TRACE_CHECKPOINT, (
- TSTR("Checkpoint read tnodes %d records, last %d. ok %d" TENDSTR),
-- nread,baseChunk,ok));
-+ nread, baseChunk, ok));
-
- return ok ? 1 : 0;
- }
-@@ -4315,41 +4383,40 @@ static int yaffs_WriteCheckpointObjects(
- yaffs_CheckpointObject cp;
- int i;
- int ok = 1;
-- struct list_head *lh;
-+ struct ylist_head *lh;
-
-
- /* Iterate through the objects in each hash entry,
- * dumping them to the checkpointing stream.
- */
-
-- for(i = 0; ok && i < YAFFS_NOBJECT_BUCKETS; i++){
-- list_for_each(lh, &dev->objectBucket[i].list) {
-+ for (i = 0; ok && i < YAFFS_NOBJECT_BUCKETS; i++) {
-+ ylist_for_each(lh, &dev->objectBucket[i].list) {
- if (lh) {
-- obj = list_entry(lh, yaffs_Object, hashLink);
-+ obj = ylist_entry(lh, yaffs_Object, hashLink);
- if (!obj->deferedFree) {
-- yaffs_ObjectToCheckpointObject(&cp,obj);
-+ yaffs_ObjectToCheckpointObject(&cp, obj);
- cp.structType = sizeof(cp);
-
-- T(YAFFS_TRACE_CHECKPOINT,(
-+ T(YAFFS_TRACE_CHECKPOINT, (
- TSTR("Checkpoint write object %d parent %d type %d chunk %d obj addr %x" TENDSTR),
-- cp.objectId,cp.parentId,cp.variantType,cp.chunkId,(unsigned) obj));
-+ cp.objectId, cp.parentId, cp.variantType, cp.hdrChunk, (unsigned) obj));
-
-- ok = (yaffs_CheckpointWrite(dev,&cp,sizeof(cp)) == sizeof(cp));
-+ ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp));
-
-- if(ok && obj->variantType == YAFFS_OBJECT_TYPE_FILE){
-+ if (ok && obj->variantType == YAFFS_OBJECT_TYPE_FILE)
- ok = yaffs_WriteCheckpointTnodes(obj);
-- }
- }
- }
- }
-- }
-+ }
-
-- /* Dump end of list */
-- memset(&cp,0xFF,sizeof(yaffs_CheckpointObject));
-+ /* Dump end of list */
-+ memset(&cp, 0xFF, sizeof(yaffs_CheckpointObject));
- cp.structType = sizeof(cp);
-
-- if(ok)
-- ok = (yaffs_CheckpointWrite(dev,&cp,sizeof(cp)) == sizeof(cp));
-+ if (ok)
-+ ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp));
-
- return ok ? 1 : 0;
- }
-@@ -4362,38 +4429,39 @@ static int yaffs_ReadCheckpointObjects(y
- int done = 0;
- yaffs_Object *hardList = NULL;
-
-- while(ok && !done) {
-- ok = (yaffs_CheckpointRead(dev,&cp,sizeof(cp)) == sizeof(cp));
-- if(cp.structType != sizeof(cp)) {
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("struct size %d instead of %d ok %d"TENDSTR),
-- cp.structType,sizeof(cp),ok));
-+ while (ok && !done) {
-+ ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp));
-+ if (cp.structType != sizeof(cp)) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("struct size %d instead of %d ok %d"TENDSTR),
-+ cp.structType, sizeof(cp), ok));
- ok = 0;
- }
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("Checkpoint read object %d parent %d type %d chunk %d " TENDSTR),
-- cp.objectId,cp.parentId,cp.variantType,cp.chunkId));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("Checkpoint read object %d parent %d type %d chunk %d " TENDSTR),
-+ cp.objectId, cp.parentId, cp.variantType, cp.hdrChunk));
-
-- if(ok && cp.objectId == ~0)
-+ if (ok && cp.objectId == ~0)
- done = 1;
-- else if(ok){
-- obj = yaffs_FindOrCreateObjectByNumber(dev,cp.objectId, cp.variantType);
-- if(obj) {
-- yaffs_CheckpointObjectToObject(obj,&cp);
-- if(obj->variantType == YAFFS_OBJECT_TYPE_FILE) {
-+ else if (ok) {
-+ obj = yaffs_FindOrCreateObjectByNumber(dev, cp.objectId, cp.variantType);
-+ if (obj) {
-+ ok = yaffs_CheckpointObjectToObject(obj, &cp);
-+ if (!ok)
-+ break;
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) {
- ok = yaffs_ReadCheckpointTnodes(obj);
-- } else if(obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) {
-+ } else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) {
- obj->hardLinks.next =
-- (struct list_head *)
-- hardList;
-+ (struct ylist_head *) hardList;
- hardList = obj;
- }
--
-- }
-+ } else
-+ ok = 0;
- }
- }
-
-- if(ok)
-- yaffs_HardlinkFixup(dev,hardList);
-+ if (ok)
-+ yaffs_HardlinkFixup(dev, hardList);
-
- return ok ? 1 : 0;
- }
-@@ -4403,11 +4471,11 @@ static int yaffs_WriteCheckpointSum(yaff
- __u32 checkpointSum;
- int ok;
-
-- yaffs_GetCheckpointSum(dev,&checkpointSum);
-+ yaffs_GetCheckpointSum(dev, &checkpointSum);
-
-- ok = (yaffs_CheckpointWrite(dev,&checkpointSum,sizeof(checkpointSum)) == sizeof(checkpointSum));
-+ ok = (yaffs_CheckpointWrite(dev, &checkpointSum, sizeof(checkpointSum)) == sizeof(checkpointSum));
-
-- if(!ok)
-+ if (!ok)
- return 0;
-
- return 1;
-@@ -4419,14 +4487,14 @@ static int yaffs_ReadCheckpointSum(yaffs
- __u32 checkpointSum1;
- int ok;
-
-- yaffs_GetCheckpointSum(dev,&checkpointSum0);
-+ yaffs_GetCheckpointSum(dev, &checkpointSum0);
-
-- ok = (yaffs_CheckpointRead(dev,&checkpointSum1,sizeof(checkpointSum1)) == sizeof(checkpointSum1));
-+ ok = (yaffs_CheckpointRead(dev, &checkpointSum1, sizeof(checkpointSum1)) == sizeof(checkpointSum1));
-
-- if(!ok)
-+ if (!ok)
- return 0;
-
-- if(checkpointSum0 != checkpointSum1)
-+ if (checkpointSum0 != checkpointSum1)
- return 0;
-
- return 1;
-@@ -4435,46 +4503,43 @@ static int yaffs_ReadCheckpointSum(yaffs
-
- static int yaffs_WriteCheckpointData(yaffs_Device *dev)
- {
--
- int ok = 1;
-
-- if(dev->skipCheckpointWrite || !dev->isYaffs2){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("skipping checkpoint write" TENDSTR)));
-+ if (dev->skipCheckpointWrite || !dev->isYaffs2) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("skipping checkpoint write" TENDSTR)));
- ok = 0;
- }
-
-- if(ok)
-- ok = yaffs_CheckpointOpen(dev,1);
-+ if (ok)
-+ ok = yaffs_CheckpointOpen(dev, 1);
-
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("write checkpoint validity" TENDSTR)));
-- ok = yaffs_WriteCheckpointValidityMarker(dev,1);
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint validity" TENDSTR)));
-+ ok = yaffs_WriteCheckpointValidityMarker(dev, 1);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("write checkpoint device" TENDSTR)));
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint device" TENDSTR)));
- ok = yaffs_WriteCheckpointDevice(dev);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("write checkpoint objects" TENDSTR)));
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint objects" TENDSTR)));
- ok = yaffs_WriteCheckpointObjects(dev);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("write checkpoint validity" TENDSTR)));
-- ok = yaffs_WriteCheckpointValidityMarker(dev,0);
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint validity" TENDSTR)));
-+ ok = yaffs_WriteCheckpointValidityMarker(dev, 0);
- }
-
-- if(ok){
-+ if (ok)
- ok = yaffs_WriteCheckpointSum(dev);
-- }
--
-
-- if(!yaffs_CheckpointClose(dev))
-- ok = 0;
-+ if (!yaffs_CheckpointClose(dev))
-+ ok = 0;
-
-- if(ok)
-- dev->isCheckpointed = 1;
-- else
-- dev->isCheckpointed = 0;
-+ if (ok)
-+ dev->isCheckpointed = 1;
-+ else
-+ dev->isCheckpointed = 0;
-
- return dev->isCheckpointed;
- }
-@@ -4483,43 +4548,43 @@ static int yaffs_ReadCheckpointData(yaff
- {
- int ok = 1;
-
-- if(dev->skipCheckpointRead || !dev->isYaffs2){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("skipping checkpoint read" TENDSTR)));
-+ if (dev->skipCheckpointRead || !dev->isYaffs2) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("skipping checkpoint read" TENDSTR)));
- ok = 0;
- }
-
-- if(ok)
-- ok = yaffs_CheckpointOpen(dev,0); /* open for read */
-+ if (ok)
-+ ok = yaffs_CheckpointOpen(dev, 0); /* open for read */
-
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint validity" TENDSTR)));
-- ok = yaffs_ReadCheckpointValidityMarker(dev,1);
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint validity" TENDSTR)));
-+ ok = yaffs_ReadCheckpointValidityMarker(dev, 1);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint device" TENDSTR)));
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint device" TENDSTR)));
- ok = yaffs_ReadCheckpointDevice(dev);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint objects" TENDSTR)));
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint objects" TENDSTR)));
- ok = yaffs_ReadCheckpointObjects(dev);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint validity" TENDSTR)));
-- ok = yaffs_ReadCheckpointValidityMarker(dev,0);
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint validity" TENDSTR)));
-+ ok = yaffs_ReadCheckpointValidityMarker(dev, 0);
- }
-
-- if(ok){
-+ if (ok) {
- ok = yaffs_ReadCheckpointSum(dev);
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint checksum %d" TENDSTR),ok));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint checksum %d" TENDSTR), ok));
- }
-
-- if(!yaffs_CheckpointClose(dev))
-+ if (!yaffs_CheckpointClose(dev))
- ok = 0;
-
-- if(ok)
-- dev->isCheckpointed = 1;
-- else
-- dev->isCheckpointed = 0;
-+ if (ok)
-+ dev->isCheckpointed = 1;
-+ else
-+ dev->isCheckpointed = 0;
-
- return ok ? 1 : 0;
-
-@@ -4527,11 +4592,11 @@ static int yaffs_ReadCheckpointData(yaff
-
- static void yaffs_InvalidateCheckpoint(yaffs_Device *dev)
- {
-- if(dev->isCheckpointed ||
-- dev->blocksInCheckpoint > 0){
-+ if (dev->isCheckpointed ||
-+ dev->blocksInCheckpoint > 0) {
- dev->isCheckpointed = 0;
- yaffs_CheckpointInvalidateStream(dev);
-- if(dev->superBlock && dev->markSuperBlockDirty)
-+ if (dev->superBlock && dev->markSuperBlockDirty)
- dev->markSuperBlockDirty(dev->superBlock);
- }
- }
-@@ -4540,18 +4605,18 @@ static void yaffs_InvalidateCheckpoint(y
- int yaffs_CheckpointSave(yaffs_Device *dev)
- {
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("save entry: isCheckpointed %d"TENDSTR),dev->isCheckpointed));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("save entry: isCheckpointed %d"TENDSTR), dev->isCheckpointed));
-
- yaffs_VerifyObjects(dev);
- yaffs_VerifyBlocks(dev);
- yaffs_VerifyFreeChunks(dev);
-
-- if(!dev->isCheckpointed) {
-+ if (!dev->isCheckpointed) {
- yaffs_InvalidateCheckpoint(dev);
- yaffs_WriteCheckpointData(dev);
- }
-
-- T(YAFFS_TRACE_ALWAYS,(TSTR("save exit: isCheckpointed %d"TENDSTR),dev->isCheckpointed));
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("save exit: isCheckpointed %d"TENDSTR), dev->isCheckpointed));
-
- return dev->isCheckpointed;
- }
-@@ -4559,17 +4624,17 @@ int yaffs_CheckpointSave(yaffs_Device *d
- int yaffs_CheckpointRestore(yaffs_Device *dev)
- {
- int retval;
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("restore entry: isCheckpointed %d"TENDSTR),dev->isCheckpointed));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore entry: isCheckpointed %d"TENDSTR), dev->isCheckpointed));
-
- retval = yaffs_ReadCheckpointData(dev);
-
-- if(dev->isCheckpointed){
-+ if (dev->isCheckpointed) {
- yaffs_VerifyObjects(dev);
- yaffs_VerifyBlocks(dev);
- yaffs_VerifyFreeChunks(dev);
- }
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("restore exit: isCheckpointed %d"TENDSTR),dev->isCheckpointed));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore exit: isCheckpointed %d"TENDSTR), dev->isCheckpointed));
-
- return retval;
- }
-@@ -4584,12 +4649,12 @@ int yaffs_CheckpointRestore(yaffs_Device
- * Curve-balls: the first chunk might also be the last chunk.
- */
-
--int yaffs_ReadDataFromFile(yaffs_Object * in, __u8 * buffer, loff_t offset,
-- int nBytes)
-+int yaffs_ReadDataFromFile(yaffs_Object *in, __u8 *buffer, loff_t offset,
-+ int nBytes)
- {
-
- int chunk;
-- int start;
-+ __u32 start;
- int nToCopy;
- int n = nBytes;
- int nDone = 0;
-@@ -4600,27 +4665,26 @@ int yaffs_ReadDataFromFile(yaffs_Object
- dev = in->myDev;
-
- while (n > 0) {
-- //chunk = offset / dev->nDataBytesPerChunk + 1;
-- //start = offset % dev->nDataBytesPerChunk;
-- yaffs_AddrToChunk(dev,offset,&chunk,&start);
-+ /* chunk = offset / dev->nDataBytesPerChunk + 1; */
-+ /* start = offset % dev->nDataBytesPerChunk; */
-+ yaffs_AddrToChunk(dev, offset, &chunk, &start);
- chunk++;
-
- /* OK now check for the curveball where the start and end are in
- * the same chunk.
- */
-- if ((start + n) < dev->nDataBytesPerChunk) {
-+ if ((start + n) < dev->nDataBytesPerChunk)
- nToCopy = n;
-- } else {
-+ else
- nToCopy = dev->nDataBytesPerChunk - start;
-- }
-
- cache = yaffs_FindChunkCache(in, chunk);
-
- /* If the chunk is already in the cache or it is less than a whole chunk
-- * then use the cache (if there is caching)
-+ * or we're using inband tags then use the cache (if there is caching)
- * else bypass the cache.
- */
-- if (cache || nToCopy != dev->nDataBytesPerChunk) {
-+ if (cache || nToCopy != dev->nDataBytesPerChunk || dev->inbandTags) {
- if (dev->nShortOpCaches > 0) {
-
- /* If we can't find the data in the cache, then load it up. */
-@@ -4641,14 +4705,9 @@ int yaffs_ReadDataFromFile(yaffs_Object
-
- cache->locked = 1;
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-+
- memcpy(buffer, &cache->data[start], nToCopy);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
- cache->locked = 0;
- } else {
- /* Read into the local buffer then copy..*/
-@@ -4657,41 +4716,19 @@ int yaffs_ReadDataFromFile(yaffs_Object
- yaffs_GetTempBuffer(dev, __LINE__);
- yaffs_ReadChunkDataFromObject(in, chunk,
- localBuffer);
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-+
- memcpy(buffer, &localBuffer[start], nToCopy);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
-+
- yaffs_ReleaseTempBuffer(dev, localBuffer,
- __LINE__);
- }
-
- } else {
--#ifdef CONFIG_YAFFS_WINCE
-- __u8 *localBuffer = yaffs_GetTempBuffer(dev, __LINE__);
--
-- /* Under WinCE can't do direct transfer. Need to use a local buffer.
-- * This is because we otherwise screw up WinCE's memory mapper
-- */
-- yaffs_ReadChunkDataFromObject(in, chunk, localBuffer);
--
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-- memcpy(buffer, localBuffer, dev->nDataBytesPerChunk);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
-- yaffs_ReleaseTempBuffer(dev, localBuffer, __LINE__);
--#endif
--
--#else
- /* A full chunk. Read directly into the supplied buffer. */
- yaffs_ReadChunkDataFromObject(in, chunk, buffer);
--#endif
-+
- }
-
- n -= nToCopy;
-@@ -4704,28 +4741,37 @@ int yaffs_ReadDataFromFile(yaffs_Object
- return nDone;
- }
-
--int yaffs_WriteDataToFile(yaffs_Object * in, const __u8 * buffer, loff_t offset,
-- int nBytes, int writeThrough)
-+int yaffs_WriteDataToFile(yaffs_Object *in, const __u8 *buffer, loff_t offset,
-+ int nBytes, int writeThrough)
- {
-
- int chunk;
-- int start;
-+ __u32 start;
- int nToCopy;
- int n = nBytes;
- int nDone = 0;
- int nToWriteBack;
- int startOfWrite = offset;
- int chunkWritten = 0;
-- int nBytesRead;
-+ __u32 nBytesRead;
-+ __u32 chunkStart;
-
- yaffs_Device *dev;
-
- dev = in->myDev;
-
- while (n > 0 && chunkWritten >= 0) {
-- //chunk = offset / dev->nDataBytesPerChunk + 1;
-- //start = offset % dev->nDataBytesPerChunk;
-- yaffs_AddrToChunk(dev,offset,&chunk,&start);
-+ /* chunk = offset / dev->nDataBytesPerChunk + 1; */
-+ /* start = offset % dev->nDataBytesPerChunk; */
-+ yaffs_AddrToChunk(dev, offset, &chunk, &start);
-+
-+ if (chunk * dev->nDataBytesPerChunk + start != offset ||
-+ start >= dev->nDataBytesPerChunk) {
-+ T(YAFFS_TRACE_ERROR, (
-+ TSTR("AddrToChunk of offset %d gives chunk %d start %d"
-+ TENDSTR),
-+ (int)offset, chunk, start));
-+ }
- chunk++;
-
- /* OK now check for the curveball where the start and end are in
-@@ -4740,25 +4786,32 @@ int yaffs_WriteDataToFile(yaffs_Object *
- * we need to write back as much as was there before.
- */
-
-- nBytesRead =
-- in->variant.fileVariant.fileSize -
-- ((chunk - 1) * dev->nDataBytesPerChunk);
-+ chunkStart = ((chunk - 1) * dev->nDataBytesPerChunk);
-+
-+ if (chunkStart > in->variant.fileVariant.fileSize)
-+ nBytesRead = 0; /* Past end of file */
-+ else
-+ nBytesRead = in->variant.fileVariant.fileSize - chunkStart;
-
-- if (nBytesRead > dev->nDataBytesPerChunk) {
-+ if (nBytesRead > dev->nDataBytesPerChunk)
- nBytesRead = dev->nDataBytesPerChunk;
-- }
-
- nToWriteBack =
- (nBytesRead >
- (start + n)) ? nBytesRead : (start + n);
-
-+ if (nToWriteBack < 0 || nToWriteBack > dev->nDataBytesPerChunk)
-+ YBUG();
-+
- } else {
- nToCopy = dev->nDataBytesPerChunk - start;
- nToWriteBack = dev->nDataBytesPerChunk;
- }
-
-- if (nToCopy != dev->nDataBytesPerChunk) {
-- /* An incomplete start or end chunk (or maybe both start and end chunk) */
-+ if (nToCopy != dev->nDataBytesPerChunk || dev->inbandTags) {
-+ /* An incomplete start or end chunk (or maybe both start and end chunk),
-+ * or we're using inband tags, so we want to use the cache buffers.
-+ */
- if (dev->nShortOpCaches > 0) {
- yaffs_ChunkCache *cache;
- /* If we can't find the data in the cache, then load the cache */
-@@ -4775,10 +4828,9 @@ int yaffs_WriteDataToFile(yaffs_Object *
- yaffs_ReadChunkDataFromObject(in, chunk,
- cache->
- data);
-- }
-- else if(cache &&
-- !cache->dirty &&
-- !yaffs_CheckSpaceForAllocation(in->myDev)){
-+ } else if (cache &&
-+ !cache->dirty &&
-+ !yaffs_CheckSpaceForAllocation(in->myDev)) {
- /* Drop the cache if it was a read cache item and
- * no space check has been made for it.
- */
-@@ -4788,16 +4840,12 @@ int yaffs_WriteDataToFile(yaffs_Object *
- if (cache) {
- yaffs_UseChunkCache(dev, cache, 1);
- cache->locked = 1;
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-+
-
- memcpy(&cache->data[start], buffer,
- nToCopy);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
-+
- cache->locked = 0;
- cache->nBytes = nToWriteBack;
-
-@@ -4825,15 +4873,10 @@ int yaffs_WriteDataToFile(yaffs_Object *
- yaffs_ReadChunkDataFromObject(in, chunk,
- localBuffer);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-+
-
- memcpy(&localBuffer[start], buffer, nToCopy);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
- chunkWritten =
- yaffs_WriteChunkDataToObject(in, chunk,
- localBuffer,
-@@ -4846,31 +4889,15 @@ int yaffs_WriteDataToFile(yaffs_Object *
- }
-
- } else {
--
--#ifdef CONFIG_YAFFS_WINCE
-- /* Under WinCE can't do direct transfer. Need to use a local buffer.
-- * This is because we otherwise screw up WinCE's memory mapper
-- */
-- __u8 *localBuffer = yaffs_GetTempBuffer(dev, __LINE__);
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-- memcpy(localBuffer, buffer, dev->nDataBytesPerChunk);
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
-- chunkWritten =
-- yaffs_WriteChunkDataToObject(in, chunk, localBuffer,
-- dev->nDataBytesPerChunk,
-- 0);
-- yaffs_ReleaseTempBuffer(dev, localBuffer, __LINE__);
--#else
- /* A full chunk. Write directly from the supplied buffer. */
-+
-+
-+
- chunkWritten =
- yaffs_WriteChunkDataToObject(in, chunk, buffer,
- dev->nDataBytesPerChunk,
- 0);
--#endif
-+
- /* Since we've overwritten the cached data, we better invalidate it. */
- yaffs_InvalidateChunkCache(in, chunk);
- }
-@@ -4886,9 +4913,8 @@ int yaffs_WriteDataToFile(yaffs_Object *
-
- /* Update file object */
-
-- if ((startOfWrite + nDone) > in->variant.fileVariant.fileSize) {
-+ if ((startOfWrite + nDone) > in->variant.fileVariant.fileSize)
- in->variant.fileVariant.fileSize = (startOfWrite + nDone);
-- }
-
- in->dirty = 1;
-
-@@ -4898,7 +4924,7 @@ int yaffs_WriteDataToFile(yaffs_Object *
-
- /* ---------------------- File resizing stuff ------------------ */
-
--static void yaffs_PruneResizedChunks(yaffs_Object * in, int newSize)
-+static void yaffs_PruneResizedChunks(yaffs_Object *in, int newSize)
- {
-
- yaffs_Device *dev = in->myDev;
-@@ -4939,11 +4965,11 @@ static void yaffs_PruneResizedChunks(yaf
-
- }
-
--int yaffs_ResizeFile(yaffs_Object * in, loff_t newSize)
-+int yaffs_ResizeFile(yaffs_Object *in, loff_t newSize)
- {
-
- int oldFileSize = in->variant.fileVariant.fileSize;
-- int newSizeOfPartialChunk;
-+ __u32 newSizeOfPartialChunk;
- int newFullChunks;
-
- yaffs_Device *dev = in->myDev;
-@@ -4955,13 +4981,11 @@ int yaffs_ResizeFile(yaffs_Object * in,
-
- yaffs_CheckGarbageCollection(dev);
-
-- if (in->variantType != YAFFS_OBJECT_TYPE_FILE) {
-- return yaffs_GetFileSize(in);
-- }
-+ if (in->variantType != YAFFS_OBJECT_TYPE_FILE)
-+ return YAFFS_FAIL;
-
-- if (newSize == oldFileSize) {
-- return oldFileSize;
-- }
-+ if (newSize == oldFileSize)
-+ return YAFFS_OK;
-
- if (newSize < oldFileSize) {
-
-@@ -4994,21 +5018,20 @@ int yaffs_ResizeFile(yaffs_Object * in,
- }
-
-
--
- /* Write a new object header.
- * show we've shrunk the file, if need be
- * Do this only if the file is not in the deleted directories.
- */
-- if (in->parent->objectId != YAFFS_OBJECTID_UNLINKED &&
-- in->parent->objectId != YAFFS_OBJECTID_DELETED) {
-+ if (in->parent &&
-+ in->parent->objectId != YAFFS_OBJECTID_UNLINKED &&
-+ in->parent->objectId != YAFFS_OBJECTID_DELETED)
- yaffs_UpdateObjectHeader(in, NULL, 0,
- (newSize < oldFileSize) ? 1 : 0, 0);
-- }
-
-- return newSize;
-+ return YAFFS_OK;
- }
-
--loff_t yaffs_GetFileSize(yaffs_Object * obj)
-+loff_t yaffs_GetFileSize(yaffs_Object *obj)
- {
- obj = yaffs_GetEquivalentObject(obj);
-
-@@ -5024,7 +5047,7 @@ loff_t yaffs_GetFileSize(yaffs_Object *
-
-
-
--int yaffs_FlushFile(yaffs_Object * in, int updateTime)
-+int yaffs_FlushFile(yaffs_Object *in, int updateTime)
- {
- int retVal;
- if (in->dirty) {
-@@ -5039,9 +5062,8 @@ int yaffs_FlushFile(yaffs_Object * in, i
- #endif
- }
-
-- retVal =
-- (yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0) >=
-- 0) ? YAFFS_OK : YAFFS_FAIL;
-+ retVal = (yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0) >=
-+ 0) ? YAFFS_OK : YAFFS_FAIL;
- } else {
- retVal = YAFFS_OK;
- }
-@@ -5050,7 +5072,7 @@ int yaffs_FlushFile(yaffs_Object * in, i
-
- }
-
--static int yaffs_DoGenericObjectDeletion(yaffs_Object * in)
-+static int yaffs_DoGenericObjectDeletion(yaffs_Object *in)
- {
-
- /* First off, invalidate the file's data in the cache, without flushing. */
-@@ -5058,13 +5080,13 @@ static int yaffs_DoGenericObjectDeletion
-
- if (in->myDev->isYaffs2 && (in->parent != in->myDev->deletedDir)) {
- /* Move to the unlinked directory so we have a record that it was deleted. */
-- yaffs_ChangeObjectName(in, in->myDev->deletedDir,"deleted", 0, 0);
-+ yaffs_ChangeObjectName(in, in->myDev->deletedDir, _Y("deleted"), 0, 0);
-
- }
-
- yaffs_RemoveObjectFromDirectory(in);
-- yaffs_DeleteChunk(in->myDev, in->chunkId, 1, __LINE__);
-- in->chunkId = -1;
-+ yaffs_DeleteChunk(in->myDev, in->hdrChunk, 1, __LINE__);
-+ in->hdrChunk = 0;
-
- yaffs_FreeObject(in);
- return YAFFS_OK;
-@@ -5075,62 +5097,63 @@ static int yaffs_DoGenericObjectDeletion
- * and the inode associated with the file.
- * It does not delete the links associated with the file.
- */
--static int yaffs_UnlinkFile(yaffs_Object * in)
-+static int yaffs_UnlinkFileIfNeeded(yaffs_Object *in)
- {
-
- int retVal;
- int immediateDeletion = 0;
-
-- if (1) {
- #ifdef __KERNEL__
-- if (!in->myInode) {
-- immediateDeletion = 1;
--
-- }
-+ if (!in->myInode)
-+ immediateDeletion = 1;
- #else
-- if (in->inUse <= 0) {
-- immediateDeletion = 1;
--
-- }
-+ if (in->inUse <= 0)
-+ immediateDeletion = 1;
- #endif
-- if (immediateDeletion) {
-- retVal =
-- yaffs_ChangeObjectName(in, in->myDev->deletedDir,
-- "deleted", 0, 0);
-- T(YAFFS_TRACE_TRACING,
-- (TSTR("yaffs: immediate deletion of file %d" TENDSTR),
-- in->objectId));
-- in->deleted = 1;
-- in->myDev->nDeletedFiles++;
-- if (0 && in->myDev->isYaffs2) {
-- yaffs_ResizeFile(in, 0);
-- }
-- yaffs_SoftDeleteFile(in);
-- } else {
-- retVal =
-- yaffs_ChangeObjectName(in, in->myDev->unlinkedDir,
-- "unlinked", 0, 0);
-- }
-
-+ if (immediateDeletion) {
-+ retVal =
-+ yaffs_ChangeObjectName(in, in->myDev->deletedDir,
-+ _Y("deleted"), 0, 0);
-+ T(YAFFS_TRACE_TRACING,
-+ (TSTR("yaffs: immediate deletion of file %d" TENDSTR),
-+ in->objectId));
-+ in->deleted = 1;
-+ in->myDev->nDeletedFiles++;
-+ if (1 || in->myDev->isYaffs2)
-+ yaffs_ResizeFile(in, 0);
-+ yaffs_SoftDeleteFile(in);
-+ } else {
-+ retVal =
-+ yaffs_ChangeObjectName(in, in->myDev->unlinkedDir,
-+ _Y("unlinked"), 0, 0);
- }
-+
-+
- return retVal;
- }
-
--int yaffs_DeleteFile(yaffs_Object * in)
-+int yaffs_DeleteFile(yaffs_Object *in)
- {
- int retVal = YAFFS_OK;
-+ int deleted = in->deleted;
-+
-+ yaffs_ResizeFile(in, 0);
-
- if (in->nDataChunks > 0) {
-- /* Use soft deletion if there is data in the file */
-- if (!in->unlinked) {
-- retVal = yaffs_UnlinkFile(in);
-- }
-+ /* Use soft deletion if there is data in the file.
-+ * That won't be the case if it has been resized to zero.
-+ */
-+ if (!in->unlinked)
-+ retVal = yaffs_UnlinkFileIfNeeded(in);
-+
- if (retVal == YAFFS_OK && in->unlinked && !in->deleted) {
- in->deleted = 1;
-+ deleted = 1;
- in->myDev->nDeletedFiles++;
- yaffs_SoftDeleteFile(in);
- }
-- return in->deleted ? YAFFS_OK : YAFFS_FAIL;
-+ return deleted ? YAFFS_OK : YAFFS_FAIL;
- } else {
- /* The file has no data chunks so we toss it immediately */
- yaffs_FreeTnode(in->myDev, in->variant.fileVariant.top);
-@@ -5141,62 +5164,75 @@ int yaffs_DeleteFile(yaffs_Object * in)
- }
- }
-
--static int yaffs_DeleteDirectory(yaffs_Object * in)
-+static int yaffs_DeleteDirectory(yaffs_Object *in)
- {
- /* First check that the directory is empty. */
-- if (list_empty(&in->variant.directoryVariant.children)) {
-+ if (ylist_empty(&in->variant.directoryVariant.children))
- return yaffs_DoGenericObjectDeletion(in);
-- }
-
- return YAFFS_FAIL;
-
- }
-
--static int yaffs_DeleteSymLink(yaffs_Object * in)
-+static int yaffs_DeleteSymLink(yaffs_Object *in)
- {
- YFREE(in->variant.symLinkVariant.alias);
-
- return yaffs_DoGenericObjectDeletion(in);
- }
-
--static int yaffs_DeleteHardLink(yaffs_Object * in)
-+static int yaffs_DeleteHardLink(yaffs_Object *in)
- {
- /* remove this hardlink from the list assocaited with the equivalent
- * object
- */
-- list_del(&in->hardLinks);
-+ ylist_del_init(&in->hardLinks);
- return yaffs_DoGenericObjectDeletion(in);
- }
-
--static void yaffs_DestroyObject(yaffs_Object * obj)
-+int yaffs_DeleteObject(yaffs_Object *obj)
- {
-+int retVal = -1;
- switch (obj->variantType) {
- case YAFFS_OBJECT_TYPE_FILE:
-- yaffs_DeleteFile(obj);
-+ retVal = yaffs_DeleteFile(obj);
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-- yaffs_DeleteDirectory(obj);
-+ return yaffs_DeleteDirectory(obj);
- break;
- case YAFFS_OBJECT_TYPE_SYMLINK:
-- yaffs_DeleteSymLink(obj);
-+ retVal = yaffs_DeleteSymLink(obj);
- break;
- case YAFFS_OBJECT_TYPE_HARDLINK:
-- yaffs_DeleteHardLink(obj);
-+ retVal = yaffs_DeleteHardLink(obj);
- break;
- case YAFFS_OBJECT_TYPE_SPECIAL:
-- yaffs_DoGenericObjectDeletion(obj);
-+ retVal = yaffs_DoGenericObjectDeletion(obj);
- break;
- case YAFFS_OBJECT_TYPE_UNKNOWN:
-+ retVal = 0;
- break; /* should not happen. */
- }
-+
-+ return retVal;
- }
-
--static int yaffs_UnlinkWorker(yaffs_Object * obj)
-+static int yaffs_UnlinkWorker(yaffs_Object *obj)
- {
-
-+ int immediateDeletion = 0;
-+
-+#ifdef __KERNEL__
-+ if (!obj->myInode)
-+ immediateDeletion = 1;
-+#else
-+ if (obj->inUse <= 0)
-+ immediateDeletion = 1;
-+#endif
-+
- if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) {
- return yaffs_DeleteHardLink(obj);
-- } else if (!list_empty(&obj->hardLinks)) {
-+ } else if (!ylist_empty(&obj->hardLinks)) {
- /* Curve ball: We're unlinking an object that has a hardlink.
- *
- * This problem arises because we are not strictly following
-@@ -5215,24 +5251,24 @@ static int yaffs_UnlinkWorker(yaffs_Obje
- int retVal;
- YCHAR name[YAFFS_MAX_NAME_LENGTH + 1];
-
-- hl = list_entry(obj->hardLinks.next, yaffs_Object, hardLinks);
-+ hl = ylist_entry(obj->hardLinks.next, yaffs_Object, hardLinks);
-
-- list_del_init(&hl->hardLinks);
-- list_del_init(&hl->siblings);
-+ ylist_del_init(&hl->hardLinks);
-+ ylist_del_init(&hl->siblings);
-
- yaffs_GetObjectName(hl, name, YAFFS_MAX_NAME_LENGTH + 1);
-
- retVal = yaffs_ChangeObjectName(obj, hl->parent, name, 0, 0);
-
-- if (retVal == YAFFS_OK) {
-+ if (retVal == YAFFS_OK)
- retVal = yaffs_DoGenericObjectDeletion(hl);
-- }
-+
- return retVal;
-
-- } else {
-+ } else if (immediateDeletion) {
- switch (obj->variantType) {
- case YAFFS_OBJECT_TYPE_FILE:
-- return yaffs_UnlinkFile(obj);
-+ return yaffs_DeleteFile(obj);
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
- return yaffs_DeleteDirectory(obj);
-@@ -5248,21 +5284,22 @@ static int yaffs_UnlinkWorker(yaffs_Obje
- default:
- return YAFFS_FAIL;
- }
-- }
-+ } else
-+ return yaffs_ChangeObjectName(obj, obj->myDev->unlinkedDir,
-+ _Y("unlinked"), 0, 0);
- }
-
-
--static int yaffs_UnlinkObject( yaffs_Object *obj)
-+static int yaffs_UnlinkObject(yaffs_Object *obj)
- {
-
-- if (obj && obj->unlinkAllowed) {
-+ if (obj && obj->unlinkAllowed)
- return yaffs_UnlinkWorker(obj);
-- }
-
- return YAFFS_FAIL;
-
- }
--int yaffs_Unlink(yaffs_Object * dir, const YCHAR * name)
-+int yaffs_Unlink(yaffs_Object *dir, const YCHAR *name)
- {
- yaffs_Object *obj;
-
-@@ -5272,8 +5309,8 @@ int yaffs_Unlink(yaffs_Object * dir, con
-
- /*----------------------- Initialisation Scanning ---------------------- */
-
--static void yaffs_HandleShadowedObject(yaffs_Device * dev, int objId,
-- int backwardScanning)
-+static void yaffs_HandleShadowedObject(yaffs_Device *dev, int objId,
-+ int backwardScanning)
- {
- yaffs_Object *obj;
-
-@@ -5286,9 +5323,8 @@ static void yaffs_HandleShadowedObject(y
- /* Handle YAFFS2 case (backward scanning)
- * If the shadowed object exists then ignore.
- */
-- if (yaffs_FindObjectByNumber(dev, objId)) {
-+ if (yaffs_FindObjectByNumber(dev, objId))
- return;
-- }
- }
-
- /* Let's create it (if it does not exist) assuming it is a file so that it can do shrinking etc.
-@@ -5297,6 +5333,8 @@ static void yaffs_HandleShadowedObject(y
- obj =
- yaffs_FindOrCreateObjectByNumber(dev, objId,
- YAFFS_OBJECT_TYPE_FILE);
-+ if (!obj)
-+ return;
- yaffs_AddObjectToDirectory(dev->unlinkedDir, obj);
- obj->variant.fileVariant.shrinkSize = 0;
- obj->valid = 1; /* So that we don't read any other info for this file */
-@@ -5325,44 +5363,77 @@ static void yaffs_HardlinkFixup(yaffs_De
- if (in) {
- /* Add the hardlink pointers */
- hl->variant.hardLinkVariant.equivalentObject = in;
-- list_add(&hl->hardLinks, &in->hardLinks);
-+ ylist_add(&hl->hardLinks, &in->hardLinks);
- } else {
- /* Todo Need to report/handle this better.
- * Got a problem... hardlink to a non-existant object
- */
- hl->variant.hardLinkVariant.equivalentObject = NULL;
-- INIT_LIST_HEAD(&hl->hardLinks);
-+ YINIT_LIST_HEAD(&hl->hardLinks);
-
- }
--
- }
-+}
-+
-+
-
-+
-+
-+static int ybicmp(const void *a, const void *b)
-+{
-+ register int aseq = ((yaffs_BlockIndex *)a)->seq;
-+ register int bseq = ((yaffs_BlockIndex *)b)->seq;
-+ register int ablock = ((yaffs_BlockIndex *)a)->block;
-+ register int bblock = ((yaffs_BlockIndex *)b)->block;
-+ if (aseq == bseq)
-+ return ablock - bblock;
-+ else
-+ return aseq - bseq;
- }
-
-
-+struct yaffs_ShadowFixerStruct {
-+ int objectId;
-+ int shadowedId;
-+ struct yaffs_ShadowFixerStruct *next;
-+};
-+
-
-+static void yaffs_StripDeletedObjects(yaffs_Device *dev)
-+{
-+ /*
-+ * Sort out state of unlinked and deleted objects after scanning.
-+ */
-+ struct ylist_head *i;
-+ struct ylist_head *n;
-+ yaffs_Object *l;
-
-+ /* Soft delete all the unlinked files */
-+ ylist_for_each_safe(i, n,
-+ &dev->unlinkedDir->variant.directoryVariant.children) {
-+ if (i) {
-+ l = ylist_entry(i, yaffs_Object, siblings);
-+ yaffs_DeleteObject(l);
-+ }
-+ }
-
--static int ybicmp(const void *a, const void *b){
-- register int aseq = ((yaffs_BlockIndex *)a)->seq;
-- register int bseq = ((yaffs_BlockIndex *)b)->seq;
-- register int ablock = ((yaffs_BlockIndex *)a)->block;
-- register int bblock = ((yaffs_BlockIndex *)b)->block;
-- if( aseq == bseq )
-- return ablock - bblock;
-- else
-- return aseq - bseq;
-+ ylist_for_each_safe(i, n,
-+ &dev->deletedDir->variant.directoryVariant.children) {
-+ if (i) {
-+ l = ylist_entry(i, yaffs_Object, siblings);
-+ yaffs_DeleteObject(l);
-+ }
-+ }
-
- }
-
--static int yaffs_Scan(yaffs_Device * dev)
-+static int yaffs_Scan(yaffs_Device *dev)
- {
- yaffs_ExtendedTags tags;
- int blk;
- int blockIterator;
- int startIterator;
- int endIterator;
-- int nBlocksToScan = 0;
- int result;
-
- int chunk;
-@@ -5371,26 +5442,19 @@ static int yaffs_Scan(yaffs_Device * dev
- yaffs_BlockState state;
- yaffs_Object *hardList = NULL;
- yaffs_BlockInfo *bi;
-- int sequenceNumber;
-+ __u32 sequenceNumber;
- yaffs_ObjectHeader *oh;
- yaffs_Object *in;
- yaffs_Object *parent;
-- int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1;
-
- int alloc_failed = 0;
-
-+ struct yaffs_ShadowFixerStruct *shadowFixerList = NULL;
-+
-
- __u8 *chunkData;
-
-- yaffs_BlockIndex *blockIndex = NULL;
-
-- if (dev->isYaffs2) {
-- T(YAFFS_TRACE_SCAN,
-- (TSTR("yaffs_Scan is not for YAFFS2!" TENDSTR)));
-- return YAFFS_FAIL;
-- }
--
-- //TODO Throw all the yaffs2 stuuf out of yaffs_Scan since it is only for yaffs1 format.
-
- T(YAFFS_TRACE_SCAN,
- (TSTR("yaffs_Scan starts intstartblk %d intendblk %d..." TENDSTR),
-@@ -5400,12 +5464,6 @@ static int yaffs_Scan(yaffs_Device * dev
-
- dev->sequenceNumber = YAFFS_LOWEST_SEQUENCE_NUMBER;
-
-- if (dev->isYaffs2) {
-- blockIndex = YMALLOC(nBlocks * sizeof(yaffs_BlockIndex));
-- if(!blockIndex)
-- return YAFFS_FAIL;
-- }
--
- /* Scan all the blocks to determine their state */
- for (blk = dev->internalStartBlock; blk <= dev->internalEndBlock; blk++) {
- bi = yaffs_GetBlockInfo(dev, blk);
-@@ -5418,6 +5476,9 @@ static int yaffs_Scan(yaffs_Device * dev
- bi->blockState = state;
- bi->sequenceNumber = sequenceNumber;
-
-+ if (bi->sequenceNumber == YAFFS_SEQUENCE_BAD_BLOCK)
-+ bi->blockState = state = YAFFS_BLOCK_STATE_DEAD;
-+
- T(YAFFS_TRACE_SCAN_DEBUG,
- (TSTR("Block scanning block %d state %d seq %d" TENDSTR), blk,
- state, sequenceNumber));
-@@ -5430,70 +5491,21 @@ static int yaffs_Scan(yaffs_Device * dev
- (TSTR("Block empty " TENDSTR)));
- dev->nErasedBlocks++;
- dev->nFreeChunks += dev->nChunksPerBlock;
-- } else if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING) {
--
-- /* Determine the highest sequence number */
-- if (dev->isYaffs2 &&
-- sequenceNumber >= YAFFS_LOWEST_SEQUENCE_NUMBER &&
-- sequenceNumber < YAFFS_HIGHEST_SEQUENCE_NUMBER) {
--
-- blockIndex[nBlocksToScan].seq = sequenceNumber;
-- blockIndex[nBlocksToScan].block = blk;
--
-- nBlocksToScan++;
--
-- if (sequenceNumber >= dev->sequenceNumber) {
-- dev->sequenceNumber = sequenceNumber;
-- }
-- } else if (dev->isYaffs2) {
-- /* TODO: Nasty sequence number! */
-- T(YAFFS_TRACE_SCAN,
-- (TSTR
-- ("Block scanning block %d has bad sequence number %d"
-- TENDSTR), blk, sequenceNumber));
--
-- }
- }
- }
-
-- /* Sort the blocks
-- * Dungy old bubble sort for now...
-- */
-- if (dev->isYaffs2) {
-- yaffs_BlockIndex temp;
-- int i;
-- int j;
--
-- for (i = 0; i < nBlocksToScan; i++)
-- for (j = i + 1; j < nBlocksToScan; j++)
-- if (blockIndex[i].seq > blockIndex[j].seq) {
-- temp = blockIndex[j];
-- blockIndex[j] = blockIndex[i];
-- blockIndex[i] = temp;
-- }
-- }
--
-- /* Now scan the blocks looking at the data. */
-- if (dev->isYaffs2) {
-- startIterator = 0;
-- endIterator = nBlocksToScan - 1;
-- T(YAFFS_TRACE_SCAN_DEBUG,
-- (TSTR("%d blocks to be scanned" TENDSTR), nBlocksToScan));
-- } else {
-- startIterator = dev->internalStartBlock;
-- endIterator = dev->internalEndBlock;
-- }
-+ startIterator = dev->internalStartBlock;
-+ endIterator = dev->internalEndBlock;
-
- /* For each block.... */
- for (blockIterator = startIterator; !alloc_failed && blockIterator <= endIterator;
- blockIterator++) {
-
-- if (dev->isYaffs2) {
-- /* get the block to scan in the correct order */
-- blk = blockIndex[blockIterator].block;
-- } else {
-- blk = blockIterator;
-- }
-+ YYIELD();
-+
-+ YYIELD();
-+
-+ blk = blockIterator;
-
- bi = yaffs_GetBlockInfo(dev, blk);
- state = bi->blockState;
-@@ -5511,7 +5523,7 @@ static int yaffs_Scan(yaffs_Device * dev
-
- /* Let's have a good look at this chunk... */
-
-- if (!dev->isYaffs2 && tags.chunkDeleted) {
-+ if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED || tags.chunkDeleted) {
- /* YAFFS1 only...
- * A deleted chunk
- */
-@@ -5540,18 +5552,6 @@ static int yaffs_Scan(yaffs_Device * dev
- dev->allocationBlockFinder = blk;
- /* Set it to here to encourage the allocator to go forth from here. */
-
-- /* Yaffs2 sanity check:
-- * This should be the one with the highest sequence number
-- */
-- if (dev->isYaffs2
-- && (dev->sequenceNumber !=
-- bi->sequenceNumber)) {
-- T(YAFFS_TRACE_ALWAYS,
-- (TSTR
-- ("yaffs: Allocation block %d was not highest sequence id:"
-- " block seq = %d, dev seq = %d"
-- TENDSTR), blk,bi->sequenceNumber,dev->sequenceNumber));
-- }
- }
-
- dev->nFreeChunks += (dev->nChunksPerBlock - c);
-@@ -5570,11 +5570,11 @@ static int yaffs_Scan(yaffs_Device * dev
- * the same chunkId).
- */
-
-- if(!in)
-+ if (!in)
- alloc_failed = 1;
-
-- if(in){
-- if(!yaffs_PutChunkIntoFile(in, tags.chunkId, chunk,1))
-+ if (in) {
-+ if (!yaffs_PutChunkIntoFile(in, tags.chunkId, chunk, 1))
- alloc_failed = 1;
- }
-
-@@ -5617,7 +5617,7 @@ static int yaffs_Scan(yaffs_Device * dev
- * deleted, and worse still it has changed type. Delete the old object.
- */
-
-- yaffs_DestroyObject(in);
-+ yaffs_DeleteObject(in);
-
- in = 0;
- }
-@@ -5627,14 +5627,20 @@ static int yaffs_Scan(yaffs_Device * dev
- objectId,
- oh->type);
-
-- if(!in)
-+ if (!in)
- alloc_failed = 1;
-
- if (in && oh->shadowsObject > 0) {
-- yaffs_HandleShadowedObject(dev,
-- oh->
-- shadowsObject,
-- 0);
-+
-+ struct yaffs_ShadowFixerStruct *fixer;
-+ fixer = YMALLOC(sizeof(struct yaffs_ShadowFixerStruct));
-+ if (fixer) {
-+ fixer->next = shadowFixerList;
-+ shadowFixerList = fixer;
-+ fixer->objectId = tags.objectId;
-+ fixer->shadowedId = oh->shadowsObject;
-+ }
-+
- }
-
- if (in && in->valid) {
-@@ -5643,12 +5649,10 @@ static int yaffs_Scan(yaffs_Device * dev
- unsigned existingSerial = in->serial;
- unsigned newSerial = tags.serialNumber;
-
-- if (dev->isYaffs2 ||
-- ((existingSerial + 1) & 3) ==
-- newSerial) {
-+ if (((existingSerial + 1) & 3) == newSerial) {
- /* Use new one - destroy the exisiting one */
- yaffs_DeleteChunk(dev,
-- in->chunkId,
-+ in->hdrChunk,
- 1, __LINE__);
- in->valid = 0;
- } else {
-@@ -5681,7 +5685,8 @@ static int yaffs_Scan(yaffs_Device * dev
- in->yst_ctime = oh->yst_ctime;
- in->yst_rdev = oh->yst_rdev;
- #endif
-- in->chunkId = chunk;
-+ in->hdrChunk = chunk;
-+ in->serial = tags.serialNumber;
-
- } else if (in && !in->valid) {
- /* we need to load this info */
-@@ -5705,7 +5710,8 @@ static int yaffs_Scan(yaffs_Device * dev
- in->yst_ctime = oh->yst_ctime;
- in->yst_rdev = oh->yst_rdev;
- #endif
-- in->chunkId = chunk;
-+ in->hdrChunk = chunk;
-+ in->serial = tags.serialNumber;
-
- yaffs_SetObjectName(in, oh->name);
- in->dirty = 0;
-@@ -5718,25 +5724,25 @@ static int yaffs_Scan(yaffs_Device * dev
- yaffs_FindOrCreateObjectByNumber
- (dev, oh->parentObjectId,
- YAFFS_OBJECT_TYPE_DIRECTORY);
-- if (parent->variantType ==
-+ if (!parent)
-+ alloc_failed = 1;
-+ if (parent && parent->variantType ==
- YAFFS_OBJECT_TYPE_UNKNOWN) {
- /* Set up as a directory */
- parent->variantType =
-- YAFFS_OBJECT_TYPE_DIRECTORY;
-- INIT_LIST_HEAD(&parent->variant.
-- directoryVariant.
-- children);
-- } else if (parent->variantType !=
-- YAFFS_OBJECT_TYPE_DIRECTORY)
-- {
-+ YAFFS_OBJECT_TYPE_DIRECTORY;
-+ YINIT_LIST_HEAD(&parent->variant.
-+ directoryVariant.
-+ children);
-+ } else if (!parent || parent->variantType !=
-+ YAFFS_OBJECT_TYPE_DIRECTORY) {
- /* Hoosterman, another problem....
- * We're trying to use a non-directory as a directory
- */
-
- T(YAFFS_TRACE_ERROR,
- (TSTR
-- ("yaffs tragedy: attempting to use non-directory as"
-- " a directory in scan. Put in lost+found."
-+ ("yaffs tragedy: attempting to use non-directory as a directory in scan. Put in lost+found."
- TENDSTR)));
- parent = dev->lostNFoundDir;
- }
-@@ -5760,15 +5766,6 @@ static int yaffs_Scan(yaffs_Device * dev
- /* Todo got a problem */
- break;
- case YAFFS_OBJECT_TYPE_FILE:
-- if (dev->isYaffs2
-- && oh->isShrink) {
-- /* Prune back the shrunken chunks */
-- yaffs_PruneResizedChunks
-- (in, oh->fileSize);
-- /* Mark the block as having a shrinkHeader */
-- bi->hasShrinkHeader = 1;
-- }
--
- if (dev->useHeaderFileSize)
-
- in->variant.fileVariant.
-@@ -5778,11 +5775,11 @@ static int yaffs_Scan(yaffs_Device * dev
- break;
- case YAFFS_OBJECT_TYPE_HARDLINK:
- in->variant.hardLinkVariant.
-- equivalentObjectId =
-- oh->equivalentObjectId;
-+ equivalentObjectId =
-+ oh->equivalentObjectId;
- in->hardLinks.next =
-- (struct list_head *)
-- hardList;
-+ (struct ylist_head *)
-+ hardList;
- hardList = in;
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-@@ -5794,15 +5791,17 @@ static int yaffs_Scan(yaffs_Device * dev
- case YAFFS_OBJECT_TYPE_SYMLINK:
- in->variant.symLinkVariant.alias =
- yaffs_CloneString(oh->alias);
-- if(!in->variant.symLinkVariant.alias)
-+ if (!in->variant.symLinkVariant.alias)
- alloc_failed = 1;
- break;
- }
-
-+/*
- if (parent == dev->deletedDir) {
- yaffs_DestroyObject(in);
- bi->hasShrinkHeader = 1;
- }
-+*/
- }
- }
- }
-@@ -5823,10 +5822,6 @@ static int yaffs_Scan(yaffs_Device * dev
-
- }
-
-- if (blockIndex) {
-- YFREE(blockIndex);
-- }
--
-
- /* Ok, we've done all the scanning.
- * Fix up the hard link chains.
-@@ -5834,32 +5829,36 @@ static int yaffs_Scan(yaffs_Device * dev
- * hardlinks.
- */
-
-- yaffs_HardlinkFixup(dev,hardList);
-+ yaffs_HardlinkFixup(dev, hardList);
-
-- /* Handle the unlinked files. Since they were left in an unlinked state we should
-- * just delete them.
-- */
-+ /* Fix up any shadowed objects */
- {
-- struct list_head *i;
-- struct list_head *n;
-+ struct yaffs_ShadowFixerStruct *fixer;
-+ yaffs_Object *obj;
-
-- yaffs_Object *l;
-- /* Soft delete all the unlinked files */
-- list_for_each_safe(i, n,
-- &dev->unlinkedDir->variant.directoryVariant.
-- children) {
-- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-- yaffs_DestroyObject(l);
-- }
-+ while (shadowFixerList) {
-+ fixer = shadowFixerList;
-+ shadowFixerList = fixer->next;
-+ /* Complete the rename transaction by deleting the shadowed object
-+ * then setting the object header to unshadowed.
-+ */
-+ obj = yaffs_FindObjectByNumber(dev, fixer->shadowedId);
-+ if (obj)
-+ yaffs_DeleteObject(obj);
-+
-+ obj = yaffs_FindObjectByNumber(dev, fixer->objectId);
-+
-+ if (obj)
-+ yaffs_UpdateObjectHeader(obj, NULL, 1, 0, 0);
-+
-+ YFREE(fixer);
- }
- }
-
- yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__);
-
-- if(alloc_failed){
-+ if (alloc_failed)
- return YAFFS_FAIL;
-- }
-
- T(YAFFS_TRACE_SCAN, (TSTR("yaffs_Scan ends" TENDSTR)));
-
-@@ -5871,25 +5870,27 @@ static void yaffs_CheckObjectDetailsLoad
- {
- __u8 *chunkData;
- yaffs_ObjectHeader *oh;
-- yaffs_Device *dev = in->myDev;
-+ yaffs_Device *dev;
- yaffs_ExtendedTags tags;
- int result;
- int alloc_failed = 0;
-
-- if(!in)
-+ if (!in)
- return;
-
-+ dev = in->myDev;
-+
- #if 0
-- T(YAFFS_TRACE_SCAN,(TSTR("details for object %d %s loaded" TENDSTR),
-+ T(YAFFS_TRACE_SCAN, (TSTR("details for object %d %s loaded" TENDSTR),
- in->objectId,
- in->lazyLoaded ? "not yet" : "already"));
- #endif
-
-- if(in->lazyLoaded){
-+ if (in->lazyLoaded && in->hdrChunk > 0) {
- in->lazyLoaded = 0;
- chunkData = yaffs_GetTempBuffer(dev, __LINE__);
-
-- result = yaffs_ReadChunkWithTagsFromNAND(dev,in->chunkId,chunkData,&tags);
-+ result = yaffs_ReadChunkWithTagsFromNAND(dev, in->hdrChunk, chunkData, &tags);
- oh = (yaffs_ObjectHeader *) chunkData;
-
- in->yst_mode = oh->yst_mode;
-@@ -5911,18 +5912,18 @@ static void yaffs_CheckObjectDetailsLoad
- #endif
- yaffs_SetObjectName(in, oh->name);
-
-- if(in->variantType == YAFFS_OBJECT_TYPE_SYMLINK){
-- in->variant.symLinkVariant.alias =
-+ if (in->variantType == YAFFS_OBJECT_TYPE_SYMLINK) {
-+ in->variant.symLinkVariant.alias =
- yaffs_CloneString(oh->alias);
-- if(!in->variant.symLinkVariant.alias)
-+ if (!in->variant.symLinkVariant.alias)
- alloc_failed = 1; /* Not returned to caller */
- }
-
-- yaffs_ReleaseTempBuffer(dev,chunkData, __LINE__);
-+ yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__);
- }
- }
-
--static int yaffs_ScanBackwards(yaffs_Device * dev)
-+static int yaffs_ScanBackwards(yaffs_Device *dev)
- {
- yaffs_ExtendedTags tags;
- int blk;
-@@ -5938,7 +5939,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- yaffs_BlockState state;
- yaffs_Object *hardList = NULL;
- yaffs_BlockInfo *bi;
-- int sequenceNumber;
-+ __u32 sequenceNumber;
- yaffs_ObjectHeader *oh;
- yaffs_Object *in;
- yaffs_Object *parent;
-@@ -5972,12 +5973,12 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- blockIndex = YMALLOC(nBlocks * sizeof(yaffs_BlockIndex));
-
-- if(!blockIndex) {
-+ if (!blockIndex) {
- blockIndex = YMALLOC_ALT(nBlocks * sizeof(yaffs_BlockIndex));
- altBlockIndex = 1;
- }
-
-- if(!blockIndex) {
-+ if (!blockIndex) {
- T(YAFFS_TRACE_SCAN,
- (TSTR("yaffs_Scan() could not allocate block index!" TENDSTR)));
- return YAFFS_FAIL;
-@@ -5999,15 +6000,17 @@ static int yaffs_ScanBackwards(yaffs_Dev
- bi->blockState = state;
- bi->sequenceNumber = sequenceNumber;
-
-- if(bi->sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA)
-+ if (bi->sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA)
- bi->blockState = state = YAFFS_BLOCK_STATE_CHECKPOINT;
-+ if (bi->sequenceNumber == YAFFS_SEQUENCE_BAD_BLOCK)
-+ bi->blockState = state = YAFFS_BLOCK_STATE_DEAD;
-
- T(YAFFS_TRACE_SCAN_DEBUG,
- (TSTR("Block scanning block %d state %d seq %d" TENDSTR), blk,
- state, sequenceNumber));
-
-
-- if(state == YAFFS_BLOCK_STATE_CHECKPOINT){
-+ if (state == YAFFS_BLOCK_STATE_CHECKPOINT) {
- dev->blocksInCheckpoint++;
-
- } else if (state == YAFFS_BLOCK_STATE_DEAD) {
-@@ -6021,8 +6024,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- } else if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING) {
-
- /* Determine the highest sequence number */
-- if (dev->isYaffs2 &&
-- sequenceNumber >= YAFFS_LOWEST_SEQUENCE_NUMBER &&
-+ if (sequenceNumber >= YAFFS_LOWEST_SEQUENCE_NUMBER &&
- sequenceNumber < YAFFS_HIGHEST_SEQUENCE_NUMBER) {
-
- blockIndex[nBlocksToScan].seq = sequenceNumber;
-@@ -6030,10 +6032,9 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- nBlocksToScan++;
-
-- if (sequenceNumber >= dev->sequenceNumber) {
-+ if (sequenceNumber >= dev->sequenceNumber)
- dev->sequenceNumber = sequenceNumber;
-- }
-- } else if (dev->isYaffs2) {
-+ } else {
- /* TODO: Nasty sequence number! */
- T(YAFFS_TRACE_SCAN,
- (TSTR
-@@ -6053,11 +6054,13 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- /* Sort the blocks */
- #ifndef CONFIG_YAFFS_USE_OWN_SORT
-- yaffs_qsort(blockIndex, nBlocksToScan,
-- sizeof(yaffs_BlockIndex), ybicmp);
-+ {
-+ /* Use qsort now. */
-+ yaffs_qsort(blockIndex, nBlocksToScan, sizeof(yaffs_BlockIndex), ybicmp);
-+ }
- #else
- {
-- /* Dungy old bubble sort... */
-+ /* Dungy old bubble sort... */
-
- yaffs_BlockIndex temp;
- int i;
-@@ -6075,7 +6078,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- YYIELD();
-
-- T(YAFFS_TRACE_SCAN, (TSTR("...done" TENDSTR)));
-+ T(YAFFS_TRACE_SCAN, (TSTR("...done" TENDSTR)));
-
- /* Now scan the blocks looking at the data. */
- startIterator = 0;
-@@ -6085,10 +6088,10 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- /* For each block.... backwards */
- for (blockIterator = endIterator; !alloc_failed && blockIterator >= startIterator;
-- blockIterator--) {
-- /* Cooperative multitasking! This loop can run for so
-+ blockIterator--) {
-+ /* Cooperative multitasking! This loop can run for so
- long that watchdog timers expire. */
-- YYIELD();
-+ YYIELD();
-
- /* get the block to scan in the correct order */
- blk = blockIndex[blockIterator].block;
-@@ -6127,10 +6130,8 @@ static int yaffs_ScanBackwards(yaffs_Dev
- * this is the one being allocated from
- */
-
-- if(foundChunksInBlock)
-- {
-+ if (foundChunksInBlock) {
- /* This is a chunk that was skipped due to failing the erased check */
--
- } else if (c == 0) {
- /* We're looking at the first chunk in the block so the block is unused */
- state = YAFFS_BLOCK_STATE_EMPTY;
-@@ -6138,7 +6139,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- } else {
- if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING ||
- state == YAFFS_BLOCK_STATE_ALLOCATING) {
-- if(dev->sequenceNumber == bi->sequenceNumber) {
-+ if (dev->sequenceNumber == bi->sequenceNumber) {
- /* this is the block being allocated from */
-
- T(YAFFS_TRACE_SCAN,
-@@ -6150,27 +6151,31 @@ static int yaffs_ScanBackwards(yaffs_Dev
- dev->allocationBlock = blk;
- dev->allocationPage = c;
- dev->allocationBlockFinder = blk;
-- }
-- else {
-+ } else {
- /* This is a partially written block that is not
- * the current allocation block. This block must have
- * had a write failure, so set up for retirement.
- */
-
-- bi->needsRetiring = 1;
-+ /* bi->needsRetiring = 1; ??? TODO */
- bi->gcPrioritise = 1;
-
- T(YAFFS_TRACE_ALWAYS,
-- (TSTR("Partially written block %d being set for retirement" TENDSTR),
-+ (TSTR("Partially written block %d detected" TENDSTR),
- blk));
- }
--
- }
--
- }
-
- dev->nFreeChunks++;
-
-+ } else if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED) {
-+ T(YAFFS_TRACE_SCAN,
-+ (TSTR(" Unfixed ECC in chunk(%d:%d), chunk ignored"TENDSTR),
-+ blk, c));
-+
-+ dev->nFreeChunks++;
-+
- } else if (tags.chunkId > 0) {
- /* chunkId > 0 so it is a data chunk... */
- unsigned int endpos;
-@@ -6187,7 +6192,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- tags.
- objectId,
- YAFFS_OBJECT_TYPE_FILE);
-- if(!in){
-+ if (!in) {
- /* Out of memory */
- alloc_failed = 1;
- }
-@@ -6197,8 +6202,8 @@ static int yaffs_ScanBackwards(yaffs_Dev
- && chunkBase <
- in->variant.fileVariant.shrinkSize) {
- /* This has not been invalidated by a resize */
-- if(!yaffs_PutChunkIntoFile(in, tags.chunkId,
-- chunk, -1)){
-+ if (!yaffs_PutChunkIntoFile(in, tags.chunkId,
-+ chunk, -1)) {
- alloc_failed = 1;
- }
-
-@@ -6221,7 +6226,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- scannedFileSize;
- }
-
-- } else if(in) {
-+ } else if (in) {
- /* This chunk has been invalidated by a resize, so delete */
- yaffs_DeleteChunk(dev, chunk, 1, __LINE__);
-
-@@ -6242,6 +6247,8 @@ static int yaffs_ScanBackwards(yaffs_Dev
- in = yaffs_FindOrCreateObjectByNumber
- (dev, tags.objectId,
- tags.extraObjectType);
-+ if (!in)
-+ alloc_failed = 1;
- }
-
- if (!in ||
-@@ -6251,8 +6258,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- tags.extraShadows ||
- (!in->valid &&
- (tags.objectId == YAFFS_OBJECTID_ROOT ||
-- tags.objectId == YAFFS_OBJECTID_LOSTNFOUND))
-- ) {
-+ tags.objectId == YAFFS_OBJECTID_LOSTNFOUND))) {
-
- /* If we don't have valid info then we need to read the chunk
- * TODO In future we can probably defer reading the chunk and
-@@ -6266,8 +6272,17 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- oh = (yaffs_ObjectHeader *) chunkData;
-
-- if (!in)
-+ if (dev->inbandTags) {
-+ /* Fix up the header if they got corrupted by inband tags */
-+ oh->shadowsObject = oh->inbandShadowsObject;
-+ oh->isShrink = oh->inbandIsShrink;
-+ }
-+
-+ if (!in) {
- in = yaffs_FindOrCreateObjectByNumber(dev, tags.objectId, oh->type);
-+ if (!in)
-+ alloc_failed = 1;
-+ }
-
- }
-
-@@ -6275,10 +6290,9 @@ static int yaffs_ScanBackwards(yaffs_Dev
- /* TODO Hoosterman we have a problem! */
- T(YAFFS_TRACE_ERROR,
- (TSTR
-- ("yaffs tragedy: Could not make object for object %d "
-- "at chunk %d during scan"
-+ ("yaffs tragedy: Could not make object for object %d at chunk %d during scan"
- TENDSTR), tags.objectId, chunk));
--
-+ continue;
- }
-
- if (in->valid) {
-@@ -6289,10 +6303,9 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- if ((in->variantType == YAFFS_OBJECT_TYPE_FILE) &&
- ((oh &&
-- oh-> type == YAFFS_OBJECT_TYPE_FILE)||
-+ oh->type == YAFFS_OBJECT_TYPE_FILE) ||
- (tags.extraHeaderInfoAvailable &&
-- tags.extraObjectType == YAFFS_OBJECT_TYPE_FILE))
-- ) {
-+ tags.extraObjectType == YAFFS_OBJECT_TYPE_FILE))) {
- __u32 thisSize =
- (oh) ? oh->fileSize : tags.
- extraFileLength;
-@@ -6300,7 +6313,9 @@ static int yaffs_ScanBackwards(yaffs_Dev
- (oh) ? oh->
- parentObjectId : tags.
- extraParentObjectId;
-- unsigned isShrink =
-+
-+
-+ isShrink =
- (oh) ? oh->isShrink : tags.
- extraIsShrinkHeader;
-
-@@ -6323,9 +6338,8 @@ static int yaffs_ScanBackwards(yaffs_Dev
- thisSize;
- }
-
-- if (isShrink) {
-+ if (isShrink)
- bi->hasShrinkHeader = 1;
-- }
-
- }
- /* Use existing - destroy this one. */
-@@ -6333,6 +6347,17 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- }
-
-+ if (!in->valid && in->variantType !=
-+ (oh ? oh->type : tags.extraObjectType))
-+ T(YAFFS_TRACE_ERROR, (
-+ TSTR("yaffs tragedy: Bad object type, "
-+ TCONT("%d != %d, for object %d at chunk ")
-+ TCONT("%d during scan")
-+ TENDSTR), oh ?
-+ oh->type : tags.extraObjectType,
-+ in->variantType, tags.objectId,
-+ chunk));
-+
- if (!in->valid &&
- (tags.objectId == YAFFS_OBJECTID_ROOT ||
- tags.objectId ==
-@@ -6340,7 +6365,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- /* We only load some info, don't fiddle with directory structure */
- in->valid = 1;
-
-- if(oh) {
-+ if (oh) {
- in->variantType = oh->type;
-
- in->yst_mode = oh->yst_mode;
-@@ -6365,15 +6390,15 @@ static int yaffs_ScanBackwards(yaffs_Dev
- in->lazyLoaded = 1;
- }
-
-- in->chunkId = chunk;
-+ in->hdrChunk = chunk;
-
- } else if (!in->valid) {
- /* we need to load this info */
-
- in->valid = 1;
-- in->chunkId = chunk;
-+ in->hdrChunk = chunk;
-
-- if(oh) {
-+ if (oh) {
- in->variantType = oh->type;
-
- in->yst_mode = oh->yst_mode;
-@@ -6403,20 +6428,19 @@ static int yaffs_ScanBackwards(yaffs_Dev
- yaffs_SetObjectName(in, oh->name);
- parent =
- yaffs_FindOrCreateObjectByNumber
-- (dev, oh->parentObjectId,
-- YAFFS_OBJECT_TYPE_DIRECTORY);
-+ (dev, oh->parentObjectId,
-+ YAFFS_OBJECT_TYPE_DIRECTORY);
-
- fileSize = oh->fileSize;
-- isShrink = oh->isShrink;
-+ isShrink = oh->isShrink;
- equivalentObjectId = oh->equivalentObjectId;
-
-- }
-- else {
-+ } else {
- in->variantType = tags.extraObjectType;
- parent =
- yaffs_FindOrCreateObjectByNumber
-- (dev, tags.extraParentObjectId,
-- YAFFS_OBJECT_TYPE_DIRECTORY);
-+ (dev, tags.extraParentObjectId,
-+ YAFFS_OBJECT_TYPE_DIRECTORY);
- fileSize = tags.extraFileLength;
- isShrink = tags.extraIsShrinkHeader;
- equivalentObjectId = tags.extraEquivalentObjectId;
-@@ -6425,29 +6449,30 @@ static int yaffs_ScanBackwards(yaffs_Dev
- }
- in->dirty = 0;
-
-+ if (!parent)
-+ alloc_failed = 1;
-+
- /* directory stuff...
- * hook up to parent
- */
-
-- if (parent->variantType ==
-+ if (parent && parent->variantType ==
- YAFFS_OBJECT_TYPE_UNKNOWN) {
- /* Set up as a directory */
- parent->variantType =
-- YAFFS_OBJECT_TYPE_DIRECTORY;
-- INIT_LIST_HEAD(&parent->variant.
-- directoryVariant.
-- children);
-- } else if (parent->variantType !=
-- YAFFS_OBJECT_TYPE_DIRECTORY)
-- {
-+ YAFFS_OBJECT_TYPE_DIRECTORY;
-+ YINIT_LIST_HEAD(&parent->variant.
-+ directoryVariant.
-+ children);
-+ } else if (!parent || parent->variantType !=
-+ YAFFS_OBJECT_TYPE_DIRECTORY) {
- /* Hoosterman, another problem....
- * We're trying to use a non-directory as a directory
- */
-
- T(YAFFS_TRACE_ERROR,
- (TSTR
-- ("yaffs tragedy: attempting to use non-directory as"
-- " a directory in scan. Put in lost+found."
-+ ("yaffs tragedy: attempting to use non-directory as a directory in scan. Put in lost+found."
- TENDSTR)));
- parent = dev->lostNFoundDir;
- }
-@@ -6494,12 +6519,12 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- break;
- case YAFFS_OBJECT_TYPE_HARDLINK:
-- if(!itsUnlinked) {
-- in->variant.hardLinkVariant.equivalentObjectId =
-- equivalentObjectId;
-- in->hardLinks.next =
-- (struct list_head *) hardList;
-- hardList = in;
-+ if (!itsUnlinked) {
-+ in->variant.hardLinkVariant.equivalentObjectId =
-+ equivalentObjectId;
-+ in->hardLinks.next =
-+ (struct ylist_head *) hardList;
-+ hardList = in;
- }
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-@@ -6509,12 +6534,11 @@ static int yaffs_ScanBackwards(yaffs_Dev
- /* Do nothing */
- break;
- case YAFFS_OBJECT_TYPE_SYMLINK:
-- if(oh){
-- in->variant.symLinkVariant.alias =
-- yaffs_CloneString(oh->
-- alias);
-- if(!in->variant.symLinkVariant.alias)
-- alloc_failed = 1;
-+ if (oh) {
-+ in->variant.symLinkVariant.alias =
-+ yaffs_CloneString(oh->alias);
-+ if (!in->variant.symLinkVariant.alias)
-+ alloc_failed = 1;
- }
- break;
- }
-@@ -6551,75 +6575,129 @@ static int yaffs_ScanBackwards(yaffs_Dev
- * We should now have scanned all the objects, now it's time to add these
- * hardlinks.
- */
-- yaffs_HardlinkFixup(dev,hardList);
-+ yaffs_HardlinkFixup(dev, hardList);
-
-
-- /*
-- * Sort out state of unlinked and deleted objects.
-- */
-- {
-- struct list_head *i;
-- struct list_head *n;
-+ yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__);
-
-- yaffs_Object *l;
-+ if (alloc_failed)
-+ return YAFFS_FAIL;
-
-- /* Soft delete all the unlinked files */
-- list_for_each_safe(i, n,
-- &dev->unlinkedDir->variant.directoryVariant.
-- children) {
-- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-- yaffs_DestroyObject(l);
-- }
-- }
-+ T(YAFFS_TRACE_SCAN, (TSTR("yaffs_ScanBackwards ends" TENDSTR)));
-
-- /* Soft delete all the deletedDir files */
-- list_for_each_safe(i, n,
-- &dev->deletedDir->variant.directoryVariant.
-- children) {
-- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-- yaffs_DestroyObject(l);
-+ return YAFFS_OK;
-+}
-
-- }
-+/*------------------------------ Directory Functions ----------------------------- */
-+
-+static void yaffs_VerifyObjectInDirectory(yaffs_Object *obj)
-+{
-+ struct ylist_head *lh;
-+ yaffs_Object *listObj;
-+
-+ int count = 0;
-+
-+ if (!obj) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("No object to verify" TENDSTR)));
-+ YBUG();
-+ return;
-+ }
-+
-+ if (yaffs_SkipVerification(obj->myDev))
-+ return;
-+
-+ if (!obj->parent) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Object does not have parent" TENDSTR)));
-+ YBUG();
-+ return;
-+ }
-+
-+ if (obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Parent is not directory" TENDSTR)));
-+ YBUG();
-+ }
-+
-+ /* Iterate through the objects in each hash entry */
-+
-+ ylist_for_each(lh, &obj->parent->variant.directoryVariant.children) {
-+ if (lh) {
-+ listObj = ylist_entry(lh, yaffs_Object, siblings);
-+ yaffs_VerifyObject(listObj);
-+ if (obj == listObj)
-+ count++;
- }
-+ }
-+
-+ if (count != 1) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Object in directory %d times" TENDSTR), count));
-+ YBUG();
- }
-+}
-
-- yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__);
-+static void yaffs_VerifyDirectory(yaffs_Object *directory)
-+{
-+ struct ylist_head *lh;
-+ yaffs_Object *listObj;
-
-- if(alloc_failed){
-- return YAFFS_FAIL;
-+ if (!directory) {
-+ YBUG();
-+ return;
- }
-
-- T(YAFFS_TRACE_SCAN, (TSTR("yaffs_ScanBackwards ends" TENDSTR)));
-+ if (yaffs_SkipFullVerification(directory->myDev))
-+ return;
-
-- return YAFFS_OK;
-+ if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Directory has wrong type: %d" TENDSTR), directory->variantType));
-+ YBUG();
-+ }
-+
-+ /* Iterate through the objects in each hash entry */
-+
-+ ylist_for_each(lh, &directory->variant.directoryVariant.children) {
-+ if (lh) {
-+ listObj = ylist_entry(lh, yaffs_Object, siblings);
-+ if (listObj->parent != directory) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Object in directory list has wrong parent %p" TENDSTR), listObj->parent));
-+ YBUG();
-+ }
-+ yaffs_VerifyObjectInDirectory(listObj);
-+ }
-+ }
- }
-
--/*------------------------------ Directory Functions ----------------------------- */
-
--static void yaffs_RemoveObjectFromDirectory(yaffs_Object * obj)
-+static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj)
- {
- yaffs_Device *dev = obj->myDev;
-+ yaffs_Object *parent;
-+
-+ yaffs_VerifyObjectInDirectory(obj);
-+ parent = obj->parent;
-+
-+ yaffs_VerifyDirectory(parent);
-
-- if(dev && dev->removeObjectCallback)
-+ if (dev && dev->removeObjectCallback)
- dev->removeObjectCallback(obj);
-
-- list_del_init(&obj->siblings);
-+
-+ ylist_del_init(&obj->siblings);
- obj->parent = NULL;
-+
-+ yaffs_VerifyDirectory(parent);
- }
-
-
--static void yaffs_AddObjectToDirectory(yaffs_Object * directory,
-- yaffs_Object * obj)
-+static void yaffs_AddObjectToDirectory(yaffs_Object *directory,
-+ yaffs_Object *obj)
- {
--
- if (!directory) {
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
- ("tragedy: Trying to add an object to a null pointer directory"
- TENDSTR)));
- YBUG();
-+ return;
- }
- if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
-@@ -6631,37 +6709,42 @@ static void yaffs_AddObjectToDirectory(y
-
- if (obj->siblings.prev == NULL) {
- /* Not initialised */
-- INIT_LIST_HEAD(&obj->siblings);
--
-- } else if (!list_empty(&obj->siblings)) {
-- /* If it is holed up somewhere else, un hook it */
-- yaffs_RemoveObjectFromDirectory(obj);
-+ YBUG();
- }
-+
-+
-+ yaffs_VerifyDirectory(directory);
-+
-+ yaffs_RemoveObjectFromDirectory(obj);
-+
-+
- /* Now add it */
-- list_add(&obj->siblings, &directory->variant.directoryVariant.children);
-+ ylist_add(&obj->siblings, &directory->variant.directoryVariant.children);
- obj->parent = directory;
-
- if (directory == obj->myDev->unlinkedDir
-- || directory == obj->myDev->deletedDir) {
-+ || directory == obj->myDev->deletedDir) {
- obj->unlinked = 1;
- obj->myDev->nUnlinkedFiles++;
- obj->renameAllowed = 0;
- }
-+
-+ yaffs_VerifyDirectory(directory);
-+ yaffs_VerifyObjectInDirectory(obj);
- }
-
--yaffs_Object *yaffs_FindObjectByName(yaffs_Object * directory,
-- const YCHAR * name)
-+yaffs_Object *yaffs_FindObjectByName(yaffs_Object *directory,
-+ const YCHAR *name)
- {
- int sum;
-
-- struct list_head *i;
-+ struct ylist_head *i;
- YCHAR buffer[YAFFS_MAX_NAME_LENGTH + 1];
-
- yaffs_Object *l;
-
-- if (!name) {
-+ if (!name)
- return NULL;
-- }
-
- if (!directory) {
- T(YAFFS_TRACE_ALWAYS,
-@@ -6669,6 +6752,7 @@ yaffs_Object *yaffs_FindObjectByName(yaf
- ("tragedy: yaffs_FindObjectByName: null pointer directory"
- TENDSTR)));
- YBUG();
-+ return NULL;
- }
- if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
-@@ -6679,28 +6763,27 @@ yaffs_Object *yaffs_FindObjectByName(yaf
-
- sum = yaffs_CalcNameSum(name);
-
-- list_for_each(i, &directory->variant.directoryVariant.children) {
-+ ylist_for_each(i, &directory->variant.directoryVariant.children) {
- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-+ l = ylist_entry(i, yaffs_Object, siblings);
-+
-+ if (l->parent != directory)
-+ YBUG();
-
- yaffs_CheckObjectDetailsLoaded(l);
-
- /* Special case for lost-n-found */
- if (l->objectId == YAFFS_OBJECTID_LOSTNFOUND) {
-- if (yaffs_strcmp(name, YAFFS_LOSTNFOUND_NAME) == 0) {
-+ if (yaffs_strcmp(name, YAFFS_LOSTNFOUND_NAME) == 0)
- return l;
-- }
-- } else if (yaffs_SumCompare(l->sum, sum) || l->chunkId <= 0)
-- {
-- /* LostnFound cunk called Objxxx
-+ } else if (yaffs_SumCompare(l->sum, sum) || l->hdrChunk <= 0) {
-+ /* LostnFound chunk called Objxxx
- * Do a real check
- */
- yaffs_GetObjectName(l, buffer,
- YAFFS_MAX_NAME_LENGTH);
-- if (yaffs_strncmp(name, buffer,YAFFS_MAX_NAME_LENGTH) == 0) {
-+ if (yaffs_strncmp(name, buffer, YAFFS_MAX_NAME_LENGTH) == 0)
- return l;
-- }
--
- }
- }
- }
-@@ -6710,10 +6793,10 @@ yaffs_Object *yaffs_FindObjectByName(yaf
-
-
- #if 0
--int yaffs_ApplyToDirectoryChildren(yaffs_Object * theDir,
-- int (*fn) (yaffs_Object *))
-+int yaffs_ApplyToDirectoryChildren(yaffs_Object *theDir,
-+ int (*fn) (yaffs_Object *))
- {
-- struct list_head *i;
-+ struct ylist_head *i;
- yaffs_Object *l;
-
- if (!theDir) {
-@@ -6722,20 +6805,21 @@ int yaffs_ApplyToDirectoryChildren(yaffs
- ("tragedy: yaffs_FindObjectByName: null pointer directory"
- TENDSTR)));
- YBUG();
-+ return YAFFS_FAIL;
- }
- if (theDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
- ("tragedy: yaffs_FindObjectByName: non-directory" TENDSTR)));
- YBUG();
-+ return YAFFS_FAIL;
- }
-
-- list_for_each(i, &theDir->variant.directoryVariant.children) {
-+ ylist_for_each(i, &theDir->variant.directoryVariant.children) {
- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-- if (l && !fn(l)) {
-+ l = ylist_entry(i, yaffs_Object, siblings);
-+ if (l && !fn(l))
- return YAFFS_FAIL;
-- }
- }
- }
-
-@@ -6748,7 +6832,7 @@ int yaffs_ApplyToDirectoryChildren(yaffs
- * actual object.
- */
-
--yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object * obj)
-+yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj)
- {
- if (obj && obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) {
- /* We want the object id of the equivalent object, not this one */
-@@ -6756,10 +6840,9 @@ yaffs_Object *yaffs_GetEquivalentObject(
- yaffs_CheckObjectDetailsLoaded(obj);
- }
- return obj;
--
- }
-
--int yaffs_GetObjectName(yaffs_Object * obj, YCHAR * name, int buffSize)
-+int yaffs_GetObjectName(yaffs_Object *obj, YCHAR *name, int buffSize)
- {
- memset(name, 0, buffSize * sizeof(YCHAR));
-
-@@ -6767,18 +6850,26 @@ int yaffs_GetObjectName(yaffs_Object * o
-
- if (obj->objectId == YAFFS_OBJECTID_LOSTNFOUND) {
- yaffs_strncpy(name, YAFFS_LOSTNFOUND_NAME, buffSize - 1);
-- } else if (obj->chunkId <= 0) {
-+ } else if (obj->hdrChunk <= 0) {
- YCHAR locName[20];
-+ YCHAR numString[20];
-+ YCHAR *x = &numString[19];
-+ unsigned v = obj->objectId;
-+ numString[19] = 0;
-+ while (v > 0) {
-+ x--;
-+ *x = '0' + (v % 10);
-+ v /= 10;
-+ }
- /* make up a name */
-- yaffs_sprintf(locName, _Y("%s%d"), YAFFS_LOSTNFOUND_PREFIX,
-- obj->objectId);
-+ yaffs_strcpy(locName, YAFFS_LOSTNFOUND_PREFIX);
-+ yaffs_strcat(locName, x);
- yaffs_strncpy(name, locName, buffSize - 1);
-
- }
- #ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM
-- else if (obj->shortName[0]) {
-+ else if (obj->shortName[0])
- yaffs_strcpy(name, obj->shortName);
-- }
- #endif
- else {
- int result;
-@@ -6788,9 +6879,9 @@ int yaffs_GetObjectName(yaffs_Object * o
-
- memset(buffer, 0, obj->myDev->nDataBytesPerChunk);
-
-- if (obj->chunkId >= 0) {
-+ if (obj->hdrChunk > 0) {
- result = yaffs_ReadChunkWithTagsFromNAND(obj->myDev,
-- obj->chunkId, buffer,
-+ obj->hdrChunk, buffer,
- NULL);
- }
- yaffs_strncpy(name, oh->name, buffSize - 1);
-@@ -6801,46 +6892,43 @@ int yaffs_GetObjectName(yaffs_Object * o
- return yaffs_strlen(name);
- }
-
--int yaffs_GetObjectFileLength(yaffs_Object * obj)
-+int yaffs_GetObjectFileLength(yaffs_Object *obj)
- {
--
- /* Dereference any hard linking */
- obj = yaffs_GetEquivalentObject(obj);
-
-- if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) {
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE)
- return obj->variant.fileVariant.fileSize;
-- }
-- if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK) {
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
- return yaffs_strlen(obj->variant.symLinkVariant.alias);
-- } else {
-+ else {
- /* Only a directory should drop through to here */
- return obj->myDev->nDataBytesPerChunk;
- }
- }
-
--int yaffs_GetObjectLinkCount(yaffs_Object * obj)
-+int yaffs_GetObjectLinkCount(yaffs_Object *obj)
- {
- int count = 0;
-- struct list_head *i;
-+ struct ylist_head *i;
-
-- if (!obj->unlinked) {
-- count++; /* the object itself */
-- }
-- list_for_each(i, &obj->hardLinks) {
-- count++; /* add the hard links; */
-- }
-- return count;
-+ if (!obj->unlinked)
-+ count++; /* the object itself */
-+
-+ ylist_for_each(i, &obj->hardLinks)
-+ count++; /* add the hard links; */
-
-+ return count;
- }
-
--int yaffs_GetObjectInode(yaffs_Object * obj)
-+int yaffs_GetObjectInode(yaffs_Object *obj)
- {
- obj = yaffs_GetEquivalentObject(obj);
-
- return obj->objectId;
- }
-
--unsigned yaffs_GetObjectType(yaffs_Object * obj)
-+unsigned yaffs_GetObjectType(yaffs_Object *obj)
- {
- obj = yaffs_GetEquivalentObject(obj);
-
-@@ -6872,19 +6960,18 @@ unsigned yaffs_GetObjectType(yaffs_Objec
- }
- }
-
--YCHAR *yaffs_GetSymlinkAlias(yaffs_Object * obj)
-+YCHAR *yaffs_GetSymlinkAlias(yaffs_Object *obj)
- {
- obj = yaffs_GetEquivalentObject(obj);
-- if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK) {
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
- return yaffs_CloneString(obj->variant.symLinkVariant.alias);
-- } else {
-+ else
- return yaffs_CloneString(_Y(""));
-- }
- }
-
- #ifndef CONFIG_YAFFS_WINCE
-
--int yaffs_SetAttributes(yaffs_Object * obj, struct iattr *attr)
-+int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr)
- {
- unsigned int valid = attr->ia_valid;
-
-@@ -6910,7 +6997,7 @@ int yaffs_SetAttributes(yaffs_Object * o
- return YAFFS_OK;
-
- }
--int yaffs_GetAttributes(yaffs_Object * obj, struct iattr *attr)
-+int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr)
- {
- unsigned int valid = 0;
-
-@@ -6934,13 +7021,12 @@ int yaffs_GetAttributes(yaffs_Object * o
- attr->ia_valid = valid;
-
- return YAFFS_OK;
--
- }
-
- #endif
-
- #if 0
--int yaffs_DumpObject(yaffs_Object * obj)
-+int yaffs_DumpObject(yaffs_Object *obj)
- {
- YCHAR name[257];
-
-@@ -6951,7 +7037,7 @@ int yaffs_DumpObject(yaffs_Object * obj)
- ("Object %d, inode %d \"%s\"\n dirty %d valid %d serial %d sum %d"
- " chunk %d type %d size %d\n"
- TENDSTR), obj->objectId, yaffs_GetObjectInode(obj), name,
-- obj->dirty, obj->valid, obj->serial, obj->sum, obj->chunkId,
-+ obj->dirty, obj->valid, obj->serial, obj->sum, obj->hdrChunk,
- yaffs_GetObjectType(obj), yaffs_GetObjectFileLength(obj)));
-
- return YAFFS_OK;
-@@ -6960,7 +7046,7 @@ int yaffs_DumpObject(yaffs_Object * obj)
-
- /*---------------------------- Initialisation code -------------------------------------- */
-
--static int yaffs_CheckDevFunctions(const yaffs_Device * dev)
-+static int yaffs_CheckDevFunctions(const yaffs_Device *dev)
- {
-
- /* Common functions, gotta have */
-@@ -7011,7 +7097,7 @@ static int yaffs_CreateInitialDirectorie
- yaffs_CreateFakeDirectory(dev, YAFFS_OBJECTID_LOSTNFOUND,
- YAFFS_LOSTNFOUND_MODE | S_IFDIR);
-
-- if(dev->lostNFoundDir && dev->rootDir && dev->unlinkedDir && dev->deletedDir){
-+ if (dev->lostNFoundDir && dev->rootDir && dev->unlinkedDir && dev->deletedDir) {
- yaffs_AddObjectToDirectory(dev->rootDir, dev->lostNFoundDir);
- return YAFFS_OK;
- }
-@@ -7019,7 +7105,7 @@ static int yaffs_CreateInitialDirectorie
- return YAFFS_FAIL;
- }
-
--int yaffs_GutsInitialise(yaffs_Device * dev)
-+int yaffs_GutsInitialise(yaffs_Device *dev)
- {
- int init_failed = 0;
- unsigned x;
-@@ -7040,6 +7126,8 @@ int yaffs_GutsInitialise(yaffs_Device *
- dev->chunkOffset = 0;
- dev->nFreeChunks = 0;
-
-+ dev->gcBlock = -1;
-+
- if (dev->startBlock == 0) {
- dev->internalStartBlock = dev->startBlock + 1;
- dev->internalEndBlock = dev->endBlock + 1;
-@@ -7049,18 +7137,18 @@ int yaffs_GutsInitialise(yaffs_Device *
-
- /* Check geometry parameters. */
-
-- if ((dev->isYaffs2 && dev->nDataBytesPerChunk < 1024) ||
-- (!dev->isYaffs2 && dev->nDataBytesPerChunk != 512) ||
-+ if ((!dev->inbandTags && dev->isYaffs2 && dev->totalBytesPerChunk < 1024) ||
-+ (!dev->isYaffs2 && dev->totalBytesPerChunk < 512) ||
-+ (dev->inbandTags && !dev->isYaffs2) ||
- dev->nChunksPerBlock < 2 ||
- dev->nReservedBlocks < 2 ||
- dev->internalStartBlock <= 0 ||
- dev->internalEndBlock <= 0 ||
-- dev->internalEndBlock <= (dev->internalStartBlock + dev->nReservedBlocks + 2) // otherwise it is too small
-- ) {
-+ dev->internalEndBlock <= (dev->internalStartBlock + dev->nReservedBlocks + 2)) { /* otherwise it is too small */
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
-- ("yaffs: NAND geometry problems: chunk size %d, type is yaffs%s "
-- TENDSTR), dev->nDataBytesPerChunk, dev->isYaffs2 ? "2" : ""));
-+ ("yaffs: NAND geometry problems: chunk size %d, type is yaffs%s, inbandTags %d "
-+ TENDSTR), dev->totalBytesPerChunk, dev->isYaffs2 ? "2" : "", dev->inbandTags));
- return YAFFS_FAIL;
- }
-
-@@ -7070,6 +7158,12 @@ int yaffs_GutsInitialise(yaffs_Device *
- return YAFFS_FAIL;
- }
-
-+ /* Sort out space for inband tags, if required */
-+ if (dev->inbandTags)
-+ dev->nDataBytesPerChunk = dev->totalBytesPerChunk - sizeof(yaffs_PackedTags2TagsPart);
-+ else
-+ dev->nDataBytesPerChunk = dev->totalBytesPerChunk;
-+
- /* Got the right mix of functions? */
- if (!yaffs_CheckDevFunctions(dev)) {
- /* Function missing */
-@@ -7097,31 +7191,18 @@ int yaffs_GutsInitialise(yaffs_Device *
-
- dev->isMounted = 1;
-
--
--
- /* OK now calculate a few things for the device */
-
- /*
- * Calculate all the chunk size manipulation numbers:
- */
-- /* Start off assuming it is a power of 2 */
-- dev->chunkShift = ShiftDiv(dev->nDataBytesPerChunk);
-- dev->chunkMask = (1<<dev->chunkShift) - 1;
--
-- if(dev->nDataBytesPerChunk == (dev->chunkMask + 1)){
-- /* Yes it is a power of 2, disable crumbs */
-- dev->crumbMask = 0;
-- dev->crumbShift = 0;
-- dev->crumbsPerChunk = 0;
-- } else {
-- /* Not a power of 2, use crumbs instead */
-- dev->crumbShift = ShiftDiv(sizeof(yaffs_PackedTags2TagsPart));
-- dev->crumbMask = (1<<dev->crumbShift)-1;
-- dev->crumbsPerChunk = dev->nDataBytesPerChunk/(1 << dev->crumbShift);
-- dev->chunkShift = 0;
-- dev->chunkMask = 0;
-- }
--
-+ x = dev->nDataBytesPerChunk;
-+ /* We always use dev->chunkShift and dev->chunkDiv */
-+ dev->chunkShift = Shifts(x);
-+ x >>= dev->chunkShift;
-+ dev->chunkDiv = x;
-+ /* We only use chunk mask if chunkDiv is 1 */
-+ dev->chunkMask = (1<<dev->chunkShift) - 1;
-
- /*
- * Calculate chunkGroupBits.
-@@ -7133,16 +7214,15 @@ int yaffs_GutsInitialise(yaffs_Device *
- bits = ShiftsGE(x);
-
- /* Set up tnode width if wide tnodes are enabled. */
-- if(!dev->wideTnodesDisabled){
-+ if (!dev->wideTnodesDisabled) {
- /* bits must be even so that we end up with 32-bit words */
-- if(bits & 1)
-+ if (bits & 1)
- bits++;
-- if(bits < 16)
-+ if (bits < 16)
- dev->tnodeWidth = 16;
- else
- dev->tnodeWidth = bits;
-- }
-- else
-+ } else
- dev->tnodeWidth = 16;
-
- dev->tnodeMask = (1<<dev->tnodeWidth)-1;
-@@ -7193,7 +7273,7 @@ int yaffs_GutsInitialise(yaffs_Device *
- dev->hasPendingPrioritisedGCs = 1; /* Assume the worst for now, will get fixed on first GC */
-
- /* Initialise temporary buffers and caches. */
-- if(!yaffs_InitialiseTempBuffers(dev))
-+ if (!yaffs_InitialiseTempBuffers(dev))
- init_failed = 1;
-
- dev->srCache = NULL;
-@@ -7203,25 +7283,26 @@ int yaffs_GutsInitialise(yaffs_Device *
- if (!init_failed &&
- dev->nShortOpCaches > 0) {
- int i;
-- __u8 *buf;
-+ void *buf;
- int srCacheBytes = dev->nShortOpCaches * sizeof(yaffs_ChunkCache);
-
-- if (dev->nShortOpCaches > YAFFS_MAX_SHORT_OP_CACHES) {
-+ if (dev->nShortOpCaches > YAFFS_MAX_SHORT_OP_CACHES)
- dev->nShortOpCaches = YAFFS_MAX_SHORT_OP_CACHES;
-- }
-
-- buf = dev->srCache = YMALLOC(srCacheBytes);
-+ dev->srCache = YMALLOC(srCacheBytes);
-
-- if(dev->srCache)
-- memset(dev->srCache,0,srCacheBytes);
-+ buf = (__u8 *) dev->srCache;
-+
-+ if (dev->srCache)
-+ memset(dev->srCache, 0, srCacheBytes);
-
- for (i = 0; i < dev->nShortOpCaches && buf; i++) {
- dev->srCache[i].object = NULL;
- dev->srCache[i].lastUse = 0;
- dev->srCache[i].dirty = 0;
-- dev->srCache[i].data = buf = YMALLOC_DMA(dev->nDataBytesPerChunk);
-+ dev->srCache[i].data = buf = YMALLOC_DMA(dev->totalBytesPerChunk);
- }
-- if(!buf)
-+ if (!buf)
- init_failed = 1;
-
- dev->srLastUse = 0;
-@@ -7229,29 +7310,30 @@ int yaffs_GutsInitialise(yaffs_Device *
-
- dev->cacheHits = 0;
-
-- if(!init_failed){
-+ if (!init_failed) {
- dev->gcCleanupList = YMALLOC(dev->nChunksPerBlock * sizeof(__u32));
-- if(!dev->gcCleanupList)
-+ if (!dev->gcCleanupList)
- init_failed = 1;
- }
-
-- if (dev->isYaffs2) {
-+ if (dev->isYaffs2)
- dev->useHeaderFileSize = 1;
-- }
-- if(!init_failed && !yaffs_InitialiseBlocks(dev))
-+
-+ if (!init_failed && !yaffs_InitialiseBlocks(dev))
- init_failed = 1;
-
- yaffs_InitialiseTnodes(dev);
- yaffs_InitialiseObjects(dev);
-
-- if(!init_failed && !yaffs_CreateInitialDirectories(dev))
-+ if (!init_failed && !yaffs_CreateInitialDirectories(dev))
- init_failed = 1;
-
-
-- if(!init_failed){
-+ if (!init_failed) {
- /* Now scan the flash. */
- if (dev->isYaffs2) {
-- if(yaffs_CheckpointRestore(dev)) {
-+ if (yaffs_CheckpointRestore(dev)) {
-+ yaffs_CheckObjectDetailsLoaded(dev->rootDir);
- T(YAFFS_TRACE_ALWAYS,
- (TSTR("yaffs: restored from checkpoint" TENDSTR)));
- } else {
-@@ -7273,24 +7355,25 @@ int yaffs_GutsInitialise(yaffs_Device *
- dev->nBackgroundDeletions = 0;
- dev->oldestDirtySequence = 0;
-
-- if(!init_failed && !yaffs_InitialiseBlocks(dev))
-+ if (!init_failed && !yaffs_InitialiseBlocks(dev))
- init_failed = 1;
-
- yaffs_InitialiseTnodes(dev);
- yaffs_InitialiseObjects(dev);
-
-- if(!init_failed && !yaffs_CreateInitialDirectories(dev))
-+ if (!init_failed && !yaffs_CreateInitialDirectories(dev))
- init_failed = 1;
-
-- if(!init_failed && !yaffs_ScanBackwards(dev))
-+ if (!init_failed && !yaffs_ScanBackwards(dev))
- init_failed = 1;
- }
-- }else
-- if(!yaffs_Scan(dev))
-+ } else if (!yaffs_Scan(dev))
- init_failed = 1;
-+
-+ yaffs_StripDeletedObjects(dev);
- }
-
-- if(init_failed){
-+ if (init_failed) {
- /* Clean up the mess */
- T(YAFFS_TRACE_TRACING,
- (TSTR("yaffs: yaffs_GutsInitialise() aborted.\n" TENDSTR)));
-@@ -7318,7 +7401,7 @@ int yaffs_GutsInitialise(yaffs_Device *
-
- }
-
--void yaffs_Deinitialise(yaffs_Device * dev)
-+void yaffs_Deinitialise(yaffs_Device *dev)
- {
- if (dev->isMounted) {
- int i;
-@@ -7330,7 +7413,7 @@ void yaffs_Deinitialise(yaffs_Device * d
- dev->srCache) {
-
- for (i = 0; i < dev->nShortOpCaches; i++) {
-- if(dev->srCache[i].data)
-+ if (dev->srCache[i].data)
- YFREE(dev->srCache[i].data);
- dev->srCache[i].data = NULL;
- }
-@@ -7341,16 +7424,17 @@ void yaffs_Deinitialise(yaffs_Device * d
-
- YFREE(dev->gcCleanupList);
-
-- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
-+ for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++)
- YFREE(dev->tempBuffer[i].buffer);
-- }
-
- dev->isMounted = 0;
-- }
-
-+ if (dev->deinitialiseNAND)
-+ dev->deinitialiseNAND(dev);
-+ }
- }
-
--static int yaffs_CountFreeChunks(yaffs_Device * dev)
-+static int yaffs_CountFreeChunks(yaffs_Device *dev)
- {
- int nFree;
- int b;
-@@ -7358,7 +7442,7 @@ static int yaffs_CountFreeChunks(yaffs_D
- yaffs_BlockInfo *blk;
-
- for (nFree = 0, b = dev->internalStartBlock; b <= dev->internalEndBlock;
-- b++) {
-+ b++) {
- blk = yaffs_GetBlockInfo(dev, b);
-
- switch (blk->blockState) {
-@@ -7373,19 +7457,19 @@ static int yaffs_CountFreeChunks(yaffs_D
- default:
- break;
- }
--
- }
-
- return nFree;
- }
-
--int yaffs_GetNumberOfFreeChunks(yaffs_Device * dev)
-+int yaffs_GetNumberOfFreeChunks(yaffs_Device *dev)
- {
- /* This is what we report to the outside world */
-
- int nFree;
- int nDirtyCacheChunks;
- int blocksForCheckpoint;
-+ int i;
-
- #if 1
- nFree = dev->nFreeChunks;
-@@ -7397,12 +7481,9 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De
-
- /* Now count the number of dirty chunks in the cache and subtract those */
-
-- {
-- int i;
-- for (nDirtyCacheChunks = 0, i = 0; i < dev->nShortOpCaches; i++) {
-- if (dev->srCache[i].dirty)
-- nDirtyCacheChunks++;
-- }
-+ for (nDirtyCacheChunks = 0, i = 0; i < dev->nShortOpCaches; i++) {
-+ if (dev->srCache[i].dirty)
-+ nDirtyCacheChunks++;
- }
-
- nFree -= nDirtyCacheChunks;
-@@ -7410,8 +7491,8 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De
- nFree -= ((dev->nReservedBlocks + 1) * dev->nChunksPerBlock);
-
- /* Now we figure out how much to reserve for the checkpoint and report that... */
-- blocksForCheckpoint = dev->nCheckpointReservedBlocks - dev->blocksInCheckpoint;
-- if(blocksForCheckpoint < 0)
-+ blocksForCheckpoint = yaffs_CalcCheckpointBlocksRequired(dev) - dev->blocksInCheckpoint;
-+ if (blocksForCheckpoint < 0)
- blocksForCheckpoint = 0;
-
- nFree -= (blocksForCheckpoint * dev->nChunksPerBlock);
-@@ -7425,12 +7506,12 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De
-
- static int yaffs_freeVerificationFailures;
-
--static void yaffs_VerifyFreeChunks(yaffs_Device * dev)
-+static void yaffs_VerifyFreeChunks(yaffs_Device *dev)
- {
- int counted;
- int difference;
-
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
- counted = yaffs_CountFreeChunks(dev);
-@@ -7447,23 +7528,25 @@ static void yaffs_VerifyFreeChunks(yaffs
-
- /*---------------------------------------- YAFFS test code ----------------------*/
-
--#define yaffs_CheckStruct(structure,syze, name) \
-- if(sizeof(structure) != syze) \
-- { \
-- T(YAFFS_TRACE_ALWAYS,(TSTR("%s should be %d but is %d\n" TENDSTR),\
-- name,syze,sizeof(structure))); \
-- return YAFFS_FAIL; \
-- }
-+#define yaffs_CheckStruct(structure, syze, name) \
-+ do { \
-+ if (sizeof(structure) != syze) { \
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("%s should be %d but is %d\n" TENDSTR),\
-+ name, syze, sizeof(structure))); \
-+ return YAFFS_FAIL; \
-+ } \
-+ } while (0)
-
- static int yaffs_CheckStructures(void)
- {
--/* yaffs_CheckStruct(yaffs_Tags,8,"yaffs_Tags") */
--/* yaffs_CheckStruct(yaffs_TagsUnion,8,"yaffs_TagsUnion") */
--/* yaffs_CheckStruct(yaffs_Spare,16,"yaffs_Spare") */
-+/* yaffs_CheckStruct(yaffs_Tags,8,"yaffs_Tags"); */
-+/* yaffs_CheckStruct(yaffs_TagsUnion,8,"yaffs_TagsUnion"); */
-+/* yaffs_CheckStruct(yaffs_Spare,16,"yaffs_Spare"); */
- #ifndef CONFIG_YAFFS_TNODE_LIST_DEBUG
-- yaffs_CheckStruct(yaffs_Tnode, 2 * YAFFS_NTNODES_LEVEL0, "yaffs_Tnode")
-+ yaffs_CheckStruct(yaffs_Tnode, 2 * YAFFS_NTNODES_LEVEL0, "yaffs_Tnode");
- #endif
-- yaffs_CheckStruct(yaffs_ObjectHeader, 512, "yaffs_ObjectHeader")
--
-- return YAFFS_OK;
-+#ifndef CONFIG_YAFFS_WINCE
-+ yaffs_CheckStruct(yaffs_ObjectHeader, 512, "yaffs_ObjectHeader");
-+#endif
-+ return YAFFS_OK;
- }
---- a/fs/yaffs2/yaffs_guts.h
-+++ b/fs/yaffs2/yaffs_guts.h
-@@ -90,7 +90,7 @@
-
- #define YAFFS_MAX_SHORT_OP_CACHES 20
-
--#define YAFFS_N_TEMP_BUFFERS 4
-+#define YAFFS_N_TEMP_BUFFERS 6
-
- /* We limit the number attempts at sucessfully saving a chunk of data.
- * Small-page devices have 32 pages per block; large-page devices have 64.
-@@ -108,6 +108,9 @@
- #define YAFFS_LOWEST_SEQUENCE_NUMBER 0x00001000
- #define YAFFS_HIGHEST_SEQUENCE_NUMBER 0xEFFFFF00
-
-+/* Special sequence number for bad block that failed to be marked bad */
-+#define YAFFS_SEQUENCE_BAD_BLOCK 0xFFFF0000
-+
- /* ChunkCache is used for short read/write operations.*/
- typedef struct {
- struct yaffs_ObjectStruct *object;
-@@ -134,11 +137,10 @@ typedef struct {
- typedef struct {
- unsigned chunkId:20;
- unsigned serialNumber:2;
-- unsigned byteCount:10;
-+ unsigned byteCountLSB:10;
- unsigned objectId:18;
- unsigned ecc:12;
-- unsigned unusedStuff:2;
--
-+ unsigned byteCountMSB:2;
- } yaffs_Tags;
-
- typedef union {
-@@ -277,13 +279,13 @@ typedef struct {
-
- int softDeletions:10; /* number of soft deleted pages */
- int pagesInUse:10; /* number of pages in use */
-- yaffs_BlockState blockState:4; /* One of the above block states */
-+ unsigned blockState:4; /* One of the above block states. NB use unsigned because enum is sometimes an int */
- __u32 needsRetiring:1; /* Data has failed on this block, need to get valid data off */
-- /* and retire the block. */
-- __u32 skipErasedCheck: 1; /* If this is set we can skip the erased check on this block */
-- __u32 gcPrioritise: 1; /* An ECC check or blank check has failed on this block.
-+ /* and retire the block. */
-+ __u32 skipErasedCheck:1; /* If this is set we can skip the erased check on this block */
-+ __u32 gcPrioritise:1; /* An ECC check or blank check has failed on this block.
- It should be prioritised for GC */
-- __u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */
-+ __u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */
-
- #ifdef CONFIG_YAFFS_YAFFS2
- __u32 hasShrinkHeader:1; /* This block has at least one shrink object header */
-@@ -300,11 +302,11 @@ typedef struct {
-
- /* Apply to everything */
- int parentObjectId;
-- __u16 sum__NoLongerUsed; /* checksum of name. No longer used */
-+ __u16 sum__NoLongerUsed; /* checksum of name. No longer used */
- YCHAR name[YAFFS_MAX_NAME_LENGTH + 1];
-
-- /* Thes following apply to directories, files, symlinks - not hard links */
-- __u32 yst_mode; /* protection */
-+ /* The following apply to directories, files, symlinks - not hard links */
-+ __u32 yst_mode; /* protection */
-
- #ifdef CONFIG_YAFFS_WINCE
- __u32 notForWinCE[5];
-@@ -331,11 +333,14 @@ typedef struct {
- __u32 win_ctime[2];
- __u32 win_atime[2];
- __u32 win_mtime[2];
-- __u32 roomToGrow[4];
- #else
-- __u32 roomToGrow[10];
-+ __u32 roomToGrow[6];
-+
- #endif
-+ __u32 inbandShadowsObject;
-+ __u32 inbandIsShrink;
-
-+ __u32 reservedSpace[2];
- int shadowsObject; /* This object header shadows the specified object if > 0 */
-
- /* isShrink applies to object headers written when we shrink the file (ie resize) */
-@@ -381,7 +386,7 @@ typedef struct {
- } yaffs_FileStructure;
-
- typedef struct {
-- struct list_head children; /* list of child links */
-+ struct ylist_head children; /* list of child links */
- } yaffs_DirectoryStructure;
-
- typedef struct {
-@@ -418,23 +423,24 @@ struct yaffs_ObjectStruct {
- * still in the inode cache. Free of object is defered.
- * until the inode is released.
- */
-+ __u8 beingCreated:1; /* This object is still being created so skip some checks. */
-
- __u8 serial; /* serial number of chunk in NAND. Cached here */
- __u16 sum; /* sum of the name to speed searching */
-
-- struct yaffs_DeviceStruct *myDev; /* The device I'm on */
-+ struct yaffs_DeviceStruct *myDev; /* The device I'm on */
-
-- struct list_head hashLink; /* list of objects in this hash bucket */
-+ struct ylist_head hashLink; /* list of objects in this hash bucket */
-
-- struct list_head hardLinks; /* all the equivalent hard linked objects */
-+ struct ylist_head hardLinks; /* all the equivalent hard linked objects */
-
- /* directory structure stuff */
- /* also used for linking up the free list */
- struct yaffs_ObjectStruct *parent;
-- struct list_head siblings;
-+ struct ylist_head siblings;
-
- /* Where's my object header in NAND? */
-- int chunkId;
-+ int hdrChunk;
-
- int nDataChunks; /* Number of data chunks attached to the file. */
-
-@@ -485,7 +491,7 @@ struct yaffs_ObjectList_struct {
- typedef struct yaffs_ObjectList_struct yaffs_ObjectList;
-
- typedef struct {
-- struct list_head list;
-+ struct ylist_head list;
- int count;
- } yaffs_ObjectBucket;
-
-@@ -495,11 +501,10 @@ typedef struct {
- */
-
- typedef struct {
-- int structType;
-+ int structType;
- __u32 objectId;
- __u32 parentId;
-- int chunkId;
--
-+ int hdrChunk;
- yaffs_ObjectType variantType:3;
- __u8 deleted:1;
- __u8 softDeleted:1;
-@@ -511,8 +516,7 @@ typedef struct {
-
- int nDataChunks;
- __u32 fileSizeOrEquivalentObjectId;
--
--}yaffs_CheckpointObject;
-+} yaffs_CheckpointObject;
-
- /*--------------------- Temporary buffers ----------------
- *
-@@ -528,13 +532,13 @@ typedef struct {
- /*----------------- Device ---------------------------------*/
-
- struct yaffs_DeviceStruct {
-- struct list_head devList;
-+ struct ylist_head devList;
- const char *name;
-
- /* Entry parameters set up way early. Yaffs sets up the rest.*/
- int nDataBytesPerChunk; /* Should be a power of 2 >= 512 */
- int nChunksPerBlock; /* does not need to be a power of 2 */
-- int nBytesPerSpare; /* spare area size */
-+ int spareBytesPerChunk; /* spare area size */
- int startBlock; /* Start block we're allowed to use */
- int endBlock; /* End block we're allowed to use */
- int nReservedBlocks; /* We want this tuneable so that we can reduce */
-@@ -544,9 +548,7 @@ struct yaffs_DeviceStruct {
- /* Stuff used by the shared space checkpointing mechanism */
- /* If this value is zero, then this mechanism is disabled */
-
-- int nCheckpointReservedBlocks; /* Blocks to reserve for checkpoint data */
--
--
-+/* int nCheckpointReservedBlocks; */ /* Blocks to reserve for checkpoint data */
-
-
- int nShortOpCaches; /* If <= 0, then short op caching is disabled, else
-@@ -560,30 +562,31 @@ struct yaffs_DeviceStruct {
- void *genericDevice; /* Pointer to device context
- * On an mtd this holds the mtd pointer.
- */
-- void *superBlock;
-+ void *superBlock;
-
- /* NAND access functions (Must be set before calling YAFFS)*/
-
-- int (*writeChunkToNAND) (struct yaffs_DeviceStruct * dev,
-- int chunkInNAND, const __u8 * data,
-- const yaffs_Spare * spare);
-- int (*readChunkFromNAND) (struct yaffs_DeviceStruct * dev,
-- int chunkInNAND, __u8 * data,
-- yaffs_Spare * spare);
-- int (*eraseBlockInNAND) (struct yaffs_DeviceStruct * dev,
-- int blockInNAND);
-- int (*initialiseNAND) (struct yaffs_DeviceStruct * dev);
-+ int (*writeChunkToNAND) (struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND, const __u8 *data,
-+ const yaffs_Spare *spare);
-+ int (*readChunkFromNAND) (struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND, __u8 *data,
-+ yaffs_Spare *spare);
-+ int (*eraseBlockInNAND) (struct yaffs_DeviceStruct *dev,
-+ int blockInNAND);
-+ int (*initialiseNAND) (struct yaffs_DeviceStruct *dev);
-+ int (*deinitialiseNAND) (struct yaffs_DeviceStruct *dev);
-
- #ifdef CONFIG_YAFFS_YAFFS2
-- int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct * dev,
-- int chunkInNAND, const __u8 * data,
-- const yaffs_ExtendedTags * tags);
-- int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct * dev,
-- int chunkInNAND, __u8 * data,
-- yaffs_ExtendedTags * tags);
-- int (*markNANDBlockBad) (struct yaffs_DeviceStruct * dev, int blockNo);
-- int (*queryNANDBlock) (struct yaffs_DeviceStruct * dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber);
-+ int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND, const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
-+ int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND, __u8 *data,
-+ yaffs_ExtendedTags *tags);
-+ int (*markNANDBlockBad) (struct yaffs_DeviceStruct *dev, int blockNo);
-+ int (*queryNANDBlock) (struct yaffs_DeviceStruct *dev, int blockNo,
-+ yaffs_BlockState *state, __u32 *sequenceNumber);
- #endif
-
- int isYaffs2;
-@@ -595,10 +598,12 @@ struct yaffs_DeviceStruct {
- void (*removeObjectCallback)(struct yaffs_ObjectStruct *obj);
-
- /* Callback to mark the superblock dirsty */
-- void (*markSuperBlockDirty)(void * superblock);
-+ void (*markSuperBlockDirty)(void *superblock);
-
- int wideTnodesDisabled; /* Set to disable wide tnodes */
-
-+ YCHAR *pathDividers; /* String of legal path dividers */
-+
-
- /* End of stuff that must be set before initialisation. */
-
-@@ -615,16 +620,14 @@ struct yaffs_DeviceStruct {
- __u32 tnodeWidth;
- __u32 tnodeMask;
-
-- /* Stuff to support various file offses to chunk/offset translations */
-- /* "Crumbs" for nDataBytesPerChunk not being a power of 2 */
-- __u32 crumbMask;
-- __u32 crumbShift;
-- __u32 crumbsPerChunk;
--
-- /* Straight shifting for nDataBytesPerChunk being a power of 2 */
-- __u32 chunkShift;
-- __u32 chunkMask;
--
-+ /* Stuff for figuring out file offset to chunk conversions */
-+ __u32 chunkShift; /* Shift value */
-+ __u32 chunkDiv; /* Divisor after shifting: 1 for power-of-2 sizes */
-+ __u32 chunkMask; /* Mask to use for power-of-2 case */
-+
-+ /* Stuff to handle inband tags */
-+ int inbandTags;
-+ __u32 totalBytesPerChunk;
-
- #ifdef __KERNEL__
-
-@@ -633,7 +636,7 @@ struct yaffs_DeviceStruct {
- __u8 *spareBuffer; /* For mtdif2 use. Don't know the size of the buffer
- * at compile time so we have to allocate it.
- */
-- void (*putSuperFunc) (struct super_block * sb);
-+ void (*putSuperFunc) (struct super_block *sb);
- #endif
-
- int isMounted;
-@@ -663,6 +666,8 @@ struct yaffs_DeviceStruct {
- __u32 checkpointSum;
- __u32 checkpointXor;
-
-+ int nCheckpointBlocksRequired; /* Number of blocks needed to store current checkpoint set */
-+
- /* Block Info */
- yaffs_BlockInfo *blockInfo;
- __u8 *chunkBits; /* bitmap of chunks in use */
-@@ -684,11 +689,15 @@ struct yaffs_DeviceStruct {
- yaffs_TnodeList *allocatedTnodeList;
-
- int isDoingGC;
-+ int gcBlock;
-+ int gcChunk;
-
- int nObjectsCreated;
- yaffs_Object *freeObjects;
- int nFreeObjects;
-
-+ int nHardLinks;
-+
- yaffs_ObjectList *allocatedObjectList;
-
- yaffs_ObjectBucket objectBucket[YAFFS_NOBJECT_BUCKETS];
-@@ -745,8 +754,10 @@ struct yaffs_DeviceStruct {
- int nBackgroundDeletions; /* Count of background deletions. */
-
-
-+ /* Temporary buffer management */
- yaffs_TempBuffer tempBuffer[YAFFS_N_TEMP_BUFFERS];
- int maxTemp;
-+ int tempInUse;
- int unmanagedTempAllocations;
- int unmanagedTempDeallocations;
-
-@@ -758,9 +769,9 @@ struct yaffs_DeviceStruct {
-
- typedef struct yaffs_DeviceStruct yaffs_Device;
-
--/* The static layout of bllock usage etc is stored in the super block header */
-+/* The static layout of block usage etc is stored in the super block header */
- typedef struct {
-- int StructType;
-+ int StructType;
- int version;
- int checkpointStartBlock;
- int checkpointEndBlock;
-@@ -773,7 +784,7 @@ typedef struct {
- * must be preserved over unmount/mount cycles.
- */
- typedef struct {
-- int structType;
-+ int structType;
- int nErasedBlocks;
- int allocationBlock; /* Current block being allocated off */
- __u32 allocationPage;
-@@ -791,57 +802,45 @@ typedef struct {
-
-
- typedef struct {
-- int structType;
-- __u32 magic;
-- __u32 version;
-- __u32 head;
-+ int structType;
-+ __u32 magic;
-+ __u32 version;
-+ __u32 head;
- } yaffs_CheckpointValidity;
-
--/* Function to manipulate block info */
--static Y_INLINE yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blk)
--{
-- if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) {
-- T(YAFFS_TRACE_ERROR,
-- (TSTR
-- ("**>> yaffs: getBlockInfo block %d is not valid" TENDSTR),
-- blk));
-- YBUG();
-- }
-- return &dev->blockInfo[blk - dev->internalStartBlock];
--}
-
- /*----------------------- YAFFS Functions -----------------------*/
-
--int yaffs_GutsInitialise(yaffs_Device * dev);
--void yaffs_Deinitialise(yaffs_Device * dev);
-+int yaffs_GutsInitialise(yaffs_Device *dev);
-+void yaffs_Deinitialise(yaffs_Device *dev);
-
--int yaffs_GetNumberOfFreeChunks(yaffs_Device * dev);
-+int yaffs_GetNumberOfFreeChunks(yaffs_Device *dev);
-
--int yaffs_RenameObject(yaffs_Object * oldDir, const YCHAR * oldName,
-- yaffs_Object * newDir, const YCHAR * newName);
-+int yaffs_RenameObject(yaffs_Object *oldDir, const YCHAR *oldName,
-+ yaffs_Object *newDir, const YCHAR *newName);
-
--int yaffs_Unlink(yaffs_Object * dir, const YCHAR * name);
--int yaffs_DeleteFile(yaffs_Object * obj);
-+int yaffs_Unlink(yaffs_Object *dir, const YCHAR *name);
-+int yaffs_DeleteObject(yaffs_Object *obj);
-
--int yaffs_GetObjectName(yaffs_Object * obj, YCHAR * name, int buffSize);
--int yaffs_GetObjectFileLength(yaffs_Object * obj);
--int yaffs_GetObjectInode(yaffs_Object * obj);
--unsigned yaffs_GetObjectType(yaffs_Object * obj);
--int yaffs_GetObjectLinkCount(yaffs_Object * obj);
-+int yaffs_GetObjectName(yaffs_Object *obj, YCHAR *name, int buffSize);
-+int yaffs_GetObjectFileLength(yaffs_Object *obj);
-+int yaffs_GetObjectInode(yaffs_Object *obj);
-+unsigned yaffs_GetObjectType(yaffs_Object *obj);
-+int yaffs_GetObjectLinkCount(yaffs_Object *obj);
-
--int yaffs_SetAttributes(yaffs_Object * obj, struct iattr *attr);
--int yaffs_GetAttributes(yaffs_Object * obj, struct iattr *attr);
-+int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr);
-+int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr);
-
- /* File operations */
--int yaffs_ReadDataFromFile(yaffs_Object * obj, __u8 * buffer, loff_t offset,
-- int nBytes);
--int yaffs_WriteDataToFile(yaffs_Object * obj, const __u8 * buffer, loff_t offset,
-- int nBytes, int writeThrough);
--int yaffs_ResizeFile(yaffs_Object * obj, loff_t newSize);
--
--yaffs_Object *yaffs_MknodFile(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid);
--int yaffs_FlushFile(yaffs_Object * obj, int updateTime);
-+int yaffs_ReadDataFromFile(yaffs_Object *obj, __u8 *buffer, loff_t offset,
-+ int nBytes);
-+int yaffs_WriteDataToFile(yaffs_Object *obj, const __u8 *buffer, loff_t offset,
-+ int nBytes, int writeThrough);
-+int yaffs_ResizeFile(yaffs_Object *obj, loff_t newSize);
-+
-+yaffs_Object *yaffs_MknodFile(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid);
-+int yaffs_FlushFile(yaffs_Object *obj, int updateTime);
-
- /* Flushing and checkpointing */
- void yaffs_FlushEntireDeviceCache(yaffs_Device *dev);
-@@ -850,33 +849,33 @@ int yaffs_CheckpointSave(yaffs_Device *d
- int yaffs_CheckpointRestore(yaffs_Device *dev);
-
- /* Directory operations */
--yaffs_Object *yaffs_MknodDirectory(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid);
--yaffs_Object *yaffs_FindObjectByName(yaffs_Object * theDir, const YCHAR * name);
--int yaffs_ApplyToDirectoryChildren(yaffs_Object * theDir,
-+yaffs_Object *yaffs_MknodDirectory(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid);
-+yaffs_Object *yaffs_FindObjectByName(yaffs_Object *theDir, const YCHAR *name);
-+int yaffs_ApplyToDirectoryChildren(yaffs_Object *theDir,
- int (*fn) (yaffs_Object *));
-
--yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device * dev, __u32 number);
-+yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev, __u32 number);
-
- /* Link operations */
--yaffs_Object *yaffs_Link(yaffs_Object * parent, const YCHAR * name,
-- yaffs_Object * equivalentObject);
-+yaffs_Object *yaffs_Link(yaffs_Object *parent, const YCHAR *name,
-+ yaffs_Object *equivalentObject);
-
--yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object * obj);
-+yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj);
-
- /* Symlink operations */
--yaffs_Object *yaffs_MknodSymLink(yaffs_Object * parent, const YCHAR * name,
-+yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent, const YCHAR *name,
- __u32 mode, __u32 uid, __u32 gid,
-- const YCHAR * alias);
--YCHAR *yaffs_GetSymlinkAlias(yaffs_Object * obj);
-+ const YCHAR *alias);
-+YCHAR *yaffs_GetSymlinkAlias(yaffs_Object *obj);
-
- /* Special inodes (fifos, sockets and devices) */
--yaffs_Object *yaffs_MknodSpecial(yaffs_Object * parent, const YCHAR * name,
-+yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent, const YCHAR *name,
- __u32 mode, __u32 uid, __u32 gid, __u32 rdev);
-
- /* Special directories */
--yaffs_Object *yaffs_Root(yaffs_Device * dev);
--yaffs_Object *yaffs_LostNFound(yaffs_Device * dev);
-+yaffs_Object *yaffs_Root(yaffs_Device *dev);
-+yaffs_Object *yaffs_LostNFound(yaffs_Device *dev);
-
- #ifdef CONFIG_YAFFS_WINCE
- /* CONFIG_YAFFS_WINCE special stuff */
-@@ -885,18 +884,21 @@ void yfsd_WinFileTimeNow(__u32 target[2]
-
- #ifdef __KERNEL__
-
--void yaffs_HandleDeferedFree(yaffs_Object * obj);
-+void yaffs_HandleDeferedFree(yaffs_Object *obj);
- #endif
-
- /* Debug dump */
--int yaffs_DumpObject(yaffs_Object * obj);
-+int yaffs_DumpObject(yaffs_Object *obj);
-
--void yaffs_GutsTest(yaffs_Device * dev);
-+void yaffs_GutsTest(yaffs_Device *dev);
-
- /* A few useful functions */
--void yaffs_InitialiseTags(yaffs_ExtendedTags * tags);
--void yaffs_DeleteChunk(yaffs_Device * dev, int chunkId, int markNAND, int lyn);
--int yaffs_CheckFF(__u8 * buffer, int nBytes);
-+void yaffs_InitialiseTags(yaffs_ExtendedTags *tags);
-+void yaffs_DeleteChunk(yaffs_Device *dev, int chunkId, int markNAND, int lyn);
-+int yaffs_CheckFF(__u8 *buffer, int nBytes);
- void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi);
-
-+__u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo);
-+void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer, int lineNo);
-+
- #endif
---- a/fs/yaffs2/yaffs_mtdif1.c
-+++ b/fs/yaffs2/yaffs_mtdif1.c
-@@ -26,7 +26,7 @@
- #include "yportenv.h"
- #include "yaffs_guts.h"
- #include "yaffs_packedtags1.h"
--#include "yaffs_tagscompat.h" // for yaffs_CalcTagsECC
-+#include "yaffs_tagscompat.h" /* for yaffs_CalcTagsECC */
-
- #include "linux/kernel.h"
- #include "linux/version.h"
-@@ -34,9 +34,9 @@
- #include "linux/mtd/mtd.h"
-
- /* Don't compile this module if we don't have MTD's mtd_oob_ops interface */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
-
--const char *yaffs_mtdif1_c_version = "$Id: yaffs_mtdif1.c,v 1.3 2007/05/15 20:16:11 ian Exp $";
-+const char *yaffs_mtdif1_c_version = "$Id: yaffs_mtdif1.c,v 1.10 2009-03-09 07:41:10 charles Exp $";
-
- #ifndef CONFIG_YAFFS_9BYTE_TAGS
- # define YTAG1_SIZE 8
-@@ -89,9 +89,9 @@ static struct nand_ecclayout nand_oob_16
- * Returns YAFFS_OK or YAFFS_FAIL.
- */
- int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device *dev,
-- int chunkInNAND, const __u8 * data, const yaffs_ExtendedTags * etags)
-+ int chunkInNAND, const __u8 *data, const yaffs_ExtendedTags *etags)
- {
-- struct mtd_info * mtd = dev->genericDevice;
-+ struct mtd_info *mtd = dev->genericDevice;
- int chunkBytes = dev->nDataBytesPerChunk;
- loff_t addr = ((loff_t)chunkInNAND) * chunkBytes;
- struct mtd_oob_ops ops;
-@@ -146,7 +146,7 @@ int nandmtd1_WriteChunkWithTagsToNAND(ya
-
- /* Return with empty ExtendedTags but add eccResult.
- */
--static int rettags(yaffs_ExtendedTags * etags, int eccResult, int retval)
-+static int rettags(yaffs_ExtendedTags *etags, int eccResult, int retval)
- {
- if (etags) {
- memset(etags, 0, sizeof(*etags));
-@@ -169,9 +169,9 @@ static int rettags(yaffs_ExtendedTags *
- * Returns YAFFS_OK or YAFFS_FAIL.
- */
- int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device *dev,
-- int chunkInNAND, __u8 * data, yaffs_ExtendedTags * etags)
-+ int chunkInNAND, __u8 *data, yaffs_ExtendedTags *etags)
- {
-- struct mtd_info * mtd = dev->genericDevice;
-+ struct mtd_info *mtd = dev->genericDevice;
- int chunkBytes = dev->nDataBytesPerChunk;
- loff_t addr = ((loff_t)chunkInNAND) * chunkBytes;
- int eccres = YAFFS_ECC_RESULT_NO_ERROR;
-@@ -189,7 +189,7 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y
- ops.datbuf = data;
- ops.oobbuf = (__u8 *)&pt1;
-
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
-+#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 20))
- /* In MTD 2.6.18 to 2.6.19 nand_base.c:nand_do_read_oob() has a bug;
- * help it out with ops.len = ops.ooblen when ops.datbuf == NULL.
- */
-@@ -284,11 +284,11 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y
- */
- int nandmtd1_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo)
- {
-- struct mtd_info * mtd = dev->genericDevice;
-+ struct mtd_info *mtd = dev->genericDevice;
- int blocksize = dev->nChunksPerBlock * dev->nDataBytesPerChunk;
- int retval;
-
-- yaffs_trace(YAFFS_TRACE_BAD_BLOCKS, "marking block %d bad", blockNo);
-+ yaffs_trace(YAFFS_TRACE_BAD_BLOCKS, "marking block %d bad\n", blockNo);
-
- retval = mtd->block_markbad(mtd, (loff_t)blocksize * blockNo);
- return (retval) ? YAFFS_FAIL : YAFFS_OK;
-@@ -298,7 +298,7 @@ int nandmtd1_MarkNANDBlockBad(struct yaf
- *
- * Returns YAFFS_OK or YAFFS_FAIL.
- */
--static int nandmtd1_TestPrerequists(struct mtd_info * mtd)
-+static int nandmtd1_TestPrerequists(struct mtd_info *mtd)
- {
- /* 2.6.18 has mtd->ecclayout->oobavail */
- /* 2.6.21 has mtd->ecclayout->oobavail and mtd->oobavail */
-@@ -323,10 +323,11 @@ static int nandmtd1_TestPrerequists(stru
- * Always returns YAFFS_OK.
- */
- int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * pState, int *pSequenceNumber)
-+ yaffs_BlockState *pState, __u32 *pSequenceNumber)
- {
-- struct mtd_info * mtd = dev->genericDevice;
-+ struct mtd_info *mtd = dev->genericDevice;
- int chunkNo = blockNo * dev->nChunksPerBlock;
-+ loff_t addr = (loff_t)chunkNo * dev->nDataBytesPerChunk;
- yaffs_ExtendedTags etags;
- int state = YAFFS_BLOCK_STATE_DEAD;
- int seqnum = 0;
-@@ -335,21 +336,22 @@ int nandmtd1_QueryNANDBlock(struct yaffs
- /* We don't yet have a good place to test for MTD config prerequists.
- * Do it here as we are called during the initial scan.
- */
-- if (nandmtd1_TestPrerequists(mtd) != YAFFS_OK) {
-+ if (nandmtd1_TestPrerequists(mtd) != YAFFS_OK)
- return YAFFS_FAIL;
-- }
-
- retval = nandmtd1_ReadChunkWithTagsFromNAND(dev, chunkNo, NULL, &etags);
-+ etags.blockBad = (mtd->block_isbad)(mtd, addr);
- if (etags.blockBad) {
- yaffs_trace(YAFFS_TRACE_BAD_BLOCKS,
-- "block %d is marked bad", blockNo);
-+ "block %d is marked bad\n", blockNo);
- state = YAFFS_BLOCK_STATE_DEAD;
-- }
-- else if (etags.chunkUsed) {
-+ } else if (etags.eccResult != YAFFS_ECC_RESULT_NO_ERROR) {
-+ /* bad tags, need to look more closely */
-+ state = YAFFS_BLOCK_STATE_NEEDS_SCANNING;
-+ } else if (etags.chunkUsed) {
- state = YAFFS_BLOCK_STATE_NEEDS_SCANNING;
- seqnum = etags.sequenceNumber;
-- }
-- else {
-+ } else {
- state = YAFFS_BLOCK_STATE_EMPTY;
- }
-
-@@ -360,4 +362,4 @@ int nandmtd1_QueryNANDBlock(struct yaffs
- return YAFFS_OK;
- }
-
--#endif /*KERNEL_VERSION*/
-+#endif /*MTD_VERSION*/
---- a/fs/yaffs2/yaffs_mtdif1.h
-+++ b/fs/yaffs2/yaffs_mtdif1.h
-@@ -14,15 +14,15 @@
- #ifndef __YAFFS_MTDIF1_H__
- #define __YAFFS_MTDIF1_H__
-
--int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data, const yaffs_ExtendedTags * tags);
-+int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data, const yaffs_ExtendedTags *tags);
-
--int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * data, yaffs_ExtendedTags * tags);
-+int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *data, yaffs_ExtendedTags *tags);
-
- int nandmtd1_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo);
-
- int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber);
-+ yaffs_BlockState *state, __u32 *sequenceNumber);
-
- #endif
---- a/fs/yaffs2/yaffs_mtdif2.c
-+++ b/fs/yaffs2/yaffs_mtdif2.c
-@@ -14,7 +14,7 @@
- /* mtd interface for YAFFS2 */
-
- const char *yaffs_mtdif2_c_version =
-- "$Id: yaffs_mtdif2.c,v 1.17 2007-02-14 01:09:06 wookey Exp $";
-+ "$Id: yaffs_mtdif2.c,v 1.23 2009-03-06 17:20:53 wookey Exp $";
-
- #include "yportenv.h"
-
-@@ -27,19 +27,23 @@ const char *yaffs_mtdif2_c_version =
-
- #include "yaffs_packedtags2.h"
-
--int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags * tags)
-+/* NB For use with inband tags....
-+ * We assume that the data buffer is of size totalBytersPerChunk so that we can also
-+ * use it to load the tags.
-+ */
-+int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- struct mtd_oob_ops ops;
- #else
- size_t dummy;
- #endif
- int retval = 0;
-
-- loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk;
-+ loff_t addr;
-
- yaffs_PackedTags2 pt;
-
-@@ -48,46 +52,40 @@ int nandmtd2_WriteChunkWithTagsToNAND(ya
- ("nandmtd2_WriteChunkWithTagsToNAND chunk %d data %p tags %p"
- TENDSTR), chunkInNAND, data, tags));
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- if (tags)
-- yaffs_PackTags2(&pt, tags);
-- else
-- BUG(); /* both tags and data should always be present */
-
-- if (data) {
-- ops.mode = MTD_OOB_AUTO;
-- ops.ooblen = sizeof(pt);
-- ops.len = dev->nDataBytesPerChunk;
-- ops.ooboffs = 0;
-- ops.datbuf = (__u8 *)data;
-- ops.oobbuf = (void *)&pt;
-- retval = mtd->write_oob(mtd, addr, &ops);
-+ addr = ((loff_t) chunkInNAND) * dev->totalBytesPerChunk;
-+
-+ /* For yaffs2 writing there must be both data and tags.
-+ * If we're using inband tags, then the tags are stuffed into
-+ * the end of the data buffer.
-+ */
-+ if (!data || !tags)
-+ BUG();
-+ else if (dev->inbandTags) {
-+ yaffs_PackedTags2TagsPart *pt2tp;
-+ pt2tp = (yaffs_PackedTags2TagsPart *)(data + dev->nDataBytesPerChunk);
-+ yaffs_PackTags2TagsPart(pt2tp, tags);
- } else
-- BUG(); /* both tags and data should always be present */
--#else
-- if (tags) {
- yaffs_PackTags2(&pt, tags);
-- }
-
-- if (data && tags) {
-- if (dev->useNANDECC)
-- retval =
-- mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk,
-- &dummy, data, (__u8 *) & pt, NULL);
-- else
-- retval =
-- mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk,
-- &dummy, data, (__u8 *) & pt, NULL);
-- } else {
-- if (data)
-- retval =
-- mtd->write(mtd, addr, dev->nDataBytesPerChunk, &dummy,
-- data);
-- if (tags)
-- retval =
-- mtd->write_oob(mtd, addr, mtd->oobsize, &dummy,
-- (__u8 *) & pt);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
-+ ops.mode = MTD_OOB_AUTO;
-+ ops.ooblen = (dev->inbandTags) ? 0 : sizeof(pt);
-+ ops.len = dev->totalBytesPerChunk;
-+ ops.ooboffs = 0;
-+ ops.datbuf = (__u8 *)data;
-+ ops.oobbuf = (dev->inbandTags) ? NULL : (void *)&pt;
-+ retval = mtd->write_oob(mtd, addr, &ops);
-
-+#else
-+ if (!dev->inbandTags) {
-+ retval =
-+ mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk,
-+ &dummy, data, (__u8 *) &pt, NULL);
-+ } else {
-+ retval =
-+ mtd->write(mtd, addr, dev->totalBytesPerChunk, &dummy,
-+ data);
- }
- #endif
-
-@@ -97,17 +95,18 @@ int nandmtd2_WriteChunkWithTagsToNAND(ya
- return YAFFS_FAIL;
- }
-
--int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * data, yaffs_ExtendedTags * tags)
-+int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *data, yaffs_ExtendedTags *tags)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- struct mtd_oob_ops ops;
- #endif
- size_t dummy;
- int retval = 0;
-+ int localData = 0;
-
-- loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk;
-+ loff_t addr = ((loff_t) chunkInNAND) * dev->totalBytesPerChunk;
-
- yaffs_PackedTags2 pt;
-
-@@ -116,9 +115,20 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y
- ("nandmtd2_ReadChunkWithTagsFromNAND chunk %d data %p tags %p"
- TENDSTR), chunkInNAND, data, tags));
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- if (data && !tags)
-- retval = mtd->read(mtd, addr, dev->nDataBytesPerChunk,
-+ if (dev->inbandTags) {
-+
-+ if (!data) {
-+ localData = 1;
-+ data = yaffs_GetTempBuffer(dev, __LINE__);
-+ }
-+
-+
-+ }
-+
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
-+ if (dev->inbandTags || (data && !tags))
-+ retval = mtd->read(mtd, addr, dev->totalBytesPerChunk,
- &dummy, data);
- else if (tags) {
- ops.mode = MTD_OOB_AUTO;
-@@ -130,38 +140,42 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y
- retval = mtd->read_oob(mtd, addr, &ops);
- }
- #else
-- if (data && tags) {
-- if (dev->useNANDECC) {
-- retval =
-- mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk,
-- &dummy, data, dev->spareBuffer,
-- NULL);
-- } else {
-- retval =
-- mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk,
-+ if (!dev->inbandTags && data && tags) {
-+
-+ retval = mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk,
- &dummy, data, dev->spareBuffer,
- NULL);
-- }
- } else {
- if (data)
- retval =
- mtd->read(mtd, addr, dev->nDataBytesPerChunk, &dummy,
- data);
-- if (tags)
-+ if (!dev->inbandTags && tags)
- retval =
- mtd->read_oob(mtd, addr, mtd->oobsize, &dummy,
- dev->spareBuffer);
- }
- #endif
-
-- memcpy(&pt, dev->spareBuffer, sizeof(pt));
-
-- if (tags)
-- yaffs_UnpackTags2(tags, &pt);
-+ if (dev->inbandTags) {
-+ if (tags) {
-+ yaffs_PackedTags2TagsPart *pt2tp;
-+ pt2tp = (yaffs_PackedTags2TagsPart *)&data[dev->nDataBytesPerChunk];
-+ yaffs_UnpackTags2TagsPart(tags, pt2tp);
-+ }
-+ } else {
-+ if (tags) {
-+ memcpy(&pt, dev->spareBuffer, sizeof(pt));
-+ yaffs_UnpackTags2(tags, &pt);
-+ }
-+ }
-
-- if(tags && retval == -EBADMSG && tags->eccResult == YAFFS_ECC_RESULT_NO_ERROR)
-- tags->eccResult = YAFFS_ECC_RESULT_UNFIXED;
-+ if (localData)
-+ yaffs_ReleaseTempBuffer(dev, data, __LINE__);
-
-+ if (tags && retval == -EBADMSG && tags->eccResult == YAFFS_ECC_RESULT_NO_ERROR)
-+ tags->eccResult = YAFFS_ECC_RESULT_UNFIXED;
- if (retval == 0)
- return YAFFS_OK;
- else
-@@ -178,7 +192,7 @@ int nandmtd2_MarkNANDBlockBad(struct yaf
- retval =
- mtd->block_markbad(mtd,
- blockNo * dev->nChunksPerBlock *
-- dev->nDataBytesPerChunk);
-+ dev->totalBytesPerChunk);
-
- if (retval == 0)
- return YAFFS_OK;
-@@ -188,7 +202,7 @@ int nandmtd2_MarkNANDBlockBad(struct yaf
- }
-
- int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber)
-+ yaffs_BlockState *state, __u32 *sequenceNumber)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
- int retval;
-@@ -198,7 +212,7 @@ int nandmtd2_QueryNANDBlock(struct yaffs
- retval =
- mtd->block_isbad(mtd,
- blockNo * dev->nChunksPerBlock *
-- dev->nDataBytesPerChunk);
-+ dev->totalBytesPerChunk);
-
- if (retval) {
- T(YAFFS_TRACE_MTD, (TSTR("block is bad" TENDSTR)));
---- a/fs/yaffs2/yaffs_mtdif2.h
-+++ b/fs/yaffs2/yaffs_mtdif2.h
-@@ -17,13 +17,13 @@
- #define __YAFFS_MTDIF2_H__
-
- #include "yaffs_guts.h"
--int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags * tags);
--int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * data, yaffs_ExtendedTags * tags);
-+int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
-+int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *data, yaffs_ExtendedTags *tags);
- int nandmtd2_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo);
- int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber);
-+ yaffs_BlockState *state, __u32 *sequenceNumber);
-
- #endif
---- a/fs/yaffs2/yaffs_mtdif.c
-+++ b/fs/yaffs2/yaffs_mtdif.c
-@@ -12,7 +12,7 @@
- */
-
- const char *yaffs_mtdif_c_version =
-- "$Id: yaffs_mtdif.c,v 1.19 2007-02-14 01:09:06 wookey Exp $";
-+ "$Id: yaffs_mtdif.c,v 1.22 2009-03-06 17:20:51 wookey Exp $";
-
- #include "yportenv.h"
-
-@@ -24,7 +24,7 @@ const char *yaffs_mtdif_c_version =
- #include "linux/time.h"
- #include "linux/mtd/nand.h"
-
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18))
-+#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 18))
- static struct nand_oobinfo yaffs_oobinfo = {
- .useecc = 1,
- .eccbytes = 6,
-@@ -36,7 +36,7 @@ static struct nand_oobinfo yaffs_noeccin
- };
- #endif
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- static inline void translate_spare2oob(const yaffs_Spare *spare, __u8 *oob)
- {
- oob[0] = spare->tagByte0;
-@@ -45,8 +45,8 @@ static inline void translate_spare2oob(c
- oob[3] = spare->tagByte3;
- oob[4] = spare->tagByte4;
- oob[5] = spare->tagByte5 & 0x3f;
-- oob[5] |= spare->blockStatus == 'Y' ? 0: 0x80;
-- oob[5] |= spare->pageStatus == 0 ? 0: 0x40;
-+ oob[5] |= spare->blockStatus == 'Y' ? 0 : 0x80;
-+ oob[5] |= spare->pageStatus == 0 ? 0 : 0x40;
- oob[6] = spare->tagByte6;
- oob[7] = spare->tagByte7;
- }
-@@ -71,18 +71,18 @@ static inline void translate_oob2spare(y
- }
- #endif
-
--int nandmtd_WriteChunkToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data, const yaffs_Spare * spare)
-+int nandmtd_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data, const yaffs_Spare *spare)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- struct mtd_oob_ops ops;
- #endif
- size_t dummy;
- int retval = 0;
-
- loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk;
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- __u8 spareAsBytes[8]; /* OOB */
-
- if (data && !spare)
-@@ -135,18 +135,18 @@ int nandmtd_WriteChunkToNAND(yaffs_Devic
- return YAFFS_FAIL;
- }
-
--int nandmtd_ReadChunkFromNAND(yaffs_Device * dev, int chunkInNAND, __u8 * data,
-- yaffs_Spare * spare)
-+int nandmtd_ReadChunkFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data,
-+ yaffs_Spare *spare)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- struct mtd_oob_ops ops;
- #endif
- size_t dummy;
- int retval = 0;
-
- loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk;
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- __u8 spareAsBytes[8]; /* OOB */
-
- if (data && !spare)
-@@ -205,7 +205,7 @@ int nandmtd_ReadChunkFromNAND(yaffs_Devi
- return YAFFS_FAIL;
- }
-
--int nandmtd_EraseBlockInNAND(yaffs_Device * dev, int blockNumber)
-+int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
- __u32 addr =
-@@ -234,7 +234,7 @@ int nandmtd_EraseBlockInNAND(yaffs_Devic
- return YAFFS_FAIL;
- }
-
--int nandmtd_InitialiseNAND(yaffs_Device * dev)
-+int nandmtd_InitialiseNAND(yaffs_Device *dev)
- {
- return YAFFS_OK;
- }
---- a/fs/yaffs2/yaffs_mtdif.h
-+++ b/fs/yaffs2/yaffs_mtdif.h
-@@ -18,10 +18,15 @@
-
- #include "yaffs_guts.h"
-
--int nandmtd_WriteChunkToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data, const yaffs_Spare * spare);
--int nandmtd_ReadChunkFromNAND(yaffs_Device * dev, int chunkInNAND, __u8 * data,
-- yaffs_Spare * spare);
--int nandmtd_EraseBlockInNAND(yaffs_Device * dev, int blockNumber);
--int nandmtd_InitialiseNAND(yaffs_Device * dev);
-+#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 18))
-+extern struct nand_oobinfo yaffs_oobinfo;
-+extern struct nand_oobinfo yaffs_noeccinfo;
-+#endif
-+
-+int nandmtd_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data, const yaffs_Spare *spare);
-+int nandmtd_ReadChunkFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data,
-+ yaffs_Spare *spare);
-+int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber);
-+int nandmtd_InitialiseNAND(yaffs_Device *dev);
- #endif
---- a/fs/yaffs2/yaffs_nand.c
-+++ b/fs/yaffs2/yaffs_nand.c
-@@ -12,16 +12,17 @@
- */
-
- const char *yaffs_nand_c_version =
-- "$Id: yaffs_nand.c,v 1.7 2007-02-14 01:09:06 wookey Exp $";
-+ "$Id: yaffs_nand.c,v 1.10 2009-03-06 17:20:54 wookey Exp $";
-
- #include "yaffs_nand.h"
- #include "yaffs_tagscompat.h"
- #include "yaffs_tagsvalidity.h"
-
-+#include "yaffs_getblockinfo.h"
-
--int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * buffer,
-- yaffs_ExtendedTags * tags)
-+int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *buffer,
-+ yaffs_ExtendedTags *tags)
- {
- int result;
- yaffs_ExtendedTags localTags;
-@@ -29,7 +30,7 @@ int yaffs_ReadChunkWithTagsFromNAND(yaff
- int realignedChunkInNAND = chunkInNAND - dev->chunkOffset;
-
- /* If there are no tags provided, use local tags to get prioritised gc working */
-- if(!tags)
-+ if (!tags)
- tags = &localTags;
-
- if (dev->readChunkWithTagsFromNAND)
-@@ -40,20 +41,20 @@ int yaffs_ReadChunkWithTagsFromNAND(yaff
- realignedChunkInNAND,
- buffer,
- tags);
-- if(tags &&
-- tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR){
-+ if (tags &&
-+ tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR) {
-
- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, chunkInNAND/dev->nChunksPerBlock);
-- yaffs_HandleChunkError(dev,bi);
-+ yaffs_HandleChunkError(dev, bi);
- }
-
- return result;
- }
-
--int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev,
-+int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev,
- int chunkInNAND,
-- const __u8 * buffer,
-- yaffs_ExtendedTags * tags)
-+ const __u8 *buffer,
-+ yaffs_ExtendedTags *tags)
- {
- chunkInNAND -= dev->chunkOffset;
-
-@@ -84,7 +85,7 @@ int yaffs_WriteChunkWithTagsToNAND(yaffs
- tags);
- }
-
--int yaffs_MarkBlockBad(yaffs_Device * dev, int blockNo)
-+int yaffs_MarkBlockBad(yaffs_Device *dev, int blockNo)
- {
- blockNo -= dev->blockOffset;
-
-@@ -95,10 +96,10 @@ int yaffs_MarkBlockBad(yaffs_Device * de
- return yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo);
- }
-
--int yaffs_QueryInitialBlockState(yaffs_Device * dev,
-+int yaffs_QueryInitialBlockState(yaffs_Device *dev,
- int blockNo,
-- yaffs_BlockState * state,
-- unsigned *sequenceNumber)
-+ yaffs_BlockState *state,
-+ __u32 *sequenceNumber)
- {
- blockNo -= dev->blockOffset;
-
---- a/fs/yaffs2/yaffs_nandemul2k.h
-+++ b/fs/yaffs2/yaffs_nandemul2k.h
-@@ -21,14 +21,14 @@
- #include "yaffs_guts.h"
-
- int nandemul2k_WriteChunkWithTagsToNAND(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND, const __u8 * data,
-- yaffs_ExtendedTags * tags);
-+ int chunkInNAND, const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
- int nandemul2k_ReadChunkWithTagsFromNAND(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND, __u8 * data,
-- yaffs_ExtendedTags * tags);
-+ int chunkInNAND, __u8 *data,
-+ yaffs_ExtendedTags *tags);
- int nandemul2k_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo);
- int nandemul2k_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber);
-+ yaffs_BlockState *state, __u32 *sequenceNumber);
- int nandemul2k_EraseBlockInNAND(struct yaffs_DeviceStruct *dev,
- int blockInNAND);
- int nandemul2k_InitialiseNAND(struct yaffs_DeviceStruct *dev);
---- a/fs/yaffs2/yaffs_nand.h
-+++ b/fs/yaffs2/yaffs_nand.h
-@@ -19,21 +19,21 @@
-
-
-
--int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * buffer,
-- yaffs_ExtendedTags * tags);
--
--int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev,
-- int chunkInNAND,
-- const __u8 * buffer,
-- yaffs_ExtendedTags * tags);
--
--int yaffs_MarkBlockBad(yaffs_Device * dev, int blockNo);
--
--int yaffs_QueryInitialBlockState(yaffs_Device * dev,
-- int blockNo,
-- yaffs_BlockState * state,
-- unsigned *sequenceNumber);
-+int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *buffer,
-+ yaffs_ExtendedTags *tags);
-+
-+int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev,
-+ int chunkInNAND,
-+ const __u8 *buffer,
-+ yaffs_ExtendedTags *tags);
-+
-+int yaffs_MarkBlockBad(yaffs_Device *dev, int blockNo);
-+
-+int yaffs_QueryInitialBlockState(yaffs_Device *dev,
-+ int blockNo,
-+ yaffs_BlockState *state,
-+ unsigned *sequenceNumber);
-
- int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev,
- int blockInNAND);
---- a/fs/yaffs2/yaffs_packedtags1.c
-+++ b/fs/yaffs2/yaffs_packedtags1.c
-@@ -14,7 +14,7 @@
- #include "yaffs_packedtags1.h"
- #include "yportenv.h"
-
--void yaffs_PackTags1(yaffs_PackedTags1 * pt, const yaffs_ExtendedTags * t)
-+void yaffs_PackTags1(yaffs_PackedTags1 *pt, const yaffs_ExtendedTags *t)
- {
- pt->chunkId = t->chunkId;
- pt->serialNumber = t->serialNumber;
-@@ -27,7 +27,7 @@ void yaffs_PackTags1(yaffs_PackedTags1 *
-
- }
-
--void yaffs_UnpackTags1(yaffs_ExtendedTags * t, const yaffs_PackedTags1 * pt)
-+void yaffs_UnpackTags1(yaffs_ExtendedTags *t, const yaffs_PackedTags1 *pt)
- {
- static const __u8 allFF[] =
- { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-@@ -35,9 +35,8 @@ void yaffs_UnpackTags1(yaffs_ExtendedTag
-
- if (memcmp(allFF, pt, sizeof(yaffs_PackedTags1))) {
- t->blockBad = 0;
-- if (pt->shouldBeFF != 0xFFFFFFFF) {
-+ if (pt->shouldBeFF != 0xFFFFFFFF)
- t->blockBad = 1;
-- }
- t->chunkUsed = 1;
- t->objectId = pt->objectId;
- t->chunkId = pt->chunkId;
-@@ -47,6 +46,5 @@ void yaffs_UnpackTags1(yaffs_ExtendedTag
- t->serialNumber = pt->serialNumber;
- } else {
- memset(t, 0, sizeof(yaffs_ExtendedTags));
--
- }
- }
---- a/fs/yaffs2/yaffs_packedtags1.h
-+++ b/fs/yaffs2/yaffs_packedtags1.h
-@@ -32,6 +32,6 @@ typedef struct {
-
- } yaffs_PackedTags1;
-
--void yaffs_PackTags1(yaffs_PackedTags1 * pt, const yaffs_ExtendedTags * t);
--void yaffs_UnpackTags1(yaffs_ExtendedTags * t, const yaffs_PackedTags1 * pt);
-+void yaffs_PackTags1(yaffs_PackedTags1 *pt, const yaffs_ExtendedTags *t);
-+void yaffs_UnpackTags1(yaffs_ExtendedTags *t, const yaffs_PackedTags1 *pt);
- #endif
---- a/fs/yaffs2/yaffs_packedtags2.c
-+++ b/fs/yaffs2/yaffs_packedtags2.c
-@@ -37,60 +37,68 @@
- #define EXTRA_OBJECT_TYPE_SHIFT (28)
- #define EXTRA_OBJECT_TYPE_MASK ((0x0F) << EXTRA_OBJECT_TYPE_SHIFT)
-
--static void yaffs_DumpPackedTags2(const yaffs_PackedTags2 * pt)
-+
-+static void yaffs_DumpPackedTags2TagsPart(const yaffs_PackedTags2TagsPart *ptt)
- {
- T(YAFFS_TRACE_MTD,
- (TSTR("packed tags obj %d chunk %d byte %d seq %d" TENDSTR),
-- pt->t.objectId, pt->t.chunkId, pt->t.byteCount,
-- pt->t.sequenceNumber));
-+ ptt->objectId, ptt->chunkId, ptt->byteCount,
-+ ptt->sequenceNumber));
-+}
-+static void yaffs_DumpPackedTags2(const yaffs_PackedTags2 *pt)
-+{
-+ yaffs_DumpPackedTags2TagsPart(&pt->t);
- }
-
--static void yaffs_DumpTags2(const yaffs_ExtendedTags * t)
-+static void yaffs_DumpTags2(const yaffs_ExtendedTags *t)
- {
- T(YAFFS_TRACE_MTD,
- (TSTR
-- ("ext.tags eccres %d blkbad %d chused %d obj %d chunk%d byte "
-- "%d del %d ser %d seq %d"
-+ ("ext.tags eccres %d blkbad %d chused %d obj %d chunk%d byte %d del %d ser %d seq %d"
- TENDSTR), t->eccResult, t->blockBad, t->chunkUsed, t->objectId,
- t->chunkId, t->byteCount, t->chunkDeleted, t->serialNumber,
- t->sequenceNumber));
-
- }
-
--void yaffs_PackTags2(yaffs_PackedTags2 * pt, const yaffs_ExtendedTags * t)
-+void yaffs_PackTags2TagsPart(yaffs_PackedTags2TagsPart *ptt,
-+ const yaffs_ExtendedTags *t)
- {
-- pt->t.chunkId = t->chunkId;
-- pt->t.sequenceNumber = t->sequenceNumber;
-- pt->t.byteCount = t->byteCount;
-- pt->t.objectId = t->objectId;
-+ ptt->chunkId = t->chunkId;
-+ ptt->sequenceNumber = t->sequenceNumber;
-+ ptt->byteCount = t->byteCount;
-+ ptt->objectId = t->objectId;
-
- if (t->chunkId == 0 && t->extraHeaderInfoAvailable) {
- /* Store the extra header info instead */
- /* We save the parent object in the chunkId */
-- pt->t.chunkId = EXTRA_HEADER_INFO_FLAG
-+ ptt->chunkId = EXTRA_HEADER_INFO_FLAG
- | t->extraParentObjectId;
-- if (t->extraIsShrinkHeader) {
-- pt->t.chunkId |= EXTRA_SHRINK_FLAG;
-- }
-- if (t->extraShadows) {
-- pt->t.chunkId |= EXTRA_SHADOWS_FLAG;
-- }
-+ if (t->extraIsShrinkHeader)
-+ ptt->chunkId |= EXTRA_SHRINK_FLAG;
-+ if (t->extraShadows)
-+ ptt->chunkId |= EXTRA_SHADOWS_FLAG;
-
-- pt->t.objectId &= ~EXTRA_OBJECT_TYPE_MASK;
-- pt->t.objectId |=
-+ ptt->objectId &= ~EXTRA_OBJECT_TYPE_MASK;
-+ ptt->objectId |=
- (t->extraObjectType << EXTRA_OBJECT_TYPE_SHIFT);
-
-- if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK) {
-- pt->t.byteCount = t->extraEquivalentObjectId;
-- } else if (t->extraObjectType == YAFFS_OBJECT_TYPE_FILE) {
-- pt->t.byteCount = t->extraFileLength;
-- } else {
-- pt->t.byteCount = 0;
-- }
-+ if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK)
-+ ptt->byteCount = t->extraEquivalentObjectId;
-+ else if (t->extraObjectType == YAFFS_OBJECT_TYPE_FILE)
-+ ptt->byteCount = t->extraFileLength;
-+ else
-+ ptt->byteCount = 0;
- }
-
-- yaffs_DumpPackedTags2(pt);
-+ yaffs_DumpPackedTags2TagsPart(ptt);
- yaffs_DumpTags2(t);
-+}
-+
-+
-+void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ExtendedTags *t)
-+{
-+ yaffs_PackTags2TagsPart(&pt->t, t);
-
- #ifndef YAFFS_IGNORE_TAGS_ECC
- {
-@@ -101,82 +109,98 @@ void yaffs_PackTags2(yaffs_PackedTags2 *
- #endif
- }
-
--void yaffs_UnpackTags2(yaffs_ExtendedTags * t, yaffs_PackedTags2 * pt)
-+
-+void yaffs_UnpackTags2TagsPart(yaffs_ExtendedTags *t,
-+ yaffs_PackedTags2TagsPart *ptt)
- {
-
- memset(t, 0, sizeof(yaffs_ExtendedTags));
-
- yaffs_InitialiseTags(t);
-
-- if (pt->t.sequenceNumber != 0xFFFFFFFF) {
-- /* Page is in use */
--#ifdef YAFFS_IGNORE_TAGS_ECC
-- {
-- t->eccResult = YAFFS_ECC_RESULT_NO_ERROR;
-- }
--#else
-- {
-- yaffs_ECCOther ecc;
-- int result;
-- yaffs_ECCCalculateOther((unsigned char *)&pt->t,
-- sizeof
-- (yaffs_PackedTags2TagsPart),
-- &ecc);
-- result =
-- yaffs_ECCCorrectOther((unsigned char *)&pt->t,
-- sizeof
-- (yaffs_PackedTags2TagsPart),
-- &pt->ecc, &ecc);
-- switch(result){
-- case 0:
-- t->eccResult = YAFFS_ECC_RESULT_NO_ERROR;
-- break;
-- case 1:
-- t->eccResult = YAFFS_ECC_RESULT_FIXED;
-- break;
-- case -1:
-- t->eccResult = YAFFS_ECC_RESULT_UNFIXED;
-- break;
-- default:
-- t->eccResult = YAFFS_ECC_RESULT_UNKNOWN;
-- }
-- }
--#endif
-+ if (ptt->sequenceNumber != 0xFFFFFFFF) {
- t->blockBad = 0;
- t->chunkUsed = 1;
-- t->objectId = pt->t.objectId;
-- t->chunkId = pt->t.chunkId;
-- t->byteCount = pt->t.byteCount;
-+ t->objectId = ptt->objectId;
-+ t->chunkId = ptt->chunkId;
-+ t->byteCount = ptt->byteCount;
- t->chunkDeleted = 0;
- t->serialNumber = 0;
-- t->sequenceNumber = pt->t.sequenceNumber;
-+ t->sequenceNumber = ptt->sequenceNumber;
-
- /* Do extra header info stuff */
-
-- if (pt->t.chunkId & EXTRA_HEADER_INFO_FLAG) {
-+ if (ptt->chunkId & EXTRA_HEADER_INFO_FLAG) {
- t->chunkId = 0;
- t->byteCount = 0;
-
- t->extraHeaderInfoAvailable = 1;
- t->extraParentObjectId =
-- pt->t.chunkId & (~(ALL_EXTRA_FLAGS));
-+ ptt->chunkId & (~(ALL_EXTRA_FLAGS));
- t->extraIsShrinkHeader =
-- (pt->t.chunkId & EXTRA_SHRINK_FLAG) ? 1 : 0;
-+ (ptt->chunkId & EXTRA_SHRINK_FLAG) ? 1 : 0;
- t->extraShadows =
-- (pt->t.chunkId & EXTRA_SHADOWS_FLAG) ? 1 : 0;
-+ (ptt->chunkId & EXTRA_SHADOWS_FLAG) ? 1 : 0;
- t->extraObjectType =
-- pt->t.objectId >> EXTRA_OBJECT_TYPE_SHIFT;
-+ ptt->objectId >> EXTRA_OBJECT_TYPE_SHIFT;
- t->objectId &= ~EXTRA_OBJECT_TYPE_MASK;
-
-- if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK) {
-- t->extraEquivalentObjectId = pt->t.byteCount;
-- } else {
-- t->extraFileLength = pt->t.byteCount;
-+ if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK)
-+ t->extraEquivalentObjectId = ptt->byteCount;
-+ else
-+ t->extraFileLength = ptt->byteCount;
-+ }
-+ }
-+
-+ yaffs_DumpPackedTags2TagsPart(ptt);
-+ yaffs_DumpTags2(t);
-+
-+}
-+
-+
-+void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt)
-+{
-+
-+ yaffs_ECCResult eccResult = YAFFS_ECC_RESULT_NO_ERROR;
-+
-+ if (pt->t.sequenceNumber != 0xFFFFFFFF) {
-+ /* Page is in use */
-+#ifndef YAFFS_IGNORE_TAGS_ECC
-+ {
-+ yaffs_ECCOther ecc;
-+ int result;
-+ yaffs_ECCCalculateOther((unsigned char *)&pt->t,
-+ sizeof
-+ (yaffs_PackedTags2TagsPart),
-+ &ecc);
-+ result =
-+ yaffs_ECCCorrectOther((unsigned char *)&pt->t,
-+ sizeof
-+ (yaffs_PackedTags2TagsPart),
-+ &pt->ecc, &ecc);
-+ switch (result) {
-+ case 0:
-+ eccResult = YAFFS_ECC_RESULT_NO_ERROR;
-+ break;
-+ case 1:
-+ eccResult = YAFFS_ECC_RESULT_FIXED;
-+ break;
-+ case -1:
-+ eccResult = YAFFS_ECC_RESULT_UNFIXED;
-+ break;
-+ default:
-+ eccResult = YAFFS_ECC_RESULT_UNKNOWN;
- }
- }
-+#endif
- }
-
-+ yaffs_UnpackTags2TagsPart(t, &pt->t);
-+
-+ t->eccResult = eccResult;
-+
- yaffs_DumpPackedTags2(pt);
- yaffs_DumpTags2(t);
-
- }
-+
---- a/fs/yaffs2/yaffs_packedtags2.h
-+++ b/fs/yaffs2/yaffs_packedtags2.h
-@@ -33,6 +33,11 @@ typedef struct {
- yaffs_ECCOther ecc;
- } yaffs_PackedTags2;
-
--void yaffs_PackTags2(yaffs_PackedTags2 * pt, const yaffs_ExtendedTags * t);
--void yaffs_UnpackTags2(yaffs_ExtendedTags * t, yaffs_PackedTags2 * pt);
-+/* Full packed tags with ECC, used for oob tags */
-+void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ExtendedTags *t);
-+void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt);
-+
-+/* Only the tags part (no ECC for use with inband tags */
-+void yaffs_PackTags2TagsPart(yaffs_PackedTags2TagsPart *pt, const yaffs_ExtendedTags *t);
-+void yaffs_UnpackTags2TagsPart(yaffs_ExtendedTags *t, yaffs_PackedTags2TagsPart *pt);
- #endif
---- a/fs/yaffs2/yaffs_qsort.c
-+++ b/fs/yaffs2/yaffs_qsort.c
-@@ -28,12 +28,12 @@
- */
-
- #include "yportenv.h"
--//#include <linux/string.h>
-+/* #include <linux/string.h> */
-
- /*
- * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".
- */
--#define swapcode(TYPE, parmi, parmj, n) { \
-+#define swapcode(TYPE, parmi, parmj, n) do { \
- long i = (n) / sizeof (TYPE); \
- register TYPE *pi = (TYPE *) (parmi); \
- register TYPE *pj = (TYPE *) (parmj); \
-@@ -41,28 +41,29 @@
- register TYPE t = *pi; \
- *pi++ = *pj; \
- *pj++ = t; \
-- } while (--i > 0); \
--}
-+ } while (--i > 0); \
-+} while (0)
-
- #define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \
-- es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;
-+ es % sizeof(long) ? 2 : es == sizeof(long) ? 0 : 1;
-
- static __inline void
- swapfunc(char *a, char *b, int n, int swaptype)
- {
- if (swaptype <= 1)
-- swapcode(long, a, b, n)
-+ swapcode(long, a, b, n);
- else
-- swapcode(char, a, b, n)
-+ swapcode(char, a, b, n);
- }
-
--#define swap(a, b) \
-+#define yswap(a, b) do { \
- if (swaptype == 0) { \
- long t = *(long *)(a); \
- *(long *)(a) = *(long *)(b); \
- *(long *)(b) = t; \
- } else \
-- swapfunc(a, b, es, swaptype)
-+ swapfunc(a, b, es, swaptype); \
-+} while (0)
-
- #define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype)
-
-@@ -70,12 +71,12 @@ static __inline char *
- med3(char *a, char *b, char *c, int (*cmp)(const void *, const void *))
- {
- return cmp(a, b) < 0 ?
-- (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a ))
-- :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c ));
-+ (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a))
-+ : (cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c));
- }
-
- #ifndef min
--#define min(a,b) (((a) < (b)) ? (a) : (b))
-+#define min(a, b) (((a) < (b)) ? (a) : (b))
- #endif
-
- void
-@@ -92,7 +93,7 @@ loop: SWAPINIT(a, es);
- for (pm = (char *)a + es; pm < (char *) a + n * es; pm += es)
- for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
- pl -= es)
-- swap(pl, pl - es);
-+ yswap(pl, pl - es);
- return;
- }
- pm = (char *)a + (n / 2) * es;
-@@ -107,7 +108,7 @@ loop: SWAPINIT(a, es);
- }
- pm = med3(pl, pm, pn, cmp);
- }
-- swap(a, pm);
-+ yswap(a, pm);
- pa = pb = (char *)a + es;
-
- pc = pd = (char *)a + (n - 1) * es;
-@@ -115,7 +116,7 @@ loop: SWAPINIT(a, es);
- while (pb <= pc && (r = cmp(pb, a)) <= 0) {
- if (r == 0) {
- swap_cnt = 1;
-- swap(pa, pb);
-+ yswap(pa, pb);
- pa += es;
- }
- pb += es;
-@@ -123,14 +124,14 @@ loop: SWAPINIT(a, es);
- while (pb <= pc && (r = cmp(pc, a)) >= 0) {
- if (r == 0) {
- swap_cnt = 1;
-- swap(pc, pd);
-+ yswap(pc, pd);
- pd -= es;
- }
- pc -= es;
- }
- if (pb > pc)
- break;
-- swap(pb, pc);
-+ yswap(pb, pc);
- swap_cnt = 1;
- pb += es;
- pc -= es;
-@@ -139,7 +140,7 @@ loop: SWAPINIT(a, es);
- for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)
- for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
- pl -= es)
-- swap(pl, pl - es);
-+ yswap(pl, pl - es);
- return;
- }
-
-@@ -148,9 +149,11 @@ loop: SWAPINIT(a, es);
- vecswap(a, pb - r, r);
- r = min((long)(pd - pc), (long)(pn - pd - es));
- vecswap(pb, pn - r, r);
-- if ((r = pb - pa) > es)
-+ r = pb - pa;
-+ if (r > es)
- yaffs_qsort(a, r / es, es, cmp);
-- if ((r = pd - pc) > es) {
-+ r = pd - pc;
-+ if (r > es) {
- /* Iterate rather than recurse to save stack space */
- a = pn - r;
- n = r / es;
---- a/fs/yaffs2/yaffs_qsort.h
-+++ b/fs/yaffs2/yaffs_qsort.h
-@@ -17,7 +17,7 @@
- #ifndef __YAFFS_QSORT_H__
- #define __YAFFS_QSORT_H__
-
--extern void yaffs_qsort (void *const base, size_t total_elems, size_t size,
-- int (*cmp)(const void *, const void *));
-+extern void yaffs_qsort(void *const base, size_t total_elems, size_t size,
-+ int (*cmp)(const void *, const void *));
-
- #endif
---- a/fs/yaffs2/yaffs_tagscompat.c
-+++ b/fs/yaffs2/yaffs_tagscompat.c
-@@ -14,16 +14,17 @@
- #include "yaffs_guts.h"
- #include "yaffs_tagscompat.h"
- #include "yaffs_ecc.h"
-+#include "yaffs_getblockinfo.h"
-
--static void yaffs_HandleReadDataError(yaffs_Device * dev, int chunkInNAND);
-+static void yaffs_HandleReadDataError(yaffs_Device *dev, int chunkInNAND);
- #ifdef NOTYET
--static void yaffs_CheckWrittenBlock(yaffs_Device * dev, int chunkInNAND);
--static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_Spare * spare);
--static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,
-- const yaffs_Spare * spare);
--static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND);
-+static void yaffs_CheckWrittenBlock(yaffs_Device *dev, int chunkInNAND);
-+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_Spare *spare);
-+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND,
-+ const yaffs_Spare *spare);
-+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND);
- #endif
-
- static const char yaffs_countBitsTable[256] = {
-@@ -54,13 +55,13 @@ int yaffs_CountBits(__u8 x)
-
- /********** Tags ECC calculations *********/
-
--void yaffs_CalcECC(const __u8 * data, yaffs_Spare * spare)
-+void yaffs_CalcECC(const __u8 *data, yaffs_Spare *spare)
- {
- yaffs_ECCCalculate(data, spare->ecc1);
- yaffs_ECCCalculate(&data[256], spare->ecc2);
- }
-
--void yaffs_CalcTagsECC(yaffs_Tags * tags)
-+void yaffs_CalcTagsECC(yaffs_Tags *tags)
- {
- /* Calculate an ecc */
-
-@@ -74,9 +75,8 @@ void yaffs_CalcTagsECC(yaffs_Tags * tags
- for (i = 0; i < 8; i++) {
- for (j = 1; j & 0xff; j <<= 1) {
- bit++;
-- if (b[i] & j) {
-+ if (b[i] & j)
- ecc ^= bit;
-- }
- }
- }
-
-@@ -84,7 +84,7 @@ void yaffs_CalcTagsECC(yaffs_Tags * tags
-
- }
-
--int yaffs_CheckECCOnTags(yaffs_Tags * tags)
-+int yaffs_CheckECCOnTags(yaffs_Tags *tags)
- {
- unsigned ecc = tags->ecc;
-
-@@ -115,8 +115,8 @@ int yaffs_CheckECCOnTags(yaffs_Tags * ta
-
- /********** Tags **********/
-
--static void yaffs_LoadTagsIntoSpare(yaffs_Spare * sparePtr,
-- yaffs_Tags * tagsPtr)
-+static void yaffs_LoadTagsIntoSpare(yaffs_Spare *sparePtr,
-+ yaffs_Tags *tagsPtr)
- {
- yaffs_TagsUnion *tu = (yaffs_TagsUnion *) tagsPtr;
-
-@@ -132,8 +132,8 @@ static void yaffs_LoadTagsIntoSpare(yaff
- sparePtr->tagByte7 = tu->asBytes[7];
- }
-
--static void yaffs_GetTagsFromSpare(yaffs_Device * dev, yaffs_Spare * sparePtr,
-- yaffs_Tags * tagsPtr)
-+static void yaffs_GetTagsFromSpare(yaffs_Device *dev, yaffs_Spare *sparePtr,
-+ yaffs_Tags *tagsPtr)
- {
- yaffs_TagsUnion *tu = (yaffs_TagsUnion *) tagsPtr;
- int result;
-@@ -148,21 +148,20 @@ static void yaffs_GetTagsFromSpare(yaffs
- tu->asBytes[7] = sparePtr->tagByte7;
-
- result = yaffs_CheckECCOnTags(tagsPtr);
-- if (result > 0) {
-+ if (result > 0)
- dev->tagsEccFixed++;
-- } else if (result < 0) {
-+ else if (result < 0)
- dev->tagsEccUnfixed++;
-- }
- }
-
--static void yaffs_SpareInitialise(yaffs_Spare * spare)
-+static void yaffs_SpareInitialise(yaffs_Spare *spare)
- {
- memset(spare, 0xFF, sizeof(yaffs_Spare));
- }
-
- static int yaffs_WriteChunkToNAND(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND, const __u8 * data,
-- yaffs_Spare * spare)
-+ int chunkInNAND, const __u8 *data,
-+ yaffs_Spare *spare)
- {
- if (chunkInNAND < dev->startBlock * dev->nChunksPerBlock) {
- T(YAFFS_TRACE_ERROR,
-@@ -177,9 +176,9 @@ static int yaffs_WriteChunkToNAND(struct
-
- static int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev,
- int chunkInNAND,
-- __u8 * data,
-- yaffs_Spare * spare,
-- yaffs_ECCResult * eccResult,
-+ __u8 *data,
-+ yaffs_Spare *spare,
-+ yaffs_ECCResult *eccResult,
- int doErrorCorrection)
- {
- int retVal;
-@@ -252,9 +251,11 @@ static int yaffs_ReadChunkFromNAND(struc
- /* Must allocate enough memory for spare+2*sizeof(int) */
- /* for ecc results from device. */
- struct yaffs_NANDSpare nspare;
-- retVal =
-- dev->readChunkFromNAND(dev, chunkInNAND, data,
-- (yaffs_Spare *) & nspare);
-+
-+ memset(&nspare, 0, sizeof(nspare));
-+
-+ retVal = dev->readChunkFromNAND(dev, chunkInNAND, data,
-+ (yaffs_Spare *) &nspare);
- memcpy(spare, &nspare, sizeof(yaffs_Spare));
- if (data && doErrorCorrection) {
- if (nspare.eccres1 > 0) {
-@@ -302,8 +303,7 @@ static int yaffs_ReadChunkFromNAND(struc
- static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,
- int chunkInNAND)
- {
--
-- static int init = 0;
-+ static int init;
- static __u8 cmpbuf[YAFFS_BYTES_PER_CHUNK];
- static __u8 data[YAFFS_BYTES_PER_CHUNK];
- /* Might as well always allocate the larger size for */
-@@ -331,12 +331,12 @@ static int yaffs_CheckChunkErased(struct
- * Functions for robustisizing
- */
-
--static void yaffs_HandleReadDataError(yaffs_Device * dev, int chunkInNAND)
-+static void yaffs_HandleReadDataError(yaffs_Device *dev, int chunkInNAND)
- {
- int blockInNAND = chunkInNAND / dev->nChunksPerBlock;
-
- /* Mark the block for retirement */
-- yaffs_GetBlockInfo(dev, blockInNAND)->needsRetiring = 1;
-+ yaffs_GetBlockInfo(dev, blockInNAND + dev->blockOffset)->needsRetiring = 1;
- T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS,
- (TSTR("**>>Block %d marked for retirement" TENDSTR), blockInNAND));
-
-@@ -348,22 +348,22 @@ static void yaffs_HandleReadDataError(ya
- }
-
- #ifdef NOTYET
--static void yaffs_CheckWrittenBlock(yaffs_Device * dev, int chunkInNAND)
-+static void yaffs_CheckWrittenBlock(yaffs_Device *dev, int chunkInNAND)
- {
- }
-
--static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_Spare * spare)
-+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_Spare *spare)
- {
- }
-
--static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,
-- const yaffs_Spare * spare)
-+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND,
-+ const yaffs_Spare *spare)
- {
- }
-
--static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND)
-+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND)
- {
- int blockInNAND = chunkInNAND / dev->nChunksPerBlock;
-
-@@ -373,8 +373,8 @@ static void yaffs_HandleWriteChunkError(
- yaffs_DeleteChunk(dev, chunkInNAND, 1, __LINE__);
- }
-
--static int yaffs_VerifyCompare(const __u8 * d0, const __u8 * d1,
-- const yaffs_Spare * s0, const yaffs_Spare * s1)
-+static int yaffs_VerifyCompare(const __u8 *d0, const __u8 *d1,
-+ const yaffs_Spare *s0, const yaffs_Spare *s1)
- {
-
- if (memcmp(d0, d1, YAFFS_BYTES_PER_CHUNK) != 0 ||
-@@ -398,28 +398,35 @@ static int yaffs_VerifyCompare(const __u
- }
- #endif /* NOTYET */
-
--int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device * dev,
-- int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags *
-- eTags)
-+int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device *dev,
-+ int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *eTags)
- {
- yaffs_Spare spare;
- yaffs_Tags tags;
-
- yaffs_SpareInitialise(&spare);
-
-- if (eTags->chunkDeleted) {
-+ if (eTags->chunkDeleted)
- spare.pageStatus = 0;
-- } else {
-+ else {
- tags.objectId = eTags->objectId;
- tags.chunkId = eTags->chunkId;
-- tags.byteCount = eTags->byteCount;
-+
-+ tags.byteCountLSB = eTags->byteCount & 0x3ff;
-+
-+ if (dev->nDataBytesPerChunk >= 1024)
-+ tags.byteCountMSB = (eTags->byteCount >> 10) & 3;
-+ else
-+ tags.byteCountMSB = 3;
-+
-+
- tags.serialNumber = eTags->serialNumber;
-
-- if (!dev->useNANDECC && data) {
-+ if (!dev->useNANDECC && data)
- yaffs_CalcECC(data, &spare);
-- }
-+
- yaffs_LoadTagsIntoSpare(&spare, &tags);
-
- }
-@@ -427,15 +434,15 @@ int yaffs_TagsCompatabilityWriteChunkWit
- return yaffs_WriteChunkToNAND(dev, chunkInNAND, data, &spare);
- }
-
--int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device * dev,
-+int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device *dev,
- int chunkInNAND,
-- __u8 * data,
-- yaffs_ExtendedTags * eTags)
-+ __u8 *data,
-+ yaffs_ExtendedTags *eTags)
- {
-
- yaffs_Spare spare;
- yaffs_Tags tags;
-- yaffs_ECCResult eccResult;
-+ yaffs_ECCResult eccResult = YAFFS_ECC_RESULT_UNKNOWN;
-
- static yaffs_Spare spareFF;
- static int init;
-@@ -466,7 +473,11 @@ int yaffs_TagsCompatabilityReadChunkWith
-
- eTags->objectId = tags.objectId;
- eTags->chunkId = tags.chunkId;
-- eTags->byteCount = tags.byteCount;
-+ eTags->byteCount = tags.byteCountLSB;
-+
-+ if (dev->nDataBytesPerChunk >= 1024)
-+ eTags->byteCount |= (((unsigned) tags.byteCountMSB) << 10);
-+
- eTags->serialNumber = tags.serialNumber;
- }
- }
-@@ -497,9 +508,9 @@ int yaffs_TagsCompatabilityMarkNANDBlock
- }
-
- int yaffs_TagsCompatabilityQueryNANDBlock(struct yaffs_DeviceStruct *dev,
-- int blockNo, yaffs_BlockState *
-- state,
-- int *sequenceNumber)
-+ int blockNo,
-+ yaffs_BlockState *state,
-+ __u32 *sequenceNumber)
- {
-
- yaffs_Spare spare0, spare1;
---- a/fs/yaffs2/yaffs_tagscompat.h
-+++ b/fs/yaffs2/yaffs_tagscompat.h
-@@ -17,24 +17,23 @@
- #define __YAFFS_TAGSCOMPAT_H__
-
- #include "yaffs_guts.h"
--int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device * dev,
-- int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags *
-- tags);
--int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device * dev,
-- int chunkInNAND,
-- __u8 * data,
-- yaffs_ExtendedTags *
-- tags);
-+int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device *dev,
-+ int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
-+int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device *dev,
-+ int chunkInNAND,
-+ __u8 *data,
-+ yaffs_ExtendedTags *tags);
- int yaffs_TagsCompatabilityMarkNANDBlockBad(struct yaffs_DeviceStruct *dev,
- int blockNo);
- int yaffs_TagsCompatabilityQueryNANDBlock(struct yaffs_DeviceStruct *dev,
-- int blockNo, yaffs_BlockState *
-- state, int *sequenceNumber);
-+ int blockNo,
-+ yaffs_BlockState *state,
-+ __u32 *sequenceNumber);
-
--void yaffs_CalcTagsECC(yaffs_Tags * tags);
--int yaffs_CheckECCOnTags(yaffs_Tags * tags);
-+void yaffs_CalcTagsECC(yaffs_Tags *tags);
-+int yaffs_CheckECCOnTags(yaffs_Tags *tags);
- int yaffs_CountBits(__u8 byte);
-
- #endif
---- a/fs/yaffs2/yaffs_tagsvalidity.c
-+++ b/fs/yaffs2/yaffs_tagsvalidity.c
-@@ -13,14 +13,14 @@
-
- #include "yaffs_tagsvalidity.h"
-
--void yaffs_InitialiseTags(yaffs_ExtendedTags * tags)
-+void yaffs_InitialiseTags(yaffs_ExtendedTags *tags)
- {
- memset(tags, 0, sizeof(yaffs_ExtendedTags));
- tags->validMarker0 = 0xAAAAAAAA;
- tags->validMarker1 = 0x55555555;
- }
-
--int yaffs_ValidateTags(yaffs_ExtendedTags * tags)
-+int yaffs_ValidateTags(yaffs_ExtendedTags *tags)
- {
- return (tags->validMarker0 == 0xAAAAAAAA &&
- tags->validMarker1 == 0x55555555);
---- a/fs/yaffs2/yaffs_tagsvalidity.h
-+++ b/fs/yaffs2/yaffs_tagsvalidity.h
-@@ -19,6 +19,6 @@
-
- #include "yaffs_guts.h"
-
--void yaffs_InitialiseTags(yaffs_ExtendedTags * tags);
--int yaffs_ValidateTags(yaffs_ExtendedTags * tags);
-+void yaffs_InitialiseTags(yaffs_ExtendedTags *tags);
-+int yaffs_ValidateTags(yaffs_ExtendedTags *tags);
- #endif
---- a/fs/yaffs2/yportenv.h
-+++ b/fs/yaffs2/yportenv.h
-@@ -17,17 +17,28 @@
- #ifndef __YPORTENV_H__
- #define __YPORTENV_H__
-
-+/*
-+ * Define the MTD version in terms of Linux Kernel versions
-+ * This allows yaffs to be used independantly of the kernel
-+ * as well as with it.
-+ */
-+
-+#define MTD_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + (c))
-+
- #if defined CONFIG_YAFFS_WINCE
-
- #include "ywinceenv.h"
-
--#elif defined __KERNEL__
-+#elif defined __KERNEL__
-
- #include "moduleconfig.h"
-
- /* Linux kernel */
-+
- #include <linux/version.h>
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
-+#define MTD_VERSION_CODE LINUX_VERSION_CODE
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
- #include <linux/config.h>
- #endif
- #include <linux/kernel.h>
-@@ -40,12 +51,13 @@
- #define YCHAR char
- #define YUCHAR unsigned char
- #define _Y(x) x
--#define yaffs_strcpy(a,b) strcpy(a,b)
--#define yaffs_strncpy(a,b,c) strncpy(a,b,c)
--#define yaffs_strncmp(a,b,c) strncmp(a,b,c)
--#define yaffs_strlen(s) strlen(s)
--#define yaffs_sprintf sprintf
--#define yaffs_toupper(a) toupper(a)
-+#define yaffs_strcat(a, b) strcat(a, b)
-+#define yaffs_strcpy(a, b) strcpy(a, b)
-+#define yaffs_strncpy(a, b, c) strncpy(a, b, c)
-+#define yaffs_strncmp(a, b, c) strncmp(a, b, c)
-+#define yaffs_strlen(s) strlen(s)
-+#define yaffs_sprintf sprintf
-+#define yaffs_toupper(a) toupper(a)
-
- #define Y_INLINE inline
-
-@@ -53,19 +65,19 @@
- #define YAFFS_LOSTNFOUND_PREFIX "obj"
-
- /* #define YPRINTF(x) printk x */
--#define YMALLOC(x) kmalloc(x,GFP_KERNEL)
-+#define YMALLOC(x) kmalloc(x, GFP_NOFS)
- #define YFREE(x) kfree(x)
- #define YMALLOC_ALT(x) vmalloc(x)
- #define YFREE_ALT(x) vfree(x)
- #define YMALLOC_DMA(x) YMALLOC(x)
-
--// KR - added for use in scan so processes aren't blocked indefinitely.
-+/* KR - added for use in scan so processes aren't blocked indefinitely. */
- #define YYIELD() schedule()
-
- #define YAFFS_ROOT_MODE 0666
- #define YAFFS_LOSTNFOUND_MODE 0666
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- #define Y_CURRENT_TIME CURRENT_TIME.tv_sec
- #define Y_TIME_CONVERT(x) (x).tv_sec
- #else
-@@ -73,11 +85,12 @@
- #define Y_TIME_CONVERT(x) (x)
- #endif
-
--#define yaffs_SumCompare(x,y) ((x) == (y))
--#define yaffs_strcmp(a,b) strcmp(a,b)
-+#define yaffs_SumCompare(x, y) ((x) == (y))
-+#define yaffs_strcmp(a, b) strcmp(a, b)
-
- #define TENDSTR "\n"
- #define TSTR(x) KERN_WARNING x
-+#define TCONT(x) x
- #define TOUT(p) printk p
-
- #define yaffs_trace(mask, fmt, args...) \
-@@ -90,6 +103,8 @@
-
- #elif defined CONFIG_YAFFS_DIRECT
-
-+#define MTD_VERSION_CODE MTD_VERSION(2, 6, 22)
-+
- /* Direct interface */
- #include "ydirectenv.h"
-
-@@ -111,11 +126,12 @@
- #define YCHAR char
- #define YUCHAR unsigned char
- #define _Y(x) x
--#define yaffs_strcpy(a,b) strcpy(a,b)
--#define yaffs_strncpy(a,b,c) strncpy(a,b,c)
--#define yaffs_strlen(s) strlen(s)
--#define yaffs_sprintf sprintf
--#define yaffs_toupper(a) toupper(a)
-+#define yaffs_strcat(a, b) strcat(a, b)
-+#define yaffs_strcpy(a, b) strcpy(a, b)
-+#define yaffs_strncpy(a, b, c) strncpy(a, b, c)
-+#define yaffs_strlen(s) strlen(s)
-+#define yaffs_sprintf sprintf
-+#define yaffs_toupper(a) toupper(a)
-
- #define Y_INLINE inline
-
-@@ -133,8 +149,8 @@
- #define YAFFS_ROOT_MODE 0666
- #define YAFFS_LOSTNFOUND_MODE 0666
-
--#define yaffs_SumCompare(x,y) ((x) == (y))
--#define yaffs_strcmp(a,b) strcmp(a,b)
-+#define yaffs_SumCompare(x, y) ((x) == (y))
-+#define yaffs_strcmp(a, b) strcmp(a, b)
-
- #else
- /* Should have specified a configuration type */
-@@ -178,10 +194,10 @@ extern unsigned int yaffs_wr_attempts;
- #define YAFFS_TRACE_ALWAYS 0xF0000000
-
-
--#define T(mask,p) do{ if((mask) & (yaffs_traceMask | YAFFS_TRACE_ALWAYS)) TOUT(p);} while(0)
-+#define T(mask, p) do { if ((mask) & (yaffs_traceMask | YAFFS_TRACE_ALWAYS)) TOUT(p); } while (0)
-
--#ifndef CONFIG_YAFFS_WINCE
--#define YBUG() T(YAFFS_TRACE_BUG,(TSTR("==>> yaffs bug: " __FILE__ " %d" TENDSTR),__LINE__))
-+#ifndef YBUG
-+#define YBUG() do {T(YAFFS_TRACE_BUG, (TSTR("==>> yaffs bug: " __FILE__ " %d" TENDSTR), __LINE__)); } while (0)
- #endif
-
- #endif
+++ /dev/null
---- a/drivers/net/phy/phy.c
-+++ b/drivers/net/phy/phy.c
-@@ -299,6 +299,50 @@ int phy_ethtool_gset(struct phy_device *
- }
- EXPORT_SYMBOL(phy_ethtool_gset);
-
-+int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr)
-+{
-+ u32 cmd;
-+ int tmp;
-+ struct ethtool_cmd ecmd = { ETHTOOL_GSET };
-+ struct ethtool_value edata = { ETHTOOL_GLINK };
-+
-+ if (get_user(cmd, (u32 *) useraddr))
-+ return -EFAULT;
-+
-+ switch (cmd) {
-+ case ETHTOOL_GSET:
-+ phy_ethtool_gset(phydev, &ecmd);
-+ if (copy_to_user(useraddr, &ecmd, sizeof(ecmd)))
-+ return -EFAULT;
-+ return 0;
-+
-+ case ETHTOOL_SSET:
-+ if (copy_from_user(&ecmd, useraddr, sizeof(ecmd)))
-+ return -EFAULT;
-+ return phy_ethtool_sset(phydev, &ecmd);
-+
-+ case ETHTOOL_NWAY_RST:
-+ /* if autoneg is off, it's an error */
-+ tmp = phy_read(phydev, MII_BMCR);
-+ if (tmp & BMCR_ANENABLE) {
-+ tmp |= (BMCR_ANRESTART);
-+ phy_write(phydev, MII_BMCR, tmp);
-+ return 0;
-+ }
-+ return -EINVAL;
-+
-+ case ETHTOOL_GLINK:
-+ edata.data = (phy_read(phydev,
-+ MII_BMSR) & BMSR_LSTATUS) ? 1 : 0;
-+ if (copy_to_user(useraddr, &edata, sizeof(edata)))
-+ return -EFAULT;
-+ return 0;
-+ }
-+
-+ return -EOPNOTSUPP;
-+}
-+EXPORT_SYMBOL(phy_ethtool_ioctl);
-+
- /**
- * phy_mii_ioctl - generic PHY MII ioctl interface
- * @phydev: the phy_device struct
-@@ -352,7 +396,7 @@ int phy_mii_ioctl(struct phy_device *phy
- }
-
- phy_write(phydev, mii_data->reg_num, val);
--
-+
- if (mii_data->reg_num == MII_BMCR &&
- val & BMCR_RESET &&
- phydev->drv->config_init) {
-@@ -466,7 +510,7 @@ static void phy_force_reduction(struct p
- int idx;
-
- idx = phy_find_setting(phydev->speed, phydev->duplex);
--
-+
- idx++;
-
- idx = phy_find_valid(idx, phydev->supported);
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -491,6 +491,7 @@ void phy_start_machine(struct phy_device
- void phy_stop_machine(struct phy_device *phydev);
- int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd);
- int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd);
-+int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr);
- int phy_mii_ioctl(struct phy_device *phydev,
- struct mii_ioctl_data *mii_data, int cmd);
- int phy_start_interrupts(struct phy_device *phydev);
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -88,6 +88,11 @@ config LSI_ET1011C_PHY
- ---help---
- Supports the LSI ET1011C PHY.
-
-+config ADM6996_PHY
-+ tristate "Driver for ADM6996 switches"
-+ ---help---
-+ Currently supports the ADM6996F switch
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -13,6 +13,7 @@ obj-$(CONFIG_VITESSE_PHY) += vitesse.o
- obj-$(CONFIG_BROADCOM_PHY) += broadcom.o
- obj-$(CONFIG_BCM63XX_PHY) += bcm63xx.o
- obj-$(CONFIG_ICPLUS_PHY) += icplus.o
-+obj-$(CONFIG_ADM6996_PHY) += adm6996.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
+++ /dev/null
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -146,6 +146,18 @@ int phy_scan_fixups(struct phy_device *p
- }
- EXPORT_SYMBOL(phy_scan_fixups);
-
-+static int generic_receive_skb(struct sk_buff *skb)
-+{
-+ skb->protocol = eth_type_trans(skb, skb->dev);
-+ return netif_receive_skb(skb);
-+}
-+
-+static int generic_rx(struct sk_buff *skb)
-+{
-+ skb->protocol = eth_type_trans(skb, skb->dev);
-+ return netif_rx(skb);
-+}
-+
- struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id)
- {
- struct phy_device *dev;
-@@ -175,6 +187,8 @@ struct phy_device* phy_device_create(str
- dev_set_name(&dev->dev, PHY_ID_FMT, bus->id, addr);
-
- dev->state = PHY_DOWN;
-+ dev->netif_receive_skb = &generic_receive_skb;
-+ dev->netif_rx = &generic_rx;
-
- mutex_init(&dev->lock);
- INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine);
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -325,6 +325,20 @@ struct phy_device {
- void (*adjust_link)(struct net_device *dev);
-
- void (*adjust_state)(struct net_device *dev);
-+
-+ /*
-+ * By default these point to the original functions
-+ * with the same name. adding them to the phy_device
-+ * allows the phy driver to override them for packet
-+ * mangling if the ethernet driver supports it
-+ * This is required to support some really horrible
-+ * switches such as the Marvell 88E6060
-+ */
-+ int (*netif_receive_skb)(struct sk_buff *skb);
-+ int (*netif_rx)(struct sk_buff *skb);
-+
-+ /* alignment offset for packets */
-+ int pkt_align;
- };
- #define to_phy_device(d) container_of(d, struct phy_device, dev)
-
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -844,6 +844,7 @@ struct net_device {
- void *ax25_ptr; /* AX.25 specific data */
- struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data,
- assign before registering */
-+ void *phy_ptr; /* PHY device specific data */
-
- /*
- * Cache line mostly used on receive path (including eth_type_trans())
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -13,6 +13,12 @@ menuconfig PHYLIB
-
- if PHYLIB
-
-+config SWCONFIG
-+ tristate "Switch configuration API"
-+ ---help---
-+ Switch configuration API using netlink. This allows
-+ you to configure the VLAN features of certain switches.
-+
- comment "MII PHY device drivers"
-
- config MARVELL_PHY
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -3,6 +3,7 @@
- libphy-objs := phy.o phy_device.o mdio_bus.o
-
- obj-$(CONFIG_PHYLIB) += libphy.o
-+obj-$(CONFIG_SWCONFIG) += swconfig.o
- obj-$(CONFIG_MARVELL_PHY) += marvell.o
- obj-$(CONFIG_DAVICOM_PHY) += davicom.o
- obj-$(CONFIG_CICADA_PHY) += cicada.o
+++ /dev/null
---- a/drivers/net/phy/swconfig.c
-+++ b/drivers/net/phy/swconfig.c
-@@ -335,7 +335,7 @@ swconfig_send_multipart(struct swconfig_
- if (cb->close(cb, arg) < 0)
- goto error;
- }
-- err = genlmsg_unicast(cb->msg, info->snd_pid);
-+ err = genlmsg_reply(cb->msg, info);
- cb->msg = NULL;
- if (err < 0)
- goto error;
-@@ -419,7 +419,7 @@ swconfig_list_attrs(struct sk_buff *skb,
- if (!cb.msg)
- return 0;
-
-- return genlmsg_unicast(cb.msg, info->snd_pid);
-+ return genlmsg_reply(cb.msg, info);
-
- error:
- if (cb.msg)
-@@ -728,7 +728,7 @@ swconfig_get_attr(struct sk_buff *skb, s
- goto nla_put_failure;
-
- swconfig_put_dev(dev);
-- return genlmsg_unicast(msg, info->snd_pid);
-+ return genlmsg_reply(msg, info);
-
- nla_put_failure:
- if (msg)
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -99,6 +99,9 @@ config ADM6996_PHY
- ---help---
- Currently supports the ADM6996F switch
-
-+config MVSWITCH_PHY
-+ tristate "Driver for Marvell 88E6060 switches"
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -15,6 +15,7 @@ obj-$(CONFIG_BROADCOM_PHY) += broadcom.o
- obj-$(CONFIG_BCM63XX_PHY) += bcm63xx.o
- obj-$(CONFIG_ICPLUS_PHY) += icplus.o
- obj-$(CONFIG_ADM6996_PHY) += adm6996.o
-+obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -102,6 +102,10 @@ config ADM6996_PHY
- config MVSWITCH_PHY
- tristate "Driver for Marvell 88E6060 switches"
-
-+config IP175C_PHY
-+ tristate "Driver for IC+ IP175C/IP178C switches"
-+ select SWCONFIG
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -16,6 +16,7 @@ obj-$(CONFIG_BCM63XX_PHY) += bcm63xx.o
- obj-$(CONFIG_ICPLUS_PHY) += icplus.o
- obj-$(CONFIG_ADM6996_PHY) += adm6996.o
- obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
-+obj-$(CONFIG_IP175C_PHY) += ip175c.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -106,6 +106,10 @@ config IP175C_PHY
- tristate "Driver for IC+ IP175C/IP178C switches"
- select SWCONFIG
-
-+config AR8216_PHY
-+ tristate "Driver for Atheros AR8216 switches"
-+ select SWCONFIG
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -18,6 +18,7 @@ obj-$(CONFIG_ADM6996_PHY) += adm6996.o
- obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
- obj-$(CONFIG_IP175C_PHY) += ip175c.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
-+obj-$(CONFIG_AR8216_PHY) += ar8216.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
- obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -110,6 +110,10 @@ config AR8216_PHY
- tristate "Driver for Atheros AR8216 switches"
- select SWCONFIG
-
-+config RTL8306_PHY
-+ tristate "Driver for Realtek RTL8306S switches"
-+ select SWCONFIG
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -19,6 +19,7 @@ obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
- obj-$(CONFIG_IP175C_PHY) += ip175c.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_AR8216_PHY) += ar8216.o
-+obj-$(CONFIG_RTL8306_PHY) += rtl8306.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
- obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -152,4 +152,29 @@ config MDIO_OCTEON
-
- If in doubt, say Y.
-
-+config RTL8366_SMI
-+ tristate "Driver for the RTL8366 SMI interface"
-+ depends on GENERIC_GPIO
-+ ---help---
-+ This module implements the SMI interface protocol which is used
-+ by some RTL8366 ethernet switch devices via the generic GPIO API.
-+
-+if RTL8366_SMI
-+
-+config RTL8366S_PHY
-+ tristate "Driver for the Realtek RTL8366S switch"
-+ select SWCONFIG
-+
-+config RTL8366RB_PHY
-+ tristate "Driver for the Realtek RTL8366RB switch"
-+ select SWCONFIG
-+
-+config RTL8366S_PHY_DEBUG_FS
-+ bool "RTL8366 switch driver DEBUG_FS support"
-+ depends on RTL8366S_PHY || RTL8366RB_PHY
-+ depends on DEBUG_FS
-+ default n
-+
-+endif # RTL8366_SMI
-+
- endif # PHYLIB
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -20,6 +20,9 @@ obj-$(CONFIG_IP175C_PHY) += ip175c.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_AR8216_PHY) += ar8216.o
- obj-$(CONFIG_RTL8306_PHY) += rtl8306.o
-+obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi.o
-+obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o
-+obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
- obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
+++ /dev/null
---- a/drivers/rtc/Kconfig
-+++ b/drivers/rtc/Kconfig
-@@ -608,6 +608,15 @@ config RTC_DRV_NUC900
- If you say yes here you get support for the RTC subsystem of the
- NUC910/NUC920 used in embedded systems.
-
-+config RTC_DRV_RTC7301
-+ tristate "Epson RTC-7301 SF/DG"
-+ help
-+ If you say Y here you will get support for the
-+ Epson RTC-7301 SF/DG RTC chips.
-+
-+ This driver can also be built as a module. If so, the module
-+ will be called rtc-7301.
-+
- comment "on-CPU RTC drivers"
-
- config RTC_DRV_OMAP
---- a/drivers/rtc/Makefile
-+++ b/drivers/rtc/Makefile
-@@ -72,6 +72,7 @@ obj-$(CONFIG_RTC_DRV_RP5C01) += rtc-rp5c
- obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o
- obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o
- obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o
-+obj-$(CONFIG_RTC_DRV_RTC7301) += rtc-rtc7301.o
- obj-$(CONFIG_RTC_DRV_RX8025) += rtc-rx8025.o
- obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o
- obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o
---- /dev/null
-+++ b/drivers/rtc/rtc-rtc7301.c
-@@ -0,0 +1,219 @@
-+/*
-+ * Driver for Epson RTC-7301SF/DG
-+ *
-+ * Copyright (C) 2009 Jose Vasconcellos
-+ *
-+ * This program is free software; you can 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/rtc.h>
-+#include <linux/platform_device.h>
-+#include <linux/io.h>
-+#include <linux/delay.h>
-+#include <linux/bcd.h>
-+
-+#define RTC_NAME "rtc7301"
-+#define RTC_VERSION "0.1"
-+
-+/* Epson RTC-7301 register addresses */
-+#define RTC7301_SEC 0x00
-+#define RTC7301_SEC10 0x01
-+#define RTC7301_MIN 0x02
-+#define RTC7301_MIN10 0x03
-+#define RTC7301_HOUR 0x04
-+#define RTC7301_HOUR10 0x05
-+#define RTC7301_WEEKDAY 0x06
-+#define RTC7301_DAY 0x07
-+#define RTC7301_DAY10 0x08
-+#define RTC7301_MON 0x09
-+#define RTC7301_MON10 0x0A
-+#define RTC7301_YEAR 0x0B
-+#define RTC7301_YEAR10 0x0C
-+#define RTC7301_YEAR100 0x0D
-+#define RTC7301_YEAR1000 0x0E
-+#define RTC7301_CTRLREG 0x0F
-+
-+static uint8_t __iomem *rtc7301_base;
-+
-+#define read_reg(offset) (readb(rtc7301_base + offset) & 0xf)
-+#define write_reg(offset, data) writeb(data, rtc7301_base + (offset))
-+
-+#define rtc7301_isbusy() (read_reg(RTC7301_CTRLREG) & 1)
-+
-+static void rtc7301_init_settings(void)
-+{
-+ int i;
-+
-+ write_reg(RTC7301_CTRLREG, 2);
-+ write_reg(RTC7301_YEAR1000, 2);
-+ udelay(122);
-+
-+ /* bank 1 */
-+ write_reg(RTC7301_CTRLREG, 6);
-+ for (i=0; i<15; i++)
-+ write_reg(i, 0);
-+
-+ /* bank 2 */
-+ write_reg(RTC7301_CTRLREG, 14);
-+ for (i=0; i<15; i++)
-+ write_reg(i, 0);
-+ write_reg(RTC7301_CTRLREG, 0);
-+}
-+
-+static int rtc7301_get_datetime(struct device *dev, struct rtc_time *dt)
-+{
-+ int cnt;
-+ uint8_t buf[16];
-+
-+ cnt = 0;
-+ while (rtc7301_isbusy()) {
-+ udelay(244);
-+ if (cnt++ > 100) {
-+ dev_err(dev, "%s: timeout error %x\n", __func__, rtc7301_base[RTC7301_CTRLREG]);
-+ return -EIO;
-+ }
-+ }
-+
-+ for (cnt=0; cnt<16; cnt++)
-+ buf[cnt] = read_reg(cnt);
-+
-+ if (buf[RTC7301_SEC10] & 8) {
-+ dev_err(dev, "%s: RTC not set\n", __func__);
-+ return -EINVAL;
-+ }
-+
-+ memset(dt, 0, sizeof(*dt));
-+
-+ dt->tm_sec = buf[RTC7301_SEC] + buf[RTC7301_SEC10]*10;
-+ dt->tm_min = buf[RTC7301_MIN] + buf[RTC7301_MIN10]*10;
-+ dt->tm_hour = buf[RTC7301_HOUR] + buf[RTC7301_HOUR10]*10;
-+
-+ dt->tm_mday = buf[RTC7301_DAY] + buf[RTC7301_DAY10]*10;
-+ dt->tm_mon = buf[RTC7301_MON] + buf[RTC7301_MON10]*10 - 1;
-+ dt->tm_year = buf[RTC7301_YEAR] + buf[RTC7301_YEAR10]*10 +
-+ buf[RTC7301_YEAR100]*100 +
-+ ((buf[RTC7301_YEAR1000] & 3)*1000) - 1900;
-+
-+ /* the rtc device may contain illegal values on power up
-+ * according to the data sheet. make sure they are valid.
-+ */
-+
-+ return rtc_valid_tm(dt);
-+}
-+
-+static int rtc7301_set_datetime(struct device *dev, struct rtc_time *dt)
-+{
-+ int data;
-+
-+ data = dt->tm_year + 1900;
-+ if (data >= 2100 || data < 1900)
-+ return -EINVAL;
-+
-+ write_reg(RTC7301_CTRLREG, 2);
-+ udelay(122);
-+
-+ data = bin2bcd(dt->tm_sec);
-+ write_reg(RTC7301_SEC, data);
-+ write_reg(RTC7301_SEC10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_min);
-+ write_reg(RTC7301_MIN, data );
-+ write_reg(RTC7301_MIN10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_hour);
-+ write_reg(RTC7301_HOUR, data);
-+ write_reg(RTC7301_HOUR10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_mday);
-+ write_reg(RTC7301_DAY, data);
-+ write_reg(RTC7301_DAY10, (data>> 4));
-+
-+ data = bin2bcd(dt->tm_mon + 1);
-+ write_reg(RTC7301_MON, data);
-+ write_reg(RTC7301_MON10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_year % 100);
-+ write_reg(RTC7301_YEAR, data);
-+ write_reg(RTC7301_YEAR10, (data >> 4));
-+ data = bin2bcd((1900 + dt->tm_year) / 100);
-+ write_reg(RTC7301_YEAR100, data);
-+
-+ data = bin2bcd(dt->tm_wday);
-+ write_reg(RTC7301_WEEKDAY, data);
-+
-+ write_reg(RTC7301_CTRLREG, 0);
-+
-+ return 0;
-+}
-+
-+static const struct rtc_class_ops rtc7301_rtc_ops = {
-+ .read_time = rtc7301_get_datetime,
-+ .set_time = rtc7301_set_datetime,
-+};
-+
-+static int __devinit rtc7301_probe(struct platform_device *pdev)
-+{
-+ struct rtc_device *rtc;
-+ struct resource *res;
-+
-+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ if (!res)
-+ return -ENOENT;
-+
-+ rtc7301_base = ioremap_nocache(res->start, 0x1000 /*res->end - res->start + 1*/);
-+ if (!rtc7301_base)
-+ return -EINVAL;
-+
-+ rtc = rtc_device_register(RTC_NAME, &pdev->dev,
-+ &rtc7301_rtc_ops, THIS_MODULE);
-+ if (IS_ERR(rtc)) {
-+ iounmap(rtc7301_base);
-+ return PTR_ERR(rtc);
-+ }
-+
-+ platform_set_drvdata(pdev, rtc);
-+
-+ rtc7301_init_settings();
-+ return 0;
-+}
-+
-+static int __devexit rtc7301_remove(struct platform_device *pdev)
-+{
-+ struct rtc_device *rtc = platform_get_drvdata(pdev);
-+
-+ if (rtc)
-+ rtc_device_unregister(rtc);
-+ if (rtc7301_base)
-+ iounmap(rtc7301_base);
-+ return 0;
-+}
-+
-+static struct platform_driver rtc7301_driver = {
-+ .driver = {
-+ .name = RTC_NAME,
-+ .owner = THIS_MODULE,
-+ },
-+ .probe = rtc7301_probe,
-+ .remove = __devexit_p(rtc7301_remove),
-+};
-+
-+static __init int rtc7301_init(void)
-+{
-+ return platform_driver_register(&rtc7301_driver);
-+}
-+module_init(rtc7301_init);
-+
-+static __exit void rtc7301_exit(void)
-+{
-+ platform_driver_unregister(&rtc7301_driver);
-+}
-+module_exit(rtc7301_exit);
-+
-+MODULE_DESCRIPTION("Epson 7301 RTC driver");
-+MODULE_AUTHOR("Jose Vasconcellos <jvasco@verizon.net>");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS("platform:" RTC_NAME);
-+MODULE_VERSION(RTC_VERSION);
+++ /dev/null
---- a/include/linux/fb.h
-+++ b/include/linux/fb.h
-@@ -124,6 +124,7 @@ struct dentry;
- #define FB_ACCEL_TRIDENT_BLADE3D 52 /* Trident Blade3D */
- #define FB_ACCEL_TRIDENT_BLADEXP 53 /* Trident BladeXP */
- #define FB_ACCEL_CIRRUS_ALPINE 53 /* Cirrus Logic 543x/544x/5480 */
-+#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 */
---- a/include/linux/Kbuild
-+++ b/include/linux/Kbuild
-@@ -76,6 +76,8 @@ header-y += genetlink.h
- header-y += gen_stats.h
- header-y += gfs2_ondisk.h
- header-y += gigaset_dev.h
-+header-y += glamofb.h
-+header-y += glamo-engine.h
- header-y += hysdn_if.h
- header-y += i2o-dev.h
- header-y += i8k.h
+++ /dev/null
---- a/drivers/usb/serial/usb-serial.c
-+++ b/drivers/usb/serial/usb-serial.c
-@@ -61,6 +61,7 @@ static struct usb_driver usb_serial_driv
- drivers depend on it.
- */
-
-+static ushort maxSize = 0;
- static int debug;
- /* initially all NULL */
- static struct usb_serial *serial_table[SERIAL_TTY_MINORS];
-@@ -914,7 +915,7 @@ int usb_serial_probe(struct usb_interfac
- dev_err(&interface->dev, "No free urbs available\n");
- goto probe_error;
- }
-- buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
-+ buffer_size = (endpoint->wMaxPacketSize > maxSize) ? endpoint->wMaxPacketSize : maxSize;
- port->bulk_in_size = buffer_size;
- port->bulk_in_endpointAddress = endpoint->bEndpointAddress;
- port->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
-@@ -1356,3 +1357,5 @@ MODULE_LICENSE("GPL");
-
- module_param(debug, bool, S_IRUGO | S_IWUSR);
- MODULE_PARM_DESC(debug, "Debug enabled or not");
-+module_param(maxSize, ushort,0);
-+MODULE_PARM_DESC(maxSize,"User specified USB endpoint size");
+++ /dev/null
---- a/init/main.c
-+++ b/init/main.c
-@@ -807,7 +807,7 @@ static noinline int init_post(void)
- numa_default_policy();
-
- if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
-- printk(KERN_WARNING "Warning: unable to open an initial console.\n");
-+ printk(KERN_WARNING "Please be patient, while OpenWrt loads ...\n");
-
- (void) sys_dup(0);
- (void) sys_dup(0);
+++ /dev/null
---- a/scripts/genksyms/parse.c_shipped
-+++ b/scripts/genksyms/parse.c_shipped
-@@ -160,7 +160,9 @@
-
-
- #include <assert.h>
-+#ifndef __APPLE__
- #include <malloc.h>
-+#endif
- #include "genksyms.h"
-
- static int is_typedef;
---- a/scripts/genksyms/parse.y
-+++ b/scripts/genksyms/parse.y
-@@ -24,7 +24,9 @@
- %{
-
- #include <assert.h>
-+#ifndef __APPLE__
- #include <malloc.h>
-+#endif
- #include "genksyms.h"
-
- static int is_typedef;
---- a/scripts/kallsyms.c
-+++ b/scripts/kallsyms.c
-@@ -22,6 +22,35 @@
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
-+#ifdef __APPLE__
-+/* Darwin has no memmem implementation, this one is ripped of the uClibc-0.9.28 source */
-+void *memmem (const void *haystack, size_t haystack_len,
-+ const void *needle, size_t needle_len)
-+{
-+ const char *begin;
-+ const char *const last_possible
-+ = (const char *) haystack + haystack_len - needle_len;
-+
-+ if (needle_len == 0)
-+ /* The first occurrence of the empty string is deemed to occur at
-+ the beginning of the string. */
-+ return (void *) haystack;
-+
-+ /* Sanity check, otherwise the loop might search through the whole
-+ memory. */
-+ if (__builtin_expect (haystack_len < needle_len, 0))
-+ return NULL;
-+
-+ for (begin = (const char *) haystack; begin <= last_possible; ++begin)
-+ if (begin[0] == ((const char *) needle)[0] &&
-+ !memcmp ((const void *) &begin[1],
-+ (const void *) ((const char *) needle + 1),
-+ needle_len - 1))
-+ return (void *) begin;
-+
-+ return NULL;
-+}
-+#endif
-
- #ifndef ARRAY_SIZE
- #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
---- a/scripts/kconfig/Makefile
-+++ b/scripts/kconfig/Makefile
-@@ -130,6 +130,9 @@ check-lxdialog := $(srctree)/$(src)/lxd
- # we really need to do so. (Do not call gcc as part of make mrproper)
- HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
- HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
-+ifeq ($(shell uname -s),Darwin)
-+HOST_LOADLIBES += -lncurses
-+endif
-
- HOST_EXTRACFLAGS += -DLOCALE
-
---- a/scripts/mod/mk_elfconfig.c
-+++ b/scripts/mod/mk_elfconfig.c
-@@ -1,7 +1,11 @@
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-+#ifndef __APPLE__
- #include <elf.h>
-+#else
-+#include "../../../../../tools/sstrip/include/elf.h"
-+#endif
-
- int
- main(int argc, char **argv)
---- a/scripts/mod/modpost.h
-+++ b/scripts/mod/modpost.h
-@@ -7,7 +7,11 @@
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <unistd.h>
-+#if !(defined(__APPLE__) || defined(__CYGWIN__))
- #include <elf.h>
-+#else
-+#include "../../../../../tools/sstrip/include/elf.h"
-+#endif
-
- #include "elfconfig.h"
-
+++ /dev/null
---- a/drivers/net/wireless/hostap/hostap_ap.c
-+++ b/drivers/net/wireless/hostap/hostap_ap.c
-@@ -2335,13 +2335,13 @@ int prism2_ap_get_sta_qual(local_info_t
- addr[count].sa_family = ARPHRD_ETHER;
- memcpy(addr[count].sa_data, sta->addr, ETH_ALEN);
- if (sta->last_rx_silence == 0)
-- qual[count].qual = sta->last_rx_signal < 27 ?
-- 0 : (sta->last_rx_signal - 27) * 92 / 127;
-+ qual[count].qual = (sta->last_rx_signal - 156) == 0 ?
-+ 0 : (sta->last_rx_signal - 156) * 92 / 64;
- else
-- qual[count].qual = sta->last_rx_signal -
-- sta->last_rx_silence - 35;
-- qual[count].level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);
-- qual[count].noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);
-+ qual[count].qual = (sta->last_rx_signal -
-+ sta->last_rx_silence) * 92 / 64;
-+ qual[count].level = sta->last_rx_signal;
-+ qual[count].noise = sta->last_rx_silence;
- qual[count].updated = sta->last_rx_updated;
-
- sta->last_rx_updated = IW_QUAL_DBM;
-@@ -2407,13 +2407,13 @@ int prism2_ap_translate_scan(struct net_
- memset(&iwe, 0, sizeof(iwe));
- iwe.cmd = IWEVQUAL;
- if (sta->last_rx_silence == 0)
-- iwe.u.qual.qual = sta->last_rx_signal < 27 ?
-- 0 : (sta->last_rx_signal - 27) * 92 / 127;
-+ iwe.u.qual.qual = (sta->last_rx_signal -156) == 0 ?
-+ 0 : (sta->last_rx_signal - 156) * 92 / 64;
- else
-- iwe.u.qual.qual = sta->last_rx_signal -
-- sta->last_rx_silence - 35;
-- iwe.u.qual.level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);
-- iwe.u.qual.noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);
-+ iwe.u.qual.qual = (sta->last_rx_signal -
-+ sta->last_rx_silence) * 92 / 64;
-+ iwe.u.qual.level = sta->last_rx_signal;
-+ iwe.u.qual.noise = sta->last_rx_silence;
- iwe.u.qual.updated = sta->last_rx_updated;
- iwe.len = IW_EV_QUAL_LEN;
- current_ev = iwe_stream_add_event(info, current_ev, end_buf,
---- a/drivers/net/wireless/hostap/hostap_config.h
-+++ b/drivers/net/wireless/hostap/hostap_config.h
-@@ -45,4 +45,9 @@
- */
- /* #define PRISM2_NO_STATION_MODES */
-
-+/* Enable TX power Setting functions
-+ * (min att = -128 , max att = 127)
-+ */
-+#define RAW_TXPOWER_SETTING
-+
- #endif /* HOSTAP_CONFIG_H */
---- a/drivers/net/wireless/hostap/hostap.h
-+++ b/drivers/net/wireless/hostap/hostap.h
-@@ -90,6 +90,7 @@ extern const struct iw_handler_def hosta
- extern const struct ethtool_ops prism2_ethtool_ops;
-
- int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
-+int hostap_restore_power(struct net_device *dev);
-
-
- #endif /* HOSTAP_H */
---- a/drivers/net/wireless/hostap/hostap_hw.c
-+++ b/drivers/net/wireless/hostap/hostap_hw.c
-@@ -932,6 +932,7 @@ static int hfa384x_set_rid(struct net_de
- prism2_hw_reset(dev);
- }
-
-+ hostap_restore_power(dev);
- return res;
- }
-
---- a/drivers/net/wireless/hostap/hostap_info.c
-+++ b/drivers/net/wireless/hostap/hostap_info.c
-@@ -432,6 +432,11 @@ static void handle_info_queue_linkstatus
- }
-
- /* Get BSSID if we have a valid AP address */
-+
-+ if ( val == HFA384X_LINKSTATUS_CONNECTED ||
-+ val == HFA384X_LINKSTATUS_DISCONNECTED )
-+ hostap_restore_power(local->dev);
-+
- if (connected) {
- netif_carrier_on(local->dev);
- netif_carrier_on(local->ddev);
---- a/drivers/net/wireless/hostap/hostap_ioctl.c
-+++ b/drivers/net/wireless/hostap/hostap_ioctl.c
-@@ -1476,23 +1476,20 @@ static int prism2_txpower_hfa386x_to_dBm
- val = 255;
-
- tmp = val;
-- tmp >>= 2;
-
-- return -12 - tmp;
-+ return tmp;
- }
-
- static u16 prism2_txpower_dBm_to_hfa386x(int val)
- {
- signed char tmp;
-
-- if (val > 20)
-- return 128;
-- else if (val < -43)
-+ if (val > 127)
- return 127;
-+ else if (val < -128)
-+ return 128;
-
- tmp = val;
-- tmp = -12 - tmp;
-- tmp <<= 2;
-
- return (unsigned char) tmp;
- }
-@@ -4056,3 +4053,35 @@ int hostap_ioctl(struct net_device *dev,
-
- return ret;
- }
-+
-+/* BUG FIX: Restore power setting value when lost due to F/W bug */
-+
-+int hostap_restore_power(struct net_device *dev)
-+{
-+ struct hostap_interface *iface = netdev_priv(dev);
-+ local_info_t *local = iface->local;
-+
-+ u16 val;
-+ int ret = 0;
-+
-+ if (local->txpower_type == PRISM2_TXPOWER_OFF) {
-+ val = 0xff; /* use all standby and sleep modes */
-+ ret = local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
-+ HFA386X_CR_A_D_TEST_MODES2,
-+ &val, NULL);
-+ }
-+
-+#ifdef RAW_TXPOWER_SETTING
-+ if (local->txpower_type == PRISM2_TXPOWER_FIXED) {
-+ val = HFA384X_TEST_CFG_BIT_ALC;
-+ local->func->cmd(dev, HFA384X_CMDCODE_TEST |
-+ (HFA384X_TEST_CFG_BITS << 8), 0, &val, NULL);
-+ val = prism2_txpower_dBm_to_hfa386x(local->txpower);
-+ ret = (local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
-+ HFA386X_CR_MANUAL_TX_POWER, &val, NULL));
-+ }
-+#endif /* RAW_TXPOWER_SETTING */
-+ return (ret ? -EOPNOTSUPP : 0);
-+}
-+
-+EXPORT_SYMBOL(hostap_restore_power);
+++ /dev/null
---- a/include/linux/stddef.h
-+++ b/include/linux/stddef.h
-@@ -16,6 +16,7 @@ enum {
- false = 0,
- true = 1
- };
-+#endif /* __KERNEL__ */
-
- #undef offsetof
- #ifdef __compiler_offsetof
-@@ -23,6 +24,5 @@ enum {
- #else
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
- #endif
--#endif /* __KERNEL__ */
-
- #endif
+++ /dev/null
---- a/arch/x86/boot/tools/build.c
-+++ b/arch/x86/boot/tools/build.c
-@@ -29,7 +29,6 @@
- #include <stdarg.h>
- #include <sys/types.h>
- #include <sys/stat.h>
--#include <sys/sysmacros.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/mman.h>
+++ /dev/null
-Fix spi-gpio for hotplug.
-
---mb
-
-
-
---- a/drivers/spi/spi_gpio.c
-+++ b/drivers/spi/spi_gpio.c
-@@ -218,7 +218,7 @@ static void spi_gpio_cleanup(struct spi_
- spi_bitbang_cleanup(spi);
- }
-
--static int __init spi_gpio_alloc(unsigned pin, const char *label, bool is_in)
-+static int __devinit spi_gpio_alloc(unsigned pin, const char *label, bool is_in)
- {
- int value;
-
-@@ -232,7 +232,7 @@ static int __init spi_gpio_alloc(unsigne
- return value;
- }
-
--static int __init
-+static int __devinit
- spi_gpio_request(struct spi_gpio_platform_data *pdata, const char *label)
- {
- int value;
-@@ -261,7 +261,7 @@ done:
- return value;
- }
-
--static int __init spi_gpio_probe(struct platform_device *pdev)
-+static int __devinit spi_gpio_probe(struct platform_device *pdev)
- {
- int status;
- struct spi_master *master;
-@@ -317,7 +317,7 @@ gpio_free:
- return status;
- }
-
--static int __exit spi_gpio_remove(struct platform_device *pdev)
-+static int __devexit spi_gpio_remove(struct platform_device *pdev)
- {
- struct spi_gpio *spi_gpio;
- struct spi_gpio_platform_data *pdata;
-@@ -344,12 +344,13 @@ MODULE_ALIAS("platform:" DRIVER_NAME);
- static struct platform_driver spi_gpio_driver = {
- .driver.name = DRIVER_NAME,
- .driver.owner = THIS_MODULE,
-- .remove = __exit_p(spi_gpio_remove),
-+ .probe = spi_gpio_probe,
-+ .remove = __devexit_p(spi_gpio_remove),
- };
-
- static int __init spi_gpio_init(void)
- {
-- return platform_driver_probe(&spi_gpio_driver, spi_gpio_probe);
-+ return platform_driver_register(&spi_gpio_driver);
- }
- module_init(spi_gpio_init);
-
+++ /dev/null
-Implement the SPI-GPIO delay function for busses that need speed limitation.
-
---mb
-
-
-
---- a/drivers/spi/spi_gpio.c
-+++ b/drivers/spi/spi_gpio.c
-@@ -21,6 +21,7 @@
- #include <linux/init.h>
- #include <linux/platform_device.h>
- #include <linux/gpio.h>
-+#include <linux/delay.h>
-
- #include <linux/spi/spi.h>
- #include <linux/spi/spi_bitbang.h>
-@@ -69,6 +70,7 @@ struct spi_gpio {
- * #define SPI_MOSI_GPIO 120
- * #define SPI_SCK_GPIO 121
- * #define SPI_N_CHIPSEL 4
-+ * #undef NEED_SPIDELAY
- * #include "spi_gpio.c"
- */
-
-@@ -76,6 +78,7 @@ struct spi_gpio {
- #define DRIVER_NAME "spi_gpio"
-
- #define GENERIC_BITBANG /* vs tight inlines */
-+#define NEED_SPIDELAY 1
-
- /* all functions referencing these symbols must define pdata */
- #define SPI_MISO_GPIO ((pdata)->miso)
-@@ -120,12 +123,20 @@ static inline int getmiso(const struct s
- #undef pdata
-
- /*
-- * NOTE: this clocks "as fast as we can". It "should" be a function of the
-- * requested device clock. Software overhead means we usually have trouble
-- * reaching even one Mbit/sec (except when we can inline bitops), so for now
-- * we'll just assume we never need additional per-bit slowdowns.
-+ * NOTE: to clock "as fast as we can", set spi_device.max_speed_hz
-+ * and spi_transfer.speed_hz to 0.
-+ * Otherwise this is a function of the requested device clock.
-+ * Software overhead means we usually have trouble
-+ * reaching even one Mbit/sec (except when we can inline bitops). So on small
-+ * embedded devices with fast SPI slaves you usually don't need a delay.
- */
--#define spidelay(nsecs) do {} while (0)
-+static inline void spidelay(unsigned nsecs)
-+{
-+#ifdef NEED_SPIDELAY
-+ if (unlikely(nsecs))
-+ ndelay(nsecs);
-+#endif /* NEED_SPIDELAY */
-+}
-
- #define EXPAND_BITBANG_TXRX
- #include <linux/spi/spi_bitbang.h>
+++ /dev/null
-THIS CODE IS DEPRECATED.
-
-Please use the new mainline SPI-GPIO driver, as of 2.6.29.
-
---mb
-
-
-
---- /dev/null
-+++ b/include/linux/spi/spi_gpio_old.h
-@@ -0,0 +1,73 @@
-+/*
-+ * spi_gpio interface to platform code
-+ *
-+ * Copyright (c) 2008 Piotr Skamruk
-+ * Copyright (c) 2008 Michael Buesch
-+ *
-+ * This program is free software; you can 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 _LINUX_SPI_SPI_GPIO
-+#define _LINUX_SPI_SPI_GPIO
-+
-+#include <linux/types.h>
-+#include <linux/spi/spi.h>
-+
-+
-+/**
-+ * struct spi_gpio_platform_data - Data definitions for a SPI-GPIO device.
-+ *
-+ * This structure holds information about a GPIO-based SPI device.
-+ *
-+ * @pin_clk: The GPIO pin number of the CLOCK pin.
-+ *
-+ * @pin_miso: The GPIO pin number of the MISO pin.
-+ *
-+ * @pin_mosi: The GPIO pin number of the MOSI pin.
-+ *
-+ * @pin_cs: The GPIO pin number of the CHIPSELECT pin.
-+ *
-+ * @cs_activelow: If true, the chip is selected when the CS line is low.
-+ *
-+ * @no_spi_delay: If true, no delay is done in the lowlevel bitbanging.
-+ * Note that doing no delay is not standards compliant,
-+ * but it might be needed to speed up transfers on some
-+ * slow embedded machines.
-+ *
-+ * @boardinfo_setup: This callback is called after the
-+ * SPI master device was registered, but before the
-+ * device is registered.
-+ * @boardinfo_setup_data: Data argument passed to boardinfo_setup().
-+ */
-+struct spi_gpio_platform_data {
-+ unsigned int pin_clk;
-+ unsigned int pin_miso;
-+ unsigned int pin_mosi;
-+ unsigned int pin_cs;
-+ bool cs_activelow;
-+ bool no_spi_delay;
-+ int (*boardinfo_setup)(struct spi_board_info *bi,
-+ struct spi_master *master,
-+ void *data);
-+ void *boardinfo_setup_data;
-+};
-+
-+/**
-+ * SPI_GPIO_PLATDEV_NAME - The platform device name string.
-+ *
-+ * The name string that has to be used for platform_device_alloc
-+ * when allocating a spi-gpio device.
-+ */
-+#define SPI_GPIO_PLATDEV_NAME "spi-gpio"
-+
-+/**
-+ * spi_gpio_next_id - Get another platform device ID number.
-+ *
-+ * This returns the next platform device ID number that has to be used
-+ * for platform_device_alloc. The ID is opaque and should not be used for
-+ * anything else.
-+ */
-+int spi_gpio_next_id(void);
-+
-+#endif /* _LINUX_SPI_SPI_GPIO */
---- /dev/null
-+++ b/drivers/spi/spi_gpio_old.c
-@@ -0,0 +1,251 @@
-+/*
-+ * Bitbanging SPI bus driver using GPIO API
-+ *
-+ * Copyright (c) 2008 Piotr Skamruk
-+ * Copyright (c) 2008 Michael Buesch
-+ *
-+ * based on spi_s3c2410_gpio.c
-+ * Copyright (c) 2006 Ben Dooks
-+ * Copyright (c) 2006 Simtec Electronics
-+ * and on i2c-gpio.c
-+ * Copyright (C) 2007 Atmel Corporation
-+ *
-+ * This program is free software; you can 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/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/spi/spi.h>
-+#include <linux/spi/spi_bitbang.h>
-+#include <linux/spi/spi_gpio_old.h>
-+#include <linux/gpio.h>
-+#include <asm/atomic.h>
-+
-+
-+struct spi_gpio {
-+ struct spi_bitbang bitbang;
-+ struct spi_gpio_platform_data *info;
-+ struct platform_device *pdev;
-+ struct spi_board_info bi;
-+};
-+
-+
-+static inline struct spi_gpio *spidev_to_sg(struct spi_device *dev)
-+{
-+ return dev->controller_data;
-+}
-+
-+static inline void setsck(struct spi_device *dev, int val)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+ gpio_set_value(sp->info->pin_clk, val ? 1 : 0);
-+}
-+
-+static inline void setmosi(struct spi_device *dev, int val)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+ gpio_set_value(sp->info->pin_mosi, val ? 1 : 0);
-+}
-+
-+static inline u32 getmiso(struct spi_device *dev)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+ return gpio_get_value(sp->info->pin_miso) ? 1 : 0;
-+}
-+
-+static inline void do_spidelay(struct spi_device *dev, unsigned nsecs)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+
-+ if (!sp->info->no_spi_delay)
-+ ndelay(nsecs);
-+}
-+
-+#define spidelay(nsecs) do { \
-+ /* Steal the spi_device pointer from our caller. \
-+ * The bitbang-API should probably get fixed here... */ \
-+ do_spidelay(spi, nsecs); \
-+ } while (0)
-+
-+#define EXPAND_BITBANG_TXRX
-+#include <linux/spi/spi_bitbang.h>
-+
-+static u32 spi_gpio_txrx_mode0(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
-+}
-+
-+static u32 spi_gpio_txrx_mode1(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits);
-+}
-+
-+static u32 spi_gpio_txrx_mode2(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits);
-+}
-+
-+static u32 spi_gpio_txrx_mode3(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits);
-+}
-+
-+static void spi_gpio_chipselect(struct spi_device *dev, int on)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+
-+ if (sp->info->cs_activelow)
-+ on = !on;
-+ gpio_set_value(sp->info->pin_cs, on ? 1 : 0);
-+}
-+
-+static int spi_gpio_probe(struct platform_device *pdev)
-+{
-+ struct spi_master *master;
-+ struct spi_gpio_platform_data *pdata;
-+ struct spi_gpio *sp;
-+ struct spi_device *spidev;
-+ int err;
-+
-+ pdata = pdev->dev.platform_data;
-+ if (!pdata)
-+ return -ENXIO;
-+
-+ err = -ENOMEM;
-+ master = spi_alloc_master(&pdev->dev, sizeof(struct spi_gpio));
-+ if (!master)
-+ goto err_alloc_master;
-+
-+ sp = spi_master_get_devdata(master);
-+ platform_set_drvdata(pdev, sp);
-+ sp->info = pdata;
-+
-+ err = gpio_request(pdata->pin_clk, "spi_clock");
-+ if (err)
-+ goto err_request_clk;
-+ err = gpio_request(pdata->pin_mosi, "spi_mosi");
-+ if (err)
-+ goto err_request_mosi;
-+ err = gpio_request(pdata->pin_miso, "spi_miso");
-+ if (err)
-+ goto err_request_miso;
-+ err = gpio_request(pdata->pin_cs, "spi_cs");
-+ if (err)
-+ goto err_request_cs;
-+
-+ sp->bitbang.master = spi_master_get(master);
-+ sp->bitbang.master->bus_num = -1;
-+ sp->bitbang.master->num_chipselect = 1;
-+ sp->bitbang.chipselect = spi_gpio_chipselect;
-+ sp->bitbang.txrx_word[SPI_MODE_0] = spi_gpio_txrx_mode0;
-+ sp->bitbang.txrx_word[SPI_MODE_1] = spi_gpio_txrx_mode1;
-+ sp->bitbang.txrx_word[SPI_MODE_2] = spi_gpio_txrx_mode2;
-+ sp->bitbang.txrx_word[SPI_MODE_3] = spi_gpio_txrx_mode3;
-+
-+ gpio_direction_output(pdata->pin_clk, 0);
-+ gpio_direction_output(pdata->pin_mosi, 0);
-+ gpio_direction_output(pdata->pin_cs,
-+ pdata->cs_activelow ? 1 : 0);
-+ gpio_direction_input(pdata->pin_miso);
-+
-+ err = spi_bitbang_start(&sp->bitbang);
-+ if (err)
-+ goto err_no_bitbang;
-+ err = pdata->boardinfo_setup(&sp->bi, master,
-+ pdata->boardinfo_setup_data);
-+ if (err)
-+ goto err_bi_setup;
-+ sp->bi.controller_data = sp;
-+ spidev = spi_new_device(master, &sp->bi);
-+ if (!spidev)
-+ goto err_new_dev;
-+
-+ return 0;
-+
-+err_new_dev:
-+err_bi_setup:
-+ spi_bitbang_stop(&sp->bitbang);
-+err_no_bitbang:
-+ spi_master_put(sp->bitbang.master);
-+ gpio_free(pdata->pin_cs);
-+err_request_cs:
-+ gpio_free(pdata->pin_miso);
-+err_request_miso:
-+ gpio_free(pdata->pin_mosi);
-+err_request_mosi:
-+ gpio_free(pdata->pin_clk);
-+err_request_clk:
-+ kfree(master);
-+
-+err_alloc_master:
-+ return err;
-+}
-+
-+static int __devexit spi_gpio_remove(struct platform_device *pdev)
-+{
-+ struct spi_gpio *sp;
-+ struct spi_gpio_platform_data *pdata;
-+
-+ pdata = pdev->dev.platform_data;
-+ sp = platform_get_drvdata(pdev);
-+
-+ gpio_free(pdata->pin_clk);
-+ gpio_free(pdata->pin_mosi);
-+ gpio_free(pdata->pin_miso);
-+ gpio_free(pdata->pin_cs);
-+ spi_bitbang_stop(&sp->bitbang);
-+ spi_master_put(sp->bitbang.master);
-+
-+ return 0;
-+}
-+
-+static struct platform_driver spi_gpio_driver = {
-+ .driver = {
-+ .name = SPI_GPIO_PLATDEV_NAME,
-+ .owner = THIS_MODULE,
-+ },
-+ .probe = spi_gpio_probe,
-+ .remove = __devexit_p(spi_gpio_remove),
-+};
-+
-+int spi_gpio_next_id(void)
-+{
-+ static atomic_t counter = ATOMIC_INIT(-1);
-+
-+ return atomic_inc_return(&counter);
-+}
-+EXPORT_SYMBOL(spi_gpio_next_id);
-+
-+static int __init spi_gpio_init(void)
-+{
-+ int err;
-+
-+ err = platform_driver_register(&spi_gpio_driver);
-+ if (err)
-+ printk(KERN_ERR "spi-gpio: register failed: %d\n", err);
-+
-+ return err;
-+}
-+module_init(spi_gpio_init);
-+
-+static void __exit spi_gpio_exit(void)
-+{
-+ platform_driver_unregister(&spi_gpio_driver);
-+}
-+module_exit(spi_gpio_exit);
-+
-+MODULE_AUTHOR("Piot Skamruk <piotr.skamruk at gmail.com>");
-+MODULE_AUTHOR("Michael Buesch");
-+MODULE_DESCRIPTION("Platform independent GPIO bitbanging SPI driver");
-+MODULE_LICENSE("GPL v2");
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -116,6 +116,15 @@ config SPI_GPIO
- GPIO operations, you should be able to leverage that for better
- speed with a custom version of this driver; see the source code.
-
-+config SPI_GPIO_OLD
-+ tristate "Old GPIO API based bitbanging SPI controller (DEPRECATED)"
-+ depends on SPI_MASTER && GENERIC_GPIO
-+ select SPI_BITBANG
-+ help
-+ This code is deprecated. Please use the new mainline SPI-GPIO driver.
-+
-+ If unsure, say N.
-+
- config SPI_IMX
- tristate "Freescale i.MX SPI controllers"
- depends on ARCH_MXC
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -19,6 +19,7 @@ obj-$(CONFIG_SPI_BUTTERFLY) += spi_butt
- obj-$(CONFIG_SPI_DESIGNWARE) += dw_spi.o
- obj-$(CONFIG_SPI_DW_PCI) += dw_spi_pci.o
- obj-$(CONFIG_SPI_GPIO) += spi_gpio.o
-+obj-$(CONFIG_SPI_GPIO_OLD) += spi_gpio_old.o
- obj-$(CONFIG_SPI_IMX) += spi_imx.o
- obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o
- obj-$(CONFIG_SPI_PXA2XX) += pxa2xx_spi.o
+++ /dev/null
---- /dev/null
-+++ b/drivers/mmc/host/gpiommc.c
-@@ -0,0 +1,608 @@
-+/*
-+ * Driver an MMC/SD card on a bitbanging GPIO SPI bus.
-+ * This module hooks up the mmc_spi and spi_gpio modules and also
-+ * provides a configfs interface.
-+ *
-+ * Copyright 2008 Michael Buesch <mb@bu3sch.de>
-+ *
-+ * Licensed under the GNU/GPL. See COPYING for details.
-+ */
-+
-+#include <linux/mmc/gpiommc.h>
-+#include <linux/platform_device.h>
-+#include <linux/list.h>
-+#include <linux/mutex.h>
-+#include <linux/spi/spi_gpio_old.h>
-+#include <linux/configfs.h>
-+#include <linux/gpio.h>
-+#include <asm/atomic.h>
-+
-+
-+#define PFX "gpio-mmc: "
-+
-+
-+struct gpiommc_device {
-+ struct platform_device *pdev;
-+ struct platform_device *spi_pdev;
-+ struct spi_board_info boardinfo;
-+};
-+
-+
-+MODULE_DESCRIPTION("GPIO based MMC driver");
-+MODULE_AUTHOR("Michael Buesch");
-+MODULE_LICENSE("GPL");
-+
-+
-+static int gpiommc_boardinfo_setup(struct spi_board_info *bi,
-+ struct spi_master *master,
-+ void *data)
-+{
-+ struct gpiommc_device *d = data;
-+ struct gpiommc_platform_data *pdata = d->pdev->dev.platform_data;
-+
-+ /* Bind the SPI master to the MMC-SPI host driver. */
-+ strlcpy(bi->modalias, "mmc_spi", sizeof(bi->modalias));
-+
-+ bi->max_speed_hz = pdata->max_bus_speed;
-+ bi->bus_num = master->bus_num;
-+ bi->mode = pdata->mode;
-+
-+ return 0;
-+}
-+
-+static int gpiommc_probe(struct platform_device *pdev)
-+{
-+ struct gpiommc_platform_data *mmc_pdata = pdev->dev.platform_data;
-+ struct spi_gpio_platform_data spi_pdata;
-+ struct gpiommc_device *d;
-+ int err;
-+
-+ err = -ENXIO;
-+ if (!mmc_pdata)
-+ goto error;
-+
-+#ifdef CONFIG_MMC_SPI_MODULE
-+ err = request_module("mmc_spi");
-+ if (err) {
-+ printk(KERN_WARNING PFX
-+ "Failed to request mmc_spi module.\n");
-+ }
-+#endif /* CONFIG_MMC_SPI_MODULE */
-+
-+ /* Allocate the GPIO-MMC device */
-+ err = -ENOMEM;
-+ d = kzalloc(sizeof(*d), GFP_KERNEL);
-+ if (!d)
-+ goto error;
-+ d->pdev = pdev;
-+
-+ /* Create the SPI-GPIO device */
-+ d->spi_pdev = platform_device_alloc(SPI_GPIO_PLATDEV_NAME,
-+ spi_gpio_next_id());
-+ if (!d->spi_pdev)
-+ goto err_free_d;
-+
-+ memset(&spi_pdata, 0, sizeof(spi_pdata));
-+ spi_pdata.pin_clk = mmc_pdata->pins.gpio_clk;
-+ spi_pdata.pin_miso = mmc_pdata->pins.gpio_do;
-+ spi_pdata.pin_mosi = mmc_pdata->pins.gpio_di;
-+ spi_pdata.pin_cs = mmc_pdata->pins.gpio_cs;
-+ spi_pdata.cs_activelow = mmc_pdata->pins.cs_activelow;
-+ spi_pdata.no_spi_delay = mmc_pdata->no_spi_delay;
-+ spi_pdata.boardinfo_setup = gpiommc_boardinfo_setup;
-+ spi_pdata.boardinfo_setup_data = d;
-+
-+ err = platform_device_add_data(d->spi_pdev, &spi_pdata,
-+ sizeof(spi_pdata));
-+ if (err)
-+ goto err_free_pdev;
-+ err = platform_device_add(d->spi_pdev);
-+ if (err)
-+ goto err_free_pdata;
-+ platform_set_drvdata(pdev, d);
-+
-+ printk(KERN_INFO PFX "MMC-Card \"%s\" "
-+ "attached to GPIO pins di=%u, do=%u, clk=%u, cs=%u\n",
-+ mmc_pdata->name, mmc_pdata->pins.gpio_di,
-+ mmc_pdata->pins.gpio_do,
-+ mmc_pdata->pins.gpio_clk,
-+ mmc_pdata->pins.gpio_cs);
-+
-+ return 0;
-+
-+err_free_pdata:
-+ kfree(d->spi_pdev->dev.platform_data);
-+ d->spi_pdev->dev.platform_data = NULL;
-+err_free_pdev:
-+ platform_device_put(d->spi_pdev);
-+err_free_d:
-+ kfree(d);
-+error:
-+ return err;
-+}
-+
-+static int gpiommc_remove(struct platform_device *pdev)
-+{
-+ struct gpiommc_device *d = platform_get_drvdata(pdev);
-+ struct gpiommc_platform_data *pdata = d->pdev->dev.platform_data;
-+
-+ platform_device_unregister(d->spi_pdev);
-+ printk(KERN_INFO PFX "GPIO based MMC-Card \"%s\" removed\n",
-+ pdata->name);
-+ platform_device_put(d->spi_pdev);
-+
-+ return 0;
-+}
-+
-+#ifdef CONFIG_GPIOMMC_CONFIGFS
-+
-+/* A device that was created through configfs */
-+struct gpiommc_configfs_device {
-+ struct config_item item;
-+ /* The platform device, after registration. */
-+ struct platform_device *pdev;
-+ /* The configuration */
-+ struct gpiommc_platform_data pdata;
-+};
-+
-+#define GPIO_INVALID -1
-+
-+static inline bool gpiommc_is_registered(struct gpiommc_configfs_device *dev)
-+{
-+ return (dev->pdev != NULL);
-+}
-+
-+static inline struct gpiommc_configfs_device *ci_to_gpiommc(struct config_item *item)
-+{
-+ return item ? container_of(item, struct gpiommc_configfs_device, item) : NULL;
-+}
-+
-+static struct configfs_attribute gpiommc_attr_DI = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_data_in",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_DO = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_data_out",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_CLK = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_clock",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_CS = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_chipselect",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_CS_activelow = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_chipselect_activelow",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_spimode = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "spi_mode",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_spidelay = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "spi_delay",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_max_bus_speed = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "max_bus_speed",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_register = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "register",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute *gpiommc_config_attrs[] = {
-+ &gpiommc_attr_DI,
-+ &gpiommc_attr_DO,
-+ &gpiommc_attr_CLK,
-+ &gpiommc_attr_CS,
-+ &gpiommc_attr_CS_activelow,
-+ &gpiommc_attr_spimode,
-+ &gpiommc_attr_spidelay,
-+ &gpiommc_attr_max_bus_speed,
-+ &gpiommc_attr_register,
-+ NULL,
-+};
-+
-+static ssize_t gpiommc_config_attr_show(struct config_item *item,
-+ struct configfs_attribute *attr,
-+ char *page)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+ ssize_t count = 0;
-+ unsigned int gpio;
-+ int err = 0;
-+
-+ if (attr == &gpiommc_attr_DI) {
-+ gpio = dev->pdata.pins.gpio_di;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_DO) {
-+ gpio = dev->pdata.pins.gpio_do;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CLK) {
-+ gpio = dev->pdata.pins.gpio_clk;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS) {
-+ gpio = dev->pdata.pins.gpio_cs;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS_activelow) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ dev->pdata.pins.cs_activelow);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spimode) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ dev->pdata.mode);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spidelay) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ !dev->pdata.no_spi_delay);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_max_bus_speed) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ dev->pdata.max_bus_speed);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_register) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ gpiommc_is_registered(dev));
-+ goto out;
-+ }
-+ WARN_ON(1);
-+ err = -ENOSYS;
-+out:
-+ return err ? err : count;
-+}
-+
-+static int gpiommc_do_register(struct gpiommc_configfs_device *dev,
-+ const char *name)
-+{
-+ int err;
-+
-+ if (gpiommc_is_registered(dev))
-+ return 0;
-+
-+ if (!gpio_is_valid(dev->pdata.pins.gpio_di) ||
-+ !gpio_is_valid(dev->pdata.pins.gpio_do) ||
-+ !gpio_is_valid(dev->pdata.pins.gpio_clk) ||
-+ !gpio_is_valid(dev->pdata.pins.gpio_cs)) {
-+ printk(KERN_ERR PFX
-+ "configfs: Invalid GPIO pin number(s)\n");
-+ return -EINVAL;
-+ }
-+
-+ strlcpy(dev->pdata.name, name,
-+ sizeof(dev->pdata.name));
-+
-+ dev->pdev = platform_device_alloc(GPIOMMC_PLATDEV_NAME,
-+ gpiommc_next_id());
-+ if (!dev->pdev)
-+ return -ENOMEM;
-+ err = platform_device_add_data(dev->pdev, &dev->pdata,
-+ sizeof(dev->pdata));
-+ if (err) {
-+ platform_device_put(dev->pdev);
-+ return err;
-+ }
-+ err = platform_device_add(dev->pdev);
-+ if (err) {
-+ platform_device_put(dev->pdev);
-+ return err;
-+ }
-+
-+ return 0;
-+}
-+
-+static void gpiommc_do_unregister(struct gpiommc_configfs_device *dev)
-+{
-+ if (!gpiommc_is_registered(dev))
-+ return;
-+
-+ platform_device_unregister(dev->pdev);
-+ dev->pdev = NULL;
-+}
-+
-+static ssize_t gpiommc_config_attr_store(struct config_item *item,
-+ struct configfs_attribute *attr,
-+ const char *page, size_t count)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+ int err = -EINVAL;
-+ unsigned long data;
-+
-+ if (attr == &gpiommc_attr_register) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data == 1)
-+ err = gpiommc_do_register(dev, item->ci_name);
-+ if (data == 0) {
-+ gpiommc_do_unregister(dev);
-+ err = 0;
-+ }
-+ goto out;
-+ }
-+
-+ if (gpiommc_is_registered(dev)) {
-+ /* The rest of the config parameters can only be set
-+ * as long as the device is not registered, yet. */
-+ err = -EBUSY;
-+ goto out;
-+ }
-+
-+ if (attr == &gpiommc_attr_DI) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_di = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_DO) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_do = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CLK) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_clk = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_cs = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS_activelow) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data != 0 && data != 1)
-+ goto out;
-+ dev->pdata.pins.cs_activelow = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spimode) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ switch (data) {
-+ case 0:
-+ dev->pdata.mode = SPI_MODE_0;
-+ break;
-+ case 1:
-+ dev->pdata.mode = SPI_MODE_1;
-+ break;
-+ case 2:
-+ dev->pdata.mode = SPI_MODE_2;
-+ break;
-+ case 3:
-+ dev->pdata.mode = SPI_MODE_3;
-+ break;
-+ default:
-+ goto out;
-+ }
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spidelay) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data != 0 && data != 1)
-+ goto out;
-+ dev->pdata.no_spi_delay = !data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_max_bus_speed) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data > UINT_MAX)
-+ goto out;
-+ dev->pdata.max_bus_speed = data;
-+ err = 0;
-+ goto out;
-+ }
-+ WARN_ON(1);
-+ err = -ENOSYS;
-+out:
-+ return err ? err : count;
-+}
-+
-+static void gpiommc_config_item_release(struct config_item *item)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+
-+ kfree(dev);
-+}
-+
-+static struct configfs_item_operations gpiommc_config_item_ops = {
-+ .release = gpiommc_config_item_release,
-+ .show_attribute = gpiommc_config_attr_show,
-+ .store_attribute = gpiommc_config_attr_store,
-+};
-+
-+static struct config_item_type gpiommc_dev_ci_type = {
-+ .ct_item_ops = &gpiommc_config_item_ops,
-+ .ct_attrs = gpiommc_config_attrs,
-+ .ct_owner = THIS_MODULE,
-+};
-+
-+static struct config_item *gpiommc_make_item(struct config_group *group,
-+ const char *name)
-+{
-+ struct gpiommc_configfs_device *dev;
-+
-+ if (strlen(name) > GPIOMMC_MAX_NAMELEN) {
-+ printk(KERN_ERR PFX "configfs: device name too long\n");
-+ return NULL;
-+ }
-+
-+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-+ if (!dev)
-+ return NULL;
-+
-+ config_item_init_type_name(&dev->item, name,
-+ &gpiommc_dev_ci_type);
-+
-+ /* Assign default configuration */
-+ dev->pdata.pins.gpio_di = GPIO_INVALID;
-+ dev->pdata.pins.gpio_do = GPIO_INVALID;
-+ dev->pdata.pins.gpio_clk = GPIO_INVALID;
-+ dev->pdata.pins.gpio_cs = GPIO_INVALID;
-+ dev->pdata.pins.cs_activelow = 1;
-+ dev->pdata.mode = SPI_MODE_0;
-+ dev->pdata.no_spi_delay = 0;
-+ dev->pdata.max_bus_speed = 5000000; /* 5 MHz */
-+
-+ return &(dev->item);
-+}
-+
-+static void gpiommc_drop_item(struct config_group *group,
-+ struct config_item *item)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+
-+ gpiommc_do_unregister(dev);
-+ kfree(dev);
-+}
-+
-+static struct configfs_group_operations gpiommc_ct_group_ops = {
-+ .make_item = gpiommc_make_item,
-+ .drop_item = gpiommc_drop_item,
-+};
-+
-+static struct config_item_type gpiommc_ci_type = {
-+ .ct_group_ops = &gpiommc_ct_group_ops,
-+ .ct_owner = THIS_MODULE,
-+};
-+
-+static struct configfs_subsystem gpiommc_subsys = {
-+ .su_group = {
-+ .cg_item = {
-+ .ci_namebuf = GPIOMMC_PLATDEV_NAME,
-+ .ci_type = &gpiommc_ci_type,
-+ },
-+ },
-+ .su_mutex = __MUTEX_INITIALIZER(gpiommc_subsys.su_mutex),
-+};
-+
-+#endif /* CONFIG_GPIOMMC_CONFIGFS */
-+
-+static struct platform_driver gpiommc_plat_driver = {
-+ .probe = gpiommc_probe,
-+ .remove = gpiommc_remove,
-+ .driver = {
-+ .name = GPIOMMC_PLATDEV_NAME,
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+int gpiommc_next_id(void)
-+{
-+ static atomic_t counter = ATOMIC_INIT(-1);
-+
-+ return atomic_inc_return(&counter);
-+}
-+EXPORT_SYMBOL(gpiommc_next_id);
-+
-+static int __init gpiommc_modinit(void)
-+{
-+ int err;
-+
-+ err = platform_driver_register(&gpiommc_plat_driver);
-+ if (err)
-+ return err;
-+
-+#ifdef CONFIG_GPIOMMC_CONFIGFS
-+ config_group_init(&gpiommc_subsys.su_group);
-+ err = configfs_register_subsystem(&gpiommc_subsys);
-+ if (err) {
-+ platform_driver_unregister(&gpiommc_plat_driver);
-+ return err;
-+ }
-+#endif /* CONFIG_GPIOMMC_CONFIGFS */
-+
-+ return 0;
-+}
-+module_init(gpiommc_modinit);
-+
-+static void __exit gpiommc_modexit(void)
-+{
-+#ifdef CONFIG_GPIOMMC_CONFIGFS
-+ configfs_unregister_subsystem(&gpiommc_subsys);
-+#endif
-+ platform_driver_unregister(&gpiommc_plat_driver);
-+}
-+module_exit(gpiommc_modexit);
---- a/drivers/mmc/host/Kconfig
-+++ b/drivers/mmc/host/Kconfig
-@@ -373,6 +373,31 @@ config MMC_TMIO
- This provides support for the SD/MMC cell found in TC6393XB,
- T7L66XB and also HTC ASIC3
-
-+config GPIOMMC
-+ tristate "MMC/SD over GPIO-based SPI"
-+ depends on MMC && MMC_SPI && SPI_GPIO_OLD
-+ help
-+ This driver hooks up the mmc_spi and spi_gpio modules so that
-+ MMC/SD cards can be used on a GPIO based bus by bitbanging
-+ the SPI protocol in software.
-+
-+ This driver provides a configfs interface to dynamically create
-+ and destroy GPIO-based MMC/SD card devices. It also provides
-+ a platform device interface API.
-+ See Documentation/gpiommc.txt for details.
-+
-+ The module will be called gpiommc.
-+
-+ If unsure, say N.
-+
-+config GPIOMMC_CONFIGFS
-+ bool
-+ depends on GPIOMMC && CONFIGFS_FS
-+ default y
-+ help
-+ This option automatically enables configfs support for gpiommc
-+ if configfs is available.
-+
- config MMC_CB710
- tristate "ENE CB710 MMC/SD Interface support"
- depends on PCI
---- a/drivers/mmc/host/Makefile
-+++ b/drivers/mmc/host/Makefile
-@@ -34,6 +34,7 @@ obj-$(CONFIG_MMC_SDRICOH_CS) += sdricoh_
- obj-$(CONFIG_MMC_TMIO) += tmio_mmc.o
- obj-$(CONFIG_MMC_CB710) += cb710-mmc.o
- obj-$(CONFIG_MMC_VIA_SDMMC) += via-sdmmc.o
-+obj-$(CONFIG_GPIOMMC) += gpiommc.o
- obj-$(CONFIG_SDH_BFIN) += bfin_sdh.o
-
- obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
---- /dev/null
-+++ b/include/linux/mmc/gpiommc.h
-@@ -0,0 +1,71 @@
-+/*
-+ * Device driver for MMC/SD cards driven over a GPIO bus.
-+ *
-+ * Copyright (c) 2008 Michael Buesch
-+ *
-+ * Licensed under the GNU/GPL version 2.
-+ */
-+#ifndef LINUX_GPIOMMC_H_
-+#define LINUX_GPIOMMC_H_
-+
-+#include <linux/types.h>
-+
-+
-+#define GPIOMMC_MAX_NAMELEN 15
-+#define GPIOMMC_MAX_NAMELEN_STR __stringify(GPIOMMC_MAX_NAMELEN)
-+
-+/**
-+ * struct gpiommc_pins - Hardware pin assignments
-+ *
-+ * @gpio_di: The GPIO number of the DATA IN pin
-+ * @gpio_do: The GPIO number of the DATA OUT pin
-+ * @gpio_clk: The GPIO number of the CLOCK pin
-+ * @gpio_cs: The GPIO number of the CHIPSELECT pin
-+ * @cs_activelow: If true, the chip is considered selected if @gpio_cs is low.
-+ */
-+struct gpiommc_pins {
-+ unsigned int gpio_di;
-+ unsigned int gpio_do;
-+ unsigned int gpio_clk;
-+ unsigned int gpio_cs;
-+ bool cs_activelow;
-+};
-+
-+/**
-+ * struct gpiommc_platform_data - Platform data for a MMC-over-SPI-GPIO device.
-+ *
-+ * @name: The unique name string of the device.
-+ * @pins: The hardware pin assignments.
-+ * @mode: The hardware mode. This is either SPI_MODE_0,
-+ * SPI_MODE_1, SPI_MODE_2 or SPI_MODE_3. See the SPI documentation.
-+ * @no_spi_delay: Do not use delays in the lowlevel SPI bitbanging code.
-+ * This is not standards compliant, but may be required for some
-+ * embedded machines to gain reasonable speed.
-+ * @max_bus_speed: The maximum speed of the SPI bus, in Hertz.
-+ */
-+struct gpiommc_platform_data {
-+ char name[GPIOMMC_MAX_NAMELEN + 1];
-+ struct gpiommc_pins pins;
-+ u8 mode;
-+ bool no_spi_delay;
-+ unsigned int max_bus_speed;
-+};
-+
-+/**
-+ * GPIOMMC_PLATDEV_NAME - The platform device name string.
-+ *
-+ * The name string that has to be used for platform_device_alloc
-+ * when allocating a gpiommc device.
-+ */
-+#define GPIOMMC_PLATDEV_NAME "gpiommc"
-+
-+/**
-+ * gpiommc_next_id - Get another platform device ID number.
-+ *
-+ * This returns the next platform device ID number that has to be used
-+ * for platform_device_alloc. The ID is opaque and should not be used for
-+ * anything else.
-+ */
-+int gpiommc_next_id(void);
-+
-+#endif /* LINUX_GPIOMMC_H_ */
---- /dev/null
-+++ b/Documentation/gpiommc.txt
-@@ -0,0 +1,97 @@
-+GPIOMMC - Driver for an MMC/SD card on a bitbanging GPIO SPI bus
-+================================================================
-+
-+The gpiommc module hooks up the mmc_spi and spi_gpio modules for running an
-+MMC or SD card on GPIO pins.
-+
-+Two interfaces for registering a new MMC/SD card device are provided:
-+A static platform-device based mechanism and a dynamic configfs based interface.
-+
-+
-+Registering devices via platform-device
-+=======================================
-+
-+The platform-device interface is used for registering MMC/SD devices that are
-+part of the hardware platform. This is most useful only for embedded machines
-+with MMC/SD devices statically connected to the platform GPIO bus.
-+
-+The data structures are declared in <linux/mmc/gpiommc.h>.
-+
-+To register a new device, define an instance of struct gpiommc_platform_data.
-+This structure holds any information about how the device is hooked up to the
-+GPIO pins and what hardware modes the device supports. See the docbook-style
-+documentation in the header file for more information on the struct fields.
-+
-+Then allocate a new instance of a platform device by doing:
-+
-+ pdev = platform_device_alloc(GPIOMMC_PLATDEV_NAME, gpiommc_next_id());
-+
-+This will allocate the platform device data structures and hook it up to the
-+gpiommc driver.
-+Then add the gpiommc_platform_data to the platform device.
-+
-+ err = platform_device_add_data(pdev, pdata, sizeof(struct gpiommc_platform_data));
-+
-+You may free the local instance of struct gpiommc_platform_data now. (So the
-+struct may be allocated on the stack, too).
-+Now simply register the platform device.
-+
-+ err = platform_device_add(pdev);
-+
-+Done. The gpiommc probe routine will be invoked now and you should see a kernel
-+log message for the added device.
-+
-+
-+Registering devices via configfs
-+================================
-+
-+MMC/SD cards connected via GPIO often are a pretty dynamic thing, as for example
-+selfmade hacks for soldering an MMC/SD card to standard GPIO pins on embedded
-+hardware are a common situation.
-+So we provide a dynamic interface to conveniently handle adding and removing
-+devices from userspace, without the need to recompile the kernel.
-+
-+The "gpiommc" subdirectory at the configfs mountpoint is used for handling
-+the dynamic configuration.
-+
-+To create a new device, it must first be allocated with mkdir.
-+The following command will allocate a device named "my_mmc":
-+ mkdir /config/gpiommc/my_mmc
-+
-+There are several configuration files available in the new
-+/config/gpiommc/my_mmc/ directory:
-+
-+gpio_data_in = The SPI data-IN GPIO pin number.
-+gpio_data_out = The SPI data-OUT GPIO pin number.
-+gpio_clock = The SPI Clock GPIO pin number.
-+gpio_chipselect = The SPI Chipselect GPIO pin number.
-+gpio_chipselect_activelow = Boolean. If 0, Chipselect is active-HIGH.
-+ If 1, Chipselect is active-LOW.
-+spi_mode = The SPI data mode. Can be 0-3.
-+spi_delay = Enable all delays in the lowlevel bitbanging.
-+max_bus_speed = The maximum SPI bus speed. In Hertz.
-+
-+register = Not a configuration parameter.
-+ Used to register the configured card
-+ with the kernel.
-+
-+The device must first get configured and then registered by writing "1" to
-+the "register" file.
-+The configuration parameters "gpio_data_in", "gpio_data_out", "gpio_clock"
-+and "gpio_chipselect" are essential and _must_ be configured before writing
-+"1" to the "register" file. The registration will fail, otherwise.
-+
-+The default values for the other parameters are:
-+gpio_chipselect_activelow = 1 (CS active-LOW)
-+spi_mode = 0 (SPI_MODE_0)
-+spi_delay = 1 (enabled)
-+max_bus_speed = 5000000 (5 Mhz)
-+
-+Configuration values can not be changed after registration. To unregister
-+the device, write a "0" to the "register" file. The configuration can be
-+changed again after unregistering.
-+
-+To completely remove the device, simply rmdir the directory
-+(/config/gpiommc/my_mmc in this example).
-+There's no need to first unregister the device before removing it. That will
-+be done automatically.
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -2443,6 +2443,11 @@ T: git git://git.kernel.org/pub/scm/linu
- S: Maintained
- F: drivers/media/video/gspca/
-
-+GPIOMMC DRIVER
-+P: Michael Buesch
-+M: mb@bu3sch.de
-+S: Maintained
-+
- HARDWARE MONITORING
- L: lm-sensors@lm-sensors.org
- W: http://www.lm-sensors.org/
+++ /dev/null
-The gpiommc configfs context structure needs locking, as configfs
-does not lock access between files.
-
---- a/drivers/mmc/host/gpiommc.c
-+++ b/drivers/mmc/host/gpiommc.c
-@@ -143,6 +143,8 @@ struct gpiommc_configfs_device {
- struct platform_device *pdev;
- /* The configuration */
- struct gpiommc_platform_data pdata;
-+ /* Mutex to protect this structure */
-+ struct mutex mutex;
- };
-
- #define GPIO_INVALID -1
-@@ -233,6 +235,8 @@ static ssize_t gpiommc_config_attr_show(
- unsigned int gpio;
- int err = 0;
-
-+ mutex_lock(&dev->mutex);
-+
- if (attr == &gpiommc_attr_DI) {
- gpio = dev->pdata.pins.gpio_di;
- if (gpio == GPIO_INVALID)
-@@ -293,6 +297,8 @@ static ssize_t gpiommc_config_attr_show(
- WARN_ON(1);
- err = -ENOSYS;
- out:
-+ mutex_unlock(&dev->mutex);
-+
- return err ? err : count;
- }
-
-@@ -352,6 +358,8 @@ static ssize_t gpiommc_config_attr_store
- int err = -EINVAL;
- unsigned long data;
-
-+ mutex_lock(&dev->mutex);
-+
- if (attr == &gpiommc_attr_register) {
- err = strict_strtoul(page, 10, &data);
- if (err)
-@@ -477,6 +485,8 @@ static ssize_t gpiommc_config_attr_store
- WARN_ON(1);
- err = -ENOSYS;
- out:
-+ mutex_unlock(&dev->mutex);
-+
- return err ? err : count;
- }
-
-@@ -513,6 +523,7 @@ static struct config_item *gpiommc_make_
- if (!dev)
- return NULL;
-
-+ mutex_init(&dev->mutex);
- config_item_init_type_name(&dev->item, name,
- &gpiommc_dev_ci_type);
-
+++ /dev/null
---- a/drivers/char/cs5535_gpio.c
-+++ b/drivers/char/cs5535_gpio.c
-@@ -15,6 +15,7 @@
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/cdev.h>
-+#include <linux/device.h>
- #include <linux/ioport.h>
- #include <linux/pci.h>
-
-@@ -48,6 +49,7 @@ static struct pci_device_id divil_pci[]
- MODULE_DEVICE_TABLE(pci, divil_pci);
-
- static struct cdev cs5535_gpio_cdev;
-+static struct class *cs5535_gpio_class;
-
- /* reserve 32 entries even though some aren't usable */
- #define CS5535_GPIO_COUNT 32
-@@ -66,9 +68,14 @@ static struct gpio_regmap rm[] =
- { 0x30, 0x00, '1', '0' }, /* GPIOx_READ_BACK / GPIOx_OUT_VAL */
- { 0x20, 0x20, 'I', 'i' }, /* GPIOx_IN_EN */
- { 0x04, 0x04, 'O', 'o' }, /* GPIOx_OUT_EN */
-+ { 0x10, 0x10, 'A', 'a' }, /* GPIOx_OUT_AUX1_SEL */
-+ { 0x14, 0x14, 'B', 'b' }, /* GPIOx_OUT_AUX2_SEL */
- { 0x08, 0x08, 't', 'T' }, /* GPIOx_OUT_OD_EN */
- { 0x18, 0x18, 'P', 'p' }, /* GPIOx_OUT_PU_EN */
- { 0x1c, 0x1c, 'D', 'd' }, /* GPIOx_OUT_PD_EN */
-+ { 0x24, 0x24, 'N', 'n' }, /* GPIOx_IN_INV_EN */
-+ { 0x0c, 0x0c, 'X', 'x' }, /* GPIOx_OUT_INV_EN */
-+ { 0x00, 0x00, 'H', 'L' }, /* GPIOx_OUT_VAL */
- };
-
-
-@@ -176,7 +183,7 @@ static int __init cs5535_gpio_init(void)
- {
- dev_t dev_id;
- u32 low, hi;
-- int retval;
-+ int retval, i;
-
- if (pci_dev_present(divil_pci) == 0) {
- printk(KERN_WARNING NAME ": DIVIL not found\n");
-@@ -231,23 +238,54 @@ static int __init cs5535_gpio_init(void)
- major = MAJOR(dev_id);
- }
-
-- if (retval) {
-- release_region(gpio_base, CS5535_GPIO_SIZE);
-- return -1;
-- }
-+ if (retval)
-+ goto error;
-
- printk(KERN_DEBUG NAME ": base=%#x mask=%#lx major=%d\n",
- gpio_base, mask, major);
-
- cdev_init(&cs5535_gpio_cdev, &cs5535_gpio_fops);
-- cdev_add(&cs5535_gpio_cdev, dev_id, CS5535_GPIO_COUNT);
-+ retval = cdev_add(&cs5535_gpio_cdev, dev_id, CS5535_GPIO_COUNT);
-+ if (retval) {
-+ kobject_put(&cs5535_gpio_cdev.kobj);
-+ goto error_region;
-+ }
-+
-+ cs5535_gpio_class = class_create(THIS_MODULE, "cs5535_gpio");
-+ if (IS_ERR(cs5535_gpio_class)) {
-+ printk(KERN_ERR "Error creating cs5535_gpio class\n");
-+ cdev_del(&cs5535_gpio_cdev);
-+ retval = PTR_ERR(cs5535_gpio_class);
-+ goto error_region;
-+ }
-+
-+ for (i = 0; i < CS5535_GPIO_COUNT; i++) {
-+ if (mask & (1<<i)) {
-+ device_create(cs5535_gpio_class, NULL, MKDEV(major, i), NULL, "cs5535_gpio%d", i);
-+ }
-+ }
-
- return 0;
-+
-+error_region:
-+ unregister_chrdev_region(dev_id, CS5535_GPIO_COUNT);
-+error:
-+ release_region(gpio_base, CS5535_GPIO_SIZE);
-+ return retval;
- }
-
- static void __exit cs5535_gpio_cleanup(void)
- {
- dev_t dev_id = MKDEV(major, 0);
-+ int i;
-+
-+ for (i = 0; i < CS5535_GPIO_COUNT; i++) {
-+ if (mask & (1<<i)) {
-+ device_destroy(cs5535_gpio_class, MKDEV(major, i));
-+ }
-+ }
-+
-+ class_destroy(cs5535_gpio_class);
-
- cdev_del(&cs5535_gpio_cdev);
- unregister_chrdev_region(dev_id, CS5535_GPIO_COUNT);
+++ /dev/null
---- a/drivers/i2c/busses/i2c-gpio.c
-+++ b/drivers/i2c/busses/i2c-gpio.c
-@@ -210,7 +210,7 @@ static int __init i2c_gpio_init(void)
-
- return ret;
- }
--module_init(i2c_gpio_init);
-+subsys_initcall(i2c_gpio_init);
-
- static void __exit i2c_gpio_exit(void)
- {
+++ /dev/null
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -137,7 +137,7 @@
- */
-
- #if defined(CONFIG_WLAN) || defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
--# if defined(CONFIG_MAC80211_MESH)
-+# if 1 || defined(CONFIG_MAC80211_MESH)
- # define LL_MAX_HEADER 128
- # else
- # define LL_MAX_HEADER 96
+++ /dev/null
---- a/arch/powerpc/boot/crtsavres.S
-+++ /dev/null
-@@ -1,233 +0,0 @@
--/*
-- * Special support for eabi and SVR4
-- *
-- * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
-- * Copyright 2008 Freescale Semiconductor, Inc.
-- * Written By Michael Meissner
-- *
-- * Based on gcc/config/rs6000/crtsavres.asm from gcc
-- *
-- * This 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, or (at your option) any
-- * later version.
-- *
-- * In addition to the permissions in the GNU General Public License, the
-- * Free Software Foundation gives you unlimited permission to link the
-- * compiled version of this file with other programs, and to distribute
-- * those programs without any restriction coming from the use of this
-- * file. (The General Public License restrictions do apply in other
-- * respects; for example, they cover modification of the file, and
-- * distribution when not linked into another program.)
-- *
-- * This file 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; see the file COPYING. If not, write to
-- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-- * Boston, MA 02110-1301, USA.
-- *
-- * As a special exception, if you link this library with files
-- * compiled with GCC to produce an executable, this does not cause
-- * the resulting executable to be covered by the GNU General Public License.
-- * This exception does not however invalidate any other reasons why
-- * the executable file might be covered by the GNU General Public License.
-- */
--
-- .file "crtsavres.S"
-- .section ".text"
--
--/* On PowerPC64 Linux, these functions are provided by the linker. */
--#ifndef __powerpc64__
--
--#define _GLOBAL(name) \
-- .type name,@function; \
-- .globl name; \
--name:
--
--/* Routines for saving integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer save area. */
--
--_GLOBAL(_savegpr_14)
--_GLOBAL(_save32gpr_14)
-- stw 14,-72(11) /* save gp registers */
--_GLOBAL(_savegpr_15)
--_GLOBAL(_save32gpr_15)
-- stw 15,-68(11)
--_GLOBAL(_savegpr_16)
--_GLOBAL(_save32gpr_16)
-- stw 16,-64(11)
--_GLOBAL(_savegpr_17)
--_GLOBAL(_save32gpr_17)
-- stw 17,-60(11)
--_GLOBAL(_savegpr_18)
--_GLOBAL(_save32gpr_18)
-- stw 18,-56(11)
--_GLOBAL(_savegpr_19)
--_GLOBAL(_save32gpr_19)
-- stw 19,-52(11)
--_GLOBAL(_savegpr_20)
--_GLOBAL(_save32gpr_20)
-- stw 20,-48(11)
--_GLOBAL(_savegpr_21)
--_GLOBAL(_save32gpr_21)
-- stw 21,-44(11)
--_GLOBAL(_savegpr_22)
--_GLOBAL(_save32gpr_22)
-- stw 22,-40(11)
--_GLOBAL(_savegpr_23)
--_GLOBAL(_save32gpr_23)
-- stw 23,-36(11)
--_GLOBAL(_savegpr_24)
--_GLOBAL(_save32gpr_24)
-- stw 24,-32(11)
--_GLOBAL(_savegpr_25)
--_GLOBAL(_save32gpr_25)
-- stw 25,-28(11)
--_GLOBAL(_savegpr_26)
--_GLOBAL(_save32gpr_26)
-- stw 26,-24(11)
--_GLOBAL(_savegpr_27)
--_GLOBAL(_save32gpr_27)
-- stw 27,-20(11)
--_GLOBAL(_savegpr_28)
--_GLOBAL(_save32gpr_28)
-- stw 28,-16(11)
--_GLOBAL(_savegpr_29)
--_GLOBAL(_save32gpr_29)
-- stw 29,-12(11)
--_GLOBAL(_savegpr_30)
--_GLOBAL(_save32gpr_30)
-- stw 30,-8(11)
--_GLOBAL(_savegpr_31)
--_GLOBAL(_save32gpr_31)
-- stw 31,-4(11)
-- blr
--
--/* Routines for restoring integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer restore area. */
--
--_GLOBAL(_restgpr_14)
--_GLOBAL(_rest32gpr_14)
-- lwz 14,-72(11) /* restore gp registers */
--_GLOBAL(_restgpr_15)
--_GLOBAL(_rest32gpr_15)
-- lwz 15,-68(11)
--_GLOBAL(_restgpr_16)
--_GLOBAL(_rest32gpr_16)
-- lwz 16,-64(11)
--_GLOBAL(_restgpr_17)
--_GLOBAL(_rest32gpr_17)
-- lwz 17,-60(11)
--_GLOBAL(_restgpr_18)
--_GLOBAL(_rest32gpr_18)
-- lwz 18,-56(11)
--_GLOBAL(_restgpr_19)
--_GLOBAL(_rest32gpr_19)
-- lwz 19,-52(11)
--_GLOBAL(_restgpr_20)
--_GLOBAL(_rest32gpr_20)
-- lwz 20,-48(11)
--_GLOBAL(_restgpr_21)
--_GLOBAL(_rest32gpr_21)
-- lwz 21,-44(11)
--_GLOBAL(_restgpr_22)
--_GLOBAL(_rest32gpr_22)
-- lwz 22,-40(11)
--_GLOBAL(_restgpr_23)
--_GLOBAL(_rest32gpr_23)
-- lwz 23,-36(11)
--_GLOBAL(_restgpr_24)
--_GLOBAL(_rest32gpr_24)
-- lwz 24,-32(11)
--_GLOBAL(_restgpr_25)
--_GLOBAL(_rest32gpr_25)
-- lwz 25,-28(11)
--_GLOBAL(_restgpr_26)
--_GLOBAL(_rest32gpr_26)
-- lwz 26,-24(11)
--_GLOBAL(_restgpr_27)
--_GLOBAL(_rest32gpr_27)
-- lwz 27,-20(11)
--_GLOBAL(_restgpr_28)
--_GLOBAL(_rest32gpr_28)
-- lwz 28,-16(11)
--_GLOBAL(_restgpr_29)
--_GLOBAL(_rest32gpr_29)
-- lwz 29,-12(11)
--_GLOBAL(_restgpr_30)
--_GLOBAL(_rest32gpr_30)
-- lwz 30,-8(11)
--_GLOBAL(_restgpr_31)
--_GLOBAL(_rest32gpr_31)
-- lwz 31,-4(11)
-- blr
--
--/* Routines for restoring integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer restore area. */
--
--_GLOBAL(_restgpr_14_x)
--_GLOBAL(_rest32gpr_14_x)
-- lwz 14,-72(11) /* restore gp registers */
--_GLOBAL(_restgpr_15_x)
--_GLOBAL(_rest32gpr_15_x)
-- lwz 15,-68(11)
--_GLOBAL(_restgpr_16_x)
--_GLOBAL(_rest32gpr_16_x)
-- lwz 16,-64(11)
--_GLOBAL(_restgpr_17_x)
--_GLOBAL(_rest32gpr_17_x)
-- lwz 17,-60(11)
--_GLOBAL(_restgpr_18_x)
--_GLOBAL(_rest32gpr_18_x)
-- lwz 18,-56(11)
--_GLOBAL(_restgpr_19_x)
--_GLOBAL(_rest32gpr_19_x)
-- lwz 19,-52(11)
--_GLOBAL(_restgpr_20_x)
--_GLOBAL(_rest32gpr_20_x)
-- lwz 20,-48(11)
--_GLOBAL(_restgpr_21_x)
--_GLOBAL(_rest32gpr_21_x)
-- lwz 21,-44(11)
--_GLOBAL(_restgpr_22_x)
--_GLOBAL(_rest32gpr_22_x)
-- lwz 22,-40(11)
--_GLOBAL(_restgpr_23_x)
--_GLOBAL(_rest32gpr_23_x)
-- lwz 23,-36(11)
--_GLOBAL(_restgpr_24_x)
--_GLOBAL(_rest32gpr_24_x)
-- lwz 24,-32(11)
--_GLOBAL(_restgpr_25_x)
--_GLOBAL(_rest32gpr_25_x)
-- lwz 25,-28(11)
--_GLOBAL(_restgpr_26_x)
--_GLOBAL(_rest32gpr_26_x)
-- lwz 26,-24(11)
--_GLOBAL(_restgpr_27_x)
--_GLOBAL(_rest32gpr_27_x)
-- lwz 27,-20(11)
--_GLOBAL(_restgpr_28_x)
--_GLOBAL(_rest32gpr_28_x)
-- lwz 28,-16(11)
--_GLOBAL(_restgpr_29_x)
--_GLOBAL(_rest32gpr_29_x)
-- lwz 29,-12(11)
--_GLOBAL(_restgpr_30_x)
--_GLOBAL(_rest32gpr_30_x)
-- lwz 30,-8(11)
--_GLOBAL(_restgpr_31_x)
--_GLOBAL(_rest32gpr_31_x)
-- lwz 0,4(11)
-- lwz 31,-4(11)
-- mtlr 0
-- mr 1,11
-- blr
--#endif
---- a/arch/powerpc/boot/Makefile
-+++ b/arch/powerpc/boot/Makefile
-@@ -60,7 +60,7 @@ libfdtheader := fdt.h libfdt.h libfdt_in
- $(addprefix $(obj)/,$(libfdt) libfdt-wrapper.o simpleboot.o): \
- $(addprefix $(obj)/,$(libfdtheader))
-
--src-wlib := string.S crt0.S crtsavres.S stdio.c main.c \
-+src-wlib := string.S crt0.S stdio.c main.c \
- $(libfdt) libfdt-wrapper.c \
- ns16550.c serial.c simple_alloc.c div64.S util.S \
- gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \
---- a/arch/powerpc/kernel/prom_init_check.sh
-+++ b/arch/powerpc/kernel/prom_init_check.sh
-@@ -48,20 +48,6 @@ do
- fi
- done
-
-- # ignore register save/restore funcitons
-- if [ "${UNDEF:0:9}" = "_restgpr_" ]; then
-- OK=1
-- fi
-- if [ "${UNDEF:0:11}" = "_rest32gpr_" ]; then
-- OK=1
-- fi
-- if [ "${UNDEF:0:9}" = "_savegpr_" ]; then
-- OK=1
-- fi
-- if [ "${UNDEF:0:11}" = "_save32gpr_" ]; then
-- OK=1
-- fi
--
- if [ $OK -eq 0 ]; then
- ERROR=1
- echo "Error: External symbol '$UNDEF' referenced" \
---- a/arch/powerpc/lib/crtsavres.S
-+++ /dev/null
-@@ -1,229 +0,0 @@
--/*
-- * Special support for eabi and SVR4
-- *
-- * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
-- * Copyright 2008 Freescale Semiconductor, Inc.
-- * Written By Michael Meissner
-- *
-- * Based on gcc/config/rs6000/crtsavres.asm from gcc
-- *
-- * This 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, or (at your option) any
-- * later version.
-- *
-- * In addition to the permissions in the GNU General Public License, the
-- * Free Software Foundation gives you unlimited permission to link the
-- * compiled version of this file with other programs, and to distribute
-- * those programs without any restriction coming from the use of this
-- * file. (The General Public License restrictions do apply in other
-- * respects; for example, they cover modification of the file, and
-- * distribution when not linked into another program.)
-- *
-- * This file 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; see the file COPYING. If not, write to
-- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-- * Boston, MA 02110-1301, USA.
-- *
-- * As a special exception, if you link this library with files
-- * compiled with GCC to produce an executable, this does not cause
-- * the resulting executable to be covered by the GNU General Public License.
-- * This exception does not however invalidate any other reasons why
-- * the executable file might be covered by the GNU General Public License.
-- */
--
--#include <asm/ppc_asm.h>
--
-- .file "crtsavres.S"
-- .section ".text"
--
--#ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
--
--/* Routines for saving integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer save area. */
--
--_GLOBAL(_savegpr_14)
--_GLOBAL(_save32gpr_14)
-- stw 14,-72(11) /* save gp registers */
--_GLOBAL(_savegpr_15)
--_GLOBAL(_save32gpr_15)
-- stw 15,-68(11)
--_GLOBAL(_savegpr_16)
--_GLOBAL(_save32gpr_16)
-- stw 16,-64(11)
--_GLOBAL(_savegpr_17)
--_GLOBAL(_save32gpr_17)
-- stw 17,-60(11)
--_GLOBAL(_savegpr_18)
--_GLOBAL(_save32gpr_18)
-- stw 18,-56(11)
--_GLOBAL(_savegpr_19)
--_GLOBAL(_save32gpr_19)
-- stw 19,-52(11)
--_GLOBAL(_savegpr_20)
--_GLOBAL(_save32gpr_20)
-- stw 20,-48(11)
--_GLOBAL(_savegpr_21)
--_GLOBAL(_save32gpr_21)
-- stw 21,-44(11)
--_GLOBAL(_savegpr_22)
--_GLOBAL(_save32gpr_22)
-- stw 22,-40(11)
--_GLOBAL(_savegpr_23)
--_GLOBAL(_save32gpr_23)
-- stw 23,-36(11)
--_GLOBAL(_savegpr_24)
--_GLOBAL(_save32gpr_24)
-- stw 24,-32(11)
--_GLOBAL(_savegpr_25)
--_GLOBAL(_save32gpr_25)
-- stw 25,-28(11)
--_GLOBAL(_savegpr_26)
--_GLOBAL(_save32gpr_26)
-- stw 26,-24(11)
--_GLOBAL(_savegpr_27)
--_GLOBAL(_save32gpr_27)
-- stw 27,-20(11)
--_GLOBAL(_savegpr_28)
--_GLOBAL(_save32gpr_28)
-- stw 28,-16(11)
--_GLOBAL(_savegpr_29)
--_GLOBAL(_save32gpr_29)
-- stw 29,-12(11)
--_GLOBAL(_savegpr_30)
--_GLOBAL(_save32gpr_30)
-- stw 30,-8(11)
--_GLOBAL(_savegpr_31)
--_GLOBAL(_save32gpr_31)
-- stw 31,-4(11)
-- blr
--
--/* Routines for restoring integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer restore area. */
--
--_GLOBAL(_restgpr_14)
--_GLOBAL(_rest32gpr_14)
-- lwz 14,-72(11) /* restore gp registers */
--_GLOBAL(_restgpr_15)
--_GLOBAL(_rest32gpr_15)
-- lwz 15,-68(11)
--_GLOBAL(_restgpr_16)
--_GLOBAL(_rest32gpr_16)
-- lwz 16,-64(11)
--_GLOBAL(_restgpr_17)
--_GLOBAL(_rest32gpr_17)
-- lwz 17,-60(11)
--_GLOBAL(_restgpr_18)
--_GLOBAL(_rest32gpr_18)
-- lwz 18,-56(11)
--_GLOBAL(_restgpr_19)
--_GLOBAL(_rest32gpr_19)
-- lwz 19,-52(11)
--_GLOBAL(_restgpr_20)
--_GLOBAL(_rest32gpr_20)
-- lwz 20,-48(11)
--_GLOBAL(_restgpr_21)
--_GLOBAL(_rest32gpr_21)
-- lwz 21,-44(11)
--_GLOBAL(_restgpr_22)
--_GLOBAL(_rest32gpr_22)
-- lwz 22,-40(11)
--_GLOBAL(_restgpr_23)
--_GLOBAL(_rest32gpr_23)
-- lwz 23,-36(11)
--_GLOBAL(_restgpr_24)
--_GLOBAL(_rest32gpr_24)
-- lwz 24,-32(11)
--_GLOBAL(_restgpr_25)
--_GLOBAL(_rest32gpr_25)
-- lwz 25,-28(11)
--_GLOBAL(_restgpr_26)
--_GLOBAL(_rest32gpr_26)
-- lwz 26,-24(11)
--_GLOBAL(_restgpr_27)
--_GLOBAL(_rest32gpr_27)
-- lwz 27,-20(11)
--_GLOBAL(_restgpr_28)
--_GLOBAL(_rest32gpr_28)
-- lwz 28,-16(11)
--_GLOBAL(_restgpr_29)
--_GLOBAL(_rest32gpr_29)
-- lwz 29,-12(11)
--_GLOBAL(_restgpr_30)
--_GLOBAL(_rest32gpr_30)
-- lwz 30,-8(11)
--_GLOBAL(_restgpr_31)
--_GLOBAL(_rest32gpr_31)
-- lwz 31,-4(11)
-- blr
--
--/* Routines for restoring integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer restore area. */
--
--_GLOBAL(_restgpr_14_x)
--_GLOBAL(_rest32gpr_14_x)
-- lwz 14,-72(11) /* restore gp registers */
--_GLOBAL(_restgpr_15_x)
--_GLOBAL(_rest32gpr_15_x)
-- lwz 15,-68(11)
--_GLOBAL(_restgpr_16_x)
--_GLOBAL(_rest32gpr_16_x)
-- lwz 16,-64(11)
--_GLOBAL(_restgpr_17_x)
--_GLOBAL(_rest32gpr_17_x)
-- lwz 17,-60(11)
--_GLOBAL(_restgpr_18_x)
--_GLOBAL(_rest32gpr_18_x)
-- lwz 18,-56(11)
--_GLOBAL(_restgpr_19_x)
--_GLOBAL(_rest32gpr_19_x)
-- lwz 19,-52(11)
--_GLOBAL(_restgpr_20_x)
--_GLOBAL(_rest32gpr_20_x)
-- lwz 20,-48(11)
--_GLOBAL(_restgpr_21_x)
--_GLOBAL(_rest32gpr_21_x)
-- lwz 21,-44(11)
--_GLOBAL(_restgpr_22_x)
--_GLOBAL(_rest32gpr_22_x)
-- lwz 22,-40(11)
--_GLOBAL(_restgpr_23_x)
--_GLOBAL(_rest32gpr_23_x)
-- lwz 23,-36(11)
--_GLOBAL(_restgpr_24_x)
--_GLOBAL(_rest32gpr_24_x)
-- lwz 24,-32(11)
--_GLOBAL(_restgpr_25_x)
--_GLOBAL(_rest32gpr_25_x)
-- lwz 25,-28(11)
--_GLOBAL(_restgpr_26_x)
--_GLOBAL(_rest32gpr_26_x)
-- lwz 26,-24(11)
--_GLOBAL(_restgpr_27_x)
--_GLOBAL(_rest32gpr_27_x)
-- lwz 27,-20(11)
--_GLOBAL(_restgpr_28_x)
--_GLOBAL(_rest32gpr_28_x)
-- lwz 28,-16(11)
--_GLOBAL(_restgpr_29_x)
--_GLOBAL(_rest32gpr_29_x)
-- lwz 29,-12(11)
--_GLOBAL(_restgpr_30_x)
--_GLOBAL(_rest32gpr_30_x)
-- lwz 30,-8(11)
--_GLOBAL(_restgpr_31_x)
--_GLOBAL(_rest32gpr_31_x)
-- lwz 0,4(11)
-- lwz 31,-4(11)
-- mtlr 0
-- mr 1,11
-- blr
--#endif
---- a/arch/powerpc/lib/Makefile
-+++ b/arch/powerpc/lib/Makefile
-@@ -13,7 +13,7 @@ CFLAGS_REMOVE_feature-fixups.o = -pg
-
- obj-y := string.o alloc.o \
- checksum_$(CONFIG_WORD_SIZE).o
--obj-$(CONFIG_PPC32) += div64.o copy_32.o crtsavres.o
-+obj-$(CONFIG_PPC32) += div64.o copy_32.o
- obj-$(CONFIG_HAS_IOMEM) += devres.o
-
- obj-$(CONFIG_PPC64) += copypage_64.o copyuser_64.o \
---- a/arch/powerpc/Makefile
-+++ b/arch/powerpc/Makefile
-@@ -92,8 +92,6 @@ endif
- else
- KBUILD_CFLAGS += $(call cc-option,-mtune=power4)
- endif
--else
--LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
- endif
-
- ifeq ($(CONFIG_TUNE_CELL),y)
+++ /dev/null
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -823,6 +823,8 @@ config CRYPTO_ANSI_CPRNG
- ANSI X9.31 A.2.4. Not this option must be enabled if CRYPTO_FIPS
- is selected
-
-+source "crypto/ocf/Kconfig"
-+
- source "drivers/crypto/Kconfig"
-
- endif # if CRYPTO
---- a/crypto/Makefile
-+++ b/crypto/Makefile
-@@ -86,6 +86,11 @@ obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o
- obj-$(CONFIG_CRYPTO_GHASH) += ghash-generic.o
-
- #
-+# OCF
-+#
-+obj-$(CONFIG_OCF_OCF) += ocf/
-+
-+#
- # generic algorithms and the async_tx api
- #
- obj-$(CONFIG_XOR_BLOCKS) += xor.o
+++ /dev/null
---- a/drivers/char/random.c
-+++ b/drivers/char/random.c
-@@ -129,6 +129,9 @@
- * unsigned int value);
- * void add_interrupt_randomness(int irq);
- *
-+ * void random_input_words(__u32 *buf, size_t wordcount, int ent_count)
-+ * int random_input_wait(void);
-+ *
- * add_input_randomness() uses the input layer interrupt timing, as well as
- * the event type information from the hardware.
- *
-@@ -140,6 +143,13 @@
- * a better measure, since the timing of the disk interrupts are more
- * unpredictable.
- *
-+ * random_input_words() just provides a raw block of entropy to the input
-+ * pool, such as from a hardware entropy generator.
-+ *
-+ * random_input_wait() suspends the caller until such time as the
-+ * entropy pool falls below the write threshold, and returns a count of how
-+ * much entropy (in bits) is needed to sustain the pool.
-+ *
- * All of these routines try to estimate how many bits of randomness a
- * particular randomness source. They do this by keeping track of the
- * first and second order deltas of the event timings.
-@@ -714,6 +724,61 @@ void add_disk_randomness(struct gendisk
- }
- #endif
-
-+/*
-+ * random_input_words - add bulk entropy to pool
-+ *
-+ * @buf: buffer to add
-+ * @wordcount: number of __u32 words to add
-+ * @ent_count: total amount of entropy (in bits) to credit
-+ *
-+ * this provides bulk input of entropy to the input pool
-+ *
-+ */
-+void random_input_words(__u32 *buf, size_t wordcount, int ent_count)
-+{
-+ mix_pool_bytes(&input_pool, buf, wordcount*4);
-+
-+ credit_entropy_bits(&input_pool, ent_count);
-+
-+ DEBUG_ENT("crediting %d bits => %d\n",
-+ ent_count, input_pool.entropy_count);
-+ /*
-+ * Wake up waiting processes if we have enough
-+ * entropy.
-+ */
-+ if (input_pool.entropy_count >= random_read_wakeup_thresh)
-+ wake_up_interruptible(&random_read_wait);
-+}
-+EXPORT_SYMBOL(random_input_words);
-+
-+/*
-+ * random_input_wait - wait until random needs entropy
-+ *
-+ * this function sleeps until the /dev/random subsystem actually
-+ * needs more entropy, and then return the amount of entropy
-+ * that it would be nice to have added to the system.
-+ */
-+int random_input_wait(void)
-+{
-+ int count;
-+
-+ wait_event_interruptible(random_write_wait,
-+ input_pool.entropy_count < random_write_wakeup_thresh);
-+
-+ count = random_write_wakeup_thresh - input_pool.entropy_count;
-+
-+ /* likely we got woken up due to a signal */
-+ if (count <= 0) count = random_read_wakeup_thresh;
-+
-+ DEBUG_ENT("requesting %d bits from input_wait()er %d<%d\n",
-+ count,
-+ input_pool.entropy_count, random_write_wakeup_thresh);
-+
-+ return count;
-+}
-+EXPORT_SYMBOL(random_input_wait);
-+
-+
- #define EXTRACT_SIZE 10
-
- /*********************************************************************
---- a/fs/fcntl.c
-+++ b/fs/fcntl.c
-@@ -141,6 +141,7 @@ SYSCALL_DEFINE1(dup, unsigned int, filde
- }
- return ret;
- }
-+EXPORT_SYMBOL(sys_dup);
-
- #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME)
-
---- a/include/linux/miscdevice.h
-+++ b/include/linux/miscdevice.h
-@@ -12,6 +12,7 @@
- #define APOLLO_MOUSE_MINOR 7
- #define PC110PAD_MINOR 9
- /*#define ADB_MOUSE_MINOR 10 FIXME OBSOLETE */
-+#define CRYPTODEV_MINOR 70 /* /dev/crypto */
- #define WATCHDOG_MINOR 130 /* Watchdog timer */
- #define TEMP_MINOR 131 /* Temperature Sensor */
- #define RTC_MINOR 135
---- a/include/linux/random.h
-+++ b/include/linux/random.h
-@@ -34,6 +34,30 @@
- /* Clear the entropy pool and associated counters. (Superuser only.) */
- #define RNDCLEARPOOL _IO( 'R', 0x06 )
-
-+#ifdef CONFIG_FIPS_RNG
-+
-+/* Size of seed value - equal to AES blocksize */
-+#define AES_BLOCK_SIZE_BYTES 16
-+#define SEED_SIZE_BYTES AES_BLOCK_SIZE_BYTES
-+/* Size of AES key */
-+#define KEY_SIZE_BYTES 16
-+
-+/* ioctl() structure used by FIPS 140-2 Tests */
-+struct rand_fips_test {
-+ unsigned char key[KEY_SIZE_BYTES]; /* Input */
-+ unsigned char datetime[SEED_SIZE_BYTES]; /* Input */
-+ unsigned char seed[SEED_SIZE_BYTES]; /* Input */
-+ unsigned char result[SEED_SIZE_BYTES]; /* Output */
-+};
-+
-+/* FIPS 140-2 RNG Variable Seed Test. (Superuser only.) */
-+#define RNDFIPSVST _IOWR('R', 0x10, struct rand_fips_test)
-+
-+/* FIPS 140-2 RNG Monte Carlo Test. (Superuser only.) */
-+#define RNDFIPSMCT _IOWR('R', 0x11, struct rand_fips_test)
-+
-+#endif /* #ifdef CONFIG_FIPS_RNG */
-+
- struct rand_pool_info {
- int entropy_count;
- int buf_size;
-@@ -50,6 +74,10 @@ extern void add_input_randomness(unsigne
- unsigned int value);
- extern void add_interrupt_randomness(int irq);
-
-+extern void random_input_words(__u32 *buf, size_t wordcount, int ent_count);
-+extern int random_input_wait(void);
-+#define HAS_RANDOM_INPUT_WAIT 1
-+
- extern void get_random_bytes(void *buf, int nbytes);
- void generate_random_uuid(unsigned char uuid_out[16]);
-
+++ /dev/null
---- a/crypto/ocf/cryptosoft.c
-+++ b/crypto/ocf/cryptosoft.c
-@@ -47,7 +47,7 @@
- #include <linux/mm.h>
- #include <linux/skbuff.h>
- #include <linux/random.h>
--#include <asm/scatterlist.h>
-+#include <linux/scatterlist.h>
-
- #include <cryptodev.h>
- #include <uio.h>
+++ /dev/null
---- a/crypto/ocf/random.c
-+++ b/crypto/ocf/random.c
-@@ -49,6 +49,7 @@
- #include <linux/unistd.h>
- #include <linux/poll.h>
- #include <linux/random.h>
-+#include <linux/kthread.h>
- #include <cryptodev.h>
-
- #ifdef CONFIG_OCF_FIPS
-@@ -81,7 +82,7 @@ struct random_op {
-
- static int random_proc(void *arg);
-
--static pid_t randomproc = (pid_t) -1;
-+static struct task_struct *random_task;
- static spinlock_t random_lock;
-
- /*
-@@ -141,13 +142,18 @@ crypto_rregister(
- spin_lock_irqsave(&random_lock, flags);
- list_add_tail(&rops->random_list, &random_ops);
- if (!started) {
-- randomproc = kernel_thread(random_proc, NULL, CLONE_FS|CLONE_FILES);
-- if (randomproc < 0) {
-- ret = randomproc;
-+ struct task_struct *t;
-+
-+ t = kthread_create(random_proc, NULL, "ocf-random");
-+ if (IS_ERR(t)) {
-+ ret = PTR_ERR(t);
- printk("crypto: crypto_rregister cannot start random thread; "
- "error %d", ret);
-- } else
-+ } else {
-+ random_task = t;
-+ wake_up_process(t);
- started = 1;
-+ }
- }
- spin_unlock_irqrestore(&random_lock, flags);
-
-@@ -172,7 +178,7 @@ crypto_runregister_all(u_int32_t driveri
-
- spin_lock_irqsave(&random_lock, flags);
- if (list_empty(&random_ops) && started)
-- kill_proc(randomproc, SIGKILL, 1);
-+ send_sig(SIGKILL, random_task, 1);
- spin_unlock_irqrestore(&random_lock, flags);
- return(0);
- }
-@@ -308,7 +314,7 @@ random_proc(void *arg)
-
- bad_alloc:
- spin_lock_irq(&random_lock);
-- randomproc = (pid_t) -1;
-+ random_task = NULL;
- started = 0;
- spin_unlock_irq(&random_lock);
-
---- a/crypto/ocf/crypto.c
-+++ b/crypto/ocf/crypto.c
-@@ -74,6 +74,7 @@ __FBSDID("$FreeBSD: src/sys/opencrypto/c
- #include <linux/sched.h>
- #include <linux/spinlock.h>
- #include <linux/version.h>
-+#include <linux/kthread.h>
- #include <cryptodev.h>
-
- /*
-@@ -255,10 +256,10 @@ module_param(crypto_devallowsoft, int, 0
- MODULE_PARM_DESC(crypto_devallowsoft,
- "Enable/disable use of software crypto support");
-
--static pid_t cryptoproc = (pid_t) -1;
-+static struct task_struct *crypto_task;
- static struct completion cryptoproc_exited;
- static DECLARE_WAIT_QUEUE_HEAD(cryptoproc_wait);
--static pid_t cryptoretproc = (pid_t) -1;
-+static struct task_struct *cryptoret_task;
- static struct completion cryptoretproc_exited;
- static DECLARE_WAIT_QUEUE_HEAD(cryptoretproc_wait);
-
-@@ -1401,7 +1402,7 @@ crypto_proc(void *arg)
- wait_event_interruptible(cryptoproc_wait,
- !(list_empty(&crp_q) || crypto_all_qblocked) ||
- !(list_empty(&crp_kq) || crypto_all_kqblocked) ||
-- cryptoproc == (pid_t) -1);
-+ crypto_task == NULL);
- crp_sleep = 0;
- if (signal_pending (current)) {
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-@@ -1414,7 +1415,7 @@ crypto_proc(void *arg)
- }
- CRYPTO_Q_LOCK();
- dprintk("%s - awake\n", __FUNCTION__);
-- if (cryptoproc == (pid_t) -1)
-+ if (crypto_task == NULL)
- break;
- cryptostats.cs_intrs++;
- }
-@@ -1470,7 +1471,7 @@ crypto_ret_proc(void *arg)
- dprintk("%s - sleeping\n", __FUNCTION__);
- CRYPTO_RETQ_UNLOCK();
- wait_event_interruptible(cryptoretproc_wait,
-- cryptoretproc == (pid_t) -1 ||
-+ cryptoret_task == NULL ||
- !list_empty(&crp_ret_q) ||
- !list_empty(&crp_ret_kq));
- if (signal_pending (current)) {
-@@ -1484,7 +1485,7 @@ crypto_ret_proc(void *arg)
- }
- CRYPTO_RETQ_LOCK();
- dprintk("%s - awake\n", __FUNCTION__);
-- if (cryptoretproc == (pid_t) -1) {
-+ if (cryptoret_task == NULL) {
- dprintk("%s - EXITING!\n", __FUNCTION__);
- break;
- }
-@@ -1597,6 +1598,7 @@ DB_SHOW_COMMAND(kcrypto, db_show_kcrypto
- static int
- crypto_init(void)
- {
-+ struct task_struct *t;
- int error;
-
- dprintk("%s(0x%x)\n", __FUNCTION__, (int) crypto_init);
-@@ -1643,23 +1645,27 @@ crypto_init(void)
- init_completion(&cryptoproc_exited);
- init_completion(&cryptoretproc_exited);
-
-- cryptoproc = 0; /* to avoid race condition where proc runs first */
-- cryptoproc = kernel_thread(crypto_proc, NULL, CLONE_FS|CLONE_FILES);
-- if (cryptoproc < 0) {
-- error = cryptoproc;
-+ crypto_task = NULL; /* to avoid race condition where proc runs first */
-+ t = kthread_create(crypto_proc, NULL, "ocf-crypto");
-+ if (IS_ERR(t)) {
-+ error = PTR_ERR(t);
- printk("crypto: crypto_init cannot start crypto thread; error %d",
- error);
- goto bad;
- }
-+ wake_up_process(t);
-+ crypto_task = t;
-
-- cryptoretproc = 0; /* to avoid race condition where proc runs first */
-- cryptoretproc = kernel_thread(crypto_ret_proc, NULL, CLONE_FS|CLONE_FILES);
-- if (cryptoretproc < 0) {
-- error = cryptoretproc;
-+ cryptoret_task = NULL; /* to avoid race condition where proc runs first */
-+ t = kthread_create(crypto_ret_proc, NULL, "ocf-cryptoret");
-+ if (IS_ERR(t)) {
-+ error = PTR_ERR(t);
- printk("crypto: crypto_init cannot start cryptoret thread; error %d",
- error);
- goto bad;
- }
-+ wake_up_process(t);
-+ cryptoret_task = t;
-
- return 0;
- bad:
-@@ -1671,7 +1677,7 @@ bad:
- static void
- crypto_exit(void)
- {
-- pid_t p;
-+ struct task_struct *t;
- unsigned long d_flags;
-
- dprintk("%s()\n", __FUNCTION__);
-@@ -1681,18 +1687,18 @@ crypto_exit(void)
- */
-
- CRYPTO_DRIVER_LOCK();
-- p = cryptoproc;
-- cryptoproc = (pid_t) -1;
-- kill_proc(p, SIGTERM, 1);
-+ t = crypto_task;
-+ crypto_task = NULL;
-+ send_sig(SIGTERM, t, 1);
- wake_up_interruptible(&cryptoproc_wait);
- CRYPTO_DRIVER_UNLOCK();
-
- wait_for_completion(&cryptoproc_exited);
-
- CRYPTO_DRIVER_LOCK();
-- p = cryptoretproc;
-- cryptoretproc = (pid_t) -1;
-- kill_proc(p, SIGTERM, 1);
-+ t = cryptoret_task;
-+ cryptoret_task = NULL;
-+ send_sig(SIGTERM, t, 1);
- wake_up_interruptible(&cryptoretproc_wait);
- CRYPTO_DRIVER_UNLOCK();
-
+++ /dev/null
---- a/drivers/ssb/Kconfig
-+++ b/drivers/ssb/Kconfig
-@@ -49,7 +49,7 @@ config SSB_PCIHOST
- config SSB_B43_PCI_BRIDGE
- bool
- depends on SSB_PCIHOST
-- default n
-+ default y
-
- config SSB_PCMCIAHOST_POSSIBLE
- bool
+++ /dev/null
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -152,16 +152,16 @@ config REED_SOLOMON_DEC16
- # Textsearch support is select'ed if needed
- #
- config TEXTSEARCH
-- boolean
-+ boolean "Textsearch support"
-
- config TEXTSEARCH_KMP
-- tristate
-+ tristate "Textsearch KMP"
-
- config TEXTSEARCH_BM
-- tristate
-+ tristate "Textsearch BM"
-
- config TEXTSEARCH_FSM
-- tristate
-+ tristate "Textsearch FSM"
-
- config HAS_IOMEM
- boolean
+++ /dev/null
---- a/net/wireless/Kconfig
-+++ b/net/wireless/Kconfig
-@@ -141,13 +141,13 @@ config LIB80211
- you want this built into your kernel.
-
- config LIB80211_CRYPT_WEP
-- tristate
-+ tristate "LIB80211_CRYPT_WEP"
-
- config LIB80211_CRYPT_CCMP
-- tristate
-+ tristate "LIB80211_CRYPT_CCMP"
-
- config LIB80211_CRYPT_TKIP
-- tristate
-+ tristate "LIB80211_CRYPT_TKIP"
-
- config LIB80211_DEBUG
- bool "lib80211 debugging messages"
+++ /dev/null
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -32,7 +32,7 @@ config CRYPTO_FIPS
- option is selected
-
- config CRYPTO_ALGAPI
-- tristate
-+ tristate "ALGAPI"
- select CRYPTO_ALGAPI2
- help
- This option provides the API for cryptographic algorithms.
-@@ -41,7 +41,7 @@ config CRYPTO_ALGAPI2
- tristate
-
- config CRYPTO_AEAD
-- tristate
-+ tristate "AEAD"
- select CRYPTO_AEAD2
- select CRYPTO_ALGAPI
-
-@@ -50,7 +50,7 @@ config CRYPTO_AEAD2
- select CRYPTO_ALGAPI2
-
- config CRYPTO_BLKCIPHER
-- tristate
-+ tristate "BLKCIPHER"
- select CRYPTO_BLKCIPHER2
- select CRYPTO_ALGAPI
-
-@@ -61,7 +61,7 @@ config CRYPTO_BLKCIPHER2
- select CRYPTO_WORKQUEUE
-
- config CRYPTO_HASH
-- tristate
-+ tristate "HASH"
- select CRYPTO_HASH2
- select CRYPTO_ALGAPI
-
-@@ -70,7 +70,7 @@ config CRYPTO_HASH2
- select CRYPTO_ALGAPI2
-
- config CRYPTO_RNG
-- tristate
-+ tristate "RNG"
- select CRYPTO_RNG2
- select CRYPTO_ALGAPI
-
+++ /dev/null
---- a/mm/shmem.c
-+++ b/mm/shmem.c
-@@ -29,6 +29,7 @@
- #include <linux/mm.h>
- #include <linux/module.h>
- #include <linux/swap.h>
-+#include <linux/ima.h>
-
- static struct vfsmount *shm_mnt;
-
-@@ -2620,6 +2621,16 @@ int shmem_lock(struct file *file, int lo
-
- /* common code */
-
-+void shmem_set_file(struct vm_area_struct *vma, struct file *file)
-+{
-+ ima_counts_get(file);
-+ if (vma->vm_file)
-+ fput(vma->vm_file);
-+ vma->vm_file = file;
-+ vma->vm_ops = &shmem_vm_ops;
-+}
-+EXPORT_SYMBOL_GPL(shmem_set_file);
-+
- /**
- * shmem_file_setup - get an unlinked file living in tmpfs
- * @name: name for dentry (to be seen in /proc/<pid>/maps
-@@ -2697,9 +2708,6 @@ int shmem_zero_setup(struct vm_area_stru
- if (IS_ERR(file))
- return PTR_ERR(file);
-
-- if (vma->vm_file)
-- fput(vma->vm_file);
-- vma->vm_file = file;
-- vma->vm_ops = &shmem_vm_ops;
-+ shmem_set_file(vma, file);
- return 0;
- }
---- a/fs/file.c
-+++ b/fs/file.c
-@@ -271,6 +271,7 @@ int expand_files(struct files_struct *fi
- /* All good, so we try */
- return expand_fdtable(files, nr);
- }
-+EXPORT_SYMBOL_GPL(expand_files);
-
- static int count_open_files(struct fdtable *fdt)
- {
---- a/kernel/exit.c
-+++ b/kernel/exit.c
-@@ -508,6 +508,7 @@ struct files_struct *get_files_struct(st
-
- return files;
- }
-+EXPORT_SYMBOL_GPL(get_files_struct);
-
- void put_files_struct(struct files_struct *files)
- {
-@@ -527,6 +528,7 @@ void put_files_struct(struct files_struc
- free_fdtable(fdt);
- }
- }
-+EXPORT_SYMBOL_GPL(put_files_struct);
-
- void reset_files_struct(struct files_struct *files)
- {
---- a/kernel/fork.c
-+++ b/kernel/fork.c
-@@ -169,6 +169,7 @@ void __put_task_struct(struct task_struc
- if (!profile_handoff_task(tsk))
- free_task(tsk);
- }
-+EXPORT_SYMBOL_GPL(__put_task_struct);
-
- /*
- * macro override instead of weak attribute alias, to workaround
---- a/kernel/sched.c
-+++ b/kernel/sched.c
-@@ -6149,6 +6149,7 @@ int can_nice(const struct task_struct *p
- return (nice_rlim <= p->signal->rlim[RLIMIT_NICE].rlim_cur ||
- capable(CAP_SYS_NICE));
- }
-+EXPORT_SYMBOL_GPL(can_nice);
-
- #ifdef __ARCH_WANT_SYS_NICE
-
---- a/mm/memory.c
-+++ b/mm/memory.c
-@@ -1115,6 +1115,7 @@ unsigned long zap_page_range(struct vm_a
- tlb_finish_mmu(tlb, address, end);
- return end;
- }
-+EXPORT_SYMBOL_GPL(zap_page_range);
-
- /**
- * zap_vma_ptes - remove ptes mapping the vma
-@@ -2501,6 +2502,7 @@ int vmtruncate_range(struct inode *inode
-
- return 0;
- }
-+EXPORT_SYMBOL_GPL(vmtruncate_range);
-
- /*
- * We enter with non-exclusive mmap_sem (to exclude vma changes,
---- a/mm/vmalloc.c
-+++ b/mm/vmalloc.c
-@@ -1173,6 +1173,7 @@ void unmap_kernel_range(unsigned long ad
- vunmap_page_range(addr, end);
- flush_tlb_kernel_range(addr, end);
- }
-+EXPORT_SYMBOL_GPL(unmap_kernel_range);
-
- int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages)
- {
-@@ -1288,6 +1289,7 @@ struct vm_struct *get_vm_area(unsigned l
- return __get_vm_area_node(size, 1, flags, VMALLOC_START, VMALLOC_END,
- -1, GFP_KERNEL, __builtin_return_address(0));
- }
-+EXPORT_SYMBOL_GPL(get_vm_area);
-
- struct vm_struct *get_vm_area_caller(unsigned long size, unsigned long flags,
- void *caller)
---- a/include/linux/mm.h
-+++ b/include/linux/mm.h
-@@ -725,6 +725,7 @@ extern void show_free_areas(void);
-
- int shmem_lock(struct file *file, int lock, struct user_struct *user);
- struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags);
-+void shmem_set_file(struct vm_area_struct *vma, struct file *file);
- int shmem_zero_setup(struct vm_area_struct *);
-
- #ifndef CONFIG_MMU
---- a/kernel/signal.c
-+++ b/kernel/signal.c
-@@ -1104,6 +1104,7 @@ struct sighand_struct *lock_task_sighand
-
- return sighand;
- }
-+EXPORT_SYMBOL(lock_task_sighand);
-
- /*
- * send signal info to all the members of a group
+++ /dev/null
---- a/net/wireless/Kconfig
-+++ b/net/wireless/Kconfig
-@@ -1,5 +1,5 @@
- config WIRELESS_EXT
-- bool
-+ bool "Wireless extensions"
-
- config WEXT_CORE
- def_bool y
-@@ -11,10 +11,10 @@ config WEXT_PROC
- depends on WEXT_CORE
-
- config WEXT_SPY
-- bool
-+ bool "WEXT_SPY"
-
- config WEXT_PRIV
-- bool
-+ bool "WEXT_PRIV"
-
- config CFG80211
- tristate "cfg80211 - wireless configuration API"
+++ /dev/null
---- a/arch/cris/include/arch-v10/arch/Kbuild
-+++ b/arch/cris/include/arch-v10/arch/Kbuild
-@@ -1,3 +1,5 @@
-+header-y += elf.h
-+header-y += ptrace.h
- header-y += user.h
- header-y += svinto.h
- header-y += sv_addr_ag.h
---- a/arch/cris/include/asm/Kbuild
-+++ b/arch/cris/include/asm/Kbuild
-@@ -1,11 +1,14 @@
- include include/asm-generic/Kbuild.asm
-
--header-y += arch-v10/
--header-y += arch-v32/
-+header-y += ../arch-v10/arch/
-+header-y += ../arch-v32/arch/
-
-+header-y += elf.h
- header-y += ethernet.h
-+header-y += page.h
- header-y += rtc.h
- header-y += sync_serial.h
-+header-y += user.h
-
- unifdef-y += etraxgpio.h
- unifdef-y += rs485.h
+++ /dev/null
-Upstream doesn't optimize the kernel and bootwrappers for ppc44x because
-they still want to support gcc 3.3 -- well, we don't.
-
---- a/arch/powerpc/Makefile
-+++ b/arch/powerpc/Makefile
-@@ -123,7 +123,8 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
- KBUILD_CFLAGS += -mno-sched-epilog
- endif
-
--cpu-as-$(CONFIG_4xx) += -Wa,-m405
-+cpu-as-$(CONFIG_40x) += -Wa,-m405
-+cpu-as-$(CONFIG_44x) += -Wa,-m440
- cpu-as-$(CONFIG_6xx) += -Wa,-maltivec
- cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec
- cpu-as-$(CONFIG_E500) += -Wa,-me500
---- a/arch/powerpc/boot/Makefile
-+++ b/arch/powerpc/boot/Makefile
-@@ -38,10 +38,10 @@ BOOTCFLAGS += -I$(obj) -I$(srctree)/$(ob
- DTS_FLAGS ?= -p 1024
-
- $(obj)/4xx.o: BOOTCFLAGS += -mcpu=405
--$(obj)/ebony.o: BOOTCFLAGS += -mcpu=405
-+$(obj)/ebony.o: BOOTCFLAGS += -mcpu=440
- $(obj)/cuboot-hotfoot.o: BOOTCFLAGS += -mcpu=405
--$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=405
--$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=405
-+$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=440
-+$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=440
- $(obj)/cuboot-acadia.o: BOOTCFLAGS += -mcpu=405
- $(obj)/treeboot-walnut.o: BOOTCFLAGS += -mcpu=405
- $(obj)/virtex405-head.o: BOOTAFLAGS += -mcpu=405
+++ /dev/null
---- a/usr/Kconfig
-+++ b/usr/Kconfig
-@@ -75,7 +75,7 @@ config RD_LZMA
- config RD_LZO
- bool "Support initial ramdisks compressed using LZO" if EMBEDDED
- default !EMBEDDED
-- depends on BLK_DEV_INITRD
-+ depends on BLK_DEV_INITRD && HAVE_KERNEL_LZO
- select DECOMPRESS_LZO
- help
- Support loading of a LZO encoded initial ramdisk or cpio buffer
+++ /dev/null
---- a/scripts/Makefile.lib
-+++ b/scripts/Makefile.lib
-@@ -238,7 +238,7 @@ cmd_bzip2 = (cat $(filter-out FORCE,$^)
-
- quiet_cmd_lzma = LZMA $@
- cmd_lzma = (cat $(filter-out FORCE,$^) | \
-- lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
-+ lzma e -d20 -lc1 -lp2 -pb2 -eos -si -so && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
- (rm -f $@ ; false)
-
- quiet_cmd_lzo = LZO $@
---- a/scripts/gen_initramfs_list.sh
-+++ b/scripts/gen_initramfs_list.sh
-@@ -225,7 +225,7 @@ cpio_list=
- output="/dev/stdout"
- output_file=""
- is_cpio_compressed=
--compr="gzip -9 -f"
-+compr="gzip -9 -f -"
-
- arg="$1"
- case "$arg" in
-@@ -239,9 +239,9 @@ case "$arg" in
- output_file="$1"
- cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)"
- output=${cpio_list}
-- echo "$output_file" | grep -q "\.gz$" && compr="gzip -9 -f"
-- echo "$output_file" | grep -q "\.bz2$" && compr="bzip2 -9 -f"
-- echo "$output_file" | grep -q "\.lzma$" && compr="lzma -9 -f"
-+ echo "$output_file" | grep -q "\.gz$" && compr="gzip -9 -f -"
-+ echo "$output_file" | grep -q "\.bz2$" && compr="bzip2 -9 -f -"
-+ echo "$output_file" | grep -q "\.lzma$" && compr="lzma e -d20 -lc1 -lp2 -pb2 -eos -si -so"
- echo "$output_file" | grep -q "\.cpio$" && compr="cat"
- shift
- ;;
-@@ -292,7 +292,7 @@ if [ ! -z ${output_file} ]; then
- if [ "${is_cpio_compressed}" = "compressed" ]; then
- cat ${cpio_tfile} > ${output_file}
- else
-- (cat ${cpio_tfile} | ${compr} - > ${output_file}) \
-+ (cat ${cpio_tfile} | ${compr} > ${output_file}) \
- || (rm -f ${output_file} ; false)
- fi
- [ -z ${cpio_file} ] && rm ${cpio_tfile}
---- a/lib/decompress.c
-+++ b/lib/decompress.c
-@@ -36,6 +36,7 @@ static const struct compress_format {
- { {037, 0236}, "gzip", gunzip },
- { {0x42, 0x5a}, "bzip2", bunzip2 },
- { {0x5d, 0x00}, "lzma", unlzma },
-+ { {0x6d, 0x00}, "lzma-openwrt", unlzma },
- { {0x89, 0x4c}, "lzo", unlzo },
- { {0, 0}, NULL, NULL }
- };
+++ /dev/null
---- a/init/main.c
-+++ b/init/main.c
-@@ -831,10 +831,7 @@ static noinline int init_post(void)
- printk(KERN_WARNING "Failed to execute %s. Attempting "
- "defaults...\n", execute_command);
- }
-- run_init_process("/sbin/init");
-- run_init_process("/etc/init");
-- run_init_process("/bin/init");
-- run_init_process("/bin/sh");
-+ run_init_process("/etc/preinit");
-
- panic("No init found. Try passing init= option to kernel.");
- }
+++ /dev/null
-From f49e1efdd179d54e814ff2a8e8f469496583062c Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Tue, 20 Oct 2009 10:54:36 +0100
-Subject: [PATCH] Squashfs: add LZMA compression
-
-Add support for LZMA compressed filesystems. This is an initial
-implementation.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/Kconfig | 5 ++
- fs/squashfs/Makefile | 1 +
- fs/squashfs/decompressor.c | 4 +
- fs/squashfs/lzma_wrapper.c | 151 ++++++++++++++++++++++++++++++++++++++++++++
- fs/squashfs/squashfs.h | 3 +
- 5 files changed, 164 insertions(+), 0 deletions(-)
- create mode 100644 fs/squashfs/lzma_wrapper.c
-
---- a/fs/squashfs/Kconfig
-+++ b/fs/squashfs/Kconfig
-@@ -26,6 +26,11 @@ config SQUASHFS
-
- If unsure, say N.
-
-+config SQUASHFS_LZMA
-+ bool "Include support for LZMA compressed file systems"
-+ depends on SQUASHFS
-+ select DECOMPRESS_LZMA
-+
- config SQUASHFS_EMBEDDED
-
- bool "Additional option for memory-constrained systems"
---- a/fs/squashfs/Makefile
-+++ b/fs/squashfs/Makefile
-@@ -5,3 +5,4 @@
- obj-$(CONFIG_SQUASHFS) += squashfs.o
- squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
- squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o
-+squashfs-$(CONFIG_SQUASHFS_LZMA) += lzma_wrapper.o
---- a/fs/squashfs/decompressor.c
-+++ b/fs/squashfs/decompressor.c
-@@ -50,7 +50,11 @@ static const struct squashfs_decompresso
-
- static const struct squashfs_decompressor *decompressor[] = {
- &squashfs_zlib_comp_ops,
-+#ifdef CONFIG_SQUASHFS_LZMA
-+ &squashfs_lzma_comp_ops,
-+#else
- &squashfs_lzma_unsupported_comp_ops,
-+#endif
- &squashfs_lzo_unsupported_comp_ops,
- &squashfs_unknown_comp_ops
- };
---- /dev/null
-+++ b/fs/squashfs/lzma_wrapper.c
-@@ -0,0 +1,151 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-+ * Phillip Lougher <phillip@lougher.demon.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,
-+ * 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+ *
-+ * lzma_wrapper.c
-+ */
-+
-+#include <asm/unaligned.h>
-+#include <linux/buffer_head.h>
-+#include <linux/mutex.h>
-+#include <linux/vmalloc.h>
-+#include <linux/decompress/unlzma.h>
-+
-+#include "squashfs_fs.h"
-+#include "squashfs_fs_sb.h"
-+#include "squashfs_fs_i.h"
-+#include "squashfs.h"
-+#include "decompressor.h"
-+
-+struct squashfs_lzma {
-+ void *input;
-+ void *output;
-+};
-+
-+/* decompress_unlzma.c is currently non re-entrant... */
-+DEFINE_MUTEX(lzma_mutex);
-+
-+/* decompress_unlzma.c doesn't provide any context in its callbacks... */
-+static int lzma_error;
-+
-+static void error(char *m)
-+{
-+ ERROR("unlzma error: %s\n", m);
-+ lzma_error = 1;
-+}
-+
-+
-+static void *lzma_init(struct squashfs_sb_info *msblk)
-+{
-+ struct squashfs_lzma *stream = kzalloc(sizeof(*stream), GFP_KERNEL);
-+ if (stream == NULL)
-+ goto failed;
-+ stream->input = vmalloc(msblk->block_size);
-+ if (stream->input == NULL)
-+ goto failed;
-+ stream->output = vmalloc(msblk->block_size);
-+ if (stream->output == NULL)
-+ goto failed2;
-+
-+ return stream;
-+
-+failed2:
-+ vfree(stream->input);
-+failed:
-+ ERROR("failed to allocate lzma workspace\n");
-+ kfree(stream);
-+ return NULL;
-+}
-+
-+
-+static void lzma_free(void *strm)
-+{
-+ struct squashfs_lzma *stream = strm;
-+
-+ if (stream) {
-+ vfree(stream->input);
-+ vfree(stream->output);
-+ }
-+ kfree(stream);
-+}
-+
-+
-+static int lzma_uncompress(struct squashfs_sb_info *msblk, void **buffer,
-+ struct buffer_head **bh, int b, int offset, int length, int srclength,
-+ int pages)
-+{
-+ struct squashfs_lzma *stream = msblk->stream;
-+ void *buff = stream->input;
-+ int avail, i, bytes = length, res;
-+
-+ mutex_lock(&lzma_mutex);
-+
-+ for (i = 0; i < b; i++) {
-+ wait_on_buffer(bh[i]);
-+ if (!buffer_uptodate(bh[i]))
-+ goto block_release;
-+
-+ avail = min(bytes, msblk->devblksize - offset);
-+ memcpy(buff, bh[i]->b_data + offset, avail);
-+ buff += avail;
-+ bytes -= avail;
-+ offset = 0;
-+ put_bh(bh[i]);
-+ }
-+
-+ lzma_error = 0;
-+ res = unlzma(stream->input, length, NULL, NULL, stream->output, NULL,
-+ error);
-+ if (res || lzma_error)
-+ goto failed;
-+
-+ /* uncompressed size is stored in the LZMA header (5 byte offset) */
-+ res = bytes = get_unaligned_le32(stream->input + 5);
-+ for (i = 0, buff = stream->output; bytes && i < pages; i++) {
-+ avail = min_t(int, bytes, PAGE_CACHE_SIZE);
-+ memcpy(buffer[i], buff, avail);
-+ buff += avail;
-+ bytes -= avail;
-+ }
-+ if (bytes)
-+ goto failed;
-+
-+ mutex_unlock(&lzma_mutex);
-+ return res;
-+
-+block_release:
-+ for (; i < b; i++)
-+ put_bh(bh[i]);
-+
-+failed:
-+ mutex_unlock(&lzma_mutex);
-+
-+ ERROR("lzma decompression failed, data probably corrupt\n");
-+ return -EIO;
-+}
-+
-+const struct squashfs_decompressor squashfs_lzma_comp_ops = {
-+ .init = lzma_init,
-+ .free = lzma_free,
-+ .decompress = lzma_uncompress,
-+ .id = LZMA_COMPRESSION,
-+ .name = "lzma",
-+ .supported = 1
-+};
-+
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -94,3 +94,6 @@ extern const struct address_space_operat
-
- /* zlib_wrapper.c */
- extern const struct squashfs_decompressor squashfs_zlib_comp_ops;
-+
-+/* lzma wrapper.c */
-+extern const struct squashfs_decompressor squashfs_lzma_comp_ops;
+++ /dev/null
-From fdf23ed283bc6ef5c25076ce2065f892120ff556 Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Thu, 22 Oct 2009 04:57:38 +0100
-Subject: [PATCH] Squashfs: Make unlzma available to non initramfs/initrd code
-
-Add a config option DECOMPRESS_LZMA_NEEDED which allows subsystems to
-specify they need the unlzma code. Normally decompress_unlzma.c is
-compiled with __init and unlzma is not exported to modules.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/Kconfig | 1 +
- include/linux/decompress/bunzip2_mm.h | 12 ++++++++++++
- include/linux/decompress/inflate_mm.h | 12 ++++++++++++
- include/linux/decompress/mm.h | 3 ---
- include/linux/decompress/unlzma_mm.h | 20 ++++++++++++++++++++
- lib/Kconfig | 3 +++
- lib/decompress_bunzip2.c | 1 +
- lib/decompress_inflate.c | 1 +
- lib/decompress_unlzma.c | 5 ++++-
- 9 files changed, 54 insertions(+), 4 deletions(-)
- create mode 100644 include/linux/decompress/bunzip2_mm.h
- create mode 100644 include/linux/decompress/inflate_mm.h
- create mode 100644 include/linux/decompress/unlzma_mm.h
-
---- a/fs/squashfs/Kconfig
-+++ b/fs/squashfs/Kconfig
-@@ -30,6 +30,7 @@ config SQUASHFS_LZMA
- bool "Include support for LZMA compressed file systems"
- depends on SQUASHFS
- select DECOMPRESS_LZMA
-+ select DECOMPRESS_LZMA_NEEDED
-
- config SQUASHFS_EMBEDDED
-
---- /dev/null
-+++ b/include/linux/decompress/bunzip2_mm.h
-@@ -0,0 +1,12 @@
-+#ifndef BUNZIP2_MM_H
-+#define BUNZIP2_MM_H
-+
-+#ifdef STATIC
-+/* Code active when included from pre-boot environment: */
-+#define INIT
-+#else
-+/* Compile for initramfs/initrd code only */
-+#define INIT __init
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/include/linux/decompress/inflate_mm.h
-@@ -0,0 +1,12 @@
-+#ifndef INFLATE_MM_H
-+#define INFLATE_MM_H
-+
-+#ifdef STATIC
-+/* Code active when included from pre-boot environment: */
-+#define INIT
-+#else
-+/* Compile for initramfs/initrd code only */
-+#define INIT __init
-+#endif
-+
-+#endif
---- a/include/linux/decompress/mm.h
-+++ b/include/linux/decompress/mm.h
-@@ -53,8 +53,6 @@ static void free(void *where)
-
- #define set_error_fn(x)
-
--#define INIT
--
- #else /* STATIC */
-
- /* Code active when compiled standalone for use when loading ramdisk: */
-@@ -77,7 +75,6 @@ static void free(void *where)
- static void(*error)(char *m);
- #define set_error_fn(x) error = x;
-
--#define INIT __init
- #define STATIC
-
- #include <linux/init.h>
---- /dev/null
-+++ b/include/linux/decompress/unlzma_mm.h
-@@ -0,0 +1,20 @@
-+#ifndef UNLZMA_MM_H
-+#define UNLZMA_MM_H
-+
-+#ifdef STATIC
-+
-+/* Code active when included from pre-boot environment: */
-+#define INIT
-+
-+#elif defined(CONFIG_DECOMPRESS_LZMA_NEEDED)
-+
-+/* Make it available to non initramfs/initrd code */
-+#define INIT
-+#include <linux/module.h>
-+#else
-+
-+/* Compile for initramfs/initrd code only */
-+#define INIT __init
-+#endif
-+
-+#endif
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -121,6 +121,9 @@ config DECOMPRESS_LZO
- select LZO_DECOMPRESS
- tristate
-
-+config DECOMPRESS_LZMA_NEEDED
-+ boolean
-+
- #
- # Generic allocator support is selected if needed
- #
---- a/lib/decompress_bunzip2.c
-+++ b/lib/decompress_bunzip2.c
-@@ -52,6 +52,7 @@
- #include <linux/slab.h>
- #endif /* STATIC */
-
-+#include <linux/decompress/bunzip2_mm.h>
- #include <linux/decompress/mm.h>
-
- #ifndef INT_MAX
---- a/lib/decompress_inflate.c
-+++ b/lib/decompress_inflate.c
-@@ -23,6 +23,7 @@
-
- #endif /* STATIC */
-
-+#include <linux/decompress/inflate_mm.h>
- #include <linux/decompress/mm.h>
-
- #define GZIP_IOBUF_SIZE (16*1024)
---- a/lib/decompress_unlzma.c
-+++ b/lib/decompress_unlzma.c
-@@ -36,6 +36,7 @@
- #include <linux/slab.h>
- #endif /* STATIC */
-
-+#include <linux/decompress/unlzma_mm.h>
- #include <linux/decompress/mm.h>
-
- #define MIN(a, b) (((a) < (b)) ? (a) : (b))
-@@ -531,7 +532,7 @@ static inline void INIT process_bit1(str
-
-
-
--STATIC inline int INIT unlzma(unsigned char *buf, int in_len,
-+STATIC int INIT unlzma(unsigned char *buf, int in_len,
- int(*fill)(void*, unsigned int),
- int(*flush)(void*, unsigned int),
- unsigned char *output,
-@@ -664,4 +665,6 @@ STATIC int INIT decompress(unsigned char
- {
- return unlzma(buf, in_len - 4, fill, flush, output, posp, error_fn);
- }
-+#elif defined(CONFIG_DECOMPRESS_LZMA_NEEDED)
-+EXPORT_SYMBOL(unlzma);
- #endif
+++ /dev/null
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -121,6 +121,8 @@
- #endif
- .endm
-
-+ j kernel_entry
-+ nop
- #ifndef CONFIG_NO_EXCEPT_FILL
- /*
- * Reserved space for exception handlers.
+++ /dev/null
---- a/Makefile
-+++ b/Makefile
-@@ -529,7 +529,7 @@ all: vmlinux
- ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
- KBUILD_CFLAGS += -Os
- else
--KBUILD_CFLAGS += -O2
-+KBUILD_CFLAGS += -O2 -fno-reorder-blocks -fno-tree-ch
- endif
-
- include $(srctree)/arch/$(SRCARCH)/Makefile
-@@ -567,6 +567,9 @@ endif
- NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
- CHECKFLAGS += $(NOSTDINC_FLAGS)
-
-+# improve gcc optimization
-+CFLAGS += $(call cc-option,-funit-at-a-time,)
-+
- # warn about C99 declaration after statement
- KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
-
+++ /dev/null
---- a/arch/mips/include/asm/system.h
-+++ b/arch/mips/include/asm/system.h
-@@ -194,7 +194,7 @@ extern __u64 __xchg_u64_unsupported_on_3
- #define __xchg_u64 __xchg_u64_unsupported_on_32bit_kernels
- #endif
-
--static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-+static __always_inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
- {
- switch (size) {
- case 4:
+++ /dev/null
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -51,6 +51,7 @@
- #define SST49LF040B 0x0050
- #define SST49LF008A 0x005a
- #define AT49BV6416 0x00d6
-+#define MANUFACTURER_SAMSUNG 0x00ec
-
- static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
- static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
-@@ -375,12 +376,19 @@ struct mtd_info *cfi_cmdset_0002(struct
-
- if (extp->MajorVersion != '1' ||
- (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
-- printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query "
-- "version %c.%c.\n", extp->MajorVersion,
-- extp->MinorVersion);
-- kfree(extp);
-- kfree(mtd);
-- return NULL;
-+ if (cfi->mfr == MANUFACTURER_SAMSUNG &&
-+ (extp->MajorVersion == '3' && extp->MinorVersion == '3')) {
-+ printk(KERN_NOTICE " Newer Samsung flash detected, "
-+ "should be compatibile with Amd/Fujitsu.\n");
-+ }
-+ else {
-+ printk(KERN_ERR " Unknown Amd/Fujitsu Extended Query "
-+ "version %c.%c.\n", extp->MajorVersion,
-+ extp->MinorVersion);
-+ kfree(extp);
-+ kfree(mtd);
-+ return NULL;
-+ }
- }
-
- /* Install our own private info structure */
+++ /dev/null
---- /dev/null
-+++ b/arch/mips/include/asm/mips_machine.h
-@@ -0,0 +1,47 @@
-+/*
-+ * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.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.
-+ *
-+ */
-+
-+#ifndef __ASM_MIPS_MACHINE_H
-+#define __ASM_MIPS_MACHINE_H
-+
-+#include <linux/init.h>
-+#include <linux/list.h>
-+
-+struct mips_machine {
-+ unsigned long mach_type;
-+ void (*mach_setup)(void);
-+ char *mach_name;
-+ struct list_head list;
-+};
-+
-+void mips_machine_register(struct mips_machine *) __init;
-+void mips_machine_setup(unsigned long machtype) __init;
-+void mips_machine_set_name(char *name) __init;
-+
-+extern char *mips_machine_name;
-+
-+#define MIPS_MACHINE(_type, _name, _setup) \
-+static char machine_name_##_type[] __initdata = _name; \
-+static struct mips_machine machine_##_type __initdata = \
-+{ \
-+ .mach_type = _type, \
-+ .mach_name = machine_name_##_type, \
-+ .mach_setup = _setup, \
-+}; \
-+ \
-+static int __init register_machine_##_type(void) \
-+{ \
-+ mips_machine_register(&machine_##_type); \
-+ return 0; \
-+} \
-+ \
-+pure_initcall(register_machine_##_type)
-+
-+#endif /* __ASM_MIPS_MACHINE_H */
-+
---- /dev/null
-+++ b/arch/mips/kernel/mips_machine.c
-@@ -0,0 +1,74 @@
-+/*
-+ * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.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.
-+ *
-+ */
-+#include <linux/mm.h>
-+
-+#include <asm/mips_machine.h>
-+#include <asm/bootinfo.h>
-+
-+static struct list_head mips_machines __initdata =
-+ LIST_HEAD_INIT(mips_machines);
-+
-+char *mips_machine_name = "Unknown";
-+
-+static struct mips_machine * __init mips_machine_find(unsigned long machtype)
-+{
-+ struct list_head *this;
-+
-+ list_for_each(this, &mips_machines) {
-+ struct mips_machine *mach;
-+
-+ mach = list_entry(this, struct mips_machine, list);
-+ if (mach->mach_type == machtype)
-+ return mach;
-+ }
-+
-+ return NULL;
-+}
-+
-+void __init mips_machine_register(struct mips_machine *mach)
-+{
-+ list_add_tail(&mach->list, &mips_machines);
-+}
-+
-+void __init mips_machine_set_name(char *name)
-+{
-+ unsigned int len;
-+ char *p;
-+
-+ if (name == NULL)
-+ return;
-+
-+ len = strlen(name);
-+ p = kmalloc(len + 1, GFP_KERNEL);
-+ if (p) {
-+ strncpy(p, name, len);
-+ p[len] = '\0';
-+ mips_machine_name = p;
-+ } else {
-+ printk(KERN_WARNING "MIPS: no memory for machine_name\n");
-+ }
-+}
-+
-+void __init mips_machine_setup(unsigned long machtype)
-+{
-+ struct mips_machine *mach;
-+
-+ mach = mips_machine_find(machtype);
-+ if (!mach) {
-+ printk(KERN_ALERT "MIPS: no machine registered for "
-+ "machtype %lu\n", machtype);
-+ return;
-+ }
-+
-+ mips_machine_set_name(mach->mach_name);
-+ printk(KERN_INFO "MIPS: machine is %s\n", mips_machine_name);
-+
-+ if (mach->mach_setup)
-+ mach->mach_setup();
-+}
---- a/arch/mips/kernel/Makefile
-+++ b/arch/mips/kernel/Makefile
-@@ -94,6 +94,7 @@
- obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
- obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
- obj-$(CONFIG_SPINLOCK_TEST) += spinlock_test.o
-+obj-$(CONFIG_MIPS_MACHINE) += mips_machine.o
-
- CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi)
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -851,6 +851,9 @@ config MIPS_DISABLE_OBSOLETE_IDE
- config SYNC_R4K
- bool
-
-+config MIPS_MACHINE
-+ def_bool n
-+
- config NO_IOPORT
- def_bool n
-
---- a/arch/mips/kernel/proc.c
-+++ b/arch/mips/kernel/proc.c
-@@ -12,6 +12,7 @@
- #include <asm/cpu-features.h>
- #include <asm/mipsregs.h>
- #include <asm/processor.h>
-+#include <asm/mips_machine.h>
-
- unsigned int vced_count, vcei_count;
-
-@@ -31,8 +32,12 @@ static int show_cpuinfo(struct seq_file
- /*
- * For the first processor also print the system type
- */
-- if (n == 0)
-+ if (n == 0) {
- seq_printf(m, "system type\t\t: %s\n", get_system_type());
-+#ifdef CONFIG_MIPS_MACHINE
-+ seq_printf(m, "machine\t\t\t: %s\n", mips_machine_name);
-+#endif
-+ }
-
- seq_printf(m, "processor\t\t: %ld\n", n);
- sprintf(fmt, "cpu model\t\t: %%s V%%d.%%d%s\n",
+++ /dev/null
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -854,6 +854,10 @@ config SYNC_R4K
- config MIPS_MACHINE
- def_bool n
-
-+config IMAGE_CMDLINE_HACK
-+ bool "OpenWrt specific image command line hack"
-+ default n
-+
- config NO_IOPORT
- def_bool n
-
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -143,6 +143,12 @@ FEXPORT(__kernel_entry)
- j kernel_entry
- #endif
-
-+#ifdef CONFIG_IMAGE_CMDLINE_HACK
-+ .ascii "CMDLINE:"
-+EXPORT(__image_cmdline)
-+ .fill 0x400
-+#endif /* CONFIG_IMAGE_CMDLINE_HACK */
-+
- __REF
-
- NESTED(kernel_entry, 16, sp) # kernel entry point
+++ /dev/null
---- a/arch/mips/include/asm/thread_info.h
-+++ b/arch/mips/include/asm/thread_info.h
-@@ -83,6 +83,7 @@ register struct thread_info *__current_t
- #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
- #define THREAD_MASK (THREAD_SIZE - 1UL)
-
-+#if 0
- #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR
-
- #ifdef CONFIG_DEBUG_STACK_USAGE
-@@ -92,6 +93,7 @@ register struct thread_info *__current_t
- #endif
-
- #define free_thread_info(info) kfree(info)
-+#endif
-
- #endif /* !__ASSEMBLY__ */
-
+++ /dev/null
-MIPS: allow disabling the kernel FPU emulator
-
-This patch allows turning off the in-kernel Algorithmics
-FPU emulator support, which allows one to save a couple of
-precious blocks on an embedded system.
-
-Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -839,6 +839,17 @@ config I8259
- config MIPS_BONITO64
- bool
-
-+config MIPS_FPU_EMU
-+ bool "Enable FPU emulation"
-+ default y
-+ help
-+ This option allows building a kernel with or without the Algorithmics
-+ FPU emulator enabled. Turning off this option results in a kernel which
-+ does not catch floating operations exceptions. Make sure that your toolchain
-+ is configured to enable software floating point emulation in that case.
-+
-+ If unsure say Y here.
-+
- config MIPS_MSC
- bool
-
---- a/arch/mips/math-emu/Makefile
-+++ b/arch/mips/math-emu/Makefile
-@@ -2,12 +2,14 @@
- # Makefile for the Linux/MIPS kernel FPU emulation.
- #
-
--obj-y := cp1emu.o ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
-+obj-y := kernel_linkage.o dsemul.o cp1emu.o
-+
-+obj-$(CONFIG_MIPS_FPU_EMU) += ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
- ieee754xcpt.o dp_frexp.o dp_modf.o dp_div.o dp_mul.o dp_sub.o \
- dp_add.o dp_fsp.o dp_cmp.o dp_logb.o dp_scalb.o dp_simple.o \
- dp_tint.o dp_fint.o dp_tlong.o dp_flong.o sp_frexp.o sp_modf.o \
- sp_div.o sp_mul.o sp_sub.o sp_add.o sp_fdp.o sp_cmp.o sp_logb.o \
- sp_scalb.o sp_simple.o sp_tint.o sp_fint.o sp_tlong.o sp_flong.o \
-- dp_sqrt.o sp_sqrt.o kernel_linkage.o dsemul.o
-+ dp_sqrt.o sp_sqrt.o
-
- EXTRA_CFLAGS += -Werror
---- a/arch/mips/math-emu/cp1emu.c
-+++ b/arch/mips/math-emu/cp1emu.c
-@@ -58,7 +58,11 @@
- #define __mips 4
-
- /* Function which emulates a floating point instruction. */
-+#ifdef CONFIG_DEBUG_FS
-+DEFINE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats);
-+#endif
-
-+#ifdef CONFIG_MIPS_FPU_EMU
- static int fpu_emu(struct pt_regs *, struct mips_fpu_struct *,
- mips_instruction);
-
-@@ -69,10 +73,6 @@ static int fpux_emu(struct pt_regs *,
-
- /* Further private data for which no space exists in mips_fpu_struct */
-
--#ifdef CONFIG_DEBUG_FS
--DEFINE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats);
--#endif
--
- /* Control registers */
-
- #define FPCREG_RID 0 /* $0 = revision id */
-@@ -1277,7 +1277,6 @@ int fpu_emulator_cop1Handler(struct pt_r
-
- return sig;
- }
--
- #ifdef CONFIG_DEBUG_FS
-
- static int fpuemu_stat_get(void *data, u64 *val)
-@@ -1326,4 +1325,11 @@ static int __init debugfs_fpuemu(void)
- return 0;
- }
- __initcall(debugfs_fpuemu);
--#endif
-+#endif /* CONFIG_DEBUGFS */
-+#else
-+int fpu_emulator_cop1Handler(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
-+ int has_fpu)
-+{
-+ return 0;
-+}
-+#endif /* CONFIG_MIPS_FPU_EMU */
---- a/arch/mips/math-emu/dsemul.c
-+++ b/arch/mips/math-emu/dsemul.c
-@@ -109,6 +109,7 @@ int mips_dsemul(struct pt_regs *regs, mi
- return SIGILL; /* force out of emulation loop */
- }
-
-+#ifdef CONFIG_MIPS_FPU_EMU
- int do_dsemulret(struct pt_regs *xcp)
- {
- struct emuframe __user *fr;
-@@ -165,3 +166,9 @@ int do_dsemulret(struct pt_regs *xcp)
-
- return 1;
- }
-+#else
-+int do_dsemulret(struct pt_regs *xcp)
-+{
-+ return 0;
-+}
-+#endif /* CONFIG_MIPS_FPU_EMU */
---- a/arch/mips/math-emu/kernel_linkage.c
-+++ b/arch/mips/math-emu/kernel_linkage.c
-@@ -29,6 +29,7 @@
-
- #define SIGNALLING_NAN 0x7ff800007ff80000LL
-
-+#ifdef CONFIG_MIPS_FPU_EMU
- void fpu_emulator_init_fpu(void)
- {
- static int first = 1;
-@@ -112,4 +113,36 @@ int fpu_emulator_restore_context32(struc
-
- return err;
- }
--#endif
-+#endif /* CONFIG_64BIT */
-+#else
-+
-+void fpu_emulator_init_fpu(void)
-+{
-+ printk(KERN_INFO "FPU emulator disabled, make sure your toolchain"
-+ "was compiled with software floating point support (soft-float)\n");
-+ return;
-+}
-+
-+int fpu_emulator_save_context(struct sigcontext __user *sc)
-+{
-+ return 0;
-+}
-+
-+int fpu_emulator_restore_context(struct sigcontext __user *sc)
-+{
-+ return 0;
-+}
-+
-+int fpu_emulator_save_context32(struct sigcontext32 __user *sc)
-+{
-+ return 0;
-+}
-+
-+int fpu_emulator_restore_context32(struct sigcontext32 __user *sc)
-+{
-+ return 0;
-+}
-+
-+#ifdef CONFIG_64BIT
-+#endif /* CONFIG_64BIT */
-+#endif /* CONFIG_MIPS_FPU_EMU */
+++ /dev/null
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -93,7 +93,7 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
- cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
- cflags-y += -msoft-float
- LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
--MODFLAGS += -mlong-calls
-+MODFLAGS += -mno-long-calls
-
- cflags-y += -ffreestanding
-
---- a/arch/mips/include/asm/module.h
-+++ b/arch/mips/include/asm/module.h
-@@ -9,6 +9,11 @@ struct mod_arch_specific {
- struct list_head dbe_list;
- const struct exception_table_entry *dbe_start;
- const struct exception_table_entry *dbe_end;
-+
-+ void *phys_plt_tbl;
-+ void *virt_plt_tbl;
-+ unsigned int phys_plt_offset;
-+ unsigned int virt_plt_offset;
- };
-
- typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */
---- a/arch/mips/kernel/module.c
-+++ b/arch/mips/kernel/module.c
-@@ -43,6 +43,117 @@ static struct mips_hi16 *mips_hi16_list;
- static LIST_HEAD(dbe_list);
- static DEFINE_SPINLOCK(dbe_lock);
-
-+/*
-+ * Get the potential max trampolines size required of the init and
-+ * non-init sections. Only used if we cannot find enough contiguous
-+ * physically mapped memory to put the module into.
-+ */
-+static unsigned int
-+get_plt_size(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
-+ const char *secstrings, unsigned int symindex, bool is_init)
-+{
-+ unsigned long ret = 0;
-+ unsigned int i, j;
-+ Elf_Sym *syms;
-+
-+ /* Everything marked ALLOC (this includes the exported symbols) */
-+ for (i = 1; i < hdr->e_shnum; ++i) {
-+ unsigned int info = sechdrs[i].sh_info;
-+
-+ if (sechdrs[i].sh_type != SHT_REL
-+ && sechdrs[i].sh_type != SHT_RELA)
-+ continue;
-+
-+ /* Not a valid relocation section? */
-+ if (info >= hdr->e_shnum)
-+ continue;
-+
-+ /* Don't bother with non-allocated sections */
-+ if (!(sechdrs[info].sh_flags & SHF_ALLOC))
-+ continue;
-+
-+ /* If it's called *.init*, and we're not init, we're
-+ not interested */
-+ if ((strstr(secstrings + sechdrs[i].sh_name, ".init") != 0)
-+ != is_init)
-+ continue;
-+
-+ syms = (Elf_Sym *) sechdrs[symindex].sh_addr;
-+ if (sechdrs[i].sh_type == SHT_REL) {
-+ Elf_Mips_Rel *rel = (void *) sechdrs[i].sh_addr;
-+ unsigned int size = sechdrs[i].sh_size / sizeof(*rel);
-+
-+ for (j = 0; j < size; ++j) {
-+ Elf_Sym *sym;
-+
-+ if (ELF_MIPS_R_TYPE(rel[j]) != R_MIPS_26)
-+ continue;
-+
-+ sym = syms + ELF_MIPS_R_SYM(rel[j]);
-+ if (!is_init && sym->st_shndx != SHN_UNDEF)
-+ continue;
-+
-+ ret += 4 * sizeof(int);
-+ }
-+ } else {
-+ Elf_Mips_Rela *rela = (void *) sechdrs[i].sh_addr;
-+ unsigned int size = sechdrs[i].sh_size / sizeof(*rela);
-+
-+ for (j = 0; j < size; ++j) {
-+ Elf_Sym *sym;
-+
-+ if (ELF_MIPS_R_TYPE(rela[j]) != R_MIPS_26)
-+ continue;
-+
-+ sym = syms + ELF_MIPS_R_SYM(rela[j]);
-+ if (!is_init && sym->st_shndx != SHN_UNDEF)
-+ continue;
-+
-+ ret += 4 * sizeof(int);
-+ }
-+ }
-+ }
-+
-+ return ret;
-+}
-+
-+#ifndef MODULE_START
-+static void *alloc_phys(unsigned long size)
-+{
-+ unsigned order;
-+ struct page *page;
-+ struct page *p;
-+
-+ size = PAGE_ALIGN(size);
-+ order = get_order(size);
-+
-+ page = alloc_pages(GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN |
-+ __GFP_THISNODE, order);
-+ if (!page)
-+ return NULL;
-+
-+ split_page(page, order);
-+
-+ for (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p)
-+ __free_page(p);
-+
-+ return page_address(page);
-+}
-+#endif
-+
-+static void free_phys(void *ptr, unsigned long size)
-+{
-+ struct page *page;
-+ struct page *end;
-+
-+ page = virt_to_page(ptr);
-+ end = page + (PAGE_ALIGN(size) >> PAGE_SHIFT);
-+
-+ for (; page < end; ++page)
-+ __free_page(page);
-+}
-+
-+
- void *module_alloc(unsigned long size)
- {
- #ifdef MODULE_START
-@@ -58,21 +169,99 @@ void *module_alloc(unsigned long size)
-
- return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL);
- #else
-+ void *ptr;
-+
- if (size == 0)
- return NULL;
-- return vmalloc(size);
-+
-+ ptr = alloc_phys(size);
-+
-+ /* If we failed to allocate physically contiguous memory,
-+ * fall back to regular vmalloc. The module loader code will
-+ * create jump tables to handle long jumps */
-+ if (!ptr)
-+ return vmalloc(size);
-+
-+ return ptr;
-+#endif
-+}
-+
-+static inline bool is_phys_addr(void *ptr)
-+{
-+#ifdef CONFIG_64BIT
-+ return (KSEGX((unsigned long)ptr) == CKSEG0);
-+#else
-+ return (KSEGX(ptr) == KSEG0);
- #endif
- }
-
- /* Free memory returned from module_alloc */
- void module_free(struct module *mod, void *module_region)
- {
-- vfree(module_region);
-+ if (is_phys_addr(module_region)) {
-+ if (mod->module_init == module_region)
-+ free_phys(module_region, mod->init_size);
-+ else if (mod->module_core == module_region)
-+ free_phys(module_region, mod->core_size);
-+ else
-+ BUG();
-+ } else {
-+ vfree(module_region);
-+ }
-+}
-+
-+static void *__module_alloc(int size, bool phys)
-+{
-+ void *ptr;
-+
-+ if (phys)
-+ ptr = kmalloc(size, GFP_KERNEL);
-+ else
-+ ptr = vmalloc(size);
-+ return ptr;
-+}
-+
-+static void __module_free(void *ptr)
-+{
-+ if (is_phys_addr(ptr))
-+ kfree(ptr);
-+ else
-+ vfree(ptr);
- }
-
- int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
- char *secstrings, struct module *mod)
- {
-+ unsigned int symindex = 0;
-+ unsigned int core_size, init_size;
-+ int i;
-+
-+ for (i = 1; i < hdr->e_shnum; i++)
-+ if (sechdrs[i].sh_type == SHT_SYMTAB)
-+ symindex = i;
-+
-+ core_size = get_plt_size(hdr, sechdrs, secstrings, symindex, false);
-+ init_size = get_plt_size(hdr, sechdrs, secstrings, symindex, true);
-+
-+ mod->arch.phys_plt_offset = 0;
-+ mod->arch.virt_plt_offset = 0;
-+ mod->arch.phys_plt_tbl = NULL;
-+ mod->arch.virt_plt_tbl = NULL;
-+
-+ if ((core_size + init_size) == 0)
-+ return 0;
-+
-+ mod->arch.phys_plt_tbl = __module_alloc(core_size + init_size, 1);
-+ if (!mod->arch.phys_plt_tbl)
-+ return -ENOMEM;
-+
-+ mod->arch.virt_plt_tbl = __module_alloc(core_size + init_size, 0);
-+ if (!mod->arch.virt_plt_tbl) {
-+ __module_free(mod->arch.phys_plt_tbl);
-+ mod->arch.phys_plt_tbl = NULL;
-+ return -ENOMEM;
-+ }
-+
- return 0;
- }
-
-@@ -95,28 +284,36 @@ static int apply_r_mips_32_rela(struct m
- return 0;
- }
-
--static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
-+static Elf_Addr add_plt_entry_to(unsigned *plt_offset,
-+ void *start, Elf_Addr v)
- {
-- if (v % 4) {
-- pr_err("module %s: dangerous R_MIPS_26 REL relocation\n",
-- me->name);
-- return -ENOEXEC;
-- }
-+ unsigned *tramp = start + *plt_offset;
-+ *plt_offset += 4 * sizeof(int);
-
-- if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
-- printk(KERN_ERR
-- "module %s: relocation overflow\n",
-- me->name);
-- return -ENOEXEC;
-- }
-+ /* adjust carry for addiu */
-+ if (v & 0x00008000)
-+ v += 0x10000;
-
-- *location = (*location & ~0x03ffffff) |
-- ((*location + (v >> 2)) & 0x03ffffff);
-+ tramp[0] = 0x3c190000 | (v >> 16); /* lui t9, hi16 */
-+ tramp[1] = 0x27390000 | (v & 0xffff); /* addiu t9, t9, lo16 */
-+ tramp[2] = 0x03200008; /* jr t9 */
-+ tramp[3] = 0x00000000; /* nop */
-
-- return 0;
-+ return (Elf_Addr) tramp;
- }
-
--static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v)
-+static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v)
-+{
-+ if (is_phys_addr(location))
-+ return add_plt_entry_to(&me->arch.phys_plt_offset,
-+ me->arch.phys_plt_tbl, v);
-+ else
-+ return add_plt_entry_to(&me->arch.virt_plt_offset,
-+ me->arch.virt_plt_tbl, v);
-+
-+}
-+
-+static int set_r_mips_26(struct module *me, u32 *location, u32 ofs, Elf_Addr v)
- {
- if (v % 4) {
- pr_err("module %s: dangerous R_MIPS_26 RELArelocation\n",
-@@ -125,17 +322,31 @@ static int apply_r_mips_26_rela(struct m
- }
-
- if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
-- printk(KERN_ERR
-+ v = add_plt_entry(me, location, v + (ofs << 2));
-+ if (!v) {
-+ printk(KERN_ERR
- "module %s: relocation overflow\n",
- me->name);
-- return -ENOEXEC;
-+ return -ENOEXEC;
-+ }
-+ ofs = 0;
- }
-
-- *location = (*location & ~0x03ffffff) | ((v >> 2) & 0x03ffffff);
-+ *location = (*location & ~0x03ffffff) | ((ofs + (v >> 2)) & 0x03ffffff);
-
- return 0;
- }
-
-+static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
-+{
-+ return set_r_mips_26(me, location, *location & 0x03ffffff, v);
-+}
-+
-+static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v)
-+{
-+ return set_r_mips_26(me, location, 0, v);
-+}
-+
- static int apply_r_mips_hi16_rel(struct module *me, u32 *location, Elf_Addr v)
- {
- struct mips_hi16 *n;
-@@ -400,11 +611,32 @@ int module_finalize(const Elf_Ehdr *hdr,
- list_add(&me->arch.dbe_list, &dbe_list);
- spin_unlock_irq(&dbe_lock);
- }
-+
-+ /* Get rid of the fixup trampoline if we're running the module
-+ * from physically mapped address space */
-+ if (me->arch.phys_plt_offset == 0) {
-+ __module_free(me->arch.phys_plt_tbl);
-+ me->arch.phys_plt_tbl = NULL;
-+ }
-+ if (me->arch.virt_plt_offset == 0) {
-+ __module_free(me->arch.virt_plt_tbl);
-+ me->arch.virt_plt_tbl = NULL;
-+ }
-+
- return 0;
- }
-
- void module_arch_cleanup(struct module *mod)
- {
-+ if (mod->arch.phys_plt_tbl) {
-+ __module_free(mod->arch.phys_plt_tbl);
-+ mod->arch.phys_plt_tbl = NULL;
-+ }
-+ if (mod->arch.virt_plt_tbl) {
-+ __module_free(mod->arch.virt_plt_tbl);
-+ mod->arch.virt_plt_tbl = NULL;
-+ }
-+
- spin_lock_irq(&dbe_lock);
- list_del(&mod->arch.dbe_list);
- spin_unlock_irq(&dbe_lock);
+++ /dev/null
---- a/include/asm-generic/vmlinux.lds.h
-+++ b/include/asm-generic/vmlinux.lds.h
-@@ -52,6 +52,27 @@
- #define LOAD_OFFSET 0
- #endif
-
-+#ifndef SYMTAB_KEEP_STR
-+#define SYMTAB_KEEP_STR *(__ksymtab_strings.*)
-+#define SYMTAB_DISCARD_STR
-+#else
-+#define SYMTAB_DISCARD_STR *(__ksymtab_strings.*)
-+#endif
-+
-+#ifndef SYMTAB_KEEP
-+#define SYMTAB_KEEP *(__ksymtab.*)
-+#define SYMTAB_DISCARD
-+#else
-+#define SYMTAB_DISCARD *(__ksymtab.*)
-+#endif
-+
-+#ifndef SYMTAB_KEEP_GPL
-+#define SYMTAB_KEEP_GPL *(__ksymtab_gpl.*)
-+#define SYMTAB_DISCARD_GPL
-+#else
-+#define SYMTAB_DISCARD_GPL *(__ksymtab_gpl.*)
-+#endif
-+
- #ifndef SYMBOL_PREFIX
- #define VMLINUX_SYMBOL(sym) sym
- #else
-@@ -258,35 +279,35 @@
- /* Kernel symbol table: Normal symbols */ \
- __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab) = .; \
-- *(__ksymtab) \
-+ SYMTAB_KEEP \
- VMLINUX_SYMBOL(__stop___ksymtab) = .; \
- } \
- \
- /* Kernel symbol table: GPL-only symbols */ \
- __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab_gpl) = .; \
-- *(__ksymtab_gpl) \
-+ SYMTAB_KEEP_GPL \
- VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \
- } \
- \
- /* Kernel symbol table: Normal unused symbols */ \
- __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \
-- *(__ksymtab_unused) \
-+ *(__ksymtab_unused.*) \
- VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \
- } \
- \
- /* Kernel symbol table: GPL-only unused symbols */ \
- __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \
-- *(__ksymtab_unused_gpl) \
-+ *(__ksymtab_unused_gpl.*) \
- VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \
- } \
- \
- /* Kernel symbol table: GPL-future-only symbols */ \
- __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \
- VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \
-- *(__ksymtab_gpl_future) \
-+ *(__ksymtab_gpl_future.*) \
- VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \
- } \
- \
-@@ -327,7 +348,7 @@
- \
- /* Kernel symbol table: strings */ \
- __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
-- *(__ksymtab_strings) \
-+ SYMTAB_KEEP_STR \
- } \
- \
- /* __*init sections */ \
-@@ -642,6 +663,9 @@
- EXIT_TEXT \
- EXIT_DATA \
- EXIT_CALL \
-+ SYMTAB_DISCARD \
-+ SYMTAB_DISCARD_GPL \
-+ SYMTAB_DISCARD_STR \
- *(.discard) \
- }
-
---- a/include/linux/module.h
-+++ b/include/linux/module.h
-@@ -194,16 +194,24 @@ void *__symbol_get_gpl(const char *symbo
- #define __CRC_SYMBOL(sym, sec)
- #endif
-
-+#ifdef MODULE
-+#define __EXPORT_SUFFIX(sym)
-+#else
-+#define __EXPORT_SUFFIX(sym) "." #sym
-+#endif
-+
- /* For every exported symbol, place a struct in the __ksymtab section */
- #define __EXPORT_SYMBOL(sym, sec) \
- extern typeof(sym) sym; \
- __CRC_SYMBOL(sym, sec) \
- static const char __kstrtab_##sym[] \
-- __attribute__((section("__ksymtab_strings"), aligned(1))) \
-+ __attribute__((section("__ksymtab_strings" \
-+ __EXPORT_SUFFIX(sym)), aligned(1))) \
- = MODULE_SYMBOL_PREFIX #sym; \
- static const struct kernel_symbol __ksymtab_##sym \
- __used \
-- __attribute__((section("__ksymtab" sec), unused)) \
-+ __attribute__((section("__ksymtab" sec \
-+ __EXPORT_SUFFIX(sym)), unused)) \
- = { (unsigned long)&sym, __kstrtab_##sym }
-
- #define EXPORT_SYMBOL(sym) \
+++ /dev/null
---- a/arch/arm/kernel/module.c
-+++ b/arch/arm/kernel/module.c
-@@ -121,6 +121,10 @@ apply_relocate(Elf32_Shdr *sechdrs, cons
- return -ENOEXEC;
- }
-
-+ if ((IS_ERR_VALUE(sym->st_value) || !sym->st_value) &&
-+ ELF_ST_BIND(sym->st_info) == STB_WEAK)
-+ continue;
-+
- loc = dstsec->sh_addr + rel->r_offset;
-
- switch (ELF32_R_TYPE(rel->r_info)) {
+++ /dev/null
---- a/drivers/pci/Kconfig
-+++ b/drivers/pci/Kconfig
-@@ -51,6 +51,12 @@ config PCI_STUB
-
- When in doubt, say N.
-
-+config PCI_DISABLE_COMMON_QUIRKS
-+ bool "PCI disable common quirks"
-+ depends on PCI
-+ help
-+ If you don't know what to do here, say N.
-+
- config HT_IRQ
- bool "Interrupts on hypertransport devices"
- default y
---- a/drivers/pci/quirks.c
-+++ b/drivers/pci/quirks.c
-@@ -96,6 +96,7 @@ static void __devinit quirk_resource_ali
- }
- DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, quirk_resource_alignment);
-
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
- /* The Mellanox Tavor device gives false positive parity errors
- * Mark this device with a broken_parity_status, to allow
- * PCI scanning code to "skip" this now blacklisted device.
-@@ -1905,7 +1906,9 @@ static void __devinit fixup_rev1_53c810(
- }
- }
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810);
-+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */
-
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
- /* Enable 1k I/O space granularity on the Intel P64H2 */
- static void __devinit quirk_p64h2_1k_io(struct pci_dev *dev)
- {
-@@ -2536,6 +2539,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x150d, quirk_i82576_sriov);
-
- #endif /* CONFIG_PCI_IOV */
-+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */
-
- static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,
- struct pci_fixup *end)
+++ /dev/null
-GCC 4.4.x looks to be adding support for generating out-of-line register
-saves/restores based on:
-
-http://gcc.gnu.org/ml/gcc-patches/2008-04/msg01678.html
-
-This breaks the kernel build as we'd have to link with libgcc to get the
-implementation of the register save/restores.
-
-To workaround this issue, we just stole the save/restore code from gcc
-and simplified it down for our needs (integer only). We only do this if
-PPC32 as gcc makes believe the linker on ppc64 will deal with this and
-only if CONFIG_CC_OPTIMIZE_FOR_SIZE is set (thus -Os).
-
-Signed-off-by: Kumar Gala <[EMAIL PROTECTED]>
----
-
-If someone using cutting edge toolchains for ppc64 could test and make
-sure if we enable CONFIG_CC_OPTIMIZE_FOR_SIZE things work that would be
-nice.
-
-- k
-
- arch/powerpc/kernel/misc_32.S | 77 +++++++++++++++++++++++++++
- arch/powerpc/kernel/ppc_ksyms.c | 111 +++++++++++++++++++++++++++++++++++++++
- 2 files changed, 188 insertions(+), 0 deletions(-)
-
---- a/arch/powerpc/kernel/misc_32.S
-+++ b/arch/powerpc/kernel/misc_32.S
-@@ -802,3 +802,80 @@ relocate_new_kernel_end:
- relocate_new_kernel_size:
- .long relocate_new_kernel_end - relocate_new_kernel
- #endif
-+
-+#if defined(CONFIG_PPC32) && defined(CONFIG_CC_OPTIMIZE_FOR_SIZE)
-+/* Routines for saving integer registers, called by the compiler. */
-+/* Called with r11 pointing to the stack header word of the caller of the */
-+/* function, just beyond the end of the integer save area. */
-+
-+_GLOBAL(_savegpr_14) stw 14,-72(11) /* save gp registers */
-+_GLOBAL(_savegpr_15) stw 15,-68(11)
-+_GLOBAL(_savegpr_16) stw 16,-64(11)
-+_GLOBAL(_savegpr_17) stw 17,-60(11)
-+_GLOBAL(_savegpr_18) stw 18,-56(11)
-+_GLOBAL(_savegpr_19) stw 19,-52(11)
-+_GLOBAL(_savegpr_20) stw 20,-48(11)
-+_GLOBAL(_savegpr_21) stw 21,-44(11)
-+_GLOBAL(_savegpr_22) stw 22,-40(11)
-+_GLOBAL(_savegpr_23) stw 23,-36(11)
-+_GLOBAL(_savegpr_24) stw 24,-32(11)
-+_GLOBAL(_savegpr_25) stw 25,-28(11)
-+_GLOBAL(_savegpr_26) stw 26,-24(11)
-+_GLOBAL(_savegpr_27) stw 27,-20(11)
-+_GLOBAL(_savegpr_28) stw 28,-16(11)
-+_GLOBAL(_savegpr_29) stw 29,-12(11)
-+_GLOBAL(_savegpr_30) stw 30,-8(11)
-+_GLOBAL(_savegpr_31) stw 31,-4(11)
-+ blr
-+
-+/* Routines for restoring integer registers, called by the compiler. */
-+/* Called with r11 pointing to the stack header word of the caller of the */
-+/* function, just beyond the end of the integer restore area. */
-+
-+_GLOBAL(_restgpr_14) lwz 14,-72(11) /* restore gp registers */
-+_GLOBAL(_restgpr_15) lwz 15,-68(11)
-+_GLOBAL(_restgpr_16) lwz 16,-64(11)
-+_GLOBAL(_restgpr_17) lwz 17,-60(11)
-+_GLOBAL(_restgpr_18) lwz 18,-56(11)
-+_GLOBAL(_restgpr_19) lwz 19,-52(11)
-+_GLOBAL(_restgpr_20) lwz 20,-48(11)
-+_GLOBAL(_restgpr_21) lwz 21,-44(11)
-+_GLOBAL(_restgpr_22) lwz 22,-40(11)
-+_GLOBAL(_restgpr_23) lwz 23,-36(11)
-+_GLOBAL(_restgpr_24) lwz 24,-32(11)
-+_GLOBAL(_restgpr_25) lwz 25,-28(11)
-+_GLOBAL(_restgpr_26) lwz 26,-24(11)
-+_GLOBAL(_restgpr_27) lwz 27,-20(11)
-+_GLOBAL(_restgpr_28) lwz 28,-16(11)
-+_GLOBAL(_restgpr_29) lwz 29,-12(11)
-+_GLOBAL(_restgpr_30) lwz 30,-8(11)
-+_GLOBAL(_restgpr_31) lwz 31,-4(11)
-+ blr
-+
-+/* Routines for restoring integer registers, called by the compiler. */
-+/* Called with r11 pointing to the stack header word of the caller of the */
-+/* function, just beyond the end of the integer restore area. */
-+
-+_GLOBAL(_restgpr_14_x) lwz 14,-72(11) /* restore gp registers */
-+_GLOBAL(_restgpr_15_x) lwz 15,-68(11)
-+_GLOBAL(_restgpr_16_x) lwz 16,-64(11)
-+_GLOBAL(_restgpr_17_x) lwz 17,-60(11)
-+_GLOBAL(_restgpr_18_x) lwz 18,-56(11)
-+_GLOBAL(_restgpr_19_x) lwz 19,-52(11)
-+_GLOBAL(_restgpr_20_x) lwz 20,-48(11)
-+_GLOBAL(_restgpr_21_x) lwz 21,-44(11)
-+_GLOBAL(_restgpr_22_x) lwz 22,-40(11)
-+_GLOBAL(_restgpr_23_x) lwz 23,-36(11)
-+_GLOBAL(_restgpr_24_x) lwz 24,-32(11)
-+_GLOBAL(_restgpr_25_x) lwz 25,-28(11)
-+_GLOBAL(_restgpr_26_x) lwz 26,-24(11)
-+_GLOBAL(_restgpr_27_x) lwz 27,-20(11)
-+_GLOBAL(_restgpr_28_x) lwz 28,-16(11)
-+_GLOBAL(_restgpr_29_x) lwz 29,-12(11)
-+_GLOBAL(_restgpr_30_x) lwz 30,-8(11)
-+_GLOBAL(_restgpr_31_x) lwz 0,4(11)
-+ lwz 31,-4(11)
-+ mtlr 0
-+ mr 1,11
-+ blr
-+#endif
---- a/arch/powerpc/kernel/ppc_ksyms.c
-+++ b/arch/powerpc/kernel/ppc_ksyms.c
-@@ -185,3 +185,114 @@ EXPORT_SYMBOL(__mtdcr);
- EXPORT_SYMBOL(__mfdcr);
- #endif
- EXPORT_SYMBOL(empty_zero_page);
-+
-+#if defined(CONFIG_PPC32) && defined(CONFIG_CC_OPTIMIZE_FOR_SIZE)
-+void _savegpr_14(void);
-+void _savegpr_15(void);
-+void _savegpr_16(void);
-+void _savegpr_17(void);
-+void _savegpr_18(void);
-+void _savegpr_19(void);
-+void _savegpr_20(void);
-+void _savegpr_21(void);
-+void _savegpr_22(void);
-+void _savegpr_23(void);
-+void _savegpr_24(void);
-+void _savegpr_25(void);
-+void _savegpr_26(void);
-+void _savegpr_27(void);
-+void _savegpr_28(void);
-+void _savegpr_29(void);
-+void _savegpr_30(void);
-+void _savegpr_31(void);
-+void _restgpr_14(void);
-+void _restgpr_15(void);
-+void _restgpr_16(void);
-+void _restgpr_17(void);
-+void _restgpr_18(void);
-+void _restgpr_19(void);
-+void _restgpr_20(void);
-+void _restgpr_21(void);
-+void _restgpr_22(void);
-+void _restgpr_23(void);
-+void _restgpr_24(void);
-+void _restgpr_25(void);
-+void _restgpr_26(void);
-+void _restgpr_27(void);
-+void _restgpr_28(void);
-+void _restgpr_29(void);
-+void _restgpr_30(void);
-+void _restgpr_31(void);
-+void _restgpr_14_x(void);
-+void _restgpr_15_x(void);
-+void _restgpr_16_x(void);
-+void _restgpr_17_x(void);
-+void _restgpr_18_x(void);
-+void _restgpr_19_x(void);
-+void _restgpr_20_x(void);
-+void _restgpr_21_x(void);
-+void _restgpr_22_x(void);
-+void _restgpr_23_x(void);
-+void _restgpr_24_x(void);
-+void _restgpr_25_x(void);
-+void _restgpr_26_x(void);
-+void _restgpr_27_x(void);
-+void _restgpr_28_x(void);
-+void _restgpr_29_x(void);
-+void _restgpr_30_x(void);
-+void _restgpr_31_x(void);
-+EXPORT_SYMBOL(_savegpr_14);
-+EXPORT_SYMBOL(_savegpr_15);
-+EXPORT_SYMBOL(_savegpr_16);
-+EXPORT_SYMBOL(_savegpr_17);
-+EXPORT_SYMBOL(_savegpr_18);
-+EXPORT_SYMBOL(_savegpr_19);
-+EXPORT_SYMBOL(_savegpr_20);
-+EXPORT_SYMBOL(_savegpr_21);
-+EXPORT_SYMBOL(_savegpr_22);
-+EXPORT_SYMBOL(_savegpr_23);
-+EXPORT_SYMBOL(_savegpr_24);
-+EXPORT_SYMBOL(_savegpr_25);
-+EXPORT_SYMBOL(_savegpr_26);
-+EXPORT_SYMBOL(_savegpr_27);
-+EXPORT_SYMBOL(_savegpr_28);
-+EXPORT_SYMBOL(_savegpr_29);
-+EXPORT_SYMBOL(_savegpr_30);
-+EXPORT_SYMBOL(_savegpr_31);
-+EXPORT_SYMBOL(_restgpr_14);
-+EXPORT_SYMBOL(_restgpr_15);
-+EXPORT_SYMBOL(_restgpr_16);
-+EXPORT_SYMBOL(_restgpr_17);
-+EXPORT_SYMBOL(_restgpr_18);
-+EXPORT_SYMBOL(_restgpr_19);
-+EXPORT_SYMBOL(_restgpr_20);
-+EXPORT_SYMBOL(_restgpr_21);
-+EXPORT_SYMBOL(_restgpr_22);
-+EXPORT_SYMBOL(_restgpr_23);
-+EXPORT_SYMBOL(_restgpr_24);
-+EXPORT_SYMBOL(_restgpr_25);
-+EXPORT_SYMBOL(_restgpr_26);
-+EXPORT_SYMBOL(_restgpr_27);
-+EXPORT_SYMBOL(_restgpr_28);
-+EXPORT_SYMBOL(_restgpr_29);
-+EXPORT_SYMBOL(_restgpr_30);
-+EXPORT_SYMBOL(_restgpr_31);
-+EXPORT_SYMBOL(_restgpr_14_x);
-+EXPORT_SYMBOL(_restgpr_15_x);
-+EXPORT_SYMBOL(_restgpr_16_x);
-+EXPORT_SYMBOL(_restgpr_17_x);
-+EXPORT_SYMBOL(_restgpr_18_x);
-+EXPORT_SYMBOL(_restgpr_19_x);
-+EXPORT_SYMBOL(_restgpr_20_x);
-+EXPORT_SYMBOL(_restgpr_21_x);
-+EXPORT_SYMBOL(_restgpr_22_x);
-+EXPORT_SYMBOL(_restgpr_23_x);
-+EXPORT_SYMBOL(_restgpr_24_x);
-+EXPORT_SYMBOL(_restgpr_25_x);
-+EXPORT_SYMBOL(_restgpr_26_x);
-+EXPORT_SYMBOL(_restgpr_27_x);
-+EXPORT_SYMBOL(_restgpr_28_x);
-+EXPORT_SYMBOL(_restgpr_29_x);
-+EXPORT_SYMBOL(_restgpr_30_x);
-+EXPORT_SYMBOL(_restgpr_31_x);
-+#endif /* CONFIG_PPC32 && CONFIG_CC_OPTIMIZE_FOR_SIZE */
+++ /dev/null
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -14,6 +14,7 @@
- #include <linux/list.h>
- #include <linux/init.h>
- #include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
- #include <linux/buffer_head.h>
- #include <linux/mutex.h>
- #include <linux/mount.h>
-@@ -232,10 +233,11 @@ static void block2mtd_free_device(struct
-
-
- /* FIXME: ensure that mtd->size % erase_size == 0 */
--static struct block2mtd_dev *add_device(char *devname, int erase_size)
-+static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
- {
- struct block_device *bdev;
- struct block2mtd_dev *dev;
-+ struct mtd_partition *part;
- char *name;
-
- if (!devname)
-@@ -273,17 +275,17 @@ static struct block2mtd_dev *add_device(
-
- mutex_init(&dev->write_mutex);
-
-- /* Setup the MTD structure */
-- /* make the name contain the block device in */
-- name = kmalloc(sizeof("block2mtd: ") + strlen(devname) + 1,
-- GFP_KERNEL);
-+ if (!mtdname)
-+ mtdname = devname;
-+
-+ name = kmalloc(strlen(mtdname) + 1, GFP_KERNEL);
- if (!name)
- goto devinit_err;
-
-- sprintf(name, "block2mtd: %s", devname);
-+ strcpy(name, mtdname);
- dev->mtd.name = name;
-
-- dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
-+ dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK & ~(erase_size - 1);
- dev->mtd.erasesize = erase_size;
- dev->mtd.writesize = 1;
- dev->mtd.type = MTD_RAM;
-@@ -296,14 +298,17 @@ static struct block2mtd_dev *add_device(
- dev->mtd.priv = dev;
- dev->mtd.owner = THIS_MODULE;
-
-- if (add_mtd_device(&dev->mtd)) {
-+ part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
-+ part->name = dev->mtd.name;
-+ part->offset = 0;
-+ part->size = dev->mtd.size;
-+ if (add_mtd_partitions(&dev->mtd, part, 1)) {
- /* Device didnt get added, so free the entry */
- goto devinit_err;
- }
- list_add(&dev->list, &blkmtd_device_list);
- INFO("mtd%d: [%s] erase_size = %dKiB [%d]", dev->mtd.index,
-- dev->mtd.name + strlen("block2mtd: "),
-- dev->mtd.erasesize >> 10, dev->mtd.erasesize);
-+ mtdname, dev->mtd.erasesize >> 10, dev->mtd.erasesize);
- return dev;
-
- devinit_err:
-@@ -376,9 +381,9 @@ static char block2mtd_paramline[80 + 12]
-
- static int block2mtd_setup2(const char *val)
- {
-- char buf[80 + 12]; /* 80 for device, 12 for erase size */
-+ char buf[80 + 12 + 80]; /* 80 for device, 12 for erase size, 80 for name */
- char *str = buf;
-- char *token[2];
-+ char *token[3];
- char *name;
- size_t erase_size = PAGE_SIZE;
- int i, ret;
-@@ -389,7 +394,7 @@ static int block2mtd_setup2(const char *
- strcpy(str, val);
- kill_final_newline(str);
-
-- for (i = 0; i < 2; i++)
-+ for (i = 0; i < 3; i++)
- token[i] = strsep(&str, ",");
-
- if (str)
-@@ -408,8 +413,10 @@ static int block2mtd_setup2(const char *
- parse_err("illegal erase size");
- }
- }
-+ if (token[2] && (strlen(token[2]) + 1 > 80))
-+ parse_err("mtd device name too long");
-
-- add_device(name, erase_size);
-+ add_device(name, erase_size, token[2]);
-
- return 0;
- }
-@@ -443,7 +450,7 @@ static int block2mtd_setup(const char *v
-
-
- module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
--MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>]\"");
-+MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>]]\"");
-
- static int __init block2mtd_init(void)
- {
---- a/fs/partitions/check.c
-+++ b/fs/partitions/check.c
-@@ -625,6 +625,7 @@ try_scan:
- kfree(state);
- return 0;
- }
-+EXPORT_SYMBOL(rescan_partitions);
-
- unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p)
- {
+++ /dev/null
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -53,6 +53,16 @@ config MTD_PARTITIONS
- devices. Partitioning on NFTL 'devices' is a different - that's the
- 'normal' form of partitioning used on a block device.
-
-+config MTD_ROOTFS_ROOT_DEV
-+ bool "Automatically set 'rootfs' partition to be root filesystem"
-+ depends on MTD_PARTITIONS
-+ default y
-+
-+config MTD_ROOTFS_SPLIT
-+ bool "Automatically split 'rootfs' partition for squashfs"
-+ depends on MTD_PARTITIONS
-+ default y
-+
- config MTD_REDBOOT_PARTS
- tristate "RedBoot partition table parsing"
- depends on MTD_PARTITIONS
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -18,6 +18,8 @@
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/partitions.h>
- #include <linux/mtd/compatmac.h>
-+#include <linux/root_dev.h>
-+#include <linux/magic.h>
-
- /* Our partition linked list */
- static LIST_HEAD(mtd_partitions);
-@@ -35,7 +37,7 @@ struct mtd_part {
- * the pointer to that structure with this macro.
- */
- #define PART(x) ((struct mtd_part *)(x))
--
-+#define IS_PART(mtd) (mtd->read == part_read)
-
- /*
- * MTD methods which simply translate the effective address and pass through
-@@ -503,6 +505,150 @@ out_register:
- return slave;
- }
-
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+#define ROOTFS_SPLIT_NAME "rootfs_data"
-+#define ROOTFS_REMOVED_NAME "<removed>"
-+
-+struct squashfs_super_block {
-+ __le32 s_magic;
-+ __le32 pad0[9];
-+ __le64 bytes_used;
-+};
-+
-+
-+static int split_squashfs(struct mtd_info *master, int offset, int *split_offset)
-+{
-+ struct squashfs_super_block sb;
-+ int len, ret;
-+
-+ ret = master->read(master, offset, sizeof(sb), &len, (void *) &sb);
-+ if (ret || (len != sizeof(sb))) {
-+ printk(KERN_ALERT "split_squashfs: error occured while reading "
-+ "from \"%s\"\n", master->name);
-+ return -EINVAL;
-+ }
-+
-+ if (SQUASHFS_MAGIC != le32_to_cpu(sb.s_magic) ) {
-+ printk(KERN_ALERT "split_squashfs: no squashfs found in \"%s\"\n",
-+ master->name);
-+ *split_offset = 0;
-+ return 0;
-+ }
-+
-+ if (le64_to_cpu((sb.bytes_used)) <= 0) {
-+ printk(KERN_ALERT "split_squashfs: squashfs is empty in \"%s\"\n",
-+ master->name);
-+ *split_offset = 0;
-+ return 0;
-+ }
-+
-+ len = (u32) le64_to_cpu(sb.bytes_used);
-+ len += (offset & 0x000fffff);
-+ len += (master->erasesize - 1);
-+ len &= ~(master->erasesize - 1);
-+ len -= (offset & 0x000fffff);
-+ *split_offset = offset + len;
-+
-+ return 0;
-+}
-+
-+static int split_rootfs_data(struct mtd_info *master, struct mtd_info *rpart, const struct mtd_partition *part)
-+{
-+ struct mtd_partition *dpart;
-+ struct mtd_part *slave = NULL;
-+ int split_offset = 0;
-+ int ret;
-+
-+ ret = split_squashfs(master, part->offset, &split_offset);
-+ if (ret)
-+ return ret;
-+
-+ if (split_offset <= 0)
-+ return 0;
-+
-+ dpart = kmalloc(sizeof(*part)+sizeof(ROOTFS_SPLIT_NAME)+1, GFP_KERNEL);
-+ if (dpart == NULL) {
-+ printk(KERN_INFO "split_squashfs: no memory for partition \"%s\"\n",
-+ ROOTFS_SPLIT_NAME);
-+ return -ENOMEM;
-+ }
-+
-+ memcpy(dpart, part, sizeof(*part));
-+ dpart->name = (unsigned char *)&dpart[1];
-+ strcpy(dpart->name, ROOTFS_SPLIT_NAME);
-+
-+ dpart->size -= split_offset - dpart->offset;
-+ dpart->offset = split_offset;
-+
-+ if (dpart == NULL)
-+ return 1;
-+
-+ printk(KERN_INFO "mtd: partition \"%s\" created automatically, ofs=%llX, len=%llX \n",
-+ ROOTFS_SPLIT_NAME, dpart->offset, dpart->size);
-+
-+ slave = add_one_partition(master, dpart, 0, split_offset);
-+ if (!slave) {
-+ kfree(dpart);
-+ return -ENOMEM;
-+ }
-+ rpart->split = &slave->mtd;
-+
-+ return 0;
-+}
-+
-+static int refresh_rootfs_split(struct mtd_info *mtd)
-+{
-+ struct mtd_partition tpart;
-+ struct mtd_part *part;
-+ char *name;
-+ //int index = 0;
-+ int offset, size;
-+ int ret;
-+
-+ part = PART(mtd);
-+
-+ /* check for the new squashfs offset first */
-+ ret = split_squashfs(part->master, part->offset, &offset);
-+ if (ret)
-+ return ret;
-+
-+ if ((offset > 0) && !mtd->split) {
-+ printk(KERN_INFO "%s: creating new split partition for \"%s\"\n", __func__, mtd->name);
-+ /* if we don't have a rootfs split partition, create a new one */
-+ tpart.name = (char *) mtd->name;
-+ tpart.size = mtd->size;
-+ tpart.offset = part->offset;
-+
-+ return split_rootfs_data(part->master, &part->mtd, &tpart);
-+ } else if ((offset > 0) && mtd->split) {
-+ /* update the offsets of the existing partition */
-+ size = mtd->size + part->offset - offset;
-+
-+ part = PART(mtd->split);
-+ part->offset = offset;
-+ part->mtd.size = size;
-+ printk(KERN_INFO "%s: %s partition \"" ROOTFS_SPLIT_NAME "\", offset: 0x%06x (0x%06x)\n",
-+ __func__, (!strcmp(part->mtd.name, ROOTFS_SPLIT_NAME) ? "updating" : "creating"),
-+ (u32) part->offset, (u32) part->mtd.size);
-+ name = kmalloc(sizeof(ROOTFS_SPLIT_NAME) + 1, GFP_KERNEL);
-+ strcpy(name, ROOTFS_SPLIT_NAME);
-+ part->mtd.name = name;
-+ } else if ((offset <= 0) && mtd->split) {
-+ printk(KERN_INFO "%s: removing partition \"%s\"\n", __func__, mtd->split->name);
-+
-+ /* mark existing partition as removed */
-+ part = PART(mtd->split);
-+ name = kmalloc(sizeof(ROOTFS_SPLIT_NAME) + 1, GFP_KERNEL);
-+ strcpy(name, ROOTFS_REMOVED_NAME);
-+ part->mtd.name = name;
-+ part->offset = 0;
-+ part->mtd.size = 0;
-+ }
-+
-+ return 0;
-+}
-+#endif /* CONFIG_MTD_ROOTFS_SPLIT */
-+
- /*
- * This function, given a master MTD object and a partition table, creates
- * and registers slave MTD objects which are bound to the master according to
-@@ -518,7 +664,7 @@ int add_mtd_partitions(struct mtd_info *
- {
- struct mtd_part *slave;
- uint64_t cur_offset = 0;
-- int i;
-+ int i, ret;
-
- printk(KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name);
-
-@@ -526,6 +672,21 @@ int add_mtd_partitions(struct mtd_info *
- slave = add_one_partition(master, parts + i, i, cur_offset);
- if (!slave)
- return -ENOMEM;
-+
-+ if (!strcmp(parts[i].name, "rootfs")) {
-+#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV
-+ if (ROOT_DEV == 0) {
-+ printk(KERN_NOTICE "mtd: partition \"rootfs\" "
-+ "set to be root filesystem\n");
-+ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, slave->mtd.index);
-+ }
-+#endif
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+ ret = split_rootfs_data(master, &slave->mtd, &parts[i]);
-+ /* if (ret == 0)
-+ j++; */
-+#endif
-+ }
- cur_offset = slave->offset + slave->mtd.size;
- }
-
-@@ -533,6 +694,32 @@ int add_mtd_partitions(struct mtd_info *
- }
- EXPORT_SYMBOL(add_mtd_partitions);
-
-+int refresh_mtd_partitions(struct mtd_info *mtd)
-+{
-+ int ret = 0;
-+
-+ if (IS_PART(mtd)) {
-+ struct mtd_part *part;
-+ struct mtd_info *master;
-+
-+ part = PART(mtd);
-+ master = part->master;
-+ if (master->refresh_device)
-+ ret = master->refresh_device(master);
-+ }
-+
-+ if (!ret && mtd->refresh_device)
-+ ret = mtd->refresh_device(mtd);
-+
-+#ifdef CONFIG_MTD_ROOTFS_SPLIT
-+ if (!ret && IS_PART(mtd) && !strcmp(mtd->name, "rootfs"))
-+ refresh_rootfs_split(mtd);
-+#endif
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(refresh_mtd_partitions);
-+
- static DEFINE_SPINLOCK(part_parser_lock);
- static LIST_HEAD(part_parsers);
-
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -29,6 +29,8 @@ struct block2mtd_dev {
- struct block_device *blkdev;
- struct mtd_info mtd;
- struct mutex write_mutex;
-+ rwlock_t bdev_mutex;
-+ char devname[0];
- };
-
-
-@@ -81,6 +83,12 @@ static int block2mtd_erase(struct mtd_in
- size_t len = instr->len;
- int err;
-
-+ read_lock(&dev->bdev_mutex);
-+ if (!dev->blkdev) {
-+ err = -EINVAL;
-+ goto done;
-+ }
-+
- instr->state = MTD_ERASING;
- mutex_lock(&dev->write_mutex);
- err = _block2mtd_erase(dev, from, len);
-@@ -93,6 +101,10 @@ static int block2mtd_erase(struct mtd_in
-
- instr->state = MTD_ERASE_DONE;
- mtd_erase_callback(instr);
-+
-+done:
-+ read_unlock(&dev->bdev_mutex);
-+
- return err;
- }
-
-@@ -104,10 +116,14 @@ static int block2mtd_read(struct mtd_inf
- struct page *page;
- int index = from >> PAGE_SHIFT;
- int offset = from & (PAGE_SIZE-1);
-- int cpylen;
-+ int cpylen, err = 0;
-+
-+ read_lock(&dev->bdev_mutex);
-+ if (!dev->blkdev || (from > mtd->size)) {
-+ err = -EINVAL;
-+ goto done;
-+ }
-
-- if (from > mtd->size)
-- return -EINVAL;
- if (from + len > mtd->size)
- len = mtd->size - from;
-
-@@ -122,10 +138,14 @@ static int block2mtd_read(struct mtd_inf
- len = len - cpylen;
-
- page = page_read(dev->blkdev->bd_inode->i_mapping, index);
-- if (!page)
-- return -ENOMEM;
-- if (IS_ERR(page))
-- return PTR_ERR(page);
-+ if (!page) {
-+ err = -ENOMEM;
-+ goto done;
-+ }
-+ if (IS_ERR(page)) {
-+ err = PTR_ERR(page);
-+ goto done;
-+ }
-
- memcpy(buf, page_address(page) + offset, cpylen);
- page_cache_release(page);
-@@ -136,7 +156,10 @@ static int block2mtd_read(struct mtd_inf
- offset = 0;
- index++;
- }
-- return 0;
-+
-+done:
-+ read_unlock(&dev->bdev_mutex);
-+ return err;
- }
-
-
-@@ -188,12 +211,22 @@ static int block2mtd_write(struct mtd_in
- size_t *retlen, const u_char *buf)
- {
- struct block2mtd_dev *dev = mtd->priv;
-- int err;
-+ int err = 0;
-+
-+ read_lock(&dev->bdev_mutex);
-+ if (!dev->blkdev) {
-+ err = -EINVAL;
-+ goto done;
-+ }
-
- if (!len)
-- return 0;
-- if (to >= mtd->size)
-- return -ENOSPC;
-+ goto done;
-+
-+ if (to >= mtd->size) {
-+ err = -ENOSPC;
-+ goto done;
-+ }
-+
- if (to + len > mtd->size)
- len = mtd->size - to;
-
-@@ -202,6 +235,9 @@ static int block2mtd_write(struct mtd_in
- mutex_unlock(&dev->write_mutex);
- if (err > 0)
- err = 0;
-+
-+done:
-+ read_unlock(&dev->bdev_mutex);
- return err;
- }
-
-@@ -210,52 +246,29 @@ static int block2mtd_write(struct mtd_in
- static void block2mtd_sync(struct mtd_info *mtd)
- {
- struct block2mtd_dev *dev = mtd->priv;
-- sync_blockdev(dev->blkdev);
-- return;
--}
--
--
--static void block2mtd_free_device(struct block2mtd_dev *dev)
--{
-- if (!dev)
-- return;
--
-- kfree(dev->mtd.name);
-
-- if (dev->blkdev) {
-- invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
-- 0, -1);
-- close_bdev_exclusive(dev->blkdev, FMODE_READ|FMODE_WRITE);
-- }
-+ read_lock(&dev->bdev_mutex);
-+ if (dev->blkdev)
-+ sync_blockdev(dev->blkdev);
-+ read_unlock(&dev->bdev_mutex);
-
-- kfree(dev);
-+ return;
- }
-
-
--/* FIXME: ensure that mtd->size % erase_size == 0 */
--static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
-+static int _open_bdev(struct block2mtd_dev *dev)
- {
- struct block_device *bdev;
-- struct block2mtd_dev *dev;
-- struct mtd_partition *part;
-- char *name;
--
-- if (!devname)
-- return NULL;
--
-- dev = kzalloc(sizeof(struct block2mtd_dev), GFP_KERNEL);
-- if (!dev)
-- return NULL;
-
- /* Get a handle on the device */
-- bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, NULL);
-+ bdev = open_bdev_exclusive(dev->devname, FMODE_READ|FMODE_WRITE, NULL);
- #ifndef MODULE
- if (IS_ERR(bdev)) {
-
- /* We might not have rootfs mounted at this point. Try
- to resolve the device name by other means. */
-
-- dev_t devt = name_to_dev_t(devname);
-+ dev_t devt = name_to_dev_t(dev->devname);
- if (devt) {
- bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
- }
-@@ -263,17 +276,98 @@ static struct block2mtd_dev *add_device(
- #endif
-
- if (IS_ERR(bdev)) {
-- ERROR("error: cannot open device %s", devname);
-- goto devinit_err;
-+ ERROR("error: cannot open device %s", dev->devname);
-+ return 1;
- }
- dev->blkdev = bdev;
-
- if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) {
- ERROR("attempting to use an MTD device as a block device");
-- goto devinit_err;
-+ return 1;
- }
-
-+ return 0;
-+}
-+
-+static void _close_bdev(struct block2mtd_dev *dev)
-+{
-+ struct block_device *bdev;
-+
-+ if (!dev->blkdev)
-+ return;
-+
-+ bdev = dev->blkdev;
-+ invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, 0, -1);
-+ close_bdev_exclusive(dev->blkdev, FMODE_READ|FMODE_WRITE);
-+ dev->blkdev = NULL;
-+}
-+
-+static void block2mtd_free_device(struct block2mtd_dev *dev)
-+{
-+ if (!dev)
-+ return;
-+
-+ kfree(dev->mtd.name);
-+ _close_bdev(dev);
-+ kfree(dev);
-+}
-+
-+
-+static int block2mtd_refresh(struct mtd_info *mtd)
-+{
-+ struct block2mtd_dev *dev = mtd->priv;
-+ struct block_device *bdev;
-+ dev_t devt;
-+ int err = 0;
-+
-+ /* no other mtd function can run at this point */
-+ write_lock(&dev->bdev_mutex);
-+
-+ /* get the device number for the whole disk */
-+ devt = MKDEV(MAJOR(dev->blkdev->bd_dev), 0);
-+
-+ /* close the old block device */
-+ _close_bdev(dev);
-+
-+ /* open the whole disk, issue a partition rescan, then */
-+ bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
-+ if (!bdev || !bdev->bd_disk)
-+ err = -EINVAL;
-+#ifndef CONFIG_MTD_BLOCK2MTD_MODULE
-+ else
-+ err = rescan_partitions(bdev->bd_disk, bdev);
-+#endif
-+ if (bdev)
-+ close_bdev_exclusive(bdev, FMODE_READ|FMODE_WRITE);
-+
-+ /* try to open the partition block device again */
-+ _open_bdev(dev);
-+ write_unlock(&dev->bdev_mutex);
-+
-+ return err;
-+}
-+
-+/* FIXME: ensure that mtd->size % erase_size == 0 */
-+static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname)
-+{
-+ struct block2mtd_dev *dev;
-+ struct mtd_partition *part;
-+ char *name;
-+
-+ if (!devname)
-+ return NULL;
-+
-+ dev = kzalloc(sizeof(struct block2mtd_dev) + strlen(devname) + 1, GFP_KERNEL);
-+ if (!dev)
-+ return NULL;
-+
-+ strcpy(dev->devname, devname);
-+
-+ if (_open_bdev(dev))
-+ goto devinit_err;
-+
- mutex_init(&dev->write_mutex);
-+ rwlock_init(&dev->bdev_mutex);
-
- if (!mtdname)
- mtdname = devname;
-@@ -297,6 +391,7 @@ static struct block2mtd_dev *add_device(
- dev->mtd.read = block2mtd_read;
- dev->mtd.priv = dev;
- dev->mtd.owner = THIS_MODULE;
-+ dev->mtd.refresh_device = block2mtd_refresh;
-
- part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
- part->name = dev->mtd.name;
---- a/drivers/mtd/mtdchar.c
-+++ b/drivers/mtd/mtdchar.c
-@@ -18,6 +18,7 @@
-
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/compatmac.h>
-+#include <linux/mtd/partitions.h>
-
- #include <asm/uaccess.h>
-
-@@ -814,6 +815,13 @@ static int mtd_ioctl(struct inode *inode
- file->f_pos = 0;
- break;
- }
-+#ifdef CONFIG_MTD_PARTITIONS
-+ case MTDREFRESH:
-+ {
-+ ret = refresh_mtd_partitions(mtd);
-+ break;
-+ }
-+#endif
-
- default:
- ret = -ENOTTY;
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -101,6 +101,7 @@ struct mtd_oob_ops {
- uint8_t *oobbuf;
- };
-
-+struct mtd_info;
- struct mtd_info {
- u_char type;
- uint32_t flags;
-@@ -241,6 +242,9 @@ struct mtd_info {
- struct device dev;
- int usecount;
-
-+ int (*refresh_device)(struct mtd_info *mtd);
-+ struct mtd_info *split;
-+
- /* If the driver is something smart, like UBI, it may need to maintain
- * its own reference counting. The below functions are only for driver.
- * The driver may register its callbacks. These callbacks are not
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -34,12 +34,14 @@
- * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK).
- */
-
-+struct mtd_partition;
- struct mtd_partition {
- char *name; /* identifier string */
- uint64_t size; /* partition size */
- uint64_t offset; /* offset within the master MTD space */
- uint32_t mask_flags; /* master MTD flags to mask out for this partition */
- struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/
-+ int (*refresh_partition)(struct mtd_info *);
- };
-
- #define MTDPART_OFS_NXTBLK (-2)
-@@ -51,6 +53,7 @@ struct mtd_info;
-
- int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
- int del_mtd_partitions(struct mtd_info *);
-+int refresh_mtd_partitions(struct mtd_info *);
-
- /*
- * Functions dealing with the various ways of partitioning the space
---- a/include/mtd/mtd-abi.h
-+++ b/include/mtd/mtd-abi.h
-@@ -110,6 +110,7 @@ struct otp_info {
- #define MEMERASE64 _IOW('M', 20, struct erase_info_user64)
- #define MEMWRITEOOB64 _IOWR('M', 21, struct mtd_oob_buf64)
- #define MEMREADOOB64 _IOWR('M', 22, struct mtd_oob_buf64)
-+#define MTDREFRESH _IO('M', 23)
-
- /*
- * Obsolete legacy interface. Keep it in order not to break userspace
+++ /dev/null
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -268,6 +268,7 @@ static int _open_bdev(struct block2mtd_d
- /* We might not have rootfs mounted at this point. Try
- to resolve the device name by other means. */
-
-+ wait_for_device_probe();
- dev_t devt = name_to_dev_t(dev->devname);
- if (devt) {
- bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
+++ /dev/null
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -249,14 +249,21 @@ static int parse_redboot_partitions(stru
- #endif
- names += strlen(names)+1;
-
--#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
- if(fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_base) {
-- i++;
-- parts[i].offset = parts[i-1].size + parts[i-1].offset;
-- parts[i].size = fl->next->img->flash_base - parts[i].offset;
-- parts[i].name = nullname;
-- }
-+ if (!strcmp(parts[i].name, "rootfs")) {
-+ parts[i].size = fl->next->img->flash_base;
-+ parts[i].size &= ~(master->erasesize - 1);
-+ parts[i].size -= parts[i].offset;
-+#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
-+ nrparts--;
-+ } else {
-+ i++;
-+ parts[i].offset = parts[i-1].size + parts[i-1].offset;
-+ parts[i].size = fl->next->img->flash_base - parts[i].offset;
-+ parts[i].name = nullname;
- #endif
-+ }
-+ }
- tmp_fl = fl;
- fl = fl->next;
- kfree(tmp_fl);
+++ /dev/null
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -11,6 +11,8 @@
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/partitions.h>
-
-+#define BOARD_CONFIG_PART "boardconfig"
-+
- struct fis_image_desc {
- unsigned char name[16]; // Null terminated name
- uint32_t flash_base; // Address within FLASH of image
-@@ -41,6 +43,7 @@ static int parse_redboot_partitions(stru
- struct mtd_partition **pparts,
- unsigned long fis_origin)
- {
-+ unsigned long max_offset = 0;
- int nrparts = 0;
- struct fis_image_desc *buf;
- struct mtd_partition *parts;
-@@ -209,14 +212,14 @@ static int parse_redboot_partitions(stru
- }
- }
- #endif
-- parts = kzalloc(sizeof(*parts)*nrparts + nulllen + namelen, GFP_KERNEL);
-+ parts = kzalloc(sizeof(*parts) * (nrparts + 1) + nulllen + namelen + sizeof(BOARD_CONFIG_PART), GFP_KERNEL);
-
- if (!parts) {
- ret = -ENOMEM;
- goto out;
- }
-
-- nullname = (char *)&parts[nrparts];
-+ nullname = (char *)&parts[nrparts + 1];
- #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
- if (nulllen > 0) {
- strcpy(nullname, nullstring);
-@@ -235,6 +238,8 @@ static int parse_redboot_partitions(stru
- }
- #endif
- for ( ; i<nrparts; i++) {
-+ if(max_offset < buf[i].flash_base + buf[i].size)
-+ max_offset = buf[i].flash_base + buf[i].size;
- parts[i].size = fl->img->size;
- parts[i].offset = fl->img->flash_base;
- parts[i].name = names;
-@@ -268,6 +273,14 @@ static int parse_redboot_partitions(stru
- fl = fl->next;
- kfree(tmp_fl);
- }
-+ if(master->size - max_offset >= master->erasesize)
-+ {
-+ parts[nrparts].size = master->size - max_offset;
-+ parts[nrparts].offset = max_offset;
-+ parts[nrparts].name = names;
-+ strcpy(names, BOARD_CONFIG_PART);
-+ nrparts++;
-+ }
- ret = nrparts;
- *pparts = parts;
- out:
+++ /dev/null
---- a/include/linux/mtd/nand.h
-+++ b/include/linux/mtd/nand.h
-@@ -491,6 +491,7 @@ struct platform_nand_chip {
- int chip_delay;
- unsigned int options;
- const char **part_probe_types;
-+ int (*chip_fixup)(struct mtd_info *mtd);
- void (*set_parts)(uint64_t size,
- struct platform_nand_chip *chip);
- void *priv;
---- a/drivers/mtd/nand/plat_nand.c
-+++ b/drivers/mtd/nand/plat_nand.c
-@@ -91,7 +91,18 @@ static int __devinit plat_nand_probe(str
- }
-
- /* Scan to find existance of the device */
-- if (nand_scan(&data->mtd, 1)) {
-+ if (nand_scan_ident(&data->mtd, 1)) {
-+ res = -ENXIO;
-+ goto out;
-+ }
-+
-+ if (pdata->chip.chip_fixup) {
-+ res = pdata->chip.chip_fixup(&data->mtd);
-+ if (res)
-+ goto out;
-+ }
-+
-+ if (nand_scan_tail(&data->mtd)) {
- err = -ENXIO;
- goto out;
- }
+++ /dev/null
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -181,6 +181,22 @@ config MTD_AR7_PARTS
- ---help---
- TI AR7 partitioning support
-
-+config MTD_MYLOADER_PARTS
-+ tristate "MyLoader partition parsing"
-+ depends on MTD_PARTITIONS && (ADM5120 || ATHEROS_AR231X || ATHEROS_AR71XX)
-+ ---help---
-+ MyLoader is a bootloader which allows the user to define partitions
-+ in flash devices, by putting a table in the second erase block
-+ on the device, similar to a partition table. This table gives the
-+ offsets and lengths of the user defined partitions.
-+
-+ If you need code which can detect and parse these tables, and
-+ register MTD 'partitions' corresponding to each image detected,
-+ enable this option.
-+
-+ You will still need the parsing functions to be called by the driver
-+ for your particular device. It won't happen automatically.
-+
- comment "User Modules And Translation Layers"
-
- config MTD_CHAR
---- a/drivers/mtd/Makefile
-+++ b/drivers/mtd/Makefile
-@@ -13,6 +13,7 @@ obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdli
- obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
- obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o
- obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
-+obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
-
- # 'Users' - code which presents functionality to userspace.
- obj-$(CONFIG_MTD_CHAR) += mtdchar.o
+++ /dev/null
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -33,6 +33,7 @@
- * Note: writeable partitions require their size and offset be
- * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK).
- */
-+struct mtd_info;
-
- struct mtd_partition;
- struct mtd_partition {
-@@ -49,7 +50,6 @@ struct mtd_partition {
- #define MTDPART_SIZ_FULL (0)
-
-
--struct mtd_info;
-
- int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
- int del_mtd_partitions(struct mtd_info *);
+++ /dev/null
---- a/drivers/mtd/nand/nand_ecc.c
-+++ b/drivers/mtd/nand/nand_ecc.c
-@@ -507,8 +507,7 @@ int __nand_correct_data(unsigned char *b
- if ((bitsperbyte[b0] + bitsperbyte[b1] + bitsperbyte[b2]) == 1)
- return 1; /* error in ecc data; no action needed */
-
-- printk(KERN_ERR "uncorrectable error : ");
-- return -1;
-+ return -EBADMSG;
- }
- EXPORT_SYMBOL(__nand_correct_data);
-
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -645,6 +645,10 @@ static const struct spi_device_id m25p_i
- { "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
- { "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
-
-+ /* PMC -- pm25x "blocks" are 32K, sectors are 4K */
-+ { "pm25lv512", INFO(0, 0, 32 * 1024, 2, SECT_4K) },
-+ { "pm25lv010", INFO(0, 0, 32 * 1024, 4, SECT_4K) },
-+
- /* Spansion -- single (large) sector size only, at least
- * for the chips listed here (without boot sectors).
- */
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -645,6 +645,10 @@ static const struct spi_device_id m25p_i
- { "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
- { "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
-
-+ /* EON -- en25pxx */
-+ { "en25p32", INFO(0x1c2016, 0, 64 * 1024, 64, 0) },
-+ { "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) },
-+
- /* PMC -- pm25x "blocks" are 32K, sectors are 4K */
- { "pm25lv512", INFO(0, 0, 32 * 1024, 2, SECT_4K) },
- { "pm25lv010", INFO(0, 0, 32 * 1024, 4, SECT_4K) },
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -649,6 +649,11 @@ static const struct spi_device_id m25p_i
- { "en25p32", INFO(0x1c2016, 0, 64 * 1024, 64, 0) },
- { "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) },
-
-+ /* Numonyx -- xxxs33b */
-+ { "160s33b", INFO(0x898911, 0, 64 * 1024, 64, 0) },
-+ { "320s33b", INFO(0x898912, 0, 64 * 1024, 128, 0) },
-+ { "640s33b", INFO(0x898913, 0, 64 * 1024, 256, 0) },
-+
- /* PMC -- pm25x "blocks" are 32K, sectors are 4K */
- { "pm25lv512", INFO(0, 0, 32 * 1024, 2, SECT_4K) },
- { "pm25lv010", INFO(0, 0, 32 * 1024, 4, SECT_4K) },
-@@ -833,11 +838,12 @@ static int __devinit m25p_probe(struct s
- dev_set_drvdata(&spi->dev, flash);
-
- /*
-- * Atmel and SST serial flash tend to power
-+ * Atmel, SST and Intel/Numonyx serial flash tend to power
- * up with the software protection bits set
- */
-
- if (info->jedec_id >> 16 == 0x1f ||
-+ info->jedec_id >> 16 == 0x89 ||
- info->jedec_id >> 16 == 0xbf) {
- write_enable(flash);
- write_sr(flash, 0);
+++ /dev/null
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -706,6 +706,7 @@ static const struct spi_device_id m25p_i
- { "w25x80", INFO(0xef3014, 0, 64 * 1024, 16, SECT_4K) },
- { "w25x16", INFO(0xef3015, 0, 64 * 1024, 32, SECT_4K) },
- { "w25x32", INFO(0xef3016, 0, 64 * 1024, 64, SECT_4K) },
-+ { "w25q32", INFO(0xef4016, 0, 64 * 1024, 64, SECT_4K) },
- { "w25x64", INFO(0xef3017, 0, 64 * 1024, 128, SECT_4K) },
-
- /* Catalyst / On Semiconductor -- non-JEDEC */
+++ /dev/null
---- /dev/null
-+++ b/include/linux/netfilter/xt_layer7.h
-@@ -0,0 +1,13 @@
-+#ifndef _XT_LAYER7_H
-+#define _XT_LAYER7_H
-+
-+#define MAX_PATTERN_LEN 8192
-+#define MAX_PROTOCOL_LEN 256
-+
-+struct xt_layer7_info {
-+ char protocol[MAX_PROTOCOL_LEN];
-+ char pattern[MAX_PATTERN_LEN];
-+ u_int8_t invert;
-+};
-+
-+#endif /* _XT_LAYER7_H */
---- a/include/net/netfilter/nf_conntrack.h
-+++ b/include/net/netfilter/nf_conntrack.h
-@@ -116,6 +116,22 @@ struct nf_conn {
- u_int32_t secmark;
- #endif
-
-+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || \
-+ defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+ struct {
-+ /*
-+ * e.g. "http". NULL before decision. "unknown" after decision
-+ * if no match.
-+ */
-+ char *app_proto;
-+ /*
-+ * application layer data so far. NULL after match decision.
-+ */
-+ char *app_data;
-+ unsigned int app_data_len;
-+ } layer7;
-+#endif
-+
- /* Storage reserved for other modules: */
- union nf_conntrack_proto proto;
-
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -858,6 +858,27 @@ config NETFILTER_XT_MATCH_STATE
-
- To compile it as a module, choose M here. If unsure, say N.
-
-+config NETFILTER_XT_MATCH_LAYER7
-+ tristate '"layer7" match support'
-+ depends on NETFILTER_XTABLES
-+ depends on EXPERIMENTAL && (IP_NF_CONNTRACK || NF_CONNTRACK)
-+ depends on NF_CT_ACCT
-+ help
-+ Say Y if you want to be able to classify connections (and their
-+ packets) based on regular expression matching of their application
-+ layer data. This is one way to classify applications such as
-+ peer-to-peer filesharing systems that do not always use the same
-+ port.
-+
-+ To compile it as a module, choose M here. If unsure, say N.
-+
-+config NETFILTER_XT_MATCH_LAYER7_DEBUG
-+ bool 'Layer 7 debugging output'
-+ depends on NETFILTER_XT_MATCH_LAYER7
-+ help
-+ Say Y to get lots of debugging output.
-+
-+
- config NETFILTER_XT_MATCH_STATISTIC
- tristate '"statistic" match support'
- depends on NETFILTER_ADVANCED
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -89,6 +89,7 @@ obj-$(CONFIG_NETFILTER_XT_MATCH_RECENT)
- obj-$(CONFIG_NETFILTER_XT_MATCH_SCTP) += xt_sctp.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_SOCKET) += xt_socket.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STATE) += xt_state.o
-+obj-$(CONFIG_NETFILTER_XT_MATCH_LAYER7) += xt_layer7.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STATISTIC) += xt_statistic.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_STRING) += xt_string.o
- obj-$(CONFIG_NETFILTER_XT_MATCH_TCPMSS) += xt_tcpmss.o
---- a/net/netfilter/nf_conntrack_core.c
-+++ b/net/netfilter/nf_conntrack_core.c
-@@ -201,6 +201,14 @@ destroy_conntrack(struct nf_conntrack *n
- * too. */
- nf_ct_remove_expectations(ct);
-
-+ #if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+ if(ct->layer7.app_proto)
-+ kfree(ct->layer7.app_proto);
-+ if(ct->layer7.app_data)
-+ kfree(ct->layer7.app_data);
-+ #endif
-+
-+
- /* We overload first tuple to link into unconfirmed list. */
- if (!nf_ct_is_confirmed(ct)) {
- BUG_ON(hlist_nulls_unhashed(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode));
---- a/net/netfilter/nf_conntrack_standalone.c
-+++ b/net/netfilter/nf_conntrack_standalone.c
-@@ -171,6 +171,12 @@ static int ct_seq_show(struct seq_file *
- goto release;
- #endif
-
-+#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
-+ if(ct->layer7.app_proto &&
-+ seq_printf(s, "l7proto=%s ", ct->layer7.app_proto))
-+ return -ENOSPC;
-+#endif
-+
- if (seq_printf(s, "use=%u\n", atomic_read(&ct->ct_general.use)))
- goto release;
-
---- /dev/null
-+++ b/net/netfilter/regexp/regexp.c
-@@ -0,0 +1,1197 @@
-+/*
-+ * regcomp and regexec -- regsub and regerror are elsewhere
-+ * @(#)regexp.c 1.3 of 18 April 87
-+ *
-+ * Copyright (c) 1986 by University of Toronto.
-+ * Written by Henry Spencer. Not derived from licensed software.
-+ *
-+ * Permission is granted to anyone to use this software for any
-+ * purpose on any computer system, and to redistribute it freely,
-+ * subject to the following restrictions:
-+ *
-+ * 1. The author is not responsible for the consequences of use of
-+ * this software, no matter how awful, even if they arise
-+ * from defects in it.
-+ *
-+ * 2. The origin of this software must not be misrepresented, either
-+ * by explicit claim or by omission.
-+ *
-+ * 3. Altered versions must be plainly marked as such, and must not
-+ * be misrepresented as being the original software.
-+ *
-+ * Beware that some of this code is subtly aware of the way operator
-+ * precedence is structured in regular expressions. Serious changes in
-+ * regular-expression syntax might require a total rethink.
-+ *
-+ * This code was modified by Ethan Sommer to work within the kernel
-+ * (it now uses kmalloc etc..)
-+ *
-+ * Modified slightly by Matthew Strait to use more modern C.
-+ */
-+
-+#include "regexp.h"
-+#include "regmagic.h"
-+
-+/* added by ethan and matt. Lets it work in both kernel and user space.
-+(So iptables can use it, for instance.) Yea, it goes both ways... */
-+#if __KERNEL__
-+ #define malloc(foo) kmalloc(foo,GFP_ATOMIC)
-+#else
-+ #define printk(format,args...) printf(format,##args)
-+#endif
-+
-+void regerror(char * s)
-+{
-+ printk("<3>Regexp: %s\n", s);
-+ /* NOTREACHED */
-+}
-+
-+/*
-+ * The "internal use only" fields in regexp.h are present to pass info from
-+ * compile to execute that permits the execute phase to run lots faster on
-+ * simple cases. They are:
-+ *
-+ * regstart char that must begin a match; '\0' if none obvious
-+ * reganch is the match anchored (at beginning-of-line only)?
-+ * regmust string (pointer into program) that match must include, or NULL
-+ * regmlen length of regmust string
-+ *
-+ * Regstart and reganch permit very fast decisions on suitable starting points
-+ * for a match, cutting down the work a lot. Regmust permits fast rejection
-+ * of lines that cannot possibly match. The regmust tests are costly enough
-+ * that regcomp() supplies a regmust only if the r.e. contains something
-+ * potentially expensive (at present, the only such thing detected is * or +
-+ * at the start of the r.e., which can involve a lot of backup). Regmlen is
-+ * supplied because the test in regexec() needs it and regcomp() is computing
-+ * it anyway.
-+ */
-+
-+/*
-+ * Structure for regexp "program". This is essentially a linear encoding
-+ * of a nondeterministic finite-state machine (aka syntax charts or
-+ * "railroad normal form" in parsing technology). Each node is an opcode
-+ * plus a "next" pointer, possibly plus an operand. "Next" pointers of
-+ * all nodes except BRANCH implement concatenation; a "next" pointer with
-+ * a BRANCH on both ends of it is connecting two alternatives. (Here we
-+ * have one of the subtle syntax dependencies: an individual BRANCH (as
-+ * opposed to a collection of them) is never concatenated with anything
-+ * because of operator precedence.) The operand of some types of node is
-+ * a literal string; for others, it is a node leading into a sub-FSM. In
-+ * particular, the operand of a BRANCH node is the first node of the branch.
-+ * (NB this is *not* a tree structure: the tail of the branch connects
-+ * to the thing following the set of BRANCHes.) The opcodes are:
-+ */
-+
-+/* definition number opnd? meaning */
-+#define END 0 /* no End of program. */
-+#define BOL 1 /* no Match "" at beginning of line. */
-+#define EOL 2 /* no Match "" at end of line. */
-+#define ANY 3 /* no Match any one character. */
-+#define ANYOF 4 /* str Match any character in this string. */
-+#define ANYBUT 5 /* str Match any character not in this string. */
-+#define BRANCH 6 /* node Match this alternative, or the next... */
-+#define BACK 7 /* no Match "", "next" ptr points backward. */
-+#define EXACTLY 8 /* str Match this string. */
-+#define NOTHING 9 /* no Match empty string. */
-+#define STAR 10 /* node Match this (simple) thing 0 or more times. */
-+#define PLUS 11 /* node Match this (simple) thing 1 or more times. */
-+#define OPEN 20 /* no Mark this point in input as start of #n. */
-+ /* OPEN+1 is number 1, etc. */
-+#define CLOSE 30 /* no Analogous to OPEN. */
-+
-+/*
-+ * Opcode notes:
-+ *
-+ * BRANCH The set of branches constituting a single choice are hooked
-+ * together with their "next" pointers, since precedence prevents
-+ * anything being concatenated to any individual branch. The
-+ * "next" pointer of the last BRANCH in a choice points to the
-+ * thing following the whole choice. This is also where the
-+ * final "next" pointer of each individual branch points; each
-+ * branch starts with the operand node of a BRANCH node.
-+ *
-+ * BACK Normal "next" pointers all implicitly point forward; BACK
-+ * exists to make loop structures possible.
-+ *
-+ * STAR,PLUS '?', and complex '*' and '+', are implemented as circular
-+ * BRANCH structures using BACK. Simple cases (one character
-+ * per match) are implemented with STAR and PLUS for speed
-+ * and to minimize recursive plunges.
-+ *
-+ * OPEN,CLOSE ...are numbered at compile time.
-+ */
-+
-+/*
-+ * A node is one char of opcode followed by two chars of "next" pointer.
-+ * "Next" pointers are stored as two 8-bit pieces, high order first. The
-+ * value is a positive offset from the opcode of the node containing it.
-+ * An operand, if any, simply follows the node. (Note that much of the
-+ * code generation knows about this implicit relationship.)
-+ *
-+ * Using two bytes for the "next" pointer is vast overkill for most things,
-+ * but allows patterns to get big without disasters.
-+ */
-+#define OP(p) (*(p))
-+#define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377))
-+#define OPERAND(p) ((p) + 3)
-+
-+/*
-+ * See regmagic.h for one further detail of program structure.
-+ */
-+
-+
-+/*
-+ * Utility definitions.
-+ */
-+#ifndef CHARBITS
-+#define UCHARAT(p) ((int)*(unsigned char *)(p))
-+#else
-+#define UCHARAT(p) ((int)*(p)&CHARBITS)
-+#endif
-+
-+#define FAIL(m) { regerror(m); return(NULL); }
-+#define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?')
-+#define META "^$.[()|?+*\\"
-+
-+/*
-+ * Flags to be passed up and down.
-+ */
-+#define HASWIDTH 01 /* Known never to match null string. */
-+#define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */
-+#define SPSTART 04 /* Starts with * or +. */
-+#define WORST 0 /* Worst case. */
-+
-+/*
-+ * Global work variables for regcomp().
-+ */
-+struct match_globals {
-+char *reginput; /* String-input pointer. */
-+char *regbol; /* Beginning of input, for ^ check. */
-+char **regstartp; /* Pointer to startp array. */
-+char **regendp; /* Ditto for endp. */
-+char *regparse; /* Input-scan pointer. */
-+int regnpar; /* () count. */
-+char regdummy;
-+char *regcode; /* Code-emit pointer; ®dummy = don't. */
-+long regsize; /* Code size. */
-+};
-+
-+/*
-+ * Forward declarations for regcomp()'s friends.
-+ */
-+#ifndef STATIC
-+#define STATIC static
-+#endif
-+STATIC char *reg(struct match_globals *g, int paren,int *flagp);
-+STATIC char *regbranch(struct match_globals *g, int *flagp);
-+STATIC char *regpiece(struct match_globals *g, int *flagp);
-+STATIC char *regatom(struct match_globals *g, int *flagp);
-+STATIC char *regnode(struct match_globals *g, char op);
-+STATIC char *regnext(struct match_globals *g, char *p);
-+STATIC void regc(struct match_globals *g, char b);
-+STATIC void reginsert(struct match_globals *g, char op, char *opnd);
-+STATIC void regtail(struct match_globals *g, char *p, char *val);
-+STATIC void regoptail(struct match_globals *g, char *p, char *val);
-+
-+
-+__kernel_size_t my_strcspn(const char *s1,const char *s2)
-+{
-+ char *scan1;
-+ char *scan2;
-+ int count;
-+
-+ count = 0;
-+ for (scan1 = (char *)s1; *scan1 != '\0'; scan1++) {
-+ for (scan2 = (char *)s2; *scan2 != '\0';) /* ++ moved down. */
-+ if (*scan1 == *scan2++)
-+ return(count);
-+ count++;
-+ }
-+ return(count);
-+}
-+
-+/*
-+ - regcomp - compile a regular expression into internal code
-+ *
-+ * We can't allocate space until we know how big the compiled form will be,
-+ * but we can't compile it (and thus know how big it is) until we've got a
-+ * place to put the code. So we cheat: we compile it twice, once with code
-+ * generation turned off and size counting turned on, and once "for real".
-+ * This also means that we don't allocate space until we are sure that the
-+ * thing really will compile successfully, and we never have to move the
-+ * code and thus invalidate pointers into it. (Note that it has to be in
-+ * one piece because free() must be able to free it all.)
-+ *
-+ * Beware that the optimization-preparation code in here knows about some
-+ * of the structure of the compiled regexp.
-+ */
-+regexp *
-+regcomp(char *exp,int *patternsize)
-+{
-+ register regexp *r;
-+ register char *scan;
-+ register char *longest;
-+ register int len;
-+ int flags;
-+ struct match_globals g;
-+
-+ /* commented out by ethan
-+ extern char *malloc();
-+ */
-+
-+ if (exp == NULL)
-+ FAIL("NULL argument");
-+
-+ /* First pass: determine size, legality. */
-+ g.regparse = exp;
-+ g.regnpar = 1;
-+ g.regsize = 0L;
-+ g.regcode = &g.regdummy;
-+ regc(&g, MAGIC);
-+ if (reg(&g, 0, &flags) == NULL)
-+ return(NULL);
-+
-+ /* Small enough for pointer-storage convention? */
-+ if (g.regsize >= 32767L) /* Probably could be 65535L. */
-+ FAIL("regexp too big");
-+
-+ /* Allocate space. */
-+ *patternsize=sizeof(regexp) + (unsigned)g.regsize;
-+ r = (regexp *)malloc(sizeof(regexp) + (unsigned)g.regsize);
-+ if (r == NULL)
-+ FAIL("out of space");
-+
-+ /* Second pass: emit code. */
-+ g.regparse = exp;
-+ g.regnpar = 1;
-+ g.regcode = r->program;
-+ regc(&g, MAGIC);
-+ if (reg(&g, 0, &flags) == NULL)
-+ return(NULL);
-+
-+ /* Dig out information for optimizations. */
-+ r->regstart = '\0'; /* Worst-case defaults. */
-+ r->reganch = 0;
-+ r->regmust = NULL;
-+ r->regmlen = 0;
-+ scan = r->program+1; /* First BRANCH. */
-+ if (OP(regnext(&g, scan)) == END) { /* Only one top-level choice. */
-+ scan = OPERAND(scan);
-+
-+ /* Starting-point info. */
-+ if (OP(scan) == EXACTLY)
-+ r->regstart = *OPERAND(scan);
-+ else if (OP(scan) == BOL)
-+ r->reganch++;
-+
-+ /*
-+ * If there's something expensive in the r.e., find the
-+ * longest literal string that must appear and make it the
-+ * regmust. Resolve ties in favor of later strings, since
-+ * the regstart check works with the beginning of the r.e.
-+ * and avoiding duplication strengthens checking. Not a
-+ * strong reason, but sufficient in the absence of others.
-+ */
-+ if (flags&SPSTART) {
-+ longest = NULL;
-+ len = 0;
-+ for (; scan != NULL; scan = regnext(&g, scan))
-+ if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) {
-+ longest = OPERAND(scan);
-+ len = strlen(OPERAND(scan));
-+ }
-+ r->regmust = longest;
-+ r->regmlen = len;
-+ }
-+ }
-+
-+ return(r);
-+}
-+
-+/*
-+ - reg - regular expression, i.e. main body or parenthesized thing
-+ *
-+ * Caller must absorb opening parenthesis.
-+ *
-+ * Combining parenthesis handling with the base level of regular expression
-+ * is a trifle forced, but the need to tie the tails of the branches to what
-+ * follows makes it hard to avoid.
-+ */
-+static char *
-+reg(struct match_globals *g, int paren, int *flagp /* Parenthesized? */ )
-+{
-+ register char *ret;
-+ register char *br;
-+ register char *ender;
-+ register int parno = 0; /* 0 makes gcc happy */
-+ int flags;
-+
-+ *flagp = HASWIDTH; /* Tentatively. */
-+
-+ /* Make an OPEN node, if parenthesized. */
-+ if (paren) {
-+ if (g->regnpar >= NSUBEXP)
-+ FAIL("too many ()");
-+ parno = g->regnpar;
-+ g->regnpar++;
-+ ret = regnode(g, OPEN+parno);
-+ } else
-+ ret = NULL;
-+
-+ /* Pick up the branches, linking them together. */
-+ br = regbranch(g, &flags);
-+ if (br == NULL)
-+ return(NULL);
-+ if (ret != NULL)
-+ regtail(g, ret, br); /* OPEN -> first. */
-+ else
-+ ret = br;
-+ if (!(flags&HASWIDTH))
-+ *flagp &= ~HASWIDTH;
-+ *flagp |= flags&SPSTART;
-+ while (*g->regparse == '|') {
-+ g->regparse++;
-+ br = regbranch(g, &flags);
-+ if (br == NULL)
-+ return(NULL);
-+ regtail(g, ret, br); /* BRANCH -> BRANCH. */
-+ if (!(flags&HASWIDTH))
-+ *flagp &= ~HASWIDTH;
-+ *flagp |= flags&SPSTART;
-+ }
-+
-+ /* Make a closing node, and hook it on the end. */
-+ ender = regnode(g, (paren) ? CLOSE+parno : END);
-+ regtail(g, ret, ender);
-+
-+ /* Hook the tails of the branches to the closing node. */
-+ for (br = ret; br != NULL; br = regnext(g, br))
-+ regoptail(g, br, ender);
-+
-+ /* Check for proper termination. */
-+ if (paren && *g->regparse++ != ')') {
-+ FAIL("unmatched ()");
-+ } else if (!paren && *g->regparse != '\0') {
-+ if (*g->regparse == ')') {
-+ FAIL("unmatched ()");
-+ } else
-+ FAIL("junk on end"); /* "Can't happen". */
-+ /* NOTREACHED */
-+ }
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regbranch - one alternative of an | operator
-+ *
-+ * Implements the concatenation operator.
-+ */
-+static char *
-+regbranch(struct match_globals *g, int *flagp)
-+{
-+ register char *ret;
-+ register char *chain;
-+ register char *latest;
-+ int flags;
-+
-+ *flagp = WORST; /* Tentatively. */
-+
-+ ret = regnode(g, BRANCH);
-+ chain = NULL;
-+ while (*g->regparse != '\0' && *g->regparse != '|' && *g->regparse != ')') {
-+ latest = regpiece(g, &flags);
-+ if (latest == NULL)
-+ return(NULL);
-+ *flagp |= flags&HASWIDTH;
-+ if (chain == NULL) /* First piece. */
-+ *flagp |= flags&SPSTART;
-+ else
-+ regtail(g, chain, latest);
-+ chain = latest;
-+ }
-+ if (chain == NULL) /* Loop ran zero times. */
-+ (void) regnode(g, NOTHING);
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regpiece - something followed by possible [*+?]
-+ *
-+ * Note that the branching code sequences used for ? and the general cases
-+ * of * and + are somewhat optimized: they use the same NOTHING node as
-+ * both the endmarker for their branch list and the body of the last branch.
-+ * It might seem that this node could be dispensed with entirely, but the
-+ * endmarker role is not redundant.
-+ */
-+static char *
-+regpiece(struct match_globals *g, int *flagp)
-+{
-+ register char *ret;
-+ register char op;
-+ register char *next;
-+ int flags;
-+
-+ ret = regatom(g, &flags);
-+ if (ret == NULL)
-+ return(NULL);
-+
-+ op = *g->regparse;
-+ if (!ISMULT(op)) {
-+ *flagp = flags;
-+ return(ret);
-+ }
-+
-+ if (!(flags&HASWIDTH) && op != '?')
-+ FAIL("*+ operand could be empty");
-+ *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH);
-+
-+ if (op == '*' && (flags&SIMPLE))
-+ reginsert(g, STAR, ret);
-+ else if (op == '*') {
-+ /* Emit x* as (x&|), where & means "self". */
-+ reginsert(g, BRANCH, ret); /* Either x */
-+ regoptail(g, ret, regnode(g, BACK)); /* and loop */
-+ regoptail(g, ret, ret); /* back */
-+ regtail(g, ret, regnode(g, BRANCH)); /* or */
-+ regtail(g, ret, regnode(g, NOTHING)); /* null. */
-+ } else if (op == '+' && (flags&SIMPLE))
-+ reginsert(g, PLUS, ret);
-+ else if (op == '+') {
-+ /* Emit x+ as x(&|), where & means "self". */
-+ next = regnode(g, BRANCH); /* Either */
-+ regtail(g, ret, next);
-+ regtail(g, regnode(g, BACK), ret); /* loop back */
-+ regtail(g, next, regnode(g, BRANCH)); /* or */
-+ regtail(g, ret, regnode(g, NOTHING)); /* null. */
-+ } else if (op == '?') {
-+ /* Emit x? as (x|) */
-+ reginsert(g, BRANCH, ret); /* Either x */
-+ regtail(g, ret, regnode(g, BRANCH)); /* or */
-+ next = regnode(g, NOTHING); /* null. */
-+ regtail(g, ret, next);
-+ regoptail(g, ret, next);
-+ }
-+ g->regparse++;
-+ if (ISMULT(*g->regparse))
-+ FAIL("nested *?+");
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regatom - the lowest level
-+ *
-+ * Optimization: gobbles an entire sequence of ordinary characters so that
-+ * it can turn them into a single node, which is smaller to store and
-+ * faster to run. Backslashed characters are exceptions, each becoming a
-+ * separate node; the code is simpler that way and it's not worth fixing.
-+ */
-+static char *
-+regatom(struct match_globals *g, int *flagp)
-+{
-+ register char *ret;
-+ int flags;
-+
-+ *flagp = WORST; /* Tentatively. */
-+
-+ switch (*g->regparse++) {
-+ case '^':
-+ ret = regnode(g, BOL);
-+ break;
-+ case '$':
-+ ret = regnode(g, EOL);
-+ break;
-+ case '.':
-+ ret = regnode(g, ANY);
-+ *flagp |= HASWIDTH|SIMPLE;
-+ break;
-+ case '[': {
-+ register int class;
-+ register int classend;
-+
-+ if (*g->regparse == '^') { /* Complement of range. */
-+ ret = regnode(g, ANYBUT);
-+ g->regparse++;
-+ } else
-+ ret = regnode(g, ANYOF);
-+ if (*g->regparse == ']' || *g->regparse == '-')
-+ regc(g, *g->regparse++);
-+ while (*g->regparse != '\0' && *g->regparse != ']') {
-+ if (*g->regparse == '-') {
-+ g->regparse++;
-+ if (*g->regparse == ']' || *g->regparse == '\0')
-+ regc(g, '-');
-+ else {
-+ class = UCHARAT(g->regparse-2)+1;
-+ classend = UCHARAT(g->regparse);
-+ if (class > classend+1)
-+ FAIL("invalid [] range");
-+ for (; class <= classend; class++)
-+ regc(g, class);
-+ g->regparse++;
-+ }
-+ } else
-+ regc(g, *g->regparse++);
-+ }
-+ regc(g, '\0');
-+ if (*g->regparse != ']')
-+ FAIL("unmatched []");
-+ g->regparse++;
-+ *flagp |= HASWIDTH|SIMPLE;
-+ }
-+ break;
-+ case '(':
-+ ret = reg(g, 1, &flags);
-+ if (ret == NULL)
-+ return(NULL);
-+ *flagp |= flags&(HASWIDTH|SPSTART);
-+ break;
-+ case '\0':
-+ case '|':
-+ case ')':
-+ FAIL("internal urp"); /* Supposed to be caught earlier. */
-+ break;
-+ case '?':
-+ case '+':
-+ case '*':
-+ FAIL("?+* follows nothing");
-+ break;
-+ case '\\':
-+ if (*g->regparse == '\0')
-+ FAIL("trailing \\");
-+ ret = regnode(g, EXACTLY);
-+ regc(g, *g->regparse++);
-+ regc(g, '\0');
-+ *flagp |= HASWIDTH|SIMPLE;
-+ break;
-+ default: {
-+ register int len;
-+ register char ender;
-+
-+ g->regparse--;
-+ len = my_strcspn((const char *)g->regparse, (const char *)META);
-+ if (len <= 0)
-+ FAIL("internal disaster");
-+ ender = *(g->regparse+len);
-+ if (len > 1 && ISMULT(ender))
-+ len--; /* Back off clear of ?+* operand. */
-+ *flagp |= HASWIDTH;
-+ if (len == 1)
-+ *flagp |= SIMPLE;
-+ ret = regnode(g, EXACTLY);
-+ while (len > 0) {
-+ regc(g, *g->regparse++);
-+ len--;
-+ }
-+ regc(g, '\0');
-+ }
-+ break;
-+ }
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regnode - emit a node
-+ */
-+static char * /* Location. */
-+regnode(struct match_globals *g, char op)
-+{
-+ register char *ret;
-+ register char *ptr;
-+
-+ ret = g->regcode;
-+ if (ret == &g->regdummy) {
-+ g->regsize += 3;
-+ return(ret);
-+ }
-+
-+ ptr = ret;
-+ *ptr++ = op;
-+ *ptr++ = '\0'; /* Null "next" pointer. */
-+ *ptr++ = '\0';
-+ g->regcode = ptr;
-+
-+ return(ret);
-+}
-+
-+/*
-+ - regc - emit (if appropriate) a byte of code
-+ */
-+static void
-+regc(struct match_globals *g, char b)
-+{
-+ if (g->regcode != &g->regdummy)
-+ *g->regcode++ = b;
-+ else
-+ g->regsize++;
-+}
-+
-+/*
-+ - reginsert - insert an operator in front of already-emitted operand
-+ *
-+ * Means relocating the operand.
-+ */
-+static void
-+reginsert(struct match_globals *g, char op, char* opnd)
-+{
-+ register char *src;
-+ register char *dst;
-+ register char *place;
-+
-+ if (g->regcode == &g->regdummy) {
-+ g->regsize += 3;
-+ return;
-+ }
-+
-+ src = g->regcode;
-+ g->regcode += 3;
-+ dst = g->regcode;
-+ while (src > opnd)
-+ *--dst = *--src;
-+
-+ place = opnd; /* Op node, where operand used to be. */
-+ *place++ = op;
-+ *place++ = '\0';
-+ *place++ = '\0';
-+}
-+
-+/*
-+ - regtail - set the next-pointer at the end of a node chain
-+ */
-+static void
-+regtail(struct match_globals *g, char *p, char *val)
-+{
-+ register char *scan;
-+ register char *temp;
-+ register int offset;
-+
-+ if (p == &g->regdummy)
-+ return;
-+
-+ /* Find last node. */
-+ scan = p;
-+ for (;;) {
-+ temp = regnext(g, scan);
-+ if (temp == NULL)
-+ break;
-+ scan = temp;
-+ }
-+
-+ if (OP(scan) == BACK)
-+ offset = scan - val;
-+ else
-+ offset = val - scan;
-+ *(scan+1) = (offset>>8)&0377;
-+ *(scan+2) = offset&0377;
-+}
-+
-+/*
-+ - regoptail - regtail on operand of first argument; nop if operandless
-+ */
-+static void
-+regoptail(struct match_globals *g, char *p, char *val)
-+{
-+ /* "Operandless" and "op != BRANCH" are synonymous in practice. */
-+ if (p == NULL || p == &g->regdummy || OP(p) != BRANCH)
-+ return;
-+ regtail(g, OPERAND(p), val);
-+}
-+
-+/*
-+ * regexec and friends
-+ */
-+
-+
-+/*
-+ * Forwards.
-+ */
-+STATIC int regtry(struct match_globals *g, regexp *prog, char *string);
-+STATIC int regmatch(struct match_globals *g, char *prog);
-+STATIC int regrepeat(struct match_globals *g, char *p);
-+
-+#ifdef DEBUG
-+int regnarrate = 0;
-+void regdump();
-+STATIC char *regprop(char *op);
-+#endif
-+
-+/*
-+ - regexec - match a regexp against a string
-+ */
-+int
-+regexec(regexp *prog, char *string)
-+{
-+ register char *s;
-+ struct match_globals g;
-+
-+ /* Be paranoid... */
-+ if (prog == NULL || string == NULL) {
-+ printk("<3>Regexp: NULL parameter\n");
-+ return(0);
-+ }
-+
-+ /* Check validity of program. */
-+ if (UCHARAT(prog->program) != MAGIC) {
-+ printk("<3>Regexp: corrupted program\n");
-+ return(0);
-+ }
-+
-+ /* If there is a "must appear" string, look for it. */
-+ if (prog->regmust != NULL) {
-+ s = string;
-+ while ((s = strchr(s, prog->regmust[0])) != NULL) {
-+ if (strncmp(s, prog->regmust, prog->regmlen) == 0)
-+ break; /* Found it. */
-+ s++;
-+ }
-+ if (s == NULL) /* Not present. */
-+ return(0);
-+ }
-+
-+ /* Mark beginning of line for ^ . */
-+ g.regbol = string;
-+
-+ /* Simplest case: anchored match need be tried only once. */
-+ if (prog->reganch)
-+ return(regtry(&g, prog, string));
-+
-+ /* Messy cases: unanchored match. */
-+ s = string;
-+ if (prog->regstart != '\0')
-+ /* We know what char it must start with. */
-+ while ((s = strchr(s, prog->regstart)) != NULL) {
-+ if (regtry(&g, prog, s))
-+ return(1);
-+ s++;
-+ }
-+ else
-+ /* We don't -- general case. */
-+ do {
-+ if (regtry(&g, prog, s))
-+ return(1);
-+ } while (*s++ != '\0');
-+
-+ /* Failure. */
-+ return(0);
-+}
-+
-+/*
-+ - regtry - try match at specific point
-+ */
-+static int /* 0 failure, 1 success */
-+regtry(struct match_globals *g, regexp *prog, char *string)
-+{
-+ register int i;
-+ register char **sp;
-+ register char **ep;
-+
-+ g->reginput = string;
-+ g->regstartp = prog->startp;
-+ g->regendp = prog->endp;
-+
-+ sp = prog->startp;
-+ ep = prog->endp;
-+ for (i = NSUBEXP; i > 0; i--) {
-+ *sp++ = NULL;
-+ *ep++ = NULL;
-+ }
-+ if (regmatch(g, prog->program + 1)) {
-+ prog->startp[0] = string;
-+ prog->endp[0] = g->reginput;
-+ return(1);
-+ } else
-+ return(0);
-+}
-+
-+/*
-+ - regmatch - main matching routine
-+ *
-+ * Conceptually the strategy is simple: check to see whether the current
-+ * node matches, call self recursively to see whether the rest matches,
-+ * and then act accordingly. In practice we make some effort to avoid
-+ * recursion, in particular by going through "ordinary" nodes (that don't
-+ * need to know whether the rest of the match failed) by a loop instead of
-+ * by recursion.
-+ */
-+static int /* 0 failure, 1 success */
-+regmatch(struct match_globals *g, char *prog)
-+{
-+ register char *scan = prog; /* Current node. */
-+ char *next; /* Next node. */
-+
-+#ifdef DEBUG
-+ if (scan != NULL && regnarrate)
-+ fprintf(stderr, "%s(\n", regprop(scan));
-+#endif
-+ while (scan != NULL) {
-+#ifdef DEBUG
-+ if (regnarrate)
-+ fprintf(stderr, "%s...\n", regprop(scan));
-+#endif
-+ next = regnext(g, scan);
-+
-+ switch (OP(scan)) {
-+ case BOL:
-+ if (g->reginput != g->regbol)
-+ return(0);
-+ break;
-+ case EOL:
-+ if (*g->reginput != '\0')
-+ return(0);
-+ break;
-+ case ANY:
-+ if (*g->reginput == '\0')
-+ return(0);
-+ g->reginput++;
-+ break;
-+ case EXACTLY: {
-+ register int len;
-+ register char *opnd;
-+
-+ opnd = OPERAND(scan);
-+ /* Inline the first character, for speed. */
-+ if (*opnd != *g->reginput)
-+ return(0);
-+ len = strlen(opnd);
-+ if (len > 1 && strncmp(opnd, g->reginput, len) != 0)
-+ return(0);
-+ g->reginput += len;
-+ }
-+ break;
-+ case ANYOF:
-+ if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) == NULL)
-+ return(0);
-+ g->reginput++;
-+ break;
-+ case ANYBUT:
-+ if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) != NULL)
-+ return(0);
-+ g->reginput++;
-+ break;
-+ case NOTHING:
-+ case BACK:
-+ break;
-+ case OPEN+1:
-+ case OPEN+2:
-+ case OPEN+3:
-+ case OPEN+4:
-+ case OPEN+5:
-+ case OPEN+6:
-+ case OPEN+7:
-+ case OPEN+8:
-+ case OPEN+9: {
-+ register int no;
-+ register char *save;
-+
-+ no = OP(scan) - OPEN;
-+ save = g->reginput;
-+
-+ if (regmatch(g, next)) {
-+ /*
-+ * Don't set startp if some later
-+ * invocation of the same parentheses
-+ * already has.
-+ */
-+ if (g->regstartp[no] == NULL)
-+ g->regstartp[no] = save;
-+ return(1);
-+ } else
-+ return(0);
-+ }
-+ break;
-+ case CLOSE+1:
-+ case CLOSE+2:
-+ case CLOSE+3:
-+ case CLOSE+4:
-+ case CLOSE+5:
-+ case CLOSE+6:
-+ case CLOSE+7:
-+ case CLOSE+8:
-+ case CLOSE+9:
-+ {
-+ register int no;
-+ register char *save;
-+
-+ no = OP(scan) - CLOSE;
-+ save = g->reginput;
-+
-+ if (regmatch(g, next)) {
-+ /*
-+ * Don't set endp if some later
-+ * invocation of the same parentheses
-+ * already has.
-+ */
-+ if (g->regendp[no] == NULL)
-+ g->regendp[no] = save;
-+ return(1);
-+ } else
-+ return(0);
-+ }
-+ break;
-+ case BRANCH: {
-+ register char *save;
-+
-+ if (OP(next) != BRANCH) /* No choice. */
-+ next = OPERAND(scan); /* Avoid recursion. */
-+ else {
-+ do {
-+ save = g->reginput;
-+ if (regmatch(g, OPERAND(scan)))
-+ return(1);
-+ g->reginput = save;
-+ scan = regnext(g, scan);
-+ } while (scan != NULL && OP(scan) == BRANCH);
-+ return(0);
-+ /* NOTREACHED */
-+ }
-+ }
-+ break;
-+ case STAR:
-+ case PLUS: {
-+ register char nextch;
-+ register int no;
-+ register char *save;
-+ register int min;
-+
-+ /*
-+ * Lookahead to avoid useless match attempts
-+ * when we know what character comes next.
-+ */
-+ nextch = '\0';
-+ if (OP(next) == EXACTLY)
-+ nextch = *OPERAND(next);
-+ min = (OP(scan) == STAR) ? 0 : 1;
-+ save = g->reginput;
-+ no = regrepeat(g, OPERAND(scan));
-+ while (no >= min) {
-+ /* If it could work, try it. */
-+ if (nextch == '\0' || *g->reginput == nextch)
-+ if (regmatch(g, next))
-+ return(1);
-+ /* Couldn't or didn't -- back up. */
-+ no--;
-+ g->reginput = save + no;
-+ }
-+ return(0);
-+ }
-+ break;
-+ case END:
-+ return(1); /* Success! */
-+ break;
-+ default:
-+ printk("<3>Regexp: memory corruption\n");
-+ return(0);
-+ break;
-+ }
-+
-+ scan = next;
-+ }
-+
-+ /*
-+ * We get here only if there's trouble -- normally "case END" is
-+ * the terminating point.
-+ */
-+ printk("<3>Regexp: corrupted pointers\n");
-+ return(0);
-+}
-+
-+/*
-+ - regrepeat - repeatedly match something simple, report how many
-+ */
-+static int
-+regrepeat(struct match_globals *g, char *p)
-+{
-+ register int count = 0;
-+ register char *scan;
-+ register char *opnd;
-+
-+ scan = g->reginput;
-+ opnd = OPERAND(p);
-+ switch (OP(p)) {
-+ case ANY:
-+ count = strlen(scan);
-+ scan += count;
-+ break;
-+ case EXACTLY:
-+ while (*opnd == *scan) {
-+ count++;
-+ scan++;
-+ }
-+ break;
-+ case ANYOF:
-+ while (*scan != '\0' && strchr(opnd, *scan) != NULL) {
-+ count++;
-+ scan++;
-+ }
-+ break;
-+ case ANYBUT:
-+ while (*scan != '\0' && strchr(opnd, *scan) == NULL) {
-+ count++;
-+ scan++;
-+ }
-+ break;
-+ default: /* Oh dear. Called inappropriately. */
-+ printk("<3>Regexp: internal foulup\n");
-+ count = 0; /* Best compromise. */
-+ break;
-+ }
-+ g->reginput = scan;
-+
-+ return(count);
-+}
-+
-+/*
-+ - regnext - dig the "next" pointer out of a node
-+ */
-+static char*
-+regnext(struct match_globals *g, char *p)
-+{
-+ register int offset;
-+
-+ if (p == &g->regdummy)
-+ return(NULL);
-+
-+ offset = NEXT(p);
-+ if (offset == 0)
-+ return(NULL);
-+
-+ if (OP(p) == BACK)
-+ return(p-offset);
-+ else
-+ return(p+offset);
-+}
-+
-+#ifdef DEBUG
-+
-+STATIC char *regprop();
-+
-+/*
-+ - regdump - dump a regexp onto stdout in vaguely comprehensible form
-+ */
-+void
-+regdump(regexp *r)
-+{
-+ register char *s;
-+ register char op = EXACTLY; /* Arbitrary non-END op. */
-+ register char *next;
-+ /* extern char *strchr(); */
-+
-+
-+ s = r->program + 1;
-+ while (op != END) { /* While that wasn't END last time... */
-+ op = OP(s);
-+ printf("%2d%s", s-r->program, regprop(s)); /* Where, what. */
-+ next = regnext(s);
-+ if (next == NULL) /* Next ptr. */
-+ printf("(0)");
-+ else
-+ printf("(%d)", (s-r->program)+(next-s));
-+ s += 3;
-+ if (op == ANYOF || op == ANYBUT || op == EXACTLY) {
-+ /* Literal string, where present. */
-+ while (*s != '\0') {
-+ putchar(*s);
-+ s++;
-+ }
-+ s++;
-+ }
-+ putchar('\n');
-+ }
-+
-+ /* Header fields of interest. */
-+ if (r->regstart != '\0')
-+ printf("start `%c' ", r->regstart);
-+ if (r->reganch)
-+ printf("anchored ");
-+ if (r->regmust != NULL)
-+ printf("must have \"%s\"", r->regmust);
-+ printf("\n");
-+}
-+
-+/*
-+ - regprop - printable representation of opcode
-+ */
-+static char *
-+regprop(char *op)
-+{
-+#define BUFLEN 50
-+ register char *p;
-+ static char buf[BUFLEN];
-+
-+ strcpy(buf, ":");
-+
-+ switch (OP(op)) {
-+ case BOL:
-+ p = "BOL";
-+ break;
-+ case EOL:
-+ p = "EOL";
-+ break;
-+ case ANY:
-+ p = "ANY";
-+ break;
-+ case ANYOF:
-+ p = "ANYOF";
-+ break;
-+ case ANYBUT:
-+ p = "ANYBUT";
-+ break;
-+ case BRANCH:
-+ p = "BRANCH";
-+ break;
-+ case EXACTLY:
-+ p = "EXACTLY";
-+ break;
-+ case NOTHING:
-+ p = "NOTHING";
-+ break;
-+ case BACK:
-+ p = "BACK";
-+ break;
-+ case END:
-+ p = "END";
-+ break;
-+ case OPEN+1:
-+ case OPEN+2:
-+ case OPEN+3:
-+ case OPEN+4:
-+ case OPEN+5:
-+ case OPEN+6:
-+ case OPEN+7:
-+ case OPEN+8:
-+ case OPEN+9:
-+ snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "OPEN%d", OP(op)-OPEN);
-+ p = NULL;
-+ break;
-+ case CLOSE+1:
-+ case CLOSE+2:
-+ case CLOSE+3:
-+ case CLOSE+4:
-+ case CLOSE+5:
-+ case CLOSE+6:
-+ case CLOSE+7:
-+ case CLOSE+8:
-+ case CLOSE+9:
-+ snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "CLOSE%d", OP(op)-CLOSE);
-+ p = NULL;
-+ break;
-+ case STAR:
-+ p = "STAR";
-+ break;
-+ case PLUS:
-+ p = "PLUS";
-+ break;
-+ default:
-+ printk("<3>Regexp: corrupted opcode\n");
-+ break;
-+ }
-+ if (p != NULL)
-+ strncat(buf, p, BUFLEN-strlen(buf));
-+ return(buf);
-+}
-+#endif
-+
-+
---- /dev/null
-+++ b/net/netfilter/regexp/regexp.h
-@@ -0,0 +1,41 @@
-+/*
-+ * Definitions etc. for regexp(3) routines.
-+ *
-+ * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof],
-+ * not the System V one.
-+ */
-+
-+#ifndef REGEXP_H
-+#define REGEXP_H
-+
-+
-+/*
-+http://www.opensource.apple.com/darwinsource/10.3/expect-1/expect/expect.h ,
-+which contains a version of this library, says:
-+
-+ *
-+ * NSUBEXP must be at least 10, and no greater than 117 or the parser
-+ * will not work properly.
-+ *
-+
-+However, it looks rather like this library is limited to 10. If you think
-+otherwise, let us know.
-+*/
-+
-+#define NSUBEXP 10
-+typedef struct regexp {
-+ char *startp[NSUBEXP];
-+ char *endp[NSUBEXP];
-+ char regstart; /* Internal use only. */
-+ char reganch; /* Internal use only. */
-+ char *regmust; /* Internal use only. */
-+ int regmlen; /* Internal use only. */
-+ char program[1]; /* Unwarranted chumminess with compiler. */
-+} regexp;
-+
-+regexp * regcomp(char *exp, int *patternsize);
-+int regexec(regexp *prog, char *string);
-+void regsub(regexp *prog, char *source, char *dest);
-+void regerror(char *s);
-+
-+#endif
---- /dev/null
-+++ b/net/netfilter/regexp/regmagic.h
-@@ -0,0 +1,5 @@
-+/*
-+ * The first byte of the regexp internal "program" is actually this magic
-+ * number; the start node begins in the second byte.
-+ */
-+#define MAGIC 0234
---- /dev/null
-+++ b/net/netfilter/regexp/regsub.c
-@@ -0,0 +1,95 @@
-+/*
-+ * regsub
-+ * @(#)regsub.c 1.3 of 2 April 86
-+ *
-+ * Copyright (c) 1986 by University of Toronto.
-+ * Written by Henry Spencer. Not derived from licensed software.
-+ *
-+ * Permission is granted to anyone to use this software for any
-+ * purpose on any computer system, and to redistribute it freely,
-+ * subject to the following restrictions:
-+ *
-+ * 1. The author is not responsible for the consequences of use of
-+ * this software, no matter how awful, even if they arise
-+ * from defects in it.
-+ *
-+ * 2. The origin of this software must not be misrepresented, either
-+ * by explicit claim or by omission.
-+ *
-+ * 3. Altered versions must be plainly marked as such, and must not
-+ * be misrepresented as being the original software.
-+ *
-+ *
-+ * This code was modified by Ethan Sommer to work within the kernel
-+ * (it now uses kmalloc etc..)
-+ *
-+ */
-+#include "regexp.h"
-+#include "regmagic.h"
-+#include <linux/string.h>
-+
-+
-+#ifndef CHARBITS
-+#define UCHARAT(p) ((int)*(unsigned char *)(p))
-+#else
-+#define UCHARAT(p) ((int)*(p)&CHARBITS)
-+#endif
-+
-+#if 0
-+//void regerror(char * s)
-+//{
-+// printk("regexp(3): %s", s);
-+// /* NOTREACHED */
-+//}
-+#endif
-+
-+/*
-+ - regsub - perform substitutions after a regexp match
-+ */
-+void
-+regsub(regexp * prog, char * source, char * dest)
-+{
-+ register char *src;
-+ register char *dst;
-+ register char c;
-+ register int no;
-+ register int len;
-+
-+ /* Not necessary and gcc doesn't like it -MLS */
-+ /*extern char *strncpy();*/
-+
-+ if (prog == NULL || source == NULL || dest == NULL) {
-+ regerror("NULL parm to regsub");
-+ return;
-+ }
-+ if (UCHARAT(prog->program) != MAGIC) {
-+ regerror("damaged regexp fed to regsub");
-+ return;
-+ }
-+
-+ src = source;
-+ dst = dest;
-+ while ((c = *src++) != '\0') {
-+ if (c == '&')
-+ no = 0;
-+ else if (c == '\\' && '0' <= *src && *src <= '9')
-+ no = *src++ - '0';
-+ else
-+ no = -1;
-+
-+ if (no < 0) { /* Ordinary character. */
-+ if (c == '\\' && (*src == '\\' || *src == '&'))
-+ c = *src++;
-+ *dst++ = c;
-+ } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) {
-+ len = prog->endp[no] - prog->startp[no];
-+ (void) strncpy(dst, prog->startp[no], len);
-+ dst += len;
-+ if (len != 0 && *(dst-1) == '\0') { /* strncpy hit NUL. */
-+ regerror("damaged match string");
-+ return;
-+ }
-+ }
-+ }
-+ *dst++ = '\0';
-+}
---- /dev/null
-+++ b/net/netfilter/xt_layer7.c
-@@ -0,0 +1,666 @@
-+/*
-+ Kernel module to match application layer (OSI layer 7) data in connections.
-+
-+ http://l7-filter.sf.net
-+
-+ (C) 2003-2009 Matthew Strait and Ethan Sommer.
-+
-+ 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.
-+ http://www.gnu.org/licenses/gpl.txt
-+
-+ Based on ipt_string.c (C) 2000 Emmanuel Roger <winfield@freegates.be>,
-+ xt_helper.c (C) 2002 Harald Welte and cls_layer7.c (C) 2003 Matthew Strait,
-+ Ethan Sommer, Justin Levandoski.
-+*/
-+
-+#include <linux/spinlock.h>
-+#include <linux/version.h>
-+#include <net/ip.h>
-+#include <net/tcp.h>
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter.h>
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_core.h>
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
-+#include <net/netfilter/nf_conntrack_extend.h>
-+#include <net/netfilter/nf_conntrack_acct.h>
-+#endif
-+#include <linux/netfilter/x_tables.h>
-+#include <linux/netfilter/xt_layer7.h>
-+#include <linux/ctype.h>
-+#include <linux/proc_fs.h>
-+
-+#include "regexp/regexp.c"
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Matthew Strait <quadong@users.sf.net>, Ethan Sommer <sommere@users.sf.net>");
-+MODULE_DESCRIPTION("iptables application layer match module");
-+MODULE_ALIAS("ipt_layer7");
-+MODULE_VERSION("2.21");
-+
-+static int maxdatalen = 2048; // this is the default
-+module_param(maxdatalen, int, 0444);
-+MODULE_PARM_DESC(maxdatalen, "maximum bytes of data looked at by l7-filter");
-+#ifdef CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG
-+ #define DPRINTK(format,args...) printk(format,##args)
-+#else
-+ #define DPRINTK(format,args...)
-+#endif
-+
-+/* Number of packets whose data we look at.
-+This can be modified through /proc/net/layer7_numpackets */
-+static int num_packets = 10;
-+
-+static struct pattern_cache {
-+ char * regex_string;
-+ regexp * pattern;
-+ struct pattern_cache * next;
-+} * first_pattern_cache = NULL;
-+
-+DEFINE_SPINLOCK(l7_lock);
-+
-+static int total_acct_packets(struct nf_conn *ct)
-+{
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 26)
-+ BUG_ON(ct == NULL);
-+ return (ct->counters[IP_CT_DIR_ORIGINAL].packets + ct->counters[IP_CT_DIR_REPLY].packets);
-+#else
-+ struct nf_conn_counter *acct;
-+
-+ BUG_ON(ct == NULL);
-+ acct = nf_conn_acct_find(ct);
-+ if (!acct)
-+ return 0;
-+ return (acct[IP_CT_DIR_ORIGINAL].packets + acct[IP_CT_DIR_REPLY].packets);
-+#endif
-+}
-+
-+#ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
-+/* Converts an unfriendly string into a friendly one by
-+replacing unprintables with periods and all whitespace with " ". */
-+static char * friendly_print(unsigned char * s)
-+{
-+ char * f = kmalloc(strlen(s) + 1, GFP_ATOMIC);
-+ int i;
-+
-+ if(!f) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "friendly_print, bailing.\n");
-+ return NULL;
-+ }
-+
-+ for(i = 0; i < strlen(s); i++){
-+ if(isprint(s[i]) && s[i] < 128) f[i] = s[i];
-+ else if(isspace(s[i])) f[i] = ' ';
-+ else f[i] = '.';
-+ }
-+ f[i] = '\0';
-+ return f;
-+}
-+
-+static char dec2hex(int i)
-+{
-+ switch (i) {
-+ case 0 ... 9:
-+ return (i + '0');
-+ break;
-+ case 10 ... 15:
-+ return (i - 10 + 'a');
-+ break;
-+ default:
-+ if (net_ratelimit())
-+ printk("layer7: Problem in dec2hex\n");
-+ return '\0';
-+ }
-+}
-+
-+static char * hex_print(unsigned char * s)
-+{
-+ char * g = kmalloc(strlen(s)*3 + 1, GFP_ATOMIC);
-+ int i;
-+
-+ if(!g) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in hex_print, "
-+ "bailing.\n");
-+ return NULL;
-+ }
-+
-+ for(i = 0; i < strlen(s); i++) {
-+ g[i*3 ] = dec2hex(s[i]/16);
-+ g[i*3 + 1] = dec2hex(s[i]%16);
-+ g[i*3 + 2] = ' ';
-+ }
-+ g[i*3] = '\0';
-+
-+ return g;
-+}
-+#endif // DEBUG
-+
-+/* Use instead of regcomp. As we expect to be seeing the same regexps over and
-+over again, it make sense to cache the results. */
-+static regexp * compile_and_cache(const char * regex_string,
-+ const char * protocol)
-+{
-+ struct pattern_cache * node = first_pattern_cache;
-+ struct pattern_cache * last_pattern_cache = first_pattern_cache;
-+ struct pattern_cache * tmp;
-+ unsigned int len;
-+
-+ while (node != NULL) {
-+ if (!strcmp(node->regex_string, regex_string))
-+ return node->pattern;
-+
-+ last_pattern_cache = node;/* points at the last non-NULL node */
-+ node = node->next;
-+ }
-+
-+ /* If we reach the end of the list, then we have not yet cached
-+ the pattern for this regex. Let's do that now.
-+ Be paranoid about running out of memory to avoid list corruption. */
-+ tmp = kmalloc(sizeof(struct pattern_cache), GFP_ATOMIC);
-+
-+ if(!tmp) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "compile_and_cache, bailing.\n");
-+ return NULL;
-+ }
-+
-+ tmp->regex_string = kmalloc(strlen(regex_string) + 1, GFP_ATOMIC);
-+ tmp->pattern = kmalloc(sizeof(struct regexp), GFP_ATOMIC);
-+ tmp->next = NULL;
-+
-+ if(!tmp->regex_string || !tmp->pattern) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "compile_and_cache, bailing.\n");
-+ kfree(tmp->regex_string);
-+ kfree(tmp->pattern);
-+ kfree(tmp);
-+ return NULL;
-+ }
-+
-+ /* Ok. The new node is all ready now. */
-+ node = tmp;
-+
-+ if(first_pattern_cache == NULL) /* list is empty */
-+ first_pattern_cache = node; /* make node the beginning */
-+ else
-+ last_pattern_cache->next = node; /* attach node to the end */
-+
-+ /* copy the string and compile the regex */
-+ len = strlen(regex_string);
-+ DPRINTK("About to compile this: \"%s\"\n", regex_string);
-+ node->pattern = regcomp((char *)regex_string, &len);
-+ if ( !node->pattern ) {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: Error compiling regexp "
-+ "\"%s\" (%s)\n",
-+ regex_string, protocol);
-+ /* pattern is now cached as NULL, so we won't try again. */
-+ }
-+
-+ strcpy(node->regex_string, regex_string);
-+ return node->pattern;
-+}
-+
-+static int can_handle(const struct sk_buff *skb)
-+{
-+ if(!ip_hdr(skb)) /* not IP */
-+ return 0;
-+ if(ip_hdr(skb)->protocol != IPPROTO_TCP &&
-+ ip_hdr(skb)->protocol != IPPROTO_UDP &&
-+ ip_hdr(skb)->protocol != IPPROTO_ICMP)
-+ return 0;
-+ return 1;
-+}
-+
-+/* Returns offset the into the skb->data that the application data starts */
-+static int app_data_offset(const struct sk_buff *skb)
-+{
-+ /* In case we are ported somewhere (ebtables?) where ip_hdr(skb)
-+ isn't set, this can be gotten from 4*(skb->data[0] & 0x0f) as well. */
-+ int ip_hl = 4*ip_hdr(skb)->ihl;
-+
-+ if( ip_hdr(skb)->protocol == IPPROTO_TCP ) {
-+ /* 12 == offset into TCP header for the header length field.
-+ Can't get this with skb->h.th->doff because the tcphdr
-+ struct doesn't get set when routing (this is confirmed to be
-+ true in Netfilter as well as QoS.) */
-+ int tcp_hl = 4*(skb->data[ip_hl + 12] >> 4);
-+
-+ return ip_hl + tcp_hl;
-+ } else if( ip_hdr(skb)->protocol == IPPROTO_UDP ) {
-+ return ip_hl + 8; /* UDP header is always 8 bytes */
-+ } else if( ip_hdr(skb)->protocol == IPPROTO_ICMP ) {
-+ return ip_hl + 8; /* ICMP header is 8 bytes */
-+ } else {
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: tried to handle unknown "
-+ "protocol!\n");
-+ return ip_hl + 8; /* something reasonable */
-+ }
-+}
-+
-+/* handles whether there's a match when we aren't appending data anymore */
-+static int match_no_append(struct nf_conn * conntrack,
-+ struct nf_conn * master_conntrack,
-+ enum ip_conntrack_info ctinfo,
-+ enum ip_conntrack_info master_ctinfo,
-+ const struct xt_layer7_info * info)
-+{
-+ /* If we're in here, throw the app data away */
-+ if(master_conntrack->layer7.app_data != NULL) {
-+
-+ #ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
-+ if(!master_conntrack->layer7.app_proto) {
-+ char * f =
-+ friendly_print(master_conntrack->layer7.app_data);
-+ char * g =
-+ hex_print(master_conntrack->layer7.app_data);
-+ DPRINTK("\nl7-filter gave up after %d bytes "
-+ "(%d packets):\n%s\n",
-+ strlen(f), total_acct_packets(master_conntrack), f);
-+ kfree(f);
-+ DPRINTK("In hex: %s\n", g);
-+ kfree(g);
-+ }
-+ #endif
-+
-+ kfree(master_conntrack->layer7.app_data);
-+ master_conntrack->layer7.app_data = NULL; /* don't free again */
-+ }
-+
-+ if(master_conntrack->layer7.app_proto){
-+ /* Here child connections set their .app_proto (for /proc) */
-+ if(!conntrack->layer7.app_proto) {
-+ conntrack->layer7.app_proto =
-+ kmalloc(strlen(master_conntrack->layer7.app_proto)+1,
-+ GFP_ATOMIC);
-+ if(!conntrack->layer7.app_proto){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory "
-+ "in match_no_append, "
-+ "bailing.\n");
-+ return 1;
-+ }
-+ strcpy(conntrack->layer7.app_proto,
-+ master_conntrack->layer7.app_proto);
-+ }
-+
-+ return (!strcmp(master_conntrack->layer7.app_proto,
-+ info->protocol));
-+ }
-+ else {
-+ /* If not classified, set to "unknown" to distinguish from
-+ connections that are still being tested. */
-+ master_conntrack->layer7.app_proto =
-+ kmalloc(strlen("unknown")+1, GFP_ATOMIC);
-+ if(!master_conntrack->layer7.app_proto){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "match_no_append, bailing.\n");
-+ return 1;
-+ }
-+ strcpy(master_conntrack->layer7.app_proto, "unknown");
-+ return 0;
-+ }
-+}
-+
-+/* add the new app data to the conntrack. Return number of bytes added. */
-+static int add_data(struct nf_conn * master_conntrack,
-+ char * app_data, int appdatalen)
-+{
-+ int length = 0, i;
-+ int oldlength = master_conntrack->layer7.app_data_len;
-+
-+ /* This is a fix for a race condition by Deti Fliegl. However, I'm not
-+ clear on whether the race condition exists or whether this really
-+ fixes it. I might just be being dense... Anyway, if it's not really
-+ a fix, all it does is waste a very small amount of time. */
-+ if(!master_conntrack->layer7.app_data) return 0;
-+
-+ /* Strip nulls. Make everything lower case (our regex lib doesn't
-+ do case insensitivity). Add it to the end of the current data. */
-+ for(i = 0; i < maxdatalen-oldlength-1 &&
-+ i < appdatalen; i++) {
-+ if(app_data[i] != '\0') {
-+ /* the kernel version of tolower mungs 'upper ascii' */
-+ master_conntrack->layer7.app_data[length+oldlength] =
-+ isascii(app_data[i])?
-+ tolower(app_data[i]) : app_data[i];
-+ length++;
-+ }
-+ }
-+
-+ master_conntrack->layer7.app_data[length+oldlength] = '\0';
-+ master_conntrack->layer7.app_data_len = length + oldlength;
-+
-+ return length;
-+}
-+
-+/* taken from drivers/video/modedb.c */
-+static int my_atoi(const char *s)
-+{
-+ int val = 0;
-+
-+ for (;; s++) {
-+ switch (*s) {
-+ case '0'...'9':
-+ val = 10*val+(*s-'0');
-+ break;
-+ default:
-+ return val;
-+ }
-+ }
-+}
-+
-+/* write out num_packets to userland. */
-+static int layer7_read_proc(char* page, char ** start, off_t off, int count,
-+ int* eof, void * data)
-+{
-+ if(num_packets > 99 && net_ratelimit())
-+ printk(KERN_ERR "layer7: NOT REACHED. num_packets too big\n");
-+
-+ page[0] = num_packets/10 + '0';
-+ page[1] = num_packets%10 + '0';
-+ page[2] = '\n';
-+ page[3] = '\0';
-+
-+ *eof=1;
-+
-+ return 3;
-+}
-+
-+/* Read in num_packets from userland */
-+static int layer7_write_proc(struct file* file, const char* buffer,
-+ unsigned long count, void *data)
-+{
-+ char * foo = kmalloc(count, GFP_ATOMIC);
-+
-+ if(!foo){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory, bailing. "
-+ "num_packets unchanged.\n");
-+ return count;
-+ }
-+
-+ if(copy_from_user(foo, buffer, count)) {
-+ return -EFAULT;
-+ }
-+
-+
-+ num_packets = my_atoi(foo);
-+ kfree (foo);
-+
-+ /* This has an arbitrary limit to make the math easier. I'm lazy.
-+ But anyway, 99 is a LOT! If you want more, you're doing it wrong! */
-+ if(num_packets > 99) {
-+ printk(KERN_WARNING "layer7: num_packets can't be > 99.\n");
-+ num_packets = 99;
-+ } else if(num_packets < 1) {
-+ printk(KERN_WARNING "layer7: num_packets can't be < 1.\n");
-+ num_packets = 1;
-+ }
-+
-+ return count;
-+}
-+
-+static bool
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+match(const struct sk_buff *skbin, const struct xt_match_param *par)
-+#else
-+match(const struct sk_buff *skbin,
-+ const struct net_device *in,
-+ const struct net_device *out,
-+ const struct xt_match *match,
-+ const void *matchinfo,
-+ int offset,
-+ unsigned int protoff,
-+ bool *hotdrop)
-+#endif
-+{
-+ /* sidestep const without getting a compiler warning... */
-+ struct sk_buff * skb = (struct sk_buff *)skbin;
-+
-+ const struct xt_layer7_info * info =
-+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+ par->matchinfo;
-+ #else
-+ matchinfo;
-+ #endif
-+
-+ enum ip_conntrack_info master_ctinfo, ctinfo;
-+ struct nf_conn *master_conntrack, *conntrack;
-+ unsigned char * app_data;
-+ unsigned int pattern_result, appdatalen;
-+ regexp * comppattern;
-+
-+ /* Be paranoid/incompetent - lock the entire match function. */
-+ spin_lock_bh(&l7_lock);
-+
-+ if(!can_handle(skb)){
-+ DPRINTK("layer7: This is some protocol I can't handle.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+
-+ /* Treat parent & all its children together as one connection, except
-+ for the purpose of setting conntrack->layer7.app_proto in the actual
-+ connection. This makes /proc/net/ip_conntrack more satisfying. */
-+ if(!(conntrack = nf_ct_get(skb, &ctinfo)) ||
-+ !(master_conntrack=nf_ct_get(skb,&master_ctinfo))){
-+ DPRINTK("layer7: couldn't get conntrack.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+
-+ /* Try to get a master conntrack (and its master etc) for FTP, etc. */
-+ while (master_ct(master_conntrack) != NULL)
-+ master_conntrack = master_ct(master_conntrack);
-+
-+ /* if we've classified it or seen too many packets */
-+ if(total_acct_packets(master_conntrack) > num_packets ||
-+ master_conntrack->layer7.app_proto) {
-+
-+ pattern_result = match_no_append(conntrack, master_conntrack,
-+ ctinfo, master_ctinfo, info);
-+
-+ /* skb->cb[0] == seen. Don't do things twice if there are
-+ multiple l7 rules. I'm not sure that using cb for this purpose
-+ is correct, even though it says "put your private variables
-+ there". But it doesn't look like it is being used for anything
-+ else in the skbs that make it here. */
-+ skb->cb[0] = 1; /* marking it seen here's probably irrelevant */
-+
-+ spin_unlock_bh(&l7_lock);
-+ return (pattern_result ^ info->invert);
-+ }
-+
-+ if(skb_is_nonlinear(skb)){
-+ if(skb_linearize(skb) != 0){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: failed to linearize "
-+ "packet, bailing.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+ }
-+
-+ /* now that the skb is linearized, it's safe to set these. */
-+ app_data = skb->data + app_data_offset(skb);
-+ appdatalen = skb_tail_pointer(skb) - app_data;
-+
-+ /* the return value gets checked later, when we're ready to use it */
-+ comppattern = compile_and_cache(info->pattern, info->protocol);
-+
-+ /* On the first packet of a connection, allocate space for app data */
-+ if(total_acct_packets(master_conntrack) == 1 && !skb->cb[0] &&
-+ !master_conntrack->layer7.app_data){
-+ master_conntrack->layer7.app_data =
-+ kmalloc(maxdatalen, GFP_ATOMIC);
-+ if(!master_conntrack->layer7.app_data){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "match, bailing.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+
-+ master_conntrack->layer7.app_data[0] = '\0';
-+ }
-+
-+ /* Can be here, but unallocated, if numpackets is increased near
-+ the beginning of a connection */
-+ if(master_conntrack->layer7.app_data == NULL){
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert; /* unmatched */
-+ }
-+
-+ if(!skb->cb[0]){
-+ int newbytes;
-+ newbytes = add_data(master_conntrack, app_data, appdatalen);
-+
-+ if(newbytes == 0) { /* didn't add any data */
-+ skb->cb[0] = 1;
-+ /* Didn't match before, not going to match now */
-+ spin_unlock_bh(&l7_lock);
-+ return info->invert;
-+ }
-+ }
-+
-+ /* If looking for "unknown", then never match. "Unknown" means that
-+ we've given up; we're still trying with these packets. */
-+ if(!strcmp(info->protocol, "unknown")) {
-+ pattern_result = 0;
-+ /* If looking for "unset", then always match. "Unset" means that we
-+ haven't yet classified the connection. */
-+ } else if(!strcmp(info->protocol, "unset")) {
-+ pattern_result = 2;
-+ DPRINTK("layer7: matched unset: not yet classified "
-+ "(%d/%d packets)\n",
-+ total_acct_packets(master_conntrack), num_packets);
-+ /* If the regexp failed to compile, don't bother running it */
-+ } else if(comppattern &&
-+ regexec(comppattern, master_conntrack->layer7.app_data)){
-+ DPRINTK("layer7: matched %s\n", info->protocol);
-+ pattern_result = 1;
-+ } else pattern_result = 0;
-+
-+ if(pattern_result == 1) {
-+ master_conntrack->layer7.app_proto =
-+ kmalloc(strlen(info->protocol)+1, GFP_ATOMIC);
-+ if(!master_conntrack->layer7.app_proto){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in "
-+ "match, bailing.\n");
-+ spin_unlock_bh(&l7_lock);
-+ return (pattern_result ^ info->invert);
-+ }
-+ strcpy(master_conntrack->layer7.app_proto, info->protocol);
-+ } else if(pattern_result > 1) { /* cleanup from "unset" */
-+ pattern_result = 1;
-+ }
-+
-+ /* mark the packet seen */
-+ skb->cb[0] = 1;
-+
-+ spin_unlock_bh(&l7_lock);
-+ return (pattern_result ^ info->invert);
-+}
-+
-+// load nf_conntrack_ipv4
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+static bool check(const struct xt_mtchk_param *par)
-+{
-+ if (nf_ct_l3proto_try_module_get(par->match->family) < 0) {
-+ printk(KERN_WARNING "can't load conntrack support for "
-+ "proto=%d\n", par->match->family);
-+#else
-+static bool check(const char *tablename, const void *inf,
-+ const struct xt_match *match, void *matchinfo,
-+ unsigned int hook_mask)
-+{
-+ if (nf_ct_l3proto_try_module_get(match->family) < 0) {
-+ printk(KERN_WARNING "can't load conntrack support for "
-+ "proto=%d\n", match->family);
-+#endif
-+ return 0;
-+ }
-+ return 1;
-+}
-+
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
-+ static void destroy(const struct xt_mtdtor_param *par)
-+ {
-+ nf_ct_l3proto_module_put(par->match->family);
-+ }
-+#else
-+ static void destroy(const struct xt_match *match, void *matchinfo)
-+ {
-+ nf_ct_l3proto_module_put(match->family);
-+ }
-+#endif
-+
-+static struct xt_match xt_layer7_match[] __read_mostly = {
-+{
-+ .name = "layer7",
-+ .family = AF_INET,
-+ .checkentry = check,
-+ .match = match,
-+ .destroy = destroy,
-+ .matchsize = sizeof(struct xt_layer7_info),
-+ .me = THIS_MODULE
-+}
-+};
-+
-+static void layer7_cleanup_proc(void)
-+{
-+ remove_proc_entry("layer7_numpackets", init_net.proc_net);
-+}
-+
-+/* register the proc file */
-+static void layer7_init_proc(void)
-+{
-+ struct proc_dir_entry* entry;
-+ entry = create_proc_entry("layer7_numpackets", 0644, init_net.proc_net);
-+ entry->read_proc = layer7_read_proc;
-+ entry->write_proc = layer7_write_proc;
-+}
-+
-+static int __init xt_layer7_init(void)
-+{
-+ need_conntrack();
-+
-+ layer7_init_proc();
-+ if(maxdatalen < 1) {
-+ printk(KERN_WARNING "layer7: maxdatalen can't be < 1, "
-+ "using 1\n");
-+ maxdatalen = 1;
-+ }
-+ /* This is not a hard limit. It's just here to prevent people from
-+ bringing their slow machines to a grinding halt. */
-+ else if(maxdatalen > 65536) {
-+ printk(KERN_WARNING "layer7: maxdatalen can't be > 65536, "
-+ "using 65536\n");
-+ maxdatalen = 65536;
-+ }
-+ return xt_register_matches(xt_layer7_match,
-+ ARRAY_SIZE(xt_layer7_match));
-+}
-+
-+static void __exit xt_layer7_fini(void)
-+{
-+ layer7_cleanup_proc();
-+ xt_unregister_matches(xt_layer7_match, ARRAY_SIZE(xt_layer7_match));
-+}
-+
-+module_init(xt_layer7_init);
-+module_exit(xt_layer7_fini);
+++ /dev/null
---- a/include/linux/netfilter/xt_layer7.h
-+++ b/include/linux/netfilter/xt_layer7.h
-@@ -8,6 +8,7 @@ struct xt_layer7_info {
- char protocol[MAX_PROTOCOL_LEN];
- char pattern[MAX_PATTERN_LEN];
- u_int8_t invert;
-+ u_int8_t pkt;
- };
-
- #endif /* _XT_LAYER7_H */
---- a/net/netfilter/xt_layer7.c
-+++ b/net/netfilter/xt_layer7.c
-@@ -314,33 +314,35 @@ static int match_no_append(struct nf_con
- }
-
- /* add the new app data to the conntrack. Return number of bytes added. */
--static int add_data(struct nf_conn * master_conntrack,
-- char * app_data, int appdatalen)
-+static int add_datastr(char *target, int offset, char *app_data, int len)
- {
- int length = 0, i;
-- int oldlength = master_conntrack->layer7.app_data_len;
--
-- /* This is a fix for a race condition by Deti Fliegl. However, I'm not
-- clear on whether the race condition exists or whether this really
-- fixes it. I might just be being dense... Anyway, if it's not really
-- a fix, all it does is waste a very small amount of time. */
-- if(!master_conntrack->layer7.app_data) return 0;
-+ if (!target) return 0;
-
- /* Strip nulls. Make everything lower case (our regex lib doesn't
- do case insensitivity). Add it to the end of the current data. */
-- for(i = 0; i < maxdatalen-oldlength-1 &&
-- i < appdatalen; i++) {
-+ for(i = 0; i < maxdatalen-offset-1 && i < len; i++) {
- if(app_data[i] != '\0') {
- /* the kernel version of tolower mungs 'upper ascii' */
-- master_conntrack->layer7.app_data[length+oldlength] =
-+ target[length+offset] =
- isascii(app_data[i])?
- tolower(app_data[i]) : app_data[i];
- length++;
- }
- }
-+ target[length+offset] = '\0';
-+
-+ return length;
-+}
-+
-+/* add the new app data to the conntrack. Return number of bytes added. */
-+static int add_data(struct nf_conn * master_conntrack,
-+ char * app_data, int appdatalen)
-+{
-+ int length;
-
-- master_conntrack->layer7.app_data[length+oldlength] = '\0';
-- master_conntrack->layer7.app_data_len = length + oldlength;
-+ length = add_datastr(master_conntrack->layer7.app_data, master_conntrack->layer7.app_data_len, app_data, appdatalen);
-+ master_conntrack->layer7.app_data_len += length;
-
- return length;
- }
-@@ -438,7 +440,7 @@ match(const struct sk_buff *skbin,
-
- enum ip_conntrack_info master_ctinfo, ctinfo;
- struct nf_conn *master_conntrack, *conntrack;
-- unsigned char * app_data;
-+ unsigned char *app_data, *tmp_data;
- unsigned int pattern_result, appdatalen;
- regexp * comppattern;
-
-@@ -466,8 +468,8 @@ match(const struct sk_buff *skbin,
- master_conntrack = master_ct(master_conntrack);
-
- /* if we've classified it or seen too many packets */
-- if(total_acct_packets(master_conntrack) > num_packets ||
-- master_conntrack->layer7.app_proto) {
-+ if(!info->pkt && (total_acct_packets(master_conntrack) > num_packets ||
-+ master_conntrack->layer7.app_proto)) {
-
- pattern_result = match_no_append(conntrack, master_conntrack,
- ctinfo, master_ctinfo, info);
-@@ -500,6 +502,25 @@ match(const struct sk_buff *skbin,
- /* the return value gets checked later, when we're ready to use it */
- comppattern = compile_and_cache(info->pattern, info->protocol);
-
-+ if (info->pkt) {
-+ tmp_data = kmalloc(maxdatalen, GFP_ATOMIC);
-+ if(!tmp_data){
-+ if (net_ratelimit())
-+ printk(KERN_ERR "layer7: out of memory in match, bailing.\n");
-+ return info->invert;
-+ }
-+
-+ tmp_data[0] = '\0';
-+ add_datastr(tmp_data, 0, app_data, appdatalen);
-+ pattern_result = ((comppattern && regexec(comppattern, tmp_data)) ? 1 : 0);
-+
-+ kfree(tmp_data);
-+ tmp_data = NULL;
-+ spin_unlock_bh(&l7_lock);
-+
-+ return (pattern_result ^ info->invert);
-+ }
-+
- /* On the first packet of a connection, allocate space for app data */
- if(total_acct_packets(master_conntrack) == 1 && !skb->cb[0] &&
- !master_conntrack->layer7.app_data){
+++ /dev/null
---- a/include/linux/netfilter_ipv4/ip_tables.h
-+++ b/include/linux/netfilter_ipv4/ip_tables.h
-@@ -62,6 +62,7 @@ struct ipt_ip {
- #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */
- #define IPT_F_GOTO 0x02 /* Set if jump is a goto */
- #define IPT_F_MASK 0x03 /* All possible flag bits mask. */
-+#define IPT_F_NO_DEF_MATCH 0x80 /* Internal: no default match rules present */
-
- /* Values for "inv" field in struct ipt_ip. */
- #define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -88,6 +88,9 @@ ip_packet_match(const struct iphdr *ip,
-
- #define FWINV(bool, invflg) ((bool) ^ !!(ipinfo->invflags & (invflg)))
-
-+ if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
-+ return true;
-+
- if (FWINV((ip->saddr&ipinfo->smsk.s_addr) != ipinfo->src.s_addr,
- IPT_INV_SRCIP) ||
- FWINV((ip->daddr&ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr,
-@@ -138,13 +141,35 @@ ip_packet_match(const struct iphdr *ip,
- return false;
- }
-
-+#undef FWINV
- return true;
- }
-
- static bool
--ip_checkentry(const struct ipt_ip *ip)
-+ip_checkentry(struct ipt_ip *ip)
- {
-- if (ip->flags & ~IPT_F_MASK) {
-+#define FWINV(bool, invflg) ((bool) || (ip->invflags & (invflg)))
-+
-+ if (FWINV(ip->smsk.s_addr, IPT_INV_SRCIP) ||
-+ FWINV(ip->dmsk.s_addr, IPT_INV_DSTIP))
-+ goto has_match_rules;
-+
-+ if (FWINV(!!((const unsigned long *)ip->iniface_mask)[0],
-+ IPT_INV_VIA_IN) ||
-+ FWINV(!!((const unsigned long *)ip->outiface_mask)[0],
-+ IPT_INV_VIA_OUT))
-+ goto has_match_rules;
-+
-+ if (FWINV(ip->proto, IPT_INV_PROTO))
-+ goto has_match_rules;
-+
-+ if (FWINV(ip->flags&IPT_F_FRAG, IPT_INV_FRAG))
-+ goto has_match_rules;
-+
-+ ip->flags |= IPT_F_NO_DEF_MATCH;
-+
-+has_match_rules:
-+ if (ip->flags & ~(IPT_F_MASK|IPT_F_NO_DEF_MATCH)) {
- duprintf("Unknown flag bits set: %08X\n",
- ip->flags & ~IPT_F_MASK);
- return false;
-@@ -154,6 +179,8 @@ ip_checkentry(const struct ipt_ip *ip)
- ip->invflags & ~IPT_INV_MASK);
- return false;
- }
-+
-+#undef FWINV
- return true;
- }
-
-@@ -196,7 +223,6 @@ static inline bool unconditional(const s
- static const struct ipt_ip uncond;
-
- return memcmp(ip, &uncond, sizeof(uncond)) == 0;
--#undef FWINV
- }
-
- #if defined(CONFIG_NETFILTER_XT_TARGET_TRACE) || \
-@@ -321,8 +347,28 @@ ipt_do_table(struct sk_buff *skb,
- struct xt_match_param mtpar;
- struct xt_target_param tgpar;
-
-- /* Initialization */
- ip = ip_hdr(skb);
-+
-+ IP_NF_ASSERT(table->valid_hooks & (1 << hook));
-+ xt_info_rdlock_bh();
-+ private = table->private;
-+ table_base = private->entries[smp_processor_id()];
-+ e = get_entry(table_base, private->hook_entry[hook]);
-+
-+ if (e->target_offset <= sizeof(struct ipt_entry) &&
-+ (e->ip.flags & IPT_F_NO_DEF_MATCH)) {
-+ struct ipt_entry_target *t = ipt_get_target(e);
-+ if (!t->u.kernel.target->target) {
-+ int v = ((struct ipt_standard_target *)t)->verdict;
-+ if ((v < 0) && (v != IPT_RETURN)) {
-+ ADD_COUNTER(e->counters, ntohs(ip->tot_len), 1);
-+ xt_info_rdunlock_bh();
-+ return (unsigned)(-v) - 1;
-+ }
-+ }
-+ }
-+
-+ /* Initialization */
- indev = in ? in->name : nulldevname;
- outdev = out ? out->name : nulldevname;
- /* We handle fragments by dealing with the first fragment as
-@@ -339,13 +385,6 @@ ipt_do_table(struct sk_buff *skb,
- mtpar.family = tgpar.family = NFPROTO_IPV4;
- mtpar.hooknum = tgpar.hooknum = hook;
-
-- IP_NF_ASSERT(table->valid_hooks & (1 << hook));
-- xt_info_rdlock_bh();
-- private = table->private;
-- table_base = private->entries[smp_processor_id()];
--
-- e = get_entry(table_base, private->hook_entry[hook]);
--
- /* For return from builtin chain */
- back = get_entry(table_base, private->underflow[hook]);
-
-@@ -992,6 +1031,7 @@ copy_entries_to_user(unsigned int total_
- unsigned int i;
- const struct ipt_entry_match *m;
- const struct ipt_entry_target *t;
-+ u8 flags;
-
- e = (struct ipt_entry *)(loc_cpu_entry + off);
- if (copy_to_user(userptr + off
-@@ -1002,6 +1042,14 @@ copy_entries_to_user(unsigned int total_
- goto free_counters;
- }
-
-+ flags = e->ip.flags & ~IPT_F_NO_DEF_MATCH;
-+ if (copy_to_user(userptr + off
-+ + offsetof(struct ipt_entry, ip.flags),
-+ &flags, sizeof(flags)) != 0) {
-+ ret = -EFAULT;
-+ goto free_counters;
-+ }
-+
- for (i = sizeof(struct ipt_entry);
- i < e->target_offset;
- i += m->u.match_size) {
+++ /dev/null
---- /dev/null
-+++ b/drivers/net/imq.c
-@@ -0,0 +1,632 @@
-+/*
-+ * Pseudo-driver for the intermediate queue device.
-+ *
-+ * 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.
-+ *
-+ * Authors: Patrick McHardy, <kaber@trash.net>
-+ *
-+ * The first version was written by Martin Devera, <devik@cdi.cz>
-+ *
-+ * Credits: Jan Rafaj <imq2t@cedric.vabo.cz>
-+ * - Update patch to 2.4.21
-+ * Sebastian Strollo <sstrollo@nortelnetworks.com>
-+ * - Fix "Dead-loop on netdevice imq"-issue
-+ * Marcel Sebek <sebek64@post.cz>
-+ * - Update to 2.6.2-rc1
-+ *
-+ * After some time of inactivity there is a group taking care
-+ * of IMQ again: http://www.linuximq.net
-+ *
-+ *
-+ * 2004/06/30 - New version of IMQ patch to kernels <=2.6.7
-+ * including the following changes:
-+ *
-+ * - Correction of ipv6 support "+"s issue (Hasso Tepper)
-+ * - Correction of imq_init_devs() issue that resulted in
-+ * kernel OOPS unloading IMQ as module (Norbert Buchmuller)
-+ * - Addition of functionality to choose number of IMQ devices
-+ * during kernel config (Andre Correa)
-+ * - Addition of functionality to choose how IMQ hooks on
-+ * PRE and POSTROUTING (after or before NAT) (Andre Correa)
-+ * - Cosmetic corrections (Norbert Buchmuller) (Andre Correa)
-+ *
-+ *
-+ * 2005/12/16 - IMQ versions between 2.6.7 and 2.6.13 were
-+ * released with almost no problems. 2.6.14-x was released
-+ * with some important changes: nfcache was removed; After
-+ * some weeks of trouble we figured out that some IMQ fields
-+ * in skb were missing in skbuff.c - skb_clone and copy_skb_header.
-+ * These functions are correctly patched by this new patch version.
-+ *
-+ * Thanks for all who helped to figure out all the problems with
-+ * 2.6.14.x: Patrick McHardy, Rune Kock, VeNoMouS, Max CtRiX,
-+ * Kevin Shanahan, Richard Lucassen, Valery Dachev (hopefully
-+ * I didn't forget anybody). I apologize again for my lack of time.
-+ *
-+ *
-+ * 2008/06/17 - 2.6.25 - Changed imq.c to use qdisc_run() instead
-+ * of qdisc_restart() and moved qdisc_run() to tasklet to avoid
-+ * recursive locking. New initialization routines to fix 'rmmod' not
-+ * working anymore. Used code from ifb.c. (Jussi Kivilinna)
-+ *
-+ * 2008/08/06 - 2.6.26 - (JK)
-+ * - Replaced tasklet with 'netif_schedule()'.
-+ * - Cleaned up and added comments for imq_nf_queue().
-+ *
-+ * 2009/04/12
-+ * - Add skb_save_cb/skb_restore_cb helper functions for backuping
-+ * control buffer. This is needed because qdisc-layer on kernels
-+ * 2.6.27 and newer overwrite control buffer. (Jussi Kivilinna)
-+ * - Add better locking for IMQ device. Hopefully this will solve
-+ * SMP issues. (Jussi Kivilinna)
-+ * - Port to 2.6.27
-+ * - Port to 2.6.28
-+ * - Port to 2.6.29 + fix rmmod not working
-+ *
-+ * 2009/04/20 - (Jussi Kivilinna)
-+ * - Use netdevice feature flags to avoid extra packet handling
-+ * by core networking layer and possibly increase performance.
-+ *
-+ * 2009/09/26 - (Jussi Kivilinna)
-+ * - Add imq_nf_reinject_lockless to fix deadlock with
-+ * imq_nf_queue/imq_nf_reinject.
-+ *
-+ * 2009/12/08 - (Jussi Kivilinna)
-+ * - Port to 2.6.32
-+ * - Add check for skb->nf_queue_entry==NULL in imq_dev_xmit()
-+ * - Also add better error checking for skb->nf_queue_entry usage
-+ *
-+ * Also, many thanks to pablo Sebastian Greco for making the initial
-+ * patch and to those who helped the testing.
-+ *
-+ * More info at: http://www.linuximq.net/ (Andre Correa)
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/moduleparam.h>
-+#include <linux/list.h>
-+#include <linux/skbuff.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/rtnetlink.h>
-+#include <linux/if_arp.h>
-+#include <linux/netfilter.h>
-+#include <linux/netfilter_ipv4.h>
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ #include <linux/netfilter_ipv6.h>
-+#endif
-+#include <linux/imq.h>
-+#include <net/pkt_sched.h>
-+#include <net/netfilter/nf_queue.h>
-+
-+static nf_hookfn imq_nf_hook;
-+
-+static struct nf_hook_ops imq_ingress_ipv4 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET,
-+ .hooknum = NF_INET_PRE_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ .priority = NF_IP_PRI_MANGLE + 1
-+#else
-+ .priority = NF_IP_PRI_NAT_DST + 1
-+#endif
-+};
-+
-+static struct nf_hook_ops imq_egress_ipv4 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET,
-+ .hooknum = NF_INET_POST_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_AA) || defined(CONFIG_IMQ_BEHAVIOR_BA)
-+ .priority = NF_IP_PRI_LAST
-+#else
-+ .priority = NF_IP_PRI_NAT_SRC - 1
-+#endif
-+};
-+
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+static struct nf_hook_ops imq_ingress_ipv6 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET6,
-+ .hooknum = NF_INET_PRE_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ .priority = NF_IP6_PRI_MANGLE + 1
-+#else
-+ .priority = NF_IP6_PRI_NAT_DST + 1
-+#endif
-+};
-+
-+static struct nf_hook_ops imq_egress_ipv6 = {
-+ .hook = imq_nf_hook,
-+ .owner = THIS_MODULE,
-+ .pf = PF_INET6,
-+ .hooknum = NF_INET_POST_ROUTING,
-+#if defined(CONFIG_IMQ_BEHAVIOR_AA) || defined(CONFIG_IMQ_BEHAVIOR_BA)
-+ .priority = NF_IP6_PRI_LAST
-+#else
-+ .priority = NF_IP6_PRI_NAT_SRC - 1
-+#endif
-+};
-+#endif
-+
-+#if defined(CONFIG_IMQ_NUM_DEVS)
-+static unsigned int numdevs = CONFIG_IMQ_NUM_DEVS;
-+#else
-+static unsigned int numdevs = IMQ_MAX_DEVS;
-+#endif
-+
-+static DEFINE_SPINLOCK(imq_nf_queue_lock);
-+
-+static struct net_device *imq_devs_cache[IMQ_MAX_DEVS];
-+
-+
-+static struct net_device_stats *imq_get_stats(struct net_device *dev)
-+{
-+ return &dev->stats;
-+}
-+
-+/* called for packets kfree'd in qdiscs at places other than enqueue */
-+static void imq_skb_destructor(struct sk_buff *skb)
-+{
-+ struct nf_queue_entry *entry = skb->nf_queue_entry;
-+
-+ skb->nf_queue_entry = NULL;
-+
-+ if (entry) {
-+ nf_queue_entry_release_refs(entry);
-+ kfree(entry);
-+ }
-+
-+ skb_restore_cb(skb); /* kfree backup */
-+}
-+
-+/* locking not needed when called from imq_nf_queue */
-+static void imq_nf_reinject_lockless(struct nf_queue_entry *entry,
-+ unsigned int verdict)
-+{
-+ int status;
-+
-+ if (!entry->next_outfn) {
-+ nf_reinject(entry, verdict);
-+ return;
-+ }
-+
-+ status = entry->next_outfn(entry, entry->next_queuenum);
-+ if (status < 0) {
-+ nf_queue_entry_release_refs(entry);
-+ kfree_skb(entry->skb);
-+ kfree(entry);
-+ }
-+}
-+
-+static void imq_nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
-+{
-+ int status;
-+
-+ if (!entry->next_outfn) {
-+ spin_lock_bh(&imq_nf_queue_lock);
-+ nf_reinject(entry, verdict);
-+ spin_unlock_bh(&imq_nf_queue_lock);
-+ return;
-+ }
-+
-+ rcu_read_lock();
-+ local_bh_disable();
-+ status = entry->next_outfn(entry, entry->next_queuenum);
-+ local_bh_enable();
-+ if (status < 0) {
-+ nf_queue_entry_release_refs(entry);
-+ kfree_skb(entry->skb);
-+ kfree(entry);
-+ }
-+
-+ rcu_read_unlock();
-+}
-+
-+static netdev_tx_t imq_dev_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+ struct nf_queue_entry *entry = skb->nf_queue_entry;
-+
-+ skb->nf_queue_entry = NULL;
-+ dev->trans_start = jiffies;
-+
-+ dev->stats.tx_bytes += skb->len;
-+ dev->stats.tx_packets++;
-+
-+ if (entry == NULL) {
-+ /* We don't know what is going on here.. packet is queued for
-+ * imq device, but (probably) not by us.
-+ *
-+ * If this packet was not send here by imq_nf_queue(), then
-+ * skb_save_cb() was not used and skb_free() should not show:
-+ * WARNING: IMQ: kfree_skb: skb->cb_next:..
-+ * and/or
-+ * WARNING: IMQ: kfree_skb: skb->nf_queue_entry...
-+ *
-+ * However if this message is shown, then IMQ is somehow broken
-+ * and you should report this to linuximq.net.
-+ */
-+
-+ /* imq_dev_xmit is black hole that eats all packets, report that
-+ * we eat this packet happily and increase dropped counters.
-+ */
-+
-+ dev->stats.tx_dropped++;
-+ dev_kfree_skb(skb);
-+
-+ return NETDEV_TX_OK;
-+ }
-+
-+ skb_restore_cb(skb); /* restore skb->cb */
-+
-+ skb->imq_flags = 0;
-+ skb->destructor = NULL;
-+
-+ imq_nf_reinject(entry, NF_ACCEPT);
-+
-+ return NETDEV_TX_OK;
-+}
-+
-+static int imq_nf_queue(struct nf_queue_entry *entry, unsigned queue_num)
-+{
-+ struct net_device *dev;
-+ struct sk_buff *skb_orig, *skb, *skb_shared;
-+ struct Qdisc *q;
-+ struct netdev_queue *txq;
-+ int users, index;
-+ int retval = -EINVAL;
-+
-+ index = entry->skb->imq_flags & IMQ_F_IFMASK;
-+ if (unlikely(index > numdevs - 1)) {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING
-+ "IMQ: invalid device specified, highest is %u\n",
-+ numdevs - 1);
-+ retval = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* check for imq device by index from cache */
-+ dev = imq_devs_cache[index];
-+ if (unlikely(!dev)) {
-+ char buf[8];
-+
-+ /* get device by name and cache result */
-+ snprintf(buf, sizeof(buf), "imq%d", index);
-+ dev = dev_get_by_name(&init_net, buf);
-+ if (!dev) {
-+ /* not found ?!*/
-+ BUG();
-+ retval = -ENODEV;
-+ goto out;
-+ }
-+
-+ imq_devs_cache[index] = dev;
-+ dev_put(dev);
-+ }
-+
-+ if (unlikely(!(dev->flags & IFF_UP))) {
-+ entry->skb->imq_flags = 0;
-+ imq_nf_reinject_lockless(entry, NF_ACCEPT);
-+ retval = 0;
-+ goto out;
-+ }
-+ dev->last_rx = jiffies;
-+
-+ skb = entry->skb;
-+ skb_orig = NULL;
-+
-+ /* skb has owner? => make clone */
-+ if (unlikely(skb->destructor)) {
-+ skb_orig = skb;
-+ skb = skb_clone(skb, GFP_ATOMIC);
-+ if (!skb) {
-+ retval = -ENOMEM;
-+ goto out;
-+ }
-+ entry->skb = skb;
-+ }
-+
-+ skb->nf_queue_entry = entry;
-+
-+ dev->stats.rx_bytes += skb->len;
-+ dev->stats.rx_packets++;
-+
-+ txq = dev_pick_tx(dev, skb);
-+
-+ q = rcu_dereference(txq->qdisc);
-+ if (unlikely(!q->enqueue))
-+ goto packet_not_eaten_by_imq_dev;
-+
-+ spin_lock_bh(qdisc_lock(q));
-+
-+ users = atomic_read(&skb->users);
-+
-+ skb_shared = skb_get(skb); /* increase reference count by one */
-+ skb_save_cb(skb_shared); /* backup skb->cb, as qdisc layer will
-+ overwrite it */
-+ qdisc_enqueue_root(skb_shared, q); /* might kfree_skb */
-+
-+ if (likely(atomic_read(&skb_shared->users) == users + 1)) {
-+ kfree_skb(skb_shared); /* decrease reference count by one */
-+
-+ skb->destructor = &imq_skb_destructor;
-+
-+ /* cloned? */
-+ if (skb_orig)
-+ kfree_skb(skb_orig); /* free original */
-+
-+ spin_unlock_bh(qdisc_lock(q));
-+
-+ /* schedule qdisc dequeue */
-+ __netif_schedule(q);
-+
-+ retval = 0;
-+ goto out;
-+ } else {
-+ skb_restore_cb(skb_shared); /* restore skb->cb */
-+ skb->nf_queue_entry = NULL;
-+ /* qdisc dropped packet and decreased skb reference count of
-+ * skb, so we don't really want to and try refree as that would
-+ * actually destroy the skb. */
-+ spin_unlock_bh(qdisc_lock(q));
-+ goto packet_not_eaten_by_imq_dev;
-+ }
-+
-+packet_not_eaten_by_imq_dev:
-+ /* cloned? restore original */
-+ if (skb_orig) {
-+ kfree_skb(skb);
-+ entry->skb = skb_orig;
-+ }
-+ retval = -1;
-+out:
-+ return retval;
-+}
-+
-+static struct nf_queue_handler nfqh = {
-+ .name = "imq",
-+ .outfn = imq_nf_queue,
-+};
-+
-+static unsigned int imq_nf_hook(unsigned int hook, struct sk_buff *pskb,
-+ const struct net_device *indev,
-+ const struct net_device *outdev,
-+ int (*okfn)(struct sk_buff *))
-+{
-+ if (pskb->imq_flags & IMQ_F_ENQUEUE)
-+ return NF_QUEUE;
-+
-+ return NF_ACCEPT;
-+}
-+
-+static int imq_close(struct net_device *dev)
-+{
-+ netif_stop_queue(dev);
-+ return 0;
-+}
-+
-+static int imq_open(struct net_device *dev)
-+{
-+ netif_start_queue(dev);
-+ return 0;
-+}
-+
-+static const struct net_device_ops imq_netdev_ops = {
-+ .ndo_open = imq_open,
-+ .ndo_stop = imq_close,
-+ .ndo_start_xmit = imq_dev_xmit,
-+ .ndo_get_stats = imq_get_stats,
-+};
-+
-+static void imq_setup(struct net_device *dev)
-+{
-+ dev->netdev_ops = &imq_netdev_ops;
-+ dev->type = ARPHRD_VOID;
-+ dev->mtu = 16000;
-+ dev->tx_queue_len = 11000;
-+ dev->flags = IFF_NOARP;
-+ dev->features = NETIF_F_SG | NETIF_F_FRAGLIST |
-+ NETIF_F_GSO | NETIF_F_HW_CSUM |
-+ NETIF_F_HIGHDMA;
-+ dev->priv_flags &= ~IFF_XMIT_DST_RELEASE;
-+}
-+
-+static int imq_validate(struct nlattr *tb[], struct nlattr *data[])
-+{
-+ int ret = 0;
-+
-+ if (tb[IFLA_ADDRESS]) {
-+ if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN) {
-+ ret = -EINVAL;
-+ goto end;
-+ }
-+ if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS]))) {
-+ ret = -EADDRNOTAVAIL;
-+ goto end;
-+ }
-+ }
-+ return 0;
-+end:
-+ printk(KERN_WARNING "IMQ: imq_validate failed (%d)\n", ret);
-+ return ret;
-+}
-+
-+static struct rtnl_link_ops imq_link_ops __read_mostly = {
-+ .kind = "imq",
-+ .priv_size = 0,
-+ .setup = imq_setup,
-+ .validate = imq_validate,
-+};
-+
-+static int __init imq_init_hooks(void)
-+{
-+ int err;
-+
-+ nf_register_queue_imq_handler(&nfqh);
-+
-+ err = nf_register_hook(&imq_ingress_ipv4);
-+ if (err)
-+ goto err1;
-+
-+ err = nf_register_hook(&imq_egress_ipv4);
-+ if (err)
-+ goto err2;
-+
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ err = nf_register_hook(&imq_ingress_ipv6);
-+ if (err)
-+ goto err3;
-+
-+ err = nf_register_hook(&imq_egress_ipv6);
-+ if (err)
-+ goto err4;
-+#endif
-+
-+ return 0;
-+
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+err4:
-+ nf_unregister_hook(&imq_ingress_ipv6);
-+err3:
-+ nf_unregister_hook(&imq_egress_ipv4);
-+#endif
-+err2:
-+ nf_unregister_hook(&imq_ingress_ipv4);
-+err1:
-+ nf_unregister_queue_imq_handler();
-+ return err;
-+}
-+
-+static int __init imq_init_one(int index)
-+{
-+ struct net_device *dev;
-+ int ret;
-+
-+ dev = alloc_netdev(0, "imq%d", imq_setup);
-+ if (!dev)
-+ return -ENOMEM;
-+
-+ ret = dev_alloc_name(dev, dev->name);
-+ if (ret < 0)
-+ goto fail;
-+
-+ dev->rtnl_link_ops = &imq_link_ops;
-+ ret = register_netdevice(dev);
-+ if (ret < 0)
-+ goto fail;
-+
-+ return 0;
-+fail:
-+ free_netdev(dev);
-+ return ret;
-+}
-+
-+static int __init imq_init_devs(void)
-+{
-+ int err, i;
-+
-+ if (numdevs < 1 || numdevs > IMQ_MAX_DEVS) {
-+ printk(KERN_ERR "IMQ: numdevs has to be betweed 1 and %u\n",
-+ IMQ_MAX_DEVS);
-+ return -EINVAL;
-+ }
-+
-+ rtnl_lock();
-+ err = __rtnl_link_register(&imq_link_ops);
-+
-+ for (i = 0; i < numdevs && !err; i++)
-+ err = imq_init_one(i);
-+
-+ if (err) {
-+ __rtnl_link_unregister(&imq_link_ops);
-+ memset(imq_devs_cache, 0, sizeof(imq_devs_cache));
-+ }
-+ rtnl_unlock();
-+
-+ return err;
-+}
-+
-+static int __init imq_init_module(void)
-+{
-+ int err;
-+
-+#if defined(CONFIG_IMQ_NUM_DEVS)
-+ BUILD_BUG_ON(CONFIG_IMQ_NUM_DEVS > 16);
-+ BUILD_BUG_ON(CONFIG_IMQ_NUM_DEVS < 2);
-+ BUILD_BUG_ON(CONFIG_IMQ_NUM_DEVS - 1 > IMQ_F_IFMASK);
-+#endif
-+
-+ err = imq_init_devs();
-+ if (err) {
-+ printk(KERN_ERR "IMQ: Error trying imq_init_devs(net)\n");
-+ return err;
-+ }
-+
-+ err = imq_init_hooks();
-+ if (err) {
-+ printk(KERN_ERR "IMQ: Error trying imq_init_hooks()\n");
-+ rtnl_link_unregister(&imq_link_ops);
-+ memset(imq_devs_cache, 0, sizeof(imq_devs_cache));
-+ return err;
-+ }
-+
-+ printk(KERN_INFO "IMQ driver loaded successfully.\n");
-+
-+#if defined(CONFIG_IMQ_BEHAVIOR_BA) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ printk(KERN_INFO "\tHooking IMQ before NAT on PREROUTING.\n");
-+#else
-+ printk(KERN_INFO "\tHooking IMQ after NAT on PREROUTING.\n");
-+#endif
-+#if defined(CONFIG_IMQ_BEHAVIOR_AB) || defined(CONFIG_IMQ_BEHAVIOR_BB)
-+ printk(KERN_INFO "\tHooking IMQ before NAT on POSTROUTING.\n");
-+#else
-+ printk(KERN_INFO "\tHooking IMQ after NAT on POSTROUTING.\n");
-+#endif
-+
-+ return 0;
-+}
-+
-+static void __exit imq_unhook(void)
-+{
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ nf_unregister_hook(&imq_ingress_ipv6);
-+ nf_unregister_hook(&imq_egress_ipv6);
-+#endif
-+ nf_unregister_hook(&imq_ingress_ipv4);
-+ nf_unregister_hook(&imq_egress_ipv4);
-+
-+ nf_unregister_queue_imq_handler();
-+}
-+
-+static void __exit imq_cleanup_devs(void)
-+{
-+ rtnl_link_unregister(&imq_link_ops);
-+ memset(imq_devs_cache, 0, sizeof(imq_devs_cache));
-+}
-+
-+static void __exit imq_exit_module(void)
-+{
-+ imq_unhook();
-+ imq_cleanup_devs();
-+ printk(KERN_INFO "IMQ driver unloaded successfully.\n");
-+}
-+
-+module_init(imq_init_module);
-+module_exit(imq_exit_module);
-+
-+module_param(numdevs, int, 0);
-+MODULE_PARM_DESC(numdevs, "number of IMQ devices (how many imq* devices will "
-+ "be created)");
-+MODULE_AUTHOR("http://www.linuximq.net");
-+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See "
-+ "http://www.linuximq.net/ for more information.");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS_RTNL_LINK("imq");
-+
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -109,6 +109,129 @@ config EQUALIZER
- To compile this driver as a module, choose M here: the module
- will be called eql. If unsure, say N.
-
-+config IMQ
-+ tristate "IMQ (intermediate queueing device) support"
-+ depends on NETDEVICES && NETFILTER
-+ ---help---
-+ The IMQ device(s) is used as placeholder for QoS queueing
-+ disciplines. Every packet entering/leaving the IP stack can be
-+ directed through the IMQ device where it's enqueued/dequeued to the
-+ attached qdisc. This allows you to treat network devices as classes
-+ and distribute bandwidth among them. Iptables is used to specify
-+ through which IMQ device, if any, packets travel.
-+
-+ More information at: http://www.linuximq.net/
-+
-+ To compile this driver as a module, choose M here: the module
-+ will be called imq. If unsure, say N.
-+
-+choice
-+ prompt "IMQ behavior (PRE/POSTROUTING)"
-+ depends on IMQ
-+ default IMQ_BEHAVIOR_AB
-+ help
-+
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ IMQ can work in any of the following ways:
-+
-+ PREROUTING | POSTROUTING
-+ -----------------|-------------------
-+ #1 After NAT | After NAT
-+ #2 After NAT | Before NAT
-+ #3 Before NAT | After NAT
-+ #4 Before NAT | Before NAT
-+
-+ The default behavior is to hook before NAT on PREROUTING
-+ and after NAT on POSTROUTING (#3).
-+
-+ This settings are specially usefull when trying to use IMQ
-+ to shape NATed clients.
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_AA
-+ bool "IMQ AA"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: After NAT
-+ POSTROUTING: After NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_AB
-+ bool "IMQ AB"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: After NAT
-+ POSTROUTING: Before NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_BA
-+ bool "IMQ BA"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: Before NAT
-+ POSTROUTING: After NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+config IMQ_BEHAVIOR_BB
-+ bool "IMQ BB"
-+ help
-+ This settings defines how IMQ behaves in respect to its
-+ hooking in PREROUTING and POSTROUTING.
-+
-+ Choosing this option will make IMQ hook like this:
-+
-+ PREROUTING: Before NAT
-+ POSTROUTING: Before NAT
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
-+endchoice
-+
-+config IMQ_NUM_DEVS
-+
-+ int "Number of IMQ devices"
-+ range 2 16
-+ depends on IMQ
-+ default "16"
-+ help
-+
-+ This settings defines how many IMQ devices will be
-+ created.
-+
-+ The default value is 16.
-+
-+ More information can be found at: www.linuximq.net
-+
-+ If not sure leave the default settings alone.
-+
- config TUN
- tristate "Universal TUN/TAP device driver support"
- select CRC32
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -165,6 +165,7 @@ obj-$(CONFIG_SLHC) += slhc.o
- obj-$(CONFIG_XEN_NETDEV_FRONTEND) += xen-netfront.o
-
- obj-$(CONFIG_DUMMY) += dummy.o
-+obj-$(CONFIG_IMQ) += imq.o
- obj-$(CONFIG_IFB) += ifb.o
- obj-$(CONFIG_MACVLAN) += macvlan.o
- obj-$(CONFIG_DE600) += de600.o
---- /dev/null
-+++ b/include/linux/imq.h
-@@ -0,0 +1,13 @@
-+#ifndef _IMQ_H
-+#define _IMQ_H
-+
-+/* IFMASK (16 device indexes, 0 to 15) and flag(s) fit in 5 bits */
-+#define IMQ_F_BITS 5
-+
-+#define IMQ_F_IFMASK 0x0f
-+#define IMQ_F_ENQUEUE 0x10
-+
-+#define IMQ_MAX_DEVS (IMQ_F_IFMASK + 1)
-+
-+#endif /* _IMQ_H */
-+
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -1168,6 +1168,7 @@ extern int dev_alloc_name(struct net_de
- extern int dev_open(struct net_device *dev);
- extern int dev_close(struct net_device *dev);
- extern void dev_disable_lro(struct net_device *dev);
-+extern struct netdev_queue *dev_pick_tx(struct net_device *dev, struct sk_buff *skb);
- extern int dev_queue_xmit(struct sk_buff *skb);
- extern int register_netdevice(struct net_device *dev);
- extern void unregister_netdevice_queue(struct net_device *dev,
---- /dev/null
-+++ b/include/linux/netfilter/xt_IMQ.h
-@@ -0,0 +1,9 @@
-+#ifndef _XT_IMQ_H
-+#define _XT_IMQ_H
-+
-+struct xt_imq_info {
-+ unsigned int todev; /* target imq device */
-+};
-+
-+#endif /* _XT_IMQ_H */
-+
---- /dev/null
-+++ b/include/linux/netfilter_ipv4/ipt_IMQ.h
-@@ -0,0 +1,10 @@
-+#ifndef _IPT_IMQ_H
-+#define _IPT_IMQ_H
-+
-+/* Backwards compatibility for old userspace */
-+#include <linux/netfilter/xt_IMQ.h>
-+
-+#define ipt_imq_info xt_imq_info
-+
-+#endif /* _IPT_IMQ_H */
-+
---- /dev/null
-+++ b/include/linux/netfilter_ipv6/ip6t_IMQ.h
-@@ -0,0 +1,10 @@
-+#ifndef _IP6T_IMQ_H
-+#define _IP6T_IMQ_H
-+
-+/* Backwards compatibility for old userspace */
-+#include <linux/netfilter/xt_IMQ.h>
-+
-+#define ip6t_imq_info xt_imq_info
-+
-+#endif /* _IP6T_IMQ_H */
-+
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -29,6 +29,9 @@
- #include <linux/rcupdate.h>
- #include <linux/dmaengine.h>
- #include <linux/hrtimer.h>
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+#include <linux/imq.h>
-+#endif
-
- /* Don't change this without changing skb_csum_unnecessary! */
- #define CHECKSUM_NONE 0
-@@ -327,6 +330,9 @@
- * first. This is owned by whoever has the skb queued ATM.
- */
- char cb[48] __aligned(8);
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ void *cb_next;
-+#endif
-
- unsigned long _skb_dst;
- #ifdef CONFIG_XFRM
-@@ -363,6 +369,9 @@
- struct nf_conntrack *nfct;
- struct sk_buff *nfct_reasm;
- #endif
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ struct nf_queue_entry *nf_queue_entry;
-+#endif
- #ifdef CONFIG_BRIDGE_NETFILTER
- struct nf_bridge_info *nf_bridge;
- #endif
-@@ -384,6 +393,10 @@
-
- /* 0/14 bit hole */
-
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ __u8 imq_flags:IMQ_F_BITS;
-+#endif
-+
- #ifdef CONFIG_NET_DMA
- dma_cookie_t dma_cookie;
- #endif
-@@ -432,6 +445,12 @@
- return (struct rtable *)skb_dst(skb);
- }
-
-+
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+extern int skb_save_cb(struct sk_buff *skb);
-+extern int skb_restore_cb(struct sk_buff *skb);
-+#endif
-+
- extern void kfree_skb(struct sk_buff *skb);
- extern void consume_skb(struct sk_buff *skb);
- extern void __kfree_skb(struct sk_buff *skb);
-@@ -1976,6 +1995,10 @@
- dst->nfct_reasm = src->nfct_reasm;
- nf_conntrack_get_reasm(src->nfct_reasm);
- #endif
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ dst->imq_flags = src->imq_flags;
-+ dst->nf_queue_entry = src->nf_queue_entry;
-+#endif
- #ifdef CONFIG_BRIDGE_NETFILTER
- dst->nf_bridge = src->nf_bridge;
- nf_bridge_get(src->nf_bridge);
---- a/include/net/netfilter/nf_queue.h
-+++ b/include/net/netfilter/nf_queue.h
-@@ -13,6 +13,12 @@ struct nf_queue_entry {
- struct net_device *indev;
- struct net_device *outdev;
- int (*okfn)(struct sk_buff *);
-+
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ int (*next_outfn)(struct nf_queue_entry *entry,
-+ unsigned int queuenum);
-+ unsigned int next_queuenum;
-+#endif
- };
-
- #define nf_queue_entry_reroute(x) ((void *)x + sizeof(struct nf_queue_entry))
-@@ -30,5 +36,11 @@ extern int nf_unregister_queue_handler(u
- const struct nf_queue_handler *qh);
- extern void nf_unregister_queue_handlers(const struct nf_queue_handler *qh);
- extern void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict);
-+extern void nf_queue_entry_release_refs(struct nf_queue_entry *entry);
-+
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+extern void nf_register_queue_imq_handler(const struct nf_queue_handler *qh);
-+extern void nf_unregister_queue_imq_handler(void);
-+#endif
-
- #endif /* _NF_QUEUE_H */
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -97,6 +97,9 @@
- #include <net/net_namespace.h>
- #include <net/sock.h>
- #include <linux/rtnetlink.h>
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+#include <linux/imq.h>
-+#endif
- #include <linux/proc_fs.h>
- #include <linux/seq_file.h>
- #include <linux/stat.h>
-@@ -1810,7 +1813,11 @@ int dev_hard_start_xmit(struct sk_buff *
- int rc = NETDEV_TX_OK;
-
- if (likely(!skb->next)) {
-- if (!list_empty(&ptype_all))
-+ if (!list_empty(&ptype_all)
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ && !(skb->imq_flags & IMQ_F_ENQUEUE)
-+#endif
-+ )
- dev_queue_xmit_nit(skb, dev);
-
- if (netif_needs_gso(dev, skb)) {
-@@ -1912,8 +1919,7 @@ static inline u16 dev_cap_txqueue(struct
- return queue_index;
- }
-
--static struct netdev_queue *dev_pick_tx(struct net_device *dev,
-- struct sk_buff *skb)
-+struct netdev_queue *dev_pick_tx(struct net_device *dev, struct sk_buff *skb)
- {
- u16 queue_index;
- struct sock *sk = skb->sk;
-@@ -1939,6 +1945,7 @@ static struct netdev_queue *dev_pick_tx(
- skb_set_queue_mapping(skb, queue_index);
- return netdev_get_tx_queue(dev, queue_index);
- }
-+EXPORT_SYMBOL(dev_pick_tx);
-
- static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q,
- struct net_device *dev,
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
-@@ -72,6 +72,9 @@
-
- static struct kmem_cache *skbuff_head_cache __read_mostly;
- static struct kmem_cache *skbuff_fclone_cache __read_mostly;
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+static struct kmem_cache *skbuff_cb_store_cache __read_mostly;
-+#endif
-
- static void sock_pipe_buf_release(struct pipe_inode_info *pipe,
- struct pipe_buffer *buf)
-@@ -91,6 +94,83 @@ static int sock_pipe_buf_steal(struct pi
- return 1;
- }
-
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+/* Control buffer save/restore for IMQ devices */
-+struct skb_cb_table {
-+ void *cb_next;
-+ atomic_t refcnt;
-+ char cb[48];
-+};
-+
-+static DEFINE_SPINLOCK(skb_cb_store_lock);
-+
-+int skb_save_cb(struct sk_buff *skb)
-+{
-+ struct skb_cb_table *next;
-+
-+ next = kmem_cache_alloc(skbuff_cb_store_cache, GFP_ATOMIC);
-+ if (!next)
-+ return -ENOMEM;
-+
-+ BUILD_BUG_ON(sizeof(skb->cb) != sizeof(next->cb));
-+
-+ memcpy(next->cb, skb->cb, sizeof(skb->cb));
-+ next->cb_next = skb->cb_next;
-+
-+ atomic_set(&next->refcnt, 1);
-+
-+ skb->cb_next = next;
-+ return 0;
-+}
-+EXPORT_SYMBOL(skb_save_cb);
-+
-+int skb_restore_cb(struct sk_buff *skb)
-+{
-+ struct skb_cb_table *next;
-+
-+ if (!skb->cb_next)
-+ return 0;
-+
-+ next = skb->cb_next;
-+
-+ BUILD_BUG_ON(sizeof(skb->cb) != sizeof(next->cb));
-+
-+ memcpy(skb->cb, next->cb, sizeof(skb->cb));
-+ skb->cb_next = next->cb_next;
-+
-+ spin_lock(&skb_cb_store_lock);
-+
-+ if (atomic_dec_and_test(&next->refcnt)) {
-+ kmem_cache_free(skbuff_cb_store_cache, next);
-+ }
-+
-+ spin_unlock(&skb_cb_store_lock);
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL(skb_restore_cb);
-+
-+static void skb_copy_stored_cb(struct sk_buff *new, const struct sk_buff *__old)
-+{
-+ struct skb_cb_table *next;
-+ struct sk_buff *old;
-+
-+ if (!__old->cb_next) {
-+ new->cb_next = NULL;
-+ return;
-+ }
-+
-+ spin_lock(&skb_cb_store_lock);
-+
-+ old = (struct sk_buff *)__old;
-+
-+ next = old->cb_next;
-+ atomic_inc(&next->refcnt);
-+ new->cb_next = next;
-+
-+ spin_unlock(&skb_cb_store_lock);
-+}
-+#endif
-
- /* Pipe buffer operations for a socket. */
- static const struct pipe_buf_operations sock_pipe_buf_ops = {
-@@ -398,6 +478,26 @@ static void skb_release_head_state(struc
- WARN_ON(in_irq());
- skb->destructor(skb);
- }
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ /* This should not happen. When it does, avoid memleak by restoring
-+ the chain of cb-backups. */
-+ while(skb->cb_next != NULL) {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "IMQ: kfree_skb: skb->cb_next: "
-+ "%08x\n", (unsigned int)skb->cb_next);
-+
-+ skb_restore_cb(skb);
-+ }
-+ /* This should not happen either, nf_queue_entry is nullified in
-+ * imq_dev_xmit(). If we have non-NULL nf_queue_entry then we are
-+ * leaking entry pointers, maybe memory. We don't know if this is
-+ * pointer to already freed memory, or should this be freed.
-+ * If this happens we need to add refcounting, etc for nf_queue_entry.
-+ */
-+ if (skb->nf_queue_entry && net_ratelimit())
-+ printk(KERN_WARNING
-+ "IMQ: kfree_skb: skb->nf_queue_entry != NULL");
-+#endif
- #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
- nf_conntrack_put(skb->nfct);
- nf_conntrack_put_reasm(skb->nfct_reasm);
-@@ -538,6 +638,9 @@ static void __copy_skb_header(struct sk_
- new->sp = secpath_get(old->sp);
- #endif
- memcpy(new->cb, old->cb, sizeof(old->cb));
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ skb_copy_stored_cb(new, old);
-+#endif
- new->csum = old->csum;
- new->local_df = old->local_df;
- new->pkt_type = old->pkt_type;
-@@ -2779,6 +2882,13 @@ void __init skb_init(void)
- 0,
- SLAB_HWCACHE_ALIGN|SLAB_PANIC,
- NULL);
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ skbuff_cb_store_cache = kmem_cache_create("skbuff_cb_store_cache",
-+ sizeof(struct skb_cb_table),
-+ 0,
-+ SLAB_HWCACHE_ALIGN|SLAB_PANIC,
-+ NULL);
-+#endif
- }
-
- /**
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -396,6 +396,18 @@ config NETFILTER_XT_TARGET_LED
- For more information on the LEDs available on your system, see
- Documentation/leds-class.txt
-
-+config NETFILTER_XT_TARGET_IMQ
-+ tristate '"IMQ" target support'
-+ depends on NETFILTER_XTABLES
-+ depends on IP_NF_MANGLE || IP6_NF_MANGLE
-+ select IMQ
-+ default m if NETFILTER_ADVANCED=n
-+ help
-+ This option adds a `IMQ' target which is used to specify if and
-+ to which imq device packets should get enqueued/dequeued.
-+
-+ To compile it as a module, choose M here. If unsure, say N.
-+
- config NETFILTER_XT_TARGET_MARK
- tristate '"MARK" target support'
- default m if NETFILTER_ADVANCED=n
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -46,6 +46,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CONNMAR
- obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_HL) += xt_HL.o
-+obj-$(CONFIG_NETFILTER_XT_TARGET_IMQ) += xt_IMQ.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_MARK) += xt_MARK.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_NFLOG) += xt_NFLOG.o
---- a/net/netfilter/nf_queue.c
-+++ b/net/netfilter/nf_queue.c
-@@ -20,6 +20,26 @@ static const struct nf_queue_handler *qu
-
- static DEFINE_MUTEX(queue_handler_mutex);
-
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+static const struct nf_queue_handler *queue_imq_handler;
-+
-+void nf_register_queue_imq_handler(const struct nf_queue_handler *qh)
-+{
-+ mutex_lock(&queue_handler_mutex);
-+ rcu_assign_pointer(queue_imq_handler, qh);
-+ mutex_unlock(&queue_handler_mutex);
-+}
-+EXPORT_SYMBOL(nf_register_queue_imq_handler);
-+
-+void nf_unregister_queue_imq_handler(void)
-+{
-+ mutex_lock(&queue_handler_mutex);
-+ rcu_assign_pointer(queue_imq_handler, NULL);
-+ mutex_unlock(&queue_handler_mutex);
-+}
-+EXPORT_SYMBOL(nf_unregister_queue_imq_handler);
-+#endif
-+
- /* return EBUSY when somebody else is registered, return EEXIST if the
- * same handler is registered, return 0 in case of success. */
- int nf_register_queue_handler(u_int8_t pf, const struct nf_queue_handler *qh)
-@@ -80,7 +100,7 @@ void nf_unregister_queue_handlers(const
- }
- EXPORT_SYMBOL_GPL(nf_unregister_queue_handlers);
-
--static void nf_queue_entry_release_refs(struct nf_queue_entry *entry)
-+void nf_queue_entry_release_refs(struct nf_queue_entry *entry)
- {
- /* Release those devices we held, or Alexey will kill me. */
- if (entry->indev)
-@@ -100,6 +120,7 @@ static void nf_queue_entry_release_refs(
- /* Drop reference to owner of hook which queued us. */
- module_put(entry->elem->owner);
- }
-+EXPORT_SYMBOL_GPL(nf_queue_entry_release_refs);
-
- /*
- * Any packet that leaves via this function must come back
-@@ -121,12 +142,26 @@ static int __nf_queue(struct sk_buff *sk
- #endif
- const struct nf_afinfo *afinfo;
- const struct nf_queue_handler *qh;
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ const struct nf_queue_handler *qih = NULL;
-+#endif
-
- /* QUEUE == DROP if noone is waiting, to be safe. */
- rcu_read_lock();
-
- qh = rcu_dereference(queue_handler[pf]);
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-+ if (pf == PF_INET || pf == PF_INET6)
-+#else
-+ if (pf == PF_INET)
-+#endif
-+ qih = rcu_dereference(queue_imq_handler);
-+
-+ if (!qh && !qih)
-+#else /* !IMQ */
- if (!qh)
-+#endif
- goto err_unlock;
-
- afinfo = nf_get_afinfo(pf);
-@@ -145,6 +180,10 @@ static int __nf_queue(struct sk_buff *sk
- .indev = indev,
- .outdev = outdev,
- .okfn = okfn,
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ .next_outfn = qh ? qh->outfn : NULL,
-+ .next_queuenum = queuenum,
-+#endif
- };
-
- /* If it's going away, ignore hook. */
-@@ -170,8 +209,19 @@ static int __nf_queue(struct sk_buff *sk
- }
- #endif
- afinfo->saveroute(skb, entry);
-+
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+ if (qih) {
-+ status = qih->outfn(entry, queuenum);
-+ goto imq_skip_queue;
-+ }
-+#endif
-+
- status = qh->outfn(entry, queuenum);
-
-+#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
-+imq_skip_queue:
-+#endif
- rcu_read_unlock();
-
- if (status < 0) {
---- /dev/null
-+++ b/net/netfilter/xt_IMQ.c
-@@ -0,0 +1,73 @@
-+/*
-+ * This target marks packets to be enqueued to an imq device
-+ */
-+#include <linux/module.h>
-+#include <linux/skbuff.h>
-+#include <linux/netfilter/x_tables.h>
-+#include <linux/netfilter/xt_IMQ.h>
-+#include <linux/imq.h>
-+
-+static unsigned int imq_target(struct sk_buff *pskb,
-+ const struct xt_target_param *par)
-+{
-+ const struct xt_imq_info *mr = par->targinfo;
-+
-+ pskb->imq_flags = (mr->todev & IMQ_F_IFMASK) | IMQ_F_ENQUEUE;
-+
-+ return XT_CONTINUE;
-+}
-+
-+static bool imq_checkentry(const struct xt_tgchk_param *par)
-+{
-+ struct xt_imq_info *mr = par->targinfo;
-+
-+ if (mr->todev > IMQ_MAX_DEVS - 1) {
-+ printk(KERN_WARNING
-+ "IMQ: invalid device specified, highest is %u\n",
-+ IMQ_MAX_DEVS - 1);
-+ return 0;
-+ }
-+
-+ return 1;
-+}
-+
-+static struct xt_target xt_imq_reg[] __read_mostly = {
-+ {
-+ .name = "IMQ",
-+ .family = AF_INET,
-+ .checkentry = imq_checkentry,
-+ .target = imq_target,
-+ .targetsize = sizeof(struct xt_imq_info),
-+ .table = "mangle",
-+ .me = THIS_MODULE
-+ },
-+ {
-+ .name = "IMQ",
-+ .family = AF_INET6,
-+ .checkentry = imq_checkentry,
-+ .target = imq_target,
-+ .targetsize = sizeof(struct xt_imq_info),
-+ .table = "mangle",
-+ .me = THIS_MODULE
-+ },
-+};
-+
-+static int __init imq_init(void)
-+{
-+ return xt_register_targets(xt_imq_reg, ARRAY_SIZE(xt_imq_reg));
-+}
-+
-+static void __exit imq_fini(void)
-+{
-+ xt_unregister_targets(xt_imq_reg, ARRAY_SIZE(xt_imq_reg));
-+}
-+
-+module_init(imq_init);
-+module_exit(imq_fini);
-+
-+MODULE_AUTHOR("http://www.linuximq.net");
-+MODULE_DESCRIPTION("Pseudo-driver for the intermediate queue device. See http://www.linuximq.net/ for more information.");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS("ipt_IMQ");
-+MODULE_ALIAS("ip6t_IMQ");
-+
+++ /dev/null
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -160,7 +160,6 @@ config NF_CONNTRACK_FTP
-
- config NF_CONNTRACK_H323
- tristate "H.323 protocol support"
-- depends on (IPV6 || IPV6=n)
- depends on NETFILTER_ADVANCED
- help
- H.323 is a VoIP signalling protocol from ITU-T. As one of the most
-@@ -505,7 +504,6 @@ config NETFILTER_XT_TARGET_SECMARK
-
- config NETFILTER_XT_TARGET_TCPMSS
- tristate '"TCPMSS" target support'
-- depends on (IPV6 || IPV6=n)
- default m if NETFILTER_ADVANCED=n
- ---help---
- This option adds a `TCPMSS' target, which allows you to alter the
+++ /dev/null
---- /dev/null
-+++ b/include/linux/netfilter/nf_conntrack_rtsp.h
-@@ -0,0 +1,63 @@
-+/*
-+ * RTSP extension for IP connection tracking.
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_conntrack_irc.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.
-+ */
-+#ifndef _IP_CONNTRACK_RTSP_H
-+#define _IP_CONNTRACK_RTSP_H
-+
-+//#define IP_NF_RTSP_DEBUG 1
-+#define IP_NF_RTSP_VERSION "0.6.21"
-+
-+#ifdef __KERNEL__
-+/* port block types */
-+typedef enum {
-+ pb_single, /* client_port=x */
-+ pb_range, /* client_port=x-y */
-+ pb_discon /* client_port=x/y (rtspbis) */
-+} portblock_t;
-+
-+/* We record seq number and length of rtsp headers here, all in host order. */
-+
-+/*
-+ * This structure is per expected connection. It is a member of struct
-+ * ip_conntrack_expect. The TCP SEQ for the conntrack expect is stored
-+ * there and we are expected to only store the length of the data which
-+ * needs replaced. If a packet contains multiple RTSP messages, we create
-+ * one expected connection per message.
-+ *
-+ * We use these variables to mark the entire header block. This may seem
-+ * like overkill, but the nature of RTSP requires it. A header may appear
-+ * multiple times in a message. We must treat two Transport headers the
-+ * same as one Transport header with two entries.
-+ */
-+struct ip_ct_rtsp_expect
-+{
-+ u_int32_t len; /* length of header block */
-+ portblock_t pbtype; /* Type of port block that was requested */
-+ u_int16_t loport; /* Port that was requested, low or first */
-+ u_int16_t hiport; /* Port that was requested, high or second */
-+#if 0
-+ uint method; /* RTSP method */
-+ uint cseq; /* CSeq from request */
-+#endif
-+};
-+
-+extern unsigned int (*nf_nat_rtsp_hook)(struct sk_buff *skb,
-+ enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen,
-+ struct ip_ct_rtsp_expect *prtspexp,
-+ struct nf_conntrack_expect *exp);
-+
-+extern void (*nf_nat_rtsp_hook_expectfn)(struct nf_conn *ct, struct nf_conntrack_expect *exp);
-+
-+#define RTSP_PORT 554
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _IP_CONNTRACK_RTSP_H */
---- /dev/null
-+++ b/include/linux/netfilter_helpers.h
-@@ -0,0 +1,133 @@
-+/*
-+ * Helpers for netfiler modules. This file provides implementations for basic
-+ * functions such as strncasecmp(), etc.
-+ *
-+ * gcc will warn for defined but unused functions, so we only include the
-+ * functions requested. The following macros are used:
-+ * NF_NEED_STRNCASECMP nf_strncasecmp()
-+ * NF_NEED_STRTOU16 nf_strtou16()
-+ * NF_NEED_STRTOU32 nf_strtou32()
-+ */
-+#ifndef _NETFILTER_HELPERS_H
-+#define _NETFILTER_HELPERS_H
-+
-+/* Only include these functions for kernel code. */
-+#ifdef __KERNEL__
-+
-+#include <linux/ctype.h>
-+#define iseol(c) ( (c) == '\r' || (c) == '\n' )
-+
-+/*
-+ * The standard strncasecmp()
-+ */
-+#ifdef NF_NEED_STRNCASECMP
-+static int
-+nf_strncasecmp(const char* s1, const char* s2, u_int32_t len)
-+{
-+ if (s1 == NULL || s2 == NULL)
-+ {
-+ if (s1 == NULL && s2 == NULL)
-+ {
-+ return 0;
-+ }
-+ return (s1 == NULL) ? -1 : 1;
-+ }
-+ while (len > 0 && tolower(*s1) == tolower(*s2))
-+ {
-+ len--;
-+ s1++;
-+ s2++;
-+ }
-+ return ( (len == 0) ? 0 : (tolower(*s1) - tolower(*s2)) );
-+}
-+#endif /* NF_NEED_STRNCASECMP */
-+
-+/*
-+ * Parse a string containing a 16-bit unsigned integer.
-+ * Returns the number of chars used, or zero if no number is found.
-+ */
-+#ifdef NF_NEED_STRTOU16
-+static int
-+nf_strtou16(const char* pbuf, u_int16_t* pval)
-+{
-+ int n = 0;
-+
-+ *pval = 0;
-+ while (isdigit(pbuf[n]))
-+ {
-+ *pval = (*pval * 10) + (pbuf[n] - '0');
-+ n++;
-+ }
-+
-+ return n;
-+}
-+#endif /* NF_NEED_STRTOU16 */
-+
-+/*
-+ * Parse a string containing a 32-bit unsigned integer.
-+ * Returns the number of chars used, or zero if no number is found.
-+ */
-+#ifdef NF_NEED_STRTOU32
-+static int
-+nf_strtou32(const char* pbuf, u_int32_t* pval)
-+{
-+ int n = 0;
-+
-+ *pval = 0;
-+ while (pbuf[n] >= '0' && pbuf[n] <= '9')
-+ {
-+ *pval = (*pval * 10) + (pbuf[n] - '0');
-+ n++;
-+ }
-+
-+ return n;
-+}
-+#endif /* NF_NEED_STRTOU32 */
-+
-+/*
-+ * Given a buffer and length, advance to the next line and mark the current
-+ * line.
-+ */
-+#ifdef NF_NEED_NEXTLINE
-+static int
-+nf_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
-+{
-+ uint off = *poff;
-+ uint physlen = 0;
-+
-+ if (off >= len)
-+ {
-+ return 0;
-+ }
-+
-+ while (p[off] != '\n')
-+ {
-+ if (len-off <= 1)
-+ {
-+ return 0;
-+ }
-+
-+ physlen++;
-+ off++;
-+ }
-+
-+ /* if we saw a crlf, physlen needs adjusted */
-+ if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
-+ {
-+ physlen--;
-+ }
-+
-+ /* advance past the newline */
-+ off++;
-+
-+ *plineoff = *poff;
-+ *plinelen = physlen;
-+ *poff = off;
-+
-+ return 1;
-+}
-+#endif /* NF_NEED_NEXTLINE */
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NETFILTER_HELPERS_H */
---- /dev/null
-+++ b/include/linux/netfilter_mime.h
-@@ -0,0 +1,89 @@
-+/*
-+ * MIME functions for netfilter modules. This file provides implementations
-+ * for basic MIME parsing. MIME headers are used in many protocols, such as
-+ * HTTP, RTSP, SIP, etc.
-+ *
-+ * gcc will warn for defined but unused functions, so we only include the
-+ * functions requested. The following macros are used:
-+ * NF_NEED_MIME_NEXTLINE nf_mime_nextline()
-+ */
-+#ifndef _NETFILTER_MIME_H
-+#define _NETFILTER_MIME_H
-+
-+/* Only include these functions for kernel code. */
-+#ifdef __KERNEL__
-+
-+#include <linux/ctype.h>
-+
-+/*
-+ * Given a buffer and length, advance to the next line and mark the current
-+ * line. If the current line is empty, *plinelen will be set to zero. If
-+ * not, it will be set to the actual line length (including CRLF).
-+ *
-+ * 'line' in this context means logical line (includes LWS continuations).
-+ * Returns 1 on success, 0 on failure.
-+ */
-+#ifdef NF_NEED_MIME_NEXTLINE
-+static int
-+nf_mime_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
-+{
-+ uint off = *poff;
-+ uint physlen = 0;
-+ int is_first_line = 1;
-+
-+ if (off >= len)
-+ {
-+ return 0;
-+ }
-+
-+ do
-+ {
-+ while (p[off] != '\n')
-+ {
-+ if (len-off <= 1)
-+ {
-+ return 0;
-+ }
-+
-+ physlen++;
-+ off++;
-+ }
-+
-+ /* if we saw a crlf, physlen needs adjusted */
-+ if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
-+ {
-+ physlen--;
-+ }
-+
-+ /* advance past the newline */
-+ off++;
-+
-+ /* check for an empty line */
-+ if (physlen == 0)
-+ {
-+ break;
-+ }
-+
-+ /* check for colon on the first physical line */
-+ if (is_first_line)
-+ {
-+ is_first_line = 0;
-+ if (memchr(p+(*poff), ':', physlen) == NULL)
-+ {
-+ return 0;
-+ }
-+ }
-+ }
-+ while (p[off] == ' ' || p[off] == '\t');
-+
-+ *plineoff = *poff;
-+ *plinelen = (physlen == 0) ? 0 : (off - *poff);
-+ *poff = off;
-+
-+ return 1;
-+}
-+#endif /* NF_NEED_MIME_NEXTLINE */
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _NETFILTER_MIME_H */
---- a/net/ipv4/netfilter/Makefile
-+++ b/net/ipv4/netfilter/Makefile
-@@ -26,6 +26,7 @@ obj-$(CONFIG_NF_NAT_AMANDA) += nf_nat_am
- obj-$(CONFIG_NF_NAT_FTP) += nf_nat_ftp.o
- obj-$(CONFIG_NF_NAT_H323) += nf_nat_h323.o
- obj-$(CONFIG_NF_NAT_IRC) += nf_nat_irc.o
-+obj-$(CONFIG_NF_NAT_RTSP) += nf_nat_rtsp.o
- obj-$(CONFIG_NF_NAT_PPTP) += nf_nat_pptp.o
- obj-$(CONFIG_NF_NAT_SIP) += nf_nat_sip.o
- obj-$(CONFIG_NF_NAT_SNMP_BASIC) += nf_nat_snmp_basic.o
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -267,6 +267,16 @@ config NF_CONNTRACK_TFTP
-
- To compile it as a module, choose M here. If unsure, say N.
-
-+config NF_CONNTRACK_RTSP
-+ tristate "RTSP protocol support"
-+ depends on NF_CONNTRACK
-+ help
-+ Support the RTSP protocol. This allows UDP transports to be setup
-+ properly, including RTP and RDT.
-+
-+ If you want to compile it as a module, say 'M' here and read
-+ Documentation/modules.txt. If unsure, say 'Y'.
-+
- config NF_CT_NETLINK
- tristate 'Connection tracking netlink interface'
- select NETFILTER_NETLINK
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -33,6 +33,7 @@ obj-$(CONFIG_NF_CONNTRACK_PPTP) += nf_co
- obj-$(CONFIG_NF_CONNTRACK_SANE) += nf_conntrack_sane.o
- obj-$(CONFIG_NF_CONNTRACK_SIP) += nf_conntrack_sip.o
- obj-$(CONFIG_NF_CONNTRACK_TFTP) += nf_conntrack_tftp.o
-+obj-$(CONFIG_NF_CONNTRACK_RTSP) += nf_conntrack_rtsp.o
-
- # transparent proxy support
- obj-$(CONFIG_NETFILTER_TPROXY) += nf_tproxy_core.o
---- a/net/ipv4/netfilter/Kconfig
-+++ b/net/ipv4/netfilter/Kconfig
-@@ -257,6 +257,11 @@ config NF_NAT_IRC
- depends on NF_CONNTRACK && NF_NAT
- default NF_NAT && NF_CONNTRACK_IRC
-
-+config NF_NAT_RTSP
-+ tristate
-+ depends on IP_NF_IPTABLES && NF_CONNTRACK && NF_NAT
-+ default NF_NAT && NF_CONNTRACK_RTSP
-+
- config NF_NAT_TFTP
- tristate
- depends on NF_CONNTRACK && NF_NAT
---- /dev/null
-+++ b/net/netfilter/nf_conntrack_rtsp.c
-@@ -0,0 +1,517 @@
-+/*
-+ * RTSP extension for IP connection tracking
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_conntrack_irc.c
-+ *
-+ * 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.
-+ *
-+ * Module load syntax:
-+ * insmod nf_conntrack_rtsp.o ports=port1,port2,...port<MAX_PORTS>
-+ * max_outstanding=n setup_timeout=secs
-+ *
-+ * If no ports are specified, the default will be port 554.
-+ *
-+ * With max_outstanding you can define the maximum number of not yet
-+ * answered SETUP requests per RTSP session (default 8).
-+ * With setup_timeout you can specify how long the system waits for
-+ * an expected data channel (default 300 seconds).
-+ *
-+ * 2005-02-13: Harald Welte <laforge at netfilter.org>
-+ * - port to 2.6
-+ * - update to recent post-2.6.11 api changes
-+ * 2006-09-14: Steven Van Acker <deepstar at singularity.be>
-+ * - removed calls to NAT code from conntrack helper: NAT no longer needed to use rtsp-conntrack
-+ * 2007-04-18: Michael Guntsche <mike at it-loops.com>
-+ * - Port to new NF API
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/netfilter.h>
-+#include <linux/ip.h>
-+#include <linux/inet.h>
-+#include <net/tcp.h>
-+
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_expect.h>
-+#include <net/netfilter/nf_conntrack_helper.h>
-+#include <linux/netfilter/nf_conntrack_rtsp.h>
-+
-+#define NF_NEED_STRNCASECMP
-+#define NF_NEED_STRTOU16
-+#define NF_NEED_STRTOU32
-+#define NF_NEED_NEXTLINE
-+#include <linux/netfilter_helpers.h>
-+#define NF_NEED_MIME_NEXTLINE
-+#include <linux/netfilter_mime.h>
-+
-+#include <linux/ctype.h>
-+#define MAX_SIMUL_SETUP 8 /* XXX: use max_outstanding */
-+#define INFOP(fmt, args...) printk(KERN_INFO "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#if 0
-+#define DEBUGP(fmt, args...) printk(KERN_DEBUG "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#else
-+#define DEBUGP(fmt, args...)
-+#endif
-+
-+#define MAX_PORTS 8
-+static int ports[MAX_PORTS];
-+static int num_ports = 0;
-+static int max_outstanding = 8;
-+static unsigned int setup_timeout = 300;
-+
-+MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
-+MODULE_DESCRIPTION("RTSP connection tracking module");
-+MODULE_LICENSE("GPL");
-+module_param_array(ports, int, &num_ports, 0400);
-+MODULE_PARM_DESC(ports, "port numbers of RTSP servers");
-+module_param(max_outstanding, int, 0400);
-+MODULE_PARM_DESC(max_outstanding, "max number of outstanding SETUP requests per RTSP session");
-+module_param(setup_timeout, int, 0400);
-+MODULE_PARM_DESC(setup_timeout, "timeout on for unestablished data channels");
-+
-+static char *rtsp_buffer;
-+static DEFINE_SPINLOCK(rtsp_buffer_lock);
-+
-+unsigned int (*nf_nat_rtsp_hook)(struct sk_buff *skb,
-+ enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen,struct ip_ct_rtsp_expect* prtspexp,
-+ struct nf_conntrack_expect *exp);
-+void (*nf_nat_rtsp_hook_expectfn)(struct nf_conn *ct, struct nf_conntrack_expect *exp);
-+
-+EXPORT_SYMBOL_GPL(nf_nat_rtsp_hook);
-+
-+/*
-+ * Max mappings we will allow for one RTSP connection (for RTP, the number
-+ * of allocated ports is twice this value). Note that SMIL burns a lot of
-+ * ports so keep this reasonably high. If this is too low, you will see a
-+ * lot of "no free client map entries" messages.
-+ */
-+#define MAX_PORT_MAPS 16
-+
-+/*** default port list was here in the masq code: 554, 3030, 4040 ***/
-+
-+#define SKIP_WSPACE(ptr,len,off) while(off < len && isspace(*(ptr+off))) { off++; }
-+
-+/*
-+ * Parse an RTSP packet.
-+ *
-+ * Returns zero if parsing failed.
-+ *
-+ * Parameters:
-+ * IN ptcp tcp data pointer
-+ * IN tcplen tcp data len
-+ * IN/OUT ptcpoff points to current tcp offset
-+ * OUT phdrsoff set to offset of rtsp headers
-+ * OUT phdrslen set to length of rtsp headers
-+ * OUT pcseqoff set to offset of CSeq header
-+ * OUT pcseqlen set to length of CSeq header
-+ */
-+static int
-+rtsp_parse_message(char* ptcp, uint tcplen, uint* ptcpoff,
-+ uint* phdrsoff, uint* phdrslen,
-+ uint* pcseqoff, uint* pcseqlen,
-+ uint* transoff, uint* translen)
-+{
-+ uint entitylen = 0;
-+ uint lineoff;
-+ uint linelen;
-+
-+ if (!nf_nextline(ptcp, tcplen, ptcpoff, &lineoff, &linelen))
-+ return 0;
-+
-+ *phdrsoff = *ptcpoff;
-+ while (nf_mime_nextline(ptcp, tcplen, ptcpoff, &lineoff, &linelen)) {
-+ if (linelen == 0) {
-+ if (entitylen > 0)
-+ *ptcpoff += min(entitylen, tcplen - *ptcpoff);
-+ break;
-+ }
-+ if (lineoff+linelen > tcplen) {
-+ INFOP("!! overrun !!\n");
-+ break;
-+ }
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "CSeq:", 5) == 0) {
-+ *pcseqoff = lineoff;
-+ *pcseqlen = linelen;
-+ }
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0) {
-+ *transoff = lineoff;
-+ *translen = linelen;
-+ }
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "Content-Length:", 15) == 0) {
-+ uint off = lineoff+15;
-+ SKIP_WSPACE(ptcp+lineoff, linelen, off);
-+ nf_strtou32(ptcp+off, &entitylen);
-+ }
-+ }
-+ *phdrslen = (*ptcpoff) - (*phdrsoff);
-+
-+ return 1;
-+}
-+
-+/*
-+ * Find lo/hi client ports (if any) in transport header
-+ * In:
-+ * ptcp, tcplen = packet
-+ * tranoff, tranlen = buffer to search
-+ *
-+ * Out:
-+ * pport_lo, pport_hi = lo/hi ports (host endian)
-+ *
-+ * Returns nonzero if any client ports found
-+ *
-+ * Note: it is valid (and expected) for the client to request multiple
-+ * transports, so we need to parse the entire line.
-+ */
-+static int
-+rtsp_parse_transport(char* ptran, uint tranlen,
-+ struct ip_ct_rtsp_expect* prtspexp)
-+{
-+ int rc = 0;
-+ uint off = 0;
-+
-+ if (tranlen < 10 || !iseol(ptran[tranlen-1]) ||
-+ nf_strncasecmp(ptran, "Transport:", 10) != 0) {
-+ INFOP("sanity check failed\n");
-+ return 0;
-+ }
-+
-+ DEBUGP("tran='%.*s'\n", (int)tranlen, ptran);
-+ off += 10;
-+ SKIP_WSPACE(ptran, tranlen, off);
-+
-+ /* Transport: tran;field;field=val,tran;field;field=val,... */
-+ while (off < tranlen) {
-+ const char* pparamend;
-+ uint nextparamoff;
-+
-+ pparamend = memchr(ptran+off, ',', tranlen-off);
-+ pparamend = (pparamend == NULL) ? ptran+tranlen : pparamend+1;
-+ nextparamoff = pparamend-ptran;
-+
-+ while (off < nextparamoff) {
-+ const char* pfieldend;
-+ uint nextfieldoff;
-+
-+ pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+ nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+ if (strncmp(ptran+off, "client_port=", 12) == 0) {
-+ u_int16_t port;
-+ uint numlen;
-+
-+ off += 12;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ if (prtspexp->loport != 0 && prtspexp->loport != port)
-+ DEBUGP("multiple ports found, port %hu ignored\n", port);
-+ else {
-+ DEBUGP("lo port found : %hu\n", port);
-+ prtspexp->loport = prtspexp->hiport = port;
-+ if (ptran[off] == '-') {
-+ off++;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ prtspexp->pbtype = pb_range;
-+ prtspexp->hiport = port;
-+
-+ // If we have a range, assume rtp:
-+ // loport must be even, hiport must be loport+1
-+ if ((prtspexp->loport & 0x0001) != 0 ||
-+ prtspexp->hiport != prtspexp->loport+1) {
-+ DEBUGP("incorrect range: %hu-%hu, correcting\n",
-+ prtspexp->loport, prtspexp->hiport);
-+ prtspexp->loport &= 0xfffe;
-+ prtspexp->hiport = prtspexp->loport+1;
-+ }
-+ } else if (ptran[off] == '/') {
-+ off++;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ prtspexp->pbtype = pb_discon;
-+ prtspexp->hiport = port;
-+ }
-+ rc = 1;
-+ }
-+ }
-+
-+ /*
-+ * Note we don't look for the destination parameter here.
-+ * If we are using NAT, the NAT module will handle it. If not,
-+ * and the client is sending packets elsewhere, the expectation
-+ * will quietly time out.
-+ */
-+
-+ off = nextfieldoff;
-+ }
-+
-+ off = nextparamoff;
-+ }
-+
-+ return rc;
-+}
-+
-+void expected(struct nf_conn *ct, struct nf_conntrack_expect *exp)
-+{
-+ if(nf_nat_rtsp_hook_expectfn) {
-+ nf_nat_rtsp_hook_expectfn(ct,exp);
-+ }
-+}
-+
-+/*** conntrack functions ***/
-+
-+/* outbound packet: client->server */
-+
-+static inline int
-+help_out(struct sk_buff *skb, unsigned char *rb_ptr, unsigned int datalen,
-+ struct nf_conn *ct, enum ip_conntrack_info ctinfo)
-+{
-+ struct ip_ct_rtsp_expect expinfo;
-+
-+ int dir = CTINFO2DIR(ctinfo); /* = IP_CT_DIR_ORIGINAL */
-+ //struct tcphdr* tcph = (void*)iph + iph->ihl * 4;
-+ //uint tcplen = pktlen - iph->ihl * 4;
-+ char* pdata = rb_ptr;
-+ //uint datalen = tcplen - tcph->doff * 4;
-+ uint dataoff = 0;
-+ int ret = NF_ACCEPT;
-+
-+ struct nf_conntrack_expect *exp;
-+
-+ __be16 be_loport;
-+
-+ memset(&expinfo, 0, sizeof(expinfo));
-+
-+ while (dataoff < datalen) {
-+ uint cmdoff = dataoff;
-+ uint hdrsoff = 0;
-+ uint hdrslen = 0;
-+ uint cseqoff = 0;
-+ uint cseqlen = 0;
-+ uint transoff = 0;
-+ uint translen = 0;
-+ uint off;
-+
-+ if (!rtsp_parse_message(pdata, datalen, &dataoff,
-+ &hdrsoff, &hdrslen,
-+ &cseqoff, &cseqlen,
-+ &transoff, &translen))
-+ break; /* not a valid message */
-+
-+ if (strncmp(pdata+cmdoff, "SETUP ", 6) != 0)
-+ continue; /* not a SETUP message */
-+ DEBUGP("found a setup message\n");
-+
-+ off = 0;
-+ if(translen) {
-+ rtsp_parse_transport(pdata+transoff, translen, &expinfo);
-+ }
-+
-+ if (expinfo.loport == 0) {
-+ DEBUGP("no udp transports found\n");
-+ continue; /* no udp transports found */
-+ }
-+
-+ DEBUGP("udp transport found, ports=(%d,%hu,%hu)\n",
-+ (int)expinfo.pbtype, expinfo.loport, expinfo.hiport);
-+
-+ exp = nf_ct_expect_alloc(ct);
-+ if (!exp) {
-+ ret = NF_DROP;
-+ goto out;
-+ }
-+
-+ be_loport = htons(expinfo.loport);
-+
-+ nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
-+ ct->tuplehash[!dir].tuple.src.l3num,
-+ &ct->tuplehash[!dir].tuple.src.u3, &ct->tuplehash[!dir].tuple.dst.u3,
-+ IPPROTO_UDP, NULL, &be_loport);
-+
-+ exp->master = ct;
-+
-+ exp->expectfn = expected;
-+ exp->flags = 0;
-+
-+ if (expinfo.pbtype == pb_range) {
-+ DEBUGP("Changing expectation mask to handle multiple ports\n");
-+ exp->mask.src.u.udp.port = 0xfffe;
-+ }
-+
-+ DEBUGP("expect_related %u.%u.%u.%u:%u-%u.%u.%u.%u:%u\n",
-+ NIPQUAD(exp->tuple.src.u3.ip),
-+ ntohs(exp->tuple.src.u.udp.port),
-+ NIPQUAD(exp->tuple.dst.u3.ip),
-+ ntohs(exp->tuple.dst.u.udp.port));
-+
-+ if (nf_nat_rtsp_hook)
-+ /* pass the request off to the nat helper */
-+ ret = nf_nat_rtsp_hook(skb, ctinfo, hdrsoff, hdrslen, &expinfo, exp);
-+ else if (nf_ct_expect_related(exp) != 0) {
-+ INFOP("nf_ct_expect_related failed\n");
-+ ret = NF_DROP;
-+ }
-+ nf_ct_expect_put(exp);
-+ goto out;
-+ }
-+out:
-+
-+ return ret;
-+}
-+
-+
-+static inline int
-+help_in(struct sk_buff *skb, size_t pktlen,
-+ struct nf_conn* ct, enum ip_conntrack_info ctinfo)
-+{
-+ return NF_ACCEPT;
-+}
-+
-+static int help(struct sk_buff *skb, unsigned int protoff,
-+ struct nf_conn *ct, enum ip_conntrack_info ctinfo)
-+{
-+ struct tcphdr _tcph, *th;
-+ unsigned int dataoff, datalen;
-+ char *rb_ptr;
-+ int ret = NF_DROP;
-+
-+ /* Until there's been traffic both ways, don't look in packets. */
-+ if (ctinfo != IP_CT_ESTABLISHED &&
-+ ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) {
-+ DEBUGP("conntrackinfo = %u\n", ctinfo);
-+ return NF_ACCEPT;
-+ }
-+
-+ /* Not whole TCP header? */
-+ th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph);
-+
-+ if (!th)
-+ return NF_ACCEPT;
-+
-+ /* No data ? */
-+ dataoff = protoff + th->doff*4;
-+ datalen = skb->len - dataoff;
-+ if (dataoff >= skb->len)
-+ return NF_ACCEPT;
-+
-+ spin_lock_bh(&rtsp_buffer_lock);
-+ rb_ptr = skb_header_pointer(skb, dataoff,
-+ skb->len - dataoff, rtsp_buffer);
-+ BUG_ON(rb_ptr == NULL);
-+
-+#if 0
-+ /* Checksum invalid? Ignore. */
-+ /* FIXME: Source route IP option packets --RR */
-+ if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr,
-+ csum_partial((char*)tcph, tcplen, 0)))
-+ {
-+ DEBUGP("bad csum: %p %u %u.%u.%u.%u %u.%u.%u.%u\n",
-+ tcph, tcplen, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr));
-+ return NF_ACCEPT;
-+ }
-+#endif
-+
-+ switch (CTINFO2DIR(ctinfo)) {
-+ case IP_CT_DIR_ORIGINAL:
-+ ret = help_out(skb, rb_ptr, datalen, ct, ctinfo);
-+ break;
-+ case IP_CT_DIR_REPLY:
-+ DEBUGP("IP_CT_DIR_REPLY\n");
-+ /* inbound packet: server->client */
-+ ret = NF_ACCEPT;
-+ break;
-+ }
-+
-+ spin_unlock_bh(&rtsp_buffer_lock);
-+
-+ return ret;
-+}
-+
-+static struct nf_conntrack_helper rtsp_helpers[MAX_PORTS];
-+static char rtsp_names[MAX_PORTS][10];
-+static struct nf_conntrack_expect_policy rtsp_expect_policy;
-+
-+/* This function is intentionally _NOT_ defined as __exit */
-+static void
-+fini(void)
-+{
-+ int i;
-+ for (i = 0; i < num_ports; i++) {
-+ DEBUGP("unregistering port %d\n", ports[i]);
-+ nf_conntrack_helper_unregister(&rtsp_helpers[i]);
-+ }
-+ kfree(rtsp_buffer);
-+}
-+
-+static int __init
-+init(void)
-+{
-+ int i, ret;
-+ struct nf_conntrack_helper *hlpr;
-+ char *tmpname;
-+
-+ printk("nf_conntrack_rtsp v" IP_NF_RTSP_VERSION " loading\n");
-+
-+ if (max_outstanding < 1) {
-+ printk("nf_conntrack_rtsp: max_outstanding must be a positive integer\n");
-+ return -EBUSY;
-+ }
-+ if (setup_timeout < 0) {
-+ printk("nf_conntrack_rtsp: setup_timeout must be a positive integer\n");
-+ return -EBUSY;
-+ }
-+
-+ rtsp_expect_policy.max_expected = max_outstanding;
-+ rtsp_expect_policy.timeout = setup_timeout;
-+
-+ rtsp_buffer = kmalloc(65536, GFP_KERNEL);
-+ if (!rtsp_buffer)
-+ return -ENOMEM;
-+
-+ /* If no port given, default to standard rtsp port */
-+ if (ports[0] == 0) {
-+ ports[0] = RTSP_PORT;
-+ }
-+
-+ for (i = 0; (i < MAX_PORTS) && ports[i]; i++) {
-+ hlpr = &rtsp_helpers[i];
-+ memset(hlpr, 0, sizeof(struct nf_conntrack_helper));
-+ hlpr->tuple.src.u.tcp.port = htons(ports[i]);
-+ hlpr->tuple.dst.protonum = IPPROTO_TCP;
-+ hlpr->expect_policy = &rtsp_expect_policy;
-+ hlpr->me = THIS_MODULE;
-+ hlpr->help = help;
-+
-+ tmpname = &rtsp_names[i][0];
-+ if (ports[i] == RTSP_PORT) {
-+ sprintf(tmpname, "rtsp");
-+ } else {
-+ sprintf(tmpname, "rtsp-%d", i);
-+ }
-+ hlpr->name = tmpname;
-+
-+ DEBUGP("port #%d: %d\n", i, ports[i]);
-+
-+ ret = nf_conntrack_helper_register(hlpr);
-+
-+ if (ret) {
-+ printk("nf_conntrack_rtsp: ERROR registering port %d\n", ports[i]);
-+ fini();
-+ return -EBUSY;
-+ }
-+ num_ports++;
-+ }
-+ return 0;
-+}
-+
-+module_init(init);
-+module_exit(fini);
-+
-+EXPORT_SYMBOL(nf_nat_rtsp_hook_expectfn);
-+
---- /dev/null
-+++ b/net/ipv4/netfilter/nf_nat_rtsp.c
-@@ -0,0 +1,496 @@
-+/*
-+ * RTSP extension for TCP NAT alteration
-+ * (C) 2003 by Tom Marshall <tmarshall at real.com>
-+ * based on ip_nat_irc.c
-+ *
-+ * 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.
-+ *
-+ * Module load syntax:
-+ * insmod nf_nat_rtsp.o ports=port1,port2,...port<MAX_PORTS>
-+ * stunaddr=<address>
-+ * destaction=[auto|strip|none]
-+ *
-+ * If no ports are specified, the default will be port 554 only.
-+ *
-+ * stunaddr specifies the address used to detect that a client is using STUN.
-+ * If this address is seen in the destination parameter, it is assumed that
-+ * the client has already punched a UDP hole in the firewall, so we don't
-+ * mangle the client_port. If none is specified, it is autodetected. It
-+ * only needs to be set if you have multiple levels of NAT. It should be
-+ * set to the external address that the STUN clients detect. Note that in
-+ * this case, it will not be possible for clients to use UDP with servers
-+ * between the NATs.
-+ *
-+ * If no destaction is specified, auto is used.
-+ * destaction=auto: strip destination parameter if it is not stunaddr.
-+ * destaction=strip: always strip destination parameter (not recommended).
-+ * destaction=none: do not touch destination parameter (not recommended).
-+ */
-+
-+#include <linux/module.h>
-+#include <net/tcp.h>
-+#include <net/netfilter/nf_nat_helper.h>
-+#include <net/netfilter/nf_nat_rule.h>
-+#include <linux/netfilter/nf_conntrack_rtsp.h>
-+#include <net/netfilter/nf_conntrack_expect.h>
-+
-+#include <linux/inet.h>
-+#include <linux/ctype.h>
-+#define NF_NEED_STRNCASECMP
-+#define NF_NEED_STRTOU16
-+#include <linux/netfilter_helpers.h>
-+#define NF_NEED_MIME_NEXTLINE
-+#include <linux/netfilter_mime.h>
-+
-+#define INFOP(fmt, args...) printk(KERN_INFO "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#if 0
-+#define DEBUGP(fmt, args...) printk(KERN_DEBUG "%s: %s: " fmt, __FILE__, __FUNCTION__ , ## args)
-+#else
-+#define DEBUGP(fmt, args...)
-+#endif
-+
-+#define MAX_PORTS 8
-+#define DSTACT_AUTO 0
-+#define DSTACT_STRIP 1
-+#define DSTACT_NONE 2
-+
-+static char* stunaddr = NULL;
-+static char* destaction = NULL;
-+
-+static u_int32_t extip = 0;
-+static int dstact = 0;
-+
-+MODULE_AUTHOR("Tom Marshall <tmarshall at real.com>");
-+MODULE_DESCRIPTION("RTSP network address translation module");
-+MODULE_LICENSE("GPL");
-+module_param(stunaddr, charp, 0644);
-+MODULE_PARM_DESC(stunaddr, "Address for detecting STUN");
-+module_param(destaction, charp, 0644);
-+MODULE_PARM_DESC(destaction, "Action for destination parameter (auto/strip/none)");
-+
-+#define SKIP_WSPACE(ptr,len,off) while(off < len && isspace(*(ptr+off))) { off++; }
-+
-+/*** helper functions ***/
-+
-+static void
-+get_skb_tcpdata(struct sk_buff* skb, char** pptcpdata, uint* ptcpdatalen)
-+{
-+ struct iphdr* iph = ip_hdr(skb);
-+ struct tcphdr* tcph = (void *)iph + ip_hdrlen(skb);
-+
-+ *pptcpdata = (char*)tcph + tcph->doff*4;
-+ *ptcpdatalen = ((char*)skb_transport_header(skb) + skb->len) - *pptcpdata;
-+}
-+
-+/*** nat functions ***/
-+
-+/*
-+ * Mangle the "Transport:" header:
-+ * - Replace all occurences of "client_port=<spec>"
-+ * - Handle destination parameter
-+ *
-+ * In:
-+ * ct, ctinfo = conntrack context
-+ * skb = packet
-+ * tranoff = Transport header offset from TCP data
-+ * tranlen = Transport header length (incl. CRLF)
-+ * rport_lo = replacement low port (host endian)
-+ * rport_hi = replacement high port (host endian)
-+ *
-+ * Returns packet size difference.
-+ *
-+ * Assumes that a complete transport header is present, ending with CR or LF
-+ */
-+static int
-+rtsp_mangle_tran(enum ip_conntrack_info ctinfo,
-+ struct nf_conntrack_expect* exp,
-+ struct ip_ct_rtsp_expect* prtspexp,
-+ struct sk_buff* skb, uint tranoff, uint tranlen)
-+{
-+ char* ptcp;
-+ uint tcplen;
-+ char* ptran;
-+ char rbuf1[16]; /* Replacement buffer (one port) */
-+ uint rbuf1len; /* Replacement len (one port) */
-+ char rbufa[16]; /* Replacement buffer (all ports) */
-+ uint rbufalen; /* Replacement len (all ports) */
-+ u_int32_t newip;
-+ u_int16_t loport, hiport;
-+ uint off = 0;
-+ uint diff; /* Number of bytes we removed */
-+
-+ struct nf_conn *ct = exp->master;
-+ struct nf_conntrack_tuple *t;
-+
-+ char szextaddr[15+1];
-+ uint extaddrlen;
-+ int is_stun;
-+
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ ptran = ptcp+tranoff;
-+
-+ if (tranoff+tranlen > tcplen || tcplen-tranoff < tranlen ||
-+ tranlen < 10 || !iseol(ptran[tranlen-1]) ||
-+ nf_strncasecmp(ptran, "Transport:", 10) != 0)
-+ {
-+ INFOP("sanity check failed\n");
-+ return 0;
-+ }
-+ off += 10;
-+ SKIP_WSPACE(ptcp+tranoff, tranlen, off);
-+
-+ newip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip;
-+ t = &exp->tuple;
-+ t->dst.u3.ip = newip;
-+
-+ extaddrlen = extip ? sprintf(szextaddr, "%u.%u.%u.%u", NIPQUAD(extip))
-+ : sprintf(szextaddr, "%u.%u.%u.%u", NIPQUAD(newip));
-+ DEBUGP("stunaddr=%s (%s)\n", szextaddr, (extip?"forced":"auto"));
-+
-+ rbuf1len = rbufalen = 0;
-+ switch (prtspexp->pbtype)
-+ {
-+ case pb_single:
-+ for (loport = prtspexp->loport; loport != 0; loport++) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(loport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ DEBUGP("using port %hu\n", loport);
-+ break;
-+ }
-+ }
-+ if (loport != 0)
-+ {
-+ rbuf1len = sprintf(rbuf1, "%hu", loport);
-+ rbufalen = sprintf(rbufa, "%hu", loport);
-+ }
-+ break;
-+ case pb_range:
-+ for (loport = prtspexp->loport; loport != 0; loport += 2) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(loport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ hiport = loport + ~exp->mask.src.u.udp.port;
-+ DEBUGP("using ports %hu-%hu\n", loport, hiport);
-+ break;
-+ }
-+ }
-+ if (loport != 0)
-+ {
-+ rbuf1len = sprintf(rbuf1, "%hu", loport);
-+ rbufalen = sprintf(rbufa, "%hu-%hu", loport, loport+1);
-+ }
-+ break;
-+ case pb_discon:
-+ for (loport = prtspexp->loport; loport != 0; loport++) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(loport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ DEBUGP("using port %hu (1 of 2)\n", loport);
-+ break;
-+ }
-+ }
-+ for (hiport = prtspexp->hiport; hiport != 0; hiport++) /* XXX: improper wrap? */
-+ {
-+ t->dst.u.udp.port = htons(hiport);
-+ if (nf_ct_expect_related(exp) == 0)
-+ {
-+ DEBUGP("using port %hu (2 of 2)\n", hiport);
-+ break;
-+ }
-+ }
-+ if (loport != 0 && hiport != 0)
-+ {
-+ rbuf1len = sprintf(rbuf1, "%hu", loport);
-+ if (hiport == loport+1)
-+ {
-+ rbufalen = sprintf(rbufa, "%hu-%hu", loport, hiport);
-+ }
-+ else
-+ {
-+ rbufalen = sprintf(rbufa, "%hu/%hu", loport, hiport);
-+ }
-+ }
-+ break;
-+ }
-+
-+ if (rbuf1len == 0)
-+ {
-+ return 0; /* cannot get replacement port(s) */
-+ }
-+
-+ /* Transport: tran;field;field=val,tran;field;field=val,... */
-+ while (off < tranlen)
-+ {
-+ uint saveoff;
-+ const char* pparamend;
-+ uint nextparamoff;
-+
-+ pparamend = memchr(ptran+off, ',', tranlen-off);
-+ pparamend = (pparamend == NULL) ? ptran+tranlen : pparamend+1;
-+ nextparamoff = pparamend-ptcp;
-+
-+ /*
-+ * We pass over each param twice. On the first pass, we look for a
-+ * destination= field. It is handled by the security policy. If it
-+ * is present, allowed, and equal to our external address, we assume
-+ * that STUN is being used and we leave the client_port= field alone.
-+ */
-+ is_stun = 0;
-+ saveoff = off;
-+ while (off < nextparamoff)
-+ {
-+ const char* pfieldend;
-+ uint nextfieldoff;
-+
-+ pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+ nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+ if (dstact != DSTACT_NONE && strncmp(ptran+off, "destination=", 12) == 0)
-+ {
-+ if (strncmp(ptran+off+12, szextaddr, extaddrlen) == 0)
-+ {
-+ is_stun = 1;
-+ }
-+ if (dstact == DSTACT_STRIP || (dstact == DSTACT_AUTO && !is_stun))
-+ {
-+ diff = nextfieldoff-off;
-+ if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
-+ off, diff, NULL, 0))
-+ {
-+ /* mangle failed, all we can do is bail */
-+ nf_ct_unexpect_related(exp);
-+ return 0;
-+ }
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ ptran = ptcp+tranoff;
-+ tranlen -= diff;
-+ nextparamoff -= diff;
-+ nextfieldoff -= diff;
-+ }
-+ }
-+
-+ off = nextfieldoff;
-+ }
-+ if (is_stun)
-+ {
-+ continue;
-+ }
-+ off = saveoff;
-+ while (off < nextparamoff)
-+ {
-+ const char* pfieldend;
-+ uint nextfieldoff;
-+
-+ pfieldend = memchr(ptran+off, ';', nextparamoff-off);
-+ nextfieldoff = (pfieldend == NULL) ? nextparamoff : pfieldend-ptran+1;
-+
-+ if (strncmp(ptran+off, "client_port=", 12) == 0)
-+ {
-+ u_int16_t port;
-+ uint numlen;
-+ uint origoff;
-+ uint origlen;
-+ char* rbuf = rbuf1;
-+ uint rbuflen = rbuf1len;
-+
-+ off += 12;
-+ origoff = (ptran-ptcp)+off;
-+ origlen = 0;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ origlen += numlen;
-+ if (port != prtspexp->loport)
-+ {
-+ DEBUGP("multiple ports found, port %hu ignored\n", port);
-+ }
-+ else
-+ {
-+ if (ptran[off] == '-' || ptran[off] == '/')
-+ {
-+ off++;
-+ origlen++;
-+ numlen = nf_strtou16(ptran+off, &port);
-+ off += numlen;
-+ origlen += numlen;
-+ rbuf = rbufa;
-+ rbuflen = rbufalen;
-+ }
-+
-+ /*
-+ * note we cannot just memcpy() if the sizes are the same.
-+ * the mangle function does skb resizing, checks for a
-+ * cloned skb, and updates the checksums.
-+ *
-+ * parameter 4 below is offset from start of tcp data.
-+ */
-+ diff = origlen-rbuflen;
-+ if (!nf_nat_mangle_tcp_packet(skb, ct, ctinfo,
-+ origoff, origlen, rbuf, rbuflen))
-+ {
-+ /* mangle failed, all we can do is bail */
-+ nf_ct_unexpect_related(exp);
-+ return 0;
-+ }
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ ptran = ptcp+tranoff;
-+ tranlen -= diff;
-+ nextparamoff -= diff;
-+ nextfieldoff -= diff;
-+ }
-+ }
-+
-+ off = nextfieldoff;
-+ }
-+
-+ off = nextparamoff;
-+ }
-+
-+ return 1;
-+}
-+
-+static uint
-+help_out(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen, struct ip_ct_rtsp_expect* prtspexp,
-+ struct nf_conntrack_expect* exp)
-+{
-+ char* ptcp;
-+ uint tcplen;
-+ uint hdrsoff;
-+ uint hdrslen;
-+ uint lineoff;
-+ uint linelen;
-+ uint off;
-+
-+ //struct iphdr* iph = (struct iphdr*)skb->nh.iph;
-+ //struct tcphdr* tcph = (struct tcphdr*)((void*)iph + iph->ihl*4);
-+
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ hdrsoff = matchoff;//exp->seq - ntohl(tcph->seq);
-+ hdrslen = matchlen;
-+ off = hdrsoff;
-+ DEBUGP("NAT rtsp help_out\n");
-+
-+ while (nf_mime_nextline(ptcp, hdrsoff+hdrslen, &off, &lineoff, &linelen))
-+ {
-+ if (linelen == 0)
-+ {
-+ break;
-+ }
-+ if (off > hdrsoff+hdrslen)
-+ {
-+ INFOP("!! overrun !!");
-+ break;
-+ }
-+ DEBUGP("hdr: len=%u, %.*s", linelen, (int)linelen, ptcp+lineoff);
-+
-+ if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0)
-+ {
-+ uint oldtcplen = tcplen;
-+ DEBUGP("hdr: Transport\n");
-+ if (!rtsp_mangle_tran(ctinfo, exp, prtspexp, skb, lineoff, linelen))
-+ {
-+ DEBUGP("hdr: Transport mangle failed");
-+ break;
-+ }
-+ get_skb_tcpdata(skb, &ptcp, &tcplen);
-+ hdrslen -= (oldtcplen-tcplen);
-+ off -= (oldtcplen-tcplen);
-+ lineoff -= (oldtcplen-tcplen);
-+ linelen -= (oldtcplen-tcplen);
-+ DEBUGP("rep: len=%u, %.*s", linelen, (int)linelen, ptcp+lineoff);
-+ }
-+ }
-+
-+ return NF_ACCEPT;
-+}
-+
-+static unsigned int
-+help(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
-+ unsigned int matchoff, unsigned int matchlen, struct ip_ct_rtsp_expect* prtspexp,
-+ struct nf_conntrack_expect* exp)
-+{
-+ int dir = CTINFO2DIR(ctinfo);
-+ int rc = NF_ACCEPT;
-+
-+ switch (dir)
-+ {
-+ case IP_CT_DIR_ORIGINAL:
-+ rc = help_out(skb, ctinfo, matchoff, matchlen, prtspexp, exp);
-+ break;
-+ case IP_CT_DIR_REPLY:
-+ DEBUGP("unmangle ! %u\n", ctinfo);
-+ /* XXX: unmangle */
-+ rc = NF_ACCEPT;
-+ break;
-+ }
-+ //UNLOCK_BH(&ip_rtsp_lock);
-+
-+ return rc;
-+}
-+
-+static void expected(struct nf_conn* ct, struct nf_conntrack_expect *exp)
-+{
-+ struct nf_nat_multi_range_compat mr;
-+ u_int32_t newdstip, newsrcip, newip;
-+
-+ struct nf_conn *master = ct->master;
-+
-+ newdstip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+ newsrcip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+ //FIXME (how to port that ?)
-+ //code from 2.4 : newip = (HOOK2MANIP(hooknum) == IP_NAT_MANIP_SRC) ? newsrcip : newdstip;
-+ newip = newdstip;
-+
-+ DEBUGP("newsrcip=%u.%u.%u.%u, newdstip=%u.%u.%u.%u, newip=%u.%u.%u.%u\n",
-+ NIPQUAD(newsrcip), NIPQUAD(newdstip), NIPQUAD(newip));
-+
-+ mr.rangesize = 1;
-+ // We don't want to manip the per-protocol, just the IPs.
-+ mr.range[0].flags = IP_NAT_RANGE_MAP_IPS;
-+ mr.range[0].min_ip = mr.range[0].max_ip = newip;
-+
-+ nf_nat_setup_info(ct, &mr.range[0], IP_NAT_MANIP_DST);
-+}
-+
-+
-+static void __exit fini(void)
-+{
-+ nf_nat_rtsp_hook = NULL;
-+ nf_nat_rtsp_hook_expectfn = NULL;
-+ synchronize_net();
-+}
-+
-+static int __init init(void)
-+{
-+ printk("nf_nat_rtsp v" IP_NF_RTSP_VERSION " loading\n");
-+
-+ BUG_ON(nf_nat_rtsp_hook);
-+ nf_nat_rtsp_hook = help;
-+ nf_nat_rtsp_hook_expectfn = &expected;
-+
-+ if (stunaddr != NULL)
-+ extip = in_aton(stunaddr);
-+
-+ if (destaction != NULL) {
-+ if (strcmp(destaction, "auto") == 0)
-+ dstact = DSTACT_AUTO;
-+
-+ if (strcmp(destaction, "strip") == 0)
-+ dstact = DSTACT_STRIP;
-+
-+ if (strcmp(destaction, "none") == 0)
-+ dstact = DSTACT_NONE;
-+ }
-+
-+ return 0;
-+}
-+
-+module_init(init);
-+module_exit(fini);
+++ /dev/null
---- a/include/linux/pkt_sched.h
-+++ b/include/linux/pkt_sched.h
-@@ -173,8 +173,37 @@ struct tc_sfq_xstats {
- *
- * The only reason for this is efficiency, it is possible
- * to change these parameters in compile time.
-+ *
-+ * If you need to play with these values, use esfq instead.
- */
-
-+/* ESFQ section */
-+
-+enum
-+{
-+ /* traditional */
-+ TCA_SFQ_HASH_CLASSIC,
-+ TCA_SFQ_HASH_DST,
-+ TCA_SFQ_HASH_SRC,
-+ TCA_SFQ_HASH_FWMARK,
-+ /* conntrack */
-+ TCA_SFQ_HASH_CTORIGDST,
-+ TCA_SFQ_HASH_CTORIGSRC,
-+ TCA_SFQ_HASH_CTREPLDST,
-+ TCA_SFQ_HASH_CTREPLSRC,
-+ TCA_SFQ_HASH_CTNATCHG,
-+};
-+
-+struct tc_esfq_qopt
-+{
-+ unsigned quantum; /* Bytes per round allocated to flow */
-+ int perturb_period; /* Period of hash perturbation */
-+ __u32 limit; /* Maximal packets in queue */
-+ unsigned divisor; /* Hash divisor */
-+ unsigned flows; /* Maximal number of flows */
-+ unsigned hash_kind; /* Hash function to use for flow identification */
-+};
-+
- /* RED section */
-
- enum {
---- a/net/sched/Kconfig
-+++ b/net/sched/Kconfig
-@@ -137,6 +137,37 @@ config NET_SCH_SFQ
- To compile this code as a module, choose M here: the
- module will be called sch_sfq.
-
-+config NET_SCH_ESFQ
-+ tristate "Enhanced Stochastic Fairness Queueing (ESFQ)"
-+ ---help---
-+ Say Y here if you want to use the Enhanced Stochastic Fairness
-+ Queueing (ESFQ) packet scheduling algorithm for some of your network
-+ devices or as a leaf discipline for a classful qdisc such as HTB or
-+ CBQ (see the top of <file:net/sched/sch_esfq.c> for details and
-+ references to the SFQ algorithm).
-+
-+ This is an enchanced SFQ version which allows you to control some
-+ hardcoded values in the SFQ scheduler.
-+
-+ ESFQ also adds control of the hash function used to identify packet
-+ flows. The original SFQ discipline hashes by connection; ESFQ add
-+ several other hashing methods, such as by src IP or by dst IP, which
-+ can be more fair to users in some networking situations.
-+
-+ To compile this code as a module, choose M here: the
-+ module will be called sch_esfq.
-+
-+config NET_SCH_ESFQ_NFCT
-+ bool "Connection Tracking Hash Types"
-+ depends on NET_SCH_ESFQ && NF_CONNTRACK
-+ ---help---
-+ Say Y here to enable support for hashing based on netfilter connection
-+ tracking information. This is useful for a router that is also using
-+ NAT to connect privately-addressed hosts to the Internet. If you want
-+ to provide fair distribution of upstream bandwidth, ESFQ must use
-+ connection tracking information, since all outgoing packets will share
-+ the same source address.
-+
- config NET_SCH_TEQL
- tristate "True Link Equalizer (TEQL)"
- ---help---
---- a/net/sched/Makefile
-+++ b/net/sched/Makefile
-@@ -24,6 +24,7 @@ obj-$(CONFIG_NET_SCH_GRED) += sch_gred.o
- obj-$(CONFIG_NET_SCH_INGRESS) += sch_ingress.o
- obj-$(CONFIG_NET_SCH_DSMARK) += sch_dsmark.o
- obj-$(CONFIG_NET_SCH_SFQ) += sch_sfq.o
-+obj-$(CONFIG_NET_SCH_ESFQ) += sch_esfq.o
- obj-$(CONFIG_NET_SCH_TBF) += sch_tbf.o
- obj-$(CONFIG_NET_SCH_TEQL) += sch_teql.o
- obj-$(CONFIG_NET_SCH_PRIO) += sch_prio.o
---- /dev/null
-+++ b/net/sched/sch_esfq.c
-@@ -0,0 +1,702 @@
-+/*
-+ * net/sched/sch_esfq.c Extended Stochastic Fairness Queueing discipline.
-+ *
-+ * 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.
-+ *
-+ * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
-+ *
-+ * Changes: Alexander Atanasov, <alex@ssi.bg>
-+ * Added dynamic depth,limit,divisor,hash_kind options.
-+ * Added dst and src hashes.
-+ *
-+ * Alexander Clouter, <alex@digriz.org.uk>
-+ * Ported ESFQ to Linux 2.6.
-+ *
-+ * Corey Hickey, <bugfood-c@fatooh.org>
-+ * Maintenance of the Linux 2.6 port.
-+ * Added fwmark hash (thanks to Robert Kurjata).
-+ * Added usage of jhash.
-+ * Added conntrack support.
-+ * Added ctnatchg hash (thanks to Ben Pfountz).
-+ */
-+
-+#include <linux/module.h>
-+#include <asm/uaccess.h>
-+#include <asm/system.h>
-+#include <linux/bitops.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/jiffies.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/socket.h>
-+#include <linux/sockios.h>
-+#include <linux/in.h>
-+#include <linux/errno.h>
-+#include <linux/interrupt.h>
-+#include <linux/if_ether.h>
-+#include <linux/inet.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/notifier.h>
-+#include <linux/init.h>
-+#include <net/ip.h>
-+#include <net/netlink.h>
-+#include <linux/ipv6.h>
-+#include <net/route.h>
-+#include <linux/skbuff.h>
-+#include <net/sock.h>
-+#include <net/pkt_sched.h>
-+#include <linux/jhash.h>
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+#include <net/netfilter/nf_conntrack.h>
-+#endif
-+
-+/* Stochastic Fairness Queuing algorithm.
-+ For more comments look at sch_sfq.c.
-+ The difference is that you can change limit, depth,
-+ hash table size and choose alternate hash types.
-+
-+ classic: same as in sch_sfq.c
-+ dst: destination IP address
-+ src: source IP address
-+ fwmark: netfilter mark value
-+ ctorigdst: original destination IP address
-+ ctorigsrc: original source IP address
-+ ctrepldst: reply destination IP address
-+ ctreplsrc: reply source IP
-+
-+*/
-+
-+#define ESFQ_HEAD 0
-+#define ESFQ_TAIL 1
-+
-+/* This type should contain at least SFQ_DEPTH*2 values */
-+typedef unsigned int esfq_index;
-+
-+struct esfq_head
-+{
-+ esfq_index next;
-+ esfq_index prev;
-+};
-+
-+struct esfq_sched_data
-+{
-+/* Parameters */
-+ int perturb_period;
-+ unsigned quantum; /* Allotment per round: MUST BE >= MTU */
-+ int limit;
-+ unsigned depth;
-+ unsigned hash_divisor;
-+ unsigned hash_kind;
-+/* Variables */
-+ struct timer_list perturb_timer;
-+ int perturbation;
-+ esfq_index tail; /* Index of current slot in round */
-+ esfq_index max_depth; /* Maximal depth */
-+
-+ esfq_index *ht; /* Hash table */
-+ esfq_index *next; /* Active slots link */
-+ short *allot; /* Current allotment per slot */
-+ unsigned short *hash; /* Hash value indexed by slots */
-+ struct sk_buff_head *qs; /* Slot queue */
-+ struct esfq_head *dep; /* Linked list of slots, indexed by depth */
-+};
-+
-+/* This contains the info we will hash. */
-+struct esfq_packet_info
-+{
-+ u32 proto; /* protocol or port */
-+ u32 src; /* source from packet header */
-+ u32 dst; /* destination from packet header */
-+ u32 ctorigsrc; /* original source from conntrack */
-+ u32 ctorigdst; /* original destination from conntrack */
-+ u32 ctreplsrc; /* reply source from conntrack */
-+ u32 ctrepldst; /* reply destination from conntrack */
-+ u32 mark; /* netfilter mark (fwmark) */
-+};
-+
-+static __inline__ unsigned esfq_jhash_1word(struct esfq_sched_data *q,u32 a)
-+{
-+ return jhash_1word(a, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static __inline__ unsigned esfq_jhash_2words(struct esfq_sched_data *q, u32 a, u32 b)
-+{
-+ return jhash_2words(a, b, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static __inline__ unsigned esfq_jhash_3words(struct esfq_sched_data *q, u32 a, u32 b, u32 c)
-+{
-+ return jhash_3words(a, b, c, q->perturbation) & (q->hash_divisor-1);
-+}
-+
-+static unsigned esfq_hash(struct esfq_sched_data *q, struct sk_buff *skb)
-+{
-+ struct esfq_packet_info info;
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+ enum ip_conntrack_info ctinfo;
-+ struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
-+#endif
-+
-+ switch (skb->protocol) {
-+ case __constant_htons(ETH_P_IP):
-+ {
-+ struct iphdr *iph = ip_hdr(skb);
-+ info.dst = iph->daddr;
-+ info.src = iph->saddr;
-+ if (!(iph->frag_off&htons(IP_MF|IP_OFFSET)) &&
-+ (iph->protocol == IPPROTO_TCP ||
-+ iph->protocol == IPPROTO_UDP ||
-+ iph->protocol == IPPROTO_SCTP ||
-+ iph->protocol == IPPROTO_DCCP ||
-+ iph->protocol == IPPROTO_ESP))
-+ info.proto = *(((u32*)iph) + iph->ihl);
-+ else
-+ info.proto = iph->protocol;
-+ break;
-+ }
-+ case __constant_htons(ETH_P_IPV6):
-+ {
-+ struct ipv6hdr *iph = ipv6_hdr(skb);
-+ /* Hash ipv6 addresses into a u32. This isn't ideal,
-+ * but the code is simple. */
-+ info.dst = jhash2(iph->daddr.s6_addr32, 4, q->perturbation);
-+ info.src = jhash2(iph->saddr.s6_addr32, 4, q->perturbation);
-+ if (iph->nexthdr == IPPROTO_TCP ||
-+ iph->nexthdr == IPPROTO_UDP ||
-+ iph->nexthdr == IPPROTO_SCTP ||
-+ iph->nexthdr == IPPROTO_DCCP ||
-+ iph->nexthdr == IPPROTO_ESP)
-+ info.proto = *(u32*)&iph[1];
-+ else
-+ info.proto = iph->nexthdr;
-+ break;
-+ }
-+ default:
-+ info.dst = (u32)(unsigned long)skb_dst(skb);
-+ info.src = (u32)(unsigned long)skb->sk;
-+ info.proto = skb->protocol;
-+ }
-+
-+ info.mark = skb->mark;
-+
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+ /* defaults if there is no conntrack info */
-+ info.ctorigsrc = info.src;
-+ info.ctorigdst = info.dst;
-+ info.ctreplsrc = info.dst;
-+ info.ctrepldst = info.src;
-+ /* collect conntrack info */
-+ if (ct && ct != &nf_conntrack_untracked) {
-+ if (skb->protocol == __constant_htons(ETH_P_IP)) {
-+ info.ctorigsrc = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
-+ info.ctorigdst = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip;
-+ info.ctreplsrc = ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip;
-+ info.ctrepldst = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip;
-+ }
-+ else if (skb->protocol == __constant_htons(ETH_P_IPV6)) {
-+ /* Again, hash ipv6 addresses into a single u32. */
-+ info.ctorigsrc = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip6, 4, q->perturbation);
-+ info.ctorigdst = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip6, 4, q->perturbation);
-+ info.ctreplsrc = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip6, 4, q->perturbation);
-+ info.ctrepldst = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip6, 4, q->perturbation);
-+ }
-+
-+ }
-+#endif
-+
-+ switch(q->hash_kind) {
-+ case TCA_SFQ_HASH_CLASSIC:
-+ return esfq_jhash_3words(q, info.dst, info.src, info.proto);
-+ case TCA_SFQ_HASH_DST:
-+ return esfq_jhash_1word(q, info.dst);
-+ case TCA_SFQ_HASH_SRC:
-+ return esfq_jhash_1word(q, info.src);
-+ case TCA_SFQ_HASH_FWMARK:
-+ return esfq_jhash_1word(q, info.mark);
-+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
-+ case TCA_SFQ_HASH_CTORIGDST:
-+ return esfq_jhash_1word(q, info.ctorigdst);
-+ case TCA_SFQ_HASH_CTORIGSRC:
-+ return esfq_jhash_1word(q, info.ctorigsrc);
-+ case TCA_SFQ_HASH_CTREPLDST:
-+ return esfq_jhash_1word(q, info.ctrepldst);
-+ case TCA_SFQ_HASH_CTREPLSRC:
-+ return esfq_jhash_1word(q, info.ctreplsrc);
-+ case TCA_SFQ_HASH_CTNATCHG:
-+ {
-+ if (info.ctorigdst == info.ctreplsrc)
-+ return esfq_jhash_1word(q, info.ctorigsrc);
-+ return esfq_jhash_1word(q, info.ctreplsrc);
-+ }
-+#endif
-+ default:
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "ESFQ: Unknown hash method. Falling back to classic.\n");
-+ }
-+ return esfq_jhash_3words(q, info.dst, info.src, info.proto);
-+}
-+
-+static inline void esfq_link(struct esfq_sched_data *q, esfq_index x)
-+{
-+ esfq_index p, n;
-+ int d = q->qs[x].qlen + q->depth;
-+
-+ p = d;
-+ n = q->dep[d].next;
-+ q->dep[x].next = n;
-+ q->dep[x].prev = p;
-+ q->dep[p].next = q->dep[n].prev = x;
-+}
-+
-+static inline void esfq_dec(struct esfq_sched_data *q, esfq_index x)
-+{
-+ esfq_index p, n;
-+
-+ n = q->dep[x].next;
-+ p = q->dep[x].prev;
-+ q->dep[p].next = n;
-+ q->dep[n].prev = p;
-+
-+ if (n == p && q->max_depth == q->qs[x].qlen + 1)
-+ q->max_depth--;
-+
-+ esfq_link(q, x);
-+}
-+
-+static inline void esfq_inc(struct esfq_sched_data *q, esfq_index x)
-+{
-+ esfq_index p, n;
-+ int d;
-+
-+ n = q->dep[x].next;
-+ p = q->dep[x].prev;
-+ q->dep[p].next = n;
-+ q->dep[n].prev = p;
-+ d = q->qs[x].qlen;
-+ if (q->max_depth < d)
-+ q->max_depth = d;
-+
-+ esfq_link(q, x);
-+}
-+
-+static unsigned int esfq_drop(struct Qdisc *sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_index d = q->max_depth;
-+ struct sk_buff *skb;
-+ unsigned int len;
-+
-+ /* Queue is full! Find the longest slot and
-+ drop a packet from it */
-+
-+ if (d > 1) {
-+ esfq_index x = q->dep[d+q->depth].next;
-+ skb = q->qs[x].prev;
-+ len = skb->len;
-+ __skb_unlink(skb, &q->qs[x]);
-+ kfree_skb(skb);
-+ esfq_dec(q, x);
-+ sch->q.qlen--;
-+ sch->qstats.drops++;
-+ sch->qstats.backlog -= len;
-+ return len;
-+ }
-+
-+ if (d == 1) {
-+ /* It is difficult to believe, but ALL THE SLOTS HAVE LENGTH 1. */
-+ d = q->next[q->tail];
-+ q->next[q->tail] = q->next[d];
-+ q->allot[q->next[d]] += q->quantum;
-+ skb = q->qs[d].prev;
-+ len = skb->len;
-+ __skb_unlink(skb, &q->qs[d]);
-+ kfree_skb(skb);
-+ esfq_dec(q, d);
-+ sch->q.qlen--;
-+ q->ht[q->hash[d]] = q->depth;
-+ sch->qstats.drops++;
-+ sch->qstats.backlog -= len;
-+ return len;
-+ }
-+
-+ return 0;
-+}
-+
-+static void esfq_q_enqueue(struct sk_buff *skb, struct esfq_sched_data *q, unsigned int end)
-+{
-+ unsigned hash = esfq_hash(q, skb);
-+ unsigned depth = q->depth;
-+ esfq_index x;
-+
-+ x = q->ht[hash];
-+ if (x == depth) {
-+ q->ht[hash] = x = q->dep[depth].next;
-+ q->hash[x] = hash;
-+ }
-+
-+ if (end == ESFQ_TAIL)
-+ __skb_queue_tail(&q->qs[x], skb);
-+ else
-+ __skb_queue_head(&q->qs[x], skb);
-+
-+ esfq_inc(q, x);
-+ if (q->qs[x].qlen == 1) { /* The flow is new */
-+ if (q->tail == depth) { /* It is the first flow */
-+ q->tail = x;
-+ q->next[x] = x;
-+ q->allot[x] = q->quantum;
-+ } else {
-+ q->next[x] = q->next[q->tail];
-+ q->next[q->tail] = x;
-+ q->tail = x;
-+ }
-+ }
-+}
-+
-+static int esfq_enqueue(struct sk_buff *skb, struct Qdisc* sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_q_enqueue(skb, q, ESFQ_TAIL);
-+ sch->qstats.backlog += skb->len;
-+ if (++sch->q.qlen < q->limit-1) {
-+ sch->bstats.bytes += skb->len;
-+ sch->bstats.packets++;
-+ return 0;
-+ }
-+
-+ sch->qstats.drops++;
-+ esfq_drop(sch);
-+ return NET_XMIT_CN;
-+}
-+
-+static struct sk_buff *esfq_peek(struct Qdisc* sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_index a;
-+
-+ /* No active slots */
-+ if (q->tail == q->depth)
-+ return NULL;
-+
-+ a = q->next[q->tail];
-+ return skb_peek(&q->qs[a]);
-+}
-+
-+static struct sk_buff *esfq_q_dequeue(struct esfq_sched_data *q)
-+{
-+ struct sk_buff *skb;
-+ unsigned depth = q->depth;
-+ esfq_index a, old_a;
-+
-+ /* No active slots */
-+ if (q->tail == depth)
-+ return NULL;
-+
-+ a = old_a = q->next[q->tail];
-+
-+ /* Grab packet */
-+ skb = __skb_dequeue(&q->qs[a]);
-+ esfq_dec(q, a);
-+
-+ /* Is the slot empty? */
-+ if (q->qs[a].qlen == 0) {
-+ q->ht[q->hash[a]] = depth;
-+ a = q->next[a];
-+ if (a == old_a) {
-+ q->tail = depth;
-+ return skb;
-+ }
-+ q->next[q->tail] = a;
-+ q->allot[a] += q->quantum;
-+ } else if ((q->allot[a] -= skb->len) <= 0) {
-+ q->tail = a;
-+ a = q->next[a];
-+ q->allot[a] += q->quantum;
-+ }
-+
-+ return skb;
-+}
-+
-+static struct sk_buff *esfq_dequeue(struct Qdisc* sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ struct sk_buff *skb;
-+
-+ skb = esfq_q_dequeue(q);
-+ if (skb == NULL)
-+ return NULL;
-+ sch->q.qlen--;
-+ sch->qstats.backlog -= skb->len;
-+ return skb;
-+}
-+
-+static void esfq_q_destroy(struct esfq_sched_data *q)
-+{
-+ del_timer(&q->perturb_timer);
-+ if(q->ht)
-+ kfree(q->ht);
-+ if(q->dep)
-+ kfree(q->dep);
-+ if(q->next)
-+ kfree(q->next);
-+ if(q->allot)
-+ kfree(q->allot);
-+ if(q->hash)
-+ kfree(q->hash);
-+ if(q->qs)
-+ kfree(q->qs);
-+}
-+
-+static void esfq_destroy(struct Qdisc *sch)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ esfq_q_destroy(q);
-+}
-+
-+
-+static void esfq_reset(struct Qdisc* sch)
-+{
-+ struct sk_buff *skb;
-+
-+ while ((skb = esfq_dequeue(sch)) != NULL)
-+ kfree_skb(skb);
-+}
-+
-+static void esfq_perturbation(unsigned long arg)
-+{
-+ struct Qdisc *sch = (struct Qdisc*)arg;
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+
-+ q->perturbation = net_random()&0x1F;
-+
-+ if (q->perturb_period) {
-+ q->perturb_timer.expires = jiffies + q->perturb_period;
-+ add_timer(&q->perturb_timer);
-+ }
-+}
-+
-+static unsigned int esfq_check_hash(unsigned int kind)
-+{
-+ switch (kind) {
-+ case TCA_SFQ_HASH_CTORIGDST:
-+ case TCA_SFQ_HASH_CTORIGSRC:
-+ case TCA_SFQ_HASH_CTREPLDST:
-+ case TCA_SFQ_HASH_CTREPLSRC:
-+ case TCA_SFQ_HASH_CTNATCHG:
-+#ifndef CONFIG_NET_SCH_ESFQ_NFCT
-+ {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "ESFQ: Conntrack hash types disabled in kernel config. Falling back to classic.\n");
-+ return TCA_SFQ_HASH_CLASSIC;
-+ }
-+#endif
-+ case TCA_SFQ_HASH_CLASSIC:
-+ case TCA_SFQ_HASH_DST:
-+ case TCA_SFQ_HASH_SRC:
-+ case TCA_SFQ_HASH_FWMARK:
-+ return kind;
-+ default:
-+ {
-+ if (net_ratelimit())
-+ printk(KERN_WARNING "ESFQ: Unknown hash type. Falling back to classic.\n");
-+ return TCA_SFQ_HASH_CLASSIC;
-+ }
-+ }
-+}
-+
-+static int esfq_q_init(struct esfq_sched_data *q, struct nlattr *opt)
-+{
-+ struct tc_esfq_qopt *ctl = nla_data(opt);
-+ esfq_index p = ~0U/2;
-+ int i;
-+
-+ if (opt && opt->nla_len < nla_attr_size(sizeof(*ctl)))
-+ return -EINVAL;
-+
-+ q->perturbation = 0;
-+ q->hash_kind = TCA_SFQ_HASH_CLASSIC;
-+ q->max_depth = 0;
-+ if (opt == NULL) {
-+ q->perturb_period = 0;
-+ q->hash_divisor = 1024;
-+ q->tail = q->limit = q->depth = 128;
-+
-+ } else {
-+ struct tc_esfq_qopt *ctl = nla_data(opt);
-+ if (ctl->quantum)
-+ q->quantum = ctl->quantum;
-+ q->perturb_period = ctl->perturb_period*HZ;
-+ q->hash_divisor = ctl->divisor ? : 1024;
-+ q->tail = q->limit = q->depth = ctl->flows ? : 128;
-+
-+ if ( q->depth > p - 1 )
-+ return -EINVAL;
-+
-+ if (ctl->limit)
-+ q->limit = min_t(u32, ctl->limit, q->depth);
-+
-+ if (ctl->hash_kind) {
-+ q->hash_kind = esfq_check_hash(ctl->hash_kind);
-+ }
-+ }
-+
-+ q->ht = kmalloc(q->hash_divisor*sizeof(esfq_index), GFP_KERNEL);
-+ if (!q->ht)
-+ goto err_case;
-+ q->dep = kmalloc((1+q->depth*2)*sizeof(struct esfq_head), GFP_KERNEL);
-+ if (!q->dep)
-+ goto err_case;
-+ q->next = kmalloc(q->depth*sizeof(esfq_index), GFP_KERNEL);
-+ if (!q->next)
-+ goto err_case;
-+ q->allot = kmalloc(q->depth*sizeof(short), GFP_KERNEL);
-+ if (!q->allot)
-+ goto err_case;
-+ q->hash = kmalloc(q->depth*sizeof(unsigned short), GFP_KERNEL);
-+ if (!q->hash)
-+ goto err_case;
-+ q->qs = kmalloc(q->depth*sizeof(struct sk_buff_head), GFP_KERNEL);
-+ if (!q->qs)
-+ goto err_case;
-+
-+ for (i=0; i< q->hash_divisor; i++)
-+ q->ht[i] = q->depth;
-+ for (i=0; i<q->depth; i++) {
-+ skb_queue_head_init(&q->qs[i]);
-+ q->dep[i+q->depth].next = i+q->depth;
-+ q->dep[i+q->depth].prev = i+q->depth;
-+ }
-+
-+ for (i=0; i<q->depth; i++)
-+ esfq_link(q, i);
-+ return 0;
-+err_case:
-+ esfq_q_destroy(q);
-+ return -ENOBUFS;
-+}
-+
-+static int esfq_init(struct Qdisc *sch, struct nlattr *opt)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ int err;
-+
-+ q->quantum = psched_mtu(qdisc_dev(sch)); /* default */
-+ if ((err = esfq_q_init(q, opt)))
-+ return err;
-+
-+ init_timer(&q->perturb_timer);
-+ q->perturb_timer.data = (unsigned long)sch;
-+ q->perturb_timer.function = esfq_perturbation;
-+ if (q->perturb_period) {
-+ q->perturb_timer.expires = jiffies + q->perturb_period;
-+ add_timer(&q->perturb_timer);
-+ }
-+
-+ return 0;
-+}
-+
-+static int esfq_change(struct Qdisc *sch, struct nlattr *opt)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ struct esfq_sched_data new;
-+ struct sk_buff *skb;
-+ int err;
-+
-+ /* set up new queue */
-+ memset(&new, 0, sizeof(struct esfq_sched_data));
-+ new.quantum = psched_mtu(qdisc_dev(sch)); /* default */
-+ if ((err = esfq_q_init(&new, opt)))
-+ return err;
-+
-+ /* copy all packets from the old queue to the new queue */
-+ sch_tree_lock(sch);
-+ while ((skb = esfq_q_dequeue(q)) != NULL)
-+ esfq_q_enqueue(skb, &new, ESFQ_TAIL);
-+
-+ /* clean up the old queue */
-+ esfq_q_destroy(q);
-+
-+ /* copy elements of the new queue into the old queue */
-+ q->perturb_period = new.perturb_period;
-+ q->quantum = new.quantum;
-+ q->limit = new.limit;
-+ q->depth = new.depth;
-+ q->hash_divisor = new.hash_divisor;
-+ q->hash_kind = new.hash_kind;
-+ q->tail = new.tail;
-+ q->max_depth = new.max_depth;
-+ q->ht = new.ht;
-+ q->dep = new.dep;
-+ q->next = new.next;
-+ q->allot = new.allot;
-+ q->hash = new.hash;
-+ q->qs = new.qs;
-+
-+ /* finish up */
-+ if (q->perturb_period) {
-+ q->perturb_timer.expires = jiffies + q->perturb_period;
-+ add_timer(&q->perturb_timer);
-+ } else {
-+ q->perturbation = 0;
-+ }
-+ sch_tree_unlock(sch);
-+ return 0;
-+}
-+
-+static int esfq_dump(struct Qdisc *sch, struct sk_buff *skb)
-+{
-+ struct esfq_sched_data *q = qdisc_priv(sch);
-+ unsigned char *b = skb_tail_pointer(skb);
-+ struct tc_esfq_qopt opt;
-+
-+ opt.quantum = q->quantum;
-+ opt.perturb_period = q->perturb_period/HZ;
-+
-+ opt.limit = q->limit;
-+ opt.divisor = q->hash_divisor;
-+ opt.flows = q->depth;
-+ opt.hash_kind = q->hash_kind;
-+
-+ NLA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt);
-+
-+ return skb->len;
-+
-+nla_put_failure:
-+ nlmsg_trim(skb, b);
-+ return -1;
-+}
-+
-+static struct Qdisc_ops esfq_qdisc_ops =
-+{
-+ .next = NULL,
-+ .cl_ops = NULL,
-+ .id = "esfq",
-+ .priv_size = sizeof(struct esfq_sched_data),
-+ .enqueue = esfq_enqueue,
-+ .dequeue = esfq_dequeue,
-+ .peek = esfq_peek,
-+ .drop = esfq_drop,
-+ .init = esfq_init,
-+ .reset = esfq_reset,
-+ .destroy = esfq_destroy,
-+ .change = esfq_change,
-+ .dump = esfq_dump,
-+ .owner = THIS_MODULE,
-+};
-+
-+static int __init esfq_module_init(void)
-+{
-+ return register_qdisc(&esfq_qdisc_ops);
-+}
-+static void __exit esfq_module_exit(void)
-+{
-+ unregister_qdisc(&esfq_qdisc_ops);
-+}
-+module_init(esfq_module_init)
-+module_exit(esfq_module_exit)
-+MODULE_LICENSE("GPL");
+++ /dev/null
---- a/include/linux/jhash.h
-+++ b/include/linux/jhash.h
-@@ -3,80 +3,95 @@
-
- /* jhash.h: Jenkins hash support.
- *
-- * Copyright (C) 1996 Bob Jenkins (bob_jenkins@burtleburtle.net)
-+ * Copyright (C) 2006. Bob Jenkins (bob_jenkins@burtleburtle.net)
- *
- * http://burtleburtle.net/bob/hash/
- *
- * These are the credits from Bob's sources:
- *
-- * lookup2.c, by Bob Jenkins, December 1996, Public Domain.
-- * hash(), hash2(), hash3, and mix() are externally useful functions.
-- * Routines to test the hash are included if SELF_TEST is defined.
-- * You can use this free for any purpose. It has no warranty.
-+ * lookup3.c, by Bob Jenkins, May 2006, Public Domain.
- *
-- * Copyright (C) 2003 David S. Miller (davem@redhat.com)
-+ * These are functions for producing 32-bit hashes for hash table lookup.
-+ * hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
-+ * are externally useful functions. Routines to test the hash are included
-+ * if SELF_TEST is defined. You can use this free for any purpose. It's in
-+ * the public domain. It has no warranty.
-+ *
-+ * Copyright (C) 2009 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu)
- *
- * I've modified Bob's hash to be useful in the Linux kernel, and
-- * any bugs present are surely my fault. -DaveM
-+ * any bugs present are my fault. Jozsef
- */
-
--/* NOTE: Arguments are modified. */
--#define __jhash_mix(a, b, c) \
-+#define __rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
-+
-+/* __jhash_mix - mix 3 32-bit values reversibly. */
-+#define __jhash_mix(a,b,c) \
-+{ \
-+ a -= c; a ^= __rot(c, 4); c += b; \
-+ b -= a; b ^= __rot(a, 6); a += c; \
-+ c -= b; c ^= __rot(b, 8); b += a; \
-+ a -= c; a ^= __rot(c,16); c += b; \
-+ b -= a; b ^= __rot(a,19); a += c; \
-+ c -= b; c ^= __rot(b, 4); b += a; \
-+}
-+
-+/* __jhash_final - final mixing of 3 32-bit values (a,b,c) into c */
-+#define __jhash_final(a,b,c) \
- { \
-- a -= b; a -= c; a ^= (c>>13); \
-- b -= c; b -= a; b ^= (a<<8); \
-- c -= a; c -= b; c ^= (b>>13); \
-- a -= b; a -= c; a ^= (c>>12); \
-- b -= c; b -= a; b ^= (a<<16); \
-- c -= a; c -= b; c ^= (b>>5); \
-- a -= b; a -= c; a ^= (c>>3); \
-- b -= c; b -= a; b ^= (a<<10); \
-- c -= a; c -= b; c ^= (b>>15); \
-+ c ^= b; c -= __rot(b,14); \
-+ a ^= c; a -= __rot(c,11); \
-+ b ^= a; b -= __rot(a,25); \
-+ c ^= b; c -= __rot(b,16); \
-+ a ^= c; a -= __rot(c,4); \
-+ b ^= a; b -= __rot(a,14); \
-+ c ^= b; c -= __rot(b,24); \
- }
-
--/* The golden ration: an arbitrary value */
--#define JHASH_GOLDEN_RATIO 0x9e3779b9
-+/* An arbitrary initial parameter */
-+#define JHASH_GOLDEN_RATIO 0xdeadbeef
-
- /* The most generic version, hashes an arbitrary sequence
- * of bytes. No alignment or length assumptions are made about
-- * the input key.
-+ * the input key. The result depends on endianness.
- */
- static inline u32 jhash(const void *key, u32 length, u32 initval)
- {
-- u32 a, b, c, len;
-+ u32 a,b,c;
- const u8 *k = key;
-
-- len = length;
-- a = b = JHASH_GOLDEN_RATIO;
-- c = initval;
--
-- while (len >= 12) {
-- a += (k[0] +((u32)k[1]<<8) +((u32)k[2]<<16) +((u32)k[3]<<24));
-- b += (k[4] +((u32)k[5]<<8) +((u32)k[6]<<16) +((u32)k[7]<<24));
-- c += (k[8] +((u32)k[9]<<8) +((u32)k[10]<<16)+((u32)k[11]<<24));
--
-- __jhash_mix(a,b,c);
-+ /* Set up the internal state */
-+ a = b = c = JHASH_GOLDEN_RATIO + length + initval;
-
-+ /* all but the last block: affect some 32 bits of (a,b,c) */
-+ while (length > 12) {
-+ a += (k[0] + ((u32)k[1]<<8) + ((u32)k[2]<<16) + ((u32)k[3]<<24));
-+ b += (k[4] + ((u32)k[5]<<8) + ((u32)k[6]<<16) + ((u32)k[7]<<24));
-+ c += (k[8] + ((u32)k[9]<<8) + ((u32)k[10]<<16) + ((u32)k[11]<<24));
-+ __jhash_mix(a, b, c);
-+ length -= 12;
- k += 12;
-- len -= 12;
- }
-
-- c += length;
-- switch (len) {
-- case 11: c += ((u32)k[10]<<24);
-- case 10: c += ((u32)k[9]<<16);
-- case 9 : c += ((u32)k[8]<<8);
-- case 8 : b += ((u32)k[7]<<24);
-- case 7 : b += ((u32)k[6]<<16);
-- case 6 : b += ((u32)k[5]<<8);
-+ /* last block: affect all 32 bits of (c) */
-+ /* all the case statements fall through */
-+ switch (length) {
-+ case 12: c += (u32)k[11]<<24;
-+ case 11: c += (u32)k[10]<<16;
-+ case 10: c += (u32)k[9]<<8;
-+ case 9 : c += k[8];
-+ case 8 : b += (u32)k[7]<<24;
-+ case 7 : b += (u32)k[6]<<16;
-+ case 6 : b += (u32)k[5]<<8;
- case 5 : b += k[4];
-- case 4 : a += ((u32)k[3]<<24);
-- case 3 : a += ((u32)k[2]<<16);
-- case 2 : a += ((u32)k[1]<<8);
-+ case 4 : a += (u32)k[3]<<24;
-+ case 3 : a += (u32)k[2]<<16;
-+ case 2 : a += (u32)k[1]<<8;
- case 1 : a += k[0];
-- };
--
-- __jhash_mix(a,b,c);
-+ __jhash_final(a, b, c);
-+ case 0 :
-+ break;
-+ }
-
- return c;
- }
-@@ -86,58 +101,57 @@ static inline u32 jhash(const void *key,
- */
- static inline u32 jhash2(const u32 *k, u32 length, u32 initval)
- {
-- u32 a, b, c, len;
-+ u32 a, b, c;
-
-- a = b = JHASH_GOLDEN_RATIO;
-- c = initval;
-- len = length;
-+ /* Set up the internal state */
-+ a = b = c = JHASH_GOLDEN_RATIO + (length<<2) + initval;
-
-- while (len >= 3) {
-+ /* handle most of the key */
-+ while (length > 3) {
- a += k[0];
- b += k[1];
- c += k[2];
- __jhash_mix(a, b, c);
-- k += 3; len -= 3;
-+ length -= 3;
-+ k += 3;
- }
-
-- c += length * 4;
--
-- switch (len) {
-- case 2 : b += k[1];
-- case 1 : a += k[0];
-- };
--
-- __jhash_mix(a,b,c);
-+ /* handle the last 3 u32's */
-+ /* all the case statements fall through */
-+ switch (length) {
-+ case 3: c += k[2];
-+ case 2: b += k[1];
-+ case 1: a += k[0];
-+ __jhash_final(a, b, c);
-+ case 0: /* case 0: nothing left to add */
-+ break;
-+ }
-
- return c;
- }
-
--
- /* A special ultra-optimized versions that knows they are hashing exactly
- * 3, 2 or 1 word(s).
-- *
-- * NOTE: In partilar the "c += length; __jhash_mix(a,b,c);" normally
-- * done at the end is not done here.
- */
- static inline u32 jhash_3words(u32 a, u32 b, u32 c, u32 initval)
- {
-- a += JHASH_GOLDEN_RATIO;
-- b += JHASH_GOLDEN_RATIO;
-- c += initval;
-+ a += JHASH_GOLDEN_RATIO + initval;
-+ b += JHASH_GOLDEN_RATIO + initval;
-+ c += JHASH_GOLDEN_RATIO + initval;
-
-- __jhash_mix(a, b, c);
-+ __jhash_final(a, b, c);
-
- return c;
- }
-
- static inline u32 jhash_2words(u32 a, u32 b, u32 initval)
- {
-- return jhash_3words(a, b, 0, initval);
-+ return jhash_3words(0, a, b, initval);
- }
-
- static inline u32 jhash_1word(u32 a, u32 initval)
- {
-- return jhash_3words(a, 0, 0, initval);
-+ return jhash_3words(0, 0, a, initval);
- }
-
- #endif /* _LINUX_JHASH_H */
+++ /dev/null
---- a/arch/mips/include/asm/string.h
-+++ b/arch/mips/include/asm/string.h
-@@ -133,11 +133,44 @@ strncmp(__const__ char *__cs, __const__
-
- #define __HAVE_ARCH_MEMSET
- extern void *memset(void *__s, int __c, size_t __count);
-+#define memset(__s, __c, len) \
-+({ \
-+ size_t __len = (len); \
-+ void *__ret; \
-+ if (__builtin_constant_p(len) && __len >= 64) \
-+ __ret = memset((__s), (__c), __len); \
-+ else \
-+ __ret = __builtin_memset((__s), (__c), __len); \
-+ __ret; \
-+})
-
- #define __HAVE_ARCH_MEMCPY
- extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
-+#define memcpy(dst, src, len) \
-+({ \
-+ size_t __len = (len); \
-+ void *__ret; \
-+ if (__builtin_constant_p(len) && __len >= 64) \
-+ __ret = memcpy((dst), (src), __len); \
-+ else \
-+ __ret = __builtin_memcpy((dst), (src), __len); \
-+ __ret; \
-+})
-
- #define __HAVE_ARCH_MEMMOVE
- extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
-+#define memmove(dst, src, len) \
-+({ \
-+ size_t __len = (len); \
-+ void *__ret; \
-+ if (__builtin_constant_p(len) && __len >= 64) \
-+ __ret = memmove((dst), (src), __len); \
-+ else \
-+ __ret = __builtin_memmove((dst), (src), __len); \
-+ __ret; \
-+})
-+
-+#define __HAVE_ARCH_MEMCMP
-+#define memcmp(src1, src2, len) __builtin_memcmp((src1), (src2), (len))
-
- #endif /* _ASM_STRING_H */
---- a/arch/mips/lib/Makefile
-+++ b/arch/mips/lib/Makefile
-@@ -3,7 +3,7 @@
- #
-
- lib-y += csum_partial.o delay.o memcpy.o memcpy-inatomic.o memset.o \
-- strlen_user.o strncpy_user.o strnlen_user.o uncached.o
-+ strlen_user.o strncpy_user.o strnlen_user.o uncached.o memcmp.o
-
- obj-y += iomap.o
- obj-$(CONFIG_PCI) += iomap-pci.o
---- /dev/null
-+++ b/arch/mips/lib/memcmp.c
-@@ -0,0 +1,22 @@
-+/*
-+ * copied from linux/lib/string.c
-+ *
-+ * Copyright (C) 1991, 1992 Linus Torvalds
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/string.h>
-+
-+#undef memcmp
-+int memcmp(const void *cs, const void *ct, size_t count)
-+{
-+ const unsigned char *su1, *su2;
-+ int res = 0;
-+
-+ for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
-+ if ((res = *su1 - *su2) != 0)
-+ break;
-+ return res;
-+}
-+EXPORT_SYMBOL(memcmp);
-+
+++ /dev/null
---- a/include/linux/slab.h
-+++ b/include/linux/slab.h
-@@ -124,8 +124,8 @@ int kmem_ptr_validate(struct kmem_cache
- * to do various tricks to work around compiler limitations in order to
- * ensure proper constant folding.
- */
--#define KMALLOC_SHIFT_HIGH ((MAX_ORDER + PAGE_SHIFT - 1) <= 25 ? \
-- (MAX_ORDER + PAGE_SHIFT - 1) : 25)
-+#define KMALLOC_SHIFT_HIGH ((MAX_ORDER + PAGE_SHIFT - 1) <= 17 ? \
-+ (MAX_ORDER + PAGE_SHIFT - 1) : 17)
-
- #define KMALLOC_MAX_SIZE (1UL << KMALLOC_SHIFT_HIGH)
- #define KMALLOC_MAX_ORDER (KMALLOC_SHIFT_HIGH - PAGE_SHIFT)
+++ /dev/null
---- a/fs/jffs2/build.c
-+++ b/fs/jffs2/build.c
-@@ -111,6 +111,17 @@ static int jffs2_build_filesystem(struct
- dbg_fsbuild("scanned flash completely\n");
- jffs2_dbg_dump_block_lists_nolock(c);
-
-+ if (c->flags & (1 << 7)) {
-+ printk("%s(): unlocking the mtd device... ", __func__);
-+ if (c->mtd->unlock)
-+ c->mtd->unlock(c->mtd, 0, c->mtd->size);
-+ printk("done.\n");
-+
-+ printk("%s(): erasing all blocks after the end marker... ", __func__);
-+ jffs2_erase_pending_blocks(c, -1);
-+ printk("done.\n");
-+ }
-+
- dbg_fsbuild("pass 1 starting\n");
- c->flags |= JFFS2_SB_FLAG_BUILDING;
- /* Now scan the directory tree, increasing nlink according to every dirent found. */
---- a/fs/jffs2/scan.c
-+++ b/fs/jffs2/scan.c
-@@ -72,7 +72,7 @@ static int file_dirty(struct jffs2_sb_in
- return ret;
- if ((ret = jffs2_scan_dirty_space(c, jeb, jeb->free_size)))
- return ret;
-- /* Turned wasted size into dirty, since we apparently
-+ /* Turned wasted size into dirty, since we apparently
- think it's recoverable now. */
- jeb->dirty_size += jeb->wasted_size;
- c->dirty_size += jeb->wasted_size;
-@@ -144,8 +144,11 @@ int jffs2_scan_medium(struct jffs2_sb_in
- /* reset summary info for next eraseblock scan */
- jffs2_sum_reset_collected(s);
-
-- ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
-- buf_size, s);
-+ if (c->flags & (1 << 7))
-+ ret = BLK_STATE_ALLFF;
-+ else
-+ ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
-+ buf_size, s);
-
- if (ret < 0)
- goto out;
-@@ -400,7 +403,7 @@ static int jffs2_scan_xref_node(struct j
- if (!ref)
- return -ENOMEM;
-
-- /* BEFORE jffs2_build_xattr_subsystem() called,
-+ /* BEFORE jffs2_build_xattr_subsystem() called,
- * and AFTER xattr_ref is marked as a dead xref,
- * ref->xid is used to store 32bit xid, xd is not used
- * ref->ino is used to store 32bit inode-number, ic is not used
-@@ -473,7 +476,7 @@ static int jffs2_scan_eraseblock (struct
- struct jffs2_sum_marker *sm;
- void *sumptr = NULL;
- uint32_t sumlen;
--
-+
- if (!buf_size) {
- /* XIP case. Just look, point at the summary if it's there */
- sm = (void *)buf + c->sector_size - sizeof(*sm);
-@@ -489,9 +492,9 @@ static int jffs2_scan_eraseblock (struct
- buf_len = sizeof(*sm);
-
- /* Read as much as we want into the _end_ of the preallocated buffer */
-- err = jffs2_fill_scan_buf(c, buf + buf_size - buf_len,
-+ err = jffs2_fill_scan_buf(c, buf + buf_size - buf_len,
- jeb->offset + c->sector_size - buf_len,
-- buf_len);
-+ buf_len);
- if (err)
- return err;
-
-@@ -510,9 +513,9 @@ static int jffs2_scan_eraseblock (struct
- }
- if (buf_len < sumlen) {
- /* Need to read more so that the entire summary node is present */
-- err = jffs2_fill_scan_buf(c, sumptr,
-+ err = jffs2_fill_scan_buf(c, sumptr,
- jeb->offset + c->sector_size - sumlen,
-- sumlen - buf_len);
-+ sumlen - buf_len);
- if (err)
- return err;
- }
-@@ -525,7 +528,7 @@ static int jffs2_scan_eraseblock (struct
-
- if (buf_size && sumlen > buf_size)
- kfree(sumptr);
-- /* If it returns with a real error, bail.
-+ /* If it returns with a real error, bail.
- If it returns positive, that's a block classification
- (i.e. BLK_STATE_xxx) so return that too.
- If it returns zero, fall through to full scan. */
-@@ -546,6 +549,17 @@ static int jffs2_scan_eraseblock (struct
- return err;
- }
-
-+ if ((buf[0] == 0xde) &&
-+ (buf[1] == 0xad) &&
-+ (buf[2] == 0xc0) &&
-+ (buf[3] == 0xde)) {
-+ /* end of filesystem. erase everything after this point */
-+ printk("%s(): End of filesystem marker found at 0x%x\n", __func__, jeb->offset);
-+ c->flags |= (1 << 7);
-+
-+ return BLK_STATE_ALLFF;
-+ }
-+
- /* We temporarily use 'ofs' as a pointer into the buffer/jeb */
- ofs = 0;
-
-@@ -671,7 +685,7 @@ scan_more:
- scan_end = buf_len;
- goto more_empty;
- }
--
-+
- /* See how much more there is to read in this eraseblock... */
- buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
- if (!buf_len) {
-@@ -907,7 +921,7 @@ scan_more:
-
- D1(printk(KERN_DEBUG "Block at 0x%08x: free 0x%08x, dirty 0x%08x, unchecked 0x%08x, used 0x%08x, wasted 0x%08x\n",
- jeb->offset,jeb->free_size, jeb->dirty_size, jeb->unchecked_size, jeb->used_size, jeb->wasted_size));
--
-+
- /* mark_node_obsolete can add to wasted !! */
- if (jeb->wasted_size) {
- jeb->dirty_size += jeb->wasted_size;
+++ /dev/null
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -1377,11 +1377,18 @@ static inline int skb_network_offset(con
- *
- * Various parts of the networking layer expect at least 32 bytes of
- * headroom, you should not reduce this.
-+ *
-+ * This has been changed to 64 to acommodate for routing between ethernet
-+ * and wireless, but only for new allocations
- */
- #ifndef NET_SKB_PAD
- #define NET_SKB_PAD 32
- #endif
-
-+#ifndef NET_SKB_PAD_ALLOC
-+#define NET_SKB_PAD_ALLOC 64
-+#endif
-+
- extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
-
- static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
-@@ -1471,9 +1478,9 @@ static inline void __skb_queue_purge(str
- static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
- gfp_t gfp_mask)
- {
-- struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD, gfp_mask);
-+ struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD_ALLOC, gfp_mask);
- if (likely(skb))
-- skb_reserve(skb, NET_SKB_PAD);
-+ skb_reserve(skb, NET_SKB_PAD_ALLOC);
- return skb;
- }
-
-@@ -1556,7 +1563,7 @@ static inline int __skb_cow(struct sk_bu
- delta = headroom - skb_headroom(skb);
-
- if (delta || cloned)
-- return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD), 0,
-+ return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD_ALLOC), 0,
- GFP_ATOMIC);
- return 0;
- }
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
-@@ -339,9 +339,9 @@ struct sk_buff *__netdev_alloc_skb(struc
- int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1;
- struct sk_buff *skb;
-
-- skb = __alloc_skb(length + NET_SKB_PAD, gfp_mask, 0, node);
-+ skb = __alloc_skb(length + NET_SKB_PAD_ALLOC, gfp_mask, 0, node);
- if (likely(skb)) {
-- skb_reserve(skb, NET_SKB_PAD);
-+ skb_reserve(skb, NET_SKB_PAD_ALLOC);
- skb->dev = dev;
- }
- return skb;
+++ /dev/null
---- /dev/null
-+++ b/include/asm-powerpc/segment.h
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_SEGMENT_H
-+#define _ASM_SEGMENT_H
-+
-+/* Only here because we have some old header files that expect it.. */
-+
-+#endif /* _ASM_SEGMENT_H */
+++ /dev/null
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -49,7 +49,9 @@ ifneq ($(SUBARCH),$(ARCH))
- endif
-
- ifndef CONFIG_FUNCTION_TRACER
--cflags-y := -ffunction-sections
-+ ifndef CONFIG_PROFILING
-+ cflags-y := -ffunction-sections
-+ endif
- endif
- ifdef CONFIG_FUNCTION_GRAPH_TRACER
- ifndef KBUILD_MCOUNT_RA_ADDRESS
---- a/arch/mips/oprofile/op_model_mipsxx.c
-+++ b/arch/mips/oprofile/op_model_mipsxx.c
-@@ -298,6 +298,11 @@ static void reset_counters(void *arg)
- }
- }
-
-+static irqreturn_t mipsxx_perfcount_int(int irq, void *dev_id)
-+{
-+ return mipsxx_perfcount_handler();
-+}
-+
- static int __init mipsxx_init(void)
- {
- int counters;
-@@ -374,6 +379,10 @@ static int __init mipsxx_init(void)
- save_perf_irq = perf_irq;
- perf_irq = mipsxx_perfcount_handler;
-
-+ if (cp0_perfcount_irq >= 0)
-+ return request_irq(cp0_perfcount_irq, mipsxx_perfcount_int,
-+ IRQF_SHARED, "Perfcounter", save_perf_irq);
-+
- return 0;
- }
-
-@@ -381,6 +390,9 @@ static void mipsxx_exit(void)
- {
- int counters = op_model_mipsxx_ops.num_counters;
-
-+ if (cp0_perfcount_irq >= 0)
-+ free_irq(cp0_perfcount_irq, save_perf_irq);
-+
- counters = counters_per_cpu_to_total(counters);
- on_each_cpu(reset_counters, (void *)(long)counters, 1);
-
+++ /dev/null
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -180,6 +180,7 @@ source "fs/ubifs/Kconfig"
- source "fs/cramfs/Kconfig"
- source "fs/squashfs/Kconfig"
- source "fs/freevxfs/Kconfig"
-+source "fs/mini_fo/Kconfig"
- source "fs/minix/Kconfig"
- source "fs/omfs/Kconfig"
- source "fs/hpfs/Kconfig"
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -77,6 +77,7 @@ obj-$(CONFIG_SQUASHFS) += squashfs/
- obj-y += ramfs/
- obj-$(CONFIG_HUGETLBFS) += hugetlbfs/
- obj-$(CONFIG_CODA_FS) += coda/
-+obj-$(CONFIG_MINI_FO) += mini_fo/
- obj-$(CONFIG_MINIX_FS) += minix/
- obj-$(CONFIG_FAT_FS) += fat/
- obj-$(CONFIG_BFS_FS) += bfs/
---- /dev/null
-+++ b/fs/mini_fo/aux.c
-@@ -0,0 +1,577 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+/* check if file exists in storage */
-+int exists_in_storage(dentry_t *dentry)
-+{
-+ check_mini_fo_dentry(dentry);
-+ if(dtost(dentry) == MODIFIED || dtost(dentry) == CREATED || dtost(dentry) == DEL_REWRITTEN)
-+ return 1;
-+ return 0;
-+}
-+
-+/* check if dentry is in an existing state */
-+int is_mini_fo_existant(dentry_t *dentry)
-+{
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) == DELETED || dtost(dentry) == NON_EXISTANT)
-+ return 0;
-+ else
-+ return 1;
-+}
-+
-+/*
-+ * This function will create a negative storage dentry for
-+ * dentry, what is required for many create like options.
-+ * It will create the storage structure if necessary.
-+ */
-+int get_neg_sto_dentry(dentry_t *dentry)
-+{
-+ int err = 0;
-+ unsigned int len;
-+ const unsigned char *name;
-+
-+ if(!dentry ||
-+ !dtopd(dentry) ||
-+ !(dtost(dentry) == UNMODIFIED ||
-+ dtost(dentry) == NON_EXISTANT ||
-+ dtost(dentry) == DELETED)) {
-+ printk(KERN_CRIT "mini_fo: get_neg_sto_dentry: invalid dentry passed.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ /* Have we got a neg. dentry already? */
-+ if(dtohd2(dentry)) {
-+ err = 0;
-+ goto out;
-+ }
-+ if(dtost(dentry->d_parent) == UNMODIFIED) {
-+ /* build sto struct */
-+ err = build_sto_structure(dentry->d_parent->d_parent, dentry->d_parent);
-+ if(err ||
-+ dtost(dentry->d_parent) != MODIFIED) {
-+ printk(KERN_CRIT "mini_fo: get_neg_sto_dentry: ERROR building sto structure.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ }
-+
-+ len = dentry->d_name.len;
-+ name = dentry->d_name.name;
-+
-+ dtohd2(dentry) =
-+ lookup_one_len(name, dtohd2(dentry->d_parent), len);
-+
-+ out:
-+ return err;
-+}
-+
-+int check_mini_fo_dentry(dentry_t *dentry)
-+{
-+ ASSERT(dentry != NULL);
-+ ASSERT(dtopd(dentry) != NULL);
-+ ASSERT((dtohd(dentry) != NULL) || (dtohd2(dentry) != NULL));
-+
-+/* if(dtost(dentry) == MODIFIED) { */
-+/* ASSERT(dentry->d_inode != NULL); */
-+/* ASSERT(dtohd(dentry) != NULL); */
-+/* ASSERT(dtohd(dentry)->d_inode != NULL); */
-+/* ASSERT(dtohd2(dentry) != NULL); */
-+/* ASSERT(dtohd2(dentry)->d_inode != NULL); */
-+/* } */
-+/* else if(dtost(dentry) == UNMODIFIED) { */
-+/* ASSERT(dentry->d_inode != NULL); */
-+/* ASSERT( */
-+/* } */
-+ return 0;
-+}
-+
-+int check_mini_fo_file(file_t *file)
-+{
-+ ASSERT(file != NULL);
-+ ASSERT(ftopd(file) != NULL);
-+ ASSERT(file->f_dentry != NULL);
-+
-+ /* violent checking, check depending of state and type
-+ * if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {}
-+ */
-+ ASSERT((ftohf(file) != NULL) || (ftohf2(file) != NULL));
-+ return 0;
-+}
-+
-+int check_mini_fo_inode(inode_t *inode)
-+{
-+ ASSERT(inode != NULL);
-+ ASSERT(itopd(inode) != NULL);
-+ ASSERT((itohi(inode) != NULL) || (itohi2(inode) != NULL));
-+ return 0;
-+}
-+
-+/*
-+ * will walk a base path as provided by get_mini_fo_bpath and return
-+ * the (hopefully ;-) ) positive dentry of the renamed base dir.
-+ *
-+ * This does some work of path_init.
-+ */
-+dentry_t *bpath_walk(super_block_t *sb, char *bpath)
-+{
-+ int err;
-+ struct vfsmount *mnt;
-+ struct nameidata nd;
-+
-+ /* be paranoid */
-+ if(!bpath || bpath[0] != '/') {
-+ printk(KERN_CRIT "mini_fo: bpath_walk: Invalid string.\n");
-+ return NULL;
-+ }
-+ if(!sb || !stopd(sb)) {
-+ printk(KERN_CRIT "mini_fo: bpath_walk: Invalid sb.\n");
-+ return NULL;
-+ }
-+
-+ /* fix this: how do I reach this lock?
-+ * read_lock(¤t->fs->lock); */
-+ mnt = mntget(stopd(sb)->hidden_mnt);
-+ /* read_unlock(¤t->fs->lock); */
-+
-+ err = vfs_path_lookup(mnt->mnt_root, mnt, bpath+1, 0, &nd);
-+
-+ /* validate */
-+ if (err || !nd.dentry || !nd.dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: bpath_walk: path_walk failed.\n");
-+ return NULL;
-+ }
-+ return nd.dentry;
-+}
-+
-+
-+/* returns the full path of the basefile incl. its name */
-+int get_mini_fo_bpath(dentry_t *dentry, char **bpath, int *bpath_len)
-+{
-+ char *buf_walker;
-+ int len = 0;
-+ dentry_t *sky_walker;
-+
-+ if(!dentry || !dtohd(dentry)) {
-+ printk(KERN_CRIT "mini_fo: get_mini_fo_bpath: invalid dentry passed.\n");
-+ return -1;
-+ }
-+ sky_walker = dtohd(dentry);
-+
-+ do {
-+ len += sky_walker->d_name.len + 1 ; /* 1 for '/' */
-+ sky_walker = sky_walker->d_parent;
-+ } while(sky_walker != stopd(dentry->d_inode->i_sb)->base_dir_dentry);
-+
-+ /* 1 to oil the loop */
-+ *bpath = (char*) kmalloc(len + 1, GFP_KERNEL);
-+ if(!*bpath) {
-+ printk(KERN_CRIT "mini_fo: get_mini_fo_bpath: out of mem.\n");
-+ return -1;
-+ }
-+ buf_walker = *bpath+len; /* put it on last char */
-+ *buf_walker = '\n';
-+ sky_walker = dtohd(dentry);
-+
-+ do {
-+ buf_walker -= sky_walker->d_name.len;
-+ strncpy(buf_walker,
-+ sky_walker->d_name.name,
-+ sky_walker->d_name.len);
-+ *(--buf_walker) = '/';
-+ sky_walker = sky_walker->d_parent;
-+ } while(sky_walker != stopd(dentry->d_inode->i_sb)->base_dir_dentry);
-+
-+ /* bpath_len doesn't count newline! */
-+ *bpath_len = len;
-+ return 0;
-+}
-+
-+int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
-+ dentry_t *src_dentry, struct vfsmount *src_mnt)
-+{
-+ void *buf;
-+ mm_segment_t old_fs;
-+ file_t *tgt_file;
-+ file_t *src_file;
-+ int bytes, len, tmp, err;
-+ err = 0;
-+
-+ if(!(tgt_dentry->d_inode && src_dentry->d_inode)) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, neg. dentry passed.\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ dget(tgt_dentry);
-+ dget(src_dentry);
-+ mntget(tgt_mnt);
-+ mntget(src_mnt);
-+
-+ /* open file write only */
-+ tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1);
-+ if(!tgt_file || IS_ERR(tgt_file)) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening target file.\n");
-+ err = PTR_ERR(tgt_file);
-+ goto out_err;
-+ }
-+
-+ /* open file read only */
-+ src_file = dentry_open(src_dentry, src_mnt, 0x0);
-+ if(!src_file || IS_ERR(src_file)) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening source file.\n");
-+ err = PTR_ERR(src_file);
-+
-+ /* close target file */
-+ fput(tgt_file);
-+ goto out_err;
-+ }
-+
-+ /* check if the filesystem(s) support read respective write */
-+ if(!src_file->f_op->read || !tgt_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, no fs read or write support.\n");
-+ err = -EPERM;
-+ goto out_close;
-+ }
-+
-+ /* allocate a page for transfering the data */
-+ buf = (void *) __get_free_page(GFP_KERNEL);
-+ if(!buf) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR, out of kernel mem.\n");
-+ goto out_err;
-+ }
-+
-+ tgt_file->f_pos = 0;
-+ src_file->f_pos = 0;
-+
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* Doing this I assume that a read operation will return a full
-+ * buffer while there is still data to read, and a less than
-+ * full buffer when all data has been read.
-+ */
-+ bytes = len = PAGE_SIZE;
-+ while(bytes == len) {
-+ bytes = src_file->f_op->read(src_file, buf, len,
-+ &src_file->f_pos);
-+ tmp = tgt_file->f_op->write(tgt_file, buf, bytes,
-+ &tgt_file->f_pos);
-+ if(tmp != bytes) {
-+ printk(KERN_CRIT "mini_fo_cp_cont: ERROR writing.\n");
-+ goto out_close_unset;
-+ }
-+ }
-+
-+ free_page((unsigned long) buf);
-+ set_fs(old_fs);
-+ fput(tgt_file);
-+ fput(src_file);
-+ goto out;
-+
-+ out_close_unset:
-+ free_page((unsigned long) buf);
-+ set_fs(old_fs);
-+
-+ out_close:
-+ fput(tgt_file);
-+ fput(src_file);
-+
-+ out_err:
-+ dput(tgt_dentry);
-+ dput(src_dentry);
-+
-+ /* mk: not sure if this need to be done */
-+ mntput(tgt_mnt);
-+ mntput(src_mnt);
-+
-+ out:
-+ return err;
-+}
-+
-+/* mk:
-+ * ndl (no-duplicate list) stuff
-+ * This is used in mini_fo_readdir, to save the storage directory contents
-+ * and later when reading base, match them against the list in order
-+ * to avoid duplicates.
-+ */
-+
-+/* add a file specified by name and len to the ndl
-+ * Return values: 0 on success, <0 on failure.
-+ */
-+int ndl_add_entry(struct readdir_data *rd, const char *name, int len)
-+{
-+ struct ndl_entry *tmp_entry;
-+
-+ tmp_entry = (struct ndl_entry *)
-+ kmalloc(sizeof(struct ndl_entry), GFP_KERNEL);
-+ if(!tmp_entry) {
-+ printk(KERN_CRIT "mini_fo: ndl_add_entry: out of mem.\n");
-+ return -ENOMEM;
-+ }
-+ tmp_entry->name = (char*) kmalloc(len, GFP_KERNEL);
-+ if(!tmp_entry->name) {
-+ printk(KERN_CRIT "mini_fo: ndl_add_entry: out of mem.\n");
-+ return -ENOMEM;
-+ }
-+ strncpy(tmp_entry->name, name, len);
-+ tmp_entry->len = len;
-+
-+ list_add(&tmp_entry->list, &rd->ndl_list);
-+ rd->ndl_size++;
-+ return 0;
-+}
-+
-+/* delete all list entries and free memory */
-+void ndl_put_list(struct readdir_data *rd)
-+{
-+ struct list_head *tmp;
-+ struct ndl_entry *tmp_entry;
-+
-+ if(rd->ndl_size <= 0)
-+ return;
-+ while(!list_empty(&rd->ndl_list)) {
-+ tmp = rd->ndl_list.next;
-+ list_del(tmp);
-+ tmp_entry = list_entry(tmp, struct ndl_entry, list);
-+ kfree(tmp_entry->name);
-+ kfree(tmp_entry);
-+ }
-+ rd->ndl_size = 0;
-+}
-+
-+/* Check if a file specified by name and len is in the ndl
-+ * Return value: 0 if not in list, 1 if file is found in ndl.
-+ */
-+int ndl_check_entry(struct readdir_data *rd, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct ndl_entry *tmp_entry;
-+
-+ if(rd->ndl_size <= 0)
-+ return 0;
-+
-+ list_for_each(tmp, &rd->ndl_list) {
-+ tmp_entry = list_entry(tmp, struct ndl_entry, list);
-+ if(tmp_entry->len != len)
-+ continue;
-+ if(!strncmp(tmp_entry->name, name, len))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/* mk:
-+ * Recursive function to create corresponding directorys in the storage fs.
-+ * The function will build the storage directorys up to dentry.
-+ */
-+int build_sto_structure(dentry_t *dir, dentry_t *dentry)
-+{
-+ int err;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ if(dentry->d_parent != dir) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: invalid parameter or meta data corruption [1].\n");
-+ return 1;
-+ }
-+
-+ if(dtost(dir) != MODIFIED) {
-+ err = build_sto_structure(dir->d_parent, dentry->d_parent);
-+ if(err)
-+ return err;
-+ }
-+
-+ /* ok, coming back again. */
-+ check_mini_fo_dentry(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(!hidden_sto_dentry) {
-+ /*
-+ * This is the case after creating the first
-+ * hidden_sto_dentry.
-+ * After one negative storage_dentry, all pointers to
-+ * hidden_storage dentries are set to NULL. We need to
-+ * create the negative dentry before we create the storage
-+ * file.
-+ */
-+ unsigned int len;
-+ const unsigned char *name;
-+ len = dtohd(dentry)->d_name.len;
-+ name = dtohd(dentry)->d_name.name;
-+ hidden_sto_dentry = lookup_one_len(name, dtohd2(dir), len);
-+ dtohd2(dentry) = hidden_sto_dentry;
-+ }
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ /* lets be safe */
-+ if(dtohd2(dir) != hidden_sto_dir_dentry) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: invalid parameter or meta data corruption [2].\n");
-+ return 1;
-+ }
-+
-+ /* check for errors in lock_parent */
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if(IS_ERR(hidden_sto_dir_dentry)) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: lock_parent failed.\n");
-+ return err;
-+ }
-+
-+ err = vfs_mkdir(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dir->d_inode->i_mode);
-+
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: failed to create storage dir [1].\n");
-+ /* was: unlock_dir(dir); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&dir->d_inode->i_mutex);
-+#else
-+ up(&dir->d_inode->i_sem);
-+#endif
-+ dput(dir);
-+ return err;
-+ }
-+
-+ /* everything ok! */
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: build_sto_structure: failed to create storage dir [2].\n");
-+ /* was: unlock_dir(dir); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&dir->d_inode->i_mutex);
-+#else
-+ up(&dir->d_inode->i_sem);
-+#endif
-+ dput(dir);
-+ return 1;
-+ }
-+
-+ /* interpose the new inode and set new state */
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ dtopd(dentry)->state = MODIFIED;
-+
-+ /* initalize the wol list */
-+ itopd(dentry->d_inode)->deleted_list_size = -1;
-+ itopd(dentry->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(dentry);
-+
-+ fist_copy_attr_all(dentry->d_inode, itohi2(dentry->d_inode));
-+ fist_copy_attr_timesizes(dir->d_inode,
-+ hidden_sto_dir_dentry->d_inode);
-+ dir->d_inode->i_nlink++;
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ return 0;
-+}
-+
-+
-+#if 0 /* unused */
-+
-+/*
-+ * Read "len" bytes from "filename" into "buf".
-+ * "buf" is in kernel space.
-+ */
-+int
-+mini_fo_read_file(const char *filename, void *buf, int len)
-+{
-+ file_t *filp;
-+ mm_segment_t oldfs;
-+ int bytes;
-+ /* Chroot? Maybe NULL isn't right here */
-+ filp = filp_open(filename, O_RDONLY, 0);
-+ if (!filp || IS_ERR(filp)) {
-+ printk("mini_fo_read_file err %d\n", (int) PTR_ERR(filp));
-+ return -1; /* or do something else */
-+ }
-+
-+ if (!filp->f_op->read)
-+ return -2; /* file(system) doesn't allow reads */
-+
-+ /* now read len bytes from offset 0 */
-+ filp->f_pos = 0; /* start offset */
-+ oldfs = get_fs();
-+ set_fs(KERNEL_DS);
-+ bytes = filp->f_op->read(filp, buf, len, &filp->f_pos);
-+ set_fs(oldfs);
-+
-+ /* close the file */
-+ fput(filp);
-+
-+ return bytes;
-+}
-+
-+
-+
-+/*
-+ * Write "len" bytes from "buf" to "filename"
-+ * "buf" is in kernel space.
-+ */
-+int
-+mini_fo_write_file(const char *filename, void *buf, int len)
-+{
-+ file_t *filp;
-+ mm_segment_t oldfs;
-+ int bytes;
-+ /* Chroot? Maybe NULL isn't right here */
-+ filp = filp_open(filename, O_RDWR|O_CREAT, 0640);
-+ if (!filp || IS_ERR(filp)) {
-+ printk("mini_fo_write_file err %d\n", (int) PTR_ERR(filp));
-+ return -1; /* or do something else */
-+ }
-+
-+ if (!filp->f_op->write)
-+ return -2; /* file(system) doesn't allow writes */
-+
-+ /* now write len bytes from offset 0 */
-+ filp->f_pos = 0; /* start offset */
-+ oldfs = get_fs();
-+ set_fs(KERNEL_DS);
-+ bytes = filp->f_op->write(filp, buf, len, &filp->f_pos);
-+ set_fs(oldfs);
-+
-+ /* close the file */
-+ fput(filp);
-+
-+ return bytes;
-+}
-+
-+#endif /* unused */
-+
---- /dev/null
-+++ b/fs/mini_fo/ChangeLog
-@@ -0,0 +1,281 @@
-+2006-01-24 Markus Klotzbuecher <mk@mary.denx.de>
-+
-+ * Add tons of ugly ifdefs to Ed L. Cashin's mutex patch to
-+ retain backwards compatibility.
-+
-+2006-01-24 Ed L. Cashin <ecashin@coraid.com>
-+
-+ * Support for the new mutex infrastructure
-+ (7892f2f48d165a34b0b8130c8a195dfd807b8cb6)
-+
-+2005-10-15 Markus Klotzbuecher <mk@localhost.localdomain>
-+
-+ * Bugfix for a serious memory leak in mini_fo_follow_link.
-+
-+2005-09-21 Markus Klotzbuecher <mk@mary>
-+
-+ * new release 0.6.1
-+
-+ * fix of a compiler warning due to changes in 2.6.13
-+
-+2005-09-21 Klaus Wenninger <klaus.wenninger@siemens.com>
-+
-+ * file.c: readdir: fix for a bug that caused directory entries
-+ to show up twice when using storage filesystems such as
-+ minixfs or pramfs.
-+
-+2005-06-30 Eric Lammerts <eric@lammerts.org>
-+
-+ * fix for an oops when overwriting a binary thats beeing
-+ executed.
-+
-+2005-06-09 <mk@mary>
-+
-+ * Renamed overlay to mini_fo-overlay.
-+
-+ * Added mini_fo-merge script to allow merging of storage and base
-+ after making modifications.
-+
-+2005-05-22 root <mk@mary>
-+
-+ * Added overlay script that allows to easily mount mini_fo ontop
-+ of a given base directory
-+
-+2005-05-10 <mk@mary>
-+
-+ * inode.c: xattr functions return -EOPNOSUPP instead of
-+ -ENOSUPP, what confuses "ls -l"
-+
-+ * Changed license from LGPL to GPL.
-+
-+2005-05-08 root <mk@mary>
-+
-+ * Makefile: clean it up and added make install and make
-+ uninstall.
-+
-+2005-05-06 <mk@mary>
-+
-+ * merged devel branch back to main. [v0-6-0-pre3]
-+
-+ * removed unused files print.c and fist_ioctl. [devel-0-0-18]
-+
-+ * ioctl: removed fist_ioctl stuff, that is not needed for
-+ now.
-+
-+2005-05-03 <mk@mary>
-+
-+ * file.c: simplified mini_fo_open and mini_fo_setattr using
-+ new state changing functions. [devel-0-0-17]
-+
-+ * inode.c: Fixed getattr state bug (see below) in 2.4 function
-+ mini_fo_inode revalidate.
-+
-+ * inode.c: found an other bug in mini_fo_getattr. States are not
-+ reliable in this function, as a file can be opened, unlinked and
-+ the getattr function called. This results in a deleted dentry
-+ with an inode. Fix is to ignore states and simply use the inode
-+ available.
-+
-+2005-04-29 <mk@mary>
-+
-+ * file.c: Bugfix and cleanup in fasync and fsync. [devel-0-0-16]
-+
-+ * file.c: do not use mini_fo_lock so the generic version is
-+ used (I guess).
-+
-+ * inode.c: getattr, never call getattr on lower files, as this
-+ will cause the inum to change.
-+
-+ * inode.c: rename_reg_file renamed to rename_nondir, as it
-+ doesn't matter as long it't not a dir. Removed all
-+ rename_dev_file etc.
-+
-+ * tagged as devel-0-0-15
-+
-+ * inode.c: added support for chosing support for extended
-+ attrs at compile time by XATTR define in mini_fo.h .
-+
-+ * inode.c: fixed mini_fo_getattr to use mini_fo inode and not
-+ lower again, what avoids inode number changes that confused
-+ rm again. This is the proper solution.
-+
-+2005-04-24 <mk@mary>
-+
-+ * all files: updated Copyright notive to 2005. [devel-0-0-14]
-+
-+ * inode.c: fixed mini_fo_getattr to not change the inode
-+ number, even if lower files change.
-+
-+ * super.c: fixed a bug that caused deleted base file to show
-+ up suddenly after some time, or after creating a special
-+ file. The problem was that after some time or after special
-+ file creating sync_sb_inodes is called by the vfs, that
-+ called our mini_fo_put_inode. There was (wrongly) called
-+ __meta_put_lists, that nuked the lists, although the inode
-+ was going to continue its life. Moving __meta_put_lists to
-+ mini_fo_clear_inode, where an inode is really destroyed,
-+ solved the problem.
-+
-+
-+2005-04-23 <mk@mary>
-+
-+ * state.c, aux.c: more cleaning up and
-+ simplifications. [devel-0-0-13]
-+
-+ * inode.c: implemented mini_fo_getattr, that was required for
-+ 2.6 because inode_revalidate has been remove there, and the
-+ old "du" bug returned.
-+
-+
-+2005-04-20 <mk@mary>
-+
-+ * aux.c: get_neg_sto_dentry(): allow to be called for dentries
-+ in state UNMODIFIED, NON_EXISTANT _and_ DELETED.
-+
-+2005-04-19 <mk@mary>
-+
-+ * Fixed a bug under 2.6 that caused files deleted via mini_fo
-+ not to be deleted properly and therefore the fs filled up
-+ untill no memory was left. [devel-0-0-12]
-+
-+ * Added basic hard link support. This means that creating
-+ hardlinks will work, but existing ones will be treated as
-+ individual files. [devel-0-0-11]
-+
-+2005-04-17 <mk@mary>
-+
-+ * Bugfixes
-+
-+2005-04-13 root <mk@mary>
-+
-+ * Added file state.c for the state transition
-+ functions. Doesn't work very well yet, though...
-+
-+2005-04-12 <mk@mary>
-+
-+ * Porting to 2.6 started, which is easier than expected, also
-+ due to Olivier previous work.
-+
-+2005-04-08 <mk@mary>
-+
-+ * Fixed the bug that caused du to return invalid sizes of
-+ directory trees. The problem was that
-+ mini_fo_inode_revalidate didn't always copy the attributes
-+ from the base inode properly.
-+
-+2005-04-01 Markus Klotzbuecher <mk@chasey>
-+
-+ * Merged devel branch back to main trunk and updated the
-+ RELEASE notes. This will be 0-6-0-pre1.
-+
-+2005-03-31 Markus Klotzbuecher <mk@chasey>
-+
-+ * Fixed some bugs in rename_reg_file, that only showed up in
-+ the kernel compile test. Kernel compiles cleanly ontop of
-+ mini_fo, now also make mrproper etc. work. Seems pretty stable.
-+
-+2005-03-28 Markus Klotzbuecher <mk@chasey>
-+
-+ * Many, many directory renaming bugfixes and a lot of other
-+ cleanup. Dir renaming seems to work relatively stable.
-+
-+2005-03-22 Markus Klotzbuecher <mk@chasey>
-+
-+ * Finished implementing lightweight directory renaming. Some
-+ basic testing indicates it works fine.
-+ Next is to implement testcases for the testsuite and confirm
-+ everything is really working ok.
-+
-+2005-03-18 Markus Klotzbuecher <mk@chasey>
-+
-+ * Finished implementing meta.c stuff required for directory
-+ renaming.
-+
-+2005-03-17 Markus Klotzbuecher <mk@chasey>
-+
-+ * Fixed all compile warnings + an extremly old bug that
-+ somehow crept in while reworking the wol stuff to the META
-+ system. Turning on -Werror again... :-)
-+
-+ * Fixed some bugs in the new rename_reg_file function.
-+
-+ * Rewrote mini_fo rename and split it into several
-+ subfunctions, that handle the different types
-+ seperately. Rewrote the regular file function aswell, as it
-+ was implemented somewhat inefficient.
-+
-+2005-03-16 Markus Klotzbuecher <mk@chasey>
-+
-+ * Implemented new META subsystem, removed old WOL stuff in favor
-+ if it.
-+
-+ * After some basic testing everything seems ok...
-+
-+2005-03-11 Markus Klotzbuecher <mk@chasey>
-+
-+ * Renaming a non regular file caused trouble because I always
-+ tried to copy the contents. Now I only do this for regular
-+ files. mini_fo_rename still isn't implemented properly, renaming
-+ of device files, symlinks etc. results in a empty regular file
-+ instead of the proper type.
-+
-+ * Directory renaming suddenly works! What a surprise! I guess
-+ this is because renaming is implemented as making a copy and
-+ removing the original. Still this might not work
-+ everywhere...
-+
-+2005-03-09 Markus Klotzbuecher <mk@chasey>
-+
-+ * Bugfix, when a mini_fo directory that exists in storage
-+ (state: MODIFIED, CREATED and DEL_REWRITTEN) is deleted, a
-+ possibly existing WOL file contained in it needs to be
-+ deleted too.
-+
-+ * Starting cleanup: defined state names in order to get rid of
-+ the state numbers.
-+
-+2005-03-08 Markus Klotzbuecher <mk@chasey>
-+
-+ * Makefile fix, fist_ioctl was built against wrong sources if ARCH=um
-+
-+ * Fixed a bug in dentry.c, mini_fo_d_hash. In state 4 =
-+ DEL_REWRITTEN the hash was calculated from the base dentry,
-+ which was wrong and and caused assertions in
-+ __mini_fo_hidden_dentry to fail.
-+
-+2005-02-21 <mk@mary>
-+
-+ * Implemented directory deleting (inode.c)
-+
-+ * main.c: made mini_fo_parse_options a little more robust.
-+
-+2004-12-22 <mk@mary>
-+
-+ * Makefile cleanup and uml stuff, removed unneccessary files
-+
-+ * Created a new and hopefully more informative README
-+
-+ * CHANGELOG: created a new CHANGELOG and added old entries reversely
-+
-+
-+2004-10-24 Gleb Natapov <gleb@nbase.co.il>
-+
-+ * Fix: owner and group where not correctly copied from base to
-+ storage.
-+
-+
-+2004-10-05 Gleb Natapov <gleb@nbase.co.il>
-+
-+ * Implementation of fsync, fasync and lock mini_fo functions.
-+
-+
-+2004-09-29 Bob Lee <bob@pantasys.com>
-+
-+ * Fix of a serious pointer bug
-+
-+
-+2004-09-28 Gleb Natapov <gleb@nbase.co.il>
-+
-+ * Implementation of mini_fo_mknod and mini_fo_rename, support
-+ for device files.
-+
---- /dev/null
-+++ b/fs/mini_fo/dentry.c
-@@ -0,0 +1,244 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+/*
-+ * THIS IS A BOOLEAN FUNCTION: returns 1 if valid, 0 otherwise.
-+ */
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_d_revalidate(dentry_t *dentry, struct nameidata *nd)
-+#else
-+mini_fo_d_revalidate(dentry_t *dentry, int flags)
-+#endif
-+{
-+ int err1 = 1; /* valid = 1, invalid = 0 */
-+ int err2 = 1;
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ hidden_dentry = dtohd(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(hidden_dentry &&
-+ hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_revalidate) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err1 = hidden_dentry->d_op->d_revalidate(hidden_dentry, nd);
-+#else
-+ err1 = hidden_dentry->d_op->d_revalidate(hidden_dentry, flags);
-+#endif
-+ }
-+ if(hidden_sto_dentry &&
-+ hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_revalidate) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err2 = hidden_sto_dentry->d_op->d_revalidate(hidden_sto_dentry,
-+ nd);
-+#else
-+ err2 = hidden_sto_dentry->d_op->d_revalidate(hidden_sto_dentry,
-+ flags);
-+#endif
-+ }
-+
-+ /* mk: if one of the lower level dentries are valid,
-+ * the mini_fo dentry is too.
-+ */
-+ return (err1 || err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_d_hash(dentry_t *dentry, qstr_t *name)
-+{
-+ int err = 0;
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+ /* hidden_dentry = mini_fo_hidden_dentry(dentry);
-+ * hidden_sto_dentry = mini_fo_hidden_sto_dentry(dentry); */
-+
-+ /* state 1, 3, 4, 5: build the hash for the storage dentry */
-+ if((dtopd(dentry)->state == MODIFIED) ||
-+ (dtopd(dentry)->state == CREATED) ||
-+ (dtopd(dentry)->state == DEL_REWRITTEN) ||
-+ (dtopd(dentry)->state == DELETED)) {
-+ hidden_sto_dentry = dtohd2(dentry);
-+ if(hidden_sto_dentry &&
-+ hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_hash) {
-+ err = hidden_sto_dentry->d_op->d_hash(hidden_sto_dentry, name);
-+ }
-+ goto out;
-+ }
-+ /* state 2: build the hash for the base dentry */
-+ if(dtopd(dentry)->state == UNMODIFIED) {
-+ hidden_dentry = dtohd(dentry);
-+ if(hidden_dentry &&
-+ hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_hash) {
-+ err = hidden_dentry->d_op->d_hash(hidden_dentry, name);
-+ }
-+ goto out;
-+ }
-+ /* state 6: build hash for the dentry that exists */
-+ if(dtopd(dentry)->state == NON_EXISTANT) {
-+ hidden_sto_dentry = dtohd2(dentry);
-+ if(hidden_sto_dentry &&
-+ hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_hash) {
-+ err = hidden_sto_dentry->d_op->d_hash(hidden_sto_dentry, name);
-+ goto out;
-+ }
-+ hidden_dentry = dtohd(dentry);
-+ if(hidden_dentry &&
-+ hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_hash) {
-+ err = hidden_dentry->d_op->d_hash(hidden_dentry, name);
-+ goto out;
-+ }
-+ }
-+
-+ printk(KERN_CRIT "mini_fo: d_hash: invalid state detected.\n");
-+
-+ out:
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_d_compare(dentry_t *dentry, qstr_t *a, qstr_t *b)
-+{
-+ int err;
-+ dentry_t *hidden_dentry=NULL;
-+
-+ /* hidden_dentry = mini_fo_hidden_dentry(dentry); */
-+ if(dtohd2(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else if(dtohd(dentry))
-+ hidden_dentry = dtohd(dentry);
-+
-+ if (hidden_dentry && hidden_dentry->d_op && hidden_dentry->d_op->d_compare) {
-+ err = hidden_dentry->d_op->d_compare(hidden_dentry, a, b);
-+ } else {
-+ err = ((a->len != b->len) || memcmp(a->name, b->name, b->len));
-+ }
-+
-+ return err;
-+}
-+
-+
-+int
-+mini_fo_d_delete(dentry_t *dentry)
-+{
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+ int err = 0;
-+
-+ /* this could be a negative dentry, so check first */
-+ if (!dtopd(dentry)) {
-+ printk(KERN_CRIT "mini_fo_d_delete: negative dentry passed.\n");
-+ goto out;
-+ }
-+ hidden_dentry = dtohd(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(hidden_dentry) {
-+ if(hidden_dentry->d_op &&
-+ hidden_dentry->d_op->d_delete) {
-+ err = hidden_dentry->d_op->d_delete(hidden_dentry);
-+ }
-+ }
-+ if(hidden_sto_dentry) {
-+ if(hidden_sto_dentry->d_op &&
-+ hidden_sto_dentry->d_op->d_delete) {
-+ err = hidden_sto_dentry->d_op->d_delete(hidden_sto_dentry);
-+ }
-+ }
-+
-+ out:
-+ return err;
-+}
-+
-+
-+void
-+mini_fo_d_release(dentry_t *dentry)
-+{
-+ dentry_t *hidden_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+
-+ /* this could be a negative dentry, so check first */
-+ if (!dtopd(dentry)) {
-+ printk(KERN_CRIT "mini_fo_d_release: no private data.\n");
-+ goto out;
-+ }
-+ hidden_dentry = dtohd(dentry);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ if(hidden_dentry) {
-+ /* decrement hidden dentry's counter and free its inode */
-+ dput(hidden_dentry);
-+ }
-+ if(hidden_sto_dentry) {
-+ /* decrement hidden dentry's counter and free its inode */
-+ dput(hidden_sto_dentry);
-+ }
-+
-+ /* free private data (mini_fo_dentry_info) here */
-+ kfree(dtopd(dentry));
-+ __dtopd(dentry) = NULL; /* just to be safe */
-+ out:
-+ return;
-+}
-+
-+
-+/*
-+ * we don't really need mini_fo_d_iput, because dentry_iput will call iput() if
-+ * mini_fo_d_iput is not defined. We left this implemented for ease of
-+ * tracing/debugging.
-+ */
-+void
-+mini_fo_d_iput(dentry_t *dentry, inode_t *inode)
-+{
-+ iput(inode);
-+}
-+
-+
-+struct dentry_operations mini_fo_dops = {
-+ d_revalidate: mini_fo_d_revalidate,
-+ d_hash: mini_fo_d_hash,
-+ d_compare: mini_fo_d_compare,
-+ d_release: mini_fo_d_release,
-+ d_delete: mini_fo_d_delete,
-+ d_iput: mini_fo_d_iput,
-+};
---- /dev/null
-+++ b/fs/mini_fo/file.c
-@@ -0,0 +1,713 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+#define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1))
-+
-+/*******************
-+ * File Operations *
-+ *******************/
-+
-+STATIC loff_t
-+mini_fo_llseek(file_t *file, loff_t offset, int origin)
-+{
-+ loff_t err;
-+ file_t *hidden_file = NULL;
-+
-+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+ /* Check if trying to llseek from a directory */
-+ err = -EISDIR;
-+ goto out;
-+ }
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ /* always set hidden position to this one */
-+ hidden_file->f_pos = file->f_pos;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ memcpy(&(hidden_file->f_ra),
-+ &(file->f_ra),
-+ sizeof(struct file_ra_state));
-+#else
-+ if (file->f_reada) { /* update readahead information if needed */
-+ hidden_file->f_reada = file->f_reada;
-+ hidden_file->f_ramax = file->f_ramax;
-+ hidden_file->f_raend = file->f_raend;
-+ hidden_file->f_ralen = file->f_ralen;
-+ hidden_file->f_rawin = file->f_rawin;
-+ }
-+#endif
-+ if (hidden_file->f_op && hidden_file->f_op->llseek)
-+ err = hidden_file->f_op->llseek(hidden_file, offset, origin);
-+ else
-+ err = generic_file_llseek(hidden_file, offset, origin);
-+
-+ if (err < 0)
-+ goto out;
-+
-+ if (err != file->f_pos) {
-+ file->f_pos = err;
-+ // ION maybe this?
-+ // file->f_pos = hidden_file->f_pos;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ file->f_reada = 0;
-+#endif
-+ file->f_version++;
-+ }
-+
-+ out:
-+ return err;
-+}
-+
-+
-+/* mk: fanout capable */
-+STATIC ssize_t
-+mini_fo_read(file_t *file, char *buf, size_t count, loff_t *ppos)
-+{
-+ int err = -EINVAL;
-+ file_t *hidden_file = NULL;
-+ loff_t pos = *ppos;
-+
-+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+ /* Check if trying to read from a directory */
-+ /* printk(KERN_CRIT "mini_fo_read: ERROR: trying to read data from a directory.\n"); */
-+ err = -EISDIR;
-+ goto out;
-+ }
-+
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ if (!hidden_file->f_op || !hidden_file->f_op->read)
-+ goto out;
-+
-+ err = hidden_file->f_op->read(hidden_file, buf, count, &pos);
-+ *ppos = pos;
-+
-+ if (err >= 0) {
-+ /* atime should also be updated for reads of size zero or more */
-+ fist_copy_attr_atime(file->f_dentry->d_inode,
-+ hidden_file->f_dentry->d_inode);
-+ }
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ /*
-+ * MAJOR HACK
-+ * because pread() does not have any way to tell us that it is
-+ * our caller, then we don't know for sure if we have to update
-+ * the file positions. This hack relies on read() having passed us
-+ * the "real" pointer of its struct file's f_pos field.
-+ */
-+ if (ppos == &file->f_pos)
-+ hidden_file->f_pos = *ppos = pos;
-+ if (hidden_file->f_reada) { /* update readahead information if needed */
-+ file->f_reada = hidden_file->f_reada;
-+ file->f_ramax = hidden_file->f_ramax;
-+ file->f_raend = hidden_file->f_raend;
-+ file->f_ralen = hidden_file->f_ralen;
-+ file->f_rawin = hidden_file->f_rawin;
-+ }
-+#else
-+ memcpy(&(file->f_ra),&(hidden_file->f_ra),sizeof(struct file_ra_state));
-+#endif
-+
-+ out:
-+ return err;
-+}
-+
-+
-+/* this mini_fo_write() does not modify data pages! */
-+STATIC ssize_t
-+mini_fo_write(file_t *file, const char *buf, size_t count, loff_t *ppos)
-+{
-+ int err = -EINVAL;
-+ file_t *hidden_file = NULL;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ loff_t pos = *ppos;
-+
-+ /* mk: fan out: */
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ /* This is bad! We have no storage file to write to. This
-+ * should never happen because if a file is opened for
-+ * writing, a copy should have been made earlier.
-+ */
-+ printk(KERN_CRIT "mini_fo: write : ERROR, no storage file to write.\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ }
-+
-+ inode = file->f_dentry->d_inode;
-+ hidden_inode = itohi2(inode);
-+ if(!hidden_inode) {
-+ printk(KERN_CRIT "mini_fo: write: no sto inode found, not good.\n");
-+ goto out;
-+ }
-+
-+ if (!hidden_file->f_op || !hidden_file->f_op->write)
-+ goto out;
-+
-+ /* adjust for append -- seek to the end of the file */
-+ if (file->f_flags & O_APPEND)
-+ pos = inode->i_size;
-+
-+ err = hidden_file->f_op->write(hidden_file, buf, count, &pos);
-+
-+ /*
-+ * copy ctime and mtime from lower layer attributes
-+ * atime is unchanged for both layers
-+ */
-+ if (err >= 0)
-+ fist_copy_attr_times(inode, hidden_inode);
-+
-+ *ppos = pos;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ /*
-+ * XXX: MAJOR HACK
-+ *
-+ * because pwrite() does not have any way to tell us that it is
-+ * our caller, then we don't know for sure if we have to update
-+ * the file positions. This hack relies on write() having passed us
-+ * the "real" pointer of its struct file's f_pos field.
-+ */
-+ if (ppos == &file->f_pos)
-+ hidden_file->f_pos = *ppos = pos;
-+#endif
-+ /* update this inode's size */
-+ if (pos > inode->i_size)
-+ inode->i_size = pos;
-+
-+ out:
-+ return err;
-+}
-+
-+/* Global variable to hold a file_t pointer.
-+ * This serves to allow mini_fo_filldir function to know which file is
-+ * beeing read, which is required for two reasons:
-+ *
-+ * - be able to call wol functions in order to avoid listing deleted
-+ * base files.
-+ * - if we're reading a directory which is in state 1, we need to
-+ * maintain a list (in mini_fo_filldir) of which files allready
-+ * have been copied to userspace,to detect files existing in base
-+ * and storage and not list them twice.
-+ */
-+filldir_t mini_fo_filldir_orig;
-+file_t *mini_fo_filldir_file;
-+
-+/* mainly copied from fs/readdir.c */
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_filldir(void * __buf, const char * name, int namlen, loff_t offset,
-+ u64 ino, unsigned int d_type)
-+#else
-+mini_fo_filldir(void * __buf, const char * name, int namlen, loff_t offset,
-+ ino_t ino, unsigned int d_type)
-+#endif
-+{
-+ struct getdents_callback * buf = (struct getdents_callback *) __buf;
-+ file_t* file = mini_fo_filldir_file;
-+
-+ /* In theses states we filter meta files in storage (WOL) */
-+ if(file && (dtopd(file->f_dentry)->state == MODIFIED ||
-+ dtopd(file->f_dentry)->state == CREATED ||
-+ dtopd(file->f_dentry)->state == DEL_REWRITTEN)) {
-+
-+ int tmp = strlen(META_FILENAME);
-+ if(tmp == namlen) {
-+ if(!strncmp(name, META_FILENAME, namlen))
-+ return 0;
-+ }
-+ }
-+
-+ /* check if we are merging the contents of storage and base */
-+ if(file && dtopd(file->f_dentry)->state == MODIFIED) {
-+ /* check if we are still reading storage contents, if
-+ * yes, we just save the name of the file for duplicate
-+ * checking later. */
-+
-+ if(!ftopd(file)->rd.sto_done) {
-+ /* put file into ndl list */
-+ if(ndl_add_entry(&ftopd(file)->rd, name, namlen))
-+ printk(KERN_CRIT "mini_fo_filldir: Error adding to ndl.\n");
-+ } else {
-+ /* check if file has been deleted */
-+ if(meta_check_d_entry(file->f_dentry, name, namlen))
-+ return 0;
-+
-+ /* do duplicate checking */
-+ if(ndl_check_entry(&ftopd(file)->rd, name, namlen))
-+ return 0;
-+ }
-+ }
-+
-+ return mini_fo_filldir_orig(buf, name, namlen, offset, ino, d_type);
-+}
-+
-+
-+STATIC int
-+mini_fo_readdir(file_t *file, void *dirent, filldir_t filldir)
-+{
-+ int err = 0;/* mk: ??? -ENOTDIR; */
-+ file_t *hidden_file = NULL;
-+ file_t *hidden_sto_file = NULL;
-+ inode_t *inode;
-+ struct getdents_callback *buf;
-+ int oldcount;
-+
-+#if defined(FIST_FILTER_NAME) || defined(FIST_FILTER_SCA)
-+ struct mini_fo_getdents_callback buf;
-+#endif /* FIST_FILTER_NAME || FIST_FILTER_SCA */
-+
-+ buf = (struct getdents_callback *) dirent;
-+ oldcount = buf->count;
-+ inode = file->f_dentry->d_inode;
-+ mini_fo_filldir_file = file;
-+ mini_fo_filldir_orig = filldir;
-+
-+ ftopd(file)->rd.sto_done = 0;
-+ do {
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_sto_file = ftohf2(file);
-+ err = vfs_readdir(hidden_sto_file, mini_fo_filldir, dirent);
-+ file->f_pos = hidden_sto_file->f_pos;
-+ if (err > 0)
-+ fist_copy_attr_atime(inode, hidden_sto_file->f_dentry->d_inode);
-+ /* not finshed yet, we'll be called again */
-+ if (buf->count != oldcount)
-+ break;
-+ }
-+
-+ ftopd(file)->rd.sto_done = 1;
-+
-+ if(ftohf(file)) {
-+ hidden_file = ftohf(file);
-+ err = vfs_readdir(hidden_file, mini_fo_filldir, dirent);
-+ file->f_pos = hidden_file->f_pos;
-+ if (err > 0)
-+ fist_copy_attr_atime(inode, hidden_file->f_dentry->d_inode);
-+ }
-+
-+ }
-+ } while (0);
-+
-+ /* mk:
-+ * we need to check if all the directory data has been copied to userspace,
-+ * or if we will be called again by userspace to complete the operation.
-+ */
-+ if(buf->count == oldcount) {
-+ ndl_put_list(&ftopd(file)->rd);
-+ }
-+
-+ /* unset this, safe */
-+ mini_fo_filldir_file = NULL;
-+ return err;
-+}
-+
-+
-+STATIC unsigned int
-+mini_fo_poll(file_t *file, poll_table *wait)
-+{
-+ unsigned int mask = DEFAULT_POLLMASK;
-+ file_t *hidden_file = NULL;
-+
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ if (!hidden_file->f_op || !hidden_file->f_op->poll)
-+ goto out;
-+
-+ mask = hidden_file->f_op->poll(hidden_file, wait);
-+
-+ out:
-+ return mask;
-+}
-+
-+/* FIST-LITE special version of mmap */
-+STATIC int
-+mini_fo_mmap(file_t *file, vm_area_t *vma)
-+{
-+ int err = 0;
-+ file_t *hidden_file = NULL;
-+
-+ /* fanout capability */
-+ if (ftopd(file) != NULL) {
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ } else {
-+ hidden_file = ftohf(file);
-+ }
-+ }
-+
-+ ASSERT(hidden_file != NULL);
-+ ASSERT(hidden_file->f_op != NULL);
-+ ASSERT(hidden_file->f_op->mmap != NULL);
-+
-+ vma->vm_file = hidden_file;
-+ err = hidden_file->f_op->mmap(hidden_file, vma);
-+ get_file(hidden_file); /* make sure it doesn't get freed on us */
-+ fput(file); /* no need to keep extra ref on ours */
-+
-+ return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_open(inode_t *inode, file_t *file)
-+{
-+ int err = 0;
-+ int hidden_flags;
-+ file_t *hidden_file = NULL;
-+ dentry_t *hidden_dentry = NULL;
-+
-+ /* fanout stuff */
-+ file_t *hidden_sto_file = NULL;
-+ dentry_t *hidden_sto_dentry = NULL;
-+
-+ __ftopd(file) =
-+ kmalloc(sizeof(struct mini_fo_file_info), GFP_KERNEL);
-+ if (!ftopd(file)) {
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+
-+ /* init the readdir_helper structure */
-+ INIT_LIST_HEAD(&ftopd(file)->rd.ndl_list);
-+ ftopd(file)->rd.ndl_size = 0;
-+
-+ /* In certain paths this could stay uninitalized and cause trouble */
-+ ftohf(file) = NULL;
-+ ftohf2(file) = NULL;
-+ hidden_flags = file->f_flags;
-+
-+ /* create storage files? */
-+ if(dtost(file->f_dentry) == UNMODIFIED) {
-+ if(!IS_WRITE_FLAG(file->f_flags)) {
-+ hidden_dentry = dtohd(file->f_dentry);
-+ dget(hidden_dentry);
-+ /* dentry_open will decrement mnt refcnt if err.
-+ * otherwise fput() will do an mntput() for us upon file close. */
-+ mntget(stopd(inode->i_sb)->hidden_mnt);
-+ hidden_file = dentry_open(hidden_dentry,
-+ stopd(inode->i_sb)->hidden_mnt,
-+ hidden_flags);
-+ if (IS_ERR(hidden_file)) {
-+ err = PTR_ERR(hidden_file);
-+ dput(hidden_dentry);
-+ goto out;
-+ }
-+ ftohf(file) = hidden_file; /* link two files */
-+ goto out;
-+ }
-+ else {
-+ if(S_ISDIR(file->f_dentry->d_inode->i_mode)) {
-+ err = dir_unmod_to_mod(file->f_dentry);
-+ } else
-+ err = nondir_unmod_to_mod(file->f_dentry, 1);
-+
-+ if (err) {
-+ printk("mini_fo_open: ERROR creating storage file.\n");
-+ goto out;
-+ }
-+ }
-+ }
-+ hidden_sto_dentry = dtohd2(file->f_dentry);
-+ dget(hidden_sto_dentry);
-+
-+ if(dtopd(file->f_dentry)->state == MODIFIED) {
-+ /* Directorys are special, interpose on both lower level files */
-+ if(S_ISDIR(itohi(inode)->i_mode)) {
-+ /* check for invalid file types of lower level files */
-+ if(!(S_ISDIR(itohi(inode)->i_mode) && S_ISDIR(itohi2(inode)->i_mode))) {
-+ printk(KERN_CRIT "mini_fo_open: meta data corruption detected.\n");
-+ dput(hidden_sto_dentry);
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* lower level directorys are ok, open the base file */
-+ hidden_dentry = dtohd(file->f_dentry);
-+ dget(hidden_dentry);
-+
-+ mntget(stopd(inode->i_sb)->hidden_mnt);
-+ hidden_file = dentry_open(hidden_dentry,
-+ stopd(inode->i_sb)->hidden_mnt,
-+ hidden_flags);
-+ if (IS_ERR(hidden_file)) {
-+ err = PTR_ERR(hidden_file);
-+ dput(hidden_dentry);
-+ dput(hidden_sto_dentry);
-+ goto out;
-+ }
-+ ftohf(file) = hidden_file; /* link the two files */
-+ }
-+ }
-+
-+ if(!exists_in_storage(file->f_dentry)) {
-+ printk(KERN_CRIT "mini_fo_open: invalid file state detected.\n");
-+ err = -EINVAL;
-+ dput(hidden_sto_dentry);
-+
-+ /* If the base file has been opened, we need to close it here */
-+ if(ftohf(file)) {
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ hidden_file->f_op->flush(hidden_file, NULL);
-+#else
-+ hidden_file->f_op->flush(hidden_file);
-+#endif
-+ dput(hidden_dentry);
-+ }
-+ goto out;
-+ }
-+
-+ /* ok, now we can safely open the storage file */
-+ mntget(stopd(inode->i_sb)->hidden_mnt2);
-+ hidden_sto_file = dentry_open(hidden_sto_dentry,
-+ stopd(inode->i_sb)->hidden_mnt2,
-+ hidden_flags);
-+
-+ /* dentry_open dputs the dentry if it fails */
-+ if (IS_ERR(hidden_sto_file)) {
-+ err = PTR_ERR(hidden_sto_file);
-+ /* close base file if open */
-+ if(ftohf(file)) {
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ hidden_file->f_op->flush(hidden_file, NULL);
-+#else
-+ hidden_file->f_op->flush(hidden_file);
-+#endif
-+ dput(hidden_dentry);
-+ }
-+ goto out;
-+ }
-+ ftohf2(file) = hidden_sto_file; /* link storage file */
-+
-+ out:
-+ if (err < 0 && ftopd(file)) {
-+ kfree(ftopd(file));
-+ }
-+ return err;
-+}
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_flush(file_t *file, fl_owner_t id)
-+#else
-+mini_fo_flush(file_t *file)
-+#endif
-+{
-+ int err1 = 0; /* assume ok (see open.c:close_fp) */
-+ int err2 = 0;
-+ file_t *hidden_file = NULL;
-+
-+ check_mini_fo_file(file);
-+
-+ /* mk: we don't do any state checking here, as its not worth the time.
-+ * Just flush the lower level files if they exist.
-+ */
-+ if(ftopd(file) != NULL) {
-+ if(ftohf(file) != NULL) {
-+ hidden_file = ftohf(file);
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ err1 = hidden_file->f_op->flush(hidden_file, id);
-+#else
-+ err1 = hidden_file->f_op->flush(hidden_file);
-+#endif
-+ }
-+ if(ftohf2(file) != NULL) {
-+ hidden_file = ftohf2(file);
-+ if (hidden_file->f_op && hidden_file->f_op->flush)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ err2 = hidden_file->f_op->flush(hidden_file, id);
-+#else
-+ err2 = hidden_file->f_op->flush(hidden_file);
-+#endif
-+ }
-+ }
-+ return (err1 | err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_release(inode_t *inode, file_t *file)
-+{
-+ int err = 0;
-+ file_t *hidden_file = NULL;
-+
-+ if (ftopd(file) != NULL) {
-+ if(ftohf(file)) {
-+ hidden_file = ftohf(file);
-+ fput(hidden_file);
-+ }
-+ if(ftohf2(file)) {
-+ hidden_file = ftohf2(file);
-+ fput(hidden_file);
-+ }
-+ kfree(ftopd(file));
-+ }
-+ return err;
-+}
-+
-+STATIC int
-+mini_fo_fsync(file_t *file, dentry_t *dentry, int datasync)
-+{
-+ int err1 = 0;
-+ int err2 = 0;
-+ file_t *hidden_file = NULL;
-+ dentry_t *hidden_dentry;
-+
-+ check_mini_fo_file(file);
-+
-+ if ((hidden_file = ftohf(file)) != NULL) {
-+ hidden_dentry = dtohd(dentry);
-+ if (hidden_file->f_op && hidden_file->f_op->fsync) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ err1 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ }
-+
-+ if ((hidden_file = ftohf2(file)) != NULL) {
-+ hidden_dentry = dtohd2(dentry);
-+ if (hidden_file->f_op && hidden_file->f_op->fsync) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ err2 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ }
-+ else
-+ goto err;
-+
-+err:
-+ return (err1 || err2);
-+}
-+
-+
-+STATIC int
-+mini_fo_fasync(int fd, file_t *file, int flag)
-+{
-+ int err1 = 0;
-+ int err2 = 0;
-+
-+ file_t *hidden_file = NULL;
-+
-+ check_mini_fo_file(file);
-+
-+ if((hidden_file = ftohf(file)) != NULL) {
-+ err1 = hidden_file->f_op->fasync(fd, hidden_file, flag);
-+ }
-+ if((hidden_file = ftohf2(file)) != NULL) {
-+ err2 = hidden_file->f_op->fasync(fd, hidden_file, flag);
-+ }
-+
-+ return (err1 || err2);
-+}
-+
-+
-+
-+struct file_operations mini_fo_dir_fops =
-+ {
-+ read: generic_read_dir,
-+ write: mini_fo_write,
-+ readdir: mini_fo_readdir,
-+ poll: mini_fo_poll,
-+ /* ioctl: mini_fo_ioctl, */
-+ mmap: mini_fo_mmap,
-+ open: mini_fo_open,
-+ flush: mini_fo_flush,
-+ release: mini_fo_release,
-+ fsync: mini_fo_fsync,
-+ fasync: mini_fo_fasync,
-+ /* not needed lock: mini_fo_lock, */
-+ /* not needed: readv */
-+ /* not needed: writev */
-+ /* not implemented: sendpage */
-+ /* not implemented: get_unmapped_area */
-+ };
-+
-+struct file_operations mini_fo_main_fops =
-+ {
-+ llseek: mini_fo_llseek,
-+ read: mini_fo_read,
-+ write: mini_fo_write,
-+ readdir: mini_fo_readdir,
-+ poll: mini_fo_poll,
-+ /* ioctl: mini_fo_ioctl, */
-+ mmap: mini_fo_mmap,
-+ open: mini_fo_open,
-+ flush: mini_fo_flush,
-+ release: mini_fo_release,
-+ fsync: mini_fo_fsync,
-+ fasync: mini_fo_fasync,
-+ /* not needed: lock: mini_fo_lock, */
-+ /* not needed: readv */
-+ /* not needed: writev */
-+ /* not implemented: sendpage */
-+ /* not implemented: get_unmapped_area */
-+ };
---- /dev/null
-+++ b/fs/mini_fo/fist.h
-@@ -0,0 +1,254 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifndef __FIST_H_
-+#define __FIST_H_
-+
-+/*
-+ * KERNEL ONLY CODE:
-+ */
-+#ifdef __KERNEL__
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33)
-+#include <generated/autoconf.h>
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
-+#include <linux/autoconf.h>
-+#else
-+#include <linux/config.h>
-+#endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+#ifdef CONFIG_MODVERSIONS
-+# define MODVERSIONS
-+# include <linux/modversions.h>
-+#endif /* CONFIG_MODVERSIONS */
-+#endif /* KERNEL_VERSION < 2.6.0 */
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/string.h>
-+#include <linux/stat.h>
-+#include <linux/errno.h>
-+#include <linux/wait.h>
-+#include <linux/limits.h>
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+#include <linux/locks.h>
-+#else
-+#include <linux/buffer_head.h>
-+#include <linux/pagemap.h>
-+#include <linux/namei.h>
-+#include <linux/module.h>
-+#include <linux/mount.h>
-+#include <linux/page-flags.h>
-+#include <linux/writeback.h>
-+#include <linux/statfs.h>
-+#endif
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/file.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <linux/poll.h>
-+#include <linux/list.h>
-+#include <linux/init.h>
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)
-+#include <linux/xattr.h>
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#include <linux/security.h>
-+#endif
-+
-+#include <linux/swap.h>
-+
-+#include <asm/system.h>
-+/* #include <asm/segment.h> */
-+#include <asm/mman.h>
-+#include <linux/seq_file.h>
-+
-+/*
-+ * MACROS:
-+ */
-+
-+/* those mapped to ATTR_* were copied from linux/fs.h */
-+#define FA_MODE ATTR_MODE
-+#define FA_UID ATTR_UID
-+#define FA_GID ATTR_GID
-+#define FA_SIZE ATTR_SIZE
-+#define FA_ATIME ATTR_ATIME
-+#define FA_MTIME ATTR_MTIME
-+#define FA_CTIME ATTR_CTIME
-+#define FA_ATIME_SET ATTR_ATIME_SET
-+#define FA_MTIME_SET ATTR_MTIME_SET
-+#define FA_FORCE ATTR_FORCE
-+#define FA_ATTR_FLAGS ATTR_ATTR_FLAG
-+
-+/* must be greater than all other ATTR_* flags! */
-+#define FA_NLINK 2048
-+#define FA_BLKSIZE 4096
-+#define FA_BLOCKS 8192
-+#define FA_TIMES (FA_ATIME|FA_MTIME|FA_CTIME)
-+#define FA_ALL 0
-+
-+/* macros to manage changes between kernels */
-+#define INODE_DATA(i) (&(i)->i_data)
-+
-+#define MIN(x,y) ((x < y) ? (x) : (y))
-+#define MAX(x,y) ((x > y) ? (x) : (y))
-+#define MAXPATHLEN PATH_MAX
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5)
-+# define lookup_one_len(a,b,c) lookup_one(a,b)
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) */
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8)
-+# define generic_file_llseek default_llseek
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,8) */
-+
-+#ifndef SEEK_SET
-+# define SEEK_SET 0
-+#endif /* not SEEK_SET */
-+
-+#ifndef SEEK_CUR
-+# define SEEK_CUR 1
-+#endif /* not SEEK_CUR */
-+
-+#ifndef SEEK_END
-+# define SEEK_END 2
-+#endif /* not SEEK_END */
-+
-+#ifndef DEFAULT_POLLMASK
-+# define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)
-+#endif /* not DEFAULT_POLLMASK */
-+
-+/* XXX: fix this so fistgen generates kfree() code directly */
-+#define kfree_s(a,b) kfree(a)
-+
-+/*
-+ * TYPEDEFS:
-+ */
-+typedef struct dentry dentry_t;
-+typedef struct file file_t;
-+typedef struct inode inode_t;
-+typedef inode_t vnode_t;
-+typedef struct page page_t;
-+typedef struct qstr qstr_t;
-+typedef struct super_block super_block_t;
-+typedef super_block_t vfs_t;
-+typedef struct vm_area_struct vm_area_t;
-+
-+
-+/*
-+ * EXTERNALS:
-+ */
-+
-+#define FPPF(str,page) printk("PPF %s 0x%x/%d: Lck:%d Err:%d Ref:%d Upd:%d Other::%d:%d:%d:%d:\n", \
-+ str, \
-+ (int) page, \
-+ (int) page->index, \
-+ (PageLocked(page) ? 1 : 0), \
-+ (PageError(page) ? 1 : 0), \
-+ (PageReferenced(page) ? 1 : 0), \
-+ (Page_Uptodate(page) ? 1 : 0), \
-+ (PageDecrAfter(page) ? 1 : 0), \
-+ (PageSlab(page) ? 1 : 0), \
-+ (PageSwapCache(page) ? 1 : 0), \
-+ (PageReserved(page) ? 1 : 0) \
-+ )
-+#define EZKDBG printk("EZK %s:%d:%s\n",__FILE__,__LINE__,__FUNCTION__)
-+#if 0
-+# define EZKDBG1 printk("EZK %s:%d\n",__FILE__,__LINE__)
-+#else
-+# define EZKDBG1
-+#endif
-+
-+extern int fist_get_debug_value(void);
-+extern int fist_set_debug_value(int val);
-+#if 0 /* mini_fo doesn't need these */
-+extern void fist_dprint_internal(int level, char *str,...);
-+extern void fist_print_dentry(char *str, const dentry_t *dentry);
-+extern void fist_print_inode(char *str, const inode_t *inode);
-+extern void fist_print_file(char *str, const file_t *file);
-+extern void fist_print_buffer_flags(char *str, struct buffer_head *buffer);
-+extern void fist_print_page_flags(char *str, page_t *page);
-+extern void fist_print_page_bytes(char *str, page_t *page);
-+extern void fist_print_pte_flags(char *str, const page_t *page);
-+extern void fist_checkinode(inode_t *inode, char *msg);
-+extern void fist_print_sb(char *str, const super_block_t *sb);
-+
-+/* §$% by mk: special debug functions */
-+extern void fist_mk_print_dentry(char *str, const dentry_t *dentry);
-+extern void fist_mk_print_inode(char *str, const inode_t *inode);
-+
-+extern char *add_indent(void);
-+extern char *del_indent(void);
-+#endif/* mini_fo doesn't need these */
-+
-+
-+#define STATIC
-+#define ASSERT(EX) \
-+do { \
-+ if (!(EX)) { \
-+ printk(KERN_CRIT "ASSERTION FAILED: %s at %s:%d (%s)\n", #EX, \
-+ __FILE__, __LINE__, __FUNCTION__); \
-+ (*((char *)0))=0; \
-+ } \
-+} while (0)
-+/* same ASSERT, but tell me who was the caller of the function */
-+#define ASSERT2(EX) \
-+do { \
-+ if (!(EX)) { \
-+ printk(KERN_CRIT "ASSERTION FAILED (caller): %s at %s:%d (%s)\n", #EX, \
-+ file, line, func); \
-+ (*((char *)0))=0; \
-+ } \
-+} while (0)
-+
-+#if 0 /* mini_fo doesn't need these */
-+#define dprintk(format, args...) printk(KERN_DEBUG format, ##args)
-+#define fist_dprint(level, str, args...) fist_dprint_internal(level, KERN_DEBUG str, ## args)
-+#define print_entry_location() fist_dprint(4, "%sIN: %s %s:%d\n", add_indent(), __FUNCTION__, __FILE__, __LINE__)
-+#define print_exit_location() fist_dprint(4, "%s OUT: %s %s:%d\n", del_indent(), __FUNCTION__, __FILE__, __LINE__)
-+#define print_exit_status(status) fist_dprint(4, "%s OUT: %s %s:%d, STATUS: %d\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, status)
-+#define print_exit_pointer(status) \
-+do { \
-+ if (IS_ERR(status)) \
-+ fist_dprint(4, "%s OUT: %s %s:%d, RESULT: %ld\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, PTR_ERR(status)); \
-+ else \
-+ fist_dprint(4, "%s OUT: %s %s:%d, RESULT: 0x%x\n", del_indent(), __FUNCTION__, __FILE__, __LINE__, PTR_ERR(status)); \
-+} while (0)
-+#endif/* mini_fo doesn't need these */
-+
-+#endif /* __KERNEL__ */
-+
-+
-+/*
-+ * DEFINITIONS FOR USER AND KERNEL CODE:
-+ * (Note: ioctl numbers 1--9 are reserved for fistgen, the rest
-+ * are auto-generated automatically based on the user's .fist file.)
-+ */
-+# define FIST_IOCTL_GET_DEBUG_VALUE _IOR(0x15, 1, int)
-+# define FIST_IOCTL_SET_DEBUG_VALUE _IOW(0x15, 2, int)
-+
-+#endif /* not __FIST_H_ */
---- /dev/null
-+++ b/fs/mini_fo/inode.c
-@@ -0,0 +1,1564 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd)
-+#else
-+mini_fo_create(inode_t *dir, dentry_t *dentry, int mode)
-+#endif
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = create_sto_reg_file(dentry, mode, nd);
-+#else
-+ err = create_sto_reg_file(dentry, mode);
-+#endif
-+ check_mini_fo_dentry(dentry);
-+ return err;
-+}
-+
-+
-+STATIC dentry_t *
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_lookup(inode_t *dir, dentry_t *dentry, struct nameidata* nd)
-+#else
-+mini_fo_lookup(inode_t *dir, dentry_t *dentry)
-+#endif
-+{
-+ int err = 0;
-+ dentry_t *hidden_dir_dentry;
-+ dentry_t *hidden_dentry = NULL;
-+
-+ dentry_t *hidden_sto_dir_dentry;
-+ dentry_t *hidden_sto_dentry = NULL;
-+
-+ /* whiteout flag */
-+ int del_flag = 0;
-+ char *bpath = NULL;
-+
-+ const char *name;
-+ unsigned int namelen;
-+
-+ /* Don't allow lookups of META-files */
-+ namelen = strlen(META_FILENAME);
-+ if(namelen == dentry->d_name.len) {
-+ if(!strncmp(dentry->d_name.name, META_FILENAME, namelen)) {
-+ err = -ENOENT;
-+ goto out;
-+ }
-+ }
-+
-+ hidden_dir_dentry = dtohd(dentry->d_parent);
-+ hidden_sto_dir_dentry = dtohd2(dentry->d_parent);
-+
-+ name = dentry->d_name.name;
-+ namelen = dentry->d_name.len;
-+
-+ /* must initialize dentry operations */
-+ dentry->d_op = &mini_fo_dops;
-+
-+ /* setup the del_flag */
-+ del_flag = __meta_check_d_entry(dir, name, namelen);
-+ bpath = __meta_check_r_entry(dir, name, namelen);
-+
-+ /* perform the lookups of base and storage files:
-+ *
-+ * This caused some serious trouble, as a lookup_one_len passing
-+ * a negative dentry oopses. Solution is to only do the lookup
-+ * if the dentry is positive, else we set it to NULL
-+ * More trouble, who said a *_dir_dentry can't be NULL?
-+ */
-+ if(bpath) {
-+ /* Cross-Interposing (C), yeah! */
-+ hidden_dentry = bpath_walk(dir->i_sb, bpath);
-+ if(!hidden_dentry || !hidden_dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo_lookup: bpath_walk failed.\n");
-+ err= -EINVAL;
-+ goto out;
-+ }
-+
-+ /* this can be set up safely without fear of spaghetti
-+ * interposing as it is only used for copying times */
-+ hidden_dir_dentry = hidden_dentry->d_parent;
-+ kfree(bpath);
-+ }
-+ else if(hidden_dir_dentry && hidden_dir_dentry->d_inode)
-+ hidden_dentry =
-+ lookup_one_len(name, hidden_dir_dentry, namelen);
-+ else
-+ hidden_dentry = NULL;
-+
-+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+ hidden_sto_dentry =
-+ lookup_one_len(name, hidden_sto_dir_dentry, namelen);
-+ else
-+ hidden_sto_dentry = NULL;
-+
-+ /* catch error in lookup */
-+ if (IS_ERR(hidden_dentry) || IS_ERR(hidden_sto_dentry)) {
-+ /* mk: we need to call dput on the dentry, whose
-+ * lookup_one_len operation failed, in order to avoid
-+ * unmount trouble.
-+ */
-+ if(IS_ERR(hidden_dentry)) {
-+ printk(KERN_CRIT "mini_fo_lookup: ERR from base dentry, lookup failed.\n");
-+ err = PTR_ERR(hidden_dentry);
-+ } else {
-+ dput(hidden_dentry);
-+ }
-+ if(IS_ERR(hidden_sto_dentry)) {
-+ printk(KERN_CRIT "mini_fo_lookup: ERR from storage dentry, lookup failed.\n");
-+ err = PTR_ERR(hidden_sto_dentry);
-+ } else {
-+ dput(hidden_sto_dentry);
-+ }
-+ goto out;
-+ }
-+
-+ /* allocate dentry private data */
-+ __dtopd(dentry) = (struct mini_fo_dentry_info *)
-+ kmalloc(sizeof(struct mini_fo_dentry_info), GFP_KERNEL);
-+
-+ if (!dtopd(dentry)) {
-+ err = -ENOMEM;
-+ goto out_dput;
-+ }
-+
-+ /* check for different states of the mini_fo file to be looked up. */
-+
-+ /* state 1, file has been modified */
-+ if(hidden_dentry && hidden_sto_dentry &&
-+ hidden_dentry->d_inode && hidden_sto_dentry->d_inode && !del_flag) {
-+
-+ /* update parent directory's atime */
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = MODIFIED;
-+ dtohd(dentry) = hidden_dentry;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ err = mini_fo_tri_interpose(hidden_dentry,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state1).\n");
-+ goto out_free;
-+ }
-+ goto out;
-+ }
-+ /* state 2, file is unmodified */
-+ if(hidden_dentry && hidden_dentry->d_inode && !del_flag) {
-+
-+ fist_copy_attr_atime(dir, hidden_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = UNMODIFIED;
-+ dtohd(dentry) = hidden_dentry;
-+ dtohd2(dentry) = hidden_sto_dentry; /* could be negative */
-+
-+ err = mini_fo_tri_interpose(hidden_dentry,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state2).\n");
-+ goto out_free;
-+ }
-+ goto out;
-+ }
-+ /* state 3, file has been newly created */
-+ if(hidden_sto_dentry && hidden_sto_dentry->d_inode && !del_flag) {
-+
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+ dtopd(dentry)->state = CREATED;
-+ dtohd(dentry) = hidden_dentry; /* could be negative */
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ err = mini_fo_tri_interpose(hidden_dentry,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state3).\n");
-+ goto out_free;
-+ }
-+ goto out;
-+ }
-+
-+ /* state 4, file has deleted and created again. */
-+ if(hidden_dentry && hidden_sto_dentry &&
-+ hidden_dentry->d_inode &&
-+ hidden_sto_dentry->d_inode && del_flag) {
-+
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+ dtopd(dentry)->state = DEL_REWRITTEN;
-+ dtohd(dentry) = NULL;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ err = mini_fo_tri_interpose(NULL,
-+ hidden_sto_dentry,
-+ dentry, dir->i_sb, 1);
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo_lookup: error interposing (state4).\n");
-+ goto out_free;
-+ }
-+ /* We will never need this dentry again, as the file has been
-+ * deleted from base */
-+ dput(hidden_dentry);
-+ goto out;
-+ }
-+ /* state 5, file has been deleted in base */
-+ if(hidden_dentry && hidden_sto_dentry &&
-+ hidden_dentry->d_inode &&
-+ !hidden_sto_dentry->d_inode && del_flag) {
-+
-+ /* check which parents atime we need for updating */
-+ if(hidden_sto_dir_dentry->d_inode)
-+ fist_copy_attr_atime(dir,
-+ hidden_sto_dir_dentry->d_inode);
-+ else
-+ fist_copy_attr_atime(dir,
-+ hidden_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = DELETED;
-+ dtohd(dentry) = NULL;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+
-+ /* add negative dentry to dcache to speed up lookups */
-+ d_add(dentry, NULL);
-+ dput(hidden_dentry);
-+ goto out;
-+ }
-+ /* state 6, file does not exist */
-+ if(((hidden_dentry && !hidden_dentry->d_inode) ||
-+ (hidden_sto_dentry && !hidden_sto_dentry->d_inode)) && !del_flag)
-+ {
-+ /* check which parents atime we need for updating */
-+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+ fist_copy_attr_atime(dir, hidden_sto_dir_dentry->d_inode);
-+ else
-+ fist_copy_attr_atime(dir, hidden_dir_dentry->d_inode);
-+
-+ dtopd(dentry)->state = NON_EXISTANT;
-+ dtohd(dentry) = hidden_dentry;
-+ dtohd2(dentry) = hidden_sto_dentry;
-+ d_add(dentry, NULL);
-+ goto out;
-+ }
-+
-+ /* if we get to here, were in an invalid state. bad. */
-+ printk(KERN_CRIT "mini_fo_lookup: ERROR, meta data corruption detected.\n");
-+
-+ /* end state checking */
-+ out_free:
-+ d_drop(dentry); /* so that our bad dentry will get destroyed */
-+ kfree(dtopd(dentry));
-+ __dtopd(dentry) = NULL; /* be safe */
-+
-+ out_dput:
-+ if(hidden_dentry)
-+ dput(hidden_dentry);
-+ if(hidden_sto_dentry)
-+ dput(hidden_sto_dentry); /* drops usage count and marks for release */
-+
-+ out:
-+ /* initalize wol if file exists and is directory */
-+ if(dentry->d_inode) {
-+ if(S_ISDIR(dentry->d_inode->i_mode)) {
-+ itopd(dentry->d_inode)->deleted_list_size = -1;
-+ itopd(dentry->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(dentry);
-+ }
-+ }
-+ return ERR_PTR(err);
-+}
-+
-+
-+STATIC int
-+mini_fo_link(dentry_t *old_dentry, inode_t *dir, dentry_t *new_dentry)
-+{
-+ int err;
-+ dentry_t *hidden_old_dentry;
-+ dentry_t *hidden_new_dentry;
-+ dentry_t *hidden_dir_dentry;
-+
-+
-+ check_mini_fo_dentry(old_dentry);
-+ check_mini_fo_dentry(new_dentry);
-+ check_mini_fo_inode(dir);
-+
-+ /* no links to directorys and existing targets target allowed */
-+ if(S_ISDIR(old_dentry->d_inode->i_mode) ||
-+ is_mini_fo_existant(new_dentry)) {
-+ err = -EPERM;
-+ goto out;
-+ }
-+
-+ /* bring it directly from unmod to del_rew */
-+ if(dtost(old_dentry) == UNMODIFIED) {
-+ err = nondir_unmod_to_mod(old_dentry, 1);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ err = meta_add_d_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ dput(dtohd(old_dentry));
-+ dtohd(old_dentry) = NULL;
-+ dtost(old_dentry) = DEL_REWRITTEN;
-+ }
-+
-+ err = get_neg_sto_dentry(new_dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ hidden_old_dentry = dtohd2(old_dentry);
-+ hidden_new_dentry = dtohd2(new_dentry);
-+
-+ dget(hidden_old_dentry);
-+ dget(hidden_new_dentry);
-+
-+ /* was: hidden_dir_dentry = lock_parent(hidden_new_dentry); */
-+ hidden_dir_dentry = dget(hidden_new_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = vfs_link(hidden_old_dentry,
-+ hidden_dir_dentry->d_inode,
-+ hidden_new_dentry);
-+ if (err || !hidden_new_dentry->d_inode)
-+ goto out_lock;
-+
-+ dtost(new_dentry) = CREATED;
-+ err = mini_fo_tri_interpose(NULL, hidden_new_dentry, new_dentry, dir->i_sb, 0);
-+ if (err)
-+ goto out_lock;
-+
-+ fist_copy_attr_timesizes(dir, hidden_new_dentry->d_inode);
-+ /* propagate number of hard-links */
-+ old_dentry->d_inode->i_nlink = itohi2(old_dentry->d_inode)->i_nlink;
-+
-+ out_lock:
-+ /* was: unlock_dir(hidden_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_dir_dentry);
-+
-+ dput(hidden_new_dentry);
-+ dput(hidden_old_dentry);
-+ if (!new_dentry->d_inode)
-+ d_drop(new_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_unlink(inode_t *dir, dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ dget(dentry);
-+ if(dtopd(dentry)->state == MODIFIED) {
-+ err = nondir_mod_to_del(dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == UNMODIFIED) {
-+ err = nondir_unmod_to_del(dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == CREATED) {
-+ err = nondir_creat_to_del(dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == DEL_REWRITTEN) {
-+ err = nondir_del_rew_to_del(dentry);
-+ goto out;
-+ }
-+
-+ printk(KERN_CRIT "mini_fo_unlink: ERROR, invalid state detected.\n");
-+
-+ out:
-+ fist_copy_attr_times(dir, itohi2(dentry->d_parent->d_inode));
-+
-+ if(!err) {
-+ /* is this causing my pain? d_delete(dentry); */
-+ d_drop(dentry);
-+ }
-+
-+ dput(dentry);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_symlink(inode_t *dir, dentry_t *dentry, const char *symname)
-+{
-+ int err=0;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ umode_t mode;
-+#endif
-+
-+ /* Fail if the symlink file exists */
-+ if(!(dtost(dentry) == DELETED ||
-+ dtost(dentry) == NON_EXISTANT)) {
-+ err = -EEXIST;
-+ goto out;
-+ }
-+
-+ err = get_neg_sto_dentry(dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ dget(hidden_sto_dentry);
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ mode = S_IALLUGO;
-+ err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry, symname, mode);
-+#else
-+ err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ symname);
-+#endif
-+ if (err || !hidden_sto_dentry->d_inode)
-+ goto out_lock;
-+
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ } else if(dtost(dentry) == NON_EXISTANT) {
-+ dtost(dentry) = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ dput(hidden_sto_dentry);
-+ if (!dentry->d_inode)
-+ d_drop(dentry);
-+ out:
-+ return err;
-+}
-+
-+STATIC int
-+mini_fo_mkdir(inode_t *dir, dentry_t *dentry, int mode)
-+{
-+ int err;
-+
-+ err = create_sto_dir(dentry, mode);
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_rmdir(inode_t *dir, dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+ dentry_t *meta_dentry;
-+ inode_t *hidden_sto_dir = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+ check_mini_fo_inode(dir);
-+
-+ dget(dentry);
-+ if(dtopd(dentry)->state == MODIFIED) {
-+ /* XXX: disabled, because it does not bother to check files on
-+ * the original filesystem - just a hack, but better than simply
-+ * removing it without testing */
-+ err = -EINVAL;
-+ goto out;
-+
-+ hidden_sto_dir = itohi2(dir);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was:hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* Delete an old WOL file contained in the storage dir */
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ hidden_sto_dentry,
-+ strlen(META_FILENAME));
-+ if(meta_dentry->d_inode) {
-+ err = vfs_unlink(hidden_sto_dentry->d_inode, meta_dentry);
-+ dput(meta_dentry);
-+ if(!err)
-+ d_delete(meta_dentry);
-+ }
-+
-+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+ dput(dtohd(dentry));
-+
-+ dtohd(dentry) = NULL;
-+ dtopd(dentry)->state = DELETED;
-+
-+ /* carefull with R files */
-+ if( __meta_is_r_entry(dir,
-+ dentry->d_name.name,
-+ dentry->d_name.len) == 1) {
-+ err = meta_remove_r_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: rmdir: meta_remove_r_entry failed.\n");
-+ goto out;
-+ }
-+ }
-+ else {
-+ /* ok, add deleted file to META */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+ }
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == UNMODIFIED) {
-+ /* XXX: simply adding it to the delete list here is fscking dangerous!
-+ * as a temporary hack, i will disable rmdir on unmodified directories
-+ * for now.
-+ */
-+ err = -EINVAL;
-+ goto out;
-+
-+ err = get_neg_sto_dentry(dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* dput base dentry, this will relase the inode and free the
-+ * dentry, as we will never need it again. */
-+ dput(dtohd(dentry));
-+ dtohd(dentry) = NULL;
-+ dtopd(dentry)->state = DELETED;
-+
-+ /* add deleted file to META-file */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == CREATED) {
-+ hidden_sto_dir = itohi2(dir);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* Delete an old WOL file contained in the storage dir */
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ hidden_sto_dentry,
-+ strlen(META_FILENAME));
-+ if(meta_dentry->d_inode) {
-+ /* is this necessary? dget(meta_dentry); */
-+ err = vfs_unlink(hidden_sto_dentry->d_inode,
-+ meta_dentry);
-+ dput(meta_dentry);
-+ if(!err)
-+ d_delete(meta_dentry);
-+ }
-+
-+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+ dtopd(dentry)->state = NON_EXISTANT;
-+
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ goto out;
-+ }
-+ else if(dtopd(dentry)->state == DEL_REWRITTEN) {
-+ hidden_sto_dir = itohi2(dir);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* Delete an old WOL file contained in the storage dir */
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ hidden_sto_dentry,
-+ strlen(META_FILENAME));
-+ if(meta_dentry->d_inode) {
-+ /* is this necessary? dget(meta_dentry); */
-+ err = vfs_unlink(hidden_sto_dentry->d_inode,
-+ meta_dentry);
-+ dput(meta_dentry);
-+ if(!err)
-+ d_delete(meta_dentry);
-+ }
-+
-+ err = vfs_rmdir(hidden_sto_dir, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+ dtopd(dentry)->state = DELETED;
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ goto out;
-+ }
-+
-+ printk(KERN_CRIT "mini_fo_rmdir: ERROR, invalid state detected.\n");
-+
-+ out:
-+ if(!err) {
-+ d_drop(dentry);
-+ }
-+
-+ fist_copy_attr_times(dir, itohi2(dentry->d_parent->d_inode));
-+ dput(dentry);
-+
-+ return err;
-+}
-+
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_mknod(inode_t *dir, dentry_t *dentry, int mode, dev_t dev)
-+#else
-+mini_fo_mknod(inode_t *dir, dentry_t *dentry, int mode, int dev)
-+#endif
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ err = create_sto_nod(dentry, mode, dev);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo_mknod: creating sto nod failed.\n");
-+ err = -EINVAL;
-+ }
-+
-+ check_mini_fo_dentry(dentry);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_rename(inode_t *old_dir, dentry_t *old_dentry,
-+ inode_t *new_dir, dentry_t *new_dentry)
-+{
-+ /* dispatch */
-+ if(S_ISDIR(old_dentry->d_inode->i_mode))
-+ return rename_directory(old_dir, old_dentry, new_dir, new_dentry);
-+ return rename_nondir(old_dir, old_dentry, new_dir, new_dentry);
-+
-+}
-+
-+int rename_directory(inode_t *old_dir, dentry_t *old_dentry,
-+ inode_t *new_dir, dentry_t *new_dentry)
-+{
-+ int err, bpath_len;
-+ char *bpath;
-+
-+ dentry_t *hidden_old_dentry;
-+ dentry_t *hidden_new_dentry;
-+ dentry_t *hidden_old_dir_dentry;
-+ dentry_t *hidden_new_dir_dentry;
-+
-+ err = 0;
-+ bpath = NULL;
-+ bpath_len = 0;
-+
-+ /* this is a test, chuck out if it works */
-+ if(!(dtopd(new_dentry)->state == DELETED ||
-+ dtopd(new_dentry)->state == NON_EXISTANT)) {
-+ printk(KERN_CRIT "mini_fo: rename_directory: \
-+ uh, ah, new_dentry not negative.\n");
-+ /* return -1; */
-+ }
-+
-+ /* state = UNMODIFIED */
-+ if(dtopd(old_dentry)->state == UNMODIFIED) {
-+ err = dir_unmod_to_mod(old_dentry);
-+ if (err)
-+ goto out;
-+ }
-+
-+ /* state = MODIFIED */
-+ if(dtopd(old_dentry)->state == MODIFIED) {
-+ bpath = meta_check_r_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if(bpath) {
-+ err = meta_remove_r_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: rename_directory:\
-+ meta_remove_r_entry \
-+ failed.\n");
-+ goto out;
-+ }
-+ err = meta_add_r_entry(new_dentry->d_parent,
-+ bpath,
-+ strlen(bpath),
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+ kfree(bpath);
-+ }
-+ else {/* wol it */
-+ err = meta_add_d_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+ if (err)
-+ goto out;
-+ /* put it on rename list */
-+ err = get_mini_fo_bpath(old_dentry,
-+ &bpath,
-+ &bpath_len);
-+ if (err)
-+ goto out;
-+ err = meta_add_r_entry(new_dentry->d_parent,
-+ bpath, bpath_len,
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+ if (err)
-+ goto out;
-+ }
-+ /* no state change, MODIFIED stays MODIFIED */
-+ }
-+ /* state = CREATED */
-+ if(dtopd(old_dentry)->state == CREATED ||
-+ dtopd(old_dentry)->state == DEL_REWRITTEN) {
-+ if(dtohd(old_dentry))
-+ dput(dtohd(old_dentry));
-+
-+ if(dtopd(new_dentry)->state == DELETED) {
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ dtohd(old_dentry) = NULL;
-+ }
-+ else if(dtopd(new_dentry)->state == NON_EXISTANT) {
-+ dtopd(old_dentry)->state = CREATED;
-+ /* steal new dentry's neg. base dentry */
-+ dtohd(old_dentry) = dtohd(new_dentry);
-+ dtohd(new_dentry) = NULL;
-+ }
-+ }
-+ if(dtopd(new_dentry)->state == UNMODIFIED ||
-+ dtopd(new_dentry)->state == NON_EXISTANT) {
-+ err = get_neg_sto_dentry(new_dentry);
-+ if(err)
-+ goto out;
-+ }
-+
-+ /* now move sto file */
-+ hidden_old_dentry = dtohd2(old_dentry);
-+ hidden_new_dentry = dtohd2(new_dentry);
-+
-+ dget(hidden_old_dentry);
-+ dget(hidden_new_dentry);
-+
-+ hidden_old_dir_dentry = dget(hidden_old_dentry->d_parent);
-+ hidden_new_dir_dentry = dget(hidden_new_dentry->d_parent);
-+ double_lock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+
-+ err = vfs_rename(hidden_old_dir_dentry->d_inode, hidden_old_dentry,
-+ hidden_new_dir_dentry->d_inode, hidden_new_dentry);
-+ if(err)
-+ goto out_lock;
-+
-+ fist_copy_attr_all(new_dir, hidden_new_dir_dentry->d_inode);
-+ if (new_dir != old_dir)
-+ fist_copy_attr_all(old_dir,
-+ hidden_old_dir_dentry->d_inode);
-+
-+ out_lock:
-+ /* double_unlock will dput the new/old parent dentries
-+ * whose refcnts were incremented via get_parent above. */
-+ double_unlock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+ dput(hidden_new_dentry);
-+ dput(hidden_old_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+int rename_nondir(inode_t *old_dir, dentry_t *old_dentry,
-+ inode_t *new_dir, dentry_t *new_dentry)
-+{
-+ int err=0;
-+
-+ check_mini_fo_dentry(old_dentry);
-+ check_mini_fo_dentry(new_dentry);
-+ check_mini_fo_inode(old_dir);
-+ check_mini_fo_inode(new_dir);
-+
-+ /* state: UNMODIFIED */
-+ if(dtost(old_dentry) == UNMODIFIED) {
-+ err = nondir_unmod_to_mod(old_dentry, 1);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ }
-+
-+ /* the easy states */
-+ if(exists_in_storage(old_dentry)) {
-+
-+ dentry_t *hidden_old_dentry;
-+ dentry_t *hidden_new_dentry;
-+ dentry_t *hidden_old_dir_dentry;
-+ dentry_t *hidden_new_dir_dentry;
-+
-+ /* if old file is MODIFIED, add it to the deleted_list */
-+ if(dtopd(old_dentry)->state == MODIFIED) {
-+ meta_add_d_entry(old_dentry->d_parent,
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len);
-+
-+ dput(dtohd(old_dentry));
-+ }
-+ /* if old file is CREATED, we only release the base dentry */
-+ if(dtopd(old_dentry)->state == CREATED) {
-+ if(dtohd(old_dentry))
-+ dput(dtohd(old_dentry));
-+ }
-+
-+ /* now setup the new states (depends on new_dentry state) */
-+ /* new dentry state = MODIFIED */
-+ if(dtopd(new_dentry)->state == MODIFIED) {
-+ meta_add_d_entry(new_dentry->d_parent,
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+
-+ /* new dentry will be d_put'ed later by the vfs
-+ * so don't do it here
-+ * dput(dtohd(new_dentry));
-+ */
-+ dtohd(old_dentry) = NULL;
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ }
-+ /* new dentry state = UNMODIFIED */
-+ else if(dtopd(new_dentry)->state == UNMODIFIED) {
-+ if(get_neg_sto_dentry(new_dentry))
-+ return -EINVAL;
-+
-+ meta_add_d_entry(new_dentry->d_parent,
-+ new_dentry->d_name.name,
-+ new_dentry->d_name.len);
-+
-+ /* is this right??? */
-+ /*dput(dtohd(new_dentry));*/
-+ dtohd(old_dentry) = NULL;
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ }
-+ /* new dentry state = CREATED */
-+ else if(dtopd(new_dentry)->state == CREATED) {
-+ /* we keep the neg. base dentry (if exists) */
-+ dtohd(old_dentry) = dtohd(new_dentry);
-+ /* ...and set it to Null, or we'll get
-+ * dcache.c:345 if it gets dput twice... */
-+ dtohd(new_dentry) = NULL;
-+ dtopd(old_dentry)->state = CREATED;
-+ }
-+ /* new dentry state = NON_EXISTANT */
-+ else if(dtopd(new_dentry)->state == NON_EXISTANT) {
-+ if(get_neg_sto_dentry(new_dentry))
-+ return -EINVAL;
-+
-+ /* we keep the neg. base dentry (if exists) */
-+ dtohd(old_dentry) = dtohd(new_dentry);
-+ /* ...and set it to Null, or we'll get
-+ * Dr. dcache.c:345 if it gets dput twice... */
-+ dtohd(new_dentry) = NULL;
-+ dtopd(old_dentry)->state = CREATED;
-+ }
-+ /* new dentry state = DEL_REWRITTEN or DELETED */
-+ else if(dtopd(new_dentry)->state == DEL_REWRITTEN ||
-+ dtopd(new_dentry)->state == DELETED) {
-+ dtohd(old_dentry) = NULL;
-+ dtopd(old_dentry)->state = DEL_REWRITTEN;
-+ }
-+ else { /* not possible, uhh, ahh */
-+ printk(KERN_CRIT
-+ "mini_fo: rename_reg_file: invalid state detected [1].\n");
-+ return -1;
-+ }
-+
-+ /* now we definitely have a sto file */
-+ hidden_old_dentry = dtohd2(old_dentry);
-+ hidden_new_dentry = dtohd2(new_dentry);
-+
-+ dget(hidden_old_dentry);
-+ dget(hidden_new_dentry);
-+
-+ hidden_old_dir_dentry = dget(hidden_old_dentry->d_parent);
-+ hidden_new_dir_dentry = dget(hidden_new_dentry->d_parent);
-+ double_lock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+
-+ err = vfs_rename(hidden_old_dir_dentry->d_inode,
-+ hidden_old_dentry,
-+ hidden_new_dir_dentry->d_inode,
-+ hidden_new_dentry);
-+ if(err)
-+ goto out_lock;
-+
-+ fist_copy_attr_all(new_dir, hidden_new_dir_dentry->d_inode);
-+ if (new_dir != old_dir)
-+ fist_copy_attr_all(old_dir, hidden_old_dir_dentry->d_inode);
-+
-+ out_lock:
-+ /* double_unlock will dput the new/old parent dentries
-+ * whose refcnts were incremented via get_parent above.
-+ */
-+ double_unlock(hidden_old_dir_dentry, hidden_new_dir_dentry);
-+ dput(hidden_new_dentry);
-+ dput(hidden_old_dentry);
-+ out:
-+ return err;
-+ }
-+ else { /* invalid state */
-+ printk(KERN_CRIT "mini_fo: rename_reg_file: ERROR: invalid state detected [2].\n");
-+ return -1;
-+ }
-+}
-+
-+
-+STATIC int
-+mini_fo_readlink(dentry_t *dentry, char *buf, int bufsiz)
-+{
-+ int err=0;
-+ dentry_t *hidden_dentry = NULL;
-+
-+ if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+ hidden_dentry = dtohd2(dentry);
-+ } else if(dtohd(dentry) && dtohd(dentry)->d_inode) {
-+ hidden_dentry = dtohd(dentry);
-+ } else {
-+ goto out;
-+ }
-+
-+ if (!hidden_dentry->d_inode->i_op ||
-+ !hidden_dentry->d_inode->i_op->readlink) {
-+ err = -EINVAL; goto out;
-+ }
-+
-+ err = hidden_dentry->d_inode->i_op->readlink(hidden_dentry,
-+ buf,
-+ bufsiz);
-+ if (err > 0)
-+ fist_copy_attr_atime(dentry->d_inode, hidden_dentry->d_inode);
-+
-+ out:
-+ return err;
-+}
-+
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+static int mini_fo_follow_link(dentry_t *dentry, struct nameidata *nd)
-+#else
-+static void* mini_fo_follow_link(dentry_t *dentry, struct nameidata *nd)
-+#endif
-+{
-+ char *buf;
-+ int len = PAGE_SIZE, err;
-+ mm_segment_t old_fs;
-+
-+ /* in 2.6 this is freed by mini_fo_put_link called by __do_follow_link */
-+ buf = kmalloc(len, GFP_KERNEL);
-+ if (!buf) {
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+
-+ /* read the symlink, and then we will follow it */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+ err = dentry->d_inode->i_op->readlink(dentry, buf, len);
-+ set_fs(old_fs);
-+ if (err < 0) {
-+ kfree(buf);
-+ buf = NULL;
-+ goto out;
-+ }
-+ buf[err] = 0;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ nd_set_link(nd, buf);
-+ err = 0;
-+#else
-+ err = vfs_follow_link(nd, buf);
-+#endif
-+
-+ out:
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ kfree(buf);
-+#endif
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+ return err;
-+#else
-+ return ERR_PTR(err);
-+#endif
-+}
-+
-+STATIC
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
-+void mini_fo_put_link(struct dentry *dentry, struct nameidata *nd)
-+#else
-+void mini_fo_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
-+#endif
-+{
-+ char *link;
-+ link = nd_get_link(nd);
-+ kfree(link);
-+}
-+#endif
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_permission(inode_t *inode, int mask, struct nameidata *nd)
-+#else
-+mini_fo_permission(inode_t *inode, int mask)
-+#endif
-+{
-+ inode_t *hidden_inode;
-+ int mode;
-+ int err;
-+
-+ if(itohi2(inode)) {
-+ hidden_inode = itohi2(inode);
-+ } else {
-+ hidden_inode = itohi(inode);
-+ }
-+ mode = inode->i_mode;
-+
-+ /* not really needed, as permission handles everything:
-+ * err = vfs_permission(inode, mask);
-+ * if (err)
-+ * goto out;
-+ */
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = permission(hidden_inode, mask, nd);
-+#else
-+ err = permission(hidden_inode, mask);
-+#endif
-+
-+ /* out: */
-+ return err;
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+STATIC int
-+mini_fo_inode_revalidate(dentry_t *dentry)
-+{
-+ int err = 0;
-+ dentry_t *hidden_dentry;
-+ inode_t *hidden_inode;
-+
-+ ASSERT(dentry->d_inode);
-+ ASSERT(itopd(dentry->d_inode));
-+
-+ if(itohi2(dentry->d_inode)) {
-+ hidden_dentry = dtohd2(dentry);
-+ hidden_inode = hidden_dentry->d_inode;
-+ } else if(itohi(dentry->d_inode)) {
-+ hidden_dentry = dtohd(dentry);
-+ hidden_inode = hidden_dentry->d_inode;
-+ } else {
-+ printk(KERN_CRIT "mini_fo_inode_revalidate: ERROR, invalid state detected.\n");
-+ err = -ENOENT;
-+ goto out;
-+ }
-+ if (hidden_inode && hidden_inode->i_op && hidden_inode->i_op->revalidate){
-+ err = hidden_inode->i_op->revalidate(hidden_dentry);
-+ if (err)
-+ goto out;
-+ }
-+ fist_copy_attr_all(dentry->d_inode, hidden_inode);
-+ out:
-+ return err;
-+}
-+#endif
-+
-+STATIC int
-+mini_fo_setattr(dentry_t *dentry, struct iattr *ia)
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(!is_mini_fo_existant(dentry)) {
-+ printk(KERN_CRIT "mini_fo_setattr: ERROR, invalid state detected [1].\n");
-+ goto out;
-+ }
-+
-+ if(dtost(dentry) == UNMODIFIED) {
-+ if(!IS_COPY_FLAG(ia->ia_valid))
-+ goto out; /* we ignore these changes to base */
-+
-+ if(S_ISDIR(dentry->d_inode->i_mode)) {
-+ err = dir_unmod_to_mod(dentry);
-+ } else {
-+ /* we copy contents if file is not beeing truncated */
-+ if(S_ISREG(dentry->d_inode->i_mode) &&
-+ !(ia->ia_size == 0 && (ia->ia_valid & ATTR_SIZE))) {
-+ err = nondir_unmod_to_mod(dentry, 1);
-+ } else
-+ err = nondir_unmod_to_mod(dentry, 0);
-+ }
-+ if(err) {
-+ err = -EINVAL;
-+ printk(KERN_CRIT "mini_fo_setattr: ERROR changing states.\n");
-+ goto out;
-+ }
-+ }
-+ if(!exists_in_storage(dentry)) {
-+ printk(KERN_CRIT "mini_fo_setattr: ERROR, invalid state detected [2].\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ ASSERT(dentry->d_inode);
-+ ASSERT(dtohd2(dentry));
-+ ASSERT(itopd(dentry->d_inode));
-+ ASSERT(itohi2(dentry->d_inode));
-+
-+ err = notify_change(dtohd2(dentry), ia);
-+ fist_copy_attr_all(dentry->d_inode, itohi2(dentry->d_inode));
-+ out:
-+ return err;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+STATIC int
-+mini_fo_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
-+{
-+ int err = 0;
-+ dentry_t *hidden_dentry;
-+
-+ ASSERT(dentry->d_inode);
-+ ASSERT(itopd(dentry->d_inode));
-+
-+ if(itohi2(dentry->d_inode)) {
-+ hidden_dentry = dtohd2(dentry);
-+ } else if(itohi(dentry->d_inode)) {
-+ hidden_dentry = dtohd(dentry);
-+ } else {
-+ printk(KERN_CRIT "mini_fo_getattr: ERROR, invalid state detected.\n");
-+ err = -ENOENT;
-+ goto out;
-+ }
-+ fist_copy_attr_all(dentry->d_inode, hidden_dentry->d_inode);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ generic_fillattr(dentry->d_inode, stat);
-+ if (!stat->blksize) {
-+ struct super_block *s = hidden_dentry->d_inode->i_sb;
-+ unsigned blocks;
-+ blocks = (stat->size+s->s_blocksize-1) >> s->s_blocksize_bits;
-+ stat->blocks = (s->s_blocksize / 512) * blocks;
-+ stat->blksize = s->s_blocksize;
-+ }
-+ out:
-+ return err;
-+}
-+#endif
-+
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+#if 0 /* no xattr_alloc() and xattr_free() */
-+/* This is lifted from fs/xattr.c */
-+static void *
-+xattr_alloc(size_t size, size_t limit)
-+{
-+ void *ptr;
-+
-+ if (size > limit)
-+ return ERR_PTR(-E2BIG);
-+
-+ if (!size) /* size request, no buffer is needed */
-+ return NULL;
-+ else if (size <= PAGE_SIZE)
-+ ptr = kmalloc((unsigned long) size, GFP_KERNEL);
-+ else
-+ ptr = vmalloc((unsigned long) size);
-+ if (!ptr)
-+ return ERR_PTR(-ENOMEM);
-+ return ptr;
-+}
-+
-+static void
-+xattr_free(void *ptr, size_t size)
-+{
-+ if (!size) /* size request, no buffer was needed */
-+ return;
-+ else if (size <= PAGE_SIZE)
-+ kfree(ptr);
-+ else
-+ vfree(ptr);
-+}
-+#endif /* no xattr_alloc() and xattr_free() */
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_getxattr(struct dentry *dentry, const char *name, void *value, size_t size) {
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+ /* Define these anyway so we don't need as much ifdef'ed code. */
-+ char *encoded_name = NULL;
-+ char *encoded_value = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->getxattr) {
-+ encoded_name = (char *)name;
-+ encoded_value = (char *)value;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->getxattr(hidden_dentry, encoded_name, encoded_value, size);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21) \
-+ && LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,23)) \
-+ || LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
-+mini_fo_setxattr(struct dentry *dentry, const char *name,
-+ const void *value, size_t size, int flags)
-+#else
-+mini_fo_setxattr(struct dentry *dentry, const char *name,
-+ void *value, size_t size, int flags)
-+#endif
-+
-+{
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+
-+ /* Define these anyway, so we don't have as much ifdef'ed code. */
-+ char *encoded_value = NULL;
-+ char *encoded_name = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->setxattr) {
-+ encoded_name = (char *)name;
-+ encoded_value = (char *)value;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->setxattr(hidden_dentry, encoded_name, encoded_value, size, flags);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_removexattr(struct dentry *dentry, const char *name) {
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+ char *encoded_name;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->removexattr) {
-+ encoded_name = (char *)name;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->removexattr(hidden_dentry, encoded_name);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+
-+/* BKL held by caller.
-+ * dentry->d_inode->i_sem down
-+ */
-+STATIC int
-+mini_fo_listxattr(struct dentry *dentry, char *list, size_t size) {
-+ struct dentry *hidden_dentry = NULL;
-+ int err = -EOPNOTSUPP;
-+ char *encoded_list = NULL;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(exists_in_storage(dentry))
-+ hidden_dentry = dtohd2(dentry);
-+ else
-+ hidden_dentry = dtohd(dentry);
-+
-+ ASSERT(hidden_dentry);
-+ ASSERT(hidden_dentry->d_inode);
-+ ASSERT(hidden_dentry->d_inode->i_op);
-+
-+ if (hidden_dentry->d_inode->i_op->listxattr) {
-+ encoded_list = list;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ /* lock_kernel() already done by caller. */
-+ err = hidden_dentry->d_inode->i_op->listxattr(hidden_dentry, encoded_list, size);
-+ /* unlock_kernel() will be done by caller. */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_dentry->d_inode->i_sem);
-+#endif
-+ }
-+ return err;
-+}
-+# endif /* defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) */
-+
-+struct inode_operations mini_fo_symlink_iops =
-+ {
-+ readlink: mini_fo_readlink,
-+ follow_link: mini_fo_follow_link,
-+ /* mk: permission: mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ revalidate: mini_fo_inode_revalidate,
-+#endif
-+ setattr: mini_fo_setattr,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ getattr: mini_fo_getattr,
-+ put_link: mini_fo_put_link,
-+#endif
-+
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+ setxattr: mini_fo_setxattr,
-+ getxattr: mini_fo_getxattr,
-+ listxattr: mini_fo_listxattr,
-+ removexattr: mini_fo_removexattr
-+# endif /* defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20)) */
-+ };
-+
-+struct inode_operations mini_fo_dir_iops =
-+ {
-+ create: mini_fo_create,
-+ lookup: mini_fo_lookup,
-+ link: mini_fo_link,
-+ unlink: mini_fo_unlink,
-+ symlink: mini_fo_symlink,
-+ mkdir: mini_fo_mkdir,
-+ rmdir: mini_fo_rmdir,
-+ mknod: mini_fo_mknod,
-+ rename: mini_fo_rename,
-+ /* no readlink/follow_link for non-symlinks */
-+ // off because we have setattr
-+ // truncate: mini_fo_truncate,
-+ /* mk:permission: mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ revalidate: mini_fo_inode_revalidate,
-+#endif
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ getattr: mini_fo_getattr,
-+#endif
-+ setattr: mini_fo_setattr,
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+ setxattr: mini_fo_setxattr,
-+ getxattr: mini_fo_getxattr,
-+ listxattr: mini_fo_listxattr,
-+ removexattr: mini_fo_removexattr
-+# endif /* XATTR && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) */
-+ };
-+
-+struct inode_operations mini_fo_main_iops =
-+ {
-+ /* permission: mini_fo_permission, */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ revalidate: mini_fo_inode_revalidate,
-+#endif
-+ setattr: mini_fo_setattr,
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ getattr: mini_fo_getattr,
-+#endif
-+#if defined(XATTR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20))
-+ setxattr: mini_fo_setxattr,
-+ getxattr: mini_fo_getxattr,
-+ listxattr: mini_fo_listxattr,
-+ removexattr: mini_fo_removexattr
-+# endif /* XATTR && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) */
-+ };
---- /dev/null
-+++ b/fs/mini_fo/main.c
-@@ -0,0 +1,423 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+#include <linux/module.h>
-+
-+/* This definition must only appear after we include <linux/module.h> */
-+#ifndef MODULE_LICENSE
-+# define MODULE_LICENSE(bison)
-+#endif /* not MODULE_LICENSE */
-+
-+/*
-+ * This is the mini_fo tri interpose function, which extends the
-+ * functionality of the regular interpose by interposing a higher
-+ * level inode on top of two lower level ones: the base filesystem
-+ * inode and the storage filesystem inode.
-+ *
-+ * sb we pass is mini_fo's super_block
-+ */
-+int
-+mini_fo_tri_interpose(dentry_t *hidden_dentry,
-+ dentry_t *hidden_sto_dentry,
-+ dentry_t *dentry, super_block_t *sb, int flag)
-+{
-+ inode_t *hidden_inode = NULL;
-+ inode_t *hidden_sto_inode = NULL; /* store corresponding storage inode */
-+ int err = 0;
-+ inode_t *inode;
-+
-+ /* Pointer to hidden_sto_inode if exists, else to hidden_inode.
-+ * This is used to copy the attributes of the correct inode. */
-+ inode_t *master_inode;
-+
-+ if(hidden_dentry)
-+ hidden_inode = hidden_dentry->d_inode;
-+ if(hidden_sto_dentry)
-+ hidden_sto_inode = hidden_sto_dentry->d_inode;
-+
-+ ASSERT(dentry->d_inode == NULL);
-+
-+ /* mk: One of the inodes associated with the dentrys is likely to
-+ * be NULL, so carefull:
-+ */
-+ ASSERT((hidden_inode != NULL) || (hidden_sto_inode != NULL));
-+
-+ if(hidden_sto_inode)
-+ master_inode = hidden_sto_inode;
-+ else
-+ master_inode = hidden_inode;
-+
-+ /*
-+ * We allocate our new inode below, by calling iget.
-+ * iget will call our read_inode which will initialize some
-+ * of the new inode's fields
-+ */
-+
-+ /*
-+ * original: inode = iget(sb, hidden_inode->i_ino);
-+ */
-+ inode = iget(sb, iunique(sb, 25));
-+ if (!inode) {
-+ err = -EACCES; /* should be impossible??? */
-+ goto out;
-+ }
-+
-+ /*
-+ * interpose the inode if not already interposed
-+ * this is possible if the inode is being reused
-+ * XXX: what happens if we get_empty_inode() but there's another already?
-+ * for now, ASSERT() that this can't happen; fix later.
-+ */
-+ if (itohi(inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo_tri_interpose: itohi(inode) != NULL.\n");
-+ }
-+ if (itohi2(inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo_tri_interpose: itohi2(inode) != NULL.\n");
-+ }
-+
-+ /* mk: Carefull, igrab can't handle NULL inodes (ok, why should it?), so
-+ * we need to check here:
-+ */
-+ if(hidden_inode)
-+ itohi(inode) = igrab(hidden_inode);
-+ else
-+ itohi(inode) = NULL;
-+
-+ if(hidden_sto_inode)
-+ itohi2(inode) = igrab(hidden_sto_inode);
-+ else
-+ itohi2(inode) = NULL;
-+
-+
-+ /* Use different set of inode ops for symlinks & directories*/
-+ if (S_ISLNK(master_inode->i_mode))
-+ inode->i_op = &mini_fo_symlink_iops;
-+ else if (S_ISDIR(master_inode->i_mode))
-+ inode->i_op = &mini_fo_dir_iops;
-+
-+ /* Use different set of file ops for directories */
-+ if (S_ISDIR(master_inode->i_mode))
-+ inode->i_fop = &mini_fo_dir_fops;
-+
-+ /* properly initialize special inodes */
-+ if (S_ISBLK(master_inode->i_mode) || S_ISCHR(master_inode->i_mode) ||
-+ S_ISFIFO(master_inode->i_mode) || S_ISSOCK(master_inode->i_mode)) {
-+ init_special_inode(inode, master_inode->i_mode, master_inode->i_rdev);
-+ }
-+
-+ /* Fix our inode's address operations to that of the lower inode */
-+ if (inode->i_mapping->a_ops != master_inode->i_mapping->a_ops) {
-+ inode->i_mapping->a_ops = master_inode->i_mapping->a_ops;
-+ }
-+
-+ /* only (our) lookup wants to do a d_add */
-+ if (flag)
-+ d_add(dentry, inode);
-+ else
-+ d_instantiate(dentry, inode);
-+
-+ ASSERT(dtopd(dentry) != NULL);
-+
-+ /* all well, copy inode attributes */
-+ fist_copy_attr_all(inode, master_inode);
-+
-+ out:
-+ return err;
-+}
-+
-+/* parse mount options "base=" and "sto=" */
-+dentry_t *
-+mini_fo_parse_options(super_block_t *sb, char *options)
-+{
-+ dentry_t *hidden_root = ERR_PTR(-EINVAL);
-+ dentry_t *hidden_root2 = ERR_PTR(-EINVAL);
-+ struct nameidata nd, nd2;
-+ char *name, *tmp, *end;
-+ int err = 0;
-+
-+ /* We don't want to go off the end of our arguments later on. */
-+ for (end = options; *end; end++);
-+
-+ while (options < end) {
-+ tmp = options;
-+ while (*tmp && *tmp != ',')
-+ tmp++;
-+ *tmp = '\0';
-+ if (!strncmp("base=", options, 5)) {
-+ name = options + 5;
-+ printk(KERN_INFO "mini_fo: using base directory: %s\n", name);
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ if (path_init(name, LOOKUP_FOLLOW, &nd))
-+ err = path_walk(name, &nd);
-+#else
-+ err = path_lookup(name, LOOKUP_FOLLOW, &nd);
-+#endif
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: error accessing hidden directory '%s'\n", name);
-+ hidden_root = ERR_PTR(err);
-+ goto out;
-+ }
-+ hidden_root = nd.dentry;
-+ stopd(sb)->base_dir_dentry = nd.dentry;
-+ stopd(sb)->hidden_mnt = nd.mnt;
-+
-+ } else if(!strncmp("sto=", options, 4)) {
-+ /* parse the storage dir */
-+ name = options + 4;
-+ printk(KERN_INFO "mini_fo: using storage directory: %s\n", name);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ if(path_init(name, LOOKUP_FOLLOW, &nd2))
-+ err = path_walk(name, &nd2);
-+#else
-+ err = path_lookup(name, LOOKUP_FOLLOW, &nd2);
-+#endif
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: error accessing hidden storage directory '%s'\n", name);
-+
-+ hidden_root2 = ERR_PTR(err);
-+ goto out;
-+ }
-+ hidden_root2 = nd2.dentry;
-+ stopd(sb)->storage_dir_dentry = nd2.dentry;
-+ stopd(sb)->hidden_mnt2 = nd2.mnt;
-+ stohs2(sb) = hidden_root2->d_sb;
-+
-+ /* validate storage dir, this is done in
-+ * mini_fo_read_super for the base directory.
-+ */
-+ if (IS_ERR(hidden_root2)) {
-+ printk(KERN_WARNING "mini_fo_parse_options: storage dentry lookup failed (err = %ld)\n", PTR_ERR(hidden_root2));
-+ goto out;
-+ }
-+ if (!hidden_root2->d_inode) {
-+ printk(KERN_WARNING "mini_fo_parse_options: no storage dir to interpose on.\n");
-+ goto out;
-+ }
-+ stohs2(sb) = hidden_root2->d_sb;
-+ } else {
-+ printk(KERN_WARNING "mini_fo: unrecognized option '%s'\n", options);
-+ hidden_root = ERR_PTR(-EINVAL);
-+ goto out;
-+ }
-+ options = tmp + 1;
-+ }
-+
-+ out:
-+ if(IS_ERR(hidden_root2))
-+ return hidden_root2;
-+ return hidden_root;
-+}
-+
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+static int
-+#else
-+super_block_t *
-+#endif
-+mini_fo_read_super(super_block_t *sb, void *raw_data, int silent)
-+{
-+ dentry_t *hidden_root;
-+ int err = 0;
-+
-+ if (!raw_data) {
-+ printk(KERN_WARNING "mini_fo_read_super: missing argument\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ /*
-+ * Allocate superblock private data
-+ */
-+ __stopd(sb) = kmalloc(sizeof(struct mini_fo_sb_info), GFP_KERNEL);
-+ if (!stopd(sb)) {
-+ printk(KERN_WARNING "%s: out of memory\n", __FUNCTION__);
-+ err = -ENOMEM;
-+ goto out;
-+ }
-+ stohs(sb) = NULL;
-+
-+ hidden_root = mini_fo_parse_options(sb, raw_data);
-+ if (IS_ERR(hidden_root)) {
-+ printk(KERN_WARNING "mini_fo_read_super: lookup_dentry failed (err = %ld)\n", PTR_ERR(hidden_root));
-+ err = PTR_ERR(hidden_root);
-+ goto out_free;
-+ }
-+ if (!hidden_root->d_inode) {
-+ printk(KERN_WARNING "mini_fo_read_super: no directory to interpose on\n");
-+ goto out_free;
-+ }
-+ stohs(sb) = hidden_root->d_sb;
-+
-+ /*
-+ * Linux 2.4.2-ac3 and beyond has code in
-+ * mm/filemap.c:generic_file_write() that requires sb->s_maxbytes
-+ * to be populated. If not set, all write()s under that sb will
-+ * return 0.
-+ *
-+ * Linux 2.4.4+ automatically sets s_maxbytes to MAX_NON_LFS;
-+ * the filesystem should override it only if it supports LFS.
-+ */
-+ /* non-SCA code is good to go with LFS */
-+ sb->s_maxbytes = hidden_root->d_sb->s_maxbytes;
-+
-+ sb->s_op = &mini_fo_sops;
-+ /*
-+ * we can't use d_alloc_root if we want to use
-+ * our own interpose function unchanged,
-+ * so we simply replicate *most* of the code in d_alloc_root here
-+ */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ sb->s_root = d_alloc(NULL, &(const struct qstr) { "/", 1, 0 });
-+#else
-+ sb->s_root = d_alloc(NULL, &(const struct qstr){hash: 0, name: "/", len : 1});
-+#endif
-+ if (IS_ERR(sb->s_root)) {
-+ printk(KERN_WARNING "mini_fo_read_super: d_alloc failed\n");
-+ err = -ENOMEM;
-+ goto out_dput;
-+ }
-+
-+ sb->s_root->d_op = &mini_fo_dops;
-+ sb->s_root->d_sb = sb;
-+ sb->s_root->d_parent = sb->s_root;
-+
-+ /* link the upper and lower dentries */
-+ __dtopd(sb->s_root) = (struct mini_fo_dentry_info *)
-+ kmalloc(sizeof(struct mini_fo_dentry_info), GFP_KERNEL);
-+ if (!dtopd(sb->s_root)) {
-+ err = -ENOMEM;
-+ goto out_dput2;
-+ }
-+ dtopd(sb->s_root)->state = MODIFIED;
-+ dtohd(sb->s_root) = hidden_root;
-+
-+ /* fanout relevant, interpose on storage root dentry too */
-+ dtohd2(sb->s_root) = stopd(sb)->storage_dir_dentry;
-+
-+ /* ...and call tri-interpose to interpose root dir inodes
-+ * if (mini_fo_interpose(hidden_root, sb->s_root, sb, 0))
-+ */
-+ if(mini_fo_tri_interpose(hidden_root, dtohd2(sb->s_root), sb->s_root, sb, 0))
-+ goto out_dput2;
-+
-+ /* initalize the wol list */
-+ itopd(sb->s_root->d_inode)->deleted_list_size = -1;
-+ itopd(sb->s_root->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(sb->s_root);
-+
-+ goto out;
-+
-+ out_dput2:
-+ dput(sb->s_root);
-+ out_dput:
-+ dput(hidden_root);
-+ dput(dtohd2(sb->s_root)); /* release the hidden_sto_dentry too */
-+ out_free:
-+ kfree(stopd(sb));
-+ __stopd(sb) = NULL;
-+ out:
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ return err;
-+#else
-+ if (err) {
-+ return ERR_PTR(err);
-+ } else {
-+ return sb;
-+ }
-+#endif
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+static int mini_fo_get_sb(struct file_system_type *fs_type,
-+ int flags, const char *dev_name,
-+ void *raw_data, struct vfsmount *mnt)
-+{
-+ return get_sb_nodev(fs_type, flags, raw_data, mini_fo_read_super, mnt);
-+}
-+#else
-+static struct super_block *mini_fo_get_sb(struct file_system_type *fs_type,
-+ int flags, const char *dev_name,
-+ void *raw_data)
-+{
-+ return get_sb_nodev(fs_type, flags, raw_data, mini_fo_read_super);
-+}
-+#endif
-+
-+void mini_fo_kill_block_super(struct super_block *sb)
-+{
-+ generic_shutdown_super(sb);
-+ /*
-+ * XXX: BUG: Halcrow: Things get unstable sometime after this point:
-+ * lib/rwsem-spinlock.c:127: spin_is_locked on uninitialized
-+ * fs/fs-writeback.c:402: spin_lock(fs/super.c:a0381828) already
-+ * locked by fs/fs-writeback.c/402
-+ *
-+ * Apparently, someone's not releasing a lock on sb_lock...
-+ */
-+}
-+
-+static struct file_system_type mini_fo_fs_type = {
-+ .owner = THIS_MODULE,
-+ .name = "mini_fo",
-+ .get_sb = mini_fo_get_sb,
-+ .kill_sb = mini_fo_kill_block_super,
-+ .fs_flags = 0,
-+};
-+
-+
-+#else
-+static DECLARE_FSTYPE(mini_fo_fs_type, "mini_fo", mini_fo_read_super, 0);
-+#endif
-+
-+static int __init init_mini_fo_fs(void)
-+{
-+ printk("Registering mini_fo version $Id$\n");
-+ return register_filesystem(&mini_fo_fs_type);
-+}
-+static void __exit exit_mini_fo_fs(void)
-+{
-+ printk("Unregistering mini_fo version $Id$\n");
-+ unregister_filesystem(&mini_fo_fs_type);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+EXPORT_NO_SYMBOLS;
-+#endif
-+
-+MODULE_AUTHOR("Erez Zadok <ezk@cs.sunysb.edu>");
-+MODULE_DESCRIPTION("FiST-generated mini_fo filesystem");
-+MODULE_LICENSE("GPL");
-+
-+/* MODULE_PARM(fist_debug_var, "i"); */
-+/* MODULE_PARM_DESC(fist_debug_var, "Debug level"); */
-+
-+module_init(init_mini_fo_fs)
-+module_exit(exit_mini_fo_fs)
---- /dev/null
-+++ b/fs/mini_fo/Makefile
-@@ -0,0 +1,17 @@
-+#
-+# Makefile for mini_fo 2.4 and 2.6 Linux kernels
-+#
-+# Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+#
-+# 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.
-+#
-+
-+obj-$(CONFIG_MINI_FO) := mini_fo.o
-+mini_fo-objs := meta.o dentry.o file.o inode.o main.o super.o state.o aux.o
-+
-+# dependencies
-+${mini_fo-objs}: mini_fo.h fist.h
-+
---- /dev/null
-+++ b/fs/mini_fo/meta.c
-@@ -0,0 +1,1000 @@
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+int meta_build_lists(dentry_t *dentry)
-+{
-+ struct mini_fo_inode_info *inode_info;
-+
-+ dentry_t *meta_dentry = 0;
-+ file_t *meta_file = 0;
-+ mm_segment_t old_fs;
-+ void *buf;
-+
-+ int bytes, len;
-+ struct vfsmount *meta_mnt;
-+ char *entry;
-+
-+ inode_info = itopd(dentry->d_inode);
-+ if(!(inode_info->deleted_list_size == -1 &&
-+ inode_info->renamed_list_size == -1)) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ Error, list(s) not virgin.\n");
-+ return -1;
-+ }
-+
-+ /* init our meta lists */
-+ INIT_LIST_HEAD(&inode_info->deleted_list);
-+ inode_info->deleted_list_size = 0;
-+
-+ INIT_LIST_HEAD(&inode_info->renamed_list);
-+ inode_info->renamed_list_size = 0;
-+
-+ /* might there be a META-file? */
-+ if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen(META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ dput(meta_dentry);
-+ goto out_ok;
-+ }
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
-+
-+ /* open META-file for reading */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x0);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ ERROR opening META file.\n");
-+ goto out_err;
-+ }
-+
-+ /* check if fs supports reading */
-+ if(!meta_file->f_op->read) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ ERROR, fs does not support reading.\n");
-+ goto out_err_close;
-+ }
-+
-+ /* allocate a page for transfering the data */
-+ buf = (void *) __get_free_page(GFP_KERNEL);
-+ if(!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_build_lists: \
-+ ERROR, out of mem.\n");
-+ goto out_err_close;
-+ }
-+ meta_file->f_pos = 0;
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+ do {
-+ char *c;
-+ bytes = meta_file->f_op->read(meta_file, buf, PAGE_SIZE, &meta_file->f_pos);
-+ if(bytes == PAGE_SIZE) {
-+ /* trim a cut off filename and adjust f_pos to get it next time */
-+ for(c = (char*) buf+PAGE_SIZE;
-+ *c != '\n';
-+ c--, bytes--, meta_file->f_pos--);
-+ }
-+ entry = (char *) buf;
-+ while(entry < (char *) buf+bytes) {
-+
-+ char *old_path;
-+ char *dir_name;
-+ int old_len, new_len;
-+
-+ /* len without '\n'*/
-+ len = (int) (strchr(entry, '\n') - entry);
-+ switch (*entry) {
-+ case 'D':
-+ /* format: "D filename" */
-+ meta_list_add_d_entry(dentry,
-+ entry+2,
-+ len-2);
-+ break;
-+ case 'R':
-+ /* format: "R path/xy/dir newDir" */
-+ old_path = entry+2;
-+ dir_name = strchr(old_path, ' ') + 1;
-+ old_len = dir_name - old_path - 1;
-+ new_len = ((int) entry) + len - ((int ) dir_name);
-+ meta_list_add_r_entry(dentry,
-+ old_path,
-+ old_len,
-+ dir_name,
-+ new_len);
-+ break;
-+ default:
-+ /* unknown entry type detected */
-+ break;
-+ }
-+ entry += len+1;
-+ }
-+
-+ } while(meta_file->f_pos < meta_dentry->d_inode->i_size);
-+
-+ free_page((unsigned long) buf);
-+ set_fs(old_fs);
-+ fput(meta_file);
-+ }
-+ goto out_ok;
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out_err:
-+ mntput(meta_mnt);
-+ dput(meta_dentry);
-+ return -1;
-+ out_ok:
-+ return 1; /* check this!!! inode_info->wol_size; */
-+}
-+
-+/* cleanups up all lists and free's the mem by dentry */
-+int meta_put_lists(dentry_t *dentry)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk("mini_fo: meta_put_lists: invalid dentry passed.\n");
-+ return -1;
-+ }
-+ return __meta_put_lists(dentry->d_inode);
-+}
-+
-+/* cleanups up all lists and free's the mem by inode */
-+int __meta_put_lists(inode_t *inode)
-+{
-+ int err = 0;
-+ if(!inode || !itopd(inode)) {
-+ printk("mini_fo: __meta_put_lists: invalid inode passed.\n");
-+ return -1;
-+ }
-+ err = __meta_put_d_list(inode);
-+ err |= __meta_put_r_list(inode);
-+ return err;
-+}
-+
-+int meta_sync_lists(dentry_t *dentry)
-+{
-+ int err = 0;
-+ if(!dentry || !dentry->d_inode) {
-+ printk("mini_fo: meta_sync_lists: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ err = meta_sync_d_list(dentry, 0);
-+ err |= meta_sync_r_list(dentry, 1);
-+ return err;
-+}
-+
-+
-+/* remove all D entries from the renamed list and free the mem */
-+int __meta_put_d_list(inode_t *inode)
-+{
-+ struct list_head *tmp;
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: __meta_put_d_list: \
-+ invalid inode passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(inode);
-+
-+ /* nuke the DELETED-list */
-+ if(inode_info->deleted_list_size <= 0)
-+ return 0;
-+
-+ while(!list_empty(&inode_info->deleted_list)) {
-+ tmp = inode_info->deleted_list.next;
-+ list_del(tmp);
-+ del_entry = list_entry(tmp, struct deleted_entry, list);
-+ kfree(del_entry->name);
-+ kfree(del_entry);
-+ }
-+ inode_info->deleted_list_size = 0;
-+
-+ return 0;
-+}
-+
-+/* remove all R entries from the renamed list and free the mem */
-+int __meta_put_r_list(inode_t *inode)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: meta_put_r_list: invalid inode.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(inode);
-+
-+ /* nuke the RENAMED-list */
-+ if(inode_info->renamed_list_size <= 0)
-+ return 0;
-+
-+ while(!list_empty(&inode_info->renamed_list)) {
-+ tmp = inode_info->renamed_list.next;
-+ list_del(tmp);
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ kfree(ren_entry->new_name);
-+ kfree(ren_entry->old_name);
-+ kfree(ren_entry);
-+ }
-+ inode_info->renamed_list_size = 0;
-+
-+ return 0;
-+}
-+
-+int meta_add_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ int err = 0;
-+ err = meta_list_add_d_entry(dentry, name, len);
-+ err |= meta_write_d_entry(dentry,name,len);
-+ return err;
-+}
-+
-+/* add a D entry to the deleted list */
-+int meta_list_add_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_d_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->deleted_list_size < 0)
-+ return -1;
-+
-+ del_entry = (struct deleted_entry *)
-+ kmalloc(sizeof(struct deleted_entry), GFP_KERNEL);
-+ del_entry->name = (char*) kmalloc(len, GFP_KERNEL);
-+ if(!del_entry || !del_entry->name) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_d_entry: \
-+ out of mem.\n");
-+ kfree(del_entry->name);
-+ kfree(del_entry);
-+ return -ENOMEM;
-+ }
-+
-+ strncpy(del_entry->name, name, len);
-+ del_entry->len = len;
-+
-+ list_add(&del_entry->list, &inode_info->deleted_list);
-+ inode_info->deleted_list_size++;
-+ return 0;
-+}
-+
-+int meta_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len)
-+{
-+ int err = 0;
-+ err = meta_list_add_r_entry(dentry,
-+ old_name, old_len,
-+ new_name, new_len);
-+ err |= meta_write_r_entry(dentry,
-+ old_name, old_len,
-+ new_name, new_len);
-+ return err;
-+}
-+
-+/* add a R entry to the renamed list */
-+int meta_list_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len)
-+{
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_r_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->renamed_list_size < 0)
-+ return -1;
-+
-+ ren_entry = (struct renamed_entry *)
-+ kmalloc(sizeof(struct renamed_entry), GFP_KERNEL);
-+ ren_entry->old_name = (char*) kmalloc(old_len, GFP_KERNEL);
-+ ren_entry->new_name = (char*) kmalloc(new_len, GFP_KERNEL);
-+
-+ if(!ren_entry || !ren_entry->old_name || !ren_entry->new_name) {
-+ printk(KERN_CRIT "mini_fo: meta_list_add_r_entry: \
-+ out of mem.\n");
-+ kfree(ren_entry->new_name);
-+ kfree(ren_entry->old_name);
-+ kfree(ren_entry);
-+ return -ENOMEM;
-+ }
-+
-+ strncpy(ren_entry->old_name, old_name, old_len);
-+ ren_entry->old_len = old_len;
-+ strncpy(ren_entry->new_name, new_name, new_len);
-+ ren_entry->new_len = new_len;
-+
-+ list_add(&ren_entry->list, &inode_info->renamed_list);
-+ inode_info->renamed_list_size++;
-+ return 0;
-+}
-+
-+
-+int meta_remove_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ int err = 0;
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT
-+ "mini_fo: meta_remove_r_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+
-+ err = meta_list_remove_r_entry(dentry, name, len);
-+ err |= meta_sync_lists(dentry);
-+ return err;
-+}
-+
-+int meta_list_remove_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT
-+ "mini_fo: meta_list_remove_r_entry: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ return __meta_list_remove_r_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_list_remove_r_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode))
-+ printk(KERN_CRIT
-+ "mini_fo: __meta_list_remove_r_entry: \
-+ invalid inode passed.\n");
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->renamed_list_size < 0)
-+ return -1;
-+ if(inode_info->renamed_list_size == 0)
-+ return 1;
-+
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ if(ren_entry->new_len != len)
-+ continue;
-+
-+ if(!strncmp(ren_entry->new_name, name, len)) {
-+ list_del(tmp);
-+ kfree(ren_entry->new_name);
-+ kfree(ren_entry->old_name);
-+ kfree(ren_entry);
-+ inode_info->renamed_list_size--;
-+ return 0;
-+ }
-+ }
-+ return 1;
-+}
-+
-+
-+/* append a single D entry to the meta file */
-+int meta_write_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ dentry_t *meta_dentry = 0;
-+ file_t *meta_file = 0;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err;
-+ struct vfsmount *meta_mnt = 0;
-+ char *buf;
-+
-+ err = 0;
-+
-+ if(itopd(dentry->d_inode)->deleted_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ if(dtopd(dentry)->state == UNMODIFIED) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry), strlen (META_FILENAME));
-+
-+ /* We need to create a META-file */
-+ if(!meta_dentry->d_inode) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry,
-+ S_IRUSR | S_IWUSR,
-+ NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry,
-+ S_IRUSR | S_IWUSR);
-+#endif
-+ }
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ ERROR opening meta file.\n");
-+ mntput(meta_mnt); /* $%& is this necessary? */
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* size: len for name, 1 for \n and 2 for "D " */
-+ buf = (char *) kmalloc(len+3, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ out of mem.\n");
-+ return -ENOMEM;
-+ }
-+
-+ buf[0] = 'D';
-+ buf[1] = ' ';
-+ strncpy(buf+2, name, len);
-+ buf[len+2] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf, len+3,
-+ &meta_file->f_pos);
-+ if(bytes != len+3) {
-+ printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
-+ ERROR writing.\n");
-+ err = -1;
-+ }
-+ kfree(buf);
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+}
-+
-+/* append a single R entry to the meta file */
-+int meta_write_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len)
-+{
-+ dentry_t *meta_dentry = 0;
-+ file_t *meta_file = 0;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err, buf_len;
-+ struct vfsmount *meta_mnt = 0;
-+ char *buf;
-+
-+
-+ err = 0;
-+
-+ if(itopd(dentry->d_inode)->renamed_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* build the storage structure? */
-+ if(dtopd(dentry)->state == UNMODIFIED) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen (META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+ }
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+ ERROR opening meta file.\n");
-+ mntput(meta_mnt);
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* size: 2 for "R ", old_len+new_len for names, 1 blank+1 \n */
-+ buf_len = old_len + new_len + 4;
-+ buf = (char *) kmalloc(buf_len, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: out of mem.\n");
-+ return -ENOMEM;
-+ }
-+
-+ buf[0] = 'R';
-+ buf[1] = ' ';
-+ strncpy(buf + 2, old_name, old_len);
-+ buf[old_len + 2] = ' ';
-+ strncpy(buf + old_len + 3, new_name, new_len);
-+ buf[buf_len -1] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf, buf_len, &meta_file->f_pos);
-+ if(bytes != buf_len) {
-+ printk(KERN_CRIT "mini_fo: meta_write_r_entry: ERROR writing.\n");
-+ err = -1;
-+ }
-+
-+ kfree(buf);
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+}
-+
-+/* sync D list to disk, append data if app_flag is 1 */
-+/* check the meta_mnt, which seems not to be used (properly) */
-+
-+int meta_sync_d_list(dentry_t *dentry, int app_flag)
-+{
-+ dentry_t *meta_dentry;
-+ file_t *meta_file;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err;
-+ struct vfsmount *meta_mnt;
-+ char *buf;
-+
-+ struct list_head *tmp;
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ err = 0;
-+ meta_file=0;
-+ meta_mnt=0;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ invalid inode passed.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->deleted_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* ok, there is something to sync */
-+
-+ /* build the storage structure? */
-+ if(!dtohd2(dentry) && !itohi2(dentry->d_inode)) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen(META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+ app_flag = 0;
-+ }
-+ /* need we truncate the meta file? */
-+ if(!app_flag) {
-+ struct iattr newattrs;
-+ newattrs.ia_size = 0;
-+ newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ down(&meta_dentry->d_inode->i_sem);
-+#endif
-+ err = notify_change(meta_dentry, &newattrs);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ up(&meta_dentry->d_inode->i_sem);
-+#endif
-+
-+ if(err || meta_dentry->d_inode->i_size != 0) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR truncating meta file.\n");
-+ goto out_err_close;
-+ }
-+ }
-+
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR opening meta file.\n");
-+ /* we don't mntget so we dont't mntput (for now)
-+ * mntput(meta_mnt);
-+ */
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* here we go... */
-+ list_for_each(tmp, &inode_info->deleted_list) {
-+ del_entry = list_entry(tmp, struct deleted_entry, list);
-+
-+ /* size: len for name, 1 for \n and 2 for "D " */
-+ buf = (char *) kmalloc(del_entry->len+3, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ out of mem.\n");
-+ return -ENOMEM;
-+ }
-+
-+ buf[0] = 'D';
-+ buf[1] = ' ';
-+ strncpy(buf+2, del_entry->name, del_entry->len);
-+ buf[del_entry->len+2] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf,
-+ del_entry->len+3,
-+ &meta_file->f_pos);
-+ if(bytes != del_entry->len+3) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
-+ ERROR writing.\n");
-+ err |= -1;
-+ }
-+ kfree(buf);
-+ }
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+
-+}
-+
-+int meta_sync_r_list(dentry_t *dentry, int app_flag)
-+{
-+ dentry_t *meta_dentry;
-+ file_t *meta_file;
-+ mm_segment_t old_fs;
-+
-+ int bytes, err, buf_len;
-+ struct vfsmount *meta_mnt;
-+ char *buf;
-+
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ err = 0;
-+ meta_file=0;
-+ meta_mnt=0;
-+
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ invalid dentry passed.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ inode_info = itopd(dentry->d_inode);
-+
-+ if(inode_info->deleted_list_size < 0) {
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* ok, there is something to sync */
-+
-+ /* build the storage structure? */
-+ if(!dtohd2(dentry) && !itohi2(dentry->d_inode)) {
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ }
-+ meta_dentry = lookup_one_len(META_FILENAME,
-+ dtohd2(dentry),
-+ strlen(META_FILENAME));
-+ if(!meta_dentry->d_inode) {
-+ /* We need to create a META-file */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR, NULL);
-+#else
-+ vfs_create(dtohd2(dentry)->d_inode,
-+ meta_dentry, S_IRUSR | S_IWUSR);
-+#endif
-+ app_flag = 0;
-+ }
-+ /* need we truncate the meta file? */
-+ if(!app_flag) {
-+ struct iattr newattrs;
-+ newattrs.ia_size = 0;
-+ newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ down(&meta_dentry->d_inode->i_sem);
-+#endif
-+ err = notify_change(meta_dentry, &newattrs);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&meta_dentry->d_inode->i_mutex);
-+#else
-+ up(&meta_dentry->d_inode->i_sem);
-+#endif
-+ if(err || meta_dentry->d_inode->i_size != 0) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR truncating meta file.\n");
-+ goto out_err_close;
-+ }
-+ }
-+
-+ /* open META-file for writing */
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ if(!meta_file || IS_ERR(meta_file)) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR opening meta file.\n");
-+ /* we don't mntget so we dont't mntput (for now)
-+ * mntput(meta_mnt);
-+ */
-+ dput(meta_dentry);
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* check if fs supports writing */
-+ if(!meta_file->f_op->write) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR, fs does not support writing.\n");
-+ goto out_err_close;
-+ }
-+
-+ meta_file->f_pos = meta_dentry->d_inode->i_size; /* append */
-+ old_fs = get_fs();
-+ set_fs(KERNEL_DS);
-+
-+ /* here we go... */
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ /* size:
-+ * 2 for "R ", old_len+new_len for names, 1 blank+1 \n */
-+ buf_len = ren_entry->old_len + ren_entry->new_len + 4;
-+ buf = (char *) kmalloc(buf_len, GFP_KERNEL);
-+ if (!buf) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ out of mem.\n");
-+ return -ENOMEM;
-+ }
-+ buf[0] = 'R';
-+ buf[1] = ' ';
-+ strncpy(buf + 2, ren_entry->old_name, ren_entry->old_len);
-+ buf[ren_entry->old_len + 2] = ' ';
-+ strncpy(buf + ren_entry->old_len + 3,
-+ ren_entry->new_name, ren_entry->new_len);
-+ buf[buf_len - 1] = '\n';
-+ bytes = meta_file->f_op->write(meta_file, buf,
-+ buf_len, &meta_file->f_pos);
-+ if(bytes != buf_len) {
-+ printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
-+ ERROR writing.\n");
-+ err |= -1;
-+ }
-+ kfree(buf);
-+ }
-+ set_fs(old_fs);
-+
-+ out_err_close:
-+ fput(meta_file);
-+ out:
-+ return err;
-+}
-+
-+int meta_check_d_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode)
-+ printk(KERN_CRIT "mini_fo: meta_check_d_dentry: \
-+ invalid dentry passed.\n");
-+ return __meta_check_d_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_check_d_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct deleted_entry *del_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode))
-+ printk(KERN_CRIT "mini_fo: __meta_check_d_dentry: \
-+ invalid inode passed.\n");
-+
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->deleted_list_size <= 0)
-+ return 0;
-+
-+ list_for_each(tmp, &inode_info->deleted_list) {
-+ del_entry = list_entry(tmp, struct deleted_entry, list);
-+ if(del_entry->len != len)
-+ continue;
-+
-+ if(!strncmp(del_entry->name, name, len))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/*
-+ * check if file has been renamed and return path to orig. base dir.
-+ * Implements no error return values so far, what of course sucks.
-+ * String is null terminated.'
-+ */
-+char* meta_check_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry: \
-+ invalid dentry passed.\n");
-+ return NULL;
-+ }
-+ return __meta_check_r_entry(dentry->d_inode, name, len);
-+}
-+
-+char* __meta_check_r_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+ char *old_path;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry: \
-+ invalid inode passed.\n");
-+ return NULL;
-+ }
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->renamed_list_size <= 0)
-+ return NULL;
-+
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ if(ren_entry->new_len != len)
-+ continue;
-+
-+ if(!strncmp(ren_entry->new_name, name, len)) {
-+ old_path = (char *)
-+ kmalloc(ren_entry->old_len+1, GFP_KERNEL);
-+ strncpy(old_path,
-+ ren_entry->old_name,
-+ ren_entry->old_len);
-+ old_path[ren_entry->old_len]='\0';
-+ return old_path;
-+ }
-+ }
-+ return NULL;
-+}
-+
-+/*
-+ * This version only checks if entry exists and return:
-+ * 1 if exists,
-+ * 0 if not,
-+ * -1 if error.
-+ */
-+int meta_is_r_entry(dentry_t *dentry, const char *name, int len)
-+{
-+ if(!dentry || !dentry->d_inode) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry [2]: \
-+ invalid dentry passed.\n");
-+ return -1;
-+ }
-+ return __meta_is_r_entry(dentry->d_inode, name, len);
-+}
-+
-+int __meta_is_r_entry(inode_t *inode, const char *name, int len)
-+{
-+ struct list_head *tmp;
-+ struct renamed_entry *ren_entry;
-+ struct mini_fo_inode_info *inode_info;
-+
-+ if(!inode || !itopd(inode)) {
-+ printk(KERN_CRIT "mini_fo: meta_check_r_dentry [2]: \
-+ invalid inode passed.\n");
-+ return -1;
-+ }
-+ inode_info = itopd(inode);
-+
-+ if(inode_info->renamed_list_size <= 0)
-+ return -1;
-+
-+ list_for_each(tmp, &inode_info->renamed_list) {
-+ ren_entry = list_entry(tmp, struct renamed_entry, list);
-+ if(ren_entry->new_len != len)
-+ continue;
-+
-+ if(!strncmp(ren_entry->new_name, name, len))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
---- /dev/null
-+++ b/fs/mini_fo/mini_fo.h
-@@ -0,0 +1,510 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifndef __MINI_FO_H_
-+#define __MINI_FO_H_
-+
-+#ifdef __KERNEL__
-+
-+/* META stuff */
-+#define META_FILENAME "META_dAfFgHE39ktF3HD2sr"
-+
-+/* use xattrs? */
-+#define XATTR
-+
-+/* File attributes that when changed, result in a file beeing copied to storage */
-+#define COPY_FLAGS ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_SIZE
-+
-+/*
-+ * mini_fo filestates
-+ */
-+#define MODIFIED 1
-+#define UNMODIFIED 2
-+#define CREATED 3
-+#define DEL_REWRITTEN 4
-+#define DELETED 5
-+#define NON_EXISTANT 6
-+
-+/* fist file systems superblock magic */
-+# define MINI_FO_SUPER_MAGIC 0xf15f
-+
-+/*
-+ * STRUCTURES:
-+ */
-+
-+/* mini_fo inode data in memory */
-+struct mini_fo_inode_info {
-+ inode_t *wii_inode;
-+ inode_t *wii_inode2; /* pointer to storage inode */
-+
-+ /* META-data lists */
-+ /* deleted list, ex wol */
-+ struct list_head deleted_list;
-+ int deleted_list_size;
-+
-+ /* renamed list */
-+ struct list_head renamed_list;
-+ int renamed_list_size;
-+
-+ /* add other lists here ... */
-+};
-+
-+/* mini_fo dentry data in memory */
-+struct mini_fo_dentry_info {
-+ dentry_t *wdi_dentry;
-+ dentry_t *wdi_dentry2; /* pointer to storage dentry */
-+ unsigned int state; /* state of the mini_fo dentry */
-+};
-+
-+
-+/* mini_fo super-block data in memory */
-+struct mini_fo_sb_info {
-+ super_block_t *wsi_sb, *wsi_sb2; /* mk: might point to the same sb */
-+ struct vfsmount *hidden_mnt, *hidden_mnt2;
-+ dentry_t *base_dir_dentry;
-+ dentry_t *storage_dir_dentry;
-+ ;
-+};
-+
-+/* readdir_data, readdir helper struct */
-+struct readdir_data {
-+ struct list_head ndl_list; /* linked list head ptr */
-+ int ndl_size; /* list size */
-+ int sto_done; /* flag to show that the storage dir entries have
-+ * all been read an now follow base entries */
-+};
-+
-+/* file private data. */
-+struct mini_fo_file_info {
-+ struct file *wfi_file;
-+ struct file *wfi_file2; /* pointer to storage file */
-+ struct readdir_data rd;
-+};
-+
-+/* struct ndl_entry */
-+struct ndl_entry {
-+ struct list_head list;
-+ char *name;
-+ int len;
-+};
-+
-+/********************************
-+ * META-data structures
-+ ********************************/
-+
-+/* deleted entry */
-+struct deleted_entry {
-+ struct list_head list;
-+ char *name;
-+ int len;
-+};
-+
-+/* renamed entry */
-+struct renamed_entry {
-+ struct list_head list;
-+ char *old_name; /* old directory with full path */
-+ int old_len; /* length of above string */
-+ char *new_name; /* new directory name */
-+ int new_len; /* length of above string */
-+};
-+
-+/* attr_change entry */
-+struct attr_change_entry {
-+ struct list_head list;
-+ char *name;
-+ int len;
-+};
-+
-+/* link entry */
-+struct link_entry {
-+ struct list_head list;
-+ int links_moved;
-+ int inum_base;
-+ int inum_sto;
-+ char *weird_name;
-+ int weird_name_len;
-+};
-+
-+
-+/* Some other stuff required for mini_fo_filldir64, copied from
-+ * fs/readdir.c
-+ */
-+
-+#define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1))
-+#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
-+
-+
-+struct linux_dirent64 {
-+ u64 d_ino;
-+ s64 d_off;
-+ unsigned short d_reclen;
-+ unsigned char d_type;
-+ char d_name[0];
-+};
-+
-+
-+struct getdents_callback64 {
-+ struct linux_dirent64 * current_dir;
-+ struct linux_dirent64 * previous;
-+ int count;
-+ int error;
-+};
-+
-+struct linux_dirent {
-+ unsigned long d_ino;
-+ unsigned long d_off;
-+ unsigned short d_reclen;
-+ char d_name[1];
-+};
-+
-+struct getdents_callback {
-+ struct linux_dirent * current_dir;
-+ struct linux_dirent * previous;
-+ int count;
-+ int error;
-+};
-+
-+
-+/*
-+ * MACROS:
-+ */
-+
-+/* file TO private_data */
-+# define ftopd(file) ((struct mini_fo_file_info *)((file)->private_data))
-+# define __ftopd(file) ((file)->private_data)
-+/* file TO hidden_file */
-+# define ftohf(file) ((ftopd(file))->wfi_file)
-+# define ftohf2(file) ((ftopd(file))->wfi_file2)
-+
-+/* inode TO private_data */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+# define itopd(ino) ((struct mini_fo_inode_info *)(ino)->i_private)
-+# define __itopd(ino) ((ino)->i_private)
-+#else
-+# define itopd(ino) ((struct mini_fo_inode_info *)(ino)->u.generic_ip)
-+# define __itopd(ino) ((ino)->u.generic_ip)
-+#endif
-+/* inode TO hidden_inode */
-+# define itohi(ino) (itopd(ino)->wii_inode)
-+# define itohi2(ino) (itopd(ino)->wii_inode2)
-+
-+/* superblock TO private_data */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+# define stopd(super) ((struct mini_fo_sb_info *)(super)->s_fs_info)
-+# define __stopd(super) ((super)->s_fs_info)
-+#else
-+# define stopd(super) ((struct mini_fo_sb_info *)(super)->u.generic_sbp)
-+# define __stopd(super) ((super)->u.generic_sbp)
-+#endif
-+
-+/* unused? # define vfs2priv stopd */
-+/* superblock TO hidden_superblock */
-+
-+# define stohs(super) (stopd(super)->wsi_sb)
-+# define stohs2(super) (stopd(super)->wsi_sb2)
-+
-+/* dentry TO private_data */
-+# define dtopd(dentry) ((struct mini_fo_dentry_info *)(dentry)->d_fsdata)
-+# define __dtopd(dentry) ((dentry)->d_fsdata)
-+/* dentry TO hidden_dentry */
-+# define dtohd(dent) (dtopd(dent)->wdi_dentry)
-+# define dtohd2(dent) (dtopd(dent)->wdi_dentry2)
-+
-+/* dentry to state */
-+# define dtost(dent) (dtopd(dent)->state)
-+# define sbt(sb) ((sb)->s_type->name)
-+
-+#define IS_WRITE_FLAG(flag) (flag & (O_RDWR | O_WRONLY | O_APPEND))
-+#define IS_COPY_FLAG(flag) (flag & (COPY_FLAGS))
-+
-+/* macros to simplify non-SCA code */
-+# define MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages)
-+# define MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages)
-+# define FREE_PAGE_POINTERS(hidden_pages, num)
-+# define FREE_PAGEDATA_POINTERS(hidden_pages_data, num)
-+# define FOR_EACH_PAGE
-+# define CURRENT_HIDDEN_PAGE hidden_page
-+# define CURRENT_HIDDEN_PAGEDATA hidden_page_data
-+# define CURRENT_HIDDEN_PAGEINDEX page->index
-+
-+/*
-+ * EXTERNALS:
-+ */
-+extern struct file_operations mini_fo_main_fops;
-+extern struct file_operations mini_fo_dir_fops;
-+extern struct inode_operations mini_fo_main_iops;
-+extern struct inode_operations mini_fo_dir_iops;
-+extern struct inode_operations mini_fo_symlink_iops;
-+extern struct super_operations mini_fo_sops;
-+extern struct dentry_operations mini_fo_dops;
-+extern struct vm_operations_struct mini_fo_shared_vmops;
-+extern struct vm_operations_struct mini_fo_private_vmops;
-+extern struct address_space_operations mini_fo_aops;
-+
-+#if 0 /* unused by mini_fo */
-+extern int mini_fo_interpose(dentry_t *hidden_dentry, dentry_t *this_dentry, super_block_t *sb, int flag);
-+#if defined(FIST_FILTER_DATA) || defined(FIST_FILTER_SCA)
-+extern page_t *mini_fo_get1page(file_t *file, int index);
-+extern int mini_fo_fill_zeros(file_t *file, page_t *page, unsigned from);
-+# endif /* FIST_FILTER_DATA || FIST_FILTER_SCA */
-+
-+
-+# define mini_fo_hidden_dentry(d) __mini_fo_hidden_dentry(__FILE__,__FUNCTION__,__LINE__,(d))
-+# define mini_fo_hidden_sto_dentry(d) __mini_fo_hidden_sto_dentry(__FILE__,__FUNCTION__,__LINE__,(d))
-+
-+extern dentry_t *__mini_fo_hidden_dentry(char *file, char *func, int line, dentry_t *this_dentry);
-+extern dentry_t *__mini_fo_hidden_sto_dentry(char *file, char *func, int line, dentry_t *this_dentry);
-+
-+extern int mini_fo_read_file(const char *filename, void *buf, int len);
-+extern int mini_fo_write_file(const char *filename, void *buf, int len);
-+extern dentry_t *fist_lookup(dentry_t *dir, const char *name, vnode_t **out, uid_t uid, gid_t gid);
-+#endif /* unused by mini_fo */
-+
-+/* state transition functions */
-+extern int nondir_unmod_to_mod(dentry_t *dentry, int cp_flag);
-+extern int nondir_del_rew_to_del(dentry_t *dentry);
-+extern int nondir_creat_to_del(dentry_t *dentry);
-+extern int nondir_mod_to_del(dentry_t *dentry);
-+extern int nondir_unmod_to_del(dentry_t *dentry);
-+
-+extern int dir_unmod_to_mod(dentry_t *dentry);
-+
-+/* rename specials */
-+extern int rename_directory(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry);
-+extern int rename_nondir(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry);
-+
-+/* misc stuff */
-+extern int mini_fo_tri_interpose(dentry_t *hidden_dentry,
-+ dentry_t *hidden_sto_dentry,
-+ dentry_t *dentry,
-+ super_block_t *sb, int flag);
-+
-+extern int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
-+ dentry_t *src_dentry, struct vfsmount *src_mnt);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd);
-+
-+extern int create_sto_nod(dentry_t *dentry, int mode, dev_t dev);
-+extern int create_sto_reg_file(dentry_t *dentry, int mode, struct nameidata *nd);
-+#else
-+extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode);
-+
-+extern int create_sto_nod(dentry_t *dentry, int mode, int dev);
-+extern int create_sto_reg_file(dentry_t *dentry, int mode);
-+#endif
-+
-+extern int create_sto_dir(dentry_t *dentry, int mode);
-+
-+extern int exists_in_storage(dentry_t *dentry);
-+extern int is_mini_fo_existant(dentry_t *dentry);
-+extern int get_neg_sto_dentry(dentry_t *dentry);
-+extern int build_sto_structure(dentry_t *dir, dentry_t *dentry);
-+extern int get_mini_fo_bpath(dentry_t *dentry, char **bpath, int *bpath_len);
-+extern dentry_t *bpath_walk(super_block_t *sb, char *bpath);
-+extern int bpath_put(dentry_t *dentry);
-+
-+/* check_mini_fo types functions */
-+extern int check_mini_fo_dentry(dentry_t *dentry);
-+extern int check_mini_fo_file(file_t *file);
-+extern int check_mini_fo_inode(inode_t *inode);
-+
-+/* General meta functions, can be called from outside of meta.c */
-+extern int meta_build_lists(dentry_t *dentry);
-+extern int meta_put_lists(dentry_t *dentry);
-+extern int __meta_put_lists(inode_t *inode);
-+
-+extern int meta_add_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int meta_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len);
-+
-+extern int meta_remove_r_entry(dentry_t *dentry, const char *name, int len);
-+
-+extern int meta_check_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int __meta_check_d_entry(inode_t *inode, const char *name, int len);
-+
-+extern char* meta_check_r_entry(dentry_t *dentry, const char *name, int len);
-+extern char* __meta_check_r_entry(inode_t *inode, const char *name, int len);
-+extern int meta_is_r_entry(dentry_t *dentry, const char *name, int len);
-+extern int __meta_is_r_entry(inode_t *inode, const char *name, int len);
-+
-+/* Specific meta functions, should be called only inside meta.c */
-+extern int __meta_put_d_list(inode_t *inode);
-+extern int __meta_put_r_list(inode_t *inode);
-+
-+extern int meta_list_add_d_entry(dentry_t *dentry,
-+ const char *name, int len);
-+extern int meta_list_add_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len);
-+
-+extern int meta_list_remove_r_entry(dentry_t *dentry,
-+ const char *name, int len);
-+
-+extern int __meta_list_remove_r_entry(inode_t *inode,
-+ const char *name, int len);
-+
-+extern int meta_write_d_entry(dentry_t *dentry, const char *name, int len);
-+extern int meta_write_r_entry(dentry_t *dentry,
-+ const char *old_name, int old_len,
-+ const char *new_name, int new_len);
-+
-+extern int meta_sync_lists(dentry_t *dentry);
-+extern int meta_sync_d_list(dentry_t *dentry, int app_flag);
-+extern int meta_sync_r_list(dentry_t *dentry, int app_flag);
-+
-+/* ndl stuff */
-+extern int ndl_add_entry(struct readdir_data *rd, const char *name, int len);
-+extern void ndl_put_list(struct readdir_data *rd);
-+extern int ndl_check_entry(struct readdir_data *rd,
-+ const char *name, int len);
-+
-+
-+# define copy_inode_size(dst, src) \
-+ dst->i_size = src->i_size; \
-+ dst->i_blocks = src->i_blocks;
-+
-+static inline void
-+fist_copy_attr_atime(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_atime = src->i_atime;
-+}
-+static inline void
-+fist_copy_attr_times(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_atime = src->i_atime;
-+ dest->i_mtime = src->i_mtime;
-+ dest->i_ctime = src->i_ctime;
-+}
-+static inline void
-+fist_copy_attr_timesizes(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_atime = src->i_atime;
-+ dest->i_mtime = src->i_mtime;
-+ dest->i_ctime = src->i_ctime;
-+ copy_inode_size(dest, src);
-+}
-+static inline void
-+fist_copy_attr_all(inode_t *dest, const inode_t *src)
-+{
-+ ASSERT(dest != NULL);
-+ ASSERT(src != NULL);
-+ dest->i_mode = src->i_mode;
-+ dest->i_nlink = src->i_nlink;
-+ dest->i_uid = src->i_uid;
-+ dest->i_gid = src->i_gid;
-+ dest->i_rdev = src->i_rdev;
-+ dest->i_atime = src->i_atime;
-+ dest->i_mtime = src->i_mtime;
-+ dest->i_ctime = src->i_ctime;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+ dest->i_blksize = src->i_blksize;
-+#endif
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,12)
-+ dest->i_blkbits = src->i_blkbits;
-+# endif /* linux 2.4.12 and newer */
-+ copy_inode_size(dest, src);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-+ dest->i_attr_flags = src->i_attr_flags;
-+#else
-+ dest->i_flags = src->i_flags;
-+#endif
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+/* copied from linux/fs.h */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+static inline void double_lock(struct dentry *d1, struct dentry *d2)
-+{
-+ struct mutex *m1 = &d1->d_inode->i_mutex;
-+ struct mutex *m2 = &d2->d_inode->i_mutex;
-+ if (m1 != m2) {
-+ if ((unsigned long) m1 < (unsigned long) m2) {
-+ struct mutex *tmp = m2;
-+ m2 = m1; m1 = tmp;
-+ }
-+ mutex_lock(m1);
-+ }
-+ mutex_lock(m2);
-+}
-+
-+static inline void double_unlock(struct dentry *d1, struct dentry *d2)
-+{
-+ struct mutex *m1 = &d1->d_inode->i_mutex;
-+ struct mutex *m2 = &d2->d_inode->i_mutex;
-+ mutex_unlock(m1);
-+ if (m1 != m2)
-+ mutex_unlock(m2);
-+ dput(d1);
-+ dput(d2);
-+}
-+
-+#else
-+static inline void double_down(struct semaphore *s1, struct semaphore *s2)
-+{
-+ if (s1 != s2) {
-+ if ((unsigned long) s1 < (unsigned long) s2) {
-+ struct semaphore *tmp = s2;
-+ s2 = s1; s1 = tmp;
-+ }
-+ down(s1);
-+ }
-+ down(s2);
-+}
-+
-+static inline void double_up(struct semaphore *s1, struct semaphore *s2)
-+{
-+ up(s1);
-+ if (s1 != s2)
-+ up(s2);
-+}
-+
-+static inline void double_lock(struct dentry *d1, struct dentry *d2)
-+{
-+ double_down(&d1->d_inode->i_sem, &d2->d_inode->i_sem);
-+}
-+
-+static inline void double_unlock(struct dentry *d1, struct dentry *d2)
-+{
-+ double_up(&d1->d_inode->i_sem,&d2->d_inode->i_sem);
-+ dput(d1);
-+ dput(d2);
-+}
-+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) */
-+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
-+#endif /* __KERNEL__ */
-+
-+/*
-+ * Definitions for user and kernel code
-+ */
-+
-+/* ioctls */
-+
-+#endif /* not __MINI_FO_H_ */
---- /dev/null
-+++ b/fs/mini_fo/mini_fo-merge
-@@ -0,0 +1,180 @@
-+#!/bin/bash
-+#
-+# Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.de>
-+# 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.
-+#
-+
-+BASE=
-+STO=
-+HELP=
-+DRYRUN=
-+VERBOSE=
-+TMP="/tmp/"
-+META_NAME="META_dAfFgHE39ktF3HD2sr"
-+SKIP_DEL_LIST="skip-delete-list.mini_fo-merge"
-+
-+COMMAND=
-+exec_command()
-+{
-+ if [ x$DRYRUN == "xset" ]; then
-+ echo " would run: $COMMAND"
-+ elif ! [ x$DRYRUN == "xset" ]; then
-+ if [ x$VERBOSE == "xset" ]; then
-+ echo " running: $COMMAND"
-+ fi
-+ eval $COMMAND
-+ fi
-+}
-+
-+usage()
-+{
-+cat <<EOF
-+
-+USAGE: $0 -b <base dir> -s <storage dir>
-+Version 0.1
-+
-+This script merges the contents of a mini_fo storage file system back
-+to the base file system.
-+
-+!!! Warning: This will modify the base filesystem and can destroy data
-+ if used wrongly.
-+
-+Options:
-+ -b <base dir>
-+ the directory of the base file system.
-+
-+ -s <storage dir>
-+ the directory of the storage file system.
-+
-+ -d dry run, will not change anything and print the commands that
-+ would be executed.
-+
-+ -t tmp dir for storing temporary file. default: $TMP
-+
-+ -v show what operations are performed.
-+
-+ -h displays this message.
-+
-+EOF
-+}
-+
-+# parse parameters
-+while getopts hdvt:b:s: OPTS
-+ do
-+ case $OPTS in
-+ h) HELP="set";;
-+ d) DRYRUN="set";;
-+ v) VERBOSE="set";;
-+ b) BASE="$OPTARG";;
-+ s) STO="$OPTARG";;
-+ t) TMP="$OPTARG";;
-+ ?) usage
-+ exit 1;;
-+ esac
-+done
-+
-+if [ "x$HELP" == "xset" ]; then
-+ usage
-+ exit -1
-+fi
-+
-+if ! [ -d "$BASE" ] || ! [ -d "$STO" ]; then
-+ echo -e "$0:\n Error, -s and/or -b argument missing. type $0 -h for help."
-+ exit -1;
-+fi
-+
-+# get full paths
-+pushd $STO; STO=`pwd`; popd
-+pushd $BASE; BASE=`pwd`; popd
-+TMP=${TMP%/}
-+
-+
-+cat<<EOF
-+###############################################################################
-+# mini_fo-merge
-+#
-+# base dir: $BASE
-+# storage dir: $STO
-+# meta filename: $META_NAME
-+# dry run: $DRYRUN
-+# verbose: $VERBOSE
-+# tmp files: $TMP
-+###############################################################################
-+
-+EOF
-+
-+rm $TMP/$SKIP_DEL_LIST
-+
-+# first process all renamed dirs
-+echo "Merging renamed directories..."
-+pushd $STO &> /dev/null
-+find . -name $META_NAME -type f -print0 | xargs -0 -e grep -e '^R ' | tr -s ':R' ' ' | while read ENTRY; do
-+ echo "entry: $ENTRY"
-+ META_FILE=`echo $ENTRY | cut -d ' ' -f 1`
-+ OLD_B_DIR=`echo $ENTRY | cut -d ' ' -f 2 | sed -e 's/\///'`
-+ NEW_NAME=`echo $ENTRY | cut -d ' ' -f 3`
-+ NEW_B_DIR=`echo $META_FILE | sed -e "s/$META_NAME/$NEW_NAME/" | sed -e 's/^\.\///'`
-+ echo "META_FILE: $META_FILE"
-+ echo "OLD_B_DIR: $OLD_B_DIR"
-+ echo "NEW_NAME: $NEW_NAME"
-+ echo "NEW_B_DIR: $NEW_B_DIR"
-+
-+ pushd $BASE &> /dev/null
-+ # remove an existing dir in storage
-+ COMMAND="rm -rf $NEW_B_DIR"; exec_command
-+ COMMAND="cp -R $OLD_B_DIR $NEW_B_DIR"; exec_command
-+ echo ""
-+ popd &> /dev/null
-+
-+ # remember this dir to exclude it from deleting later
-+ echo $NEW_B_DIR >> $TMP/$SKIP_DEL_LIST
-+done
-+
-+# delete all whiteouted files from base
-+echo -e "\nDeleting whiteout'ed files from base file system..."
-+find . -name $META_NAME -type f -print0 | xargs -0 -e grep -e '^D ' | sed -e 's/:D//' | while read ENTRY; do
-+ META_FILE=`echo $ENTRY | cut -d ' ' -f 1`
-+ DEL_NAME=`echo $ENTRY | cut -d ' ' -f 2`
-+ DEL_FILE=`echo $META_FILE | sed -e "s/$META_NAME/$DEL_NAME/" | sed -e 's/^\.\///'`
-+ grep -x $DEL_FILE $TMP/$SKIP_DEL_LIST &> /dev/null
-+ if [ $? -ne 0 ]; then
-+ pushd $BASE &> /dev/null
-+ COMMAND="rm -rf $DEL_FILE"; exec_command
-+ popd &> /dev/null
-+ else
-+ echo " excluding: $DEL_FILE as in skip-del-list."
-+ fi
-+done
-+
-+# create all dirs and update permissions
-+echo -e "\nSetting up directory structures in base file system..."
-+find . -type d | sed -e 's/^\.\///' | while read DIR; do
-+ PERMS=`stat -c %a $DIR`
-+ DIR_UID=`stat -c %u $DIR`
-+ DIR_GID=`stat -c %g $DIR`
-+ pushd $BASE &> /dev/null
-+ if ! [ -d $DIR ]; then
-+ COMMAND="mkdir -p $DIR"; exec_command
-+ fi
-+ COMMAND="chmod $PERMS $DIR"; exec_command
-+ COMMAND="chown $DIR_UID:$DIR_GID $DIR"; exec_command
-+ popd &> /dev/null
-+done
-+
-+# merge all non-directory files
-+echo -e "\nMerging all non-directory files...."
-+for i in b c p f l s; do
-+ find . -type $i | sed -e 's/^\.\///' | grep -v "$META_NAME" | while read FILE; do
-+ pushd $BASE #&> /dev/null
-+ COMMAND="cp -df $STO/$FILE $BASE/$FILE"; exec_command
-+ popd &> /dev/null
-+ done
-+done
-+popd &> /dev/null
-+
-+#rm $TMP/$SKIP_DEL_LIST
-+
-+echo "Done!"
---- /dev/null
-+++ b/fs/mini_fo/mini_fo-overlay
-@@ -0,0 +1,130 @@
-+#!/bin/bash
-+#
-+# Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.de>
-+# 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.
-+#
-+
-+HELP=
-+SUFF=
-+MNTP=
-+MNT_DIR="/mnt"
-+STO=
-+STO_DIR="/tmp"
-+BASE=
-+
-+usage()
-+{
-+cat <<EOF
-+
-+Usage: $0 [-s suffix] [-d sto_dir_dir] [-m mount point] base_dir
-+Version 0.1
-+
-+This script overlays the given base directory using the mini_fo file
-+system. If only the base directory base_dir is given, $0
-+will use a storage directory called "sto-<base_dir_name>" in $STO_DIR,
-+and mount point "mini_fo-<base_dir_dir>" in $MNT_DIR.
-+
-+Options:
-+ -s <suffix>
-+ add given suffix to storage directory and the mount
-+ point. This is usefull for overlaying one base directory
-+ several times and avoiding conflicts with storage directory
-+ names and mount points.
-+
-+ -d <sto_dir_dir>
-+ change the directory in which the storage directory will be
-+ created (default is currently "$STO_DIR".
-+
-+ -m <mount point>
-+ use an alternative directory to create the mini_fo
-+ mountpoint (default is currently "$MNT_DIR".
-+
-+ -h displays this message.
-+
-+EOF
-+exit 1;
-+}
-+
-+while getopts hm:s:d: OPTS
-+ do
-+ case $OPTS in
-+ s) SUFF="$OPTARG";;
-+ d) STO_DIR="$OPTARG";;
-+ m) MNT_DIR="$OPTARG";;
-+ h) HELP="set";;
-+ ?) usage
-+ exit 1;;
-+ esac
-+done
-+shift $(($OPTIND - 1))
-+
-+BASE="$1"
-+
-+if [ "x$HELP" == "xset" ]; then
-+ usage
-+ exit -1
-+fi
-+
-+# fix suffix
-+if [ "x$SUFF" != "x" ]; then
-+ SUFF="-$SUFF"
-+fi
-+
-+# kill trailing slashes
-+MNT_DIR=${MNT_DIR%/}
-+STO_DIR=${STO_DIR%/}
-+BASE=${BASE%/}
-+
-+
-+if ! [ -d "$BASE" ]; then
-+ echo "invalid base dir $BASE, run $0 -h for help."
-+ exit -1
-+fi
-+
-+# check opts
-+if ! [ -d "$MNT_DIR" ]; then
-+ echo "invalid mount dir $MNT_DIR, run $0 -h for help."
-+ exit -1
-+fi
-+
-+if ! [ -d "$STO_DIR" ]; then
-+ echo "invalid sto_dir_dir $STO_DIR, run $0 -h for help."
-+ exit -1
-+fi
-+
-+MNTP="$MNT_DIR/mini_fo-`basename $BASE`$SUFF"
-+STO="$STO_DIR/sto-`basename $BASE`$SUFF"
-+
-+# create the mount point if it doesn't exist
-+mkdir -p $MNTP
-+if [ $? -ne 0 ]; then
-+ echo "Error, failed to create mount point $MNTP"
-+fi
-+
-+mkdir -p $STO
-+if [ $? -ne 0 ]; then
-+ echo "Error, failed to create storage dir $STO"
-+fi
-+
-+# check if fs is already mounted
-+mount | grep mini_fo | grep $MNTP &> /dev/null
-+if [ $? -eq 0 ]; then
-+ echo "Error, existing mini_fo mount at $MNTP."
-+ exit -1
-+fi
-+
-+mount | grep mini_fo | grep $STO &> /dev/null
-+if [ $? -eq 0 ]; then
-+ echo "Error, $STO seems to be used already."
-+ exit -1
-+fi
-+
-+# mount
-+mount -t mini_fo -o base=$BASE,sto=$STO $BASE $MNTP
-+
-+if [ $? -ne 0 ]; then
-+ echo "Error, mounting failed, maybe no permisson to mount?"
-+fi
---- /dev/null
-+++ b/fs/mini_fo/mmap.c
-@@ -0,0 +1,637 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+#ifdef FIST_COUNT_WRITES
-+/* for counting writes in the middle vs. regular writes */
-+unsigned long count_writes = 0, count_writes_middle = 0;
-+#endif /* FIST_COUNT_WRITES */
-+
-+/* forward declaration of commit write and prepare write */
-+STATIC int mini_fo_commit_write(file_t *file, page_t *page, unsigned from, unsigned to);
-+STATIC int mini_fo_prepare_write(file_t *file, page_t *page, unsigned from, unsigned to);
-+
-+
-+/*
-+ * Function for handling creation of holes when lseek-ing past the
-+ * end of the file and then writing some data.
-+ */
-+int
-+mini_fo_fill_zeros(file_t* file, page_t *page, unsigned from)
-+{
-+ int err = 0;
-+ dentry_t *dentry = file->f_dentry;
-+ inode_t *inode = dentry->d_inode;
-+ page_t *tmp_page;
-+ int index;
-+
-+ print_entry_location();
-+
-+ for (index = inode->i_size >> PAGE_CACHE_SHIFT; index < page->index; index++) {
-+ tmp_page = mini_fo_get1page(file, index);
-+ if (IS_ERR(tmp_page)) {
-+ err = PTR_ERR(tmp_page);
-+ goto out;
-+ }
-+
-+ /*
-+ * zero out rest of the contents of the page between the appropriate
-+ * offsets.
-+ */
-+ memset((char*)page_address(tmp_page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, PAGE_CACHE_SIZE - (inode->i_size & ~PAGE_CACHE_MASK));
-+
-+ if (! (err = mini_fo_prepare_write(file, tmp_page, 0, PAGE_CACHE_SIZE)))
-+ err = mini_fo_commit_write(file, tmp_page, 0, PAGE_CACHE_SIZE);
-+
-+ page_cache_release(tmp_page);
-+ if (err < 0)
-+ goto out;
-+ if (current->need_resched)
-+ schedule();
-+ }
-+
-+ /* zero out appropriate parts of last page */
-+
-+ /*
-+ * if the encoding type is block, then adjust the 'from' (where the
-+ * zeroing will start) offset appropriately
-+ */
-+ from = from & (~(FIST_ENCODING_BLOCKSIZE - 1));
-+
-+ if ((from - (inode->i_size & ~PAGE_CACHE_MASK)) > 0) {
-+
-+ memset((char*)page_address(page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, from - (inode->i_size & ~PAGE_CACHE_MASK));
-+ if (! (err = mini_fo_prepare_write(file, page, 0, PAGE_CACHE_SIZE)))
-+ err = mini_fo_commit_write(file, page, 0, PAGE_CACHE_SIZE);
-+
-+ if (err < 0)
-+ goto out;
-+ if (current->need_resched)
-+ schedule();
-+ }
-+
-+ out:
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_writepage(page_t *page)
-+{
-+ int err = -EIO;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ page_t *hidden_page;
-+ char *kaddr, *hidden_kaddr;
-+
-+ print_entry_location();
-+
-+ inode = page->mapping->host;
-+ hidden_inode = itohi(inode);
-+
-+ /*
-+ * writepage is called when shared mmap'ed files need to write
-+ * their pages, while prepare/commit_write are called from the
-+ * non-paged write() interface. (However, in 2.3 the two interfaces
-+ * share the same cache, while in 2.2 they didn't.)
-+ *
-+ * So we pretty much have to duplicate much of what commit_write does.
-+ */
-+
-+ /* find lower page (returns a locked page) */
-+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+ if (!hidden_page)
-+ goto out;
-+
-+ /* get page address, and encode it */
-+ kaddr = (char *) kmap(page);
-+ hidden_kaddr = (char*) kmap(hidden_page);
-+ mini_fo_encode_block(kaddr, hidden_kaddr, PAGE_CACHE_SIZE, inode, inode->i_sb, page->index);
-+ /* if encode_block could fail, then return error */
-+ kunmap(page);
-+ kunmap(hidden_page);
-+
-+ /* call lower writepage (expects locked page) */
-+ err = hidden_inode->i_mapping->a_ops->writepage(hidden_page);
-+
-+ /*
-+ * update mtime and ctime of lower level file system
-+ * mini_fo' mtime and ctime are updated by generic_file_write
-+ */
-+ hidden_inode->i_mtime = hidden_inode->i_ctime = CURRENT_TIME;
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,1)
-+ UnlockPage(hidden_page); /* b/c grab_cache_page locked it */
-+# endif /* kernel older than 2.4.1 */
-+ page_cache_release(hidden_page); /* b/c grab_cache_page increased refcnt */
-+
-+ if (err)
-+ ClearPageUptodate(page);
-+ else
-+ SetPageUptodate(page);
-+ out:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,1)
-+ UnlockPage(page);
-+# endif /* kernel 2.4.1 and newer */
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+/*
-+ * get one page from cache or lower f/s, return error otherwise.
-+ * returns unlocked, up-to-date page (if ok), with increased refcnt.
-+ */
-+page_t *
-+mini_fo_get1page(file_t *file, int index)
-+{
-+ page_t *page;
-+ dentry_t *dentry;
-+ inode_t *inode;
-+ struct address_space *mapping;
-+ int err;
-+
-+ print_entry_location();
-+
-+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+ inode = dentry->d_inode;
-+ mapping = inode->i_mapping;
-+
-+ fist_dprint(8, "%s: read page index %d pid %d\n", __FUNCTION__, index, current->pid);
-+ if (index < 0) {
-+ printk("%s BUG: index=%d\n", __FUNCTION__, index);
-+ page = ERR_PTR(-EIO);
-+ goto out;
-+ }
-+ page = read_cache_page(mapping,
-+ index,
-+ (filler_t *) mapping->a_ops->readpage,
-+ (void *) file);
-+ if (IS_ERR(page))
-+ goto out;
-+ wait_on_page(page);
-+ if (!Page_Uptodate(page)) {
-+ lock_page(page);
-+ err = mapping->a_ops->readpage(file, page);
-+ if (err) {
-+ page = ERR_PTR(err);
-+ goto out;
-+ }
-+ wait_on_page(page);
-+ if (!Page_Uptodate(page)) {
-+ page = ERR_PTR(-EIO);
-+ goto out;
-+ }
-+ }
-+
-+ out:
-+ print_exit_pointer(page);
-+ return page;
-+}
-+
-+
-+/*
-+ * get one page from cache or lower f/s, return error otherwise.
-+ * similar to get1page, but doesn't guarantee that it will return
-+ * an unlocked page.
-+ */
-+page_t *
-+mini_fo_get1page_cached(file_t *file, int index)
-+{
-+ page_t *page;
-+ dentry_t *dentry;
-+ inode_t *inode;
-+ struct address_space *mapping;
-+ int err;
-+
-+ print_entry_location();
-+
-+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+ inode = dentry->d_inode;
-+ mapping = inode->i_mapping;
-+
-+ fist_dprint(8, "%s: read page index %d pid %d\n", __FUNCTION__, index, current->pid);
-+ if (index < 0) {
-+ printk("%s BUG: index=%d\n", __FUNCTION__, index);
-+ page = ERR_PTR(-EIO);
-+ goto out;
-+ }
-+ page = read_cache_page(mapping,
-+ index,
-+ (filler_t *) mapping->a_ops->readpage,
-+ (void *) file);
-+ if (IS_ERR(page))
-+ goto out;
-+
-+ out:
-+ print_exit_pointer(page);
-+ return page;
-+}
-+
-+
-+/*
-+ * readpage is called from generic_page_read and the fault handler.
-+ * If your file system uses generic_page_read for the read op, it
-+ * must implement readpage.
-+ *
-+ * Readpage expects a locked page, and must unlock it.
-+ */
-+STATIC int
-+mini_fo_do_readpage(file_t *file, page_t *page)
-+{
-+ int err = -EIO;
-+ dentry_t *dentry;
-+ file_t *hidden_file = NULL;
-+ dentry_t *hidden_dentry;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ char *page_data;
-+ page_t *hidden_page;
-+ char *hidden_page_data;
-+ int real_size;
-+
-+ print_entry_location();
-+
-+ dentry = file->f_dentry; /* CPW: Moved below print_entry_location */
-+ if (ftopd(file) != NULL)
-+ hidden_file = ftohf(file);
-+ hidden_dentry = dtohd(dentry);
-+ inode = dentry->d_inode;
-+ hidden_inode = itohi(inode);
-+
-+ fist_dprint(7, "%s: requesting page %d from file %s\n", __FUNCTION__, page->index, dentry->d_name.name);
-+
-+ MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages);
-+ MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages);
-+ FOR_EACH_PAGE
-+ CURRENT_HIDDEN_PAGE = NULL;
-+
-+ /* find lower page (returns a locked page) */
-+ FOR_EACH_PAGE {
-+ fist_dprint(8, "%s: Current page index = %d\n", __FUNCTION__, CURRENT_HIDDEN_PAGEINDEX);
-+ CURRENT_HIDDEN_PAGE = read_cache_page(hidden_inode->i_mapping,
-+ CURRENT_HIDDEN_PAGEINDEX,
-+ (filler_t *) hidden_inode->i_mapping->a_ops->readpage,
-+ (void *) hidden_file);
-+ if (IS_ERR(CURRENT_HIDDEN_PAGE)) {
-+ err = PTR_ERR(CURRENT_HIDDEN_PAGE);
-+ CURRENT_HIDDEN_PAGE = NULL;
-+ goto out_release;
-+ }
-+ }
-+
-+ /*
-+ * wait for the page data to show up
-+ * (signaled by readpage as unlocking the page)
-+ */
-+ FOR_EACH_PAGE {
-+ wait_on_page(CURRENT_HIDDEN_PAGE);
-+ if (!Page_Uptodate(CURRENT_HIDDEN_PAGE)) {
-+ /*
-+ * call readpage() again if we returned from wait_on_page with a
-+ * page that's not up-to-date; that can happen when a partial
-+ * page has a few buffers which are ok, but not the whole
-+ * page.
-+ */
-+ lock_page(CURRENT_HIDDEN_PAGE);
-+ err = hidden_inode->i_mapping->a_ops->readpage(hidden_file,
-+ CURRENT_HIDDEN_PAGE);
-+ if (err) {
-+ CURRENT_HIDDEN_PAGE = NULL;
-+ goto out_release;
-+ }
-+ wait_on_page(CURRENT_HIDDEN_PAGE);
-+ if (!Page_Uptodate(CURRENT_HIDDEN_PAGE)) {
-+ err = -EIO;
-+ goto out_release;
-+ }
-+ }
-+ }
-+
-+ /* map pages, get their addresses */
-+ page_data = (char *) kmap(page);
-+ FOR_EACH_PAGE
-+ CURRENT_HIDDEN_PAGEDATA = (char *) kmap(CURRENT_HIDDEN_PAGE);
-+
-+ /* if decode_block could fail, then return error */
-+ err = 0;
-+ real_size = hidden_inode->i_size - (page->index << PAGE_CACHE_SHIFT);
-+ if (real_size <= 0)
-+ memset(page_data, 0, PAGE_CACHE_SIZE);
-+ else if (real_size < PAGE_CACHE_SIZE) {
-+ mini_fo_decode_block(hidden_page_data, page_data, real_size, inode, inode->i_sb, page->index);
-+ memset(page_data + real_size, 0, PAGE_CACHE_SIZE - real_size);
-+ } else
-+ mini_fo_decode_block(hidden_page_data, page_data, PAGE_CACHE_SIZE, inode, inode->i_sb, page->index);
-+
-+ FOR_EACH_PAGE
-+ kunmap(CURRENT_HIDDEN_PAGE);
-+ kunmap(page);
-+
-+ out_release:
-+ FOR_EACH_PAGE
-+ if (CURRENT_HIDDEN_PAGE)
-+ page_cache_release(CURRENT_HIDDEN_PAGE); /* undo read_cache_page */
-+
-+ FREE_PAGE_POINTERS(hidden_pages, num_hidden_pages);
-+ FREE_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages);
-+
-+ out:
-+ if (err == 0)
-+ SetPageUptodate(page);
-+ else
-+ ClearPageUptodate(page);
-+
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_readpage(file_t *file, page_t *page)
-+{
-+ int err;
-+ print_entry_location();
-+
-+ err = mini_fo_do_readpage(file, page);
-+
-+ /*
-+ * we have to unlock our page, b/c we _might_ have gotten a locked page.
-+ * but we no longer have to wakeup on our page here, b/c UnlockPage does
-+ * it
-+ */
-+ UnlockPage(page);
-+
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+STATIC int
-+mini_fo_prepare_write(file_t *file, page_t *page, unsigned from, unsigned to)
-+{
-+ int err = 0;
-+
-+ print_entry_location();
-+
-+ /*
-+ * we call kmap(page) only here, and do the kunmap
-+ * and the actual downcalls, including unlockpage and uncache
-+ * in commit_write.
-+ */
-+ kmap(page);
-+
-+ /* fast path for whole page writes */
-+ if (from == 0 && to == PAGE_CACHE_SIZE)
-+ goto out;
-+ /* read the page to "revalidate" our data */
-+ /* call the helper function which doesn't unlock the page */
-+ if (!Page_Uptodate(page))
-+ err = mini_fo_do_readpage(file, page);
-+
-+ out:
-+ print_exit_status(err);
-+ return err;
-+}
-+
-+
-+
-+STATIC int
-+mini_fo_commit_write(file_t *file, page_t *page, unsigned from, unsigned to)
-+{
-+ int err = -ENOMEM;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ page_t *hidden_page;
-+ file_t *hidden_file = NULL;
-+ loff_t pos;
-+ unsigned bytes = to - from;
-+ unsigned hidden_from, hidden_to, hidden_bytes;
-+
-+ print_entry_location();
-+
-+ inode = page->mapping->host; /* CPW: Moved below print_entry_location */
-+ hidden_inode = itohi(inode);
-+
-+ ASSERT(file != NULL);
-+ /*
-+ * here we have a kmapped page, with data from the user copied
-+ * into it. we need to encode_block it, and then call the lower
-+ * commit_write. We also need to simulate same behavior of
-+ * generic_file_write, and call prepare_write on the lower f/s first.
-+ */
-+#ifdef FIST_COUNT_WRITES
-+ count_writes++;
-+# endif /* FIST_COUNT_WRITES */
-+
-+ /* this is append and/or extend -- we can't have holes so fill them in */
-+ if (page->index > (hidden_inode->i_size >> PAGE_CACHE_SHIFT)) {
-+ page_t *tmp_page;
-+ int index;
-+ for (index = hidden_inode->i_size >> PAGE_CACHE_SHIFT; index < page->index; index++) {
-+ tmp_page = mini_fo_get1page(file, index);
-+ if (IS_ERR(tmp_page)) {
-+ err = PTR_ERR(tmp_page);
-+ goto out;
-+ }
-+ /* zero out the contents of the page at the appropriate offsets */
-+ memset((char*)page_address(tmp_page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, PAGE_CACHE_SIZE - (inode->i_size & ~PAGE_CACHE_MASK));
-+ if (!(err = mini_fo_prepare_write(file, tmp_page, 0, PAGE_CACHE_SIZE)))
-+ err = mini_fo_commit_write(file, tmp_page, 0, PAGE_CACHE_SIZE);
-+ page_cache_release(tmp_page);
-+ if (err < 0)
-+ goto out;
-+ if (current->need_resched)
-+ schedule();
-+ }
-+ }
-+
-+ if (ftopd(file) != NULL)
-+ hidden_file = ftohf(file);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_inode->i_mutex);
-+#else
-+ down(&hidden_inode->i_sem);
-+#endif
-+ /* find lower page (returns a locked page) */
-+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+ if (!hidden_page)
-+ goto out;
-+
-+#if FIST_ENCODING_BLOCKSIZE > 1
-+# error encoding_blocksize greater than 1 is not yet supported
-+# endif /* FIST_ENCODING_BLOCKSIZE > 1 */
-+
-+ hidden_from = from & (~(FIST_ENCODING_BLOCKSIZE - 1));
-+ hidden_to = ((to + FIST_ENCODING_BLOCKSIZE - 1) & (~(FIST_ENCODING_BLOCKSIZE - 1)));
-+ if ((page->index << PAGE_CACHE_SHIFT) + to > hidden_inode->i_size) {
-+
-+ /*
-+ * if this call to commit_write had introduced holes and the code
-+ * for handling holes was invoked, then the beginning of this page
-+ * must be zeroed out
-+ * zero out bytes from 'size_of_file%pagesize' to 'from'.
-+ */
-+ if ((hidden_from - (inode->i_size & ~PAGE_CACHE_MASK)) > 0)
-+ memset((char*)page_address(page) + (inode->i_size & ~PAGE_CACHE_MASK), 0, hidden_from - (inode->i_size & ~PAGE_CACHE_MASK));
-+
-+ }
-+ hidden_bytes = hidden_to - hidden_from;
-+
-+ /* call lower prepare_write */
-+ err = -EINVAL;
-+ if (hidden_inode->i_mapping &&
-+ hidden_inode->i_mapping->a_ops &&
-+ hidden_inode->i_mapping->a_ops->prepare_write)
-+ err = hidden_inode->i_mapping->a_ops->prepare_write(hidden_file,
-+ hidden_page,
-+ hidden_from,
-+ hidden_to);
-+ if (err)
-+ /* don't leave locked pages behind, esp. on an ENOSPC */
-+ goto out_unlock;
-+
-+ fist_dprint(8, "%s: encoding %d bytes\n", __FUNCTION__, hidden_bytes);
-+ mini_fo_encode_block((char *) page_address(page) + hidden_from, (char*) page_address(hidden_page) + hidden_from, hidden_bytes, inode, inode->i_sb, page->index);
-+ /* if encode_block could fail, then goto unlock and return error */
-+
-+ /* call lower commit_write */
-+ err = hidden_inode->i_mapping->a_ops->commit_write(hidden_file,
-+ hidden_page,
-+ hidden_from,
-+ hidden_to);
-+
-+ if (err < 0)
-+ goto out_unlock;
-+
-+ err = bytes; /* convert error to no. of bytes */
-+
-+ inode->i_blocks = hidden_inode->i_blocks;
-+ /* we may have to update i_size */
-+ pos = (page->index << PAGE_CACHE_SHIFT) + to;
-+ if (pos > inode->i_size)
-+ inode->i_size = pos;
-+
-+ /*
-+ * update mtime and ctime of lower level file system
-+ * mini_fo' mtime and ctime are updated by generic_file_write
-+ */
-+ hidden_inode->i_mtime = hidden_inode->i_ctime = CURRENT_TIME;
-+
-+ mark_inode_dirty_sync(inode);
-+
-+ out_unlock:
-+ UnlockPage(hidden_page);
-+ page_cache_release(hidden_page);
-+ kunmap(page); /* kmap was done in prepare_write */
-+ out:
-+ /* we must set our page as up-to-date */
-+ if (err < 0)
-+ ClearPageUptodate(page);
-+ else
-+ SetPageUptodate(page);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_inode->i_mutex);
-+#else
-+ up(&hidden_inode->i_sem);
-+#endif
-+ print_exit_status(err);
-+ return err; /* assume all is ok */
-+}
-+
-+
-+STATIC int
-+mini_fo_bmap(struct address_space *mapping, long block)
-+{
-+ int err = 0;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+
-+ print_entry_location();
-+
-+ inode = (inode_t *) mapping->host;
-+ hidden_inode = itohi(inode);
-+
-+ if (hidden_inode->i_mapping->a_ops->bmap)
-+ err = hidden_inode->i_mapping->a_ops->bmap(hidden_inode->i_mapping, block);
-+ print_exit_location();
-+ return err;
-+}
-+
-+
-+/*
-+ * This function is copied verbatim from mm/filemap.c.
-+ * XXX: It should be simply moved to some header file instead -- bug Al about it!
-+ */
-+static inline int sync_page(struct page *page)
-+{
-+ struct address_space *mapping = page->mapping;
-+
-+ if (mapping && mapping->a_ops && mapping->a_ops->sync_page)
-+ return mapping->a_ops->sync_page(page);
-+ return 0;
-+}
-+
-+
-+/*
-+ * XXX: we may not need this function if not FIST_FILTER_DATA.
-+ * FIXME: for FIST_FILTER_SCA, get all lower pages and sync them each.
-+ */
-+STATIC int
-+mini_fo_sync_page(page_t *page)
-+{
-+ int err = 0;
-+ inode_t *inode;
-+ inode_t *hidden_inode;
-+ page_t *hidden_page;
-+
-+ print_entry_location();
-+
-+ inode = page->mapping->host; /* CPW: Moved below print_entry_location */
-+ hidden_inode = itohi(inode);
-+
-+ /* find lower page (returns a locked page) */
-+ hidden_page = grab_cache_page(hidden_inode->i_mapping, page->index);
-+ if (!hidden_page)
-+ goto out;
-+
-+ err = sync_page(hidden_page);
-+
-+ UnlockPage(hidden_page); /* b/c grab_cache_page locked it */
-+ page_cache_release(hidden_page); /* b/c grab_cache_page increased refcnt */
-+
-+ out:
-+ print_exit_status(err);
-+ return err;
-+}
---- /dev/null
-+++ b/fs/mini_fo/README
-@@ -0,0 +1,163 @@
-+README for the mini_fo overlay file system
-+=========================================
-+
-+
-+WHAT IS MINI_FO?
-+----------------
-+
-+mini_fo is a virtual kernel file system that can make read-only
-+file systems writable. This is done by redirecting modifying operations
-+to a writeable location called "storage directory", and leaving the
-+original data in the "base directory" untouched. When reading, the
-+file system merges the modifed and original data so that only the
-+newest versions will appear. This occurs transparently to the user,
-+who can access the data like on any other read-write file system.
-+
-+Base and storage directories may be located on the same or on
-+different partitions and may be of different file system types. While
-+the storage directory obviously needs to be writable, the base may or
-+may not be writable, what doesn't matter as it will no be modified
-+anyway.
-+
-+
-+WHAT IS GOOD FOR?
-+-----------------
-+
-+The primary purpose of the mini_fo file system is to allow easy
-+software updates to embedded systems, that often store their root
-+file system in a read-only flash file system, but there are many
-+more as for example sandboxing, or for allowing live-cds to
-+permanently store information.
-+
-+
-+BUILDING
-+--------
-+This should be simple. Adjust the Makefile to point to the correct
-+kernel headers you want to build the module for. Then:
-+
-+ # make
-+
-+should build "mini_fo.o" for a 2.4 kernel or "mini_fo.ko" for a 2.6
-+kernel.
-+
-+If you are building the module for you current kernel, you can install
-+the module (as root):
-+
-+ # make install
-+
-+or uninstall with
-+
-+ # make uninstall
-+
-+
-+USING THE FILE SYSTEM
-+--------------------
-+
-+the general mount syntax is:
-+
-+ mount -t mini_fo -o base=<base directory>,sto=<storage directory>\
-+ <base directory> <mount point>
-+
-+Example:
-+
-+You have mounted a cdrom to /mnt/cdrom and want to modifiy some files
-+on it:
-+
-+load the module (as root)
-+
-+ # insmod mini_fo.o for a 2.4 kernel or
-+
-+ # insmod mini_fo.ko for a 2.6 kernel
-+
-+
-+create a storage dir in tmp and a mountpoint for mini_fo:
-+
-+ # mkdir /tmp/sto
-+ # mkdir /mnt/mini_fo
-+
-+and mount the mini_fo file system:
-+
-+ # mount -t mini_fo -o base=/mnt/cdrom,sto=/tmp/sto /mnt/cdrom /mnt/mini_fo
-+
-+
-+Now the data stored on the cd can be accessed via the mini_fo
-+mountpoint just like any read-write file system, files can be modified
-+and deleted, new ones can be created and so on. When done unmount the
-+file system:
-+
-+ # unmount /mnt/mini_fo
-+
-+Note that if the file system is mounted again using the same storage
-+file system, of course it will appear in the modified state again. If
-+you remount it using an new empty storage directory, it will be
-+unmodified. Therefore by executing:
-+
-+ # cd /tmp/sto
-+ # rm -rf *
-+
-+you can nuke all the changes you made to the original file system. But
-+ remember NEVER do this while the mini_fo file system is mounted!
-+
-+
-+Alternatively you can use the mini_fo-overlay bash script, that
-+simplifies managing mini_fo mounts. See TOOLS Section.
-+
-+
-+TOOLS
-+-----
-+
-+mini_fo-merge (experimental):
-+
-+This is a bash script that will merge changes contained in the storage
-+directory back to the base directory. This allows mini_fo to function
-+as a cache file system by overlaying a slow (network, ...) file system
-+and using a fast (ramdisk, ...) as storage. When done, changes can be
-+merged back to the (slow) base with mini_fo-merge. See "mini_fo-merge
-+-h" for details.
-+
-+It can be usefull for merging changes back after a successfull test
-+(patches, software updates...)
-+
-+
-+mini_fo-overlay:
-+
-+This bash script simplifies managing one or more mini_fo mounts. For
-+overlaying a directory called "basedir1", you can just call:
-+
-+ # mini_fo-overlay basedir1
-+
-+This will mount mini_fo with "basedir1" as base, "/tmp/sto-basedir1/"
-+as storage to "/mnt/mini_fo-basedir1/". It has more options though,
-+type "mini_fo-overlay -h" for details.
-+
-+
-+DOCUMENTATION, REPORTING BUGS, GETTING HELP
-+-------------------------------------------
-+
-+Please visit the mini_fo project page at:
-+
-+http://www.denx.de/twiki/bin/view/Know/MiniFOHome
-+
-+
-+WARNINGS
-+--------
-+
-+Never modify the base or the storage directorys while the mini_fo
-+file system is mounted, or you might crash you system. Simply accessing
-+and reading should not cause any trouble.
-+
-+Exporting a mini_fo mount point via NFS has not been tested, and may
-+or may not work.
-+
-+Check the RELEASE_NOTES for details on bugs and features.
-+
-+
-+
-+Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+
-+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.
-+
-+
---- /dev/null
-+++ b/fs/mini_fo/RELEASE_NOTES
-@@ -0,0 +1,111 @@
-+Release: mini_fo-0.6.1 (v0-6-1)
-+Date: 21.09.2005
-+
-+
-+Changes:
-+--------
-+v0-6-1:
-+
-+- bugfixes (see ChangeLog)
-+
-+- two helper scripts "mini_fo_merge" and "mini_fo_overlay" (see
-+ README for details).
-+
-+v0-6-0:
-+
-+- Support for 2.4 and 2.6 (see Makefile)
-+
-+- Partial hard link support (creating works as expected, but already
-+ existing links in the base file system will be treated as if they
-+ were individual files).
-+
-+- Various bugfixes and cleanups.
-+
-+
-+v0-6-0-pre1:
-+
-+- This is mini_fo-0-6-0-pre1! This release is a complete rewrite of
-+ many vital mini_fo parts such as the old whiteout list code which
-+ has been replaced by the new META subsystem.
-+
-+- Light weight directory renaming implemented. This means if a
-+ directory is renamed via the mini_fo filesystem this will no longer
-+ result in a complete copy in storage, instead only one empty
-+ directory will be created. All base filed contained in the original
-+ directory stay there until modified.
-+
-+- Special files (creating, renaming, deleting etc.) now working.
-+
-+- Many bugfixes and cleanup, mini_fo is now a lot more stable.
-+
-+
-+v0-5-10:
-+
-+- Final release of the 0-5-* versions. Next will be a complete rewrite
-+ of many features. This release contains several bugfixes related to
-+ directory renaming.
-+
-+
-+v0-5-10-pre6:
-+
-+- Lots of cleanup and several bugfixes related to directory deleting
-+
-+- Directory renaming suddenly works, what is most likely due to the
-+ fact tha that "mv" is smart: if the classic rename doesn't work it
-+ will assume that source and target file are on different fs and will
-+ copy the directory and try to remove the source directory. Until
-+ directory removing wasn't implemented, it would fail to do this and
-+ rollback.
-+ So, directory renaming works for now, but it doesn't yet do what you
-+ would expect from a overlay fs, so use with care.
-+
-+
-+v0-5-10-pre5:
-+
-+- implemented directory deleting
-+- made parsing of mount options more stable
-+- New format of mount options! (See README)
-+- I can't reproduce the unknown panic with 2.4.25 anymore, so I'll
-+ happily assume it never existed!
-+
-+
-+Implemented features:
-+---------------------
-+
-+- creating hard links (see BUGS on already existing hard links)
-+- lightweight directory renaming
-+- renaming device files, pipes, sockets, etc.
-+- creating, renaming, deleting of special files
-+- deleting directorys
-+- general directory reading (simple "ls" )
-+- creating files in existing directorys
-+- creating directorys
-+- renaming files.
-+- reading and writing files (involves opening)
-+- appending to files (creates copy in storage)
-+- deleting files
-+- llseek works too, what allows editors to work
-+- persistency (a deleted file stay deleted over remounts)
-+- use of symbolic links
-+- creating of device files
-+
-+
-+Not (yet) implemented features:
-+-------------------------------
-+
-+- full hard link support.
-+
-+
-+
-+BUGS:
-+-----
-+
-+Hard links in the base file system will be treated as individual
-+files, not as links to one inode.
-+
-+The main problem with hard links isn't allowing to create them, but
-+their pure existence. If you modify a base hard link, the changes made
-+will only show up on this link, the other link will remain in the
-+original state. I hope to fix this someday. Please note that this does
-+not effect the special hard links '.' and '..', that are handled
-+seperately by the lower fs.
---- /dev/null
-+++ b/fs/mini_fo/state.c
-@@ -0,0 +1,620 @@
-+/*
-+ * Copyright (C) 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif /* HAVE_CONFIG_H */
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+/* create the storage file, setup new states */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+int create_sto_reg_file(dentry_t *dentry, int mode, struct nameidata *nd)
-+#else
-+int create_sto_reg_file(dentry_t *dentry, int mode)
-+#endif
-+{
-+ int err = 0;
-+ inode_t *dir;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ if(exists_in_storage(dentry)) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: wrong type or state.\n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR getting neg. sto dentry.\n");
-+ goto out;
-+ }
-+
-+ dir = dentry->d_parent->d_inode;
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* lock parent */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ mode, nd);
-+#else
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ mode);
-+#endif
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR creating sto file.\n");
-+ goto out_lock;
-+ }
-+
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: ERROR creating sto file [2].\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+
-+ /* interpose the new inode */
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == NON_EXISTANT) {
-+ dtost(dentry) = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == UNMODIFIED) {
-+ dtost(dentry) = MODIFIED;
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: create_sto_file: invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ }
-+ fist_copy_attr_timesizes(dentry->d_parent->d_inode,
-+ hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+/* create the sto dir, setup states */
-+int create_sto_dir(dentry_t *dentry, int mode)
-+{
-+ int err = 0;
-+ inode_t *dir;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ /* had to take the "!S_ISDIR(mode))" check out, because it failed */
-+ if(exists_in_storage(dentry)) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: wrong type or state.\\
-+n");
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ err = get_neg_sto_dentry(dentry);
-+ if(err) {
-+ err = -EINVAL;
-+ goto out;
-+ }
-+
-+ dir = dentry->d_parent->d_inode;
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+ err = vfs_mkdir(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ mode);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR creating sto dir.\n");
-+ goto out_lock;
-+ }
-+
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR creating sto dir [2].\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+
-+ /* interpose the new inode */
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtopd(dentry)->state == NON_EXISTANT) {
-+ dtopd(dentry)->state = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtopd(dentry)->state == UNMODIFIED) {
-+ dtopd(dentry)->state = MODIFIED;
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: create_sto_dir: ERROR, invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ }
-+
-+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ /* initalize the wol list */
-+ itopd(dentry->d_inode)->deleted_list_size = -1;
-+ itopd(dentry->d_inode)->renamed_list_size = -1;
-+ meta_build_lists(dentry);
-+
-+
-+ out_lock:
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+int create_sto_nod(dentry_t *dentry, int mode, dev_t dev)
-+#else
-+int create_sto_nod(dentry_t *dentry, int mode, int dev)
-+#endif
-+{
-+ int err = 0;
-+ inode_t *dir;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ if(exists_in_storage(dentry)) {
-+ err = -EEXIST;
-+ goto out;
-+ }
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: create_sto_nod: ERROR getting neg. sto dentry.\n");
-+ goto out;
-+ }
-+
-+ dir = dentry->d_parent->d_inode;
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* lock parent */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+ err = vfs_mknod(hidden_sto_dir_dentry->d_inode, hidden_sto_dentry, mode, dev);
-+ if(err)
-+ goto out_lock;
-+
-+ if(!dtohd2(dentry)->d_inode) {
-+ printk(KERN_CRIT "mini_fo: create_sto_nod: creating storage inode failed [1].\n");
-+ err = -EINVAL; /* return something indicating failure */
-+ goto out_lock;
-+ }
-+
-+ /* interpose the new inode */
-+ if(dtost(dentry) == DELETED) {
-+ dtost(dentry) = DEL_REWRITTEN;
-+ err = mini_fo_tri_interpose(NULL, hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == NON_EXISTANT) {
-+ dtost(dentry) = CREATED;
-+ err = mini_fo_tri_interpose(dtohd(dentry), hidden_sto_dentry, dentry, dir->i_sb, 0);
-+ if(err)
-+ goto out_lock;
-+ }
-+ else if(dtost(dentry) == UNMODIFIED) {
-+ dtost(dentry) = MODIFIED;
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: create_sto_nod: error, invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+ }
-+
-+ fist_copy_attr_timesizes(dir, hidden_sto_dir_dentry->d_inode);
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+
-+/* unimplemented (and possibly not usefull):
-+
-+ nondir-del_to_del_rew
-+ nondir-non_exist_to_creat
-+
-+ dir-unmod_to_del
-+ dir-mod_to_del
-+ dir-creat_to_del
-+ dir-del_rew_to_del
-+ dir-del_to_del_rew
-+ dir-non_exist_to_creat
-+*/
-+
-+
-+/* bring a file of any type from state UNMODIFIED to MODIFIED */
-+int nondir_unmod_to_mod(dentry_t *dentry, int cp_flag)
-+{
-+ int err = 0;
-+ struct vfsmount *tgt_mnt;
-+ struct vfsmount *src_mnt;
-+ dentry_t *tgt_dentry;
-+ dentry_t *src_dentry;
-+ dentry_t *hidden_sto_dentry;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if((dtost(dentry) != UNMODIFIED) ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if (err) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR getting neg. sto dentry.\n");
-+ goto out;
-+ }
-+
-+ /* create sto file */
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* lock parent */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ err = PTR_ERR(hidden_sto_dir_dentry);
-+ if (IS_ERR(hidden_sto_dir_dentry))
-+ goto out;
-+
-+ /* handle different types of nondirs */
-+ if(S_ISCHR(dentry->d_inode->i_mode) ||
-+ S_ISBLK(dentry->d_inode->i_mode)) {
-+ err = vfs_mknod(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dtohd(dentry)->d_inode->i_mode,
-+ dtohd(dentry)->d_inode->i_rdev);
-+ }
-+
-+ else if(S_ISREG(dentry->d_inode->i_mode)) {
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dtohd(dentry)->d_inode->i_mode, NULL);
-+#else
-+ err = vfs_create(hidden_sto_dir_dentry->d_inode,
-+ hidden_sto_dentry,
-+ dtohd(dentry)->d_inode->i_mode);
-+#endif
-+ }
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR creating sto file.\n");
-+ goto out_lock;
-+ }
-+
-+ /* interpose on new inode */
-+ if(itohi2(dentry->d_inode) != NULL) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR, invalid inode detected.\n");
-+ err = -EINVAL;
-+ goto out_lock;
-+ }
-+
-+ itohi2(dentry->d_inode) = igrab(dtohd2(dentry)->d_inode);
-+
-+ fist_copy_attr_timesizes(dentry->d_parent->d_inode,
-+ hidden_sto_dir_dentry->d_inode);
-+ dtost(dentry) = MODIFIED;
-+
-+ /* copy contents if regular file and cp_flag = 1 */
-+ if((cp_flag == 1) && S_ISREG(dentry->d_inode->i_mode)) {
-+
-+ /* unlock first */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ dput(hidden_sto_dir_dentry);
-+
-+ tgt_dentry = dtohd2(dentry);
-+ tgt_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ src_dentry = dtohd(dentry);
-+ src_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt;
-+
-+ err = mini_fo_cp_cont(tgt_dentry, tgt_mnt,
-+ src_dentry, src_mnt);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_mod: \
-+ ERROR copying contents.\n");
-+ }
-+ goto out;
-+ }
-+
-+ out_lock:
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+ out:
-+ return err;
-+}
-+
-+/* this function is currently identical to nondir_creat_to_del */
-+int nondir_del_rew_to_del(dentry_t *dentry)
-+{
-+ return nondir_creat_to_del(dentry);
-+}
-+
-+int nondir_creat_to_del(dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ inode_t *hidden_sto_dir_inode;
-+ dentry_t *hidden_sto_dir_dentry;
-+ dentry_t *hidden_sto_dentry;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ /* for now this function serves for both state DEL_REWRITTEN and
-+ * CREATED */
-+ if(!(dtost(dentry) == CREATED || (dtost(dentry) == DEL_REWRITTEN)) ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_mod_to_del/del_rew_to_del: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ hidden_sto_dir_inode = itohi2(dentry->d_parent->d_inode);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was: hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry);*/
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* avoid destroying the hidden inode if the file is in use */
-+ dget(hidden_sto_dentry);
-+ err = vfs_unlink(hidden_sto_dir_inode, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+ dtost(dentry) = NON_EXISTANT;
-+
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+int nondir_mod_to_del(dentry_t *dentry)
-+{
-+ int err;
-+ dentry_t *hidden_sto_dentry;
-+ inode_t *hidden_sto_dir_inode;
-+ dentry_t *hidden_sto_dir_dentry;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) != MODIFIED ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_mod_to_del: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ hidden_sto_dir_inode = itohi2(dentry->d_parent->d_inode);
-+ hidden_sto_dentry = dtohd2(dentry);
-+
-+ /* was hidden_sto_dir_dentry = lock_parent(hidden_sto_dentry); */
-+ hidden_sto_dir_dentry = dget(hidden_sto_dentry->d_parent);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ down(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+
-+ /* avoid destroying the hidden inode if the file is in use */
-+ dget(hidden_sto_dentry);
-+ err = vfs_unlink(hidden_sto_dir_inode, hidden_sto_dentry);
-+ dput(hidden_sto_dentry);
-+ if(!err)
-+ d_delete(hidden_sto_dentry);
-+
-+ /* propagate number of hard-links */
-+ dentry->d_inode->i_nlink = itohi2(dentry->d_inode)->i_nlink;
-+
-+ /* dput base dentry, this will relase the inode and free the
-+ * dentry, as we will never need it again. */
-+ dput(dtohd(dentry));
-+ dtohd(dentry) = NULL;
-+ dtost(dentry) = DELETED;
-+
-+ /* add deleted file to META-file */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+
-+ /* was: unlock_dir(hidden_sto_dir_dentry); */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+#else
-+ up(&hidden_sto_dir_dentry->d_inode->i_sem);
-+#endif
-+ dput(hidden_sto_dir_dentry);
-+
-+ out:
-+ return err;
-+}
-+
-+int nondir_unmod_to_del(dentry_t *dentry)
-+{
-+ int err = 0;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) != UNMODIFIED ||
-+ S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: nondir_unmod_to_del: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* next we have to get a negative dentry for the storage file */
-+ err = get_neg_sto_dentry(dentry);
-+
-+ if(err)
-+ goto out;
-+
-+ /* add deleted file to META lists */
-+ err = meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+
-+ if(err)
-+ goto out;
-+
-+ /* dput base dentry, this will relase the inode and free the
-+ * dentry, as we will never need it again. */
-+ dput(dtohd(dentry));
-+ dtohd(dentry) = NULL;
-+ dtost(dentry) = DELETED;
-+
-+ out:
-+ return err;
-+}
-+
-+/* bring a dir from state UNMODIFIED to MODIFIED */
-+int dir_unmod_to_mod(dentry_t *dentry)
-+{
-+ int err;
-+
-+ check_mini_fo_dentry(dentry);
-+
-+ if(dtost(dentry) != UNMODIFIED ||
-+ !S_ISDIR(dentry->d_inode->i_mode)) {
-+ printk(KERN_CRIT "mini_fo: dir_unmod_to_mod: \
-+ wrong type or state.\n");
-+ err = -1;
-+ goto out;
-+ }
-+
-+ /* this creates our dir incl. sto. structure */
-+ err = build_sto_structure(dentry->d_parent, dentry);
-+ if(err) {
-+ printk(KERN_CRIT "mini_fo: dir_unmod_to_mod: \
-+ build_sto_structure failed.\n");
-+ goto out;
-+ }
-+ out:
-+ return err;
-+}
-+
---- /dev/null
-+++ b/fs/mini_fo/super.c
-@@ -0,0 +1,281 @@
-+/*
-+ * Copyright (c) 1997-2003 Erez Zadok
-+ * Copyright (c) 2001-2003 Stony Brook University
-+ *
-+ * For specific licensing information, see the COPYING file distributed with
-+ * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING.
-+ *
-+ * This Copyright notice must be kept intact and distributed with all
-+ * fistgen sources INCLUDING sources generated by fistgen.
-+ */
-+/*
-+ * Copyright (C) 2004, 2005 Markus Klotzbuecher <mk@creamnet.de>
-+ *
-+ * 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.
-+ */
-+
-+/*
-+ * $Id$
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+# include <config.h>
-+#endif
-+
-+#include "fist.h"
-+#include "mini_fo.h"
-+
-+
-+STATIC void
-+mini_fo_read_inode(inode_t *inode)
-+{
-+ static struct address_space_operations mini_fo_empty_aops;
-+
-+ __itopd(inode) = kmalloc(sizeof(struct mini_fo_inode_info), GFP_KERNEL);
-+ if (!itopd(inode)) {
-+ printk("<0>%s:%s:%d: No kernel memory!\n", __FILE__, __FUNCTION__, __LINE__);
-+ ASSERT(NULL);
-+ }
-+ itohi(inode) = NULL;
-+ itohi2(inode) = NULL;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+ inode->i_version++;
-+#else
-+ inode->i_version = ++event; /* increment inode version */
-+#endif
-+ inode->i_op = &mini_fo_main_iops;
-+ inode->i_fop = &mini_fo_main_fops;
-+#if 0
-+ /*
-+ * XXX: To export a file system via NFS, it has to have the
-+ * FS_REQUIRES_DEV flag, so turn it on. But should we inherit it from
-+ * the lower file system, or can we allow our file system to be exported
-+ * even if the lower one cannot be natively exported.
-+ */
-+ inode->i_sb->s_type->fs_flags |= FS_REQUIRES_DEV;
-+ /*
-+ * OK, the above was a hack, which is now turned off because it may
-+ * cause a panic/oops on some systems. The correct way to export a
-+ * "nodev" filesystem is via using nfs-utils > 1.0 and the "fsid=" export
-+ * parameter, which requires 2.4.20 or later.
-+ */
-+#endif
-+ /* I don't think ->a_ops is ever allowed to be NULL */
-+ inode->i_mapping->a_ops = &mini_fo_empty_aops;
-+}
-+
-+
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+/*
-+ * No need to call write_inode() on the lower inode, as it
-+ * will have been marked 'dirty' anyway. But we might need
-+ * to write some of our own stuff to disk.
-+ */
-+STATIC void
-+mini_fo_write_inode(inode_t *inode, int sync)
-+{
-+ print_entry_location();
-+ print_exit_location();
-+}
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+
-+
-+STATIC void
-+mini_fo_put_inode(inode_t *inode)
-+{
-+ /*
-+ * This is really funky stuff:
-+ * Basically, if i_count == 1, iput will then decrement it and this inode will be destroyed.
-+ * It is currently holding a reference to the hidden inode.
-+ * Therefore, it needs to release that reference by calling iput on the hidden inode.
-+ * iput() _will_ do it for us (by calling our clear_inode), but _only_ if i_nlink == 0.
-+ * The problem is, NFS keeps i_nlink == 1 for silly_rename'd files.
-+ * So we must for our i_nlink to 0 here to trick iput() into calling our clear_inode.
-+ */
-+ if (atomic_read(&inode->i_count) == 1)
-+ inode->i_nlink = 0;
-+}
-+
-+
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+/*
-+ * we now define delete_inode, because there are two VFS paths that may
-+ * destroy an inode: one of them calls clear inode before doing everything
-+ * else that's needed, and the other is fine. This way we truncate the inode
-+ * size (and its pages) and then clear our own inode, which will do an iput
-+ * on our and the lower inode.
-+ */
-+STATIC void
-+mini_fo_delete_inode(inode_t *inode)
-+{
-+ print_entry_location();
-+
-+ fist_checkinode(inode, "mini_fo_delete_inode IN");
-+ inode->i_size = 0; /* every f/s seems to do that */
-+ clear_inode(inode);
-+
-+ print_exit_location();
-+}
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+
-+
-+/* final actions when unmounting a file system */
-+STATIC void
-+mini_fo_put_super(super_block_t *sb)
-+{
-+ if (stopd(sb)) {
-+ mntput(stopd(sb)->hidden_mnt);
-+ mntput(stopd(sb)->hidden_mnt2);
-+
-+ /* mk: no! dput(stopd(sb)->base_dir_dentry);
-+ dput(stopd(sb)->storage_dir_dentry); */
-+
-+ kfree(stopd(sb));
-+ __stopd(sb) = NULL;
-+ }
-+}
-+
-+
-+#ifdef NOT_NEEDED
-+/*
-+ * This is called in do_umount before put_super.
-+ * The superblock lock is not held yet.
-+ * We probably do not need to define this or call write_super
-+ * on the hidden_sb, because sync_supers() will get to hidden_sb
-+ * sooner or later. But it is also called from file_fsync()...
-+ */
-+STATIC void
-+mini_fo_write_super(super_block_t *sb)
-+{
-+ return;
-+}
-+#endif /* NOT_NEEDED */
-+
-+
-+STATIC int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_statfs(struct dentry *d, struct kstatfs *buf)
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+mini_fo_statfs(super_block_t *sb, struct kstatfs *buf)
-+#else
-+mini_fo_statfs(super_block_t *sb, struct statfs *buf)
-+#endif
-+{
-+ int err = 0;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+ struct dentry *hidden_d;
-+
-+ hidden_d = dtohd(d);
-+ err = vfs_statfs(hidden_d, buf);
-+#else
-+ super_block_t *hidden_sb;
-+
-+ hidden_sb = stohs(sb);
-+ err = vfs_statfs(hidden_sb, buf);
-+#endif
-+
-+ return err;
-+}
-+
-+
-+/*
-+ * XXX: not implemented. This is not allowed yet.
-+ * Should we call this on the hidden_sb? Probably not.
-+ */
-+STATIC int
-+mini_fo_remount_fs(super_block_t *sb, int *flags, char *data)
-+{
-+ //printk(KERN_CRIT "mini_fo_remount_fs: WARNING, this function is umimplemented.\n");
-+ return -ENOSYS;
-+}
-+
-+
-+/*
-+ * Called by iput() when the inode reference count reached zero
-+ * and the inode is not hashed anywhere. Used to clear anything
-+ * that needs to be, before the inode is completely destroyed and put
-+ * on the inode free list.
-+ */
-+STATIC void
-+mini_fo_clear_inode(inode_t *inode)
-+{
-+ /*
-+ * Decrement a reference to a hidden_inode, which was incremented
-+ * by our read_inode when it was created initially.
-+ */
-+
-+ /* release the wol_list */
-+ if(S_ISDIR(inode->i_mode)) {
-+ __meta_put_lists(inode);
-+ }
-+
-+ /* mk: fan out fun */
-+ if(itohi(inode))
-+ iput(itohi(inode));
-+ if(itohi2(inode))
-+ iput(itohi2(inode));
-+
-+ // XXX: why this assertion fails?
-+ // because it doesn't like us
-+ // ASSERT((inode->i_state & I_DIRTY) == 0);
-+ kfree(itopd(inode));
-+ __itopd(inode) = NULL;
-+}
-+
-+
-+/*
-+ * Called in do_umount() if the MNT_FORCE flag was used and this
-+ * function is defined. See comment in linux/fs/super.c:do_umount().
-+ * Used only in nfs, to kill any pending RPC tasks, so that subsequent
-+ * code can actually succeed and won't leave tasks that need handling.
-+ *
-+ * PS. I wonder if this is somehow useful to undo damage that was
-+ * left in the kernel after a user level file server (such as amd)
-+ * dies.
-+ */
-+STATIC void
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+mini_fo_umount_begin(struct vfsmount *mnt, int flags)
-+{
-+ struct vfsmount *hidden_mnt;
-+
-+ hidden_mnt = stopd(mnt->mnt_sb)->hidden_mnt;
-+
-+ if (hidden_mnt->mnt_sb->s_op->umount_begin)
-+ hidden_mnt->mnt_sb->s_op->umount_begin(hidden_mnt, flags);
-+
-+}
-+#else
-+mini_fo_umount_begin(super_block_t *sb)
-+{
-+ super_block_t *hidden_sb;
-+
-+ hidden_sb = stohs(sb);
-+
-+ if (hidden_sb->s_op->umount_begin)
-+ hidden_sb->s_op->umount_begin(hidden_sb);
-+
-+}
-+#endif
-+
-+
-+struct super_operations mini_fo_sops =
-+{
-+ read_inode: mini_fo_read_inode,
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+ write_inode: mini_fo_write_inode,
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+ put_inode: mini_fo_put_inode,
-+#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-+ delete_inode: mini_fo_delete_inode,
-+#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+ put_super: mini_fo_put_super,
-+ statfs: mini_fo_statfs,
-+ remount_fs: mini_fo_remount_fs,
-+ clear_inode: mini_fo_clear_inode,
-+ umount_begin: mini_fo_umount_begin,
-+};
---- /dev/null
-+++ b/fs/mini_fo/Kconfig
-@@ -0,0 +1,3 @@
-+config MINI_FO
-+ tristate "Mini fanout overlay filesystem"
-+
+++ /dev/null
---- a/fs/mini_fo/main.c
-+++ b/fs/mini_fo/main.c
-@@ -79,6 +79,7 @@ mini_fo_tri_interpose(dentry_t *hidden_d
- * of the new inode's fields
- */
-
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
- /*
- * original: inode = iget(sb, hidden_inode->i_ino);
- */
-@@ -87,6 +88,13 @@ mini_fo_tri_interpose(dentry_t *hidden_d
- err = -EACCES; /* should be impossible??? */
- goto out;
- }
-+#else
-+ inode = mini_fo_iget(sb, iunique(sb, 25));
-+ if (IS_ERR(inode)) {
-+ err = PTR_ERR(inode);
-+ goto out;
-+ }
-+#endif
-
- /*
- * interpose the inode if not already interposed
-@@ -184,9 +192,9 @@ mini_fo_parse_options(super_block_t *sb,
- hidden_root = ERR_PTR(err);
- goto out;
- }
-- hidden_root = nd.dentry;
-- stopd(sb)->base_dir_dentry = nd.dentry;
-- stopd(sb)->hidden_mnt = nd.mnt;
-+ hidden_root = nd_get_dentry(&nd);
-+ stopd(sb)->base_dir_dentry = nd_get_dentry(&nd);
-+ stopd(sb)->hidden_mnt = nd_get_mnt(&nd);
-
- } else if(!strncmp("sto=", options, 4)) {
- /* parse the storage dir */
-@@ -204,9 +212,9 @@ mini_fo_parse_options(super_block_t *sb,
- hidden_root2 = ERR_PTR(err);
- goto out;
- }
-- hidden_root2 = nd2.dentry;
-- stopd(sb)->storage_dir_dentry = nd2.dentry;
-- stopd(sb)->hidden_mnt2 = nd2.mnt;
-+ hidden_root2 = nd_get_dentry(&nd2);
-+ stopd(sb)->storage_dir_dentry = nd_get_dentry(&nd2);
-+ stopd(sb)->hidden_mnt2 = nd_get_mnt(&nd2);
- stohs2(sb) = hidden_root2->d_sb;
-
- /* validate storage dir, this is done in
---- a/fs/mini_fo/mini_fo.h
-+++ b/fs/mini_fo/mini_fo.h
-@@ -302,6 +302,10 @@ extern int mini_fo_tri_interpose(dentry_
- extern int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
- dentry_t *src_dentry, struct vfsmount *src_mnt);
-
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+extern struct inode *mini_fo_iget(struct super_block *sb, unsigned long ino);
-+#endif
-+
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
- extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd);
-
-@@ -501,6 +505,29 @@ static inline void double_unlock(struct
- #endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
- #endif /* __KERNEL__ */
-
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+static inline dentry_t *nd_get_dentry(struct nameidata *nd)
-+{
-+ return (nd->path.dentry);
-+}
-+
-+static inline struct vfsmount *nd_get_mnt(struct nameidata *nd)
-+{
-+ return (nd->path.mnt);
-+}
-+#else
-+static inline dentry_t *nd_get_dentry(struct nameidata *nd)
-+{
-+ return (nd->dentry);
-+}
-+
-+static inline struct vfsmount *nd_get_mnt(struct nameidata *nd)
-+{
-+ return (nd->mnt);
-+}
-+#endif
-+
- /*
- * Definitions for user and kernel code
- */
---- a/fs/mini_fo/super.c
-+++ b/fs/mini_fo/super.c
-@@ -262,10 +262,31 @@ mini_fo_umount_begin(super_block_t *sb)
- }
- #endif
-
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-+struct inode *
-+mini_fo_iget(struct super_block *sb, unsigned long ino)
-+{
-+ struct inode *inode;
-+
-+ inode = iget_locked(sb, ino);
-+ if (!inode)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (!(inode->i_state & I_NEW))
-+ return inode;
-+
-+ mini_fo_read_inode(inode);
-+
-+ unlock_new_inode(inode);
-+ return inode;
-+}
-+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25) */
-
- struct super_operations mini_fo_sops =
- {
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
- read_inode: mini_fo_read_inode,
-+#endif
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
- write_inode: mini_fo_write_inode,
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
---- a/fs/mini_fo/aux.c
-+++ b/fs/mini_fo/aux.c
-@@ -164,11 +164,11 @@ dentry_t *bpath_walk(super_block_t *sb,
- err = vfs_path_lookup(mnt->mnt_root, mnt, bpath+1, 0, &nd);
-
- /* validate */
-- if (err || !nd.dentry || !nd.dentry->d_inode) {
-+ if (err || !nd_get_dentry(&nd) || !nd_get_dentry(&nd)->d_inode) {
- printk(KERN_CRIT "mini_fo: bpath_walk: path_walk failed.\n");
- return NULL;
- }
-- return nd.dentry;
-+ return nd_get_dentry(&nd);
- }
-
-
+++ /dev/null
---- a/fs/mini_fo/meta.c
-+++ b/fs/mini_fo/meta.c
-@@ -442,6 +442,11 @@ int meta_write_d_entry(dentry_t *dentry,
- S_IRUSR | S_IWUSR);
- #endif
- }
-+
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
-@@ -535,6 +540,11 @@ int meta_write_r_entry(dentry_t *dentry,
- meta_dentry, S_IRUSR | S_IWUSR);
- #endif
- }
-+
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
-@@ -671,14 +681,16 @@ int meta_sync_d_list(dentry_t *dentry, i
- }
- }
-
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
- ERROR opening meta file.\n");
-- /* we don't mntget so we dont't mntput (for now)
-- * mntput(meta_mnt);
-- */
-+ mntput(meta_mnt);
- dput(meta_dentry);
- err = -1;
- goto out;
-@@ -811,14 +823,16 @@ int meta_sync_r_list(dentry_t *dentry, i
- }
- }
-
-+ /* $%& err, is this correct? */
-+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
-+ mntget(meta_mnt);
-+
- /* open META-file for writing */
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
- ERROR opening meta file.\n");
-- /* we don't mntget so we dont't mntput (for now)
-- * mntput(meta_mnt);
-- */
-+ mntput(meta_mnt);
- dput(meta_dentry);
- err = -1;
- goto out;
+++ /dev/null
---- a/fs/mini_fo/super.c
-+++ b/fs/mini_fo/super.c
-@@ -84,6 +84,7 @@ mini_fo_write_inode(inode_t *inode, int
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-
-
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
- STATIC void
- mini_fo_put_inode(inode_t *inode)
- {
-@@ -99,6 +100,7 @@ mini_fo_put_inode(inode_t *inode)
- if (atomic_read(&inode->i_count) == 1)
- inode->i_nlink = 0;
- }
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) */
-
-
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
-@@ -238,7 +240,7 @@ mini_fo_clear_inode(inode_t *inode)
- * dies.
- */
- STATIC void
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
- mini_fo_umount_begin(struct vfsmount *mnt, int flags)
- {
- struct vfsmount *hidden_mnt;
-@@ -290,7 +292,9 @@ struct super_operations mini_fo_sops =
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
- write_inode: mini_fo_write_inode,
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
- put_inode: mini_fo_put_inode,
-+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) */
- #if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
- delete_inode: mini_fo_delete_inode,
- #endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
+++ /dev/null
---- a/fs/mini_fo/inode.c
-+++ b/fs/mini_fo/inode.c
-@@ -439,7 +439,7 @@ mini_fo_symlink(inode_t *dir, dentry_t *
- int err=0;
- dentry_t *hidden_sto_dentry;
- dentry_t *hidden_sto_dir_dentry;
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
- umode_t mode;
- #endif
-
-@@ -466,7 +466,7 @@ mini_fo_symlink(inode_t *dir, dentry_t *
- down(&hidden_sto_dir_dentry->d_inode->i_sem);
- #endif
-
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
- mode = S_IALLUGO;
- err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
- hidden_sto_dentry, symname, mode);
-@@ -1128,7 +1128,7 @@ void mini_fo_put_link(struct dentry *den
- #endif
-
- STATIC int
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
- mini_fo_permission(inode_t *inode, int mask, struct nameidata *nd)
- #else
- mini_fo_permission(inode_t *inode, int mask)
-@@ -1150,8 +1150,9 @@ mini_fo_permission(inode_t *inode, int m
- * if (err)
- * goto out;
- */
--
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
-+ err = inode_permission(hidden_inode, mask);
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
- err = permission(hidden_inode, mask, nd);
- #else
- err = permission(hidden_inode, mask);
+++ /dev/null
---- a/fs/mini_fo/aux.c
-+++ b/fs/mini_fo/aux.c
-@@ -236,7 +236,7 @@ int mini_fo_cp_cont(dentry_t *tgt_dentry
- mntget(src_mnt);
-
- /* open file write only */
-- tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1);
-+ tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1, current_cred());
- if(!tgt_file || IS_ERR(tgt_file)) {
- printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening target file.\n");
- err = PTR_ERR(tgt_file);
-@@ -244,7 +244,7 @@ int mini_fo_cp_cont(dentry_t *tgt_dentry
- }
-
- /* open file read only */
-- src_file = dentry_open(src_dentry, src_mnt, 0x0);
-+ src_file = dentry_open(src_dentry, src_mnt, 0x0, current_cred());
- if(!src_file || IS_ERR(src_file)) {
- printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening source file.\n");
- err = PTR_ERR(src_file);
---- a/fs/mini_fo/file.c
-+++ b/fs/mini_fo/file.c
-@@ -437,7 +437,7 @@ mini_fo_open(inode_t *inode, file_t *fil
- mntget(stopd(inode->i_sb)->hidden_mnt);
- hidden_file = dentry_open(hidden_dentry,
- stopd(inode->i_sb)->hidden_mnt,
-- hidden_flags);
-+ hidden_flags, file->f_cred);
- if (IS_ERR(hidden_file)) {
- err = PTR_ERR(hidden_file);
- dput(hidden_dentry);
-@@ -479,7 +479,7 @@ mini_fo_open(inode_t *inode, file_t *fil
- mntget(stopd(inode->i_sb)->hidden_mnt);
- hidden_file = dentry_open(hidden_dentry,
- stopd(inode->i_sb)->hidden_mnt,
-- hidden_flags);
-+ hidden_flags, file->f_cred);
- if (IS_ERR(hidden_file)) {
- err = PTR_ERR(hidden_file);
- dput(hidden_dentry);
-@@ -512,7 +512,7 @@ mini_fo_open(inode_t *inode, file_t *fil
- mntget(stopd(inode->i_sb)->hidden_mnt2);
- hidden_sto_file = dentry_open(hidden_sto_dentry,
- stopd(inode->i_sb)->hidden_mnt2,
-- hidden_flags);
-+ hidden_flags, file->f_cred);
-
- /* dentry_open dputs the dentry if it fails */
- if (IS_ERR(hidden_sto_file)) {
---- a/fs/mini_fo/meta.c
-+++ b/fs/mini_fo/meta.c
-@@ -56,7 +56,7 @@ int meta_build_lists(dentry_t *dentry)
-
-
- /* open META-file for reading */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x0);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x0, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_build_lists: \
- ERROR opening META file.\n");
-@@ -448,7 +448,7 @@ int meta_write_d_entry(dentry_t *dentry,
- mntget(meta_mnt);
-
- /* open META-file for writing */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
- ERROR opening meta file.\n");
-@@ -546,7 +546,7 @@ int meta_write_r_entry(dentry_t *dentry,
- mntget(meta_mnt);
-
- /* open META-file for writing */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
- ERROR opening meta file.\n");
-@@ -686,7 +686,7 @@ int meta_sync_d_list(dentry_t *dentry, i
- mntget(meta_mnt);
-
- /* open META-file for writing */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
- ERROR opening meta file.\n");
-@@ -828,7 +828,7 @@ int meta_sync_r_list(dentry_t *dentry, i
- mntget(meta_mnt);
-
- /* open META-file for writing */
-- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
-+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
- if(!meta_file || IS_ERR(meta_file)) {
- printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
- ERROR opening meta file.\n");
+++ /dev/null
---- a/fs/mini_fo/aux.c
-+++ b/fs/mini_fo/aux.c
-@@ -86,8 +86,10 @@ int get_neg_sto_dentry(dentry_t *dentry)
- len = dentry->d_name.len;
- name = dentry->d_name.name;
-
-+ mutex_lock(&dtohd2(dentry->d_parent)->d_inode->i_mutex);
- dtohd2(dentry) =
- lookup_one_len(name, dtohd2(dentry->d_parent), len);
-+ mutex_unlock(&dtohd2(dentry->d_parent)->d_inode->i_mutex);
-
- out:
- return err;
-@@ -426,7 +428,9 @@ int build_sto_structure(dentry_t *dir, d
- const unsigned char *name;
- len = dtohd(dentry)->d_name.len;
- name = dtohd(dentry)->d_name.name;
-+ mutex_lock(&dtohd2(dir)->d_inode->i_mutex);
- hidden_sto_dentry = lookup_one_len(name, dtohd2(dir), len);
-+ mutex_unlock(&dtohd2(dir)->d_inode->i_mutex);
- dtohd2(dentry) = hidden_sto_dentry;
- }
-
---- a/fs/mini_fo/inode.c
-+++ b/fs/mini_fo/inode.c
-@@ -113,17 +113,23 @@ mini_fo_lookup(inode_t *dir, dentry_t *d
- hidden_dir_dentry = hidden_dentry->d_parent;
- kfree(bpath);
- }
-- else if(hidden_dir_dentry && hidden_dir_dentry->d_inode)
-+ else if(hidden_dir_dentry && hidden_dir_dentry->d_inode) {
-+ mutex_lock(&hidden_dir_dentry->d_inode->i_mutex);
- hidden_dentry =
- lookup_one_len(name, hidden_dir_dentry, namelen);
-- else
-+ mutex_unlock(&hidden_dir_dentry->d_inode->i_mutex);
-+ } else {
- hidden_dentry = NULL;
-+ }
-
-- if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
-+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode) {
-+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
- hidden_sto_dentry =
- lookup_one_len(name, hidden_sto_dir_dentry, namelen);
-- else
-+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
-+ } else {
- hidden_sto_dentry = NULL;
-+ }
-
- /* catch error in lookup */
- if (IS_ERR(hidden_dentry) || IS_ERR(hidden_sto_dentry)) {
-@@ -553,9 +559,11 @@ mini_fo_rmdir(inode_t *dir, dentry_t *de
- #endif
-
- /* Delete an old WOL file contained in the storage dir */
-+ mutex_lock(&hidden_sto_dentry->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- hidden_sto_dentry,
- strlen(META_FILENAME));
-+ mutex_unlock(&hidden_sto_dentry->d_inode->i_mutex);
- if(meta_dentry->d_inode) {
- err = vfs_unlink(hidden_sto_dentry->d_inode, meta_dentry);
- dput(meta_dentry);
-@@ -643,9 +651,11 @@ mini_fo_rmdir(inode_t *dir, dentry_t *de
- #endif
-
- /* Delete an old WOL file contained in the storage dir */
-+ mutex_lock(&hidden_sto_dentry->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- hidden_sto_dentry,
- strlen(META_FILENAME));
-+ mutex_unlock(&hidden_sto_dentry->d_inode->i_mutex);
- if(meta_dentry->d_inode) {
- /* is this necessary? dget(meta_dentry); */
- err = vfs_unlink(hidden_sto_dentry->d_inode,
-@@ -688,9 +698,11 @@ mini_fo_rmdir(inode_t *dir, dentry_t *de
- #endif
-
- /* Delete an old WOL file contained in the storage dir */
-+ mutex_lock(&hidden_sto_dentry->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- hidden_sto_dentry,
- strlen(META_FILENAME));
-+ mutex_unlock(&hidden_sto_dentry->d_inode->i_mutex);
- if(meta_dentry->d_inode) {
- /* is this necessary? dget(meta_dentry); */
- err = vfs_unlink(hidden_sto_dentry->d_inode,
---- a/fs/mini_fo/meta.c
-+++ b/fs/mini_fo/meta.c
-@@ -43,9 +43,11 @@ int meta_build_lists(dentry_t *dentry)
-
- /* might there be a META-file? */
- if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry),
- strlen(META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
- if(!meta_dentry->d_inode) {
- dput(meta_dentry);
- goto out_ok;
-@@ -426,8 +428,11 @@ int meta_write_d_entry(dentry_t *dentry,
- goto out;
- }
- }
-+
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry), strlen (META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
-
- /* We need to create a META-file */
- if(!meta_dentry->d_inode) {
-@@ -527,9 +532,13 @@ int meta_write_r_entry(dentry_t *dentry,
- goto out;
- }
- }
-+
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry),
- strlen (META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
-+
- if(!meta_dentry->d_inode) {
- /* We need to create a META-file */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-@@ -641,9 +650,13 @@ int meta_sync_d_list(dentry_t *dentry, i
- goto out;
- }
- }
-+
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry),
- strlen(META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
-+
- if(!meta_dentry->d_inode) {
- /* We need to create a META-file */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-@@ -784,9 +797,13 @@ int meta_sync_r_list(dentry_t *dentry, i
- goto out;
- }
- }
-+
-+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
- meta_dentry = lookup_one_len(META_FILENAME,
- dtohd2(dentry),
- strlen(META_FILENAME));
-+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
-+
- if(!meta_dentry->d_inode) {
- /* We need to create a META-file */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+++ /dev/null
---- a/fs/mini_fo/state.c
-+++ b/fs/mini_fo/state.c
-@@ -537,17 +537,17 @@ int nondir_mod_to_del(dentry_t *dentry)
- dtohd(dentry) = NULL;
- dtost(dentry) = DELETED;
-
-- /* add deleted file to META-file */
-- meta_add_d_entry(dentry->d_parent,
-- dentry->d_name.name,
-- dentry->d_name.len);
--
- /* was: unlock_dir(hidden_sto_dir_dentry); */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
- mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
- #else
- up(&hidden_sto_dir_dentry->d_inode->i_sem);
- #endif
-+ /* add deleted file to META-file */
-+ meta_add_d_entry(dentry->d_parent,
-+ dentry->d_name.name,
-+ dentry->d_name.len);
-+
- dput(hidden_sto_dir_dentry);
-
- out:
+++ /dev/null
---- a/lib/kobject_uevent.c
-+++ b/lib/kobject_uevent.c
-@@ -29,7 +29,8 @@ u64 uevent_seqnum;
- char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH;
- static DEFINE_SPINLOCK(sequence_lock);
- #if defined(CONFIG_NET)
--static struct sock *uevent_sock;
-+struct sock *uevent_sock = NULL;
-+EXPORT_SYMBOL_GPL(uevent_sock);
- #endif
-
- /* the strings here must match the enum in include/linux/kobject.h */
-@@ -42,6 +43,18 @@ static const char *kobject_actions[] = {
- [KOBJ_OFFLINE] = "offline",
- };
-
-+u64 uevent_next_seqnum(void)
-+{
-+ u64 seq;
-+
-+ spin_lock(&sequence_lock);
-+ seq = ++uevent_seqnum;
-+ spin_unlock(&sequence_lock);
-+
-+ return seq;
-+}
-+EXPORT_SYMBOL_GPL(uevent_next_seqnum);
-+
- /**
- * kobject_action_type - translate action string to numeric type
- *
-@@ -201,9 +214,7 @@ int kobject_uevent_env(struct kobject *k
- kobj->state_remove_uevent_sent = 1;
-
- /* we will send an event, so request a new sequence number */
-- spin_lock(&sequence_lock);
-- seq = ++uevent_seqnum;
-- spin_unlock(&sequence_lock);
-+ seq = uevent_next_seqnum();
- retval = add_uevent_var(env, "SEQNUM=%llu", (unsigned long long)seq);
- if (retval)
- goto exit;
+++ /dev/null
---- a/sound/core/Kconfig
-+++ b/sound/core/Kconfig
-@@ -8,7 +8,7 @@ config SND_PCM
- select GCD
-
- config SND_HWDEP
-- tristate
-+ tristate "Sound hardware support"
-
- config SND_RAWMIDI
- tristate
+++ /dev/null
---- a/fs/binfmt_elf.c
-+++ b/fs/binfmt_elf.c
-@@ -1165,7 +1165,7 @@ static unsigned long vma_dump_size(struc
- if (FILTER(ELF_HEADERS) &&
- vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
- u32 __user *header = (u32 __user *) vma->vm_start;
-- u32 word;
-+ u32 word = 0;
- mm_segment_t fs = get_fs();
- /*
- * Doing it this way gets the constant folded by GCC.
+++ /dev/null
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -21,6 +21,8 @@
- #include <linux/root_dev.h>
- #include <linux/magic.h>
-
-+#define MTD_ERASE_PARTIAL 0x8000 /* partition only covers parts of an erase block */
-+
- /* Our partition linked list */
- static LIST_HEAD(mtd_partitions);
-
-@@ -226,13 +228,60 @@ static int part_erase(struct mtd_info *m
- return -EROFS;
- if (instr->addr >= mtd->size)
- return -EINVAL;
-+
-+ instr->partial_start = false;
-+ if (mtd->flags & MTD_ERASE_PARTIAL) {
-+ size_t readlen = 0;
-+ u64 mtd_ofs;
-+
-+ instr->erase_buf = kmalloc(part->master->erasesize, GFP_ATOMIC);
-+ if (!instr->erase_buf)
-+ return -ENOMEM;
-+
-+ mtd_ofs = part->offset + instr->addr;
-+ instr->erase_buf_ofs = do_div(mtd_ofs, part->master->erasesize);
-+
-+ if (instr->erase_buf_ofs > 0) {
-+ instr->addr -= instr->erase_buf_ofs;
-+ ret = part->master->read(part->master,
-+ instr->addr + part->offset,
-+ part->master->erasesize,
-+ &readlen, instr->erase_buf);
-+
-+ instr->partial_start = true;
-+ } else {
-+ mtd_ofs = part->offset + part->mtd.size;
-+ instr->erase_buf_ofs = part->master->erasesize -
-+ do_div(mtd_ofs, part->master->erasesize);
-+
-+ if (instr->erase_buf_ofs > 0) {
-+ instr->len += instr->erase_buf_ofs;
-+ ret = part->master->read(part->master,
-+ part->offset + instr->addr +
-+ instr->len - part->master->erasesize,
-+ part->master->erasesize, &readlen,
-+ instr->erase_buf);
-+ } else {
-+ ret = 0;
-+ }
-+ }
-+ if (ret < 0) {
-+ kfree(instr->erase_buf);
-+ return ret;
-+ }
-+
-+ }
-+
- instr->addr += part->offset;
- ret = part->master->erase(part->master, instr);
- if (ret) {
- if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
- instr->fail_addr -= part->offset;
- instr->addr -= part->offset;
-+ if (mtd->flags & MTD_ERASE_PARTIAL)
-+ kfree(instr->erase_buf);
- }
-+
- return ret;
- }
-
-@@ -240,7 +289,25 @@ void mtd_erase_callback(struct erase_inf
- {
- if (instr->mtd->erase == part_erase) {
- struct mtd_part *part = PART(instr->mtd);
-+ size_t wrlen = 0;
-
-+ if (instr->mtd->flags & MTD_ERASE_PARTIAL) {
-+ if (instr->partial_start) {
-+ part->master->write(part->master,
-+ instr->addr, instr->erase_buf_ofs,
-+ &wrlen, instr->erase_buf);
-+ instr->addr += instr->erase_buf_ofs;
-+ } else {
-+ instr->len -= instr->erase_buf_ofs;
-+ part->master->write(part->master,
-+ instr->addr + instr->len,
-+ instr->erase_buf_ofs, &wrlen,
-+ instr->erase_buf +
-+ part->master->erasesize -
-+ instr->erase_buf_ofs);
-+ }
-+ kfree(instr->erase_buf);
-+ }
- if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
- instr->fail_addr -= part->offset;
- instr->addr -= part->offset;
-@@ -473,18 +540,24 @@ static struct mtd_part *add_one_partitio
- if ((slave->mtd.flags & MTD_WRITEABLE) &&
- mtd_mod_by_eb(slave->offset, &slave->mtd)) {
- /* Doesn't start on a boundary of major erase size */
-- /* FIXME: Let it be writable if it is on a boundary of
-- * _minor_ erase size though */
-- slave->mtd.flags &= ~MTD_WRITEABLE;
-- printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n",
-- part->name);
-+ slave->mtd.flags |= MTD_ERASE_PARTIAL;
-+ if (((u32) slave->mtd.size) > master->erasesize)
-+ slave->mtd.flags &= ~MTD_WRITEABLE;
-+ else
-+ slave->mtd.erasesize = slave->mtd.size;
- }
- if ((slave->mtd.flags & MTD_WRITEABLE) &&
-- mtd_mod_by_eb(slave->mtd.size, &slave->mtd)) {
-- slave->mtd.flags &= ~MTD_WRITEABLE;
-- printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n",
-- part->name);
-- }
-+ mtd_mod_by_eb(slave->offset + slave->mtd.size, &slave->mtd)) {
-+ slave->mtd.flags |= MTD_ERASE_PARTIAL;
-+
-+ if ((u32) slave->mtd.size > master->erasesize)
-+ slave->mtd.flags &= ~MTD_WRITEABLE;
-+ else
-+ slave->mtd.erasesize = slave->mtd.size;
-+ }
-+ if ((slave->mtd.flags & (MTD_ERASE_PARTIAL|MTD_WRITEABLE)) == MTD_ERASE_PARTIAL)
-+ printk(KERN_WARNING"mtd: partition \"%s\" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only\n",
-+ part->name);
-
- slave->mtd.ecclayout = master->ecclayout;
- if (master->block_isbad) {
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -46,6 +46,10 @@ struct erase_info {
- u_long priv;
- u_char state;
- struct erase_info *next;
-+
-+ u8 *erase_buf;
-+ u32 erase_buf_ofs;
-+ bool partial_start;
- };
-
- struct mtd_erase_region_info {
+++ /dev/null
-This patch allows the user to specify desired packet types (outgoing,
-broadcast, unicast, etc.) on packet sockets via setsockopt.
-This can reduce the load in situations where only a limited number
-of packet types are necessary
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-
---- a/include/linux/if_packet.h
-+++ b/include/linux/if_packet.h
-@@ -29,6 +29,8 @@
- /* These ones are invisible by user level */
- #define PACKET_LOOPBACK 5 /* MC/BRD frame looped back */
- #define PACKET_FASTROUTE 6 /* Fastrouted frame */
-+#define PACKET_MASK_ANY 0xffffffff /* mask for packet type bits */
-+
-
- /* Packet socket options */
-
-@@ -47,6 +49,8 @@
- #define PACKET_TX_RING 13
- #define PACKET_LOSS 14
- #define PACKET_VNET_HDR 15
-+#define PACKET_RECV_TYPE 16
-+
-
- struct tpacket_stats {
- unsigned int tp_packets;
---- a/net/packet/af_packet.c
-+++ b/net/packet/af_packet.c
-@@ -201,6 +201,7 @@
- unsigned int tp_reserve;
- unsigned int tp_loss:1;
- struct packet_type prot_hook ____cacheline_aligned_in_smp;
-+ __u8 pkt_type:3;
- };
-
- struct packet_skb_cb {
-@@ -335,6 +336,7 @@
- {
- struct sock *sk;
- struct sockaddr_pkt *spkt;
-+ struct packet_sock *po;
-
- /*
- * When we registered the protocol we saved the socket in the data
-@@ -342,6 +344,7 @@
- */
-
- sk = pt->af_packet_priv;
-+ po = pkt_sk(sk);
-
- /*
- * Yank back the headers [hope the device set this
-@@ -354,7 +357,7 @@
- * so that this procedure is noop.
- */
-
-- if (skb->pkt_type == PACKET_LOOPBACK)
-+ if (!(po->pkt_type & (1 << skb->pkt_type)))
- goto out;
-
- if (!net_eq(dev_net(dev), sock_net(sk)))
-@@ -530,12 +533,12 @@
- int skb_len = skb->len;
- unsigned int snaplen, res;
-
-- if (skb->pkt_type == PACKET_LOOPBACK)
-- goto drop;
--
- sk = pt->af_packet_priv;
- po = pkt_sk(sk);
-
-+ if (!(po->pkt_type & (1 << skb->pkt_type)))
-+ goto drop;
-+
- if (!net_eq(dev_net(dev), sock_net(sk)))
- goto drop;
-
-@@ -650,12 +653,12 @@
- struct timeval tv;
- struct timespec ts;
-
-- if (skb->pkt_type == PACKET_LOOPBACK)
-- goto drop;
--
- sk = pt->af_packet_priv;
- po = pkt_sk(sk);
-
-+ if (!(po->pkt_type & (1 << skb->pkt_type)))
-+ goto drop;
-+
- if (!net_eq(dev_net(dev), sock_net(sk)))
- goto drop;
-
-@@ -1463,6 +1466,7 @@
- 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);
-
- if (sock->type == SOCK_PACKET)
- po->prot_hook.func = packet_rcv_spkt;
-@@ -1963,6 +1967,16 @@
- po->has_vnet_hdr = !!val;
- return 0;
- }
-+ case PACKET_RECV_TYPE:
-+ {
-+ unsigned int val;
-+ if (optlen != sizeof(val))
-+ return -EINVAL;
-+ if (copy_from_user(&val, optval, sizeof(val)))
-+ return -EFAULT;
-+ po->pkt_type = val & ~PACKET_LOOPBACK;
-+ return 0;
-+ }
- default:
- return -ENOPROTOOPT;
- }
-@@ -2020,6 +2034,13 @@
-
- data = &val;
- break;
-+ case PACKET_RECV_TYPE:
-+ if (len > sizeof(unsigned int))
-+ len = sizeof(unsigned int);
-+ val = po->pkt_type;
-+
-+ data = &val;
-+ break;
- case PACKET_VERSION:
- if (len > sizeof(int))
- len = sizeof(int);
+++ /dev/null
---- a/drivers/net/pppoe.c
-+++ b/drivers/net/pppoe.c
-@@ -862,7 +862,7 @@ static int pppoe_sendmsg(struct kiocb *i
- goto end;
-
-
-- skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32,
-+ skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32 + NET_SKB_PAD,
- 0, GFP_KERNEL);
- if (!skb) {
- error = -ENOMEM;
-@@ -870,7 +870,7 @@ static int pppoe_sendmsg(struct kiocb *i
- }
-
- /* Reserve space for headers. */
-- skb_reserve(skb, dev->hard_header_len);
-+ skb_reserve(skb, dev->hard_header_len + NET_SKB_PAD);
- skb_reset_network_header(skb);
-
- skb->dev = dev;
+++ /dev/null
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -96,6 +96,10 @@ config CRYPTO_MANAGER2
- select CRYPTO_BLKCIPHER2
- select CRYPTO_PCOMP
-
-+config CRYPTO_MANAGER_NO_TESTS
-+ bool "Disable internal testsuite to save space"
-+ depends on CRYPTO_MANAGER
-+
- config CRYPTO_GF128MUL
- tristate "GF(2^128) multiplication functions (EXPERIMENTAL)"
- depends on EXPERIMENTAL
---- a/crypto/testmgr.c
-+++ b/crypto/testmgr.c
-@@ -47,6 +47,8 @@
- #define ENCRYPT 1
- #define DECRYPT 0
-
-+#ifndef CONFIG_CRYPTO_MANAGER_NO_TESTS
-+
- struct tcrypt_result {
- struct completion completion;
- int err;
-@@ -2359,8 +2361,11 @@ static int alg_find_test(const char *alg
- return -1;
- }
-
-+#endif /* CONFIG_CRYPTO_MANAGER_NO_TESTS */
-+
- int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
- {
-+#ifndef CONFIG_CRYPTO_MANAGER_NO_TESTS
- int i;
- int j;
- int rc;
-@@ -2415,5 +2420,8 @@ notest:
- return 0;
- non_fips_alg:
- return -EINVAL;
-+#else /* CONFIG_CRYPTO_MANAGER_NO_TESTS */
-+ return 0;
-+#endif /* CONFIG_CRYPTO_MANAGER_NO_TESTS */
- }
- EXPORT_SYMBOL_GPL(alg_test);
---- a/crypto/testmgr.h
-+++ b/crypto/testmgr.h
-@@ -20,6 +20,8 @@
-
- #include <crypto/compress.h>
-
-+#ifndef CONFIG_CRYPTO_MANAGER_NO_TESTS
-+
- #define MAX_DIGEST_SIZE 64
- #define MAX_TAP 8
-
-@@ -9552,4 +9554,6 @@ static struct hash_testvec crc32c_tv_tem
- },
- };
-
-+#endif /* CONFIG_CRYPTO_MANAGER_NO_TESTS */
-+
- #endif /* _CRYPTO_TESTMGR_H */
+++ /dev/null
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -337,4 +337,8 @@ config LEDS_TRIGGER_DEFAULT_ON
- comment "iptables trigger is under Netfilter config (LED target)"
- depends on LEDS_TRIGGERS
-
-+config LEDS_TRIGGER_MORSE
-+ tristate "LED Morse Trigger"
-+ depends on LEDS_TRIGGERS
-+
- endif # NEW_LEDS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -44,3 +44,4 @@ obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) +=
- obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) += ledtrig-backlight.o
- obj-$(CONFIG_LEDS_TRIGGER_GPIO) += ledtrig-gpio.o
- obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o
-+obj-$(CONFIG_LEDS_TRIGGER_MORSE) += ledtrig-morse.o
+++ /dev/null
---- a/drivers/leds/Kconfig
-+++ b/drivers/leds/Kconfig
-@@ -341,4 +341,11 @@ config LEDS_TRIGGER_MORSE
- tristate "LED Morse Trigger"
- depends on LEDS_TRIGGERS
-
-+config LEDS_TRIGGER_NETDEV
-+ tristate "LED Netdev Trigger"
-+ depends on LEDS_TRIGGERS
-+ help
-+ This allows LEDs to be controlled by network device activity.
-+ If unsure, say Y.
-+
- endif # NEW_LEDS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -45,3 +45,4 @@ obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) +=
- obj-$(CONFIG_LEDS_TRIGGER_GPIO) += ledtrig-gpio.o
- obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o
- obj-$(CONFIG_LEDS_TRIGGER_MORSE) += ledtrig-morse.o
-+obj-$(CONFIG_LEDS_TRIGGER_NETDEV) += ledtrig-netdev.o
+++ /dev/null
---- a/drivers/input/misc/Kconfig
-+++ b/drivers/input/misc/Kconfig
-@@ -319,4 +319,20 @@ config INPUT_PCAP
- To compile this driver as a module, choose M here: the
- module will be called pcap_keys.
-
-+config INPUT_GPIO_BUTTONS
-+ tristate "Polled GPIO buttons interface"
-+ depends on GENERIC_GPIO
-+ select INPUT_POLLDEV
-+ help
-+ This driver implements support for buttons connected
-+ to GPIO pins of various CPUs (and some other chips).
-+
-+ Say Y here if your device has buttons connected
-+ directly to such GPIO pins. Your board-specific
-+ setup logic must also provide a platform device,
-+ with configuration data saying which GPIOs are used.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called gpio-buttons.
-+
- endif
---- a/drivers/input/misc/Makefile
-+++ b/drivers/input/misc/Makefile
-@@ -30,4 +30,5 @@ obj-$(CONFIG_INPUT_WINBOND_CIR) += winb
- obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o
- obj-$(CONFIG_INPUT_WM831X_ON) += wm831x-on.o
- obj-$(CONFIG_INPUT_YEALINK) += yealink.o
-+obj-$(CONFIG_INPUT_GPIO_BUTTONS) += gpio_buttons.o
-
+++ /dev/null
---- a/drivers/char/Kconfig
-+++ b/drivers/char/Kconfig
-@@ -1016,6 +1016,14 @@ config CS5535_GPIO
-
- If compiled as a module, it will be called cs5535_gpio.
-
-+config GPIO_DEVICE
-+ tristate "GPIO device support"
-+ depends on GENERIC_GPIO
-+ help
-+ Say Y to enable Linux GPIO device support. This allows control of
-+ GPIO pins using a character device
-+
-+
- config RAW_DRIVER
- tristate "RAW driver (/dev/raw/rawN)"
- depends on BLOCK
---- a/drivers/char/Makefile
-+++ b/drivers/char/Makefile
-@@ -95,6 +95,7 @@ obj-$(CONFIG_SCx200_GPIO) += scx200_gpio
- obj-$(CONFIG_PC8736x_GPIO) += pc8736x_gpio.o
- obj-$(CONFIG_NSC_GPIO) += nsc_gpio.o
- obj-$(CONFIG_CS5535_GPIO) += cs5535_gpio.o
-+obj-$(CONFIG_GPIO_DEVICE) += gpio_dev.o
- obj-$(CONFIG_GPIO_TB0219) += tb0219.o
- obj-$(CONFIG_TELCLOCK) += tlclk.o
-
+++ /dev/null
---- a/include/scsi/scsi.h
-+++ b/include/scsi/scsi.h
-@@ -149,10 +149,10 @@ struct scsi_cmnd;
-
- /* defined in T10 SCSI Primary Commands-2 (SPC2) */
- struct scsi_varlen_cdb_hdr {
-- u8 opcode; /* opcode always == VARIABLE_LENGTH_CMD */
-- u8 control;
-- u8 misc[5];
-- u8 additional_cdb_length; /* total cdb length - 8 */
-+ __u8 opcode; /* opcode always == VARIABLE_LENGTH_CMD */
-+ __u8 control;
-+ __u8 misc[5];
-+ __u8 additional_cdb_length; /* total cdb length - 8 */
- __be16 service_action;
- /* service specific data follows */
- };
+++ /dev/null
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -44,6 +44,7 @@ source "fs/gfs2/Kconfig"
- source "fs/ocfs2/Kconfig"
- source "fs/btrfs/Kconfig"
- source "fs/nilfs2/Kconfig"
-+source "fs/yaffs2/Kconfig"
-
- endif # BLOCK
-
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -127,3 +127,5 @@
- obj-$(CONFIG_GFS2_FS) += gfs2/
- obj-$(CONFIG_EXOFS_FS) += exofs/
- obj-$(CONFIG_CEPH_FS) += ceph/
-+obj-$(CONFIG_YAFFS_FS) += yaffs2/
-+
+++ /dev/null
---- a/fs/yaffs2/devextras.h
-+++ b/fs/yaffs2/devextras.h
-@@ -14,194 +14,135 @@
- */
-
- /*
-- * This file is just holds extra declarations used during development.
-- * Most of these are from kernel includes placed here so we can use them in
-- * applications.
-+ * This file is just holds extra declarations of macros that would normally
-+ * be providesd in the Linux kernel. These macros have been written from
-+ * scratch but are functionally equivalent to the Linux ones.
- *
- */
-
- #ifndef __EXTRAS_H__
- #define __EXTRAS_H__
-
--#if defined WIN32
--#define __inline__ __inline
--#define new newHack
--#endif
--
--#if !(defined __KERNEL__) || (defined WIN32)
-
--/* User space defines */
-+#if !(defined __KERNEL__)
-
-+/* Definition of types */
- typedef unsigned char __u8;
- typedef unsigned short __u16;
- typedef unsigned __u32;
-
-+#endif
-+
- /*
-- * Simple doubly linked list implementation.
-- *
-- * Some of the internal functions ("__xxx") are useful when
-- * manipulating whole lists rather than single entries, as
-- * sometimes we already know the next/prev entries and we can
-- * generate better code by using them directly rather than
-- * using the generic single-entry routines.
-+ * This is a simple doubly linked list implementation that matches the
-+ * way the Linux kernel doubly linked list implementation works.
- */
-
--#define prefetch(x) 1
--
--struct list_head {
-- struct list_head *next, *prev;
-+struct ylist_head {
-+ struct ylist_head *next; /* next in chain */
-+ struct ylist_head *prev; /* previous in chain */
- };
-
--#define LIST_HEAD_INIT(name) { &(name), &(name) }
-
--#define LIST_HEAD(name) \
-- struct list_head name = LIST_HEAD_INIT(name)
-+/* Initialise a static list */
-+#define YLIST_HEAD(name) \
-+struct ylist_head name = { &(name), &(name)}
-+
-
--#define INIT_LIST_HEAD(ptr) do { \
-- (ptr)->next = (ptr); (ptr)->prev = (ptr); \
-+
-+/* Initialise a list head to an empty list */
-+#define YINIT_LIST_HEAD(p) \
-+do { \
-+ (p)->next = (p);\
-+ (p)->prev = (p); \
- } while (0)
-
--/*
-- * Insert a new entry between two known consecutive entries.
-- *
-- * This is only for internal list manipulation where we know
-- * the prev/next entries already!
-- */
--static __inline__ void __list_add(struct list_head *new,
-- struct list_head *prev,
-- struct list_head *next)
--{
-- next->prev = new;
-- new->next = next;
-- new->prev = prev;
-- prev->next = new;
--}
-
--/**
-- * list_add - add a new entry
-- * @new: new entry to be added
-- * @head: list head to add it after
-- *
-- * Insert a new entry after the specified head.
-- * This is good for implementing stacks.
-- */
--static __inline__ void list_add(struct list_head *new, struct list_head *head)
-+/* Add an element to a list */
-+static __inline__ void ylist_add(struct ylist_head *newEntry,
-+ struct ylist_head *list)
- {
-- __list_add(new, head, head->next);
--}
-+ struct ylist_head *listNext = list->next;
-+
-+ list->next = newEntry;
-+ newEntry->prev = list;
-+ newEntry->next = listNext;
-+ listNext->prev = newEntry;
-
--/**
-- * list_add_tail - add a new entry
-- * @new: new entry to be added
-- * @head: list head to add it before
-- *
-- * Insert a new entry before the specified head.
-- * This is useful for implementing queues.
-- */
--static __inline__ void list_add_tail(struct list_head *new,
-- struct list_head *head)
--{
-- __list_add(new, head->prev, head);
- }
-
--/*
-- * Delete a list entry by making the prev/next entries
-- * point to each other.
-- *
-- * This is only for internal list manipulation where we know
-- * the prev/next entries already!
-- */
--static __inline__ void __list_del(struct list_head *prev,
-- struct list_head *next)
-+static __inline__ void ylist_add_tail(struct ylist_head *newEntry,
-+ struct ylist_head *list)
- {
-- next->prev = prev;
-- prev->next = next;
-+ struct ylist_head *listPrev = list->prev;
-+
-+ list->prev = newEntry;
-+ newEntry->next = list;
-+ newEntry->prev = listPrev;
-+ listPrev->next = newEntry;
-+
- }
-
--/**
-- * list_del - deletes entry from list.
-- * @entry: the element to delete from the list.
-- * Note: list_empty on entry does not return true after this, the entry is
-- * in an undefined state.
-- */
--static __inline__ void list_del(struct list_head *entry)
-+
-+/* Take an element out of its current list, with or without
-+ * reinitialising the links.of the entry*/
-+static __inline__ void ylist_del(struct ylist_head *entry)
- {
-- __list_del(entry->prev, entry->next);
-+ struct ylist_head *listNext = entry->next;
-+ struct ylist_head *listPrev = entry->prev;
-+
-+ listNext->prev = listPrev;
-+ listPrev->next = listNext;
-+
- }
-
--/**
-- * list_del_init - deletes entry from list and reinitialize it.
-- * @entry: the element to delete from the list.
-- */
--static __inline__ void list_del_init(struct list_head *entry)
-+static __inline__ void ylist_del_init(struct ylist_head *entry)
- {
-- __list_del(entry->prev, entry->next);
-- INIT_LIST_HEAD(entry);
-+ ylist_del(entry);
-+ entry->next = entry->prev = entry;
- }
-
--/**
-- * list_empty - tests whether a list is empty
-- * @head: the list to test.
-- */
--static __inline__ int list_empty(struct list_head *head)
-+
-+/* Test if the list is empty */
-+static __inline__ int ylist_empty(struct ylist_head *entry)
- {
-- return head->next == head;
-+ return (entry->next == entry);
- }
-
--/**
-- * list_splice - join two lists
-- * @list: the new list to add.
-- * @head: the place to add it in the first list.
-+
-+/* ylist_entry takes a pointer to a list entry and offsets it to that
-+ * we can find a pointer to the object it is embedded in.
- */
--static __inline__ void list_splice(struct list_head *list,
-- struct list_head *head)
--{
-- struct list_head *first = list->next;
-
-- if (first != list) {
-- struct list_head *last = list->prev;
-- struct list_head *at = head->next;
--
-- first->prev = head;
-- head->next = first;
--
-- last->next = at;
-- at->prev = last;
-- }
--}
-
--/**
-- * list_entry - get the struct for this entry
-- * @ptr: the &struct list_head pointer.
-- * @type: the type of the struct this is embedded in.
-- * @member: the name of the list_struct within the struct.
-- */
--#define list_entry(ptr, type, member) \
-- ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
--
--/**
-- * list_for_each - iterate over a list
-- * @pos: the &struct list_head to use as a loop counter.
-- * @head: the head for your list.
-- */
--#define list_for_each(pos, head) \
-- for (pos = (head)->next, prefetch(pos->next); pos != (head); \
-- pos = pos->next, prefetch(pos->next))
--
--/**
-- * list_for_each_safe - iterate over a list safe against removal
-- * of list entry
-- * @pos: the &struct list_head to use as a loop counter.
-- * @n: another &struct list_head to use as temporary storage
-- * @head: the head for your list.
-- */
--#define list_for_each_safe(pos, n, head) \
-- for (pos = (head)->next, n = pos->next; pos != (head); \
-- pos = n, n = pos->next)
-+#define ylist_entry(entry, type, member) \
-+ ((type *)((char *)(entry)-(unsigned long)(&((type *)NULL)->member)))
-
--/*
-- * File types
-+
-+/* ylist_for_each and list_for_each_safe iterate over lists.
-+ * ylist_for_each_safe uses temporary storage to make the list delete safe
- */
-+
-+#define ylist_for_each(itervar, list) \
-+ for (itervar = (list)->next; itervar != (list); itervar = itervar->next)
-+
-+#define ylist_for_each_safe(itervar, saveVar, list) \
-+ for (itervar = (list)->next, saveVar = (list)->next->next; \
-+ itervar != (list); itervar = saveVar, saveVar = saveVar->next)
-+
-+
-+#if !(defined __KERNEL__)
-+
-+
-+#ifndef WIN32
-+#include <sys/stat.h>
-+#endif
-+
-+
-+#ifdef CONFIG_YAFFS_PROVIDE_DEFS
-+/* File types */
-+
-+
- #define DT_UNKNOWN 0
- #define DT_FIFO 1
- #define DT_CHR 2
-@@ -212,6 +153,7 @@ static __inline__ void list_splice(struc
- #define DT_SOCK 12
- #define DT_WHT 14
-
-+
- #ifndef WIN32
- #include <sys/stat.h>
- #endif
-@@ -227,10 +169,6 @@ static __inline__ void list_splice(struc
- #define ATTR_ATIME 16
- #define ATTR_MTIME 32
- #define ATTR_CTIME 64
--#define ATTR_ATIME_SET 128
--#define ATTR_MTIME_SET 256
--#define ATTR_FORCE 512 /* Not a change, but a change it */
--#define ATTR_ATTR_FLAG 1024
-
- struct iattr {
- unsigned int ia_valid;
-@@ -244,21 +182,15 @@ struct iattr {
- unsigned int ia_attr_flags;
- };
-
--#define KERN_DEBUG
-+#endif
-
- #else
-
--#ifndef WIN32
- #include <linux/types.h>
--#include <linux/list.h>
- #include <linux/fs.h>
- #include <linux/stat.h>
--#endif
-
- #endif
-
--#if defined WIN32
--#undef new
--#endif
-
- #endif
---- a/fs/yaffs2/Kconfig
-+++ b/fs/yaffs2/Kconfig
-@@ -5,7 +5,7 @@
- config YAFFS_FS
- tristate "YAFFS2 file system support"
- default n
-- depends on MTD
-+ depends on MTD_BLOCK
- select YAFFS_YAFFS1
- select YAFFS_YAFFS2
- help
-@@ -43,7 +43,8 @@ config YAFFS_9BYTE_TAGS
- format that you need to continue to support. New data written
- also uses the older-style format. Note: Use of this option
- generally requires that MTD's oob layout be adjusted to use the
-- older-style format. See notes on tags formats and MTD versions.
-+ older-style format. See notes on tags formats and MTD versions
-+ in yaffs_mtdif1.c.
-
- If unsure, say N.
-
-@@ -109,26 +110,6 @@ config YAFFS_DISABLE_LAZY_LOAD
-
- If unsure, say N.
-
--config YAFFS_CHECKPOINT_RESERVED_BLOCKS
-- int "Reserved blocks for checkpointing"
-- depends on YAFFS_YAFFS2
-- default 10
-- help
-- Give the number of Blocks to reserve for checkpointing.
-- Checkpointing saves the state at unmount so that mounting is
-- much faster as a scan of all the flash to regenerate this state
-- is not needed. These Blocks are reserved per partition, so if
-- you have very small partitions the default (10) may be a mess
-- for you. You can set this value to 0, but that does not mean
-- checkpointing is disabled at all. There only won't be any
-- specially reserved blocks for checkpointing, so if there is
-- enough free space on the filesystem, it will be used for
-- checkpointing.
--
-- If unsure, leave at default (10), but don't wonder if there are
-- always 2MB used on your large page device partition (10 x 2k
-- pagesize). When using small partitions or when being very small
-- on space, you probably want to set this to zero.
-
- config YAFFS_DISABLE_WIDE_TNODES
- bool "Turn off wide tnodes"
---- a/fs/yaffs2/Makefile
-+++ b/fs/yaffs2/Makefile
-@@ -5,7 +5,6 @@
- obj-$(CONFIG_YAFFS_FS) += yaffs.o
-
- yaffs-y := yaffs_ecc.o yaffs_fs.o yaffs_guts.o yaffs_checkptrw.o
--yaffs-y += yaffs_packedtags2.o yaffs_nand.o yaffs_qsort.o
-+yaffs-y += yaffs_packedtags1.o yaffs_packedtags2.o yaffs_nand.o yaffs_qsort.o
- yaffs-y += yaffs_tagscompat.o yaffs_tagsvalidity.o
--yaffs-y += yaffs_mtdif1.o yaffs_packedtags1.o
--yaffs-y += yaffs_mtdif.o yaffs_mtdif2.o
-+yaffs-y += yaffs_mtdif.o yaffs_mtdif1.o yaffs_mtdif2.o
---- a/fs/yaffs2/moduleconfig.h
-+++ b/fs/yaffs2/moduleconfig.h
-@@ -27,12 +27,12 @@
-
- /* Default: Not selected */
- /* Meaning: Yaffs does its own ECC, rather than using MTD ECC */
--//#define CONFIG_YAFFS_DOES_ECC
-+/* #define CONFIG_YAFFS_DOES_ECC */
-
- /* Default: Not selected */
- /* Meaning: ECC byte order is 'wrong'. Only meaningful if */
- /* CONFIG_YAFFS_DOES_ECC is set */
--//#define CONFIG_YAFFS_ECC_WRONG_ORDER
-+/* #define CONFIG_YAFFS_ECC_WRONG_ORDER */
-
- /* Default: Selected */
- /* Meaning: Disables testing whether chunks are erased before writing to them*/
-@@ -54,11 +54,11 @@ that you need to continue to support. N
- older-style format.
- Note: Use of this option generally requires that MTD's oob layout be
- adjusted to use the older-style format. See notes on tags formats and
--MTD versions.
-+MTD versions in yaffs_mtdif1.c.
- */
- /* Default: Not selected */
- /* Meaning: Use older-style on-NAND data format with pageStatus byte */
--#define CONFIG_YAFFS_9BYTE_TAGS
-+/* #define CONFIG_YAFFS_9BYTE_TAGS */
-
- #endif /* YAFFS_OUT_OF_TREE */
-
---- a/fs/yaffs2/yaffs_checkptrw.c
-+++ b/fs/yaffs2/yaffs_checkptrw.c
-@@ -12,48 +12,43 @@
- */
-
- const char *yaffs_checkptrw_c_version =
-- "$Id: yaffs_checkptrw.c,v 1.14 2007-05-15 20:07:40 charles Exp $";
-+ "$Id: yaffs_checkptrw.c,v 1.18 2009-03-06 17:20:49 wookey Exp $";
-
-
- #include "yaffs_checkptrw.h"
--
-+#include "yaffs_getblockinfo.h"
-
- static int yaffs_CheckpointSpaceOk(yaffs_Device *dev)
- {
--
- int blocksAvailable = dev->nErasedBlocks - dev->nReservedBlocks;
-
- T(YAFFS_TRACE_CHECKPOINT,
- (TSTR("checkpt blocks available = %d" TENDSTR),
- blocksAvailable));
-
--
- return (blocksAvailable <= 0) ? 0 : 1;
- }
-
-
- static int yaffs_CheckpointErase(yaffs_Device *dev)
- {
--
- int i;
-
--
-- if(!dev->eraseBlockInNAND)
-+ if (!dev->eraseBlockInNAND)
- return 0;
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("checking blocks %d to %d"TENDSTR),
-- dev->internalStartBlock,dev->internalEndBlock));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checking blocks %d to %d"TENDSTR),
-+ dev->internalStartBlock, dev->internalEndBlock));
-
-- for(i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) {
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i);
-- if(bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("erasing checkpt block %d"TENDSTR),i));
-- if(dev->eraseBlockInNAND(dev,i- dev->blockOffset /* realign */)){
-+ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) {
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i);
-+ if (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("erasing checkpt block %d"TENDSTR), i));
-+ if (dev->eraseBlockInNAND(dev, i - dev->blockOffset /* realign */)) {
- bi->blockState = YAFFS_BLOCK_STATE_EMPTY;
- dev->nErasedBlocks++;
- dev->nFreeChunks += dev->nChunksPerBlock;
-- }
-- else {
-- dev->markNANDBlockBad(dev,i);
-+ } else {
-+ dev->markNANDBlockBad(dev, i);
- bi->blockState = YAFFS_BLOCK_STATE_DEAD;
- }
- }
-@@ -71,23 +66,23 @@ static void yaffs_CheckpointFindNextEras
- int blocksAvailable = dev->nErasedBlocks - dev->nReservedBlocks;
- T(YAFFS_TRACE_CHECKPOINT,
- (TSTR("allocating checkpt block: erased %d reserved %d avail %d next %d "TENDSTR),
-- dev->nErasedBlocks,dev->nReservedBlocks,blocksAvailable,dev->checkpointNextBlock));
-+ dev->nErasedBlocks, dev->nReservedBlocks, blocksAvailable, dev->checkpointNextBlock));
-
-- if(dev->checkpointNextBlock >= 0 &&
-- dev->checkpointNextBlock <= dev->internalEndBlock &&
-- blocksAvailable > 0){
--
-- for(i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++){
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i);
-- if(bi->blockState == YAFFS_BLOCK_STATE_EMPTY){
-+ if (dev->checkpointNextBlock >= 0 &&
-+ dev->checkpointNextBlock <= dev->internalEndBlock &&
-+ blocksAvailable > 0) {
-+
-+ for (i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++) {
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i);
-+ if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY) {
- dev->checkpointNextBlock = i + 1;
- dev->checkpointCurrentBlock = i;
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("allocating checkpt block %d"TENDSTR),i));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("allocating checkpt block %d"TENDSTR), i));
- return;
- }
- }
- }
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("out of checkpt blocks"TENDSTR)));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("out of checkpt blocks"TENDSTR)));
-
- dev->checkpointNextBlock = -1;
- dev->checkpointCurrentBlock = -1;
-@@ -98,30 +93,31 @@ static void yaffs_CheckpointFindNextChec
- int i;
- yaffs_ExtendedTags tags;
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("find next checkpt block: start: blocks %d next %d" TENDSTR),
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("find next checkpt block: start: blocks %d next %d" TENDSTR),
- dev->blocksInCheckpoint, dev->checkpointNextBlock));
-
-- if(dev->blocksInCheckpoint < dev->checkpointMaxBlocks)
-- for(i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++){
-+ if (dev->blocksInCheckpoint < dev->checkpointMaxBlocks)
-+ for (i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++) {
- int chunk = i * dev->nChunksPerBlock;
- int realignedChunk = chunk - dev->chunkOffset;
-
-- dev->readChunkWithTagsFromNAND(dev,realignedChunk,NULL,&tags);
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("find next checkpt block: search: block %d oid %d seq %d eccr %d" TENDSTR),
-- i, tags.objectId,tags.sequenceNumber,tags.eccResult));
-+ dev->readChunkWithTagsFromNAND(dev, realignedChunk,
-+ NULL, &tags);
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("find next checkpt block: search: block %d oid %d seq %d eccr %d" TENDSTR),
-+ i, tags.objectId, tags.sequenceNumber, tags.eccResult));
-
-- if(tags.sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA){
-+ if (tags.sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA) {
- /* Right kind of block */
- dev->checkpointNextBlock = tags.objectId;
- dev->checkpointCurrentBlock = i;
- dev->checkpointBlockList[dev->blocksInCheckpoint] = i;
- dev->blocksInCheckpoint++;
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("found checkpt block %d"TENDSTR),i));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("found checkpt block %d"TENDSTR), i));
- return;
- }
- }
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("found no more checkpt blocks"TENDSTR)));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("found no more checkpt blocks"TENDSTR)));
-
- dev->checkpointNextBlock = -1;
- dev->checkpointCurrentBlock = -1;
-@@ -133,17 +129,17 @@ int yaffs_CheckpointOpen(yaffs_Device *d
-
- /* Got the functions we need? */
- if (!dev->writeChunkWithTagsToNAND ||
-- !dev->readChunkWithTagsFromNAND ||
-- !dev->eraseBlockInNAND ||
-- !dev->markNANDBlockBad)
-+ !dev->readChunkWithTagsFromNAND ||
-+ !dev->eraseBlockInNAND ||
-+ !dev->markNANDBlockBad)
- return 0;
-
-- if(forWriting && !yaffs_CheckpointSpaceOk(dev))
-+ if (forWriting && !yaffs_CheckpointSpaceOk(dev))
- return 0;
-
-- if(!dev->checkpointBuffer)
-- dev->checkpointBuffer = YMALLOC_DMA(dev->nDataBytesPerChunk);
-- if(!dev->checkpointBuffer)
-+ if (!dev->checkpointBuffer)
-+ dev->checkpointBuffer = YMALLOC_DMA(dev->totalBytesPerChunk);
-+ if (!dev->checkpointBuffer)
- return 0;
-
-
-@@ -159,12 +155,10 @@ int yaffs_CheckpointOpen(yaffs_Device *d
- dev->checkpointNextBlock = dev->internalStartBlock;
-
- /* Erase all the blocks in the checkpoint area */
-- if(forWriting){
-- memset(dev->checkpointBuffer,0,dev->nDataBytesPerChunk);
-+ if (forWriting) {
-+ memset(dev->checkpointBuffer, 0, dev->nDataBytesPerChunk);
- dev->checkpointByteOffset = 0;
- return yaffs_CheckpointErase(dev);
--
--
- } else {
- int i;
- /* Set to a value that will kick off a read */
-@@ -174,7 +168,7 @@ int yaffs_CheckpointOpen(yaffs_Device *d
- dev->blocksInCheckpoint = 0;
- dev->checkpointMaxBlocks = (dev->internalEndBlock - dev->internalStartBlock)/16 + 2;
- dev->checkpointBlockList = YMALLOC(sizeof(int) * dev->checkpointMaxBlocks);
-- for(i = 0; i < dev->checkpointMaxBlocks; i++)
-+ for (i = 0; i < dev->checkpointMaxBlocks; i++)
- dev->checkpointBlockList[i] = -1;
- }
-
-@@ -191,18 +185,17 @@ int yaffs_GetCheckpointSum(yaffs_Device
-
- static int yaffs_CheckpointFlushBuffer(yaffs_Device *dev)
- {
--
- int chunk;
- int realignedChunk;
-
- yaffs_ExtendedTags tags;
-
-- if(dev->checkpointCurrentBlock < 0){
-+ if (dev->checkpointCurrentBlock < 0) {
- yaffs_CheckpointFindNextErasedBlock(dev);
- dev->checkpointCurrentChunk = 0;
- }
-
-- if(dev->checkpointCurrentBlock < 0)
-+ if (dev->checkpointCurrentBlock < 0)
- return 0;
-
- tags.chunkDeleted = 0;
-@@ -210,10 +203,10 @@ static int yaffs_CheckpointFlushBuffer(y
- tags.chunkId = dev->checkpointPageSequence + 1;
- tags.sequenceNumber = YAFFS_SEQUENCE_CHECKPOINT_DATA;
- tags.byteCount = dev->nDataBytesPerChunk;
-- if(dev->checkpointCurrentChunk == 0){
-+ if (dev->checkpointCurrentChunk == 0) {
- /* First chunk we write for the block? Set block state to
- checkpoint */
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,dev->checkpointCurrentBlock);
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, dev->checkpointCurrentBlock);
- bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT;
- dev->blocksInCheckpoint++;
- }
-@@ -221,28 +214,29 @@ static int yaffs_CheckpointFlushBuffer(y
- chunk = dev->checkpointCurrentBlock * dev->nChunksPerBlock + dev->checkpointCurrentChunk;
-
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint wite buffer nand %d(%d:%d) objid %d chId %d" TENDSTR),
-- chunk, dev->checkpointCurrentBlock, dev->checkpointCurrentChunk,tags.objectId,tags.chunkId));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint wite buffer nand %d(%d:%d) objid %d chId %d" TENDSTR),
-+ chunk, dev->checkpointCurrentBlock, dev->checkpointCurrentChunk, tags.objectId, tags.chunkId));
-
- realignedChunk = chunk - dev->chunkOffset;
-
-- dev->writeChunkWithTagsToNAND(dev,realignedChunk,dev->checkpointBuffer,&tags);
-+ dev->writeChunkWithTagsToNAND(dev, realignedChunk,
-+ dev->checkpointBuffer, &tags);
- dev->checkpointByteOffset = 0;
- dev->checkpointPageSequence++;
- dev->checkpointCurrentChunk++;
-- if(dev->checkpointCurrentChunk >= dev->nChunksPerBlock){
-+ if (dev->checkpointCurrentChunk >= dev->nChunksPerBlock) {
- dev->checkpointCurrentChunk = 0;
- dev->checkpointCurrentBlock = -1;
- }
-- memset(dev->checkpointBuffer,0,dev->nDataBytesPerChunk);
-+ memset(dev->checkpointBuffer, 0, dev->nDataBytesPerChunk);
-
- return 1;
- }
-
-
--int yaffs_CheckpointWrite(yaffs_Device *dev,const void *data, int nBytes)
-+int yaffs_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes)
- {
-- int i=0;
-+ int i = 0;
- int ok = 1;
-
-
-@@ -250,17 +244,14 @@ int yaffs_CheckpointWrite(yaffs_Device *
-
-
-
-- if(!dev->checkpointBuffer)
-+ if (!dev->checkpointBuffer)
- return 0;
-
-- if(!dev->checkpointOpenForWrite)
-+ if (!dev->checkpointOpenForWrite)
- return -1;
-
-- while(i < nBytes && ok) {
--
--
--
-- dev->checkpointBuffer[dev->checkpointByteOffset] = *dataBytes ;
-+ while (i < nBytes && ok) {
-+ dev->checkpointBuffer[dev->checkpointByteOffset] = *dataBytes;
- dev->checkpointSum += *dataBytes;
- dev->checkpointXor ^= *dataBytes;
-
-@@ -270,18 +261,17 @@ int yaffs_CheckpointWrite(yaffs_Device *
- dev->checkpointByteCount++;
-
-
-- if(dev->checkpointByteOffset < 0 ||
-+ if (dev->checkpointByteOffset < 0 ||
- dev->checkpointByteOffset >= dev->nDataBytesPerChunk)
- ok = yaffs_CheckpointFlushBuffer(dev);
--
- }
-
-- return i;
-+ return i;
- }
-
- int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes)
- {
-- int i=0;
-+ int i = 0;
- int ok = 1;
- yaffs_ExtendedTags tags;
-
-@@ -291,52 +281,54 @@ int yaffs_CheckpointRead(yaffs_Device *d
-
- __u8 *dataBytes = (__u8 *)data;
-
-- if(!dev->checkpointBuffer)
-+ if (!dev->checkpointBuffer)
- return 0;
-
-- if(dev->checkpointOpenForWrite)
-+ if (dev->checkpointOpenForWrite)
- return -1;
-
-- while(i < nBytes && ok) {
-+ while (i < nBytes && ok) {
-
-
-- if(dev->checkpointByteOffset < 0 ||
-- dev->checkpointByteOffset >= dev->nDataBytesPerChunk) {
-+ if (dev->checkpointByteOffset < 0 ||
-+ dev->checkpointByteOffset >= dev->nDataBytesPerChunk) {
-
-- if(dev->checkpointCurrentBlock < 0){
-+ if (dev->checkpointCurrentBlock < 0) {
- yaffs_CheckpointFindNextCheckpointBlock(dev);
- dev->checkpointCurrentChunk = 0;
- }
-
-- if(dev->checkpointCurrentBlock < 0)
-+ if (dev->checkpointCurrentBlock < 0)
- ok = 0;
- else {
--
-- chunk = dev->checkpointCurrentBlock * dev->nChunksPerBlock +
-- dev->checkpointCurrentChunk;
-+ chunk = dev->checkpointCurrentBlock *
-+ dev->nChunksPerBlock +
-+ dev->checkpointCurrentChunk;
-
- realignedChunk = chunk - dev->chunkOffset;
-
-- /* read in the next chunk */
-- /* printf("read checkpoint page %d\n",dev->checkpointPage); */
-- dev->readChunkWithTagsFromNAND(dev, realignedChunk,
-- dev->checkpointBuffer,
-- &tags);
--
-- if(tags.chunkId != (dev->checkpointPageSequence + 1) ||
-- tags.sequenceNumber != YAFFS_SEQUENCE_CHECKPOINT_DATA)
-- ok = 0;
-+ /* read in the next chunk */
-+ /* printf("read checkpoint page %d\n",dev->checkpointPage); */
-+ dev->readChunkWithTagsFromNAND(dev,
-+ realignedChunk,
-+ dev->checkpointBuffer,
-+ &tags);
-+
-+ if (tags.chunkId != (dev->checkpointPageSequence + 1) ||
-+ tags.eccResult > YAFFS_ECC_RESULT_FIXED ||
-+ tags.sequenceNumber != YAFFS_SEQUENCE_CHECKPOINT_DATA)
-+ ok = 0;
-
- dev->checkpointByteOffset = 0;
- dev->checkpointPageSequence++;
- dev->checkpointCurrentChunk++;
-
-- if(dev->checkpointCurrentChunk >= dev->nChunksPerBlock)
-+ if (dev->checkpointCurrentChunk >= dev->nChunksPerBlock)
- dev->checkpointCurrentBlock = -1;
- }
- }
-
-- if(ok){
-+ if (ok) {
- *dataBytes = dev->checkpointBuffer[dev->checkpointByteOffset];
- dev->checkpointSum += *dataBytes;
- dev->checkpointXor ^= *dataBytes;
-@@ -353,17 +345,17 @@ int yaffs_CheckpointRead(yaffs_Device *d
- int yaffs_CheckpointClose(yaffs_Device *dev)
- {
-
-- if(dev->checkpointOpenForWrite){
-- if(dev->checkpointByteOffset != 0)
-+ if (dev->checkpointOpenForWrite) {
-+ if (dev->checkpointByteOffset != 0)
- yaffs_CheckpointFlushBuffer(dev);
- } else {
- int i;
-- for(i = 0; i < dev->blocksInCheckpoint && dev->checkpointBlockList[i] >= 0; i++){
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,dev->checkpointBlockList[i]);
-- if(bi->blockState == YAFFS_BLOCK_STATE_EMPTY)
-+ for (i = 0; i < dev->blocksInCheckpoint && dev->checkpointBlockList[i] >= 0; i++) {
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, dev->checkpointBlockList[i]);
-+ if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY)
- bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT;
- else {
-- // Todo this looks odd...
-+ /* Todo this looks odd... */
- }
- }
- YFREE(dev->checkpointBlockList);
-@@ -374,27 +366,25 @@ int yaffs_CheckpointClose(yaffs_Device *
- dev->nErasedBlocks -= dev->blocksInCheckpoint;
-
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint byte count %d" TENDSTR),
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint byte count %d" TENDSTR),
- dev->checkpointByteCount));
-
-- if(dev->checkpointBuffer){
-+ if (dev->checkpointBuffer) {
- /* free the buffer */
- YFREE(dev->checkpointBuffer);
- dev->checkpointBuffer = NULL;
- return 1;
-- }
-- else
-+ } else
- return 0;
--
- }
-
- int yaffs_CheckpointInvalidateStream(yaffs_Device *dev)
- {
- /* Erase the first checksum block */
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint invalidate"TENDSTR)));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint invalidate"TENDSTR)));
-
-- if(!yaffs_CheckpointSpaceOk(dev))
-+ if (!yaffs_CheckpointSpaceOk(dev))
- return 0;
-
- return yaffs_CheckpointErase(dev);
---- a/fs/yaffs2/yaffs_checkptrw.h
-+++ b/fs/yaffs2/yaffs_checkptrw.h
-@@ -20,9 +20,9 @@
-
- int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting);
-
--int yaffs_CheckpointWrite(yaffs_Device *dev,const void *data, int nBytes);
-+int yaffs_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes);
-
--int yaffs_CheckpointRead(yaffs_Device *dev,void *data, int nBytes);
-+int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes);
-
- int yaffs_GetCheckpointSum(yaffs_Device *dev, __u32 *sum);
-
---- a/fs/yaffs2/yaffs_ecc.c
-+++ b/fs/yaffs2/yaffs_ecc.c
-@@ -29,7 +29,7 @@
- */
-
- const char *yaffs_ecc_c_version =
-- "$Id: yaffs_ecc.c,v 1.9 2007-02-14 01:09:06 wookey Exp $";
-+ "$Id: yaffs_ecc.c,v 1.11 2009-03-06 17:20:50 wookey Exp $";
-
- #include "yportenv.h"
-
-@@ -109,12 +109,10 @@ void yaffs_ECCCalculate(const unsigned c
- b = column_parity_table[*data++];
- col_parity ^= b;
-
-- if (b & 0x01) // odd number of bits in the byte
-- {
-+ if (b & 0x01) { /* odd number of bits in the byte */
- line_parity ^= i;
- line_parity_prime ^= ~i;
- }
--
- }
-
- ecc[2] = (~col_parity) | 0x03;
-@@ -158,7 +156,7 @@ void yaffs_ECCCalculate(const unsigned c
- ecc[0] = ~t;
-
- #ifdef CONFIG_YAFFS_ECC_WRONG_ORDER
-- // Swap the bytes into the wrong order
-+ /* Swap the bytes into the wrong order */
- t = ecc[0];
- ecc[0] = ecc[1];
- ecc[1] = t;
-@@ -189,7 +187,7 @@ int yaffs_ECCCorrect(unsigned char *data
- unsigned bit;
-
- #ifdef CONFIG_YAFFS_ECC_WRONG_ORDER
-- // swap the bytes to correct for the wrong order
-+ /* swap the bytes to correct for the wrong order */
- unsigned char t;
-
- t = d0;
-@@ -251,7 +249,7 @@ int yaffs_ECCCorrect(unsigned char *data
- * ECCxxxOther does ECC calcs on arbitrary n bytes of data
- */
- void yaffs_ECCCalculateOther(const unsigned char *data, unsigned nBytes,
-- yaffs_ECCOther * eccOther)
-+ yaffs_ECCOther *eccOther)
- {
- unsigned int i;
-
-@@ -278,8 +276,8 @@ void yaffs_ECCCalculateOther(const unsig
- }
-
- int yaffs_ECCCorrectOther(unsigned char *data, unsigned nBytes,
-- yaffs_ECCOther * read_ecc,
-- const yaffs_ECCOther * test_ecc)
-+ yaffs_ECCOther *read_ecc,
-+ const yaffs_ECCOther *test_ecc)
- {
- unsigned char cDelta; /* column parity delta */
- unsigned lDelta; /* line parity delta */
-@@ -294,8 +292,7 @@ int yaffs_ECCCorrectOther(unsigned char
- return 0; /* no error */
-
- if (lDelta == ~lDeltaPrime &&
-- (((cDelta ^ (cDelta >> 1)) & 0x15) == 0x15))
-- {
-+ (((cDelta ^ (cDelta >> 1)) & 0x15) == 0x15)) {
- /* Single bit (recoverable) error in data */
-
- bit = 0;
-@@ -307,7 +304,7 @@ int yaffs_ECCCorrectOther(unsigned char
- if (cDelta & 0x02)
- bit |= 0x01;
-
-- if(lDelta >= nBytes)
-+ if (lDelta >= nBytes)
- return -1;
-
- data[lDelta] ^= (1 << bit);
-@@ -316,7 +313,7 @@ int yaffs_ECCCorrectOther(unsigned char
- }
-
- if ((yaffs_CountBits32(lDelta) + yaffs_CountBits32(lDeltaPrime) +
-- yaffs_CountBits(cDelta)) == 1) {
-+ yaffs_CountBits(cDelta)) == 1) {
- /* Reccoverable error in ecc */
-
- *read_ecc = *test_ecc;
-@@ -326,6 +323,4 @@ int yaffs_ECCCorrectOther(unsigned char
- /* Unrecoverable error */
-
- return -1;
--
- }
--
---- a/fs/yaffs2/yaffs_ecc.h
-+++ b/fs/yaffs2/yaffs_ecc.h
-@@ -13,15 +13,15 @@
- * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
- */
-
-- /*
-- * This code implements the ECC algorithm used in SmartMedia.
-- *
-- * The ECC comprises 22 bits of parity information and is stuffed into 3 bytes.
-- * The two unused bit are set to 1.
-- * The ECC can correct single bit errors in a 256-byte page of data. Thus, two such ECC
-- * blocks are used on a 512-byte NAND page.
-- *
-- */
-+/*
-+ * This code implements the ECC algorithm used in SmartMedia.
-+ *
-+ * The ECC comprises 22 bits of parity information and is stuffed into 3 bytes.
-+ * The two unused bit are set to 1.
-+ * The ECC can correct single bit errors in a 256-byte page of data. Thus, two such ECC
-+ * blocks are used on a 512-byte NAND page.
-+ *
-+ */
-
- #ifndef __YAFFS_ECC_H__
- #define __YAFFS_ECC_H__
-@@ -34,11 +34,11 @@ typedef struct {
-
- void yaffs_ECCCalculate(const unsigned char *data, unsigned char *ecc);
- int yaffs_ECCCorrect(unsigned char *data, unsigned char *read_ecc,
-- const unsigned char *test_ecc);
-+ const unsigned char *test_ecc);
-
- void yaffs_ECCCalculateOther(const unsigned char *data, unsigned nBytes,
-- yaffs_ECCOther * ecc);
-+ yaffs_ECCOther *ecc);
- int yaffs_ECCCorrectOther(unsigned char *data, unsigned nBytes,
-- yaffs_ECCOther * read_ecc,
-- const yaffs_ECCOther * test_ecc);
-+ yaffs_ECCOther *read_ecc,
-+ const yaffs_ECCOther *test_ecc);
- #endif
---- a/fs/yaffs2/yaffs_fs.c
-+++ b/fs/yaffs2/yaffs_fs.c
-@@ -1,7 +1,7 @@
- /*
- * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
- *
-- * Copyright (C) 2002-2007 Aleph One Ltd.
-+ * Copyright (C) 2002-2009 Aleph One Ltd.
- * for Toby Churchill Ltd and Brightstar Engineering
- *
- * Created by Charles Manning <charles@aleph1.co.uk>
-@@ -32,18 +32,17 @@
- */
-
- const char *yaffs_fs_c_version =
-- "$Id: yaffs_fs.c,v 1.63 2007-09-19 20:35:40 imcd Exp $";
-+ "$Id: yaffs_fs.c,v 1.79 2009-03-17 01:12:00 wookey Exp $";
- extern const char *yaffs_guts_c_version;
-
- #include <linux/version.h>
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
- #include <linux/config.h>
- #endif
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/slab.h>
- #include <linux/init.h>
--#include <linux/list.h>
- #include <linux/fs.h>
- #include <linux/proc_fs.h>
- #include <linux/smp_lock.h>
-@@ -53,10 +52,12 @@ extern const char *yaffs_guts_c_version;
- #include <linux/string.h>
- #include <linux/ctype.h>
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#include "asm/div64.h"
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-
- #include <linux/statfs.h> /* Added NCB 15-8-2003 */
--#include <asm/statfs.h>
-+#include <linux/statfs.h>
- #define UnlockPage(p) unlock_page(p)
- #define Page_Uptodate(page) test_bit(PG_uptodate, &(page)->flags)
-
-@@ -69,22 +70,45 @@ extern const char *yaffs_guts_c_version;
- #define BDEVNAME_SIZE 0
- #define yaffs_devname(sb, buf) kdevname(sb->s_dev)
-
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0))
- /* added NCB 26/5/2006 for 2.4.25-vrs2-tcl1 kernel */
- #define __user
- #endif
-
- #endif
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26))
-+#define YPROC_ROOT (&proc_root)
-+#else
-+#define YPROC_ROOT NULL
-+#endif
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- #define WRITE_SIZE_STR "writesize"
--#define WRITE_SIZE(mtd) (mtd)->writesize
-+#define WRITE_SIZE(mtd) ((mtd)->writesize)
- #else
- #define WRITE_SIZE_STR "oobblock"
--#define WRITE_SIZE(mtd) (mtd)->oobblock
-+#define WRITE_SIZE(mtd) ((mtd)->oobblock)
- #endif
-
--#include <asm/uaccess.h>
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 27))
-+#define YAFFS_USE_WRITE_BEGIN_END 1
-+#else
-+#define YAFFS_USE_WRITE_BEGIN_END 0
-+#endif
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 28))
-+static uint32_t YCALCBLOCKS(uint64_t partition_size, uint32_t block_size)
-+{
-+ uint64_t result = partition_size;
-+ do_div(result, block_size);
-+ return (uint32_t)result;
-+}
-+#else
-+#define YCALCBLOCKS(s, b) ((s)/(b))
-+#endif
-+
-+#include <linux/uaccess.h>
-
- #include "yportenv.h"
- #include "yaffs_guts.h"
-@@ -96,28 +120,44 @@ extern const char *yaffs_guts_c_version;
-
- unsigned int yaffs_traceMask = YAFFS_TRACE_BAD_BLOCKS;
- unsigned int yaffs_wr_attempts = YAFFS_WR_ATTEMPTS;
-+unsigned int yaffs_auto_checkpoint = 1;
-
- /* Module Parameters */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
--module_param(yaffs_traceMask,uint,0644);
--module_param(yaffs_wr_attempts,uint,0644);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-+module_param(yaffs_traceMask, uint, 0644);
-+module_param(yaffs_wr_attempts, uint, 0644);
-+module_param(yaffs_auto_checkpoint, uint, 0644);
-+#else
-+MODULE_PARM(yaffs_traceMask, "i");
-+MODULE_PARM(yaffs_wr_attempts, "i");
-+MODULE_PARM(yaffs_auto_checkpoint, "i");
-+#endif
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 25))
-+/* use iget and read_inode */
-+#define Y_IGET(sb, inum) iget((sb), (inum))
-+static void yaffs_read_inode(struct inode *inode);
-+
- #else
--MODULE_PARM(yaffs_traceMask,"i");
--MODULE_PARM(yaffs_wr_attempts,"i");
-+/* Call local equivalent */
-+#define YAFFS_USE_OWN_IGET
-+#define Y_IGET(sb, inum) yaffs_iget((sb), (inum))
-+
-+static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino);
- #endif
-
- /*#define T(x) printk x */
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
--#define yaffs_InodeToObjectLV(iptr) (iptr)->i_private
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18))
-+#define yaffs_InodeToObjectLV(iptr) ((iptr)->i_private)
- #else
--#define yaffs_InodeToObjectLV(iptr) (iptr)->u.generic_ip
-+#define yaffs_InodeToObjectLV(iptr) ((iptr)->u.generic_ip)
- #endif
-
- #define yaffs_InodeToObject(iptr) ((yaffs_Object *)(yaffs_InodeToObjectLV(iptr)))
- #define yaffs_DentryToObject(dptr) yaffs_InodeToObject((dptr)->d_inode)
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- #define yaffs_SuperToDevice(sb) ((yaffs_Device *)sb->s_fs_info)
- #else
- #define yaffs_SuperToDevice(sb) ((yaffs_Device *)sb->u.generic_sbp)
-@@ -126,47 +166,49 @@ MODULE_PARM(yaffs_wr_attempts,"i");
- static void yaffs_put_super(struct super_block *sb);
-
- static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n,
-- loff_t * pos);
-+ loff_t *pos);
-+static ssize_t yaffs_hold_space(struct file *f);
-+static void yaffs_release_space(struct file *f);
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_file_flush(struct file *file, fl_owner_t id);
- #else
- static int yaffs_file_flush(struct file *file);
- #endif
-
- static int yaffs_sync_object(struct file *file, struct dentry *dentry,
-- int datasync);
-+ int datasync);
-
- static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir);
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode,
- struct nameidata *n);
- static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry,
-- struct nameidata *n);
-+ struct nameidata *n);
- #else
- static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode);
- static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry);
- #endif
- static int yaffs_link(struct dentry *old_dentry, struct inode *dir,
-- struct dentry *dentry);
-+ struct dentry *dentry);
- static int yaffs_unlink(struct inode *dir, struct dentry *dentry);
- static int yaffs_symlink(struct inode *dir, struct dentry *dentry,
-- const char *symname);
-+ const char *symname);
- static int yaffs_mkdir(struct inode *dir, struct dentry *dentry, int mode);
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
-- dev_t dev);
-+ dev_t dev);
- #else
- static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
-- int dev);
-+ int dev);
- #endif
- static int yaffs_rename(struct inode *old_dir, struct dentry *old_dentry,
- struct inode *new_dir, struct dentry *new_dentry);
- static int yaffs_setattr(struct dentry *dentry, struct iattr *attr);
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_sync_fs(struct super_block *sb, int wait);
- static void yaffs_write_super(struct super_block *sb);
- #else
-@@ -174,33 +216,47 @@ static int yaffs_sync_fs(struct super_bl
- static int yaffs_write_super(struct super_block *sb);
- #endif
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_statfs(struct dentry *dentry, struct kstatfs *buf);
--#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_statfs(struct super_block *sb, struct kstatfs *buf);
- #else
- static int yaffs_statfs(struct super_block *sb, struct statfs *buf);
- #endif
--static void yaffs_read_inode(struct inode *inode);
-
-+#ifdef YAFFS_HAS_PUT_INODE
- static void yaffs_put_inode(struct inode *inode);
-+#endif
-+
- static void yaffs_delete_inode(struct inode *);
- static void yaffs_clear_inode(struct inode *);
-
- static int yaffs_readpage(struct file *file, struct page *page);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_writepage(struct page *page, struct writeback_control *wbc);
- #else
- static int yaffs_writepage(struct page *page);
- #endif
-+
-+
-+#if (YAFFS_USE_WRITE_BEGIN_END != 0)
-+static int yaffs_write_begin(struct file *filp, struct address_space *mapping,
-+ loff_t pos, unsigned len, unsigned flags,
-+ struct page **pagep, void **fsdata);
-+static int yaffs_write_end(struct file *filp, struct address_space *mapping,
-+ loff_t pos, unsigned len, unsigned copied,
-+ struct page *pg, void *fsdadata);
-+#else
- static int yaffs_prepare_write(struct file *f, struct page *pg,
-- unsigned offset, unsigned to);
-+ unsigned offset, unsigned to);
- static int yaffs_commit_write(struct file *f, struct page *pg, unsigned offset,
-- unsigned to);
-+ unsigned to);
-
--static int yaffs_readlink(struct dentry *dentry, char __user * buffer,
-- int buflen);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-+#endif
-+
-+static int yaffs_readlink(struct dentry *dentry, char __user *buffer,
-+ int buflen);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
- static void *yaffs_follow_link(struct dentry *dentry, struct nameidata *nd);
- #else
- static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd);
-@@ -209,12 +265,17 @@ static int yaffs_follow_link(struct dent
- static struct address_space_operations yaffs_file_address_operations = {
- .readpage = yaffs_readpage,
- .writepage = yaffs_writepage,
-+#if (YAFFS_USE_WRITE_BEGIN_END > 0)
-+ .write_begin = yaffs_write_begin,
-+ .write_end = yaffs_write_end,
-+#else
- .prepare_write = yaffs_prepare_write,
- .commit_write = yaffs_commit_write,
-+#endif
- };
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22))
--static struct file_operations yaffs_file_operations = {
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22))
-+static const struct file_operations yaffs_file_operations = {
- .read = do_sync_read,
- .write = do_sync_write,
- .aio_read = generic_file_aio_read,
-@@ -224,11 +285,12 @@ static struct file_operations yaffs_file
- .fsync = yaffs_sync_object,
- .splice_read = generic_file_splice_read,
- .splice_write = generic_file_splice_write,
-+ .llseek = generic_file_llseek,
- };
-
--#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
-+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18))
-
--static struct file_operations yaffs_file_operations = {
-+static const struct file_operations yaffs_file_operations = {
- .read = do_sync_read,
- .write = do_sync_write,
- .aio_read = generic_file_aio_read,
-@@ -241,29 +303,29 @@ static struct file_operations yaffs_file
-
- #else
-
--static struct file_operations yaffs_file_operations = {
-+static const struct file_operations yaffs_file_operations = {
- .read = generic_file_read,
- .write = generic_file_write,
- .mmap = generic_file_mmap,
- .flush = yaffs_file_flush,
- .fsync = yaffs_sync_object,
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- .sendfile = generic_file_sendfile,
- #endif
- };
- #endif
-
--static struct inode_operations yaffs_file_inode_operations = {
-+static const struct inode_operations yaffs_file_inode_operations = {
- .setattr = yaffs_setattr,
- };
-
--static struct inode_operations yaffs_symlink_inode_operations = {
-+static const struct inode_operations yaffs_symlink_inode_operations = {
- .readlink = yaffs_readlink,
- .follow_link = yaffs_follow_link,
- .setattr = yaffs_setattr,
- };
-
--static struct inode_operations yaffs_dir_inode_operations = {
-+static const struct inode_operations yaffs_dir_inode_operations = {
- .create = yaffs_create,
- .lookup = yaffs_lookup,
- .link = yaffs_link,
-@@ -276,16 +338,21 @@ static struct inode_operations yaffs_dir
- .setattr = yaffs_setattr,
- };
-
--static struct file_operations yaffs_dir_operations = {
-+static const struct file_operations yaffs_dir_operations = {
- .read = generic_read_dir,
- .readdir = yaffs_readdir,
- .fsync = yaffs_sync_object,
- };
-
--static struct super_operations yaffs_super_ops = {
-+static const struct super_operations yaffs_super_ops = {
- .statfs = yaffs_statfs,
-+
-+#ifndef YAFFS_USE_OWN_IGET
- .read_inode = yaffs_read_inode,
-+#endif
-+#ifdef YAFFS_HAS_PUT_INODE
- .put_inode = yaffs_put_inode,
-+#endif
- .put_super = yaffs_put_super,
- .delete_inode = yaffs_delete_inode,
- .clear_inode = yaffs_clear_inode,
-@@ -293,22 +360,21 @@ static struct super_operations yaffs_sup
- .write_super = yaffs_write_super,
- };
-
--static void yaffs_GrossLock(yaffs_Device * dev)
-+static void yaffs_GrossLock(yaffs_Device *dev)
- {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs locking\n"));
--
-+ T(YAFFS_TRACE_OS, ("yaffs locking %p\n", current));
- down(&dev->grossLock);
-+ T(YAFFS_TRACE_OS, ("yaffs locked %p\n", current));
- }
-
--static void yaffs_GrossUnlock(yaffs_Device * dev)
-+static void yaffs_GrossUnlock(yaffs_Device *dev)
- {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs unlocking\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs unlocking %p\n", current));
- up(&dev->grossLock);
--
- }
-
--static int yaffs_readlink(struct dentry *dentry, char __user * buffer,
-- int buflen)
-+static int yaffs_readlink(struct dentry *dentry, char __user *buffer,
-+ int buflen)
- {
- unsigned char *alias;
- int ret;
-@@ -329,7 +395,7 @@ static int yaffs_readlink(struct dentry
- return ret;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
- static void *yaffs_follow_link(struct dentry *dentry, struct nameidata *nd)
- #else
- static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd)
-@@ -345,32 +411,31 @@ static int yaffs_follow_link(struct dent
-
- yaffs_GrossUnlock(dev);
-
-- if (!alias)
-- {
-+ if (!alias) {
- ret = -ENOMEM;
- goto out;
-- }
-+ }
-
- ret = vfs_follow_link(nd, alias);
- kfree(alias);
- out:
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-- return ERR_PTR (ret);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
-+ return ERR_PTR(ret);
- #else
- return ret;
- #endif
- }
-
- struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev,
-- yaffs_Object * obj);
-+ yaffs_Object *obj);
-
- /*
- * Lookup is used to find objects in the fs
- */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-
- static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry,
-- struct nameidata *n)
-+ struct nameidata *n)
- #else
- static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry)
- #endif
-@@ -383,12 +448,11 @@ static struct dentry *yaffs_lookup(struc
- yaffs_GrossLock(dev);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_lookup for %d:%s\n",
-- yaffs_InodeToObject(dir)->objectId, dentry->d_name.name));
-+ ("yaffs_lookup for %d:%s\n",
-+ yaffs_InodeToObject(dir)->objectId, dentry->d_name.name));
-
-- obj =
-- yaffs_FindObjectByName(yaffs_InodeToObject(dir),
-- dentry->d_name.name);
-+ obj = yaffs_FindObjectByName(yaffs_InodeToObject(dir),
-+ dentry->d_name.name);
-
- obj = yaffs_GetEquivalentObject(obj); /* in case it was a hardlink */
-
-@@ -397,13 +461,13 @@ static struct dentry *yaffs_lookup(struc
-
- if (obj) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_lookup found %d\n", obj->objectId));
-+ ("yaffs_lookup found %d\n", obj->objectId));
-
- inode = yaffs_get_inode(dir->i_sb, obj->yst_mode, 0, obj);
-
- if (inode) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_loookup dentry \n"));
-+ ("yaffs_loookup dentry \n"));
- /* #if 0 asserted by NCB for 2.5/6 compatability - falls through to
- * d_add even if NULL inode */
- #if 0
-@@ -416,7 +480,7 @@ static struct dentry *yaffs_lookup(struc
- }
-
- } else {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_lookup not found\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_lookup not found\n"));
-
- }
-
-@@ -425,20 +489,22 @@ static struct dentry *yaffs_lookup(struc
- d_add(dentry, inode);
-
- return NULL;
-- /* return (ERR_PTR(-EIO)); */
--
- }
-
-+
-+#ifdef YAFFS_HAS_PUT_INODE
-+
- /* For now put inode is just for debugging
- * Put inode is called when the inode **structure** is put.
- */
- static void yaffs_put_inode(struct inode *inode)
- {
- T(YAFFS_TRACE_OS,
-- ("yaffs_put_inode: ino %d, count %d\n", (int)inode->i_ino,
-- atomic_read(&inode->i_count)));
-+ ("yaffs_put_inode: ino %d, count %d\n", (int)inode->i_ino,
-+ atomic_read(&inode->i_count)));
-
- }
-+#endif
-
- /* clear is called to tell the fs to release any per-inode data it holds */
- static void yaffs_clear_inode(struct inode *inode)
-@@ -449,9 +515,9 @@ static void yaffs_clear_inode(struct ino
- obj = yaffs_InodeToObject(inode);
-
- T(YAFFS_TRACE_OS,
-- ("yaffs_clear_inode: ino %d, count %d %s\n", (int)inode->i_ino,
-- atomic_read(&inode->i_count),
-- obj ? "object exists" : "null object"));
-+ ("yaffs_clear_inode: ino %d, count %d %s\n", (int)inode->i_ino,
-+ atomic_read(&inode->i_count),
-+ obj ? "object exists" : "null object"));
-
- if (obj) {
- dev = obj->myDev;
-@@ -486,23 +552,23 @@ static void yaffs_delete_inode(struct in
- yaffs_Device *dev;
-
- T(YAFFS_TRACE_OS,
-- ("yaffs_delete_inode: ino %d, count %d %s\n", (int)inode->i_ino,
-- atomic_read(&inode->i_count),
-- obj ? "object exists" : "null object"));
-+ ("yaffs_delete_inode: ino %d, count %d %s\n", (int)inode->i_ino,
-+ atomic_read(&inode->i_count),
-+ obj ? "object exists" : "null object"));
-
- if (obj) {
- dev = obj->myDev;
- yaffs_GrossLock(dev);
-- yaffs_DeleteFile(obj);
-+ yaffs_DeleteObject(obj);
- yaffs_GrossUnlock(dev);
- }
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-- truncate_inode_pages (&inode->i_data, 0);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13))
-+ truncate_inode_pages(&inode->i_data, 0);
- #endif
- clear_inode(inode);
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_file_flush(struct file *file, fl_owner_t id)
- #else
- static int yaffs_file_flush(struct file *file)
-@@ -513,8 +579,8 @@ static int yaffs_file_flush(struct file
- yaffs_Device *dev = obj->myDev;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_file_flush object %d (%s)\n", obj->objectId,
-- obj->dirty ? "dirty" : "clean"));
-+ ("yaffs_file_flush object %d (%s)\n", obj->objectId,
-+ obj->dirty ? "dirty" : "clean"));
-
- yaffs_GrossLock(dev);
-
-@@ -535,15 +601,15 @@ static int yaffs_readpage_nolock(struct
-
- yaffs_Device *dev;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_readpage at %08x, size %08x\n",
-- (unsigned)(pg->index << PAGE_CACHE_SHIFT),
-- (unsigned)PAGE_CACHE_SIZE));
-+ T(YAFFS_TRACE_OS, ("yaffs_readpage at %08x, size %08x\n",
-+ (unsigned)(pg->index << PAGE_CACHE_SHIFT),
-+ (unsigned)PAGE_CACHE_SIZE));
-
- obj = yaffs_DentryToObject(f->f_dentry);
-
- dev = obj->myDev;
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- BUG_ON(!PageLocked(pg));
- #else
- if (!PageLocked(pg))
-@@ -555,9 +621,9 @@ static int yaffs_readpage_nolock(struct
-
- yaffs_GrossLock(dev);
-
-- ret =
-- yaffs_ReadDataFromFile(obj, pg_buf, pg->index << PAGE_CACHE_SHIFT,
-- PAGE_CACHE_SIZE);
-+ ret = yaffs_ReadDataFromFile(obj, pg_buf,
-+ pg->index << PAGE_CACHE_SHIFT,
-+ PAGE_CACHE_SIZE);
-
- yaffs_GrossUnlock(dev);
-
-@@ -575,7 +641,7 @@ static int yaffs_readpage_nolock(struct
- flush_dcache_page(pg);
- kunmap(pg);
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_readpage done\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_readpage done\n"));
- return ret;
- }
-
-@@ -593,7 +659,7 @@ static int yaffs_readpage(struct file *f
-
- /* writepage inspired by/stolen from smbfs */
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_writepage(struct page *page, struct writeback_control *wbc)
- #else
- static int yaffs_writepage(struct page *page)
-@@ -616,12 +682,11 @@ static int yaffs_writepage(struct page *
-
- if (offset > inode->i_size) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_writepage at %08x, inode size = %08x!!!\n",
-- (unsigned)(page->index << PAGE_CACHE_SHIFT),
-- (unsigned)inode->i_size));
-+ ("yaffs_writepage at %08x, inode size = %08x!!!\n",
-+ (unsigned)(page->index << PAGE_CACHE_SHIFT),
-+ (unsigned)inode->i_size));
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG " -> don't care!!\n"));
-+ (" -> don't care!!\n"));
- unlock_page(page);
- return 0;
- }
-@@ -629,11 +694,10 @@ static int yaffs_writepage(struct page *
- end_index = inode->i_size >> PAGE_CACHE_SHIFT;
-
- /* easy case */
-- if (page->index < end_index) {
-+ if (page->index < end_index)
- nBytes = PAGE_CACHE_SIZE;
-- } else {
-+ else
- nBytes = inode->i_size & (PAGE_CACHE_SIZE - 1);
-- }
-
- get_page(page);
-
-@@ -643,19 +707,18 @@ static int yaffs_writepage(struct page *
- yaffs_GrossLock(obj->myDev);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_writepage at %08x, size %08x\n",
-- (unsigned)(page->index << PAGE_CACHE_SHIFT), nBytes));
-+ ("yaffs_writepage at %08x, size %08x\n",
-+ (unsigned)(page->index << PAGE_CACHE_SHIFT), nBytes));
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "writepag0: obj = %05x, ino = %05x\n",
-- (int)obj->variant.fileVariant.fileSize, (int)inode->i_size));
-+ ("writepag0: obj = %05x, ino = %05x\n",
-+ (int)obj->variant.fileVariant.fileSize, (int)inode->i_size));
-
-- nWritten =
-- yaffs_WriteDataToFile(obj, buffer, page->index << PAGE_CACHE_SHIFT,
-- nBytes, 0);
-+ nWritten = yaffs_WriteDataToFile(obj, buffer,
-+ page->index << PAGE_CACHE_SHIFT, nBytes, 0);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "writepag1: obj = %05x, ino = %05x\n",
-- (int)obj->variant.fileVariant.fileSize, (int)inode->i_size));
-+ ("writepag1: obj = %05x, ino = %05x\n",
-+ (int)obj->variant.fileVariant.fileSize, (int)inode->i_size));
-
- yaffs_GrossUnlock(obj->myDev);
-
-@@ -667,100 +730,207 @@ static int yaffs_writepage(struct page *
- return (nWritten == nBytes) ? 0 : -ENOSPC;
- }
-
-+
-+#if (YAFFS_USE_WRITE_BEGIN_END > 0)
-+static int yaffs_write_begin(struct file *filp, struct address_space *mapping,
-+ loff_t pos, unsigned len, unsigned flags,
-+ struct page **pagep, void **fsdata)
-+{
-+ struct page *pg = NULL;
-+ pgoff_t index = pos >> PAGE_CACHE_SHIFT;
-+ uint32_t offset = pos & (PAGE_CACHE_SIZE - 1);
-+ uint32_t to = offset + len;
-+
-+ int ret = 0;
-+ int space_held = 0;
-+
-+ T(YAFFS_TRACE_OS, ("start yaffs_write_begin\n"));
-+ /* Get a page */
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 28)
-+ pg = grab_cache_page_write_begin(mapping, index, flags);
-+#else
-+ pg = __grab_cache_page(mapping, index);
-+#endif
-+
-+ *pagep = pg;
-+ if (!pg) {
-+ ret = -ENOMEM;
-+ goto out;
-+ }
-+ /* Get fs space */
-+ space_held = yaffs_hold_space(filp);
-+
-+ if (!space_held) {
-+ ret = -ENOSPC;
-+ goto out;
-+ }
-+
-+ /* Update page if required */
-+
-+ if (!Page_Uptodate(pg) && (offset || to < PAGE_CACHE_SIZE))
-+ ret = yaffs_readpage_nolock(filp, pg);
-+
-+ if (ret)
-+ goto out;
-+
-+ /* Happy path return */
-+ T(YAFFS_TRACE_OS, ("end yaffs_write_begin - ok\n"));
-+
-+ return 0;
-+
-+out:
-+ T(YAFFS_TRACE_OS, ("end yaffs_write_begin fail returning %d\n", ret));
-+ if (space_held)
-+ yaffs_release_space(filp);
-+ if (pg) {
-+ unlock_page(pg);
-+ page_cache_release(pg);
-+ }
-+ return ret;
-+}
-+
-+#else
-+
- static int yaffs_prepare_write(struct file *f, struct page *pg,
-- unsigned offset, unsigned to)
-+ unsigned offset, unsigned to)
- {
-+ T(YAFFS_TRACE_OS, ("yaffs_prepair_write\n"));
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_prepair_write\n"));
- if (!Page_Uptodate(pg) && (offset || to < PAGE_CACHE_SIZE))
- return yaffs_readpage_nolock(f, pg);
--
- return 0;
-+}
-+#endif
-+
-+#if (YAFFS_USE_WRITE_BEGIN_END > 0)
-+static int yaffs_write_end(struct file *filp, struct address_space *mapping,
-+ loff_t pos, unsigned len, unsigned copied,
-+ struct page *pg, void *fsdadata)
-+{
-+ int ret = 0;
-+ void *addr, *kva;
-+ uint32_t offset_into_page = pos & (PAGE_CACHE_SIZE - 1);
-+
-+ kva = kmap(pg);
-+ addr = kva + offset_into_page;
-+
-+ T(YAFFS_TRACE_OS,
-+ ("yaffs_write_end addr %x pos %x nBytes %d\n",
-+ (unsigned) addr,
-+ (int)pos, copied));
-+
-+ ret = yaffs_file_write(filp, addr, copied, &pos);
-+
-+ if (ret != copied) {
-+ T(YAFFS_TRACE_OS,
-+ ("yaffs_write_end not same size ret %d copied %d\n",
-+ ret, copied));
-+ SetPageError(pg);
-+ ClearPageUptodate(pg);
-+ } else {
-+ SetPageUptodate(pg);
-+ }
-+
-+ kunmap(pg);
-
-+ yaffs_release_space(filp);
-+ unlock_page(pg);
-+ page_cache_release(pg);
-+ return ret;
- }
-+#else
-
- static int yaffs_commit_write(struct file *f, struct page *pg, unsigned offset,
-- unsigned to)
-+ unsigned to)
- {
-+ void *addr, *kva;
-
-- void *addr = page_address(pg) + offset;
- loff_t pos = (((loff_t) pg->index) << PAGE_CACHE_SHIFT) + offset;
- int nBytes = to - offset;
- int nWritten;
-
- unsigned spos = pos;
-- unsigned saddr = (unsigned)addr;
-+ unsigned saddr;
-+
-+ kva = kmap(pg);
-+ addr = kva + offset;
-+
-+ saddr = (unsigned) addr;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_commit_write addr %x pos %x nBytes %d\n", saddr,
-- spos, nBytes));
-+ ("yaffs_commit_write addr %x pos %x nBytes %d\n",
-+ saddr, spos, nBytes));
-
- nWritten = yaffs_file_write(f, addr, nBytes, &pos);
-
- if (nWritten != nBytes) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_commit_write not same size nWritten %d nBytes %d\n",
-- nWritten, nBytes));
-+ ("yaffs_commit_write not same size nWritten %d nBytes %d\n",
-+ nWritten, nBytes));
- SetPageError(pg);
- ClearPageUptodate(pg);
- } else {
- SetPageUptodate(pg);
- }
-
-+ kunmap(pg);
-+
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_commit_write returning %d\n",
-- nWritten == nBytes ? 0 : nWritten));
-+ ("yaffs_commit_write returning %d\n",
-+ nWritten == nBytes ? 0 : nWritten));
-
- return nWritten == nBytes ? 0 : nWritten;
--
- }
-+#endif
-+
-
--static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object * obj)
-+static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object *obj)
- {
- if (inode && obj) {
-
-
- /* Check mode against the variant type and attempt to repair if broken. */
-- __u32 mode = obj->yst_mode;
-- switch( obj->variantType ){
-- case YAFFS_OBJECT_TYPE_FILE :
-- if( ! S_ISREG(mode) ){
-- obj->yst_mode &= ~S_IFMT;
-- obj->yst_mode |= S_IFREG;
-- }
--
-- break;
-- case YAFFS_OBJECT_TYPE_SYMLINK :
-- if( ! S_ISLNK(mode) ){
-- obj->yst_mode &= ~S_IFMT;
-- obj->yst_mode |= S_IFLNK;
-- }
--
-- break;
-- case YAFFS_OBJECT_TYPE_DIRECTORY :
-- if( ! S_ISDIR(mode) ){
-- obj->yst_mode &= ~S_IFMT;
-- obj->yst_mode |= S_IFDIR;
-- }
--
-- break;
-- case YAFFS_OBJECT_TYPE_UNKNOWN :
-- case YAFFS_OBJECT_TYPE_HARDLINK :
-- case YAFFS_OBJECT_TYPE_SPECIAL :
-- default:
-- /* TODO? */
-- break;
-- }
-+ __u32 mode = obj->yst_mode;
-+ switch (obj->variantType) {
-+ case YAFFS_OBJECT_TYPE_FILE:
-+ if (!S_ISREG(mode)) {
-+ obj->yst_mode &= ~S_IFMT;
-+ obj->yst_mode |= S_IFREG;
-+ }
-+
-+ break;
-+ case YAFFS_OBJECT_TYPE_SYMLINK:
-+ if (!S_ISLNK(mode)) {
-+ obj->yst_mode &= ~S_IFMT;
-+ obj->yst_mode |= S_IFLNK;
-+ }
-+
-+ break;
-+ case YAFFS_OBJECT_TYPE_DIRECTORY:
-+ if (!S_ISDIR(mode)) {
-+ obj->yst_mode &= ~S_IFMT;
-+ obj->yst_mode |= S_IFDIR;
-+ }
-+
-+ break;
-+ case YAFFS_OBJECT_TYPE_UNKNOWN:
-+ case YAFFS_OBJECT_TYPE_HARDLINK:
-+ case YAFFS_OBJECT_TYPE_SPECIAL:
-+ default:
-+ /* TODO? */
-+ break;
-+ }
-+
-+ inode->i_flags |= S_NOATIME;
-
- inode->i_ino = obj->objectId;
- inode->i_mode = obj->yst_mode;
- inode->i_uid = obj->yst_uid;
- inode->i_gid = obj->yst_gid;
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
- inode->i_blksize = inode->i_sb->s_blocksize;
- #endif
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-
- inode->i_rdev = old_decode_dev(obj->yst_rdev);
- inode->i_atime.tv_sec = (time_t) (obj->yst_atime);
-@@ -781,26 +951,25 @@ static void yaffs_FillInodeFromObject(st
- inode->i_nlink = yaffs_GetObjectLinkCount(obj);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_FillInode mode %x uid %d gid %d size %d count %d\n",
-- inode->i_mode, inode->i_uid, inode->i_gid,
-- (int)inode->i_size, atomic_read(&inode->i_count)));
-+ ("yaffs_FillInode mode %x uid %d gid %d size %d count %d\n",
-+ inode->i_mode, inode->i_uid, inode->i_gid,
-+ (int)inode->i_size, atomic_read(&inode->i_count)));
-
- switch (obj->yst_mode & S_IFMT) {
- default: /* fifo, device or socket */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- init_special_inode(inode, obj->yst_mode,
-- old_decode_dev(obj->yst_rdev));
-+ old_decode_dev(obj->yst_rdev));
- #else
- init_special_inode(inode, obj->yst_mode,
-- (dev_t) (obj->yst_rdev));
-+ (dev_t) (obj->yst_rdev));
- #endif
- break;
- case S_IFREG: /* file */
- inode->i_op = &yaffs_file_inode_operations;
- inode->i_fop = &yaffs_file_operations;
- inode->i_mapping->a_ops =
-- &yaffs_file_address_operations;
-+ &yaffs_file_address_operations;
- break;
- case S_IFDIR: /* directory */
- inode->i_op = &yaffs_dir_inode_operations;
-@@ -817,34 +986,36 @@ static void yaffs_FillInodeFromObject(st
-
- } else {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_FileInode invalid parameters\n"));
-+ ("yaffs_FileInode invalid parameters\n"));
- }
-
- }
-
- struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev,
-- yaffs_Object * obj)
-+ yaffs_Object *obj)
- {
- struct inode *inode;
-
- if (!sb) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_get_inode for NULL super_block!!\n"));
-+ ("yaffs_get_inode for NULL super_block!!\n"));
- return NULL;
-
- }
-
- if (!obj) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_get_inode for NULL object!!\n"));
-+ ("yaffs_get_inode for NULL object!!\n"));
- return NULL;
-
- }
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_get_inode for object %d\n", obj->objectId));
-+ ("yaffs_get_inode for object %d\n", obj->objectId));
-
-- inode = iget(sb, obj->objectId);
-+ inode = Y_IGET(sb, obj->objectId);
-+ if (IS_ERR(inode))
-+ return NULL;
-
- /* NB Side effect: iget calls back to yaffs_read_inode(). */
- /* iget also increments the inode's i_count */
-@@ -854,7 +1025,7 @@ struct inode *yaffs_get_inode(struct sup
- }
-
- static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n,
-- loff_t * pos)
-+ loff_t *pos)
- {
- yaffs_Object *obj;
- int nWritten, ipos;
-@@ -869,28 +1040,26 @@ static ssize_t yaffs_file_write(struct f
-
- inode = f->f_dentry->d_inode;
-
-- if (!S_ISBLK(inode->i_mode) && f->f_flags & O_APPEND) {
-+ if (!S_ISBLK(inode->i_mode) && f->f_flags & O_APPEND)
- ipos = inode->i_size;
-- } else {
-+ else
- ipos = *pos;
-- }
-
-- if (!obj) {
-+ if (!obj)
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_file_write: hey obj is null!\n"));
-- } else {
-+ ("yaffs_file_write: hey obj is null!\n"));
-+ else
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_file_write about to write writing %d bytes"
-- "to object %d at %d\n",
-- n, obj->objectId, ipos));
-- }
-+ ("yaffs_file_write about to write writing %zu bytes"
-+ "to object %d at %d\n",
-+ n, obj->objectId, ipos));
-
- nWritten = yaffs_WriteDataToFile(obj, buf, ipos, n, 0);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_file_write writing %d bytes, %d written at %d\n",
-- n, nWritten, ipos));
-+ ("yaffs_file_write writing %zu bytes, %d written at %d\n",
-+ n, nWritten, ipos));
-+
- if (nWritten > 0) {
- ipos += nWritten;
- *pos = ipos;
-@@ -899,10 +1068,9 @@ static ssize_t yaffs_file_write(struct f
- inode->i_blocks = (ipos + 511) >> 9;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG
-- "yaffs_file_write size updated to %d bytes, "
-- "%d blocks\n",
-- ipos, (int)(inode->i_blocks)));
-+ ("yaffs_file_write size updated to %d bytes, "
-+ "%d blocks\n",
-+ ipos, (int)(inode->i_blocks)));
- }
-
- }
-@@ -910,13 +1078,54 @@ static ssize_t yaffs_file_write(struct f
- return nWritten == 0 ? -ENOSPC : nWritten;
- }
-
-+/* Space holding and freeing is done to ensure we have space available for write_begin/end */
-+/* For now we just assume few parallel writes and check against a small number. */
-+/* Todo: need to do this with a counter to handle parallel reads better */
-+
-+static ssize_t yaffs_hold_space(struct file *f)
-+{
-+ yaffs_Object *obj;
-+ yaffs_Device *dev;
-+
-+ int nFreeChunks;
-+
-+
-+ obj = yaffs_DentryToObject(f->f_dentry);
-+
-+ dev = obj->myDev;
-+
-+ yaffs_GrossLock(dev);
-+
-+ nFreeChunks = yaffs_GetNumberOfFreeChunks(dev);
-+
-+ yaffs_GrossUnlock(dev);
-+
-+ return (nFreeChunks > 20) ? 1 : 0;
-+}
-+
-+static void yaffs_release_space(struct file *f)
-+{
-+ yaffs_Object *obj;
-+ yaffs_Device *dev;
-+
-+
-+ obj = yaffs_DentryToObject(f->f_dentry);
-+
-+ dev = obj->myDev;
-+
-+ yaffs_GrossLock(dev);
-+
-+
-+ yaffs_GrossUnlock(dev);
-+}
-+
- static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir)
- {
- yaffs_Object *obj;
- yaffs_Device *dev;
- struct inode *inode = f->f_dentry->d_inode;
- unsigned long offset, curoffs;
-- struct list_head *i;
-+ struct ylist_head *i;
- yaffs_Object *l;
-
- char name[YAFFS_MAX_NAME_LENGTH + 1];
-@@ -932,24 +1141,20 @@ static int yaffs_readdir(struct file *f,
-
- if (offset == 0) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_readdir: entry . ino %d \n",
-- (int)inode->i_ino));
-- if (filldir(dirent, ".", 1, offset, inode->i_ino, DT_DIR)
-- < 0) {
-+ ("yaffs_readdir: entry . ino %d \n",
-+ (int)inode->i_ino));
-+ if (filldir(dirent, ".", 1, offset, inode->i_ino, DT_DIR) < 0)
- goto out;
-- }
- offset++;
- f->f_pos++;
- }
- if (offset == 1) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_readdir: entry .. ino %d \n",
-- (int)f->f_dentry->d_parent->d_inode->i_ino));
-- if (filldir
-- (dirent, "..", 2, offset,
-- f->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0) {
-+ ("yaffs_readdir: entry .. ino %d \n",
-+ (int)f->f_dentry->d_parent->d_inode->i_ino));
-+ if (filldir(dirent, "..", 2, offset,
-+ f->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0)
- goto out;
-- }
- offset++;
- f->f_pos++;
- }
-@@ -965,35 +1170,32 @@ static int yaffs_readdir(struct file *f,
- f->f_version = inode->i_version;
- }
-
-- list_for_each(i, &obj->variant.directoryVariant.children) {
-+ ylist_for_each(i, &obj->variant.directoryVariant.children) {
- curoffs++;
- if (curoffs >= offset) {
-- l = list_entry(i, yaffs_Object, siblings);
-+ l = ylist_entry(i, yaffs_Object, siblings);
-
- yaffs_GetObjectName(l, name,
- YAFFS_MAX_NAME_LENGTH + 1);
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_readdir: %s inode %d\n", name,
-+ ("yaffs_readdir: %s inode %d\n", name,
- yaffs_GetObjectInode(l)));
-
- if (filldir(dirent,
-- name,
-- strlen(name),
-- offset,
-- yaffs_GetObjectInode(l),
-- yaffs_GetObjectType(l))
-- < 0) {
-+ name,
-+ strlen(name),
-+ offset,
-+ yaffs_GetObjectInode(l),
-+ yaffs_GetObjectType(l)) < 0)
- goto up_and_out;
-- }
-
- offset++;
- f->f_pos++;
- }
- }
-
-- up_and_out:
-- out:
--
-+up_and_out:
-+out:
- yaffs_GrossUnlock(dev);
-
- return 0;
-@@ -1002,12 +1204,19 @@ static int yaffs_readdir(struct file *f,
- /*
- * File creation. Allocate an inode, and we're done..
- */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29)
-+#define YCRED(x) x
-+#else
-+#define YCRED(x) (x->cred)
-+#endif
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
-- dev_t rdev)
-+ dev_t rdev)
- #else
- static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
-- int rdev)
-+ int rdev)
- #endif
- {
- struct inode *inode;
-@@ -1018,25 +1227,25 @@ static int yaffs_mknod(struct inode *dir
- yaffs_Object *parent = yaffs_InodeToObject(dir);
-
- int error = -ENOSPC;
-- uid_t uid = current->fsuid;
-- gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid;
-+ uid_t uid = YCRED(current)->fsuid;
-+ gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid;
-
-- if((dir->i_mode & S_ISGID) && S_ISDIR(mode))
-+ if ((dir->i_mode & S_ISGID) && S_ISDIR(mode))
- mode |= S_ISGID;
-
- if (parent) {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod: parent object %d type %d\n",
-- parent->objectId, parent->variantType));
-+ ("yaffs_mknod: parent object %d type %d\n",
-+ parent->objectId, parent->variantType));
- } else {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod: could not get parent object\n"));
-+ ("yaffs_mknod: could not get parent object\n"));
- return -EPERM;
- }
-
- T(YAFFS_TRACE_OS, ("yaffs_mknod: making oject for %s, "
-- "mode %x dev %x\n",
-- dentry->d_name.name, mode, rdev));
-+ "mode %x dev %x\n",
-+ dentry->d_name.name, mode, rdev));
-
- dev = parent->myDev;
-
-@@ -1045,33 +1254,28 @@ static int yaffs_mknod(struct inode *dir
- switch (mode & S_IFMT) {
- default:
- /* Special (socket, fifo, device...) */
-- T(YAFFS_TRACE_OS, (KERN_DEBUG
-- "yaffs_mknod: making special\n"));
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-- obj =
-- yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid,
-- gid, old_encode_dev(rdev));
--#else
-- obj =
-- yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid,
-- gid, rdev);
-+ T(YAFFS_TRACE_OS, ("yaffs_mknod: making special\n"));
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
-+ obj = yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid,
-+ gid, old_encode_dev(rdev));
-+#else
-+ obj = yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid,
-+ gid, rdev);
- #endif
- break;
- case S_IFREG: /* file */
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_mknod: making file\n"));
-- obj =
-- yaffs_MknodFile(parent, dentry->d_name.name, mode, uid,
-- gid);
-+ T(YAFFS_TRACE_OS, ("yaffs_mknod: making file\n"));
-+ obj = yaffs_MknodFile(parent, dentry->d_name.name, mode, uid,
-+ gid);
- break;
- case S_IFDIR: /* directory */
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod: making directory\n"));
-- obj =
-- yaffs_MknodDirectory(parent, dentry->d_name.name, mode,
-- uid, gid);
-+ ("yaffs_mknod: making directory\n"));
-+ obj = yaffs_MknodDirectory(parent, dentry->d_name.name, mode,
-+ uid, gid);
- break;
- case S_IFLNK: /* symlink */
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_mknod: making file\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_mknod: making symlink\n"));
- obj = NULL; /* Do we ever get here? */
- break;
- }
-@@ -1083,12 +1287,12 @@ static int yaffs_mknod(struct inode *dir
- inode = yaffs_get_inode(dir->i_sb, mode, rdev, obj);
- d_instantiate(dentry, inode);
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod created object %d count = %d\n",
-- obj->objectId, atomic_read(&inode->i_count)));
-+ ("yaffs_mknod created object %d count = %d\n",
-+ obj->objectId, atomic_read(&inode->i_count)));
- error = 0;
- } else {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_mknod failed making object\n"));
-+ ("yaffs_mknod failed making object\n"));
- error = -ENOMEM;
- }
-
-@@ -1098,25 +1302,19 @@ static int yaffs_mknod(struct inode *dir
- static int yaffs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
- {
- int retVal;
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_mkdir\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_mkdir\n"));
- retVal = yaffs_mknod(dir, dentry, mode | S_IFDIR, 0);
--#if 0
-- /* attempt to fix dir bug - didn't work */
-- if (!retVal) {
-- dget(dentry);
-- }
--#endif
- return retVal;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode,
- struct nameidata *n)
- #else
- static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode)
- #endif
- {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_create\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_create\n"));
- return yaffs_mknod(dir, dentry, mode | S_IFREG, 0);
- }
-
-@@ -1127,8 +1325,8 @@ static int yaffs_unlink(struct inode *di
- yaffs_Device *dev;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_unlink %d:%s\n", (int)(dir->i_ino),
-- dentry->d_name.name));
-+ ("yaffs_unlink %d:%s\n", (int)(dir->i_ino),
-+ dentry->d_name.name));
-
- dev = yaffs_InodeToObject(dir)->myDev;
-
-@@ -1151,82 +1349,74 @@ static int yaffs_unlink(struct inode *di
- * Create a link...
- */
- static int yaffs_link(struct dentry *old_dentry, struct inode *dir,
-- struct dentry *dentry)
-+ struct dentry *dentry)
- {
- struct inode *inode = old_dentry->d_inode;
- yaffs_Object *obj = NULL;
- yaffs_Object *link = NULL;
- yaffs_Device *dev;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_link\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_link\n"));
-
- obj = yaffs_InodeToObject(inode);
- dev = obj->myDev;
-
- yaffs_GrossLock(dev);
-
-- if (!S_ISDIR(inode->i_mode)) /* Don't link directories */
-- {
-- link =
-- yaffs_Link(yaffs_InodeToObject(dir), dentry->d_name.name,
-- obj);
-- }
-+ if (!S_ISDIR(inode->i_mode)) /* Don't link directories */
-+ link = yaffs_Link(yaffs_InodeToObject(dir), dentry->d_name.name,
-+ obj);
-
- if (link) {
- old_dentry->d_inode->i_nlink = yaffs_GetObjectLinkCount(obj);
- d_instantiate(dentry, old_dentry->d_inode);
- atomic_inc(&old_dentry->d_inode->i_count);
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_link link count %d i_count %d\n",
-- old_dentry->d_inode->i_nlink,
-- atomic_read(&old_dentry->d_inode->i_count)));
--
-+ ("yaffs_link link count %d i_count %d\n",
-+ old_dentry->d_inode->i_nlink,
-+ atomic_read(&old_dentry->d_inode->i_count)));
- }
-
- yaffs_GrossUnlock(dev);
-
-- if (link) {
--
-+ if (link)
- return 0;
-- }
-
- return -EPERM;
- }
-
- static int yaffs_symlink(struct inode *dir, struct dentry *dentry,
-- const char *symname)
-+ const char *symname)
- {
- yaffs_Object *obj;
- yaffs_Device *dev;
-- uid_t uid = current->fsuid;
-- gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid;
-+ uid_t uid = YCRED(current)->fsuid;
-+ gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_symlink\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_symlink\n"));
-
- dev = yaffs_InodeToObject(dir)->myDev;
- yaffs_GrossLock(dev);
- obj = yaffs_MknodSymLink(yaffs_InodeToObject(dir), dentry->d_name.name,
-- S_IFLNK | S_IRWXUGO, uid, gid, symname);
-+ S_IFLNK | S_IRWXUGO, uid, gid, symname);
- yaffs_GrossUnlock(dev);
-
- if (obj) {
--
- struct inode *inode;
-
- inode = yaffs_get_inode(dir->i_sb, obj->yst_mode, 0, obj);
- d_instantiate(dentry, inode);
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "symlink created OK\n"));
-+ T(YAFFS_TRACE_OS, ("symlink created OK\n"));
- return 0;
- } else {
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "symlink not created\n"));
--
-+ T(YAFFS_TRACE_OS, ("symlink not created\n"));
- }
-
- return -ENOMEM;
- }
-
- static int yaffs_sync_object(struct file *file, struct dentry *dentry,
-- int datasync)
-+ int datasync)
- {
-
- yaffs_Object *obj;
-@@ -1236,7 +1426,7 @@ static int yaffs_sync_object(struct file
-
- dev = obj->myDev;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_sync_object\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_sync_object\n"));
- yaffs_GrossLock(dev);
- yaffs_FlushFile(obj, 1);
- yaffs_GrossUnlock(dev);
-@@ -1255,41 +1445,36 @@ static int yaffs_rename(struct inode *ol
- int retVal = YAFFS_FAIL;
- yaffs_Object *target;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_rename\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_rename\n"));
- dev = yaffs_InodeToObject(old_dir)->myDev;
-
- yaffs_GrossLock(dev);
-
- /* Check if the target is an existing directory that is not empty. */
-- target =
-- yaffs_FindObjectByName(yaffs_InodeToObject(new_dir),
-- new_dentry->d_name.name);
-+ target = yaffs_FindObjectByName(yaffs_InodeToObject(new_dir),
-+ new_dentry->d_name.name);
-
-
-
-- if (target &&
-- target->variantType == YAFFS_OBJECT_TYPE_DIRECTORY &&
-- !list_empty(&target->variant.directoryVariant.children)) {
-+ if (target && target->variantType == YAFFS_OBJECT_TYPE_DIRECTORY &&
-+ !ylist_empty(&target->variant.directoryVariant.children)) {
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "target is non-empty dir\n"));
-+ T(YAFFS_TRACE_OS, ("target is non-empty dir\n"));
-
- retVal = YAFFS_FAIL;
- } else {
--
- /* Now does unlinking internally using shadowing mechanism */
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "calling yaffs_RenameObject\n"));
--
-- retVal =
-- yaffs_RenameObject(yaffs_InodeToObject(old_dir),
-- old_dentry->d_name.name,
-- yaffs_InodeToObject(new_dir),
-- new_dentry->d_name.name);
-+ T(YAFFS_TRACE_OS, ("calling yaffs_RenameObject\n"));
-
-+ retVal = yaffs_RenameObject(yaffs_InodeToObject(old_dir),
-+ old_dentry->d_name.name,
-+ yaffs_InodeToObject(new_dir),
-+ new_dentry->d_name.name);
- }
- yaffs_GrossUnlock(dev);
-
- if (retVal == YAFFS_OK) {
-- if(target) {
-+ if (target) {
- new_dentry->d_inode->i_nlink--;
- mark_inode_dirty(new_dentry->d_inode);
- }
-@@ -1298,7 +1483,6 @@ static int yaffs_rename(struct inode *ol
- } else {
- return -ENOTEMPTY;
- }
--
- }
-
- static int yaffs_setattr(struct dentry *dentry, struct iattr *attr)
-@@ -1308,15 +1492,15 @@ static int yaffs_setattr(struct dentry *
- yaffs_Device *dev;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_setattr of object %d\n",
-- yaffs_InodeToObject(inode)->objectId));
--
-- if ((error = inode_change_ok(inode, attr)) == 0) {
-+ ("yaffs_setattr of object %d\n",
-+ yaffs_InodeToObject(inode)->objectId));
-
-+ error = inode_change_ok(inode, attr);
-+ if (error == 0) {
- dev = yaffs_InodeToObject(inode)->myDev;
- yaffs_GrossLock(dev);
- if (yaffs_SetAttributes(yaffs_InodeToObject(inode), attr) ==
-- YAFFS_OK) {
-+ YAFFS_OK) {
- error = 0;
- } else {
- error = -EPERM;
-@@ -1328,12 +1512,12 @@ static int yaffs_setattr(struct dentry *
- return error;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_statfs(struct dentry *dentry, struct kstatfs *buf)
- {
- yaffs_Device *dev = yaffs_DentryToObject(dentry)->myDev;
- struct super_block *sb = dentry->d_sb;
--#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_statfs(struct super_block *sb, struct kstatfs *buf)
- {
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-@@ -1343,32 +1527,53 @@ static int yaffs_statfs(struct super_blo
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
- #endif
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_statfs\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_statfs\n"));
-
- yaffs_GrossLock(dev);
-
- buf->f_type = YAFFS_MAGIC;
- buf->f_bsize = sb->s_blocksize;
- buf->f_namelen = 255;
-- if (sb->s_blocksize > dev->nDataBytesPerChunk) {
-+
-+ if (dev->nDataBytesPerChunk & (dev->nDataBytesPerChunk - 1)) {
-+ /* Do this if chunk size is not a power of 2 */
-+
-+ uint64_t bytesInDev;
-+ uint64_t bytesFree;
-+
-+ bytesInDev = ((uint64_t)((dev->endBlock - dev->startBlock + 1))) *
-+ ((uint64_t)(dev->nChunksPerBlock * dev->nDataBytesPerChunk));
-+
-+ do_div(bytesInDev, sb->s_blocksize); /* bytesInDev becomes the number of blocks */
-+ buf->f_blocks = bytesInDev;
-+
-+ bytesFree = ((uint64_t)(yaffs_GetNumberOfFreeChunks(dev))) *
-+ ((uint64_t)(dev->nDataBytesPerChunk));
-+
-+ do_div(bytesFree, sb->s_blocksize);
-+
-+ buf->f_bfree = bytesFree;
-+
-+ } else if (sb->s_blocksize > dev->nDataBytesPerChunk) {
-
- buf->f_blocks =
-- (dev->endBlock - dev->startBlock +
-- 1) * dev->nChunksPerBlock / (sb->s_blocksize /
-- dev->nDataBytesPerChunk);
-+ (dev->endBlock - dev->startBlock + 1) *
-+ dev->nChunksPerBlock /
-+ (sb->s_blocksize / dev->nDataBytesPerChunk);
- buf->f_bfree =
-- yaffs_GetNumberOfFreeChunks(dev) / (sb->s_blocksize /
-- dev->nDataBytesPerChunk);
-+ yaffs_GetNumberOfFreeChunks(dev) /
-+ (sb->s_blocksize / dev->nDataBytesPerChunk);
- } else {
--
- buf->f_blocks =
-- (dev->endBlock - dev->startBlock +
-- 1) * dev->nChunksPerBlock * (dev->nDataBytesPerChunk /
-- sb->s_blocksize);
-+ (dev->endBlock - dev->startBlock + 1) *
-+ dev->nChunksPerBlock *
-+ (dev->nDataBytesPerChunk / sb->s_blocksize);
-+
- buf->f_bfree =
-- yaffs_GetNumberOfFreeChunks(dev) * (dev->nDataBytesPerChunk /
-- sb->s_blocksize);
-+ yaffs_GetNumberOfFreeChunks(dev) *
-+ (dev->nDataBytesPerChunk / sb->s_blocksize);
- }
-+
- buf->f_files = 0;
- buf->f_ffree = 0;
- buf->f_bavail = buf->f_bfree;
-@@ -1378,18 +1583,19 @@ static int yaffs_statfs(struct super_blo
- }
-
-
--/**
- static int yaffs_do_sync_fs(struct super_block *sb)
- {
-
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_do_sync_fs\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_do_sync_fs\n"));
-
-- if(sb->s_dirt) {
-+ if (sb->s_dirt) {
- yaffs_GrossLock(dev);
-
-- if(dev)
-+ if (dev) {
-+ yaffs_FlushEntireDeviceCache(dev);
- yaffs_CheckpointSave(dev);
-+ }
-
- yaffs_GrossUnlock(dev);
-
-@@ -1397,35 +1603,73 @@ static int yaffs_do_sync_fs(struct super
- }
- return 0;
- }
--**/
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static void yaffs_write_super(struct super_block *sb)
- #else
- static int yaffs_write_super(struct super_block *sb)
- #endif
- {
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_write_super\n"));
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18))
-- return 0; /* yaffs_do_sync_fs(sb);*/
-+ T(YAFFS_TRACE_OS, ("yaffs_write_super\n"));
-+ if (yaffs_auto_checkpoint >= 2)
-+ yaffs_do_sync_fs(sb);
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
-+ return 0;
- #endif
- }
-
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_sync_fs(struct super_block *sb, int wait)
- #else
- static int yaffs_sync_fs(struct super_block *sb)
- #endif
- {
-+ T(YAFFS_TRACE_OS, ("yaffs_sync_fs\n"));
-+
-+ if (yaffs_auto_checkpoint >= 1)
-+ yaffs_do_sync_fs(sb);
-+
-+ return 0;
-+}
-+
-+#ifdef YAFFS_USE_OWN_IGET
-+
-+static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino)
-+{
-+ struct inode *inode;
-+ yaffs_Object *obj;
-+ yaffs_Device *dev = yaffs_SuperToDevice(sb);
-+
-+ T(YAFFS_TRACE_OS,
-+ ("yaffs_iget for %lu\n", ino));
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_sync_fs\n"));
-+ inode = iget_locked(sb, ino);
-+ if (!inode)
-+ return ERR_PTR(-ENOMEM);
-+ if (!(inode->i_state & I_NEW))
-+ return inode;
-+
-+ /* NB This is called as a side effect of other functions, but
-+ * we had to release the lock to prevent deadlocks, so
-+ * need to lock again.
-+ */
-
-- return 0; /* yaffs_do_sync_fs(sb);*/
-+ yaffs_GrossLock(dev);
-
-+ obj = yaffs_FindObjectByNumber(dev, inode->i_ino);
-+
-+ yaffs_FillInodeFromObject(inode, obj);
-+
-+ yaffs_GrossUnlock(dev);
-+
-+ unlock_new_inode(inode);
-+ return inode;
- }
-
-+#else
-
- static void yaffs_read_inode(struct inode *inode)
- {
-@@ -1438,7 +1682,7 @@ static void yaffs_read_inode(struct inod
- yaffs_Device *dev = yaffs_SuperToDevice(inode->i_sb);
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_read_inode for %d\n", (int)inode->i_ino));
-+ ("yaffs_read_inode for %d\n", (int)inode->i_ino));
-
- yaffs_GrossLock(dev);
-
-@@ -1449,18 +1693,20 @@ static void yaffs_read_inode(struct inod
- yaffs_GrossUnlock(dev);
- }
-
--static LIST_HEAD(yaffs_dev_list);
-+#endif
-+
-+static YLIST_HEAD(yaffs_dev_list);
-
--#if 0 // not used
-+#if 0 /* not used */
- static int yaffs_remount_fs(struct super_block *sb, int *flags, char *data)
- {
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-
-- if( *flags & MS_RDONLY ) {
-+ if (*flags & MS_RDONLY) {
- struct mtd_info *mtd = yaffs_SuperToDevice(sb)->genericDevice;
-
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_remount_fs: %s: RO\n", dev->name ));
-+ ("yaffs_remount_fs: %s: RO\n", dev->name));
-
- yaffs_GrossLock(dev);
-
-@@ -1472,10 +1718,9 @@ static int yaffs_remount_fs(struct super
- mtd->sync(mtd);
-
- yaffs_GrossUnlock(dev);
-- }
-- else {
-+ } else {
- T(YAFFS_TRACE_OS,
-- (KERN_DEBUG "yaffs_remount_fs: %s: RW\n", dev->name ));
-+ ("yaffs_remount_fs: %s: RW\n", dev->name));
- }
-
- return 0;
-@@ -1486,7 +1731,7 @@ static void yaffs_put_super(struct super
- {
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_put_super\n"));
-+ T(YAFFS_TRACE_OS, ("yaffs_put_super\n"));
-
- yaffs_GrossLock(dev);
-
-@@ -1494,18 +1739,17 @@ static void yaffs_put_super(struct super
-
- yaffs_CheckpointSave(dev);
-
-- if (dev->putSuperFunc) {
-+ if (dev->putSuperFunc)
- dev->putSuperFunc(sb);
-- }
-
- yaffs_Deinitialise(dev);
-
- yaffs_GrossUnlock(dev);
-
- /* we assume this is protected by lock_kernel() in mount/umount */
-- list_del(&dev->devList);
-+ ylist_del(&dev->devList);
-
-- if(dev->spareBuffer){
-+ if (dev->spareBuffer) {
- YFREE(dev->spareBuffer);
- dev->spareBuffer = NULL;
- }
-@@ -1516,12 +1760,10 @@ static void yaffs_put_super(struct super
-
- static void yaffs_MTDPutSuper(struct super_block *sb)
- {
--
- struct mtd_info *mtd = yaffs_SuperToDevice(sb)->genericDevice;
-
-- if (mtd->sync) {
-+ if (mtd->sync)
- mtd->sync(mtd);
-- }
-
- put_mtd_device(mtd);
- }
-@@ -1531,9 +1773,9 @@ static void yaffs_MarkSuperBlockDirty(vo
- {
- struct super_block *sb = (struct super_block *)vsb;
-
-- T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_MarkSuperBlockDirty() sb = %p\n",sb));
--// if(sb)
--// sb->s_dirt = 1;
-+ T(YAFFS_TRACE_OS, ("yaffs_MarkSuperBlockDirty() sb = %p\n", sb));
-+ if (sb)
-+ sb->s_dirt = 1;
- }
-
- typedef struct {
-@@ -1546,48 +1788,48 @@ typedef struct {
- #define MAX_OPT_LEN 20
- static int yaffs_parse_options(yaffs_options *options, const char *options_str)
- {
-- char cur_opt[MAX_OPT_LEN+1];
-+ char cur_opt[MAX_OPT_LEN + 1];
- int p;
- int error = 0;
-
- /* Parse through the options which is a comma seperated list */
-
-- while(options_str && *options_str && !error){
-- memset(cur_opt,0,MAX_OPT_LEN+1);
-+ while (options_str && *options_str && !error) {
-+ memset(cur_opt, 0, MAX_OPT_LEN + 1);
- p = 0;
-
-- while(*options_str && *options_str != ','){
-- if(p < MAX_OPT_LEN){
-+ while (*options_str && *options_str != ',') {
-+ if (p < MAX_OPT_LEN) {
- cur_opt[p] = *options_str;
- p++;
- }
- options_str++;
- }
-
-- if(!strcmp(cur_opt,"inband-tags"))
-+ if (!strcmp(cur_opt, "inband-tags"))
- options->inband_tags = 1;
-- else if(!strcmp(cur_opt,"no-cache"))
-+ else if (!strcmp(cur_opt, "no-cache"))
- options->no_cache = 1;
-- else if(!strcmp(cur_opt,"no-checkpoint-read"))
-+ else if (!strcmp(cur_opt, "no-checkpoint-read"))
- options->skip_checkpoint_read = 1;
-- else if(!strcmp(cur_opt,"no-checkpoint-write"))
-+ else if (!strcmp(cur_opt, "no-checkpoint-write"))
- options->skip_checkpoint_write = 1;
-- else if(!strcmp(cur_opt,"no-checkpoint")){
-+ else if (!strcmp(cur_opt, "no-checkpoint")) {
- options->skip_checkpoint_read = 1;
- options->skip_checkpoint_write = 1;
- } else {
-- printk(KERN_INFO "yaffs: Bad mount option \"%s\"\n",cur_opt);
-+ printk(KERN_INFO "yaffs: Bad mount option \"%s\"\n",
-+ cur_opt);
- error = 1;
- }
--
- }
-
- return error;
- }
-
- static struct super_block *yaffs_internal_read_super(int yaffsVersion,
-- struct super_block *sb,
-- void *data, int silent)
-+ struct super_block *sb,
-+ void *data, int silent)
- {
- int nBlocks;
- struct inode *inode = NULL;
-@@ -1602,6 +1844,7 @@ static struct super_block *yaffs_interna
-
- sb->s_magic = YAFFS_MAGIC;
- sb->s_op = &yaffs_super_ops;
-+ sb->s_flags |= MS_NOATIME;
-
- if (!sb)
- printk(KERN_INFO "yaffs: sb is NULL\n");
-@@ -1614,14 +1857,14 @@ static struct super_block *yaffs_interna
- sb->s_dev,
- yaffs_devname(sb, devname_buf));
-
-- if(!data_str)
-+ if (!data_str)
- data_str = "";
-
-- printk(KERN_INFO "yaffs: passed flags \"%s\"\n",data_str);
-+ printk(KERN_INFO "yaffs: passed flags \"%s\"\n", data_str);
-
-- memset(&options,0,sizeof(options));
-+ memset(&options, 0, sizeof(options));
-
-- if(yaffs_parse_options(&options,data_str)){
-+ if (yaffs_parse_options(&options, data_str)) {
- /* Option parsing failed */
- return NULL;
- }
-@@ -1645,9 +1888,9 @@ static struct super_block *yaffs_interna
- yaffs_devname(sb, devname_buf)));
-
- /* Check it's an mtd device..... */
-- if (MAJOR(sb->s_dev) != MTD_BLOCK_MAJOR) {
-+ if (MAJOR(sb->s_dev) != MTD_BLOCK_MAJOR)
- return NULL; /* This isn't an mtd device */
-- }
-+
- /* Get the device */
- mtd = get_mtd_device(NULL, MINOR(sb->s_dev));
- if (!mtd) {
-@@ -1673,29 +1916,23 @@ static struct super_block *yaffs_interna
- T(YAFFS_TRACE_OS, (" %s %d\n", WRITE_SIZE_STR, WRITE_SIZE(mtd)));
- T(YAFFS_TRACE_OS, (" oobsize %d\n", mtd->oobsize));
- T(YAFFS_TRACE_OS, (" erasesize %d\n", mtd->erasesize));
-- T(YAFFS_TRACE_OS, (" size %d\n", mtd->size));
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29)
-+ T(YAFFS_TRACE_OS, (" size %u\n", mtd->size));
-+#else
-+ T(YAFFS_TRACE_OS, (" size %lld\n", mtd->size));
-+#endif
-
- #ifdef CONFIG_YAFFS_AUTO_YAFFS2
-
-- if (yaffsVersion == 1 &&
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- mtd->writesize >= 2048) {
--#else
-- mtd->oobblock >= 2048) {
--#endif
-- T(YAFFS_TRACE_ALWAYS,("yaffs: auto selecting yaffs2\n"));
-- yaffsVersion = 2;
-+ if (yaffsVersion == 1 && WRITE_SIZE(mtd) >= 2048) {
-+ T(YAFFS_TRACE_ALWAYS, ("yaffs: auto selecting yaffs2\n"));
-+ yaffsVersion = 2;
- }
-
- /* Added NCB 26/5/2006 for completeness */
-- if (yaffsVersion == 2 &&
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- mtd->writesize == 512) {
--#else
-- mtd->oobblock == 512) {
--#endif
-- T(YAFFS_TRACE_ALWAYS,("yaffs: auto selecting yaffs1\n"));
-- yaffsVersion = 1;
-+ if (yaffsVersion == 2 && !options.inband_tags && WRITE_SIZE(mtd) == 512) {
-+ T(YAFFS_TRACE_ALWAYS, ("yaffs: auto selecting yaffs1\n"));
-+ yaffsVersion = 1;
- }
-
- #endif
-@@ -1707,7 +1944,7 @@ static struct super_block *yaffs_interna
- !mtd->block_markbad ||
- !mtd->read ||
- !mtd->write ||
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- !mtd->read_oob || !mtd->write_oob) {
- #else
- !mtd->write_ecc ||
-@@ -1719,12 +1956,9 @@ static struct super_block *yaffs_interna
- return NULL;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- if (mtd->writesize < YAFFS_MIN_YAFFS2_CHUNK_SIZE ||
--#else
-- if (mtd->oobblock < YAFFS_MIN_YAFFS2_CHUNK_SIZE ||
--#endif
-- mtd->oobsize < YAFFS_MIN_YAFFS2_SPARE_SIZE) {
-+ if ((WRITE_SIZE(mtd) < YAFFS_MIN_YAFFS2_CHUNK_SIZE ||
-+ mtd->oobsize < YAFFS_MIN_YAFFS2_SPARE_SIZE) &&
-+ !options.inband_tags) {
- T(YAFFS_TRACE_ALWAYS,
- ("yaffs: MTD device does not have the "
- "right page sizes\n"));
-@@ -1735,7 +1969,7 @@ static struct super_block *yaffs_interna
- if (!mtd->erase ||
- !mtd->read ||
- !mtd->write ||
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- !mtd->read_oob || !mtd->write_oob) {
- #else
- !mtd->write_ecc ||
-@@ -1761,7 +1995,7 @@ static struct super_block *yaffs_interna
- * Set the yaffs_Device up for mtd
- */
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- sb->s_fs_info = dev = kmalloc(sizeof(yaffs_Device), GFP_KERNEL);
- #else
- sb->u.generic_sbp = dev = kmalloc(sizeof(yaffs_Device), GFP_KERNEL);
-@@ -1780,13 +2014,15 @@ static struct super_block *yaffs_interna
-
- /* Set up the memory size parameters.... */
-
-- nBlocks = mtd->size / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
-+ nBlocks = YCALCBLOCKS(mtd->size, (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK));
-+
- dev->startBlock = 0;
- dev->endBlock = nBlocks - 1;
- dev->nChunksPerBlock = YAFFS_CHUNKS_PER_BLOCK;
-- dev->nDataBytesPerChunk = YAFFS_BYTES_PER_CHUNK;
-+ dev->totalBytesPerChunk = YAFFS_BYTES_PER_CHUNK;
- dev->nReservedBlocks = 5;
- dev->nShortOpCaches = (options.no_cache) ? 0 : 10;
-+ dev->inbandTags = options.inband_tags;
-
- /* ... and the functions. */
- if (yaffsVersion == 2) {
-@@ -1798,20 +2034,19 @@ static struct super_block *yaffs_interna
- dev->queryNANDBlock = nandmtd2_QueryNANDBlock;
- dev->spareBuffer = YMALLOC(mtd->oobsize);
- dev->isYaffs2 = 1;
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- dev->nDataBytesPerChunk = mtd->writesize;
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
-+ dev->totalBytesPerChunk = mtd->writesize;
- dev->nChunksPerBlock = mtd->erasesize / mtd->writesize;
- #else
-- dev->nDataBytesPerChunk = mtd->oobblock;
-+ dev->totalBytesPerChunk = mtd->oobblock;
- dev->nChunksPerBlock = mtd->erasesize / mtd->oobblock;
- #endif
-- nBlocks = mtd->size / mtd->erasesize;
-+ nBlocks = YCALCBLOCKS(mtd->size, mtd->erasesize);
-
-- dev->nCheckpointReservedBlocks = CONFIG_YAFFS_CHECKPOINT_RESERVED_BLOCKS;
- dev->startBlock = 0;
- dev->endBlock = nBlocks - 1;
- } else {
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- /* use the MTD interface in yaffs_mtdif1.c */
- dev->writeChunkWithTagsToNAND =
- nandmtd1_WriteChunkWithTagsToNAND;
-@@ -1847,7 +2082,7 @@ static struct super_block *yaffs_interna
- dev->skipCheckpointWrite = options.skip_checkpoint_write;
-
- /* we assume this is protected by lock_kernel() in mount/umount */
-- list_add_tail(&dev->devList, &yaffs_dev_list);
-+ ylist_add_tail(&dev->devList, &yaffs_dev_list);
-
- init_MUTEX(&dev->grossLock);
-
-@@ -1884,20 +2119,23 @@ static struct super_block *yaffs_interna
- return NULL;
- }
- sb->s_root = root;
-+ sb->s_dirt = !dev->isCheckpointed;
-+ T(YAFFS_TRACE_ALWAYS,
-+ ("yaffs_read_super: isCheckpointed %d\n", dev->isCheckpointed));
-
- T(YAFFS_TRACE_OS, ("yaffs_read_super: done\n"));
- return sb;
- }
-
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs_internal_read_super_mtd(struct super_block *sb, void *data,
- int silent)
- {
- return yaffs_internal_read_super(1, sb, data, silent) ? 0 : -EINVAL;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs_read_super(struct file_system_type *fs,
- int flags, const char *dev_name,
- void *data, struct vfsmount *mnt)
-@@ -1938,14 +2176,14 @@ static DECLARE_FSTYPE(yaffs_fs_type, "ya
-
- #ifdef CONFIG_YAFFS_YAFFS2
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- static int yaffs2_internal_read_super_mtd(struct super_block *sb, void *data,
- int silent)
- {
- return yaffs_internal_read_super(2, sb, data, silent) ? 0 : -EINVAL;
- }
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
- static int yaffs2_read_super(struct file_system_type *fs,
- int flags, const char *dev_name, void *data,
- struct vfsmount *mnt)
-@@ -1990,12 +2228,12 @@ static char *yaffs_dump_dev(char *buf, y
- {
- buf += sprintf(buf, "startBlock......... %d\n", dev->startBlock);
- buf += sprintf(buf, "endBlock........... %d\n", dev->endBlock);
-+ buf += sprintf(buf, "totalBytesPerChunk. %d\n", dev->totalBytesPerChunk);
- buf += sprintf(buf, "nDataBytesPerChunk. %d\n", dev->nDataBytesPerChunk);
- buf += sprintf(buf, "chunkGroupBits..... %d\n", dev->chunkGroupBits);
- buf += sprintf(buf, "chunkGroupSize..... %d\n", dev->chunkGroupSize);
- buf += sprintf(buf, "nErasedBlocks...... %d\n", dev->nErasedBlocks);
- buf += sprintf(buf, "nReservedBlocks.... %d\n", dev->nReservedBlocks);
-- buf += sprintf(buf, "nCheckptResBlocks.. %d\n", dev->nCheckpointReservedBlocks);
- buf += sprintf(buf, "blocksInCheckpoint. %d\n", dev->blocksInCheckpoint);
- buf += sprintf(buf, "nTnodesCreated..... %d\n", dev->nTnodesCreated);
- buf += sprintf(buf, "nFreeTnodes........ %d\n", dev->nFreeTnodes);
-@@ -2006,10 +2244,8 @@ static char *yaffs_dump_dev(char *buf, y
- buf += sprintf(buf, "nPageReads......... %d\n", dev->nPageReads);
- buf += sprintf(buf, "nBlockErasures..... %d\n", dev->nBlockErasures);
- buf += sprintf(buf, "nGCCopies.......... %d\n", dev->nGCCopies);
-- buf +=
-- sprintf(buf, "garbageCollections. %d\n", dev->garbageCollections);
-- buf +=
-- sprintf(buf, "passiveGCs......... %d\n",
-+ buf += sprintf(buf, "garbageCollections. %d\n", dev->garbageCollections);
-+ buf += sprintf(buf, "passiveGCs......... %d\n",
- dev->passiveGarbageCollections);
- buf += sprintf(buf, "nRetriedWrites..... %d\n", dev->nRetriedWrites);
- buf += sprintf(buf, "nShortOpCaches..... %d\n", dev->nShortOpCaches);
-@@ -2025,6 +2261,7 @@ static char *yaffs_dump_dev(char *buf, y
- sprintf(buf, "nBackgroudDeletions %d\n", dev->nBackgroundDeletions);
- buf += sprintf(buf, "useNANDECC......... %d\n", dev->useNANDECC);
- buf += sprintf(buf, "isYaffs2........... %d\n", dev->isYaffs2);
-+ buf += sprintf(buf, "inbandTags......... %d\n", dev->inbandTags);
-
- return buf;
- }
-@@ -2033,7 +2270,7 @@ static int yaffs_proc_read(char *page,
- char **start,
- off_t offset, int count, int *eof, void *data)
- {
-- struct list_head *item;
-+ struct ylist_head *item;
- char *buf = page;
- int step = offset;
- int n = 0;
-@@ -2057,8 +2294,8 @@ static int yaffs_proc_read(char *page,
- lock_kernel();
-
- /* Locate and print the Nth entry. Order N-squared but N is small. */
-- list_for_each(item, &yaffs_dev_list) {
-- yaffs_Device *dev = list_entry(item, yaffs_Device, devList);
-+ ylist_for_each(item, &yaffs_dev_list) {
-+ yaffs_Device *dev = ylist_entry(item, yaffs_Device, devList);
- if (n < step) {
- n++;
- continue;
-@@ -2119,7 +2356,7 @@ static int yaffs_proc_write(struct file
- char *end;
- char *mask_name;
- const char *x;
-- char substring[MAX_MASK_NAME_LENGTH+1];
-+ char substring[MAX_MASK_NAME_LENGTH + 1];
- int i;
- int done = 0;
- int add, len = 0;
-@@ -2129,9 +2366,8 @@ static int yaffs_proc_write(struct file
-
- while (!done && (pos < count)) {
- done = 1;
-- while ((pos < count) && isspace(buf[pos])) {
-+ while ((pos < count) && isspace(buf[pos]))
- pos++;
-- }
-
- switch (buf[pos]) {
- case '+':
-@@ -2148,20 +2384,21 @@ static int yaffs_proc_write(struct file
- mask_name = NULL;
-
- mask_bitfield = simple_strtoul(buf + pos, &end, 0);
-+
- if (end > buf + pos) {
- mask_name = "numeral";
- len = end - (buf + pos);
- pos += len;
- done = 0;
- } else {
-- for(x = buf + pos, i = 0;
-- (*x == '_' || (*x >='a' && *x <= 'z')) &&
-- i <MAX_MASK_NAME_LENGTH; x++, i++, pos++)
-- substring[i] = *x;
-+ for (x = buf + pos, i = 0;
-+ (*x == '_' || (*x >= 'a' && *x <= 'z')) &&
-+ i < MAX_MASK_NAME_LENGTH; x++, i++, pos++)
-+ substring[i] = *x;
- substring[i] = '\0';
-
- for (i = 0; mask_flags[i].mask_name != NULL; i++) {
-- if(strcmp(substring,mask_flags[i].mask_name) == 0){
-+ if (strcmp(substring, mask_flags[i].mask_name) == 0) {
- mask_name = mask_flags[i].mask_name;
- mask_bitfield = mask_flags[i].mask_bitfield;
- done = 0;
-@@ -2172,7 +2409,7 @@ static int yaffs_proc_write(struct file
-
- if (mask_name != NULL) {
- done = 0;
-- switch(add) {
-+ switch (add) {
- case '-':
- rg &= ~mask_bitfield;
- break;
-@@ -2191,13 +2428,13 @@ static int yaffs_proc_write(struct file
-
- yaffs_traceMask = rg | YAFFS_TRACE_ALWAYS;
-
-- printk("new trace = 0x%08X\n",yaffs_traceMask);
-+ printk(KERN_DEBUG "new trace = 0x%08X\n", yaffs_traceMask);
-
- if (rg & YAFFS_TRACE_ALWAYS) {
- for (i = 0; mask_flags[i].mask_name != NULL; i++) {
- char flag;
- flag = ((rg & mask_flags[i].mask_bitfield) == mask_flags[i].mask_bitfield) ? '+' : '-';
-- printk("%c%s\n", flag, mask_flags[i].mask_name);
-+ printk(KERN_DEBUG "%c%s\n", flag, mask_flags[i].mask_name);
- }
- }
-
-@@ -2211,12 +2448,8 @@ struct file_system_to_install {
- };
-
- static struct file_system_to_install fs_to_install[] = {
--//#ifdef CONFIG_YAFFS_YAFFS1
- {&yaffs_fs_type, 0},
--//#endif
--//#ifdef CONFIG_YAFFS_YAFFS2
- {&yaffs2_fs_type, 0},
--//#endif
- {NULL, 0}
- };
-
-@@ -2231,15 +2464,14 @@ static int __init init_yaffs_fs(void)
- /* Install the proc_fs entry */
- my_proc_entry = create_proc_entry("yaffs",
- S_IRUGO | S_IFREG,
-- &proc_root);
-+ YPROC_ROOT);
-
- if (my_proc_entry) {
- my_proc_entry->write_proc = yaffs_proc_write;
- my_proc_entry->read_proc = yaffs_proc_read;
- my_proc_entry->data = NULL;
-- } else {
-+ } else
- return -ENOMEM;
-- }
-
- /* Now add the file system entries */
-
-@@ -2247,9 +2479,8 @@ static int __init init_yaffs_fs(void)
-
- while (fsinst->fst && !error) {
- error = register_filesystem(fsinst->fst);
-- if (!error) {
-+ if (!error)
- fsinst->installed = 1;
-- }
- fsinst++;
- }
-
-@@ -2277,7 +2508,7 @@ static void __exit exit_yaffs_fs(void)
- T(YAFFS_TRACE_ALWAYS, ("yaffs " __DATE__ " " __TIME__
- " removing. \n"));
-
-- remove_proc_entry("yaffs", &proc_root);
-+ remove_proc_entry("yaffs", YPROC_ROOT);
-
- fsinst = fs_to_install;
-
-@@ -2288,7 +2519,6 @@ static void __exit exit_yaffs_fs(void)
- }
- fsinst++;
- }
--
- }
-
- module_init(init_yaffs_fs)
---- /dev/null
-+++ b/fs/yaffs2/yaffs_getblockinfo.h
-@@ -0,0 +1,34 @@
-+/*
-+ * YAFFS: Yet another Flash File System . A NAND-flash specific file system.
-+ *
-+ * Copyright (C) 2002-2007 Aleph One Ltd.
-+ * for Toby Churchill Ltd and Brightstar Engineering
-+ *
-+ * Created by Charles Manning <charles@aleph1.co.uk>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU Lesser General Public License version 2.1 as
-+ * published by the Free Software Foundation.
-+ *
-+ * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
-+ */
-+
-+#ifndef __YAFFS_GETBLOCKINFO_H__
-+#define __YAFFS_GETBLOCKINFO_H__
-+
-+#include "yaffs_guts.h"
-+
-+/* Function to manipulate block info */
-+static Y_INLINE yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blk)
-+{
-+ if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) {
-+ T(YAFFS_TRACE_ERROR,
-+ (TSTR
-+ ("**>> yaffs: getBlockInfo block %d is not valid" TENDSTR),
-+ blk));
-+ YBUG();
-+ }
-+ return &dev->blockInfo[blk - dev->internalStartBlock];
-+}
-+
-+#endif
---- a/fs/yaffs2/yaffs_guts.c
-+++ b/fs/yaffs2/yaffs_guts.c
-@@ -12,16 +12,17 @@
- */
-
- const char *yaffs_guts_c_version =
-- "$Id: yaffs_guts.c,v 1.49 2007-05-15 20:07:40 charles Exp $";
-+ "$Id: yaffs_guts.c,v 1.82 2009-03-09 04:24:17 charles Exp $";
-
- #include "yportenv.h"
-
- #include "yaffsinterface.h"
- #include "yaffs_guts.h"
- #include "yaffs_tagsvalidity.h"
-+#include "yaffs_getblockinfo.h"
-
- #include "yaffs_tagscompat.h"
--#ifndef CONFIG_YAFFS_USE_OWN_SORT
-+#ifndef CONFIG_YAFFS_USE_OWN_SORT
- #include "yaffs_qsort.h"
- #endif
- #include "yaffs_nand.h"
-@@ -32,116 +33,116 @@ const char *yaffs_guts_c_version =
- #include "yaffs_packedtags2.h"
-
-
--#ifdef CONFIG_YAFFS_WINCE
--void yfsd_LockYAFFS(BOOL fsLockOnly);
--void yfsd_UnlockYAFFS(BOOL fsLockOnly);
--#endif
--
- #define YAFFS_PASSIVE_GC_CHUNKS 2
-
- #include "yaffs_ecc.h"
-
-
- /* Robustification (if it ever comes about...) */
--static void yaffs_RetireBlock(yaffs_Device * dev, int blockInNAND);
--static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND, int erasedOk);
--static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags * tags);
--static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,
-- const yaffs_ExtendedTags * tags);
-+static void yaffs_RetireBlock(yaffs_Device *dev, int blockInNAND);
-+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND,
-+ int erasedOk);
-+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
-+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND,
-+ const yaffs_ExtendedTags *tags);
-
- /* Other local prototypes */
--static int yaffs_UnlinkObject( yaffs_Object *obj);
-+static int yaffs_UnlinkObject(yaffs_Object *obj);
- static int yaffs_ObjectHasCachedWriteData(yaffs_Object *obj);
-
- static void yaffs_HardlinkFixup(yaffs_Device *dev, yaffs_Object *hardList);
-
--static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device * dev,
-- const __u8 * buffer,
-- yaffs_ExtendedTags * tags,
-- int useReserve);
--static int yaffs_PutChunkIntoFile(yaffs_Object * in, int chunkInInode,
-- int chunkInNAND, int inScan);
--
--static yaffs_Object *yaffs_CreateNewObject(yaffs_Device * dev, int number,
-- yaffs_ObjectType type);
--static void yaffs_AddObjectToDirectory(yaffs_Object * directory,
-- yaffs_Object * obj);
--static int yaffs_UpdateObjectHeader(yaffs_Object * in, const YCHAR * name,
-- int force, int isShrink, int shadows);
--static void yaffs_RemoveObjectFromDirectory(yaffs_Object * obj);
-+static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device *dev,
-+ const __u8 *buffer,
-+ yaffs_ExtendedTags *tags,
-+ int useReserve);
-+static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode,
-+ int chunkInNAND, int inScan);
-+
-+static yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number,
-+ yaffs_ObjectType type);
-+static void yaffs_AddObjectToDirectory(yaffs_Object *directory,
-+ yaffs_Object *obj);
-+static int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name,
-+ int force, int isShrink, int shadows);
-+static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj);
- static int yaffs_CheckStructures(void);
--static int yaffs_DeleteWorker(yaffs_Object * in, yaffs_Tnode * tn, __u32 level,
-- int chunkOffset, int *limit);
--static int yaffs_DoGenericObjectDeletion(yaffs_Object * in);
--
--static yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blockNo);
--
--static __u8 *yaffs_GetTempBuffer(yaffs_Device * dev, int lineNo);
--static void yaffs_ReleaseTempBuffer(yaffs_Device * dev, __u8 * buffer,
-- int lineNo);
-+static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level,
-+ int chunkOffset, int *limit);
-+static int yaffs_DoGenericObjectDeletion(yaffs_Object *in);
-+
-+static yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device *dev, int blockNo);
-
--static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND);
-
--static int yaffs_UnlinkWorker(yaffs_Object * obj);
--static void yaffs_DestroyObject(yaffs_Object * obj);
-+static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND);
-
--static int yaffs_TagsMatch(const yaffs_ExtendedTags * tags, int objectId,
-- int chunkInObject);
-+static int yaffs_UnlinkWorker(yaffs_Object *obj);
-
--loff_t yaffs_GetFileSize(yaffs_Object * obj);
-+static int yaffs_TagsMatch(const yaffs_ExtendedTags *tags, int objectId,
-+ int chunkInObject);
-
--static int yaffs_AllocateChunk(yaffs_Device * dev, int useReserve, yaffs_BlockInfo **blockUsedPtr);
-+static int yaffs_AllocateChunk(yaffs_Device *dev, int useReserve,
-+ yaffs_BlockInfo **blockUsedPtr);
-
--static void yaffs_VerifyFreeChunks(yaffs_Device * dev);
-+static void yaffs_VerifyFreeChunks(yaffs_Device *dev);
-
- static void yaffs_CheckObjectDetailsLoaded(yaffs_Object *in);
-
-+static void yaffs_VerifyDirectory(yaffs_Object *directory);
- #ifdef YAFFS_PARANOID
--static int yaffs_CheckFileSanity(yaffs_Object * in);
-+static int yaffs_CheckFileSanity(yaffs_Object *in);
- #else
- #define yaffs_CheckFileSanity(in)
- #endif
-
--static void yaffs_InvalidateWholeChunkCache(yaffs_Object * in);
--static void yaffs_InvalidateChunkCache(yaffs_Object * object, int chunkId);
-+static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in);
-+static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId);
-
- static void yaffs_InvalidateCheckpoint(yaffs_Device *dev);
-
--static int yaffs_FindChunkInFile(yaffs_Object * in, int chunkInInode,
-- yaffs_ExtendedTags * tags);
-+static int yaffs_FindChunkInFile(yaffs_Object *in, int chunkInInode,
-+ yaffs_ExtendedTags *tags);
-
--static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos);
--static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device * dev,
-- yaffs_FileStructure * fStruct,
-- __u32 chunkId);
-+static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn,
-+ unsigned pos);
-+static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device *dev,
-+ yaffs_FileStructure *fStruct,
-+ __u32 chunkId);
-
-
- /* Function to calculate chunk and offset */
-
--static void yaffs_AddrToChunk(yaffs_Device *dev, loff_t addr, __u32 *chunk, __u32 *offset)
-+static void yaffs_AddrToChunk(yaffs_Device *dev, loff_t addr, int *chunkOut,
-+ __u32 *offsetOut)
- {
-- if(dev->chunkShift){
-- /* Easy-peasy power of 2 case */
-- *chunk = (__u32)(addr >> dev->chunkShift);
-- *offset = (__u32)(addr & dev->chunkMask);
-- }
-- else if(dev->crumbsPerChunk)
-- {
-- /* Case where we're using "crumbs" */
-- *offset = (__u32)(addr & dev->crumbMask);
-- addr >>= dev->crumbShift;
-- *chunk = ((__u32)addr)/dev->crumbsPerChunk;
-- *offset += ((addr - (*chunk * dev->crumbsPerChunk)) << dev->crumbShift);
-+ int chunk;
-+ __u32 offset;
-+
-+ chunk = (__u32)(addr >> dev->chunkShift);
-+
-+ if (dev->chunkDiv == 1) {
-+ /* easy power of 2 case */
-+ offset = (__u32)(addr & dev->chunkMask);
-+ } else {
-+ /* Non power-of-2 case */
-+
-+ loff_t chunkBase;
-+
-+ chunk /= dev->chunkDiv;
-+
-+ chunkBase = ((loff_t)chunk) * dev->nDataBytesPerChunk;
-+ offset = (__u32)(addr - chunkBase);
- }
-- else
-- YBUG();
-+
-+ *chunkOut = chunk;
-+ *offsetOut = offset;
- }
-
--/* Function to return the number of shifts for a power of 2 greater than or equal
-- * to the given number
-+/* Function to return the number of shifts for a power of 2 greater than or
-+ * equal to the given number
- * Note we don't try to cater for all possible numbers and this does not have to
- * be hellishly efficient.
- */
-@@ -153,13 +154,14 @@ static __u32 ShiftsGE(__u32 x)
-
- nShifts = extraBits = 0;
-
-- while(x>1){
-- if(x & 1) extraBits++;
-- x>>=1;
-+ while (x > 1) {
-+ if (x & 1)
-+ extraBits++;
-+ x >>= 1;
- nShifts++;
- }
-
-- if(extraBits)
-+ if (extraBits)
- nShifts++;
-
- return nShifts;
-@@ -168,16 +170,17 @@ static __u32 ShiftsGE(__u32 x)
- /* Function to return the number of shifts to get a 1 in bit 0
- */
-
--static __u32 ShiftDiv(__u32 x)
-+static __u32 Shifts(__u32 x)
- {
- int nShifts;
-
- nShifts = 0;
-
-- if(!x) return 0;
-+ if (!x)
-+ return 0;
-
-- while( !(x&1)){
-- x>>=1;
-+ while (!(x&1)) {
-+ x >>= 1;
- nShifts++;
- }
-
-@@ -195,21 +198,25 @@ static int yaffs_InitialiseTempBuffers(y
- int i;
- __u8 *buf = (__u8 *)1;
-
-- memset(dev->tempBuffer,0,sizeof(dev->tempBuffer));
-+ memset(dev->tempBuffer, 0, sizeof(dev->tempBuffer));
-
- for (i = 0; buf && i < YAFFS_N_TEMP_BUFFERS; i++) {
- dev->tempBuffer[i].line = 0; /* not in use */
- dev->tempBuffer[i].buffer = buf =
-- YMALLOC_DMA(dev->nDataBytesPerChunk);
-+ YMALLOC_DMA(dev->totalBytesPerChunk);
- }
-
- return buf ? YAFFS_OK : YAFFS_FAIL;
--
- }
-
--static __u8 *yaffs_GetTempBuffer(yaffs_Device * dev, int lineNo)
-+__u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo)
- {
- int i, j;
-+
-+ dev->tempInUse++;
-+ if (dev->tempInUse > dev->maxTemp)
-+ dev->maxTemp = dev->tempInUse;
-+
- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
- if (dev->tempBuffer[i].line == 0) {
- dev->tempBuffer[i].line = lineNo;
-@@ -227,9 +234,9 @@ static __u8 *yaffs_GetTempBuffer(yaffs_D
- T(YAFFS_TRACE_BUFFERS,
- (TSTR("Out of temp buffers at line %d, other held by lines:"),
- lineNo));
-- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
-+ for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++)
- T(YAFFS_TRACE_BUFFERS, (TSTR(" %d "), dev->tempBuffer[i].line));
-- }
-+
- T(YAFFS_TRACE_BUFFERS, (TSTR(" " TENDSTR)));
-
- /*
-@@ -242,10 +249,13 @@ static __u8 *yaffs_GetTempBuffer(yaffs_D
-
- }
-
--static void yaffs_ReleaseTempBuffer(yaffs_Device * dev, __u8 * buffer,
-+void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer,
- int lineNo)
- {
- int i;
-+
-+ dev->tempInUse--;
-+
- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
- if (dev->tempBuffer[i].buffer == buffer) {
- dev->tempBuffer[i].line = 0;
-@@ -267,27 +277,26 @@ static void yaffs_ReleaseTempBuffer(yaff
- /*
- * Determine if we have a managed buffer.
- */
--int yaffs_IsManagedTempBuffer(yaffs_Device * dev, const __u8 * buffer)
-+int yaffs_IsManagedTempBuffer(yaffs_Device *dev, const __u8 *buffer)
- {
- int i;
-+
- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
- if (dev->tempBuffer[i].buffer == buffer)
- return 1;
-+ }
-
-+ for (i = 0; i < dev->nShortOpCaches; i++) {
-+ if (dev->srCache[i].data == buffer)
-+ return 1;
- }
-
-- for (i = 0; i < dev->nShortOpCaches; i++) {
-- if( dev->srCache[i].data == buffer )
-- return 1;
--
-- }
--
-- if (buffer == dev->checkpointBuffer)
-- return 1;
--
-- T(YAFFS_TRACE_ALWAYS,
-- (TSTR("yaffs: unmaged buffer detected.\n" TENDSTR)));
-- return 0;
-+ if (buffer == dev->checkpointBuffer)
-+ return 1;
-+
-+ T(YAFFS_TRACE_ALWAYS,
-+ (TSTR("yaffs: unmaged buffer detected.\n" TENDSTR)));
-+ return 0;
- }
-
-
-@@ -296,62 +305,63 @@ int yaffs_IsManagedTempBuffer(yaffs_Devi
- * Chunk bitmap manipulations
- */
-
--static Y_INLINE __u8 *yaffs_BlockBits(yaffs_Device * dev, int blk)
-+static Y_INLINE __u8 *yaffs_BlockBits(yaffs_Device *dev, int blk)
- {
- if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) {
- T(YAFFS_TRACE_ERROR,
-- (TSTR("**>> yaffs: BlockBits block %d is not valid" TENDSTR),
-- blk));
-+ (TSTR("**>> yaffs: BlockBits block %d is not valid" TENDSTR),
-+ blk));
- YBUG();
- }
- return dev->chunkBits +
-- (dev->chunkBitmapStride * (blk - dev->internalStartBlock));
-+ (dev->chunkBitmapStride * (blk - dev->internalStartBlock));
- }
-
- static Y_INLINE void yaffs_VerifyChunkBitId(yaffs_Device *dev, int blk, int chunk)
- {
-- if(blk < dev->internalStartBlock || blk > dev->internalEndBlock ||
-- chunk < 0 || chunk >= dev->nChunksPerBlock) {
-- T(YAFFS_TRACE_ERROR,
-- (TSTR("**>> yaffs: Chunk Id (%d:%d) invalid"TENDSTR),blk,chunk));
-- YBUG();
-+ if (blk < dev->internalStartBlock || blk > dev->internalEndBlock ||
-+ chunk < 0 || chunk >= dev->nChunksPerBlock) {
-+ T(YAFFS_TRACE_ERROR,
-+ (TSTR("**>> yaffs: Chunk Id (%d:%d) invalid"TENDSTR),
-+ blk, chunk));
-+ YBUG();
- }
- }
-
--static Y_INLINE void yaffs_ClearChunkBits(yaffs_Device * dev, int blk)
-+static Y_INLINE void yaffs_ClearChunkBits(yaffs_Device *dev, int blk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
-
- memset(blkBits, 0, dev->chunkBitmapStride);
- }
-
--static Y_INLINE void yaffs_ClearChunkBit(yaffs_Device * dev, int blk, int chunk)
-+static Y_INLINE void yaffs_ClearChunkBit(yaffs_Device *dev, int blk, int chunk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
-
-- yaffs_VerifyChunkBitId(dev,blk,chunk);
-+ yaffs_VerifyChunkBitId(dev, blk, chunk);
-
- blkBits[chunk / 8] &= ~(1 << (chunk & 7));
- }
-
--static Y_INLINE void yaffs_SetChunkBit(yaffs_Device * dev, int blk, int chunk)
-+static Y_INLINE void yaffs_SetChunkBit(yaffs_Device *dev, int blk, int chunk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
-
-- yaffs_VerifyChunkBitId(dev,blk,chunk);
-+ yaffs_VerifyChunkBitId(dev, blk, chunk);
-
- blkBits[chunk / 8] |= (1 << (chunk & 7));
- }
-
--static Y_INLINE int yaffs_CheckChunkBit(yaffs_Device * dev, int blk, int chunk)
-+static Y_INLINE int yaffs_CheckChunkBit(yaffs_Device *dev, int blk, int chunk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
-- yaffs_VerifyChunkBitId(dev,blk,chunk);
-+ yaffs_VerifyChunkBitId(dev, blk, chunk);
-
- return (blkBits[chunk / 8] & (1 << (chunk & 7))) ? 1 : 0;
- }
-
--static Y_INLINE int yaffs_StillSomeChunkBits(yaffs_Device * dev, int blk)
-+static Y_INLINE int yaffs_StillSomeChunkBits(yaffs_Device *dev, int blk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
- int i;
-@@ -363,17 +373,17 @@ static Y_INLINE int yaffs_StillSomeChunk
- return 0;
- }
-
--static int yaffs_CountChunkBits(yaffs_Device * dev, int blk)
-+static int yaffs_CountChunkBits(yaffs_Device *dev, int blk)
- {
- __u8 *blkBits = yaffs_BlockBits(dev, blk);
- int i;
- int n = 0;
- for (i = 0; i < dev->chunkBitmapStride; i++) {
- __u8 x = *blkBits;
-- while(x){
-- if(x & 1)
-+ while (x) {
-+ if (x & 1)
- n++;
-- x >>=1;
-+ x >>= 1;
- }
-
- blkBits++;
-@@ -400,7 +410,7 @@ static int yaffs_SkipNANDVerification(ya
- return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY_NAND));
- }
-
--static const char * blockStateName[] = {
-+static const char *blockStateName[] = {
- "Unknown",
- "Needs scanning",
- "Scanning",
-@@ -413,64 +423,65 @@ static const char * blockStateName[] = {
- "Dead"
- };
-
--static void yaffs_VerifyBlock(yaffs_Device *dev,yaffs_BlockInfo *bi,int n)
-+static void yaffs_VerifyBlock(yaffs_Device *dev, yaffs_BlockInfo *bi, int n)
- {
- int actuallyUsed;
- int inUse;
-
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
- /* Report illegal runtime states */
-- if(bi->blockState <0 || bi->blockState >= YAFFS_NUMBER_OF_BLOCK_STATES)
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has undefined state %d"TENDSTR),n,bi->blockState));
-+ if (bi->blockState >= YAFFS_NUMBER_OF_BLOCK_STATES)
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has undefined state %d"TENDSTR), n, bi->blockState));
-
-- switch(bi->blockState){
-- case YAFFS_BLOCK_STATE_UNKNOWN:
-- case YAFFS_BLOCK_STATE_SCANNING:
-- case YAFFS_BLOCK_STATE_NEEDS_SCANNING:
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has bad run-state %s"TENDSTR),
-- n,blockStateName[bi->blockState]));
-+ switch (bi->blockState) {
-+ case YAFFS_BLOCK_STATE_UNKNOWN:
-+ case YAFFS_BLOCK_STATE_SCANNING:
-+ case YAFFS_BLOCK_STATE_NEEDS_SCANNING:
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has bad run-state %s"TENDSTR),
-+ n, blockStateName[bi->blockState]));
- }
-
- /* Check pages in use and soft deletions are legal */
-
- actuallyUsed = bi->pagesInUse - bi->softDeletions;
-
-- if(bi->pagesInUse < 0 || bi->pagesInUse > dev->nChunksPerBlock ||
-+ if (bi->pagesInUse < 0 || bi->pagesInUse > dev->nChunksPerBlock ||
- bi->softDeletions < 0 || bi->softDeletions > dev->nChunksPerBlock ||
- actuallyUsed < 0 || actuallyUsed > dev->nChunksPerBlock)
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has illegal values pagesInUsed %d softDeletions %d"TENDSTR),
-- n,bi->pagesInUse,bi->softDeletions));
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has illegal values pagesInUsed %d softDeletions %d"TENDSTR),
-+ n, bi->pagesInUse, bi->softDeletions));
-
-
- /* Check chunk bitmap legal */
-- inUse = yaffs_CountChunkBits(dev,n);
-- if(inUse != bi->pagesInUse)
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has inconsistent values pagesInUse %d counted chunk bits %d"TENDSTR),
-- n,bi->pagesInUse,inUse));
-+ inUse = yaffs_CountChunkBits(dev, n);
-+ if (inUse != bi->pagesInUse)
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has inconsistent values pagesInUse %d counted chunk bits %d"TENDSTR),
-+ n, bi->pagesInUse, inUse));
-
- /* Check that the sequence number is valid.
- * Ten million is legal, but is very unlikely
- */
-- if(dev->isYaffs2 &&
-+ if (dev->isYaffs2 &&
- (bi->blockState == YAFFS_BLOCK_STATE_ALLOCATING || bi->blockState == YAFFS_BLOCK_STATE_FULL) &&
-- (bi->sequenceNumber < YAFFS_LOWEST_SEQUENCE_NUMBER || bi->sequenceNumber > 10000000 ))
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block %d has suspect sequence number of %d"TENDSTR),
-- n,bi->sequenceNumber));
--
-+ (bi->sequenceNumber < YAFFS_LOWEST_SEQUENCE_NUMBER || bi->sequenceNumber > 10000000))
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has suspect sequence number of %d"TENDSTR),
-+ n, bi->sequenceNumber));
- }
-
--static void yaffs_VerifyCollectedBlock(yaffs_Device *dev,yaffs_BlockInfo *bi,int n)
-+static void yaffs_VerifyCollectedBlock(yaffs_Device *dev, yaffs_BlockInfo *bi,
-+ int n)
- {
-- yaffs_VerifyBlock(dev,bi,n);
-+ yaffs_VerifyBlock(dev, bi, n);
-
- /* After collection the block should be in the erased state */
-- /* TODO: This will need to change if we do partial gc */
-+ /* This will need to change if we do partial gc */
-
-- if(bi->blockState != YAFFS_BLOCK_STATE_EMPTY){
-- T(YAFFS_TRACE_ERROR,(TSTR("Block %d is in state %d after gc, should be erased"TENDSTR),
-- n,bi->blockState));
-+ if (bi->blockState != YAFFS_BLOCK_STATE_COLLECTING &&
-+ bi->blockState != YAFFS_BLOCK_STATE_EMPTY) {
-+ T(YAFFS_TRACE_ERROR, (TSTR("Block %d is in state %d after gc, should be erased"TENDSTR),
-+ n, bi->blockState));
- }
- }
-
-@@ -480,52 +491,49 @@ static void yaffs_VerifyBlocks(yaffs_Dev
- int nBlocksPerState[YAFFS_NUMBER_OF_BLOCK_STATES];
- int nIllegalBlockStates = 0;
-
--
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
-- memset(nBlocksPerState,0,sizeof(nBlocksPerState));
--
-+ memset(nBlocksPerState, 0, sizeof(nBlocksPerState));
-
-- for(i = dev->internalStartBlock; i <= dev->internalEndBlock; i++){
-- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i);
-- yaffs_VerifyBlock(dev,bi,i);
-+ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) {
-+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i);
-+ yaffs_VerifyBlock(dev, bi, i);
-
-- if(bi->blockState >=0 && bi->blockState < YAFFS_NUMBER_OF_BLOCK_STATES)
-+ if (bi->blockState < YAFFS_NUMBER_OF_BLOCK_STATES)
- nBlocksPerState[bi->blockState]++;
- else
- nIllegalBlockStates++;
--
- }
-
-- T(YAFFS_TRACE_VERIFY,(TSTR(""TENDSTR)));
-- T(YAFFS_TRACE_VERIFY,(TSTR("Block summary"TENDSTR)));
-+ T(YAFFS_TRACE_VERIFY, (TSTR(""TENDSTR)));
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Block summary"TENDSTR)));
-
-- T(YAFFS_TRACE_VERIFY,(TSTR("%d blocks have illegal states"TENDSTR),nIllegalBlockStates));
-- if(nBlocksPerState[YAFFS_BLOCK_STATE_ALLOCATING] > 1)
-- T(YAFFS_TRACE_VERIFY,(TSTR("Too many allocating blocks"TENDSTR)));
-+ T(YAFFS_TRACE_VERIFY, (TSTR("%d blocks have illegal states"TENDSTR), nIllegalBlockStates));
-+ if (nBlocksPerState[YAFFS_BLOCK_STATE_ALLOCATING] > 1)
-+ T(YAFFS_TRACE_VERIFY, (TSTR("Too many allocating blocks"TENDSTR)));
-
-- for(i = 0; i < YAFFS_NUMBER_OF_BLOCK_STATES; i++)
-+ for (i = 0; i < YAFFS_NUMBER_OF_BLOCK_STATES; i++)
- T(YAFFS_TRACE_VERIFY,
- (TSTR("%s %d blocks"TENDSTR),
-- blockStateName[i],nBlocksPerState[i]));
-+ blockStateName[i], nBlocksPerState[i]));
-
-- if(dev->blocksInCheckpoint != nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT])
-+ if (dev->blocksInCheckpoint != nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT])
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Checkpoint block count wrong dev %d count %d"TENDSTR),
- dev->blocksInCheckpoint, nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT]));
-
-- if(dev->nErasedBlocks != nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY])
-+ if (dev->nErasedBlocks != nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY])
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Erased block count wrong dev %d count %d"TENDSTR),
- dev->nErasedBlocks, nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY]));
-
-- if(nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING] > 1)
-+ if (nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING] > 1)
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Too many collecting blocks %d (max is 1)"TENDSTR),
- nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING]));
-
-- T(YAFFS_TRACE_VERIFY,(TSTR(""TENDSTR)));
-+ T(YAFFS_TRACE_VERIFY, (TSTR(""TENDSTR)));
-
- }
-
-@@ -535,26 +543,26 @@ static void yaffs_VerifyBlocks(yaffs_Dev
- */
- static void yaffs_VerifyObjectHeader(yaffs_Object *obj, yaffs_ObjectHeader *oh, yaffs_ExtendedTags *tags, int parentCheck)
- {
-- if(yaffs_SkipVerification(obj->myDev))
-+ if (obj && yaffs_SkipVerification(obj->myDev))
- return;
-
-- if(!(tags && obj && oh)){
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Verifying object header tags %x obj %x oh %x"TENDSTR),
-- (__u32)tags,(__u32)obj,(__u32)oh));
-+ if (!(tags && obj && oh)) {
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Verifying object header tags %x obj %x oh %x"TENDSTR),
-+ (__u32)tags, (__u32)obj, (__u32)oh));
- return;
- }
-
-- if(oh->type <= YAFFS_OBJECT_TYPE_UNKNOWN ||
-- oh->type > YAFFS_OBJECT_TYPE_MAX)
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header type is illegal value 0x%x"TENDSTR),
-- tags->objectId, oh->type));
--
-- if(tags->objectId != obj->objectId)
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header mismatch objectId %d"TENDSTR),
-- tags->objectId, obj->objectId));
-+ if (oh->type <= YAFFS_OBJECT_TYPE_UNKNOWN ||
-+ oh->type > YAFFS_OBJECT_TYPE_MAX)
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d header type is illegal value 0x%x"TENDSTR),
-+ tags->objectId, oh->type));
-+
-+ if (tags->objectId != obj->objectId)
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d header mismatch objectId %d"TENDSTR),
-+ tags->objectId, obj->objectId));
-
-
- /*
-@@ -563,46 +571,43 @@ static void yaffs_VerifyObjectHeader(yaf
- * Tests do not apply to the root object.
- */
-
-- if(parentCheck && tags->objectId > 1 && !obj->parent)
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header mismatch parentId %d obj->parent is NULL"TENDSTR),
-- tags->objectId, oh->parentObjectId));
--
--
-- if(parentCheck && obj->parent &&
-- oh->parentObjectId != obj->parent->objectId &&
-- (oh->parentObjectId != YAFFS_OBJECTID_UNLINKED ||
-- obj->parent->objectId != YAFFS_OBJECTID_DELETED))
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header mismatch parentId %d parentObjectId %d"TENDSTR),
-- tags->objectId, oh->parentObjectId, obj->parent->objectId));
-+ if (parentCheck && tags->objectId > 1 && !obj->parent)
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d header mismatch parentId %d obj->parent is NULL"TENDSTR),
-+ tags->objectId, oh->parentObjectId));
-
-+ if (parentCheck && obj->parent &&
-+ oh->parentObjectId != obj->parent->objectId &&
-+ (oh->parentObjectId != YAFFS_OBJECTID_UNLINKED ||
-+ obj->parent->objectId != YAFFS_OBJECTID_DELETED))
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d header mismatch parentId %d parentObjectId %d"TENDSTR),
-+ tags->objectId, oh->parentObjectId, obj->parent->objectId));
-
-- if(tags->objectId > 1 && oh->name[0] == 0) /* Null name */
-+ if (tags->objectId > 1 && oh->name[0] == 0) /* Null name */
- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header name is NULL"TENDSTR),
-- obj->objectId));
-+ (TSTR("Obj %d header name is NULL"TENDSTR),
-+ obj->objectId));
-
-- if(tags->objectId > 1 && ((__u8)(oh->name[0])) == 0xff) /* Trashed name */
-+ if (tags->objectId > 1 && ((__u8)(oh->name[0])) == 0xff) /* Trashed name */
- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d header name is 0xFF"TENDSTR),
-- obj->objectId));
-+ (TSTR("Obj %d header name is 0xFF"TENDSTR),
-+ obj->objectId));
- }
-
-
-
--static int yaffs_VerifyTnodeWorker(yaffs_Object * obj, yaffs_Tnode * tn,
-- __u32 level, int chunkOffset)
-+static int yaffs_VerifyTnodeWorker(yaffs_Object *obj, yaffs_Tnode *tn,
-+ __u32 level, int chunkOffset)
- {
- int i;
- yaffs_Device *dev = obj->myDev;
- int ok = 1;
-- int nTnodeBytes = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-
- if (tn) {
- if (level > 0) {
-
-- for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++){
-+ for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++) {
- if (tn->internal[i]) {
- ok = yaffs_VerifyTnodeWorker(obj,
- tn->internal[i],
-@@ -611,20 +616,19 @@ static int yaffs_VerifyTnodeWorker(yaffs
- }
- }
- } else if (level == 0) {
-- int i;
- yaffs_ExtendedTags tags;
- __u32 objectId = obj->objectId;
-
- chunkOffset <<= YAFFS_TNODES_LEVEL0_BITS;
-
-- for(i = 0; i < YAFFS_NTNODES_LEVEL0; i++){
-- __u32 theChunk = yaffs_GetChunkGroupBase(dev,tn,i);
-+ for (i = 0; i < YAFFS_NTNODES_LEVEL0; i++) {
-+ __u32 theChunk = yaffs_GetChunkGroupBase(dev, tn, i);
-
-- if(theChunk > 0){
-+ if (theChunk > 0) {
- /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),tags.objectId,tags.chunkId,theChunk)); */
-- yaffs_ReadChunkWithTagsFromNAND(dev,theChunk,NULL, &tags);
-- if(tags.objectId != objectId || tags.chunkId != chunkOffset){
-- T(~0,(TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR),
-+ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL, &tags);
-+ if (tags.objectId != objectId || tags.chunkId != chunkOffset) {
-+ T(~0, (TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR),
- objectId, chunkOffset, theChunk,
- tags.objectId, tags.chunkId));
- }
-@@ -646,13 +650,15 @@ static void yaffs_VerifyFile(yaffs_Objec
- __u32 lastChunk;
- __u32 x;
- __u32 i;
-- int ok;
- yaffs_Device *dev;
- yaffs_ExtendedTags tags;
- yaffs_Tnode *tn;
- __u32 objectId;
-
-- if(obj && yaffs_SkipVerification(obj->myDev))
-+ if (!obj)
-+ return;
-+
-+ if (yaffs_SkipVerification(obj->myDev))
- return;
-
- dev = obj->myDev;
-@@ -662,17 +668,17 @@ static void yaffs_VerifyFile(yaffs_Objec
- lastChunk = obj->variant.fileVariant.fileSize / dev->nDataBytesPerChunk + 1;
- x = lastChunk >> YAFFS_TNODES_LEVEL0_BITS;
- requiredTallness = 0;
-- while (x> 0) {
-+ while (x > 0) {
- x >>= YAFFS_TNODES_INTERNAL_BITS;
- requiredTallness++;
- }
-
- actualTallness = obj->variant.fileVariant.topLevel;
-
-- if(requiredTallness > actualTallness )
-+ if (requiredTallness > actualTallness)
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Obj %d had tnode tallness %d, needs to be %d"TENDSTR),
-- obj->objectId,actualTallness, requiredTallness));
-+ obj->objectId, actualTallness, requiredTallness));
-
-
- /* Check that the chunks in the tnode tree are all correct.
-@@ -680,39 +686,31 @@ static void yaffs_VerifyFile(yaffs_Objec
- * checking the tags for every chunk match.
- */
-
-- if(yaffs_SkipNANDVerification(dev))
-+ if (yaffs_SkipNANDVerification(dev))
- return;
-
-- for(i = 1; i <= lastChunk; i++){
-- tn = yaffs_FindLevel0Tnode(dev, &obj->variant.fileVariant,i);
-+ for (i = 1; i <= lastChunk; i++) {
-+ tn = yaffs_FindLevel0Tnode(dev, &obj->variant.fileVariant, i);
-
- if (tn) {
-- __u32 theChunk = yaffs_GetChunkGroupBase(dev,tn,i);
-- if(theChunk > 0){
-+ __u32 theChunk = yaffs_GetChunkGroupBase(dev, tn, i);
-+ if (theChunk > 0) {
- /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),objectId,i,theChunk)); */
-- yaffs_ReadChunkWithTagsFromNAND(dev,theChunk,NULL, &tags);
-- if(tags.objectId != objectId || tags.chunkId != i){
-- T(~0,(TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR),
-+ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL, &tags);
-+ if (tags.objectId != objectId || tags.chunkId != i) {
-+ T(~0, (TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR),
- objectId, i, theChunk,
- tags.objectId, tags.chunkId));
- }
- }
- }
--
- }
--
- }
-
--static void yaffs_VerifyDirectory(yaffs_Object *obj)
--{
-- if(obj && yaffs_SkipVerification(obj->myDev))
-- return;
--
--}
-
- static void yaffs_VerifyHardLink(yaffs_Object *obj)
- {
-- if(obj && yaffs_SkipVerification(obj->myDev))
-+ if (obj && yaffs_SkipVerification(obj->myDev))
- return;
-
- /* Verify sane equivalent object */
-@@ -720,7 +718,7 @@ static void yaffs_VerifyHardLink(yaffs_O
-
- static void yaffs_VerifySymlink(yaffs_Object *obj)
- {
-- if(obj && yaffs_SkipVerification(obj->myDev))
-+ if (obj && yaffs_SkipVerification(obj->myDev))
- return;
-
- /* Verify symlink string */
-@@ -728,7 +726,7 @@ static void yaffs_VerifySymlink(yaffs_Ob
-
- static void yaffs_VerifySpecial(yaffs_Object *obj)
- {
-- if(obj && yaffs_SkipVerification(obj->myDev))
-+ if (obj && yaffs_SkipVerification(obj->myDev))
- return;
- }
-
-@@ -740,14 +738,19 @@ static void yaffs_VerifyObject(yaffs_Obj
- __u32 chunkMax;
-
- __u32 chunkIdOk;
-- __u32 chunkIsLive;
-+ __u32 chunkInRange;
-+ __u32 chunkShouldNotBeDeleted;
-+ __u32 chunkValid;
-+
-+ if (!obj)
-+ return;
-
-- if(!obj)
-+ if (obj->beingCreated)
- return;
-
- dev = obj->myDev;
-
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
- /* Check sane object header chunk */
-@@ -755,50 +758,54 @@ static void yaffs_VerifyObject(yaffs_Obj
- chunkMin = dev->internalStartBlock * dev->nChunksPerBlock;
- chunkMax = (dev->internalEndBlock+1) * dev->nChunksPerBlock - 1;
-
-- chunkIdOk = (obj->chunkId >= chunkMin && obj->chunkId <= chunkMax);
-- chunkIsLive = chunkIdOk &&
-+ chunkInRange = (((unsigned)(obj->hdrChunk)) >= chunkMin && ((unsigned)(obj->hdrChunk)) <= chunkMax);
-+ chunkIdOk = chunkInRange || obj->hdrChunk == 0;
-+ chunkValid = chunkInRange &&
- yaffs_CheckChunkBit(dev,
-- obj->chunkId / dev->nChunksPerBlock,
-- obj->chunkId % dev->nChunksPerBlock);
-- if(!obj->fake &&
-- (!chunkIdOk || !chunkIsLive)) {
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d has chunkId %d %s %s"TENDSTR),
-- obj->objectId,obj->chunkId,
-- chunkIdOk ? "" : ",out of range",
-- chunkIsLive || !chunkIdOk ? "" : ",marked as deleted"));
-+ obj->hdrChunk / dev->nChunksPerBlock,
-+ obj->hdrChunk % dev->nChunksPerBlock);
-+ chunkShouldNotBeDeleted = chunkInRange && !chunkValid;
-+
-+ if (!obj->fake &&
-+ (!chunkIdOk || chunkShouldNotBeDeleted)) {
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d has chunkId %d %s %s"TENDSTR),
-+ obj->objectId, obj->hdrChunk,
-+ chunkIdOk ? "" : ",out of range",
-+ chunkShouldNotBeDeleted ? ",marked as deleted" : ""));
- }
-
-- if(chunkIdOk && chunkIsLive &&!yaffs_SkipNANDVerification(dev)) {
-+ if (chunkValid && !yaffs_SkipNANDVerification(dev)) {
- yaffs_ExtendedTags tags;
- yaffs_ObjectHeader *oh;
-- __u8 *buffer = yaffs_GetTempBuffer(dev,__LINE__);
-+ __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__);
-
- oh = (yaffs_ObjectHeader *)buffer;
-
-- yaffs_ReadChunkWithTagsFromNAND(dev, obj->chunkId,buffer, &tags);
-+ yaffs_ReadChunkWithTagsFromNAND(dev, obj->hdrChunk, buffer,
-+ &tags);
-
-- yaffs_VerifyObjectHeader(obj,oh,&tags,1);
-+ yaffs_VerifyObjectHeader(obj, oh, &tags, 1);
-
-- yaffs_ReleaseTempBuffer(dev,buffer,__LINE__);
-+ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__);
- }
-
- /* Verify it has a parent */
-- if(obj && !obj->fake &&
-- (!obj->parent || obj->parent->myDev != dev)){
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d has parent pointer %p which does not look like an object"TENDSTR),
-- obj->objectId,obj->parent));
-+ if (obj && !obj->fake &&
-+ (!obj->parent || obj->parent->myDev != dev)) {
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d has parent pointer %p which does not look like an object"TENDSTR),
-+ obj->objectId, obj->parent));
- }
-
- /* Verify parent is a directory */
-- if(obj->parent && obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY){
-- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Obj %d's parent is not a directory (type %d)"TENDSTR),
-- obj->objectId,obj->parent->variantType));
-+ if (obj->parent && obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
-+ T(YAFFS_TRACE_VERIFY,
-+ (TSTR("Obj %d's parent is not a directory (type %d)"TENDSTR),
-+ obj->objectId, obj->parent->variantType));
- }
-
-- switch(obj->variantType){
-+ switch (obj->variantType) {
- case YAFFS_OBJECT_TYPE_FILE:
- yaffs_VerifyFile(obj);
- break;
-@@ -818,33 +825,30 @@ static void yaffs_VerifyObject(yaffs_Obj
- default:
- T(YAFFS_TRACE_VERIFY,
- (TSTR("Obj %d has illegaltype %d"TENDSTR),
-- obj->objectId,obj->variantType));
-+ obj->objectId, obj->variantType));
- break;
- }
--
--
- }
-
- static void yaffs_VerifyObjects(yaffs_Device *dev)
- {
- yaffs_Object *obj;
- int i;
-- struct list_head *lh;
-+ struct ylist_head *lh;
-
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
- /* Iterate through the objects in each hash entry */
-
-- for(i = 0; i < YAFFS_NOBJECT_BUCKETS; i++){
-- list_for_each(lh, &dev->objectBucket[i].list) {
-+ for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) {
-+ ylist_for_each(lh, &dev->objectBucket[i].list) {
- if (lh) {
-- obj = list_entry(lh, yaffs_Object, hashLink);
-+ obj = ylist_entry(lh, yaffs_Object, hashLink);
- yaffs_VerifyObject(obj);
- }
- }
-- }
--
-+ }
- }
-
-
-@@ -855,19 +859,20 @@ static void yaffs_VerifyObjects(yaffs_De
- static Y_INLINE int yaffs_HashFunction(int n)
- {
- n = abs(n);
-- return (n % YAFFS_NOBJECT_BUCKETS);
-+ return n % YAFFS_NOBJECT_BUCKETS;
- }
-
- /*
-- * Access functions to useful fake objects
-+ * Access functions to useful fake objects.
-+ * Note that root might have a presence in NAND if permissions are set.
- */
-
--yaffs_Object *yaffs_Root(yaffs_Device * dev)
-+yaffs_Object *yaffs_Root(yaffs_Device *dev)
- {
- return dev->rootDir;
- }
-
--yaffs_Object *yaffs_LostNFound(yaffs_Device * dev)
-+yaffs_Object *yaffs_LostNFound(yaffs_Device *dev)
- {
- return dev->lostNFoundDir;
- }
-@@ -877,7 +882,7 @@ yaffs_Object *yaffs_LostNFound(yaffs_Dev
- * Erased NAND checking functions
- */
-
--int yaffs_CheckFF(__u8 * buffer, int nBytes)
-+int yaffs_CheckFF(__u8 *buffer, int nBytes)
- {
- /* Horrible, slow implementation */
- while (nBytes--) {
-@@ -889,9 +894,8 @@ int yaffs_CheckFF(__u8 * buffer, int nBy
- }
-
- static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND)
-+ int chunkInNAND)
- {
--
- int retval = YAFFS_OK;
- __u8 *data = yaffs_GetTempBuffer(dev, __LINE__);
- yaffs_ExtendedTags tags;
-@@ -899,10 +903,9 @@ static int yaffs_CheckChunkErased(struct
-
- result = yaffs_ReadChunkWithTagsFromNAND(dev, chunkInNAND, data, &tags);
-
-- if(tags.eccResult > YAFFS_ECC_RESULT_NO_ERROR)
-+ if (tags.eccResult > YAFFS_ECC_RESULT_NO_ERROR)
- retval = YAFFS_FAIL;
-
--
- if (!yaffs_CheckFF(data, dev->nDataBytesPerChunk) || tags.chunkUsed) {
- T(YAFFS_TRACE_NANDACCESS,
- (TSTR("Chunk %d not erased" TENDSTR), chunkInNAND));
-@@ -915,11 +918,10 @@ static int yaffs_CheckChunkErased(struct
-
- }
-
--
- static int yaffs_WriteNewChunkWithTagsToNAND(struct yaffs_DeviceStruct *dev,
-- const __u8 * data,
-- yaffs_ExtendedTags * tags,
-- int useReserve)
-+ const __u8 *data,
-+ yaffs_ExtendedTags *tags,
-+ int useReserve)
- {
- int attempts = 0;
- int writeOk = 0;
-@@ -972,7 +974,7 @@ static int yaffs_WriteNewChunkWithTagsTo
- erasedOk = yaffs_CheckChunkErased(dev, chunk);
- if (erasedOk != YAFFS_OK) {
- T(YAFFS_TRACE_ERROR,
-- (TSTR ("**>> yaffs chunk %d was not erased"
-+ (TSTR("**>> yaffs chunk %d was not erased"
- TENDSTR), chunk));
-
- /* try another chunk */
-@@ -992,7 +994,11 @@ static int yaffs_WriteNewChunkWithTagsTo
- /* Copy the data into the robustification buffer */
- yaffs_HandleWriteChunkOk(dev, chunk, data, tags);
-
-- } while (writeOk != YAFFS_OK && attempts < yaffs_wr_attempts);
-+ } while (writeOk != YAFFS_OK &&
-+ (yaffs_wr_attempts <= 0 || attempts <= yaffs_wr_attempts));
-+
-+ if (!writeOk)
-+ chunk = -1;
-
- if (attempts > 1) {
- T(YAFFS_TRACE_ERROR,
-@@ -1009,13 +1015,35 @@ static int yaffs_WriteNewChunkWithTagsTo
- * Block retiring for handling a broken block.
- */
-
--static void yaffs_RetireBlock(yaffs_Device * dev, int blockInNAND)
-+static void yaffs_RetireBlock(yaffs_Device *dev, int blockInNAND)
- {
- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockInNAND);
-
- yaffs_InvalidateCheckpoint(dev);
-
-- yaffs_MarkBlockBad(dev, blockInNAND);
-+ if (yaffs_MarkBlockBad(dev, blockInNAND) != YAFFS_OK) {
-+ if (yaffs_EraseBlockInNAND(dev, blockInNAND) != YAFFS_OK) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR(
-+ "yaffs: Failed to mark bad and erase block %d"
-+ TENDSTR), blockInNAND));
-+ } else {
-+ yaffs_ExtendedTags tags;
-+ int chunkId = blockInNAND * dev->nChunksPerBlock;
-+
-+ __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__);
-+
-+ memset(buffer, 0xff, dev->nDataBytesPerChunk);
-+ yaffs_InitialiseTags(&tags);
-+ tags.sequenceNumber = YAFFS_SEQUENCE_BAD_BLOCK;
-+ if (dev->writeChunkWithTagsToNAND(dev, chunkId -
-+ dev->chunkOffset, buffer, &tags) != YAFFS_OK)
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Failed to "
-+ TCONT("write bad block marker to block %d")
-+ TENDSTR), blockInNAND));
-+
-+ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__);
-+ }
-+ }
-
- bi->blockState = YAFFS_BLOCK_STATE_DEAD;
- bi->gcPrioritise = 0;
-@@ -1029,49 +1057,45 @@ static void yaffs_RetireBlock(yaffs_Devi
- *
- */
-
--static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags * tags)
-+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags)
- {
- }
-
--static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,
-- const yaffs_ExtendedTags * tags)
-+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND,
-+ const yaffs_ExtendedTags *tags)
- {
- }
-
- void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi)
- {
-- if(!bi->gcPrioritise){
-+ if (!bi->gcPrioritise) {
- bi->gcPrioritise = 1;
- dev->hasPendingPrioritisedGCs = 1;
-- bi->chunkErrorStrikes ++;
-+ bi->chunkErrorStrikes++;
-
-- if(bi->chunkErrorStrikes > 3){
-+ if (bi->chunkErrorStrikes > 3) {
- bi->needsRetiring = 1; /* Too many stikes, so retire this */
- T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Block struck out" TENDSTR)));
-
- }
--
- }
- }
-
--static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND, int erasedOk)
-+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND,
-+ int erasedOk)
- {
--
- int blockInNAND = chunkInNAND / dev->nChunksPerBlock;
- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockInNAND);
-
-- yaffs_HandleChunkError(dev,bi);
-+ yaffs_HandleChunkError(dev, bi);
-
--
-- if(erasedOk ) {
-+ if (erasedOk) {
- /* Was an actual write failure, so mark the block for retirement */
- bi->needsRetiring = 1;
- T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS,
- (TSTR("**>> Block %d needs retiring" TENDSTR), blockInNAND));
--
--
- }
-
- /* Delete the chunk */
-@@ -1081,12 +1105,12 @@ static void yaffs_HandleWriteChunkError(
-
- /*---------------- Name handling functions ------------*/
-
--static __u16 yaffs_CalcNameSum(const YCHAR * name)
-+static __u16 yaffs_CalcNameSum(const YCHAR *name)
- {
- __u16 sum = 0;
- __u16 i = 1;
-
-- YUCHAR *bname = (YUCHAR *) name;
-+ const YUCHAR *bname = (const YUCHAR *) name;
- if (bname) {
- while ((*bname) && (i < (YAFFS_MAX_NAME_LENGTH/2))) {
-
-@@ -1102,14 +1126,14 @@ static __u16 yaffs_CalcNameSum(const YCH
- return sum;
- }
-
--static void yaffs_SetObjectName(yaffs_Object * obj, const YCHAR * name)
-+static void yaffs_SetObjectName(yaffs_Object *obj, const YCHAR *name)
- {
- #ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM
-- if (name && yaffs_strlen(name) <= YAFFS_SHORT_NAME_LENGTH) {
-+ memset(obj->shortName, 0, sizeof(YCHAR) * (YAFFS_SHORT_NAME_LENGTH+1));
-+ if (name && yaffs_strlen(name) <= YAFFS_SHORT_NAME_LENGTH)
- yaffs_strcpy(obj->shortName, name);
-- } else {
-+ else
- obj->shortName[0] = _Y('\0');
-- }
- #endif
- obj->sum = yaffs_CalcNameSum(name);
- }
-@@ -1126,7 +1150,7 @@ static void yaffs_SetObjectName(yaffs_Ob
- * Don't use this function directly
- */
-
--static int yaffs_CreateTnodes(yaffs_Device * dev, int nTnodes)
-+static int yaffs_CreateTnodes(yaffs_Device *dev, int nTnodes)
- {
- int i;
- int tnodeSize;
-@@ -1143,6 +1167,9 @@ static int yaffs_CreateTnodes(yaffs_Devi
- * Must be a multiple of 32-bits */
- tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-+
- /* make these things */
-
- newTnodes = YMALLOC(nTnodes * tnodeSize);
-@@ -1150,7 +1177,7 @@ static int yaffs_CreateTnodes(yaffs_Devi
-
- if (!newTnodes) {
- T(YAFFS_TRACE_ERROR,
-- (TSTR("yaffs: Could not allocate Tnodes" TENDSTR)));
-+ (TSTR("yaffs: Could not allocate Tnodes" TENDSTR)));
- return YAFFS_FAIL;
- }
-
-@@ -1170,7 +1197,7 @@ static int yaffs_CreateTnodes(yaffs_Devi
- dev->freeTnodes = newTnodes;
- #else
- /* New hookup for wide tnodes */
-- for(i = 0; i < nTnodes -1; i++) {
-+ for (i = 0; i < nTnodes - 1; i++) {
- curr = (yaffs_Tnode *) &mem[i * tnodeSize];
- next = (yaffs_Tnode *) &mem[(i+1) * tnodeSize];
- curr->internal[0] = next;
-@@ -1197,7 +1224,6 @@ static int yaffs_CreateTnodes(yaffs_Devi
- (TSTR
- ("yaffs: Could not add tnodes to management list" TENDSTR)));
- return YAFFS_FAIL;
--
- } else {
- tnl->tnodes = newTnodes;
- tnl->next = dev->allocatedTnodeList;
-@@ -1211,14 +1237,13 @@ static int yaffs_CreateTnodes(yaffs_Devi
-
- /* GetTnode gets us a clean tnode. Tries to make allocate more if we run out */
-
--static yaffs_Tnode *yaffs_GetTnodeRaw(yaffs_Device * dev)
-+static yaffs_Tnode *yaffs_GetTnodeRaw(yaffs_Device *dev)
- {
- yaffs_Tnode *tn = NULL;
-
- /* If there are none left make more */
-- if (!dev->freeTnodes) {
-+ if (!dev->freeTnodes)
- yaffs_CreateTnodes(dev, YAFFS_ALLOCATION_NTNODES);
-- }
-
- if (dev->freeTnodes) {
- tn = dev->freeTnodes;
-@@ -1233,21 +1258,27 @@ static yaffs_Tnode *yaffs_GetTnodeRaw(ya
- dev->nFreeTnodes--;
- }
-
-+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
-+
- return tn;
- }
-
--static yaffs_Tnode *yaffs_GetTnode(yaffs_Device * dev)
-+static yaffs_Tnode *yaffs_GetTnode(yaffs_Device *dev)
- {
- yaffs_Tnode *tn = yaffs_GetTnodeRaw(dev);
-+ int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-
-- if(tn)
-- memset(tn, 0, (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8);
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-+
-+ if (tn)
-+ memset(tn, 0, tnodeSize);
-
- return tn;
- }
-
- /* FreeTnode frees up a tnode and puts it back on the free list */
--static void yaffs_FreeTnode(yaffs_Device * dev, yaffs_Tnode * tn)
-+static void yaffs_FreeTnode(yaffs_Device *dev, yaffs_Tnode *tn)
- {
- if (tn) {
- #ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG
-@@ -1262,9 +1293,10 @@ static void yaffs_FreeTnode(yaffs_Device
- dev->freeTnodes = tn;
- dev->nFreeTnodes++;
- }
-+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
- }
-
--static void yaffs_DeinitialiseTnodes(yaffs_Device * dev)
-+static void yaffs_DeinitialiseTnodes(yaffs_Device *dev)
- {
- /* Free the list of allocated tnodes */
- yaffs_TnodeList *tmp;
-@@ -1282,71 +1314,72 @@ static void yaffs_DeinitialiseTnodes(yaf
- dev->nFreeTnodes = 0;
- }
-
--static void yaffs_InitialiseTnodes(yaffs_Device * dev)
-+static void yaffs_InitialiseTnodes(yaffs_Device *dev)
- {
- dev->allocatedTnodeList = NULL;
- dev->freeTnodes = NULL;
- dev->nFreeTnodes = 0;
- dev->nTnodesCreated = 0;
--
- }
-
-
--void yaffs_PutLevel0Tnode(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos, unsigned val)
-+void yaffs_PutLevel0Tnode(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos,
-+ unsigned val)
- {
-- __u32 *map = (__u32 *)tn;
-- __u32 bitInMap;
-- __u32 bitInWord;
-- __u32 wordInMap;
-- __u32 mask;
-+ __u32 *map = (__u32 *)tn;
-+ __u32 bitInMap;
-+ __u32 bitInWord;
-+ __u32 wordInMap;
-+ __u32 mask;
-
-- pos &= YAFFS_TNODES_LEVEL0_MASK;
-- val >>= dev->chunkGroupBits;
-+ pos &= YAFFS_TNODES_LEVEL0_MASK;
-+ val >>= dev->chunkGroupBits;
-
-- bitInMap = pos * dev->tnodeWidth;
-- wordInMap = bitInMap /32;
-- bitInWord = bitInMap & (32 -1);
-+ bitInMap = pos * dev->tnodeWidth;
-+ wordInMap = bitInMap / 32;
-+ bitInWord = bitInMap & (32 - 1);
-
-- mask = dev->tnodeMask << bitInWord;
-+ mask = dev->tnodeMask << bitInWord;
-
-- map[wordInMap] &= ~mask;
-- map[wordInMap] |= (mask & (val << bitInWord));
-+ map[wordInMap] &= ~mask;
-+ map[wordInMap] |= (mask & (val << bitInWord));
-
-- if(dev->tnodeWidth > (32-bitInWord)) {
-- bitInWord = (32 - bitInWord);
-- wordInMap++;;
-- mask = dev->tnodeMask >> (/*dev->tnodeWidth -*/ bitInWord);
-- map[wordInMap] &= ~mask;
-- map[wordInMap] |= (mask & (val >> bitInWord));
-- }
-+ if (dev->tnodeWidth > (32 - bitInWord)) {
-+ bitInWord = (32 - bitInWord);
-+ wordInMap++;;
-+ mask = dev->tnodeMask >> (/*dev->tnodeWidth -*/ bitInWord);
-+ map[wordInMap] &= ~mask;
-+ map[wordInMap] |= (mask & (val >> bitInWord));
-+ }
- }
-
--static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos)
-+static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn,
-+ unsigned pos)
- {
-- __u32 *map = (__u32 *)tn;
-- __u32 bitInMap;
-- __u32 bitInWord;
-- __u32 wordInMap;
-- __u32 val;
-+ __u32 *map = (__u32 *)tn;
-+ __u32 bitInMap;
-+ __u32 bitInWord;
-+ __u32 wordInMap;
-+ __u32 val;
-
-- pos &= YAFFS_TNODES_LEVEL0_MASK;
-+ pos &= YAFFS_TNODES_LEVEL0_MASK;
-
-- bitInMap = pos * dev->tnodeWidth;
-- wordInMap = bitInMap /32;
-- bitInWord = bitInMap & (32 -1);
-+ bitInMap = pos * dev->tnodeWidth;
-+ wordInMap = bitInMap / 32;
-+ bitInWord = bitInMap & (32 - 1);
-
-- val = map[wordInMap] >> bitInWord;
-+ val = map[wordInMap] >> bitInWord;
-
-- if(dev->tnodeWidth > (32-bitInWord)) {
-- bitInWord = (32 - bitInWord);
-- wordInMap++;;
-- val |= (map[wordInMap] << bitInWord);
-- }
-+ if (dev->tnodeWidth > (32 - bitInWord)) {
-+ bitInWord = (32 - bitInWord);
-+ wordInMap++;;
-+ val |= (map[wordInMap] << bitInWord);
-+ }
-
-- val &= dev->tnodeMask;
-- val <<= dev->chunkGroupBits;
-+ val &= dev->tnodeMask;
-+ val <<= dev->chunkGroupBits;
-
-- return val;
-+ return val;
- }
-
- /* ------------------- End of individual tnode manipulation -----------------*/
-@@ -1357,24 +1390,21 @@ static __u32 yaffs_GetChunkGroupBase(yaf
- */
-
- /* FindLevel0Tnode finds the level 0 tnode, if one exists. */
--static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device * dev,
-- yaffs_FileStructure * fStruct,
-- __u32 chunkId)
-+static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device *dev,
-+ yaffs_FileStructure *fStruct,
-+ __u32 chunkId)
- {
--
- yaffs_Tnode *tn = fStruct->top;
- __u32 i;
- int requiredTallness;
- int level = fStruct->topLevel;
-
- /* Check sane level and chunk Id */
-- if (level < 0 || level > YAFFS_TNODES_MAX_LEVEL) {
-+ if (level < 0 || level > YAFFS_TNODES_MAX_LEVEL)
- return NULL;
-- }
-
-- if (chunkId > YAFFS_MAX_CHUNK_ID) {
-+ if (chunkId > YAFFS_MAX_CHUNK_ID)
- return NULL;
-- }
-
- /* First check we're tall enough (ie enough topLevel) */
-
-@@ -1385,22 +1415,17 @@ static yaffs_Tnode *yaffs_FindLevel0Tnod
- requiredTallness++;
- }
-
-- if (requiredTallness > fStruct->topLevel) {
-- /* Not tall enough, so we can't find it, return NULL. */
-- return NULL;
-- }
-+ if (requiredTallness > fStruct->topLevel)
-+ return NULL; /* Not tall enough, so we can't find it */
-
- /* Traverse down to level 0 */
- while (level > 0 && tn) {
-- tn = tn->
-- internal[(chunkId >>
-- ( YAFFS_TNODES_LEVEL0_BITS +
-- (level - 1) *
-- YAFFS_TNODES_INTERNAL_BITS)
-- ) &
-- YAFFS_TNODES_INTERNAL_MASK];
-+ tn = tn->internal[(chunkId >>
-+ (YAFFS_TNODES_LEVEL0_BITS +
-+ (level - 1) *
-+ YAFFS_TNODES_INTERNAL_BITS)) &
-+ YAFFS_TNODES_INTERNAL_MASK];
- level--;
--
- }
-
- return tn;
-@@ -1417,12 +1442,11 @@ static yaffs_Tnode *yaffs_FindLevel0Tnod
- * be plugged into the ttree.
- */
-
--static yaffs_Tnode *yaffs_AddOrFindLevel0Tnode(yaffs_Device * dev,
-- yaffs_FileStructure * fStruct,
-- __u32 chunkId,
-- yaffs_Tnode *passedTn)
-+static yaffs_Tnode *yaffs_AddOrFindLevel0Tnode(yaffs_Device *dev,
-+ yaffs_FileStructure *fStruct,
-+ __u32 chunkId,
-+ yaffs_Tnode *passedTn)
- {
--
- int requiredTallness;
- int i;
- int l;
-@@ -1432,13 +1456,11 @@ static yaffs_Tnode *yaffs_AddOrFindLevel
-
-
- /* Check sane level and page Id */
-- if (fStruct->topLevel < 0 || fStruct->topLevel > YAFFS_TNODES_MAX_LEVEL) {
-+ if (fStruct->topLevel < 0 || fStruct->topLevel > YAFFS_TNODES_MAX_LEVEL)
- return NULL;
-- }
-
-- if (chunkId > YAFFS_MAX_CHUNK_ID) {
-+ if (chunkId > YAFFS_MAX_CHUNK_ID)
- return NULL;
-- }
-
- /* First check we're tall enough (ie enough topLevel) */
-
-@@ -1451,7 +1473,7 @@ static yaffs_Tnode *yaffs_AddOrFindLevel
-
-
- if (requiredTallness > fStruct->topLevel) {
-- /* Not tall enough,gotta make the tree taller */
-+ /* Not tall enough, gotta make the tree taller */
- for (i = fStruct->topLevel; i < requiredTallness; i++) {
-
- tn = yaffs_GetTnode(dev);
-@@ -1473,27 +1495,27 @@ static yaffs_Tnode *yaffs_AddOrFindLevel
- l = fStruct->topLevel;
- tn = fStruct->top;
-
-- if(l > 0) {
-+ if (l > 0) {
- while (l > 0 && tn) {
- x = (chunkId >>
-- ( YAFFS_TNODES_LEVEL0_BITS +
-+ (YAFFS_TNODES_LEVEL0_BITS +
- (l - 1) * YAFFS_TNODES_INTERNAL_BITS)) &
- YAFFS_TNODES_INTERNAL_MASK;
-
-
-- if((l>1) && !tn->internal[x]){
-+ if ((l > 1) && !tn->internal[x]) {
- /* Add missing non-level-zero tnode */
- tn->internal[x] = yaffs_GetTnode(dev);
-
-- } else if(l == 1) {
-+ } else if (l == 1) {
- /* Looking from level 1 at level 0 */
-- if (passedTn) {
-+ if (passedTn) {
- /* If we already have one, then release it.*/
-- if(tn->internal[x])
-- yaffs_FreeTnode(dev,tn->internal[x]);
-+ if (tn->internal[x])
-+ yaffs_FreeTnode(dev, tn->internal[x]);
- tn->internal[x] = passedTn;
-
-- } else if(!tn->internal[x]) {
-+ } else if (!tn->internal[x]) {
- /* Don't have one, none passed in */
- tn->internal[x] = yaffs_GetTnode(dev);
- }
-@@ -1504,31 +1526,29 @@ static yaffs_Tnode *yaffs_AddOrFindLevel
- }
- } else {
- /* top is level 0 */
-- if(passedTn) {
-- memcpy(tn,passedTn,(dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8);
-- yaffs_FreeTnode(dev,passedTn);
-+ if (passedTn) {
-+ memcpy(tn, passedTn, (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8);
-+ yaffs_FreeTnode(dev, passedTn);
- }
- }
-
- return tn;
- }
-
--static int yaffs_FindChunkInGroup(yaffs_Device * dev, int theChunk,
-- yaffs_ExtendedTags * tags, int objectId,
-- int chunkInInode)
-+static int yaffs_FindChunkInGroup(yaffs_Device *dev, int theChunk,
-+ yaffs_ExtendedTags *tags, int objectId,
-+ int chunkInInode)
- {
- int j;
-
- for (j = 0; theChunk && j < dev->chunkGroupSize; j++) {
-- if (yaffs_CheckChunkBit
-- (dev, theChunk / dev->nChunksPerBlock,
-- theChunk % dev->nChunksPerBlock)) {
-+ if (yaffs_CheckChunkBit(dev, theChunk / dev->nChunksPerBlock,
-+ theChunk % dev->nChunksPerBlock)) {
- yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL,
- tags);
- if (yaffs_TagsMatch(tags, objectId, chunkInInode)) {
- /* found it; */
- return theChunk;
--
- }
- }
- theChunk++;
-@@ -1543,7 +1563,7 @@ static int yaffs_FindChunkInGroup(yaffs_
- * Returns 0 if it stopped early due to hitting the limit and the delete is incomplete.
- */
-
--static int yaffs_DeleteWorker(yaffs_Object * in, yaffs_Tnode * tn, __u32 level,
-+static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level,
- int chunkOffset, int *limit)
- {
- int i;
-@@ -1557,7 +1577,6 @@ static int yaffs_DeleteWorker(yaffs_Obje
-
- if (tn) {
- if (level > 0) {
--
- for (i = YAFFS_NTNODES_INTERNAL - 1; allDone && i >= 0;
- i--) {
- if (tn->internal[i]) {
-@@ -1565,17 +1584,17 @@ static int yaffs_DeleteWorker(yaffs_Obje
- allDone = 0;
- } else {
- allDone =
-- yaffs_DeleteWorker(in,
-- tn->
-- internal
-- [i],
-- level -
-- 1,
-- (chunkOffset
-+ yaffs_DeleteWorker(in,
-+ tn->
-+ internal
-+ [i],
-+ level -
-+ 1,
-+ (chunkOffset
- <<
- YAFFS_TNODES_INTERNAL_BITS)
-- + i,
-- limit);
-+ + i,
-+ limit);
- }
- if (allDone) {
- yaffs_FreeTnode(dev,
-@@ -1584,27 +1603,25 @@ static int yaffs_DeleteWorker(yaffs_Obje
- tn->internal[i] = NULL;
- }
- }
--
- }
- return (allDone) ? 1 : 0;
- } else if (level == 0) {
- int hitLimit = 0;
-
- for (i = YAFFS_NTNODES_LEVEL0 - 1; i >= 0 && !hitLimit;
-- i--) {
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,i);
-+ i--) {
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, i);
- if (theChunk) {
-
-- chunkInInode =
-- (chunkOffset <<
-- YAFFS_TNODES_LEVEL0_BITS) + i;
-+ chunkInInode = (chunkOffset <<
-+ YAFFS_TNODES_LEVEL0_BITS) + i;
-
- foundChunk =
-- yaffs_FindChunkInGroup(dev,
-- theChunk,
-- &tags,
-- in->objectId,
-- chunkInInode);
-+ yaffs_FindChunkInGroup(dev,
-+ theChunk,
-+ &tags,
-+ in->objectId,
-+ chunkInInode);
-
- if (foundChunk > 0) {
- yaffs_DeleteChunk(dev,
-@@ -1613,14 +1630,13 @@ static int yaffs_DeleteWorker(yaffs_Obje
- in->nDataChunks--;
- if (limit) {
- *limit = *limit - 1;
-- if (*limit <= 0) {
-+ if (*limit <= 0)
- hitLimit = 1;
-- }
- }
-
- }
-
-- yaffs_PutLevel0Tnode(dev,tn,i,0);
-+ yaffs_PutLevel0Tnode(dev, tn, i, 0);
- }
-
- }
-@@ -1634,9 +1650,8 @@ static int yaffs_DeleteWorker(yaffs_Obje
-
- }
-
--static void yaffs_SoftDeleteChunk(yaffs_Device * dev, int chunk)
-+static void yaffs_SoftDeleteChunk(yaffs_Device *dev, int chunk)
- {
--
- yaffs_BlockInfo *theBlock;
-
- T(YAFFS_TRACE_DELETION, (TSTR("soft delete chunk %d" TENDSTR), chunk));
-@@ -1654,7 +1669,7 @@ static void yaffs_SoftDeleteChunk(yaffs_
- * Thus, essentially this is the same as DeleteWorker except that the chunks are soft deleted.
- */
-
--static int yaffs_SoftDeleteWorker(yaffs_Object * in, yaffs_Tnode * tn,
-+static int yaffs_SoftDeleteWorker(yaffs_Object *in, yaffs_Tnode *tn,
- __u32 level, int chunkOffset)
- {
- int i;
-@@ -1691,14 +1706,14 @@ static int yaffs_SoftDeleteWorker(yaffs_
- } else if (level == 0) {
-
- for (i = YAFFS_NTNODES_LEVEL0 - 1; i >= 0; i--) {
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,i);
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, i);
- if (theChunk) {
- /* Note this does not find the real chunk, only the chunk group.
- * We make an assumption that a chunk group is not larger than
- * a block.
- */
- yaffs_SoftDeleteChunk(dev, theChunk);
-- yaffs_PutLevel0Tnode(dev,tn,i,0);
-+ yaffs_PutLevel0Tnode(dev, tn, i, 0);
- }
-
- }
-@@ -1712,7 +1727,7 @@ static int yaffs_SoftDeleteWorker(yaffs_
-
- }
-
--static void yaffs_SoftDeleteFile(yaffs_Object * obj)
-+static void yaffs_SoftDeleteFile(yaffs_Object *obj)
- {
- if (obj->deleted &&
- obj->variantType == YAFFS_OBJECT_TYPE_FILE && !obj->softDeleted) {
-@@ -1746,8 +1761,8 @@ static void yaffs_SoftDeleteFile(yaffs_O
- * by a special case.
- */
-
--static yaffs_Tnode *yaffs_PruneWorker(yaffs_Device * dev, yaffs_Tnode * tn,
-- __u32 level, int del0)
-+static yaffs_Tnode *yaffs_PruneWorker(yaffs_Device *dev, yaffs_Tnode *tn,
-+ __u32 level, int del0)
- {
- int i;
- int hasData;
-@@ -1763,9 +1778,8 @@ static yaffs_Tnode *yaffs_PruneWorker(ya
- (i == 0) ? del0 : 1);
- }
-
-- if (tn->internal[i]) {
-+ if (tn->internal[i])
- hasData++;
-- }
- }
-
- if (hasData == 0 && del0) {
-@@ -1781,8 +1795,8 @@ static yaffs_Tnode *yaffs_PruneWorker(ya
-
- }
-
--static int yaffs_PruneFileStructure(yaffs_Device * dev,
-- yaffs_FileStructure * fStruct)
-+static int yaffs_PruneFileStructure(yaffs_Device *dev,
-+ yaffs_FileStructure *fStruct)
- {
- int i;
- int hasData;
-@@ -1805,9 +1819,8 @@ static int yaffs_PruneFileStructure(yaff
-
- hasData = 0;
- for (i = 1; i < YAFFS_NTNODES_INTERNAL; i++) {
-- if (tn->internal[i]) {
-+ if (tn->internal[i])
- hasData++;
-- }
- }
-
- if (!hasData) {
-@@ -1828,7 +1841,7 @@ static int yaffs_PruneFileStructure(yaff
- /* yaffs_CreateFreeObjects creates a bunch more objects and
- * adds them to the object free list.
- */
--static int yaffs_CreateFreeObjects(yaffs_Device * dev, int nObjects)
-+static int yaffs_CreateFreeObjects(yaffs_Device *dev, int nObjects)
- {
- int i;
- yaffs_Object *newObjects;
-@@ -1842,9 +1855,9 @@ static int yaffs_CreateFreeObjects(yaffs
- list = YMALLOC(sizeof(yaffs_ObjectList));
-
- if (!newObjects || !list) {
-- if(newObjects)
-+ if (newObjects)
- YFREE(newObjects);
-- if(list)
-+ if (list)
- YFREE(list);
- T(YAFFS_TRACE_ALLOCATE,
- (TSTR("yaffs: Could not allocate more objects" TENDSTR)));
-@@ -1854,7 +1867,7 @@ static int yaffs_CreateFreeObjects(yaffs
- /* Hook them into the free list */
- for (i = 0; i < nObjects - 1; i++) {
- newObjects[i].siblings.next =
-- (struct list_head *)(&newObjects[i + 1]);
-+ (struct ylist_head *)(&newObjects[i + 1]);
- }
-
- newObjects[nObjects - 1].siblings.next = (void *)dev->freeObjects;
-@@ -1873,85 +1886,109 @@ static int yaffs_CreateFreeObjects(yaffs
-
-
- /* AllocateEmptyObject gets us a clean Object. Tries to make allocate more if we run out */
--static yaffs_Object *yaffs_AllocateEmptyObject(yaffs_Device * dev)
-+static yaffs_Object *yaffs_AllocateEmptyObject(yaffs_Device *dev)
- {
- yaffs_Object *tn = NULL;
-
-+#ifdef VALGRIND_TEST
-+ tn = YMALLOC(sizeof(yaffs_Object));
-+#else
- /* If there are none left make more */
-- if (!dev->freeObjects) {
-+ if (!dev->freeObjects)
- yaffs_CreateFreeObjects(dev, YAFFS_ALLOCATION_NOBJECTS);
-- }
-
- if (dev->freeObjects) {
- tn = dev->freeObjects;
- dev->freeObjects =
-- (yaffs_Object *) (dev->freeObjects->siblings.next);
-+ (yaffs_Object *) (dev->freeObjects->siblings.next);
- dev->nFreeObjects--;
--
-+ }
-+#endif
-+ if (tn) {
- /* Now sweeten it up... */
-
- memset(tn, 0, sizeof(yaffs_Object));
-+ tn->beingCreated = 1;
-+
- tn->myDev = dev;
-- tn->chunkId = -1;
-+ tn->hdrChunk = 0;
- tn->variantType = YAFFS_OBJECT_TYPE_UNKNOWN;
-- INIT_LIST_HEAD(&(tn->hardLinks));
-- INIT_LIST_HEAD(&(tn->hashLink));
-- INIT_LIST_HEAD(&tn->siblings);
-+ YINIT_LIST_HEAD(&(tn->hardLinks));
-+ YINIT_LIST_HEAD(&(tn->hashLink));
-+ YINIT_LIST_HEAD(&tn->siblings);
-+
-+
-+ /* Now make the directory sane */
-+ if (dev->rootDir) {
-+ tn->parent = dev->rootDir;
-+ ylist_add(&(tn->siblings), &dev->rootDir->variant.directoryVariant.children);
-+ }
-
- /* Add it to the lost and found directory.
- * NB Can't put root or lostNFound in lostNFound so
- * check if lostNFound exists first
- */
-- if (dev->lostNFoundDir) {
-+ if (dev->lostNFoundDir)
- yaffs_AddObjectToDirectory(dev->lostNFoundDir, tn);
-- }
-+
-+ tn->beingCreated = 0;
- }
-
-+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
-+
- return tn;
- }
-
--static yaffs_Object *yaffs_CreateFakeDirectory(yaffs_Device * dev, int number,
-+static yaffs_Object *yaffs_CreateFakeDirectory(yaffs_Device *dev, int number,
- __u32 mode)
- {
-
- yaffs_Object *obj =
- yaffs_CreateNewObject(dev, number, YAFFS_OBJECT_TYPE_DIRECTORY);
- if (obj) {
-- obj->fake = 1; /* it is fake so it has no NAND presence... */
-+ obj->fake = 1; /* it is fake so it might have no NAND presence... */
- obj->renameAllowed = 0; /* ... and we're not allowed to rename it... */
- obj->unlinkAllowed = 0; /* ... or unlink it */
- obj->deleted = 0;
- obj->unlinked = 0;
- obj->yst_mode = mode;
- obj->myDev = dev;
-- obj->chunkId = 0; /* Not a valid chunk. */
-+ obj->hdrChunk = 0; /* Not a valid chunk. */
- }
-
- return obj;
-
- }
-
--static void yaffs_UnhashObject(yaffs_Object * tn)
-+static void yaffs_UnhashObject(yaffs_Object *tn)
- {
- int bucket;
- yaffs_Device *dev = tn->myDev;
-
- /* If it is still linked into the bucket list, free from the list */
-- if (!list_empty(&tn->hashLink)) {
-- list_del_init(&tn->hashLink);
-+ if (!ylist_empty(&tn->hashLink)) {
-+ ylist_del_init(&tn->hashLink);
- bucket = yaffs_HashFunction(tn->objectId);
- dev->objectBucket[bucket].count--;
- }
--
- }
-
- /* FreeObject frees up a Object and puts it back on the free list */
--static void yaffs_FreeObject(yaffs_Object * tn)
-+static void yaffs_FreeObject(yaffs_Object *tn)
- {
--
- yaffs_Device *dev = tn->myDev;
-
--#ifdef __KERNEL__
-+#ifdef __KERNEL__
-+ T(YAFFS_TRACE_OS, (TSTR("FreeObject %p inode %p"TENDSTR), tn, tn->myInode));
-+#endif
-+
-+ if (tn->parent)
-+ YBUG();
-+ if (!ylist_empty(&tn->siblings))
-+ YBUG();
-+
-+
-+#ifdef __KERNEL__
- if (tn->myInode) {
- /* We're still hooked up to a cached inode.
- * Don't delete now, but mark for later deletion
-@@ -1963,24 +2000,28 @@ static void yaffs_FreeObject(yaffs_Objec
-
- yaffs_UnhashObject(tn);
-
-+#ifdef VALGRIND_TEST
-+ YFREE(tn);
-+#else
- /* Link into the free list. */
-- tn->siblings.next = (struct list_head *)(dev->freeObjects);
-+ tn->siblings.next = (struct ylist_head *)(dev->freeObjects);
- dev->freeObjects = tn;
- dev->nFreeObjects++;
-+#endif
-+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
- }
-
- #ifdef __KERNEL__
-
--void yaffs_HandleDeferedFree(yaffs_Object * obj)
-+void yaffs_HandleDeferedFree(yaffs_Object *obj)
- {
-- if (obj->deferedFree) {
-+ if (obj->deferedFree)
- yaffs_FreeObject(obj);
-- }
- }
-
- #endif
-
--static void yaffs_DeinitialiseObjects(yaffs_Device * dev)
-+static void yaffs_DeinitialiseObjects(yaffs_Device *dev)
- {
- /* Free the list of allocated Objects */
-
-@@ -1998,7 +2039,7 @@ static void yaffs_DeinitialiseObjects(ya
- dev->nFreeObjects = 0;
- }
-
--static void yaffs_InitialiseObjects(yaffs_Device * dev)
-+static void yaffs_InitialiseObjects(yaffs_Device *dev)
- {
- int i;
-
-@@ -2007,15 +2048,14 @@ static void yaffs_InitialiseObjects(yaff
- dev->nFreeObjects = 0;
-
- for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) {
-- INIT_LIST_HEAD(&dev->objectBucket[i].list);
-+ YINIT_LIST_HEAD(&dev->objectBucket[i].list);
- dev->objectBucket[i].count = 0;
- }
--
- }
-
--static int yaffs_FindNiceObjectBucket(yaffs_Device * dev)
-+static int yaffs_FindNiceObjectBucket(yaffs_Device *dev)
- {
-- static int x = 0;
-+ static int x;
- int i;
- int l = 999;
- int lowest = 999999;
-@@ -2049,7 +2089,7 @@ static int yaffs_FindNiceObjectBucket(ya
- return l;
- }
-
--static int yaffs_CreateNewObjectNumber(yaffs_Device * dev)
-+static int yaffs_CreateNewObjectNumber(yaffs_Device *dev)
- {
- int bucket = yaffs_FindNiceObjectBucket(dev);
-
-@@ -2058,7 +2098,7 @@ static int yaffs_CreateNewObjectNumber(y
- */
-
- int found = 0;
-- struct list_head *i;
-+ struct ylist_head *i;
-
- __u32 n = (__u32) bucket;
-
-@@ -2068,41 +2108,38 @@ static int yaffs_CreateNewObjectNumber(y
- found = 1;
- n += YAFFS_NOBJECT_BUCKETS;
- if (1 || dev->objectBucket[bucket].count > 0) {
-- list_for_each(i, &dev->objectBucket[bucket].list) {
-+ ylist_for_each(i, &dev->objectBucket[bucket].list) {
- /* If there is already one in the list */
-- if (i
-- && list_entry(i, yaffs_Object,
-- hashLink)->objectId == n) {
-+ if (i && ylist_entry(i, yaffs_Object,
-+ hashLink)->objectId == n) {
- found = 0;
- }
- }
- }
- }
-
--
- return n;
- }
-
--static void yaffs_HashObject(yaffs_Object * in)
-+static void yaffs_HashObject(yaffs_Object *in)
- {
- int bucket = yaffs_HashFunction(in->objectId);
- yaffs_Device *dev = in->myDev;
-
-- list_add(&in->hashLink, &dev->objectBucket[bucket].list);
-+ ylist_add(&in->hashLink, &dev->objectBucket[bucket].list);
- dev->objectBucket[bucket].count++;
--
- }
-
--yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device * dev, __u32 number)
-+yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev, __u32 number)
- {
- int bucket = yaffs_HashFunction(number);
-- struct list_head *i;
-+ struct ylist_head *i;
- yaffs_Object *in;
-
-- list_for_each(i, &dev->objectBucket[bucket].list) {
-+ ylist_for_each(i, &dev->objectBucket[bucket].list) {
- /* Look if it is in the list */
- if (i) {
-- in = list_entry(i, yaffs_Object, hashLink);
-+ in = ylist_entry(i, yaffs_Object, hashLink);
- if (in->objectId == number) {
- #ifdef __KERNEL__
- /* Don't tell the VFS about this one if it is defered free */
-@@ -2118,31 +2155,27 @@ yaffs_Object *yaffs_FindObjectByNumber(y
- return NULL;
- }
-
--yaffs_Object *yaffs_CreateNewObject(yaffs_Device * dev, int number,
-+yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number,
- yaffs_ObjectType type)
- {
--
- yaffs_Object *theObject;
-- yaffs_Tnode *tn;
-+ yaffs_Tnode *tn = NULL;
-
-- if (number < 0) {
-+ if (number < 0)
- number = yaffs_CreateNewObjectNumber(dev);
-- }
-
- theObject = yaffs_AllocateEmptyObject(dev);
-- if(!theObject)
-+ if (!theObject)
- return NULL;
-
-- if(type == YAFFS_OBJECT_TYPE_FILE){
-+ if (type == YAFFS_OBJECT_TYPE_FILE) {
- tn = yaffs_GetTnode(dev);
-- if(!tn){
-+ if (!tn) {
- yaffs_FreeObject(theObject);
- return NULL;
- }
- }
-
--
--
- if (theObject) {
- theObject->fake = 0;
- theObject->renameAllowed = 1;
-@@ -2171,8 +2204,8 @@ yaffs_Object *yaffs_CreateNewObject(yaff
- theObject->variant.fileVariant.top = tn;
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-- INIT_LIST_HEAD(&theObject->variant.directoryVariant.
-- children);
-+ YINIT_LIST_HEAD(&theObject->variant.directoryVariant.
-+ children);
- break;
- case YAFFS_OBJECT_TYPE_SYMLINK:
- case YAFFS_OBJECT_TYPE_HARDLINK:
-@@ -2188,32 +2221,30 @@ yaffs_Object *yaffs_CreateNewObject(yaff
- return theObject;
- }
-
--static yaffs_Object *yaffs_FindOrCreateObjectByNumber(yaffs_Device * dev,
-+static yaffs_Object *yaffs_FindOrCreateObjectByNumber(yaffs_Device *dev,
- int number,
- yaffs_ObjectType type)
- {
- yaffs_Object *theObject = NULL;
-
-- if (number > 0) {
-+ if (number > 0)
- theObject = yaffs_FindObjectByNumber(dev, number);
-- }
-
-- if (!theObject) {
-+ if (!theObject)
- theObject = yaffs_CreateNewObject(dev, number, type);
-- }
-
- return theObject;
-
- }
-
-
--static YCHAR *yaffs_CloneString(const YCHAR * str)
-+static YCHAR *yaffs_CloneString(const YCHAR *str)
- {
- YCHAR *newStr = NULL;
-
- if (str && *str) {
- newStr = YMALLOC((yaffs_strlen(str) + 1) * sizeof(YCHAR));
-- if(newStr)
-+ if (newStr)
- yaffs_strcpy(newStr, str);
- }
-
-@@ -2229,29 +2260,31 @@ static YCHAR *yaffs_CloneString(const YC
- */
-
- static yaffs_Object *yaffs_MknodObject(yaffs_ObjectType type,
-- yaffs_Object * parent,
-- const YCHAR * name,
-+ yaffs_Object *parent,
-+ const YCHAR *name,
- __u32 mode,
- __u32 uid,
- __u32 gid,
-- yaffs_Object * equivalentObject,
-- const YCHAR * aliasString, __u32 rdev)
-+ yaffs_Object *equivalentObject,
-+ const YCHAR *aliasString, __u32 rdev)
- {
- yaffs_Object *in;
-- YCHAR *str;
-+ YCHAR *str = NULL;
-
- yaffs_Device *dev = parent->myDev;
-
- /* Check if the entry exists. If it does then fail the call since we don't want a dup.*/
-- if (yaffs_FindObjectByName(parent, name)) {
-+ if (yaffs_FindObjectByName(parent, name))
- return NULL;
-- }
-
- in = yaffs_CreateNewObject(dev, -1, type);
-
-- if(type == YAFFS_OBJECT_TYPE_SYMLINK){
-+ if (!in)
-+ return YAFFS_FAIL;
-+
-+ if (type == YAFFS_OBJECT_TYPE_SYMLINK) {
- str = yaffs_CloneString(aliasString);
-- if(!str){
-+ if (!str) {
- yaffs_FreeObject(in);
- return NULL;
- }
-@@ -2260,7 +2293,7 @@ static yaffs_Object *yaffs_MknodObject(y
-
-
- if (in) {
-- in->chunkId = -1;
-+ in->hdrChunk = 0;
- in->valid = 1;
- in->variantType = type;
-
-@@ -2293,10 +2326,10 @@ static yaffs_Object *yaffs_MknodObject(y
- break;
- case YAFFS_OBJECT_TYPE_HARDLINK:
- in->variant.hardLinkVariant.equivalentObject =
-- equivalentObject;
-+ equivalentObject;
- in->variant.hardLinkVariant.equivalentObjectId =
-- equivalentObject->objectId;
-- list_add(&in->hardLinks, &equivalentObject->hardLinks);
-+ equivalentObject->objectId;
-+ ylist_add(&in->hardLinks, &equivalentObject->hardLinks);
- break;
- case YAFFS_OBJECT_TYPE_FILE:
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-@@ -2308,7 +2341,7 @@ static yaffs_Object *yaffs_MknodObject(y
-
- if (yaffs_UpdateObjectHeader(in, name, 0, 0, 0) < 0) {
- /* Could not create the object header, fail the creation */
-- yaffs_DestroyObject(in);
-+ yaffs_DeleteObject(in);
- in = NULL;
- }
-
-@@ -2317,38 +2350,38 @@ static yaffs_Object *yaffs_MknodObject(y
- return in;
- }
-
--yaffs_Object *yaffs_MknodFile(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid)
-+yaffs_Object *yaffs_MknodFile(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid)
- {
- return yaffs_MknodObject(YAFFS_OBJECT_TYPE_FILE, parent, name, mode,
-- uid, gid, NULL, NULL, 0);
-+ uid, gid, NULL, NULL, 0);
- }
-
--yaffs_Object *yaffs_MknodDirectory(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid)
-+yaffs_Object *yaffs_MknodDirectory(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid)
- {
- return yaffs_MknodObject(YAFFS_OBJECT_TYPE_DIRECTORY, parent, name,
- mode, uid, gid, NULL, NULL, 0);
- }
-
--yaffs_Object *yaffs_MknodSpecial(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid, __u32 rdev)
-+yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid, __u32 rdev)
- {
- return yaffs_MknodObject(YAFFS_OBJECT_TYPE_SPECIAL, parent, name, mode,
- uid, gid, NULL, NULL, rdev);
- }
-
--yaffs_Object *yaffs_MknodSymLink(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid,
-- const YCHAR * alias)
-+yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid,
-+ const YCHAR *alias)
- {
- return yaffs_MknodObject(YAFFS_OBJECT_TYPE_SYMLINK, parent, name, mode,
-- uid, gid, NULL, alias, 0);
-+ uid, gid, NULL, alias, 0);
- }
-
- /* yaffs_Link returns the object id of the equivalent object.*/
--yaffs_Object *yaffs_Link(yaffs_Object * parent, const YCHAR * name,
-- yaffs_Object * equivalentObject)
-+yaffs_Object *yaffs_Link(yaffs_Object *parent, const YCHAR *name,
-+ yaffs_Object *equivalentObject)
- {
- /* Get the real object in case we were fed a hard link as an equivalent object */
- equivalentObject = yaffs_GetEquivalentObject(equivalentObject);
-@@ -2363,33 +2396,31 @@ yaffs_Object *yaffs_Link(yaffs_Object *
-
- }
-
--static int yaffs_ChangeObjectName(yaffs_Object * obj, yaffs_Object * newDir,
-- const YCHAR * newName, int force, int shadows)
-+static int yaffs_ChangeObjectName(yaffs_Object *obj, yaffs_Object *newDir,
-+ const YCHAR *newName, int force, int shadows)
- {
- int unlinkOp;
- int deleteOp;
-
- yaffs_Object *existingTarget;
-
-- if (newDir == NULL) {
-+ if (newDir == NULL)
- newDir = obj->parent; /* use the old directory */
-- }
-
- if (newDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
-- ("tragendy: yaffs_ChangeObjectName: newDir is not a directory"
-+ ("tragedy: yaffs_ChangeObjectName: newDir is not a directory"
- TENDSTR)));
- YBUG();
- }
-
- /* TODO: Do we need this different handling for YAFFS2 and YAFFS1?? */
-- if (obj->myDev->isYaffs2) {
-+ if (obj->myDev->isYaffs2)
- unlinkOp = (newDir == obj->myDev->unlinkedDir);
-- } else {
-+ else
- unlinkOp = (newDir == obj->myDev->unlinkedDir
- && obj->variantType == YAFFS_OBJECT_TYPE_FILE);
-- }
-
- deleteOp = (newDir == obj->myDev->deletedDir);
-
-@@ -2415,40 +2446,40 @@ static int yaffs_ChangeObjectName(yaffs_
- obj->unlinked = 1;
-
- /* If it is a deletion then we mark it as a shrink for gc purposes. */
-- if (yaffs_UpdateObjectHeader(obj, newName, 0, deleteOp, shadows)>= 0)
-+ if (yaffs_UpdateObjectHeader(obj, newName, 0, deleteOp, shadows) >= 0)
- return YAFFS_OK;
- }
-
- return YAFFS_FAIL;
- }
-
--int yaffs_RenameObject(yaffs_Object * oldDir, const YCHAR * oldName,
-- yaffs_Object * newDir, const YCHAR * newName)
-+int yaffs_RenameObject(yaffs_Object *oldDir, const YCHAR *oldName,
-+ yaffs_Object *newDir, const YCHAR *newName)
- {
-- yaffs_Object *obj;
-- yaffs_Object *existingTarget;
-+ yaffs_Object *obj = NULL;
-+ yaffs_Object *existingTarget = NULL;
- int force = 0;
-
-+
-+ if (!oldDir || oldDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY)
-+ YBUG();
-+ if (!newDir || newDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY)
-+ YBUG();
-+
- #ifdef CONFIG_YAFFS_CASE_INSENSITIVE
- /* Special case for case insemsitive systems (eg. WinCE).
- * While look-up is case insensitive, the name isn't.
- * Therefore we might want to change x.txt to X.txt
- */
-- if (oldDir == newDir && yaffs_strcmp(oldName, newName) == 0) {
-+ if (oldDir == newDir && yaffs_strcmp(oldName, newName) == 0)
- force = 1;
-- }
- #endif
-
-+ else if (yaffs_strlen(newName) > YAFFS_MAX_NAME_LENGTH)
-+ /* ENAMETOOLONG */
-+ return YAFFS_FAIL;
-+
- obj = yaffs_FindObjectByName(oldDir, oldName);
-- /* Check new name to long. */
-- if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK &&
-- yaffs_strlen(newName) > YAFFS_MAX_ALIAS_LENGTH)
-- /* ENAMETOOLONG */
-- return YAFFS_FAIL;
-- else if (obj->variantType != YAFFS_OBJECT_TYPE_SYMLINK &&
-- yaffs_strlen(newName) > YAFFS_MAX_NAME_LENGTH)
-- /* ENAMETOOLONG */
-- return YAFFS_FAIL;
-
- if (obj && obj->renameAllowed) {
-
-@@ -2456,8 +2487,8 @@ int yaffs_RenameObject(yaffs_Object * ol
-
- existingTarget = yaffs_FindObjectByName(newDir, newName);
- if (existingTarget &&
-- existingTarget->variantType == YAFFS_OBJECT_TYPE_DIRECTORY &&
-- !list_empty(&existingTarget->variant.directoryVariant.children)) {
-+ existingTarget->variantType == YAFFS_OBJECT_TYPE_DIRECTORY &&
-+ !ylist_empty(&existingTarget->variant.directoryVariant.children)) {
- /* There is a target that is a non-empty directory, so we fail */
- return YAFFS_FAIL; /* EEXIST or ENOTEMPTY */
- } else if (existingTarget && existingTarget != obj) {
-@@ -2465,7 +2496,7 @@ int yaffs_RenameObject(yaffs_Object * ol
- * but only if it isn't the same object
- */
- yaffs_ChangeObjectName(obj, newDir, newName, force,
-- existingTarget->objectId);
-+ existingTarget->objectId);
- yaffs_UnlinkObject(existingTarget);
- }
-
-@@ -2476,7 +2507,7 @@ int yaffs_RenameObject(yaffs_Object * ol
-
- /*------------------------- Block Management and Page Allocation ----------------*/
-
--static int yaffs_InitialiseBlocks(yaffs_Device * dev)
-+static int yaffs_InitialiseBlocks(yaffs_Device *dev)
- {
- int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1;
-
-@@ -2487,23 +2518,20 @@ static int yaffs_InitialiseBlocks(yaffs_
-
- /* If the first allocation strategy fails, thry the alternate one */
- dev->blockInfo = YMALLOC(nBlocks * sizeof(yaffs_BlockInfo));
-- if(!dev->blockInfo){
-+ if (!dev->blockInfo) {
- dev->blockInfo = YMALLOC_ALT(nBlocks * sizeof(yaffs_BlockInfo));
- dev->blockInfoAlt = 1;
-- }
-- else
-+ } else
- dev->blockInfoAlt = 0;
-
-- if(dev->blockInfo){
--
-+ if (dev->blockInfo) {
- /* Set up dynamic blockinfo stuff. */
- dev->chunkBitmapStride = (dev->nChunksPerBlock + 7) / 8; /* round up bytes */
- dev->chunkBits = YMALLOC(dev->chunkBitmapStride * nBlocks);
-- if(!dev->chunkBits){
-+ if (!dev->chunkBits) {
- dev->chunkBits = YMALLOC_ALT(dev->chunkBitmapStride * nBlocks);
- dev->chunkBitsAlt = 1;
-- }
-- else
-+ } else
- dev->chunkBitsAlt = 0;
- }
-
-@@ -2514,30 +2542,29 @@ static int yaffs_InitialiseBlocks(yaffs_
- }
-
- return YAFFS_FAIL;
--
- }
-
--static void yaffs_DeinitialiseBlocks(yaffs_Device * dev)
-+static void yaffs_DeinitialiseBlocks(yaffs_Device *dev)
- {
-- if(dev->blockInfoAlt && dev->blockInfo)
-+ if (dev->blockInfoAlt && dev->blockInfo)
- YFREE_ALT(dev->blockInfo);
-- else if(dev->blockInfo)
-+ else if (dev->blockInfo)
- YFREE(dev->blockInfo);
-
- dev->blockInfoAlt = 0;
-
- dev->blockInfo = NULL;
-
-- if(dev->chunkBitsAlt && dev->chunkBits)
-+ if (dev->chunkBitsAlt && dev->chunkBits)
- YFREE_ALT(dev->chunkBits);
-- else if(dev->chunkBits)
-+ else if (dev->chunkBits)
- YFREE(dev->chunkBits);
- dev->chunkBitsAlt = 0;
- dev->chunkBits = NULL;
- }
-
--static int yaffs_BlockNotDisqualifiedFromGC(yaffs_Device * dev,
-- yaffs_BlockInfo * bi)
-+static int yaffs_BlockNotDisqualifiedFromGC(yaffs_Device *dev,
-+ yaffs_BlockInfo *bi)
- {
- int i;
- __u32 seq;
-@@ -2556,7 +2583,7 @@ static int yaffs_BlockNotDisqualifiedFro
- seq = dev->sequenceNumber;
-
- for (i = dev->internalStartBlock; i <= dev->internalEndBlock;
-- i++) {
-+ i++) {
- b = yaffs_GetBlockInfo(dev, i);
- if (b->blockState == YAFFS_BLOCK_STATE_FULL &&
- (b->pagesInUse - b->softDeletions) <
-@@ -2571,38 +2598,36 @@ static int yaffs_BlockNotDisqualifiedFro
- * discarded pages.
- */
- return (bi->sequenceNumber <= dev->oldestDirtySequence);
--
- }
-
- /* FindDiretiestBlock is used to select the dirtiest block (or close enough)
- * for garbage collection.
- */
-
--static int yaffs_FindBlockForGarbageCollection(yaffs_Device * dev,
-- int aggressive)
-+static int yaffs_FindBlockForGarbageCollection(yaffs_Device *dev,
-+ int aggressive)
- {
--
- int b = dev->currentDirtyChecker;
-
- int i;
- int iterations;
- int dirtiest = -1;
- int pagesInUse = 0;
-- int prioritised=0;
-+ int prioritised = 0;
- yaffs_BlockInfo *bi;
- int pendingPrioritisedExist = 0;
-
- /* First let's see if we need to grab a prioritised block */
-- if(dev->hasPendingPrioritisedGCs){
-- for(i = dev->internalStartBlock; i < dev->internalEndBlock && !prioritised; i++){
-+ if (dev->hasPendingPrioritisedGCs) {
-+ for (i = dev->internalStartBlock; i < dev->internalEndBlock && !prioritised; i++) {
-
- bi = yaffs_GetBlockInfo(dev, i);
-- //yaffs_VerifyBlock(dev,bi,i);
-+ /* yaffs_VerifyBlock(dev,bi,i); */
-
-- if(bi->gcPrioritise) {
-+ if (bi->gcPrioritise) {
- pendingPrioritisedExist = 1;
-- if(bi->blockState == YAFFS_BLOCK_STATE_FULL &&
-- yaffs_BlockNotDisqualifiedFromGC(dev, bi)){
-+ if (bi->blockState == YAFFS_BLOCK_STATE_FULL &&
-+ yaffs_BlockNotDisqualifiedFromGC(dev, bi)) {
- pagesInUse = (bi->pagesInUse - bi->softDeletions);
- dirtiest = i;
- prioritised = 1;
-@@ -2611,7 +2636,7 @@ static int yaffs_FindBlockForGarbageColl
- }
- }
-
-- if(!pendingPrioritisedExist) /* None found, so we can clear this */
-+ if (!pendingPrioritisedExist) /* None found, so we can clear this */
- dev->hasPendingPrioritisedGCs = 0;
- }
-
-@@ -2623,31 +2648,28 @@ static int yaffs_FindBlockForGarbageColl
-
- dev->nonAggressiveSkip--;
-
-- if (!aggressive && (dev->nonAggressiveSkip > 0)) {
-+ if (!aggressive && (dev->nonAggressiveSkip > 0))
- return -1;
-- }
-
-- if(!prioritised)
-+ if (!prioritised)
- pagesInUse =
-- (aggressive) ? dev->nChunksPerBlock : YAFFS_PASSIVE_GC_CHUNKS + 1;
-+ (aggressive) ? dev->nChunksPerBlock : YAFFS_PASSIVE_GC_CHUNKS + 1;
-
-- if (aggressive) {
-+ if (aggressive)
- iterations =
- dev->internalEndBlock - dev->internalStartBlock + 1;
-- } else {
-+ else {
- iterations =
- dev->internalEndBlock - dev->internalStartBlock + 1;
- iterations = iterations / 16;
-- if (iterations > 200) {
-+ if (iterations > 200)
- iterations = 200;
-- }
- }
-
- for (i = 0; i <= iterations && pagesInUse > 0 && !prioritised; i++) {
- b++;
-- if (b < dev->internalStartBlock || b > dev->internalEndBlock) {
-+ if (b < dev->internalStartBlock || b > dev->internalEndBlock)
- b = dev->internalStartBlock;
-- }
-
- if (b < dev->internalStartBlock || b > dev->internalEndBlock) {
- T(YAFFS_TRACE_ERROR,
-@@ -2657,17 +2679,9 @@ static int yaffs_FindBlockForGarbageColl
-
- bi = yaffs_GetBlockInfo(dev, b);
-
--#if 0
-- if (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT) {
-- dirtiest = b;
-- pagesInUse = 0;
-- }
-- else
--#endif
--
- if (bi->blockState == YAFFS_BLOCK_STATE_FULL &&
-- (bi->pagesInUse - bi->softDeletions) < pagesInUse &&
-- yaffs_BlockNotDisqualifiedFromGC(dev, bi)) {
-+ (bi->pagesInUse - bi->softDeletions) < pagesInUse &&
-+ yaffs_BlockNotDisqualifiedFromGC(dev, bi)) {
- dirtiest = b;
- pagesInUse = (bi->pagesInUse - bi->softDeletions);
- }
-@@ -2678,19 +2692,18 @@ static int yaffs_FindBlockForGarbageColl
- if (dirtiest > 0) {
- T(YAFFS_TRACE_GC,
- (TSTR("GC Selected block %d with %d free, prioritised:%d" TENDSTR), dirtiest,
-- dev->nChunksPerBlock - pagesInUse,prioritised));
-+ dev->nChunksPerBlock - pagesInUse, prioritised));
- }
-
- dev->oldestDirtySequence = 0;
-
-- if (dirtiest > 0) {
-+ if (dirtiest > 0)
- dev->nonAggressiveSkip = 4;
-- }
-
- return dirtiest;
- }
-
--static void yaffs_BlockBecameDirty(yaffs_Device * dev, int blockNo)
-+static void yaffs_BlockBecameDirty(yaffs_Device *dev, int blockNo)
- {
- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockNo);
-
-@@ -2752,7 +2765,7 @@ static void yaffs_BlockBecameDirty(yaffs
- }
- }
-
--static int yaffs_FindBlockForAllocation(yaffs_Device * dev)
-+static int yaffs_FindBlockForAllocation(yaffs_Device *dev)
- {
- int i;
-
-@@ -2763,7 +2776,7 @@ static int yaffs_FindBlockForAllocation(
- * Can't get space to gc
- */
- T(YAFFS_TRACE_ERROR,
-- (TSTR("yaffs tragedy: no more eraased blocks" TENDSTR)));
-+ (TSTR("yaffs tragedy: no more erased blocks" TENDSTR)));
-
- return -1;
- }
-@@ -2794,31 +2807,74 @@ static int yaffs_FindBlockForAllocation(
-
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
-- ("yaffs tragedy: no more eraased blocks, but there should have been %d"
-+ ("yaffs tragedy: no more erased blocks, but there should have been %d"
- TENDSTR), dev->nErasedBlocks));
-
- return -1;
- }
-
-
--// Check if there's space to allocate...
--// Thinks.... do we need top make this ths same as yaffs_GetFreeChunks()?
--static int yaffs_CheckSpaceForAllocation(yaffs_Device * dev)
-+
-+static int yaffs_CalcCheckpointBlocksRequired(yaffs_Device *dev)
-+{
-+ if (!dev->nCheckpointBlocksRequired &&
-+ dev->isYaffs2) {
-+ /* Not a valid value so recalculate */
-+ int nBytes = 0;
-+ int nBlocks;
-+ int devBlocks = (dev->endBlock - dev->startBlock + 1);
-+ int tnodeSize;
-+
-+ tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-+
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-+
-+ nBytes += sizeof(yaffs_CheckpointValidity);
-+ nBytes += sizeof(yaffs_CheckpointDevice);
-+ nBytes += devBlocks * sizeof(yaffs_BlockInfo);
-+ nBytes += devBlocks * dev->chunkBitmapStride;
-+ nBytes += (sizeof(yaffs_CheckpointObject) + sizeof(__u32)) * (dev->nObjectsCreated - dev->nFreeObjects);
-+ nBytes += (tnodeSize + sizeof(__u32)) * (dev->nTnodesCreated - dev->nFreeTnodes);
-+ nBytes += sizeof(yaffs_CheckpointValidity);
-+ nBytes += sizeof(__u32); /* checksum*/
-+
-+ /* Round up and add 2 blocks to allow for some bad blocks, so add 3 */
-+
-+ nBlocks = (nBytes/(dev->nDataBytesPerChunk * dev->nChunksPerBlock)) + 3;
-+
-+ dev->nCheckpointBlocksRequired = nBlocks;
-+ }
-+
-+ return dev->nCheckpointBlocksRequired;
-+}
-+
-+/*
-+ * Check if there's space to allocate...
-+ * Thinks.... do we need top make this ths same as yaffs_GetFreeChunks()?
-+ */
-+static int yaffs_CheckSpaceForAllocation(yaffs_Device *dev)
- {
- int reservedChunks;
- int reservedBlocks = dev->nReservedBlocks;
- int checkpointBlocks;
-
-- checkpointBlocks = dev->nCheckpointReservedBlocks - dev->blocksInCheckpoint;
-- if(checkpointBlocks < 0)
-+ if (dev->isYaffs2) {
-+ checkpointBlocks = yaffs_CalcCheckpointBlocksRequired(dev) -
-+ dev->blocksInCheckpoint;
-+ if (checkpointBlocks < 0)
-+ checkpointBlocks = 0;
-+ } else {
- checkpointBlocks = 0;
-+ }
-
- reservedChunks = ((reservedBlocks + checkpointBlocks) * dev->nChunksPerBlock);
-
- return (dev->nFreeChunks > reservedChunks);
- }
-
--static int yaffs_AllocateChunk(yaffs_Device * dev, int useReserve, yaffs_BlockInfo **blockUsedPtr)
-+static int yaffs_AllocateChunk(yaffs_Device *dev, int useReserve,
-+ yaffs_BlockInfo **blockUsedPtr)
- {
- int retVal;
- yaffs_BlockInfo *bi;
-@@ -2835,7 +2891,7 @@ static int yaffs_AllocateChunk(yaffs_Dev
- }
-
- if (dev->nErasedBlocks < dev->nReservedBlocks
-- && dev->allocationPage == 0) {
-+ && dev->allocationPage == 0) {
- T(YAFFS_TRACE_ALLOCATE, (TSTR("Allocating reserve" TENDSTR)));
- }
-
-@@ -2844,10 +2900,10 @@ static int yaffs_AllocateChunk(yaffs_Dev
- bi = yaffs_GetBlockInfo(dev, dev->allocationBlock);
-
- retVal = (dev->allocationBlock * dev->nChunksPerBlock) +
-- dev->allocationPage;
-+ dev->allocationPage;
- bi->pagesInUse++;
- yaffs_SetChunkBit(dev, dev->allocationBlock,
-- dev->allocationPage);
-+ dev->allocationPage);
-
- dev->allocationPage++;
-
-@@ -2859,43 +2915,43 @@ static int yaffs_AllocateChunk(yaffs_Dev
- dev->allocationBlock = -1;
- }
-
-- if(blockUsedPtr)
-+ if (blockUsedPtr)
- *blockUsedPtr = bi;
-
- return retVal;
- }
-
- T(YAFFS_TRACE_ERROR,
-- (TSTR("!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!" TENDSTR)));
-+ (TSTR("!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!" TENDSTR)));
-
- return -1;
- }
-
--static int yaffs_GetErasedChunks(yaffs_Device * dev)
-+static int yaffs_GetErasedChunks(yaffs_Device *dev)
- {
- int n;
-
- n = dev->nErasedBlocks * dev->nChunksPerBlock;
-
-- if (dev->allocationBlock > 0) {
-+ if (dev->allocationBlock > 0)
- n += (dev->nChunksPerBlock - dev->allocationPage);
-- }
-
- return n;
-
- }
-
--static int yaffs_GarbageCollectBlock(yaffs_Device * dev, int block)
-+static int yaffs_GarbageCollectBlock(yaffs_Device *dev, int block,
-+ int wholeBlock)
- {
- int oldChunk;
- int newChunk;
-- int chunkInBlock;
- int markNAND;
- int retVal = YAFFS_OK;
- int cleanups = 0;
- int i;
- int isCheckpointBlock;
- int matchingChunk;
-+ int maxCopies;
-
- int chunksBefore = yaffs_GetErasedChunks(dev);
- int chunksAfter;
-@@ -2911,8 +2967,11 @@ static int yaffs_GarbageCollectBlock(yaf
- bi->blockState = YAFFS_BLOCK_STATE_COLLECTING;
-
- T(YAFFS_TRACE_TRACING,
-- (TSTR("Collecting block %d, in use %d, shrink %d, " TENDSTR), block,
-- bi->pagesInUse, bi->hasShrinkHeader));
-+ (TSTR("Collecting block %d, in use %d, shrink %d, wholeBlock %d" TENDSTR),
-+ block,
-+ bi->pagesInUse,
-+ bi->hasShrinkHeader,
-+ wholeBlock));
-
- /*yaffs_VerifyFreeChunks(dev); */
-
-@@ -2926,26 +2985,33 @@ static int yaffs_GarbageCollectBlock(yaf
- dev->isDoingGC = 1;
-
- if (isCheckpointBlock ||
-- !yaffs_StillSomeChunkBits(dev, block)) {
-+ !yaffs_StillSomeChunkBits(dev, block)) {
- T(YAFFS_TRACE_TRACING,
-- (TSTR
-- ("Collecting block %d that has no chunks in use" TENDSTR),
-- block));
-+ (TSTR
-+ ("Collecting block %d that has no chunks in use" TENDSTR),
-+ block));
- yaffs_BlockBecameDirty(dev, block);
- } else {
-
- __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__);
-
-- yaffs_VerifyBlock(dev,bi,block);
-+ yaffs_VerifyBlock(dev, bi, block);
-
-- for (chunkInBlock = 0, oldChunk = block * dev->nChunksPerBlock;
-- chunkInBlock < dev->nChunksPerBlock
-- && yaffs_StillSomeChunkBits(dev, block);
-- chunkInBlock++, oldChunk++) {
-- if (yaffs_CheckChunkBit(dev, block, chunkInBlock)) {
-+ maxCopies = (wholeBlock) ? dev->nChunksPerBlock : 10;
-+ oldChunk = block * dev->nChunksPerBlock + dev->gcChunk;
-+
-+ for (/* init already done */;
-+ retVal == YAFFS_OK &&
-+ dev->gcChunk < dev->nChunksPerBlock &&
-+ (bi->blockState == YAFFS_BLOCK_STATE_COLLECTING) &&
-+ maxCopies > 0;
-+ dev->gcChunk++, oldChunk++) {
-+ if (yaffs_CheckChunkBit(dev, block, dev->gcChunk)) {
-
- /* This page is in use and might need to be copied off */
-
-+ maxCopies--;
-+
- markNAND = 1;
-
- yaffs_InitialiseTags(&tags);
-@@ -2959,22 +3025,22 @@ static int yaffs_GarbageCollectBlock(yaf
-
- T(YAFFS_TRACE_GC_DETAIL,
- (TSTR
-- ("Collecting page %d, %d %d %d " TENDSTR),
-- chunkInBlock, tags.objectId, tags.chunkId,
-+ ("Collecting chunk in block %d, %d %d %d " TENDSTR),
-+ dev->gcChunk, tags.objectId, tags.chunkId,
- tags.byteCount));
-
-- if(object && !yaffs_SkipVerification(dev)){
-- if(tags.chunkId == 0)
-- matchingChunk = object->chunkId;
-- else if(object->softDeleted)
-+ if (object && !yaffs_SkipVerification(dev)) {
-+ if (tags.chunkId == 0)
-+ matchingChunk = object->hdrChunk;
-+ else if (object->softDeleted)
- matchingChunk = oldChunk; /* Defeat the test */
- else
-- matchingChunk = yaffs_FindChunkInFile(object,tags.chunkId,NULL);
-+ matchingChunk = yaffs_FindChunkInFile(object, tags.chunkId, NULL);
-
-- if(oldChunk != matchingChunk)
-+ if (oldChunk != matchingChunk)
- T(YAFFS_TRACE_ERROR,
- (TSTR("gc: page in gc mismatch: %d %d %d %d"TENDSTR),
-- oldChunk,matchingChunk,tags.objectId, tags.chunkId));
-+ oldChunk, matchingChunk, tags.objectId, tags.chunkId));
-
- }
-
-@@ -2986,9 +3052,11 @@ static int yaffs_GarbageCollectBlock(yaf
- tags.objectId, tags.chunkId, tags.byteCount));
- }
-
-- if (object && object->deleted
-- && tags.chunkId != 0) {
-- /* Data chunk in a deleted file, throw it away
-+ if (object &&
-+ object->deleted &&
-+ object->softDeleted &&
-+ tags.chunkId != 0) {
-+ /* Data chunk in a soft deleted file, throw it away
- * It's a soft deleted data chunk,
- * No need to copy this, just forget about it and
- * fix up the object.
-@@ -3003,13 +3071,12 @@ static int yaffs_GarbageCollectBlock(yaf
- cleanups++;
- }
- markNAND = 0;
-- } else if (0
-- /* Todo object && object->deleted && object->nDataChunks == 0 */
-- ) {
-+ } else if (0) {
-+ /* Todo object && object->deleted && object->nDataChunks == 0 */
- /* Deleted object header with no data chunks.
- * Can be discarded and the file deleted.
- */
-- object->chunkId = 0;
-+ object->hdrChunk = 0;
- yaffs_FreeTnode(object->myDev,
- object->variant.
- fileVariant.top);
-@@ -3031,17 +3098,14 @@ static int yaffs_GarbageCollectBlock(yaf
- * We need to nuke the shrinkheader flags first
- * We no longer want the shrinkHeader flag since its work is done
- * and if it is left in place it will mess up scanning.
-- * Also, clear out any shadowing stuff
- */
-
- yaffs_ObjectHeader *oh;
- oh = (yaffs_ObjectHeader *)buffer;
- oh->isShrink = 0;
-- oh->shadowsObject = -1;
-- tags.extraShadows = 0;
- tags.extraIsShrinkHeader = 0;
-
-- yaffs_VerifyObjectHeader(object,oh,&tags,1);
-+ yaffs_VerifyObjectHeader(object, oh, &tags, 1);
- }
-
- newChunk =
-@@ -3055,7 +3119,7 @@ static int yaffs_GarbageCollectBlock(yaf
-
- if (tags.chunkId == 0) {
- /* It's a header */
-- object->chunkId = newChunk;
-+ object->hdrChunk = newChunk;
- object->serial = tags.serialNumber;
- } else {
- /* It's a data chunk */
-@@ -3067,7 +3131,8 @@ static int yaffs_GarbageCollectBlock(yaf
- }
- }
-
-- yaffs_DeleteChunk(dev, oldChunk, markNAND, __LINE__);
-+ if (retVal == YAFFS_OK)
-+ yaffs_DeleteChunk(dev, oldChunk, markNAND, __LINE__);
-
- }
- }
-@@ -3098,18 +3163,25 @@ static int yaffs_GarbageCollectBlock(yaf
-
- }
-
-- yaffs_VerifyCollectedBlock(dev,bi,block);
-+ yaffs_VerifyCollectedBlock(dev, bi, block);
-
-- if (chunksBefore >= (chunksAfter = yaffs_GetErasedChunks(dev))) {
-+ chunksAfter = yaffs_GetErasedChunks(dev);
-+ if (chunksBefore >= chunksAfter) {
- T(YAFFS_TRACE_GC,
- (TSTR
- ("gc did not increase free chunks before %d after %d"
- TENDSTR), chunksBefore, chunksAfter));
- }
-
-+ /* If the gc completed then clear the current gcBlock so that we find another. */
-+ if (bi->blockState != YAFFS_BLOCK_STATE_COLLECTING) {
-+ dev->gcBlock = -1;
-+ dev->gcChunk = 0;
-+ }
-+
- dev->isDoingGC = 0;
-
-- return YAFFS_OK;
-+ return retVal;
- }
-
- /* New garbage collector
-@@ -3121,7 +3193,7 @@ static int yaffs_GarbageCollectBlock(yaf
- * The idea is to help clear out space in a more spread-out manner.
- * Dunno if it really does anything useful.
- */
--static int yaffs_CheckGarbageCollection(yaffs_Device * dev)
-+static int yaffs_CheckGarbageCollection(yaffs_Device *dev)
- {
- int block;
- int aggressive;
-@@ -3142,8 +3214,8 @@ static int yaffs_CheckGarbageCollection(
- do {
- maxTries++;
-
-- checkpointBlockAdjust = (dev->nCheckpointReservedBlocks - dev->blocksInCheckpoint);
-- if(checkpointBlockAdjust < 0)
-+ checkpointBlockAdjust = yaffs_CalcCheckpointBlocksRequired(dev) - dev->blocksInCheckpoint;
-+ if (checkpointBlockAdjust < 0)
- checkpointBlockAdjust = 0;
-
- if (dev->nErasedBlocks < (dev->nReservedBlocks + checkpointBlockAdjust + 2)) {
-@@ -3154,20 +3226,24 @@ static int yaffs_CheckGarbageCollection(
- aggressive = 0;
- }
-
-- block = yaffs_FindBlockForGarbageCollection(dev, aggressive);
-+ if (dev->gcBlock <= 0) {
-+ dev->gcBlock = yaffs_FindBlockForGarbageCollection(dev, aggressive);
-+ dev->gcChunk = 0;
-+ }
-+
-+ block = dev->gcBlock;
-
- if (block > 0) {
- dev->garbageCollections++;
-- if (!aggressive) {
-+ if (!aggressive)
- dev->passiveGarbageCollections++;
-- }
-
- T(YAFFS_TRACE_GC,
- (TSTR
- ("yaffs: GC erasedBlocks %d aggressive %d" TENDSTR),
- dev->nErasedBlocks, aggressive));
-
-- gcOk = yaffs_GarbageCollectBlock(dev, block);
-+ gcOk = yaffs_GarbageCollectBlock(dev, block, aggressive);
- }
-
- if (dev->nErasedBlocks < (dev->nReservedBlocks) && block > 0) {
-@@ -3176,15 +3252,16 @@ static int yaffs_CheckGarbageCollection(
- ("yaffs: GC !!!no reclaim!!! erasedBlocks %d after try %d block %d"
- TENDSTR), dev->nErasedBlocks, maxTries, block));
- }
-- } while ((dev->nErasedBlocks < dev->nReservedBlocks) && (block > 0)
-- && (maxTries < 2));
-+ } while ((dev->nErasedBlocks < dev->nReservedBlocks) &&
-+ (block > 0) &&
-+ (maxTries < 2));
-
- return aggressive ? gcOk : YAFFS_OK;
- }
-
- /*------------------------- TAGS --------------------------------*/
-
--static int yaffs_TagsMatch(const yaffs_ExtendedTags * tags, int objectId,
-+static int yaffs_TagsMatch(const yaffs_ExtendedTags *tags, int objectId,
- int chunkInObject)
- {
- return (tags->chunkId == chunkInObject &&
-@@ -3195,8 +3272,8 @@ static int yaffs_TagsMatch(const yaffs_E
-
- /*-------------------- Data file manipulation -----------------*/
-
--static int yaffs_FindChunkInFile(yaffs_Object * in, int chunkInInode,
-- yaffs_ExtendedTags * tags)
-+static int yaffs_FindChunkInFile(yaffs_Object *in, int chunkInInode,
-+ yaffs_ExtendedTags *tags)
- {
- /*Get the Tnode, then get the level 0 offset chunk offset */
- yaffs_Tnode *tn;
-@@ -3214,7 +3291,7 @@ static int yaffs_FindChunkInFile(yaffs_O
- tn = yaffs_FindLevel0Tnode(dev, &in->variant.fileVariant, chunkInInode);
-
- if (tn) {
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,chunkInInode);
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode);
-
- retVal =
- yaffs_FindChunkInGroup(dev, theChunk, tags, in->objectId,
-@@ -3223,8 +3300,8 @@ static int yaffs_FindChunkInFile(yaffs_O
- return retVal;
- }
-
--static int yaffs_FindAndDeleteChunkInFile(yaffs_Object * in, int chunkInInode,
-- yaffs_ExtendedTags * tags)
-+static int yaffs_FindAndDeleteChunkInFile(yaffs_Object *in, int chunkInInode,
-+ yaffs_ExtendedTags *tags)
- {
- /* Get the Tnode, then get the level 0 offset chunk offset */
- yaffs_Tnode *tn;
-@@ -3243,29 +3320,23 @@ static int yaffs_FindAndDeleteChunkInFil
-
- if (tn) {
-
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,chunkInInode);
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode);
-
- retVal =
- yaffs_FindChunkInGroup(dev, theChunk, tags, in->objectId,
- chunkInInode);
-
- /* Delete the entry in the filestructure (if found) */
-- if (retVal != -1) {
-- yaffs_PutLevel0Tnode(dev,tn,chunkInInode,0);
-- }
-- } else {
-- /*T(("No level 0 found for %d\n", chunkInInode)); */
-+ if (retVal != -1)
-+ yaffs_PutLevel0Tnode(dev, tn, chunkInInode, 0);
- }
-
-- if (retVal == -1) {
-- /* T(("Could not find %d to delete\n",chunkInInode)); */
-- }
- return retVal;
- }
-
- #ifdef YAFFS_PARANOID
-
--static int yaffs_CheckFileSanity(yaffs_Object * in)
-+static int yaffs_CheckFileSanity(yaffs_Object *in)
- {
- int chunk;
- int nChunks;
-@@ -3278,10 +3349,8 @@ static int yaffs_CheckFileSanity(yaffs_O
- int theChunk;
- int chunkDeleted;
-
-- if (in->variantType != YAFFS_OBJECT_TYPE_FILE) {
-- /* T(("Object not a file\n")); */
-+ if (in->variantType != YAFFS_OBJECT_TYPE_FILE)
- return YAFFS_FAIL;
-- }
-
- objId = in->objectId;
- fSize = in->variant.fileVariant.fileSize;
-@@ -3294,7 +3363,7 @@ static int yaffs_CheckFileSanity(yaffs_O
-
- if (tn) {
-
-- theChunk = yaffs_GetChunkGroupBase(dev,tn,chunk);
-+ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunk);
-
- if (yaffs_CheckChunkBits
- (dev, theChunk / dev->nChunksPerBlock,
-@@ -3323,7 +3392,7 @@ static int yaffs_CheckFileSanity(yaffs_O
-
- #endif
-
--static int yaffs_PutChunkIntoFile(yaffs_Object * in, int chunkInInode,
-+static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode,
- int chunkInNAND, int inScan)
- {
- /* NB inScan is zero unless scanning.
-@@ -3358,11 +3427,10 @@ static int yaffs_PutChunkIntoFile(yaffs_
- &in->variant.fileVariant,
- chunkInInode,
- NULL);
-- if (!tn) {
-+ if (!tn)
- return YAFFS_FAIL;
-- }
-
-- existingChunk = yaffs_GetChunkGroupBase(dev,tn,chunkInInode);
-+ existingChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode);
-
- if (inScan != 0) {
- /* If we're scanning then we need to test for duplicates
-@@ -3374,7 +3442,7 @@ static int yaffs_PutChunkIntoFile(yaffs_
- * Update: For backward scanning we don't need to re-read tags so this is quite cheap.
- */
-
-- if (existingChunk != 0) {
-+ if (existingChunk > 0) {
- /* NB Right now existing chunk will not be real chunkId if the device >= 32MB
- * thus we have to do a FindChunkInFile to get the real chunk id.
- *
-@@ -3411,8 +3479,10 @@ static int yaffs_PutChunkIntoFile(yaffs_
- * not be loaded during a scan
- */
-
-- newSerial = newTags.serialNumber;
-- existingSerial = existingTags.serialNumber;
-+ if (inScan > 0) {
-+ newSerial = newTags.serialNumber;
-+ existingSerial = existingTags.serialNumber;
-+ }
-
- if ((inScan > 0) &&
- (in->myDev->isYaffs2 ||
-@@ -3437,24 +3507,23 @@ static int yaffs_PutChunkIntoFile(yaffs_
-
- }
-
-- if (existingChunk == 0) {
-+ if (existingChunk == 0)
- in->nDataChunks++;
-- }
-
-- yaffs_PutLevel0Tnode(dev,tn,chunkInInode,chunkInNAND);
-+ yaffs_PutLevel0Tnode(dev, tn, chunkInInode, chunkInNAND);
-
- return YAFFS_OK;
- }
-
--static int yaffs_ReadChunkDataFromObject(yaffs_Object * in, int chunkInInode,
-- __u8 * buffer)
-+static int yaffs_ReadChunkDataFromObject(yaffs_Object *in, int chunkInInode,
-+ __u8 *buffer)
- {
- int chunkInNAND = yaffs_FindChunkInFile(in, chunkInInode, NULL);
-
-- if (chunkInNAND >= 0) {
-+ if (chunkInNAND >= 0)
- return yaffs_ReadChunkWithTagsFromNAND(in->myDev, chunkInNAND,
-- buffer,NULL);
-- } else {
-+ buffer, NULL);
-+ else {
- T(YAFFS_TRACE_NANDACCESS,
- (TSTR("Chunk %d not found zero instead" TENDSTR),
- chunkInNAND));
-@@ -3465,7 +3534,7 @@ static int yaffs_ReadChunkDataFromObject
-
- }
-
--void yaffs_DeleteChunk(yaffs_Device * dev, int chunkId, int markNAND, int lyn)
-+void yaffs_DeleteChunk(yaffs_Device *dev, int chunkId, int markNAND, int lyn)
- {
- int block;
- int page;
-@@ -3475,16 +3544,15 @@ void yaffs_DeleteChunk(yaffs_Device * de
- if (chunkId <= 0)
- return;
-
--
- dev->nDeletions++;
- block = chunkId / dev->nChunksPerBlock;
- page = chunkId % dev->nChunksPerBlock;
-
-
-- if(!yaffs_CheckChunkBit(dev,block,page))
-+ if (!yaffs_CheckChunkBit(dev, block, page))
- T(YAFFS_TRACE_VERIFY,
-- (TSTR("Deleting invalid chunk %d"TENDSTR),
-- chunkId));
-+ (TSTR("Deleting invalid chunk %d"TENDSTR),
-+ chunkId));
-
- bi = yaffs_GetBlockInfo(dev, block);
-
-@@ -3524,14 +3592,12 @@ void yaffs_DeleteChunk(yaffs_Device * de
- yaffs_BlockBecameDirty(dev, block);
- }
-
-- } else {
-- /* T(("Bad news deleting chunk %d\n",chunkId)); */
- }
-
- }
-
--static int yaffs_WriteChunkDataToObject(yaffs_Object * in, int chunkInInode,
-- const __u8 * buffer, int nBytes,
-+static int yaffs_WriteChunkDataToObject(yaffs_Object *in, int chunkInInode,
-+ const __u8 *buffer, int nBytes,
- int useReserve)
- {
- /* Find old chunk Need to do this to get serial number
-@@ -3561,6 +3627,12 @@ static int yaffs_WriteChunkDataToObject(
- (prevChunkId >= 0) ? prevTags.serialNumber + 1 : 1;
- newTags.byteCount = nBytes;
-
-+ if (nBytes < 1 || nBytes > dev->totalBytesPerChunk) {
-+ T(YAFFS_TRACE_ERROR,
-+ (TSTR("Writing %d bytes to chunk!!!!!!!!!" TENDSTR), nBytes));
-+ YBUG();
-+ }
-+
- newChunkId =
- yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags,
- useReserve);
-@@ -3568,11 +3640,9 @@ static int yaffs_WriteChunkDataToObject(
- if (newChunkId >= 0) {
- yaffs_PutChunkIntoFile(in, chunkInInode, newChunkId, 0);
-
-- if (prevChunkId >= 0) {
-+ if (prevChunkId >= 0)
- yaffs_DeleteChunk(dev, prevChunkId, 1, __LINE__);
-
-- }
--
- yaffs_CheckFileSanity(in);
- }
- return newChunkId;
-@@ -3582,7 +3652,7 @@ static int yaffs_WriteChunkDataToObject(
- /* UpdateObjectHeader updates the header on NAND for an object.
- * If name is not NULL, then that new name is used.
- */
--int yaffs_UpdateObjectHeader(yaffs_Object * in, const YCHAR * name, int force,
-+int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name, int force,
- int isShrink, int shadows)
- {
-
-@@ -3603,9 +3673,12 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
-
- yaffs_ObjectHeader *oh = NULL;
-
-- yaffs_strcpy(oldName,"silly old name");
-+ yaffs_strcpy(oldName, _Y("silly old name"));
-
-- if (!in->fake || force) {
-+
-+ if (!in->fake ||
-+ in == dev->rootDir || /* The rootDir should also be saved */
-+ force) {
-
- yaffs_CheckGarbageCollection(dev);
- yaffs_CheckObjectDetailsLoaded(in);
-@@ -3613,13 +3686,13 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
- buffer = yaffs_GetTempBuffer(in->myDev, __LINE__);
- oh = (yaffs_ObjectHeader *) buffer;
-
-- prevChunkId = in->chunkId;
-+ prevChunkId = in->hdrChunk;
-
-- if (prevChunkId >= 0) {
-+ if (prevChunkId > 0) {
- result = yaffs_ReadChunkWithTagsFromNAND(dev, prevChunkId,
- buffer, &oldTags);
-
-- yaffs_VerifyObjectHeader(in,oh,&oldTags,0);
-+ yaffs_VerifyObjectHeader(in, oh, &oldTags, 0);
-
- memcpy(oldName, oh->name, sizeof(oh->name));
- }
-@@ -3628,7 +3701,7 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
-
- oh->type = in->variantType;
- oh->yst_mode = in->yst_mode;
-- oh->shadowsObject = shadows;
-+ oh->shadowsObject = oh->inbandShadowsObject = shadows;
-
- #ifdef CONFIG_YAFFS_WINCE
- oh->win_atime[0] = in->win_atime[0];
-@@ -3645,20 +3718,18 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
- oh->yst_ctime = in->yst_ctime;
- oh->yst_rdev = in->yst_rdev;
- #endif
-- if (in->parent) {
-+ if (in->parent)
- oh->parentObjectId = in->parent->objectId;
-- } else {
-+ else
- oh->parentObjectId = 0;
-- }
-
- if (name && *name) {
- memset(oh->name, 0, sizeof(oh->name));
- yaffs_strncpy(oh->name, name, YAFFS_MAX_NAME_LENGTH);
-- } else if (prevChunkId>=0) {
-+ } else if (prevChunkId >= 0)
- memcpy(oh->name, oldName, sizeof(oh->name));
-- } else {
-+ else
- memset(oh->name, 0, sizeof(oh->name));
-- }
-
- oh->isShrink = isShrink;
-
-@@ -3708,7 +3779,7 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
- newTags.extraShadows = (oh->shadowsObject > 0) ? 1 : 0;
- newTags.extraObjectType = in->variantType;
-
-- yaffs_VerifyObjectHeader(in,oh,&newTags,1);
-+ yaffs_VerifyObjectHeader(in, oh, &newTags, 1);
-
- /* Create new chunk in NAND */
- newChunkId =
-@@ -3717,20 +3788,20 @@ int yaffs_UpdateObjectHeader(yaffs_Objec
-
- if (newChunkId >= 0) {
-
-- in->chunkId = newChunkId;
-+ in->hdrChunk = newChunkId;
-
- if (prevChunkId >= 0) {
- yaffs_DeleteChunk(dev, prevChunkId, 1,
- __LINE__);
- }
-
-- if(!yaffs_ObjectHasCachedWriteData(in))
-+ if (!yaffs_ObjectHasCachedWriteData(in))
- in->dirty = 0;
-
- /* If this was a shrink, then mark the block that the chunk lives on */
- if (isShrink) {
- bi = yaffs_GetBlockInfo(in->myDev,
-- newChunkId /in->myDev-> nChunksPerBlock);
-+ newChunkId / in->myDev->nChunksPerBlock);
- bi->hasShrinkHeader = 1;
- }
-
-@@ -3766,7 +3837,7 @@ static int yaffs_ObjectHasCachedWriteDat
- yaffs_ChunkCache *cache;
- int nCaches = obj->myDev->nShortOpCaches;
-
-- for(i = 0; i < nCaches; i++){
-+ for (i = 0; i < nCaches; i++) {
- cache = &dev->srCache[i];
- if (cache->object == obj &&
- cache->dirty)
-@@ -3777,7 +3848,7 @@ static int yaffs_ObjectHasCachedWriteDat
- }
-
-
--static void yaffs_FlushFilesChunkCache(yaffs_Object * obj)
-+static void yaffs_FlushFilesChunkCache(yaffs_Object *obj)
- {
- yaffs_Device *dev = obj->myDev;
- int lowest = -99; /* Stop compiler whining. */
-@@ -3844,16 +3915,16 @@ void yaffs_FlushEntireDeviceCache(yaffs_
- */
- do {
- obj = NULL;
-- for( i = 0; i < nCaches && !obj; i++) {
-+ for (i = 0; i < nCaches && !obj; i++) {
- if (dev->srCache[i].object &&
- dev->srCache[i].dirty)
- obj = dev->srCache[i].object;
-
- }
-- if(obj)
-+ if (obj)
- yaffs_FlushFilesChunkCache(obj);
-
-- } while(obj);
-+ } while (obj);
-
- }
-
-@@ -3863,41 +3934,21 @@ void yaffs_FlushEntireDeviceCache(yaffs_
- * Then look for the least recently used non-dirty one.
- * Then look for the least recently used dirty one...., flush and look again.
- */
--static yaffs_ChunkCache *yaffs_GrabChunkCacheWorker(yaffs_Device * dev)
-+static yaffs_ChunkCache *yaffs_GrabChunkCacheWorker(yaffs_Device *dev)
- {
- int i;
-- int usage;
-- int theOne;
-
- if (dev->nShortOpCaches > 0) {
- for (i = 0; i < dev->nShortOpCaches; i++) {
- if (!dev->srCache[i].object)
- return &dev->srCache[i];
- }
-+ }
-
-- return NULL;
-+ return NULL;
-+}
-
-- theOne = -1;
-- usage = 0; /* just to stop the compiler grizzling */
--
-- for (i = 0; i < dev->nShortOpCaches; i++) {
-- if (!dev->srCache[i].dirty &&
-- ((dev->srCache[i].lastUse < usage && theOne >= 0) ||
-- theOne < 0)) {
-- usage = dev->srCache[i].lastUse;
-- theOne = i;
-- }
-- }
--
--
-- return theOne >= 0 ? &dev->srCache[theOne] : NULL;
-- } else {
-- return NULL;
-- }
--
--}
--
--static yaffs_ChunkCache *yaffs_GrabChunkCache(yaffs_Device * dev)
-+static yaffs_ChunkCache *yaffs_GrabChunkCache(yaffs_Device *dev)
- {
- yaffs_ChunkCache *cache;
- yaffs_Object *theObj;
-@@ -3927,8 +3978,7 @@ static yaffs_ChunkCache *yaffs_GrabChunk
- for (i = 0; i < dev->nShortOpCaches; i++) {
- if (dev->srCache[i].object &&
- !dev->srCache[i].locked &&
-- (dev->srCache[i].lastUse < usage || !cache))
-- {
-+ (dev->srCache[i].lastUse < usage || !cache)) {
- usage = dev->srCache[i].lastUse;
- theObj = dev->srCache[i].object;
- cache = &dev->srCache[i];
-@@ -3950,7 +4000,7 @@ static yaffs_ChunkCache *yaffs_GrabChunk
- }
-
- /* Find a cached chunk */
--static yaffs_ChunkCache *yaffs_FindChunkCache(const yaffs_Object * obj,
-+static yaffs_ChunkCache *yaffs_FindChunkCache(const yaffs_Object *obj,
- int chunkId)
- {
- yaffs_Device *dev = obj->myDev;
-@@ -3969,7 +4019,7 @@ static yaffs_ChunkCache *yaffs_FindChunk
- }
-
- /* Mark the chunk for the least recently used algorithym */
--static void yaffs_UseChunkCache(yaffs_Device * dev, yaffs_ChunkCache * cache,
-+static void yaffs_UseChunkCache(yaffs_Device *dev, yaffs_ChunkCache *cache,
- int isAWrite)
- {
-
-@@ -3977,9 +4027,9 @@ static void yaffs_UseChunkCache(yaffs_De
- if (dev->srLastUse < 0 || dev->srLastUse > 100000000) {
- /* Reset the cache usages */
- int i;
-- for (i = 1; i < dev->nShortOpCaches; i++) {
-+ for (i = 1; i < dev->nShortOpCaches; i++)
- dev->srCache[i].lastUse = 0;
-- }
-+
- dev->srLastUse = 0;
- }
-
-@@ -3987,9 +4037,8 @@ static void yaffs_UseChunkCache(yaffs_De
-
- cache->lastUse = dev->srLastUse;
-
-- if (isAWrite) {
-+ if (isAWrite)
- cache->dirty = 1;
-- }
- }
- }
-
-@@ -3997,21 +4046,20 @@ static void yaffs_UseChunkCache(yaffs_De
- * Do this when a whole page gets written,
- * ie the short cache for this page is no longer valid.
- */
--static void yaffs_InvalidateChunkCache(yaffs_Object * object, int chunkId)
-+static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId)
- {
- if (object->myDev->nShortOpCaches > 0) {
- yaffs_ChunkCache *cache = yaffs_FindChunkCache(object, chunkId);
-
-- if (cache) {
-+ if (cache)
- cache->object = NULL;
-- }
- }
- }
-
- /* Invalidate all the cache pages associated with this object
- * Do this whenever ther file is deleted or resized.
- */
--static void yaffs_InvalidateWholeChunkCache(yaffs_Object * in)
-+static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in)
- {
- int i;
- yaffs_Device *dev = in->myDev;
-@@ -4019,9 +4067,8 @@ static void yaffs_InvalidateWholeChunkCa
- if (dev->nShortOpCaches > 0) {
- /* Invalidate it. */
- for (i = 0; i < dev->nShortOpCaches; i++) {
-- if (dev->srCache[i].object == in) {
-+ if (dev->srCache[i].object == in)
- dev->srCache[i].object = NULL;
-- }
- }
- }
- }
-@@ -4029,18 +4076,18 @@ static void yaffs_InvalidateWholeChunkCa
- /*--------------------- Checkpointing --------------------*/
-
-
--static int yaffs_WriteCheckpointValidityMarker(yaffs_Device *dev,int head)
-+static int yaffs_WriteCheckpointValidityMarker(yaffs_Device *dev, int head)
- {
- yaffs_CheckpointValidity cp;
-
-- memset(&cp,0,sizeof(cp));
-+ memset(&cp, 0, sizeof(cp));
-
- cp.structType = sizeof(cp);
- cp.magic = YAFFS_MAGIC;
- cp.version = YAFFS_CHECKPOINT_VERSION;
- cp.head = (head) ? 1 : 0;
-
-- return (yaffs_CheckpointWrite(dev,&cp,sizeof(cp)) == sizeof(cp))?
-+ return (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)) ?
- 1 : 0;
- }
-
-@@ -4049,9 +4096,9 @@ static int yaffs_ReadCheckpointValidityM
- yaffs_CheckpointValidity cp;
- int ok;
-
-- ok = (yaffs_CheckpointRead(dev,&cp,sizeof(cp)) == sizeof(cp));
-+ ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp));
-
-- if(ok)
-+ if (ok)
- ok = (cp.structType == sizeof(cp)) &&
- (cp.magic == YAFFS_MAGIC) &&
- (cp.version == YAFFS_CHECKPOINT_VERSION) &&
-@@ -4100,21 +4147,21 @@ static int yaffs_WriteCheckpointDevice(y
- int ok;
-
- /* Write device runtime values*/
-- yaffs_DeviceToCheckpointDevice(&cp,dev);
-+ yaffs_DeviceToCheckpointDevice(&cp, dev);
- cp.structType = sizeof(cp);
-
-- ok = (yaffs_CheckpointWrite(dev,&cp,sizeof(cp)) == sizeof(cp));
-+ ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp));
-
- /* Write block info */
-- if(ok) {
-+ if (ok) {
- nBytes = nBlocks * sizeof(yaffs_BlockInfo);
-- ok = (yaffs_CheckpointWrite(dev,dev->blockInfo,nBytes) == nBytes);
-+ ok = (yaffs_CheckpointWrite(dev, dev->blockInfo, nBytes) == nBytes);
- }
-
- /* Write chunk bits */
-- if(ok) {
-+ if (ok) {
- nBytes = nBlocks * dev->chunkBitmapStride;
-- ok = (yaffs_CheckpointWrite(dev,dev->chunkBits,nBytes) == nBytes);
-+ ok = (yaffs_CheckpointWrite(dev, dev->chunkBits, nBytes) == nBytes);
- }
- return ok ? 1 : 0;
-
-@@ -4128,25 +4175,25 @@ static int yaffs_ReadCheckpointDevice(ya
-
- int ok;
-
-- ok = (yaffs_CheckpointRead(dev,&cp,sizeof(cp)) == sizeof(cp));
-- if(!ok)
-+ ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp));
-+ if (!ok)
- return 0;
-
-- if(cp.structType != sizeof(cp))
-+ if (cp.structType != sizeof(cp))
- return 0;
-
-
-- yaffs_CheckpointDeviceToDevice(dev,&cp);
-+ yaffs_CheckpointDeviceToDevice(dev, &cp);
-
- nBytes = nBlocks * sizeof(yaffs_BlockInfo);
-
-- ok = (yaffs_CheckpointRead(dev,dev->blockInfo,nBytes) == nBytes);
-+ ok = (yaffs_CheckpointRead(dev, dev->blockInfo, nBytes) == nBytes);
-
-- if(!ok)
-+ if (!ok)
- return 0;
- nBytes = nBlocks * dev->chunkBitmapStride;
-
-- ok = (yaffs_CheckpointRead(dev,dev->chunkBits,nBytes) == nBytes);
-+ ok = (yaffs_CheckpointRead(dev, dev->chunkBits, nBytes) == nBytes);
-
- return ok ? 1 : 0;
- }
-@@ -4157,7 +4204,7 @@ static void yaffs_ObjectToCheckpointObje
-
- cp->objectId = obj->objectId;
- cp->parentId = (obj->parent) ? obj->parent->objectId : 0;
-- cp->chunkId = obj->chunkId;
-+ cp->hdrChunk = obj->hdrChunk;
- cp->variantType = obj->variantType;
- cp->deleted = obj->deleted;
- cp->softDeleted = obj->softDeleted;
-@@ -4168,20 +4215,28 @@ static void yaffs_ObjectToCheckpointObje
- cp->serial = obj->serial;
- cp->nDataChunks = obj->nDataChunks;
-
-- if(obj->variantType == YAFFS_OBJECT_TYPE_FILE)
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE)
- cp->fileSizeOrEquivalentObjectId = obj->variant.fileVariant.fileSize;
-- else if(obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK)
-+ else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK)
- cp->fileSizeOrEquivalentObjectId = obj->variant.hardLinkVariant.equivalentObjectId;
- }
-
--static void yaffs_CheckpointObjectToObject( yaffs_Object *obj,yaffs_CheckpointObject *cp)
-+static int yaffs_CheckpointObjectToObject(yaffs_Object *obj, yaffs_CheckpointObject *cp)
- {
-
- yaffs_Object *parent;
-
-+ if (obj->variantType != cp->variantType) {
-+ T(YAFFS_TRACE_ERROR, (TSTR("Checkpoint read object %d type %d "
-+ TCONT("chunk %d does not match existing object type %d")
-+ TENDSTR), cp->objectId, cp->variantType, cp->hdrChunk,
-+ obj->variantType));
-+ return 0;
-+ }
-+
- obj->objectId = cp->objectId;
-
-- if(cp->parentId)
-+ if (cp->parentId)
- parent = yaffs_FindOrCreateObjectByNumber(
- obj->myDev,
- cp->parentId,
-@@ -4189,10 +4244,19 @@ static void yaffs_CheckpointObjectToObje
- else
- parent = NULL;
-
-- if(parent)
-+ if (parent) {
-+ if (parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Checkpoint read object %d parent %d type %d"
-+ TCONT(" chunk %d Parent type, %d, not directory")
-+ TENDSTR),
-+ cp->objectId, cp->parentId, cp->variantType,
-+ cp->hdrChunk, parent->variantType));
-+ return 0;
-+ }
- yaffs_AddObjectToDirectory(parent, obj);
-+ }
-
-- obj->chunkId = cp->chunkId;
-+ obj->hdrChunk = cp->hdrChunk;
- obj->variantType = cp->variantType;
- obj->deleted = cp->deleted;
- obj->softDeleted = cp->softDeleted;
-@@ -4203,29 +4267,34 @@ static void yaffs_CheckpointObjectToObje
- obj->serial = cp->serial;
- obj->nDataChunks = cp->nDataChunks;
-
-- if(obj->variantType == YAFFS_OBJECT_TYPE_FILE)
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE)
- obj->variant.fileVariant.fileSize = cp->fileSizeOrEquivalentObjectId;
-- else if(obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK)
-+ else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK)
- obj->variant.hardLinkVariant.equivalentObjectId = cp->fileSizeOrEquivalentObjectId;
-
-- if(obj->objectId >= YAFFS_NOBJECT_BUCKETS)
-+ if (obj->hdrChunk > 0)
- obj->lazyLoaded = 1;
-+ return 1;
- }
-
-
-
--static int yaffs_CheckpointTnodeWorker(yaffs_Object * in, yaffs_Tnode * tn,
-- __u32 level, int chunkOffset)
-+static int yaffs_CheckpointTnodeWorker(yaffs_Object *in, yaffs_Tnode *tn,
-+ __u32 level, int chunkOffset)
- {
- int i;
- yaffs_Device *dev = in->myDev;
- int ok = 1;
-- int nTnodeBytes = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-+ int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-+
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-+
-
- if (tn) {
- if (level > 0) {
-
-- for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++){
-+ for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++) {
- if (tn->internal[i]) {
- ok = yaffs_CheckpointTnodeWorker(in,
- tn->internal[i],
-@@ -4235,10 +4304,9 @@ static int yaffs_CheckpointTnodeWorker(y
- }
- } else if (level == 0) {
- __u32 baseOffset = chunkOffset << YAFFS_TNODES_LEVEL0_BITS;
-- /* printf("write tnode at %d\n",baseOffset); */
-- ok = (yaffs_CheckpointWrite(dev,&baseOffset,sizeof(baseOffset)) == sizeof(baseOffset));
-- if(ok)
-- ok = (yaffs_CheckpointWrite(dev,tn,nTnodeBytes) == nTnodeBytes);
-+ ok = (yaffs_CheckpointWrite(dev, &baseOffset, sizeof(baseOffset)) == sizeof(baseOffset));
-+ if (ok)
-+ ok = (yaffs_CheckpointWrite(dev, tn, tnodeSize) == tnodeSize);
- }
- }
-
-@@ -4251,13 +4319,13 @@ static int yaffs_WriteCheckpointTnodes(y
- __u32 endMarker = ~0;
- int ok = 1;
-
-- if(obj->variantType == YAFFS_OBJECT_TYPE_FILE){
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) {
- ok = yaffs_CheckpointTnodeWorker(obj,
- obj->variant.fileVariant.top,
- obj->variant.fileVariant.topLevel,
- 0);
-- if(ok)
-- ok = (yaffs_CheckpointWrite(obj->myDev,&endMarker,sizeof(endMarker)) ==
-+ if (ok)
-+ ok = (yaffs_CheckpointWrite(obj->myDev, &endMarker, sizeof(endMarker)) ==
- sizeof(endMarker));
- }
-
-@@ -4272,38 +4340,38 @@ static int yaffs_ReadCheckpointTnodes(ya
- yaffs_FileStructure *fileStructPtr = &obj->variant.fileVariant;
- yaffs_Tnode *tn;
- int nread = 0;
-+ int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;
-
-- ok = (yaffs_CheckpointRead(dev,&baseChunk,sizeof(baseChunk)) == sizeof(baseChunk));
-+ if (tnodeSize < sizeof(yaffs_Tnode))
-+ tnodeSize = sizeof(yaffs_Tnode);
-
-- while(ok && (~baseChunk)){
-+ ok = (yaffs_CheckpointRead(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk));
-+
-+ while (ok && (~baseChunk)) {
- nread++;
- /* Read level 0 tnode */
-
-
-- /* printf("read tnode at %d\n",baseChunk); */
- tn = yaffs_GetTnodeRaw(dev);
-- if(tn)
-- ok = (yaffs_CheckpointRead(dev,tn,(dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8) ==
-- (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8);
-+ if (tn)
-+ ok = (yaffs_CheckpointRead(dev, tn, tnodeSize) == tnodeSize);
- else
- ok = 0;
-
-- if(tn && ok){
-+ if (tn && ok)
- ok = yaffs_AddOrFindLevel0Tnode(dev,
-- fileStructPtr,
-- baseChunk,
-- tn) ? 1 : 0;
-+ fileStructPtr,
-+ baseChunk,
-+ tn) ? 1 : 0;
-
-- }
--
-- if(ok)
-- ok = (yaffs_CheckpointRead(dev,&baseChunk,sizeof(baseChunk)) == sizeof(baseChunk));
-+ if (ok)
-+ ok = (yaffs_CheckpointRead(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk));
-
- }
-
-- T(YAFFS_TRACE_CHECKPOINT,(
-+ T(YAFFS_TRACE_CHECKPOINT, (
- TSTR("Checkpoint read tnodes %d records, last %d. ok %d" TENDSTR),
-- nread,baseChunk,ok));
-+ nread, baseChunk, ok));
-
- return ok ? 1 : 0;
- }
-@@ -4315,41 +4383,40 @@ static int yaffs_WriteCheckpointObjects(
- yaffs_CheckpointObject cp;
- int i;
- int ok = 1;
-- struct list_head *lh;
-+ struct ylist_head *lh;
-
-
- /* Iterate through the objects in each hash entry,
- * dumping them to the checkpointing stream.
- */
-
-- for(i = 0; ok && i < YAFFS_NOBJECT_BUCKETS; i++){
-- list_for_each(lh, &dev->objectBucket[i].list) {
-+ for (i = 0; ok && i < YAFFS_NOBJECT_BUCKETS; i++) {
-+ ylist_for_each(lh, &dev->objectBucket[i].list) {
- if (lh) {
-- obj = list_entry(lh, yaffs_Object, hashLink);
-+ obj = ylist_entry(lh, yaffs_Object, hashLink);
- if (!obj->deferedFree) {
-- yaffs_ObjectToCheckpointObject(&cp,obj);
-+ yaffs_ObjectToCheckpointObject(&cp, obj);
- cp.structType = sizeof(cp);
-
-- T(YAFFS_TRACE_CHECKPOINT,(
-+ T(YAFFS_TRACE_CHECKPOINT, (
- TSTR("Checkpoint write object %d parent %d type %d chunk %d obj addr %x" TENDSTR),
-- cp.objectId,cp.parentId,cp.variantType,cp.chunkId,(unsigned) obj));
-+ cp.objectId, cp.parentId, cp.variantType, cp.hdrChunk, (unsigned) obj));
-
-- ok = (yaffs_CheckpointWrite(dev,&cp,sizeof(cp)) == sizeof(cp));
-+ ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp));
-
-- if(ok && obj->variantType == YAFFS_OBJECT_TYPE_FILE){
-+ if (ok && obj->variantType == YAFFS_OBJECT_TYPE_FILE)
- ok = yaffs_WriteCheckpointTnodes(obj);
-- }
- }
- }
- }
-- }
-+ }
-
-- /* Dump end of list */
-- memset(&cp,0xFF,sizeof(yaffs_CheckpointObject));
-+ /* Dump end of list */
-+ memset(&cp, 0xFF, sizeof(yaffs_CheckpointObject));
- cp.structType = sizeof(cp);
-
-- if(ok)
-- ok = (yaffs_CheckpointWrite(dev,&cp,sizeof(cp)) == sizeof(cp));
-+ if (ok)
-+ ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp));
-
- return ok ? 1 : 0;
- }
-@@ -4362,38 +4429,39 @@ static int yaffs_ReadCheckpointObjects(y
- int done = 0;
- yaffs_Object *hardList = NULL;
-
-- while(ok && !done) {
-- ok = (yaffs_CheckpointRead(dev,&cp,sizeof(cp)) == sizeof(cp));
-- if(cp.structType != sizeof(cp)) {
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("struct size %d instead of %d ok %d"TENDSTR),
-- cp.structType,sizeof(cp),ok));
-+ while (ok && !done) {
-+ ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp));
-+ if (cp.structType != sizeof(cp)) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("struct size %d instead of %d ok %d"TENDSTR),
-+ cp.structType, sizeof(cp), ok));
- ok = 0;
- }
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("Checkpoint read object %d parent %d type %d chunk %d " TENDSTR),
-- cp.objectId,cp.parentId,cp.variantType,cp.chunkId));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("Checkpoint read object %d parent %d type %d chunk %d " TENDSTR),
-+ cp.objectId, cp.parentId, cp.variantType, cp.hdrChunk));
-
-- if(ok && cp.objectId == ~0)
-+ if (ok && cp.objectId == ~0)
- done = 1;
-- else if(ok){
-- obj = yaffs_FindOrCreateObjectByNumber(dev,cp.objectId, cp.variantType);
-- if(obj) {
-- yaffs_CheckpointObjectToObject(obj,&cp);
-- if(obj->variantType == YAFFS_OBJECT_TYPE_FILE) {
-+ else if (ok) {
-+ obj = yaffs_FindOrCreateObjectByNumber(dev, cp.objectId, cp.variantType);
-+ if (obj) {
-+ ok = yaffs_CheckpointObjectToObject(obj, &cp);
-+ if (!ok)
-+ break;
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) {
- ok = yaffs_ReadCheckpointTnodes(obj);
-- } else if(obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) {
-+ } else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) {
- obj->hardLinks.next =
-- (struct list_head *)
-- hardList;
-+ (struct ylist_head *) hardList;
- hardList = obj;
- }
--
-- }
-+ } else
-+ ok = 0;
- }
- }
-
-- if(ok)
-- yaffs_HardlinkFixup(dev,hardList);
-+ if (ok)
-+ yaffs_HardlinkFixup(dev, hardList);
-
- return ok ? 1 : 0;
- }
-@@ -4403,11 +4471,11 @@ static int yaffs_WriteCheckpointSum(yaff
- __u32 checkpointSum;
- int ok;
-
-- yaffs_GetCheckpointSum(dev,&checkpointSum);
-+ yaffs_GetCheckpointSum(dev, &checkpointSum);
-
-- ok = (yaffs_CheckpointWrite(dev,&checkpointSum,sizeof(checkpointSum)) == sizeof(checkpointSum));
-+ ok = (yaffs_CheckpointWrite(dev, &checkpointSum, sizeof(checkpointSum)) == sizeof(checkpointSum));
-
-- if(!ok)
-+ if (!ok)
- return 0;
-
- return 1;
-@@ -4419,14 +4487,14 @@ static int yaffs_ReadCheckpointSum(yaffs
- __u32 checkpointSum1;
- int ok;
-
-- yaffs_GetCheckpointSum(dev,&checkpointSum0);
-+ yaffs_GetCheckpointSum(dev, &checkpointSum0);
-
-- ok = (yaffs_CheckpointRead(dev,&checkpointSum1,sizeof(checkpointSum1)) == sizeof(checkpointSum1));
-+ ok = (yaffs_CheckpointRead(dev, &checkpointSum1, sizeof(checkpointSum1)) == sizeof(checkpointSum1));
-
-- if(!ok)
-+ if (!ok)
- return 0;
-
-- if(checkpointSum0 != checkpointSum1)
-+ if (checkpointSum0 != checkpointSum1)
- return 0;
-
- return 1;
-@@ -4435,46 +4503,43 @@ static int yaffs_ReadCheckpointSum(yaffs
-
- static int yaffs_WriteCheckpointData(yaffs_Device *dev)
- {
--
- int ok = 1;
-
-- if(dev->skipCheckpointWrite || !dev->isYaffs2){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("skipping checkpoint write" TENDSTR)));
-+ if (dev->skipCheckpointWrite || !dev->isYaffs2) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("skipping checkpoint write" TENDSTR)));
- ok = 0;
- }
-
-- if(ok)
-- ok = yaffs_CheckpointOpen(dev,1);
-+ if (ok)
-+ ok = yaffs_CheckpointOpen(dev, 1);
-
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("write checkpoint validity" TENDSTR)));
-- ok = yaffs_WriteCheckpointValidityMarker(dev,1);
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint validity" TENDSTR)));
-+ ok = yaffs_WriteCheckpointValidityMarker(dev, 1);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("write checkpoint device" TENDSTR)));
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint device" TENDSTR)));
- ok = yaffs_WriteCheckpointDevice(dev);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("write checkpoint objects" TENDSTR)));
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint objects" TENDSTR)));
- ok = yaffs_WriteCheckpointObjects(dev);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("write checkpoint validity" TENDSTR)));
-- ok = yaffs_WriteCheckpointValidityMarker(dev,0);
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint validity" TENDSTR)));
-+ ok = yaffs_WriteCheckpointValidityMarker(dev, 0);
- }
-
-- if(ok){
-+ if (ok)
- ok = yaffs_WriteCheckpointSum(dev);
-- }
--
-
-- if(!yaffs_CheckpointClose(dev))
-- ok = 0;
-+ if (!yaffs_CheckpointClose(dev))
-+ ok = 0;
-
-- if(ok)
-- dev->isCheckpointed = 1;
-- else
-- dev->isCheckpointed = 0;
-+ if (ok)
-+ dev->isCheckpointed = 1;
-+ else
-+ dev->isCheckpointed = 0;
-
- return dev->isCheckpointed;
- }
-@@ -4483,43 +4548,43 @@ static int yaffs_ReadCheckpointData(yaff
- {
- int ok = 1;
-
-- if(dev->skipCheckpointRead || !dev->isYaffs2){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("skipping checkpoint read" TENDSTR)));
-+ if (dev->skipCheckpointRead || !dev->isYaffs2) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("skipping checkpoint read" TENDSTR)));
- ok = 0;
- }
-
-- if(ok)
-- ok = yaffs_CheckpointOpen(dev,0); /* open for read */
-+ if (ok)
-+ ok = yaffs_CheckpointOpen(dev, 0); /* open for read */
-
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint validity" TENDSTR)));
-- ok = yaffs_ReadCheckpointValidityMarker(dev,1);
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint validity" TENDSTR)));
-+ ok = yaffs_ReadCheckpointValidityMarker(dev, 1);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint device" TENDSTR)));
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint device" TENDSTR)));
- ok = yaffs_ReadCheckpointDevice(dev);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint objects" TENDSTR)));
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint objects" TENDSTR)));
- ok = yaffs_ReadCheckpointObjects(dev);
- }
-- if(ok){
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint validity" TENDSTR)));
-- ok = yaffs_ReadCheckpointValidityMarker(dev,0);
-+ if (ok) {
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint validity" TENDSTR)));
-+ ok = yaffs_ReadCheckpointValidityMarker(dev, 0);
- }
-
-- if(ok){
-+ if (ok) {
- ok = yaffs_ReadCheckpointSum(dev);
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("read checkpoint checksum %d" TENDSTR),ok));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint checksum %d" TENDSTR), ok));
- }
-
-- if(!yaffs_CheckpointClose(dev))
-+ if (!yaffs_CheckpointClose(dev))
- ok = 0;
-
-- if(ok)
-- dev->isCheckpointed = 1;
-- else
-- dev->isCheckpointed = 0;
-+ if (ok)
-+ dev->isCheckpointed = 1;
-+ else
-+ dev->isCheckpointed = 0;
-
- return ok ? 1 : 0;
-
-@@ -4527,11 +4592,11 @@ static int yaffs_ReadCheckpointData(yaff
-
- static void yaffs_InvalidateCheckpoint(yaffs_Device *dev)
- {
-- if(dev->isCheckpointed ||
-- dev->blocksInCheckpoint > 0){
-+ if (dev->isCheckpointed ||
-+ dev->blocksInCheckpoint > 0) {
- dev->isCheckpointed = 0;
- yaffs_CheckpointInvalidateStream(dev);
-- if(dev->superBlock && dev->markSuperBlockDirty)
-+ if (dev->superBlock && dev->markSuperBlockDirty)
- dev->markSuperBlockDirty(dev->superBlock);
- }
- }
-@@ -4540,18 +4605,18 @@ static void yaffs_InvalidateCheckpoint(y
- int yaffs_CheckpointSave(yaffs_Device *dev)
- {
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("save entry: isCheckpointed %d"TENDSTR),dev->isCheckpointed));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("save entry: isCheckpointed %d"TENDSTR), dev->isCheckpointed));
-
- yaffs_VerifyObjects(dev);
- yaffs_VerifyBlocks(dev);
- yaffs_VerifyFreeChunks(dev);
-
-- if(!dev->isCheckpointed) {
-+ if (!dev->isCheckpointed) {
- yaffs_InvalidateCheckpoint(dev);
- yaffs_WriteCheckpointData(dev);
- }
-
-- T(YAFFS_TRACE_ALWAYS,(TSTR("save exit: isCheckpointed %d"TENDSTR),dev->isCheckpointed));
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("save exit: isCheckpointed %d"TENDSTR), dev->isCheckpointed));
-
- return dev->isCheckpointed;
- }
-@@ -4559,17 +4624,17 @@ int yaffs_CheckpointSave(yaffs_Device *d
- int yaffs_CheckpointRestore(yaffs_Device *dev)
- {
- int retval;
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("restore entry: isCheckpointed %d"TENDSTR),dev->isCheckpointed));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore entry: isCheckpointed %d"TENDSTR), dev->isCheckpointed));
-
- retval = yaffs_ReadCheckpointData(dev);
-
-- if(dev->isCheckpointed){
-+ if (dev->isCheckpointed) {
- yaffs_VerifyObjects(dev);
- yaffs_VerifyBlocks(dev);
- yaffs_VerifyFreeChunks(dev);
- }
-
-- T(YAFFS_TRACE_CHECKPOINT,(TSTR("restore exit: isCheckpointed %d"TENDSTR),dev->isCheckpointed));
-+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore exit: isCheckpointed %d"TENDSTR), dev->isCheckpointed));
-
- return retval;
- }
-@@ -4584,12 +4649,12 @@ int yaffs_CheckpointRestore(yaffs_Device
- * Curve-balls: the first chunk might also be the last chunk.
- */
-
--int yaffs_ReadDataFromFile(yaffs_Object * in, __u8 * buffer, loff_t offset,
-- int nBytes)
-+int yaffs_ReadDataFromFile(yaffs_Object *in, __u8 *buffer, loff_t offset,
-+ int nBytes)
- {
-
- int chunk;
-- int start;
-+ __u32 start;
- int nToCopy;
- int n = nBytes;
- int nDone = 0;
-@@ -4600,27 +4665,26 @@ int yaffs_ReadDataFromFile(yaffs_Object
- dev = in->myDev;
-
- while (n > 0) {
-- //chunk = offset / dev->nDataBytesPerChunk + 1;
-- //start = offset % dev->nDataBytesPerChunk;
-- yaffs_AddrToChunk(dev,offset,&chunk,&start);
-+ /* chunk = offset / dev->nDataBytesPerChunk + 1; */
-+ /* start = offset % dev->nDataBytesPerChunk; */
-+ yaffs_AddrToChunk(dev, offset, &chunk, &start);
- chunk++;
-
- /* OK now check for the curveball where the start and end are in
- * the same chunk.
- */
-- if ((start + n) < dev->nDataBytesPerChunk) {
-+ if ((start + n) < dev->nDataBytesPerChunk)
- nToCopy = n;
-- } else {
-+ else
- nToCopy = dev->nDataBytesPerChunk - start;
-- }
-
- cache = yaffs_FindChunkCache(in, chunk);
-
- /* If the chunk is already in the cache or it is less than a whole chunk
-- * then use the cache (if there is caching)
-+ * or we're using inband tags then use the cache (if there is caching)
- * else bypass the cache.
- */
-- if (cache || nToCopy != dev->nDataBytesPerChunk) {
-+ if (cache || nToCopy != dev->nDataBytesPerChunk || dev->inbandTags) {
- if (dev->nShortOpCaches > 0) {
-
- /* If we can't find the data in the cache, then load it up. */
-@@ -4641,14 +4705,9 @@ int yaffs_ReadDataFromFile(yaffs_Object
-
- cache->locked = 1;
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-+
- memcpy(buffer, &cache->data[start], nToCopy);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
- cache->locked = 0;
- } else {
- /* Read into the local buffer then copy..*/
-@@ -4657,41 +4716,19 @@ int yaffs_ReadDataFromFile(yaffs_Object
- yaffs_GetTempBuffer(dev, __LINE__);
- yaffs_ReadChunkDataFromObject(in, chunk,
- localBuffer);
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-+
- memcpy(buffer, &localBuffer[start], nToCopy);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
-+
- yaffs_ReleaseTempBuffer(dev, localBuffer,
- __LINE__);
- }
-
- } else {
--#ifdef CONFIG_YAFFS_WINCE
-- __u8 *localBuffer = yaffs_GetTempBuffer(dev, __LINE__);
--
-- /* Under WinCE can't do direct transfer. Need to use a local buffer.
-- * This is because we otherwise screw up WinCE's memory mapper
-- */
-- yaffs_ReadChunkDataFromObject(in, chunk, localBuffer);
--
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-- memcpy(buffer, localBuffer, dev->nDataBytesPerChunk);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
-- yaffs_ReleaseTempBuffer(dev, localBuffer, __LINE__);
--#endif
--
--#else
- /* A full chunk. Read directly into the supplied buffer. */
- yaffs_ReadChunkDataFromObject(in, chunk, buffer);
--#endif
-+
- }
-
- n -= nToCopy;
-@@ -4704,28 +4741,37 @@ int yaffs_ReadDataFromFile(yaffs_Object
- return nDone;
- }
-
--int yaffs_WriteDataToFile(yaffs_Object * in, const __u8 * buffer, loff_t offset,
-- int nBytes, int writeThrough)
-+int yaffs_WriteDataToFile(yaffs_Object *in, const __u8 *buffer, loff_t offset,
-+ int nBytes, int writeThrough)
- {
-
- int chunk;
-- int start;
-+ __u32 start;
- int nToCopy;
- int n = nBytes;
- int nDone = 0;
- int nToWriteBack;
- int startOfWrite = offset;
- int chunkWritten = 0;
-- int nBytesRead;
-+ __u32 nBytesRead;
-+ __u32 chunkStart;
-
- yaffs_Device *dev;
-
- dev = in->myDev;
-
- while (n > 0 && chunkWritten >= 0) {
-- //chunk = offset / dev->nDataBytesPerChunk + 1;
-- //start = offset % dev->nDataBytesPerChunk;
-- yaffs_AddrToChunk(dev,offset,&chunk,&start);
-+ /* chunk = offset / dev->nDataBytesPerChunk + 1; */
-+ /* start = offset % dev->nDataBytesPerChunk; */
-+ yaffs_AddrToChunk(dev, offset, &chunk, &start);
-+
-+ if (chunk * dev->nDataBytesPerChunk + start != offset ||
-+ start >= dev->nDataBytesPerChunk) {
-+ T(YAFFS_TRACE_ERROR, (
-+ TSTR("AddrToChunk of offset %d gives chunk %d start %d"
-+ TENDSTR),
-+ (int)offset, chunk, start));
-+ }
- chunk++;
-
- /* OK now check for the curveball where the start and end are in
-@@ -4740,25 +4786,32 @@ int yaffs_WriteDataToFile(yaffs_Object *
- * we need to write back as much as was there before.
- */
-
-- nBytesRead =
-- in->variant.fileVariant.fileSize -
-- ((chunk - 1) * dev->nDataBytesPerChunk);
-+ chunkStart = ((chunk - 1) * dev->nDataBytesPerChunk);
-+
-+ if (chunkStart > in->variant.fileVariant.fileSize)
-+ nBytesRead = 0; /* Past end of file */
-+ else
-+ nBytesRead = in->variant.fileVariant.fileSize - chunkStart;
-
-- if (nBytesRead > dev->nDataBytesPerChunk) {
-+ if (nBytesRead > dev->nDataBytesPerChunk)
- nBytesRead = dev->nDataBytesPerChunk;
-- }
-
- nToWriteBack =
- (nBytesRead >
- (start + n)) ? nBytesRead : (start + n);
-
-+ if (nToWriteBack < 0 || nToWriteBack > dev->nDataBytesPerChunk)
-+ YBUG();
-+
- } else {
- nToCopy = dev->nDataBytesPerChunk - start;
- nToWriteBack = dev->nDataBytesPerChunk;
- }
-
-- if (nToCopy != dev->nDataBytesPerChunk) {
-- /* An incomplete start or end chunk (or maybe both start and end chunk) */
-+ if (nToCopy != dev->nDataBytesPerChunk || dev->inbandTags) {
-+ /* An incomplete start or end chunk (or maybe both start and end chunk),
-+ * or we're using inband tags, so we want to use the cache buffers.
-+ */
- if (dev->nShortOpCaches > 0) {
- yaffs_ChunkCache *cache;
- /* If we can't find the data in the cache, then load the cache */
-@@ -4775,10 +4828,9 @@ int yaffs_WriteDataToFile(yaffs_Object *
- yaffs_ReadChunkDataFromObject(in, chunk,
- cache->
- data);
-- }
-- else if(cache &&
-- !cache->dirty &&
-- !yaffs_CheckSpaceForAllocation(in->myDev)){
-+ } else if (cache &&
-+ !cache->dirty &&
-+ !yaffs_CheckSpaceForAllocation(in->myDev)) {
- /* Drop the cache if it was a read cache item and
- * no space check has been made for it.
- */
-@@ -4788,16 +4840,12 @@ int yaffs_WriteDataToFile(yaffs_Object *
- if (cache) {
- yaffs_UseChunkCache(dev, cache, 1);
- cache->locked = 1;
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-+
-
- memcpy(&cache->data[start], buffer,
- nToCopy);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
-+
- cache->locked = 0;
- cache->nBytes = nToWriteBack;
-
-@@ -4825,15 +4873,10 @@ int yaffs_WriteDataToFile(yaffs_Object *
- yaffs_ReadChunkDataFromObject(in, chunk,
- localBuffer);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-+
-
- memcpy(&localBuffer[start], buffer, nToCopy);
-
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
- chunkWritten =
- yaffs_WriteChunkDataToObject(in, chunk,
- localBuffer,
-@@ -4846,31 +4889,15 @@ int yaffs_WriteDataToFile(yaffs_Object *
- }
-
- } else {
--
--#ifdef CONFIG_YAFFS_WINCE
-- /* Under WinCE can't do direct transfer. Need to use a local buffer.
-- * This is because we otherwise screw up WinCE's memory mapper
-- */
-- __u8 *localBuffer = yaffs_GetTempBuffer(dev, __LINE__);
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_UnlockYAFFS(TRUE);
--#endif
-- memcpy(localBuffer, buffer, dev->nDataBytesPerChunk);
--#ifdef CONFIG_YAFFS_WINCE
-- yfsd_LockYAFFS(TRUE);
--#endif
-- chunkWritten =
-- yaffs_WriteChunkDataToObject(in, chunk, localBuffer,
-- dev->nDataBytesPerChunk,
-- 0);
-- yaffs_ReleaseTempBuffer(dev, localBuffer, __LINE__);
--#else
- /* A full chunk. Write directly from the supplied buffer. */
-+
-+
-+
- chunkWritten =
- yaffs_WriteChunkDataToObject(in, chunk, buffer,
- dev->nDataBytesPerChunk,
- 0);
--#endif
-+
- /* Since we've overwritten the cached data, we better invalidate it. */
- yaffs_InvalidateChunkCache(in, chunk);
- }
-@@ -4886,9 +4913,8 @@ int yaffs_WriteDataToFile(yaffs_Object *
-
- /* Update file object */
-
-- if ((startOfWrite + nDone) > in->variant.fileVariant.fileSize) {
-+ if ((startOfWrite + nDone) > in->variant.fileVariant.fileSize)
- in->variant.fileVariant.fileSize = (startOfWrite + nDone);
-- }
-
- in->dirty = 1;
-
-@@ -4898,7 +4924,7 @@ int yaffs_WriteDataToFile(yaffs_Object *
-
- /* ---------------------- File resizing stuff ------------------ */
-
--static void yaffs_PruneResizedChunks(yaffs_Object * in, int newSize)
-+static void yaffs_PruneResizedChunks(yaffs_Object *in, int newSize)
- {
-
- yaffs_Device *dev = in->myDev;
-@@ -4939,11 +4965,11 @@ static void yaffs_PruneResizedChunks(yaf
-
- }
-
--int yaffs_ResizeFile(yaffs_Object * in, loff_t newSize)
-+int yaffs_ResizeFile(yaffs_Object *in, loff_t newSize)
- {
-
- int oldFileSize = in->variant.fileVariant.fileSize;
-- int newSizeOfPartialChunk;
-+ __u32 newSizeOfPartialChunk;
- int newFullChunks;
-
- yaffs_Device *dev = in->myDev;
-@@ -4955,13 +4981,11 @@ int yaffs_ResizeFile(yaffs_Object * in,
-
- yaffs_CheckGarbageCollection(dev);
-
-- if (in->variantType != YAFFS_OBJECT_TYPE_FILE) {
-- return yaffs_GetFileSize(in);
-- }
-+ if (in->variantType != YAFFS_OBJECT_TYPE_FILE)
-+ return YAFFS_FAIL;
-
-- if (newSize == oldFileSize) {
-- return oldFileSize;
-- }
-+ if (newSize == oldFileSize)
-+ return YAFFS_OK;
-
- if (newSize < oldFileSize) {
-
-@@ -4994,21 +5018,20 @@ int yaffs_ResizeFile(yaffs_Object * in,
- }
-
-
--
- /* Write a new object header.
- * show we've shrunk the file, if need be
- * Do this only if the file is not in the deleted directories.
- */
-- if (in->parent->objectId != YAFFS_OBJECTID_UNLINKED &&
-- in->parent->objectId != YAFFS_OBJECTID_DELETED) {
-+ if (in->parent &&
-+ in->parent->objectId != YAFFS_OBJECTID_UNLINKED &&
-+ in->parent->objectId != YAFFS_OBJECTID_DELETED)
- yaffs_UpdateObjectHeader(in, NULL, 0,
- (newSize < oldFileSize) ? 1 : 0, 0);
-- }
-
-- return newSize;
-+ return YAFFS_OK;
- }
-
--loff_t yaffs_GetFileSize(yaffs_Object * obj)
-+loff_t yaffs_GetFileSize(yaffs_Object *obj)
- {
- obj = yaffs_GetEquivalentObject(obj);
-
-@@ -5024,7 +5047,7 @@ loff_t yaffs_GetFileSize(yaffs_Object *
-
-
-
--int yaffs_FlushFile(yaffs_Object * in, int updateTime)
-+int yaffs_FlushFile(yaffs_Object *in, int updateTime)
- {
- int retVal;
- if (in->dirty) {
-@@ -5039,9 +5062,8 @@ int yaffs_FlushFile(yaffs_Object * in, i
- #endif
- }
-
-- retVal =
-- (yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0) >=
-- 0) ? YAFFS_OK : YAFFS_FAIL;
-+ retVal = (yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0) >=
-+ 0) ? YAFFS_OK : YAFFS_FAIL;
- } else {
- retVal = YAFFS_OK;
- }
-@@ -5050,7 +5072,7 @@ int yaffs_FlushFile(yaffs_Object * in, i
-
- }
-
--static int yaffs_DoGenericObjectDeletion(yaffs_Object * in)
-+static int yaffs_DoGenericObjectDeletion(yaffs_Object *in)
- {
-
- /* First off, invalidate the file's data in the cache, without flushing. */
-@@ -5058,13 +5080,13 @@ static int yaffs_DoGenericObjectDeletion
-
- if (in->myDev->isYaffs2 && (in->parent != in->myDev->deletedDir)) {
- /* Move to the unlinked directory so we have a record that it was deleted. */
-- yaffs_ChangeObjectName(in, in->myDev->deletedDir,"deleted", 0, 0);
-+ yaffs_ChangeObjectName(in, in->myDev->deletedDir, _Y("deleted"), 0, 0);
-
- }
-
- yaffs_RemoveObjectFromDirectory(in);
-- yaffs_DeleteChunk(in->myDev, in->chunkId, 1, __LINE__);
-- in->chunkId = -1;
-+ yaffs_DeleteChunk(in->myDev, in->hdrChunk, 1, __LINE__);
-+ in->hdrChunk = 0;
-
- yaffs_FreeObject(in);
- return YAFFS_OK;
-@@ -5075,62 +5097,63 @@ static int yaffs_DoGenericObjectDeletion
- * and the inode associated with the file.
- * It does not delete the links associated with the file.
- */
--static int yaffs_UnlinkFile(yaffs_Object * in)
-+static int yaffs_UnlinkFileIfNeeded(yaffs_Object *in)
- {
-
- int retVal;
- int immediateDeletion = 0;
-
-- if (1) {
- #ifdef __KERNEL__
-- if (!in->myInode) {
-- immediateDeletion = 1;
--
-- }
-+ if (!in->myInode)
-+ immediateDeletion = 1;
- #else
-- if (in->inUse <= 0) {
-- immediateDeletion = 1;
--
-- }
-+ if (in->inUse <= 0)
-+ immediateDeletion = 1;
- #endif
-- if (immediateDeletion) {
-- retVal =
-- yaffs_ChangeObjectName(in, in->myDev->deletedDir,
-- "deleted", 0, 0);
-- T(YAFFS_TRACE_TRACING,
-- (TSTR("yaffs: immediate deletion of file %d" TENDSTR),
-- in->objectId));
-- in->deleted = 1;
-- in->myDev->nDeletedFiles++;
-- if (0 && in->myDev->isYaffs2) {
-- yaffs_ResizeFile(in, 0);
-- }
-- yaffs_SoftDeleteFile(in);
-- } else {
-- retVal =
-- yaffs_ChangeObjectName(in, in->myDev->unlinkedDir,
-- "unlinked", 0, 0);
-- }
-
-+ if (immediateDeletion) {
-+ retVal =
-+ yaffs_ChangeObjectName(in, in->myDev->deletedDir,
-+ _Y("deleted"), 0, 0);
-+ T(YAFFS_TRACE_TRACING,
-+ (TSTR("yaffs: immediate deletion of file %d" TENDSTR),
-+ in->objectId));
-+ in->deleted = 1;
-+ in->myDev->nDeletedFiles++;
-+ if (1 || in->myDev->isYaffs2)
-+ yaffs_ResizeFile(in, 0);
-+ yaffs_SoftDeleteFile(in);
-+ } else {
-+ retVal =
-+ yaffs_ChangeObjectName(in, in->myDev->unlinkedDir,
-+ _Y("unlinked"), 0, 0);
- }
-+
-+
- return retVal;
- }
-
--int yaffs_DeleteFile(yaffs_Object * in)
-+int yaffs_DeleteFile(yaffs_Object *in)
- {
- int retVal = YAFFS_OK;
-+ int deleted = in->deleted;
-+
-+ yaffs_ResizeFile(in, 0);
-
- if (in->nDataChunks > 0) {
-- /* Use soft deletion if there is data in the file */
-- if (!in->unlinked) {
-- retVal = yaffs_UnlinkFile(in);
-- }
-+ /* Use soft deletion if there is data in the file.
-+ * That won't be the case if it has been resized to zero.
-+ */
-+ if (!in->unlinked)
-+ retVal = yaffs_UnlinkFileIfNeeded(in);
-+
- if (retVal == YAFFS_OK && in->unlinked && !in->deleted) {
- in->deleted = 1;
-+ deleted = 1;
- in->myDev->nDeletedFiles++;
- yaffs_SoftDeleteFile(in);
- }
-- return in->deleted ? YAFFS_OK : YAFFS_FAIL;
-+ return deleted ? YAFFS_OK : YAFFS_FAIL;
- } else {
- /* The file has no data chunks so we toss it immediately */
- yaffs_FreeTnode(in->myDev, in->variant.fileVariant.top);
-@@ -5141,62 +5164,75 @@ int yaffs_DeleteFile(yaffs_Object * in)
- }
- }
-
--static int yaffs_DeleteDirectory(yaffs_Object * in)
-+static int yaffs_DeleteDirectory(yaffs_Object *in)
- {
- /* First check that the directory is empty. */
-- if (list_empty(&in->variant.directoryVariant.children)) {
-+ if (ylist_empty(&in->variant.directoryVariant.children))
- return yaffs_DoGenericObjectDeletion(in);
-- }
-
- return YAFFS_FAIL;
-
- }
-
--static int yaffs_DeleteSymLink(yaffs_Object * in)
-+static int yaffs_DeleteSymLink(yaffs_Object *in)
- {
- YFREE(in->variant.symLinkVariant.alias);
-
- return yaffs_DoGenericObjectDeletion(in);
- }
-
--static int yaffs_DeleteHardLink(yaffs_Object * in)
-+static int yaffs_DeleteHardLink(yaffs_Object *in)
- {
- /* remove this hardlink from the list assocaited with the equivalent
- * object
- */
-- list_del(&in->hardLinks);
-+ ylist_del_init(&in->hardLinks);
- return yaffs_DoGenericObjectDeletion(in);
- }
-
--static void yaffs_DestroyObject(yaffs_Object * obj)
-+int yaffs_DeleteObject(yaffs_Object *obj)
- {
-+int retVal = -1;
- switch (obj->variantType) {
- case YAFFS_OBJECT_TYPE_FILE:
-- yaffs_DeleteFile(obj);
-+ retVal = yaffs_DeleteFile(obj);
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-- yaffs_DeleteDirectory(obj);
-+ return yaffs_DeleteDirectory(obj);
- break;
- case YAFFS_OBJECT_TYPE_SYMLINK:
-- yaffs_DeleteSymLink(obj);
-+ retVal = yaffs_DeleteSymLink(obj);
- break;
- case YAFFS_OBJECT_TYPE_HARDLINK:
-- yaffs_DeleteHardLink(obj);
-+ retVal = yaffs_DeleteHardLink(obj);
- break;
- case YAFFS_OBJECT_TYPE_SPECIAL:
-- yaffs_DoGenericObjectDeletion(obj);
-+ retVal = yaffs_DoGenericObjectDeletion(obj);
- break;
- case YAFFS_OBJECT_TYPE_UNKNOWN:
-+ retVal = 0;
- break; /* should not happen. */
- }
-+
-+ return retVal;
- }
-
--static int yaffs_UnlinkWorker(yaffs_Object * obj)
-+static int yaffs_UnlinkWorker(yaffs_Object *obj)
- {
-
-+ int immediateDeletion = 0;
-+
-+#ifdef __KERNEL__
-+ if (!obj->myInode)
-+ immediateDeletion = 1;
-+#else
-+ if (obj->inUse <= 0)
-+ immediateDeletion = 1;
-+#endif
-+
- if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) {
- return yaffs_DeleteHardLink(obj);
-- } else if (!list_empty(&obj->hardLinks)) {
-+ } else if (!ylist_empty(&obj->hardLinks)) {
- /* Curve ball: We're unlinking an object that has a hardlink.
- *
- * This problem arises because we are not strictly following
-@@ -5215,24 +5251,24 @@ static int yaffs_UnlinkWorker(yaffs_Obje
- int retVal;
- YCHAR name[YAFFS_MAX_NAME_LENGTH + 1];
-
-- hl = list_entry(obj->hardLinks.next, yaffs_Object, hardLinks);
-+ hl = ylist_entry(obj->hardLinks.next, yaffs_Object, hardLinks);
-
-- list_del_init(&hl->hardLinks);
-- list_del_init(&hl->siblings);
-+ ylist_del_init(&hl->hardLinks);
-+ ylist_del_init(&hl->siblings);
-
- yaffs_GetObjectName(hl, name, YAFFS_MAX_NAME_LENGTH + 1);
-
- retVal = yaffs_ChangeObjectName(obj, hl->parent, name, 0, 0);
-
-- if (retVal == YAFFS_OK) {
-+ if (retVal == YAFFS_OK)
- retVal = yaffs_DoGenericObjectDeletion(hl);
-- }
-+
- return retVal;
-
-- } else {
-+ } else if (immediateDeletion) {
- switch (obj->variantType) {
- case YAFFS_OBJECT_TYPE_FILE:
-- return yaffs_UnlinkFile(obj);
-+ return yaffs_DeleteFile(obj);
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
- return yaffs_DeleteDirectory(obj);
-@@ -5248,21 +5284,22 @@ static int yaffs_UnlinkWorker(yaffs_Obje
- default:
- return YAFFS_FAIL;
- }
-- }
-+ } else
-+ return yaffs_ChangeObjectName(obj, obj->myDev->unlinkedDir,
-+ _Y("unlinked"), 0, 0);
- }
-
-
--static int yaffs_UnlinkObject( yaffs_Object *obj)
-+static int yaffs_UnlinkObject(yaffs_Object *obj)
- {
-
-- if (obj && obj->unlinkAllowed) {
-+ if (obj && obj->unlinkAllowed)
- return yaffs_UnlinkWorker(obj);
-- }
-
- return YAFFS_FAIL;
-
- }
--int yaffs_Unlink(yaffs_Object * dir, const YCHAR * name)
-+int yaffs_Unlink(yaffs_Object *dir, const YCHAR *name)
- {
- yaffs_Object *obj;
-
-@@ -5272,8 +5309,8 @@ int yaffs_Unlink(yaffs_Object * dir, con
-
- /*----------------------- Initialisation Scanning ---------------------- */
-
--static void yaffs_HandleShadowedObject(yaffs_Device * dev, int objId,
-- int backwardScanning)
-+static void yaffs_HandleShadowedObject(yaffs_Device *dev, int objId,
-+ int backwardScanning)
- {
- yaffs_Object *obj;
-
-@@ -5286,9 +5323,8 @@ static void yaffs_HandleShadowedObject(y
- /* Handle YAFFS2 case (backward scanning)
- * If the shadowed object exists then ignore.
- */
-- if (yaffs_FindObjectByNumber(dev, objId)) {
-+ if (yaffs_FindObjectByNumber(dev, objId))
- return;
-- }
- }
-
- /* Let's create it (if it does not exist) assuming it is a file so that it can do shrinking etc.
-@@ -5297,6 +5333,8 @@ static void yaffs_HandleShadowedObject(y
- obj =
- yaffs_FindOrCreateObjectByNumber(dev, objId,
- YAFFS_OBJECT_TYPE_FILE);
-+ if (!obj)
-+ return;
- yaffs_AddObjectToDirectory(dev->unlinkedDir, obj);
- obj->variant.fileVariant.shrinkSize = 0;
- obj->valid = 1; /* So that we don't read any other info for this file */
-@@ -5325,44 +5363,77 @@ static void yaffs_HardlinkFixup(yaffs_De
- if (in) {
- /* Add the hardlink pointers */
- hl->variant.hardLinkVariant.equivalentObject = in;
-- list_add(&hl->hardLinks, &in->hardLinks);
-+ ylist_add(&hl->hardLinks, &in->hardLinks);
- } else {
- /* Todo Need to report/handle this better.
- * Got a problem... hardlink to a non-existant object
- */
- hl->variant.hardLinkVariant.equivalentObject = NULL;
-- INIT_LIST_HEAD(&hl->hardLinks);
-+ YINIT_LIST_HEAD(&hl->hardLinks);
-
- }
--
- }
-+}
-+
-+
-
-+
-+
-+static int ybicmp(const void *a, const void *b)
-+{
-+ register int aseq = ((yaffs_BlockIndex *)a)->seq;
-+ register int bseq = ((yaffs_BlockIndex *)b)->seq;
-+ register int ablock = ((yaffs_BlockIndex *)a)->block;
-+ register int bblock = ((yaffs_BlockIndex *)b)->block;
-+ if (aseq == bseq)
-+ return ablock - bblock;
-+ else
-+ return aseq - bseq;
- }
-
-
-+struct yaffs_ShadowFixerStruct {
-+ int objectId;
-+ int shadowedId;
-+ struct yaffs_ShadowFixerStruct *next;
-+};
-+
-
-+static void yaffs_StripDeletedObjects(yaffs_Device *dev)
-+{
-+ /*
-+ * Sort out state of unlinked and deleted objects after scanning.
-+ */
-+ struct ylist_head *i;
-+ struct ylist_head *n;
-+ yaffs_Object *l;
-
-+ /* Soft delete all the unlinked files */
-+ ylist_for_each_safe(i, n,
-+ &dev->unlinkedDir->variant.directoryVariant.children) {
-+ if (i) {
-+ l = ylist_entry(i, yaffs_Object, siblings);
-+ yaffs_DeleteObject(l);
-+ }
-+ }
-
--static int ybicmp(const void *a, const void *b){
-- register int aseq = ((yaffs_BlockIndex *)a)->seq;
-- register int bseq = ((yaffs_BlockIndex *)b)->seq;
-- register int ablock = ((yaffs_BlockIndex *)a)->block;
-- register int bblock = ((yaffs_BlockIndex *)b)->block;
-- if( aseq == bseq )
-- return ablock - bblock;
-- else
-- return aseq - bseq;
-+ ylist_for_each_safe(i, n,
-+ &dev->deletedDir->variant.directoryVariant.children) {
-+ if (i) {
-+ l = ylist_entry(i, yaffs_Object, siblings);
-+ yaffs_DeleteObject(l);
-+ }
-+ }
-
- }
-
--static int yaffs_Scan(yaffs_Device * dev)
-+static int yaffs_Scan(yaffs_Device *dev)
- {
- yaffs_ExtendedTags tags;
- int blk;
- int blockIterator;
- int startIterator;
- int endIterator;
-- int nBlocksToScan = 0;
- int result;
-
- int chunk;
-@@ -5371,26 +5442,19 @@ static int yaffs_Scan(yaffs_Device * dev
- yaffs_BlockState state;
- yaffs_Object *hardList = NULL;
- yaffs_BlockInfo *bi;
-- int sequenceNumber;
-+ __u32 sequenceNumber;
- yaffs_ObjectHeader *oh;
- yaffs_Object *in;
- yaffs_Object *parent;
-- int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1;
-
- int alloc_failed = 0;
-
-+ struct yaffs_ShadowFixerStruct *shadowFixerList = NULL;
-+
-
- __u8 *chunkData;
-
-- yaffs_BlockIndex *blockIndex = NULL;
-
-- if (dev->isYaffs2) {
-- T(YAFFS_TRACE_SCAN,
-- (TSTR("yaffs_Scan is not for YAFFS2!" TENDSTR)));
-- return YAFFS_FAIL;
-- }
--
-- //TODO Throw all the yaffs2 stuuf out of yaffs_Scan since it is only for yaffs1 format.
-
- T(YAFFS_TRACE_SCAN,
- (TSTR("yaffs_Scan starts intstartblk %d intendblk %d..." TENDSTR),
-@@ -5400,12 +5464,6 @@ static int yaffs_Scan(yaffs_Device * dev
-
- dev->sequenceNumber = YAFFS_LOWEST_SEQUENCE_NUMBER;
-
-- if (dev->isYaffs2) {
-- blockIndex = YMALLOC(nBlocks * sizeof(yaffs_BlockIndex));
-- if(!blockIndex)
-- return YAFFS_FAIL;
-- }
--
- /* Scan all the blocks to determine their state */
- for (blk = dev->internalStartBlock; blk <= dev->internalEndBlock; blk++) {
- bi = yaffs_GetBlockInfo(dev, blk);
-@@ -5418,6 +5476,9 @@ static int yaffs_Scan(yaffs_Device * dev
- bi->blockState = state;
- bi->sequenceNumber = sequenceNumber;
-
-+ if (bi->sequenceNumber == YAFFS_SEQUENCE_BAD_BLOCK)
-+ bi->blockState = state = YAFFS_BLOCK_STATE_DEAD;
-+
- T(YAFFS_TRACE_SCAN_DEBUG,
- (TSTR("Block scanning block %d state %d seq %d" TENDSTR), blk,
- state, sequenceNumber));
-@@ -5430,70 +5491,21 @@ static int yaffs_Scan(yaffs_Device * dev
- (TSTR("Block empty " TENDSTR)));
- dev->nErasedBlocks++;
- dev->nFreeChunks += dev->nChunksPerBlock;
-- } else if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING) {
--
-- /* Determine the highest sequence number */
-- if (dev->isYaffs2 &&
-- sequenceNumber >= YAFFS_LOWEST_SEQUENCE_NUMBER &&
-- sequenceNumber < YAFFS_HIGHEST_SEQUENCE_NUMBER) {
--
-- blockIndex[nBlocksToScan].seq = sequenceNumber;
-- blockIndex[nBlocksToScan].block = blk;
--
-- nBlocksToScan++;
--
-- if (sequenceNumber >= dev->sequenceNumber) {
-- dev->sequenceNumber = sequenceNumber;
-- }
-- } else if (dev->isYaffs2) {
-- /* TODO: Nasty sequence number! */
-- T(YAFFS_TRACE_SCAN,
-- (TSTR
-- ("Block scanning block %d has bad sequence number %d"
-- TENDSTR), blk, sequenceNumber));
--
-- }
- }
- }
-
-- /* Sort the blocks
-- * Dungy old bubble sort for now...
-- */
-- if (dev->isYaffs2) {
-- yaffs_BlockIndex temp;
-- int i;
-- int j;
--
-- for (i = 0; i < nBlocksToScan; i++)
-- for (j = i + 1; j < nBlocksToScan; j++)
-- if (blockIndex[i].seq > blockIndex[j].seq) {
-- temp = blockIndex[j];
-- blockIndex[j] = blockIndex[i];
-- blockIndex[i] = temp;
-- }
-- }
--
-- /* Now scan the blocks looking at the data. */
-- if (dev->isYaffs2) {
-- startIterator = 0;
-- endIterator = nBlocksToScan - 1;
-- T(YAFFS_TRACE_SCAN_DEBUG,
-- (TSTR("%d blocks to be scanned" TENDSTR), nBlocksToScan));
-- } else {
-- startIterator = dev->internalStartBlock;
-- endIterator = dev->internalEndBlock;
-- }
-+ startIterator = dev->internalStartBlock;
-+ endIterator = dev->internalEndBlock;
-
- /* For each block.... */
- for (blockIterator = startIterator; !alloc_failed && blockIterator <= endIterator;
- blockIterator++) {
-
-- if (dev->isYaffs2) {
-- /* get the block to scan in the correct order */
-- blk = blockIndex[blockIterator].block;
-- } else {
-- blk = blockIterator;
-- }
-+ YYIELD();
-+
-+ YYIELD();
-+
-+ blk = blockIterator;
-
- bi = yaffs_GetBlockInfo(dev, blk);
- state = bi->blockState;
-@@ -5511,7 +5523,7 @@ static int yaffs_Scan(yaffs_Device * dev
-
- /* Let's have a good look at this chunk... */
-
-- if (!dev->isYaffs2 && tags.chunkDeleted) {
-+ if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED || tags.chunkDeleted) {
- /* YAFFS1 only...
- * A deleted chunk
- */
-@@ -5540,18 +5552,6 @@ static int yaffs_Scan(yaffs_Device * dev
- dev->allocationBlockFinder = blk;
- /* Set it to here to encourage the allocator to go forth from here. */
-
-- /* Yaffs2 sanity check:
-- * This should be the one with the highest sequence number
-- */
-- if (dev->isYaffs2
-- && (dev->sequenceNumber !=
-- bi->sequenceNumber)) {
-- T(YAFFS_TRACE_ALWAYS,
-- (TSTR
-- ("yaffs: Allocation block %d was not highest sequence id:"
-- " block seq = %d, dev seq = %d"
-- TENDSTR), blk,bi->sequenceNumber,dev->sequenceNumber));
-- }
- }
-
- dev->nFreeChunks += (dev->nChunksPerBlock - c);
-@@ -5570,11 +5570,11 @@ static int yaffs_Scan(yaffs_Device * dev
- * the same chunkId).
- */
-
-- if(!in)
-+ if (!in)
- alloc_failed = 1;
-
-- if(in){
-- if(!yaffs_PutChunkIntoFile(in, tags.chunkId, chunk,1))
-+ if (in) {
-+ if (!yaffs_PutChunkIntoFile(in, tags.chunkId, chunk, 1))
- alloc_failed = 1;
- }
-
-@@ -5617,7 +5617,7 @@ static int yaffs_Scan(yaffs_Device * dev
- * deleted, and worse still it has changed type. Delete the old object.
- */
-
-- yaffs_DestroyObject(in);
-+ yaffs_DeleteObject(in);
-
- in = 0;
- }
-@@ -5627,14 +5627,20 @@ static int yaffs_Scan(yaffs_Device * dev
- objectId,
- oh->type);
-
-- if(!in)
-+ if (!in)
- alloc_failed = 1;
-
- if (in && oh->shadowsObject > 0) {
-- yaffs_HandleShadowedObject(dev,
-- oh->
-- shadowsObject,
-- 0);
-+
-+ struct yaffs_ShadowFixerStruct *fixer;
-+ fixer = YMALLOC(sizeof(struct yaffs_ShadowFixerStruct));
-+ if (fixer) {
-+ fixer->next = shadowFixerList;
-+ shadowFixerList = fixer;
-+ fixer->objectId = tags.objectId;
-+ fixer->shadowedId = oh->shadowsObject;
-+ }
-+
- }
-
- if (in && in->valid) {
-@@ -5643,12 +5649,10 @@ static int yaffs_Scan(yaffs_Device * dev
- unsigned existingSerial = in->serial;
- unsigned newSerial = tags.serialNumber;
-
-- if (dev->isYaffs2 ||
-- ((existingSerial + 1) & 3) ==
-- newSerial) {
-+ if (((existingSerial + 1) & 3) == newSerial) {
- /* Use new one - destroy the exisiting one */
- yaffs_DeleteChunk(dev,
-- in->chunkId,
-+ in->hdrChunk,
- 1, __LINE__);
- in->valid = 0;
- } else {
-@@ -5681,7 +5685,8 @@ static int yaffs_Scan(yaffs_Device * dev
- in->yst_ctime = oh->yst_ctime;
- in->yst_rdev = oh->yst_rdev;
- #endif
-- in->chunkId = chunk;
-+ in->hdrChunk = chunk;
-+ in->serial = tags.serialNumber;
-
- } else if (in && !in->valid) {
- /* we need to load this info */
-@@ -5705,7 +5710,8 @@ static int yaffs_Scan(yaffs_Device * dev
- in->yst_ctime = oh->yst_ctime;
- in->yst_rdev = oh->yst_rdev;
- #endif
-- in->chunkId = chunk;
-+ in->hdrChunk = chunk;
-+ in->serial = tags.serialNumber;
-
- yaffs_SetObjectName(in, oh->name);
- in->dirty = 0;
-@@ -5718,25 +5724,25 @@ static int yaffs_Scan(yaffs_Device * dev
- yaffs_FindOrCreateObjectByNumber
- (dev, oh->parentObjectId,
- YAFFS_OBJECT_TYPE_DIRECTORY);
-- if (parent->variantType ==
-+ if (!parent)
-+ alloc_failed = 1;
-+ if (parent && parent->variantType ==
- YAFFS_OBJECT_TYPE_UNKNOWN) {
- /* Set up as a directory */
- parent->variantType =
-- YAFFS_OBJECT_TYPE_DIRECTORY;
-- INIT_LIST_HEAD(&parent->variant.
-- directoryVariant.
-- children);
-- } else if (parent->variantType !=
-- YAFFS_OBJECT_TYPE_DIRECTORY)
-- {
-+ YAFFS_OBJECT_TYPE_DIRECTORY;
-+ YINIT_LIST_HEAD(&parent->variant.
-+ directoryVariant.
-+ children);
-+ } else if (!parent || parent->variantType !=
-+ YAFFS_OBJECT_TYPE_DIRECTORY) {
- /* Hoosterman, another problem....
- * We're trying to use a non-directory as a directory
- */
-
- T(YAFFS_TRACE_ERROR,
- (TSTR
-- ("yaffs tragedy: attempting to use non-directory as"
-- " a directory in scan. Put in lost+found."
-+ ("yaffs tragedy: attempting to use non-directory as a directory in scan. Put in lost+found."
- TENDSTR)));
- parent = dev->lostNFoundDir;
- }
-@@ -5760,15 +5766,6 @@ static int yaffs_Scan(yaffs_Device * dev
- /* Todo got a problem */
- break;
- case YAFFS_OBJECT_TYPE_FILE:
-- if (dev->isYaffs2
-- && oh->isShrink) {
-- /* Prune back the shrunken chunks */
-- yaffs_PruneResizedChunks
-- (in, oh->fileSize);
-- /* Mark the block as having a shrinkHeader */
-- bi->hasShrinkHeader = 1;
-- }
--
- if (dev->useHeaderFileSize)
-
- in->variant.fileVariant.
-@@ -5778,11 +5775,11 @@ static int yaffs_Scan(yaffs_Device * dev
- break;
- case YAFFS_OBJECT_TYPE_HARDLINK:
- in->variant.hardLinkVariant.
-- equivalentObjectId =
-- oh->equivalentObjectId;
-+ equivalentObjectId =
-+ oh->equivalentObjectId;
- in->hardLinks.next =
-- (struct list_head *)
-- hardList;
-+ (struct ylist_head *)
-+ hardList;
- hardList = in;
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-@@ -5794,15 +5791,17 @@ static int yaffs_Scan(yaffs_Device * dev
- case YAFFS_OBJECT_TYPE_SYMLINK:
- in->variant.symLinkVariant.alias =
- yaffs_CloneString(oh->alias);
-- if(!in->variant.symLinkVariant.alias)
-+ if (!in->variant.symLinkVariant.alias)
- alloc_failed = 1;
- break;
- }
-
-+/*
- if (parent == dev->deletedDir) {
- yaffs_DestroyObject(in);
- bi->hasShrinkHeader = 1;
- }
-+*/
- }
- }
- }
-@@ -5823,10 +5822,6 @@ static int yaffs_Scan(yaffs_Device * dev
-
- }
-
-- if (blockIndex) {
-- YFREE(blockIndex);
-- }
--
-
- /* Ok, we've done all the scanning.
- * Fix up the hard link chains.
-@@ -5834,32 +5829,36 @@ static int yaffs_Scan(yaffs_Device * dev
- * hardlinks.
- */
-
-- yaffs_HardlinkFixup(dev,hardList);
-+ yaffs_HardlinkFixup(dev, hardList);
-
-- /* Handle the unlinked files. Since they were left in an unlinked state we should
-- * just delete them.
-- */
-+ /* Fix up any shadowed objects */
- {
-- struct list_head *i;
-- struct list_head *n;
-+ struct yaffs_ShadowFixerStruct *fixer;
-+ yaffs_Object *obj;
-
-- yaffs_Object *l;
-- /* Soft delete all the unlinked files */
-- list_for_each_safe(i, n,
-- &dev->unlinkedDir->variant.directoryVariant.
-- children) {
-- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-- yaffs_DestroyObject(l);
-- }
-+ while (shadowFixerList) {
-+ fixer = shadowFixerList;
-+ shadowFixerList = fixer->next;
-+ /* Complete the rename transaction by deleting the shadowed object
-+ * then setting the object header to unshadowed.
-+ */
-+ obj = yaffs_FindObjectByNumber(dev, fixer->shadowedId);
-+ if (obj)
-+ yaffs_DeleteObject(obj);
-+
-+ obj = yaffs_FindObjectByNumber(dev, fixer->objectId);
-+
-+ if (obj)
-+ yaffs_UpdateObjectHeader(obj, NULL, 1, 0, 0);
-+
-+ YFREE(fixer);
- }
- }
-
- yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__);
-
-- if(alloc_failed){
-+ if (alloc_failed)
- return YAFFS_FAIL;
-- }
-
- T(YAFFS_TRACE_SCAN, (TSTR("yaffs_Scan ends" TENDSTR)));
-
-@@ -5871,25 +5870,27 @@ static void yaffs_CheckObjectDetailsLoad
- {
- __u8 *chunkData;
- yaffs_ObjectHeader *oh;
-- yaffs_Device *dev = in->myDev;
-+ yaffs_Device *dev;
- yaffs_ExtendedTags tags;
- int result;
- int alloc_failed = 0;
-
-- if(!in)
-+ if (!in)
- return;
-
-+ dev = in->myDev;
-+
- #if 0
-- T(YAFFS_TRACE_SCAN,(TSTR("details for object %d %s loaded" TENDSTR),
-+ T(YAFFS_TRACE_SCAN, (TSTR("details for object %d %s loaded" TENDSTR),
- in->objectId,
- in->lazyLoaded ? "not yet" : "already"));
- #endif
-
-- if(in->lazyLoaded){
-+ if (in->lazyLoaded && in->hdrChunk > 0) {
- in->lazyLoaded = 0;
- chunkData = yaffs_GetTempBuffer(dev, __LINE__);
-
-- result = yaffs_ReadChunkWithTagsFromNAND(dev,in->chunkId,chunkData,&tags);
-+ result = yaffs_ReadChunkWithTagsFromNAND(dev, in->hdrChunk, chunkData, &tags);
- oh = (yaffs_ObjectHeader *) chunkData;
-
- in->yst_mode = oh->yst_mode;
-@@ -5911,18 +5912,18 @@ static void yaffs_CheckObjectDetailsLoad
- #endif
- yaffs_SetObjectName(in, oh->name);
-
-- if(in->variantType == YAFFS_OBJECT_TYPE_SYMLINK){
-- in->variant.symLinkVariant.alias =
-+ if (in->variantType == YAFFS_OBJECT_TYPE_SYMLINK) {
-+ in->variant.symLinkVariant.alias =
- yaffs_CloneString(oh->alias);
-- if(!in->variant.symLinkVariant.alias)
-+ if (!in->variant.symLinkVariant.alias)
- alloc_failed = 1; /* Not returned to caller */
- }
-
-- yaffs_ReleaseTempBuffer(dev,chunkData, __LINE__);
-+ yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__);
- }
- }
-
--static int yaffs_ScanBackwards(yaffs_Device * dev)
-+static int yaffs_ScanBackwards(yaffs_Device *dev)
- {
- yaffs_ExtendedTags tags;
- int blk;
-@@ -5938,7 +5939,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- yaffs_BlockState state;
- yaffs_Object *hardList = NULL;
- yaffs_BlockInfo *bi;
-- int sequenceNumber;
-+ __u32 sequenceNumber;
- yaffs_ObjectHeader *oh;
- yaffs_Object *in;
- yaffs_Object *parent;
-@@ -5972,12 +5973,12 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- blockIndex = YMALLOC(nBlocks * sizeof(yaffs_BlockIndex));
-
-- if(!blockIndex) {
-+ if (!blockIndex) {
- blockIndex = YMALLOC_ALT(nBlocks * sizeof(yaffs_BlockIndex));
- altBlockIndex = 1;
- }
-
-- if(!blockIndex) {
-+ if (!blockIndex) {
- T(YAFFS_TRACE_SCAN,
- (TSTR("yaffs_Scan() could not allocate block index!" TENDSTR)));
- return YAFFS_FAIL;
-@@ -5999,15 +6000,17 @@ static int yaffs_ScanBackwards(yaffs_Dev
- bi->blockState = state;
- bi->sequenceNumber = sequenceNumber;
-
-- if(bi->sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA)
-+ if (bi->sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA)
- bi->blockState = state = YAFFS_BLOCK_STATE_CHECKPOINT;
-+ if (bi->sequenceNumber == YAFFS_SEQUENCE_BAD_BLOCK)
-+ bi->blockState = state = YAFFS_BLOCK_STATE_DEAD;
-
- T(YAFFS_TRACE_SCAN_DEBUG,
- (TSTR("Block scanning block %d state %d seq %d" TENDSTR), blk,
- state, sequenceNumber));
-
-
-- if(state == YAFFS_BLOCK_STATE_CHECKPOINT){
-+ if (state == YAFFS_BLOCK_STATE_CHECKPOINT) {
- dev->blocksInCheckpoint++;
-
- } else if (state == YAFFS_BLOCK_STATE_DEAD) {
-@@ -6021,8 +6024,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- } else if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING) {
-
- /* Determine the highest sequence number */
-- if (dev->isYaffs2 &&
-- sequenceNumber >= YAFFS_LOWEST_SEQUENCE_NUMBER &&
-+ if (sequenceNumber >= YAFFS_LOWEST_SEQUENCE_NUMBER &&
- sequenceNumber < YAFFS_HIGHEST_SEQUENCE_NUMBER) {
-
- blockIndex[nBlocksToScan].seq = sequenceNumber;
-@@ -6030,10 +6032,9 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- nBlocksToScan++;
-
-- if (sequenceNumber >= dev->sequenceNumber) {
-+ if (sequenceNumber >= dev->sequenceNumber)
- dev->sequenceNumber = sequenceNumber;
-- }
-- } else if (dev->isYaffs2) {
-+ } else {
- /* TODO: Nasty sequence number! */
- T(YAFFS_TRACE_SCAN,
- (TSTR
-@@ -6053,11 +6054,13 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- /* Sort the blocks */
- #ifndef CONFIG_YAFFS_USE_OWN_SORT
-- yaffs_qsort(blockIndex, nBlocksToScan,
-- sizeof(yaffs_BlockIndex), ybicmp);
-+ {
-+ /* Use qsort now. */
-+ yaffs_qsort(blockIndex, nBlocksToScan, sizeof(yaffs_BlockIndex), ybicmp);
-+ }
- #else
- {
-- /* Dungy old bubble sort... */
-+ /* Dungy old bubble sort... */
-
- yaffs_BlockIndex temp;
- int i;
-@@ -6075,7 +6078,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- YYIELD();
-
-- T(YAFFS_TRACE_SCAN, (TSTR("...done" TENDSTR)));
-+ T(YAFFS_TRACE_SCAN, (TSTR("...done" TENDSTR)));
-
- /* Now scan the blocks looking at the data. */
- startIterator = 0;
-@@ -6085,10 +6088,10 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- /* For each block.... backwards */
- for (blockIterator = endIterator; !alloc_failed && blockIterator >= startIterator;
-- blockIterator--) {
-- /* Cooperative multitasking! This loop can run for so
-+ blockIterator--) {
-+ /* Cooperative multitasking! This loop can run for so
- long that watchdog timers expire. */
-- YYIELD();
-+ YYIELD();
-
- /* get the block to scan in the correct order */
- blk = blockIndex[blockIterator].block;
-@@ -6127,10 +6130,8 @@ static int yaffs_ScanBackwards(yaffs_Dev
- * this is the one being allocated from
- */
-
-- if(foundChunksInBlock)
-- {
-+ if (foundChunksInBlock) {
- /* This is a chunk that was skipped due to failing the erased check */
--
- } else if (c == 0) {
- /* We're looking at the first chunk in the block so the block is unused */
- state = YAFFS_BLOCK_STATE_EMPTY;
-@@ -6138,7 +6139,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- } else {
- if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING ||
- state == YAFFS_BLOCK_STATE_ALLOCATING) {
-- if(dev->sequenceNumber == bi->sequenceNumber) {
-+ if (dev->sequenceNumber == bi->sequenceNumber) {
- /* this is the block being allocated from */
-
- T(YAFFS_TRACE_SCAN,
-@@ -6150,27 +6151,31 @@ static int yaffs_ScanBackwards(yaffs_Dev
- dev->allocationBlock = blk;
- dev->allocationPage = c;
- dev->allocationBlockFinder = blk;
-- }
-- else {
-+ } else {
- /* This is a partially written block that is not
- * the current allocation block. This block must have
- * had a write failure, so set up for retirement.
- */
-
-- bi->needsRetiring = 1;
-+ /* bi->needsRetiring = 1; ??? TODO */
- bi->gcPrioritise = 1;
-
- T(YAFFS_TRACE_ALWAYS,
-- (TSTR("Partially written block %d being set for retirement" TENDSTR),
-+ (TSTR("Partially written block %d detected" TENDSTR),
- blk));
- }
--
- }
--
- }
-
- dev->nFreeChunks++;
-
-+ } else if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED) {
-+ T(YAFFS_TRACE_SCAN,
-+ (TSTR(" Unfixed ECC in chunk(%d:%d), chunk ignored"TENDSTR),
-+ blk, c));
-+
-+ dev->nFreeChunks++;
-+
- } else if (tags.chunkId > 0) {
- /* chunkId > 0 so it is a data chunk... */
- unsigned int endpos;
-@@ -6187,7 +6192,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- tags.
- objectId,
- YAFFS_OBJECT_TYPE_FILE);
-- if(!in){
-+ if (!in) {
- /* Out of memory */
- alloc_failed = 1;
- }
-@@ -6197,8 +6202,8 @@ static int yaffs_ScanBackwards(yaffs_Dev
- && chunkBase <
- in->variant.fileVariant.shrinkSize) {
- /* This has not been invalidated by a resize */
-- if(!yaffs_PutChunkIntoFile(in, tags.chunkId,
-- chunk, -1)){
-+ if (!yaffs_PutChunkIntoFile(in, tags.chunkId,
-+ chunk, -1)) {
- alloc_failed = 1;
- }
-
-@@ -6221,7 +6226,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- scannedFileSize;
- }
-
-- } else if(in) {
-+ } else if (in) {
- /* This chunk has been invalidated by a resize, so delete */
- yaffs_DeleteChunk(dev, chunk, 1, __LINE__);
-
-@@ -6242,6 +6247,8 @@ static int yaffs_ScanBackwards(yaffs_Dev
- in = yaffs_FindOrCreateObjectByNumber
- (dev, tags.objectId,
- tags.extraObjectType);
-+ if (!in)
-+ alloc_failed = 1;
- }
-
- if (!in ||
-@@ -6251,8 +6258,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- tags.extraShadows ||
- (!in->valid &&
- (tags.objectId == YAFFS_OBJECTID_ROOT ||
-- tags.objectId == YAFFS_OBJECTID_LOSTNFOUND))
-- ) {
-+ tags.objectId == YAFFS_OBJECTID_LOSTNFOUND))) {
-
- /* If we don't have valid info then we need to read the chunk
- * TODO In future we can probably defer reading the chunk and
-@@ -6266,8 +6272,17 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- oh = (yaffs_ObjectHeader *) chunkData;
-
-- if (!in)
-+ if (dev->inbandTags) {
-+ /* Fix up the header if they got corrupted by inband tags */
-+ oh->shadowsObject = oh->inbandShadowsObject;
-+ oh->isShrink = oh->inbandIsShrink;
-+ }
-+
-+ if (!in) {
- in = yaffs_FindOrCreateObjectByNumber(dev, tags.objectId, oh->type);
-+ if (!in)
-+ alloc_failed = 1;
-+ }
-
- }
-
-@@ -6275,10 +6290,9 @@ static int yaffs_ScanBackwards(yaffs_Dev
- /* TODO Hoosterman we have a problem! */
- T(YAFFS_TRACE_ERROR,
- (TSTR
-- ("yaffs tragedy: Could not make object for object %d "
-- "at chunk %d during scan"
-+ ("yaffs tragedy: Could not make object for object %d at chunk %d during scan"
- TENDSTR), tags.objectId, chunk));
--
-+ continue;
- }
-
- if (in->valid) {
-@@ -6289,10 +6303,9 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- if ((in->variantType == YAFFS_OBJECT_TYPE_FILE) &&
- ((oh &&
-- oh-> type == YAFFS_OBJECT_TYPE_FILE)||
-+ oh->type == YAFFS_OBJECT_TYPE_FILE) ||
- (tags.extraHeaderInfoAvailable &&
-- tags.extraObjectType == YAFFS_OBJECT_TYPE_FILE))
-- ) {
-+ tags.extraObjectType == YAFFS_OBJECT_TYPE_FILE))) {
- __u32 thisSize =
- (oh) ? oh->fileSize : tags.
- extraFileLength;
-@@ -6300,7 +6313,9 @@ static int yaffs_ScanBackwards(yaffs_Dev
- (oh) ? oh->
- parentObjectId : tags.
- extraParentObjectId;
-- unsigned isShrink =
-+
-+
-+ isShrink =
- (oh) ? oh->isShrink : tags.
- extraIsShrinkHeader;
-
-@@ -6323,9 +6338,8 @@ static int yaffs_ScanBackwards(yaffs_Dev
- thisSize;
- }
-
-- if (isShrink) {
-+ if (isShrink)
- bi->hasShrinkHeader = 1;
-- }
-
- }
- /* Use existing - destroy this one. */
-@@ -6333,6 +6347,17 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- }
-
-+ if (!in->valid && in->variantType !=
-+ (oh ? oh->type : tags.extraObjectType))
-+ T(YAFFS_TRACE_ERROR, (
-+ TSTR("yaffs tragedy: Bad object type, "
-+ TCONT("%d != %d, for object %d at chunk ")
-+ TCONT("%d during scan")
-+ TENDSTR), oh ?
-+ oh->type : tags.extraObjectType,
-+ in->variantType, tags.objectId,
-+ chunk));
-+
- if (!in->valid &&
- (tags.objectId == YAFFS_OBJECTID_ROOT ||
- tags.objectId ==
-@@ -6340,7 +6365,7 @@ static int yaffs_ScanBackwards(yaffs_Dev
- /* We only load some info, don't fiddle with directory structure */
- in->valid = 1;
-
-- if(oh) {
-+ if (oh) {
- in->variantType = oh->type;
-
- in->yst_mode = oh->yst_mode;
-@@ -6365,15 +6390,15 @@ static int yaffs_ScanBackwards(yaffs_Dev
- in->lazyLoaded = 1;
- }
-
-- in->chunkId = chunk;
-+ in->hdrChunk = chunk;
-
- } else if (!in->valid) {
- /* we need to load this info */
-
- in->valid = 1;
-- in->chunkId = chunk;
-+ in->hdrChunk = chunk;
-
-- if(oh) {
-+ if (oh) {
- in->variantType = oh->type;
-
- in->yst_mode = oh->yst_mode;
-@@ -6403,20 +6428,19 @@ static int yaffs_ScanBackwards(yaffs_Dev
- yaffs_SetObjectName(in, oh->name);
- parent =
- yaffs_FindOrCreateObjectByNumber
-- (dev, oh->parentObjectId,
-- YAFFS_OBJECT_TYPE_DIRECTORY);
-+ (dev, oh->parentObjectId,
-+ YAFFS_OBJECT_TYPE_DIRECTORY);
-
- fileSize = oh->fileSize;
-- isShrink = oh->isShrink;
-+ isShrink = oh->isShrink;
- equivalentObjectId = oh->equivalentObjectId;
-
-- }
-- else {
-+ } else {
- in->variantType = tags.extraObjectType;
- parent =
- yaffs_FindOrCreateObjectByNumber
-- (dev, tags.extraParentObjectId,
-- YAFFS_OBJECT_TYPE_DIRECTORY);
-+ (dev, tags.extraParentObjectId,
-+ YAFFS_OBJECT_TYPE_DIRECTORY);
- fileSize = tags.extraFileLength;
- isShrink = tags.extraIsShrinkHeader;
- equivalentObjectId = tags.extraEquivalentObjectId;
-@@ -6425,29 +6449,30 @@ static int yaffs_ScanBackwards(yaffs_Dev
- }
- in->dirty = 0;
-
-+ if (!parent)
-+ alloc_failed = 1;
-+
- /* directory stuff...
- * hook up to parent
- */
-
-- if (parent->variantType ==
-+ if (parent && parent->variantType ==
- YAFFS_OBJECT_TYPE_UNKNOWN) {
- /* Set up as a directory */
- parent->variantType =
-- YAFFS_OBJECT_TYPE_DIRECTORY;
-- INIT_LIST_HEAD(&parent->variant.
-- directoryVariant.
-- children);
-- } else if (parent->variantType !=
-- YAFFS_OBJECT_TYPE_DIRECTORY)
-- {
-+ YAFFS_OBJECT_TYPE_DIRECTORY;
-+ YINIT_LIST_HEAD(&parent->variant.
-+ directoryVariant.
-+ children);
-+ } else if (!parent || parent->variantType !=
-+ YAFFS_OBJECT_TYPE_DIRECTORY) {
- /* Hoosterman, another problem....
- * We're trying to use a non-directory as a directory
- */
-
- T(YAFFS_TRACE_ERROR,
- (TSTR
-- ("yaffs tragedy: attempting to use non-directory as"
-- " a directory in scan. Put in lost+found."
-+ ("yaffs tragedy: attempting to use non-directory as a directory in scan. Put in lost+found."
- TENDSTR)));
- parent = dev->lostNFoundDir;
- }
-@@ -6494,12 +6519,12 @@ static int yaffs_ScanBackwards(yaffs_Dev
-
- break;
- case YAFFS_OBJECT_TYPE_HARDLINK:
-- if(!itsUnlinked) {
-- in->variant.hardLinkVariant.equivalentObjectId =
-- equivalentObjectId;
-- in->hardLinks.next =
-- (struct list_head *) hardList;
-- hardList = in;
-+ if (!itsUnlinked) {
-+ in->variant.hardLinkVariant.equivalentObjectId =
-+ equivalentObjectId;
-+ in->hardLinks.next =
-+ (struct ylist_head *) hardList;
-+ hardList = in;
- }
- break;
- case YAFFS_OBJECT_TYPE_DIRECTORY:
-@@ -6509,12 +6534,11 @@ static int yaffs_ScanBackwards(yaffs_Dev
- /* Do nothing */
- break;
- case YAFFS_OBJECT_TYPE_SYMLINK:
-- if(oh){
-- in->variant.symLinkVariant.alias =
-- yaffs_CloneString(oh->
-- alias);
-- if(!in->variant.symLinkVariant.alias)
-- alloc_failed = 1;
-+ if (oh) {
-+ in->variant.symLinkVariant.alias =
-+ yaffs_CloneString(oh->alias);
-+ if (!in->variant.symLinkVariant.alias)
-+ alloc_failed = 1;
- }
- break;
- }
-@@ -6551,75 +6575,129 @@ static int yaffs_ScanBackwards(yaffs_Dev
- * We should now have scanned all the objects, now it's time to add these
- * hardlinks.
- */
-- yaffs_HardlinkFixup(dev,hardList);
-+ yaffs_HardlinkFixup(dev, hardList);
-
-
-- /*
-- * Sort out state of unlinked and deleted objects.
-- */
-- {
-- struct list_head *i;
-- struct list_head *n;
-+ yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__);
-
-- yaffs_Object *l;
-+ if (alloc_failed)
-+ return YAFFS_FAIL;
-
-- /* Soft delete all the unlinked files */
-- list_for_each_safe(i, n,
-- &dev->unlinkedDir->variant.directoryVariant.
-- children) {
-- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-- yaffs_DestroyObject(l);
-- }
-- }
-+ T(YAFFS_TRACE_SCAN, (TSTR("yaffs_ScanBackwards ends" TENDSTR)));
-
-- /* Soft delete all the deletedDir files */
-- list_for_each_safe(i, n,
-- &dev->deletedDir->variant.directoryVariant.
-- children) {
-- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-- yaffs_DestroyObject(l);
-+ return YAFFS_OK;
-+}
-
-- }
-+/*------------------------------ Directory Functions ----------------------------- */
-+
-+static void yaffs_VerifyObjectInDirectory(yaffs_Object *obj)
-+{
-+ struct ylist_head *lh;
-+ yaffs_Object *listObj;
-+
-+ int count = 0;
-+
-+ if (!obj) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("No object to verify" TENDSTR)));
-+ YBUG();
-+ return;
-+ }
-+
-+ if (yaffs_SkipVerification(obj->myDev))
-+ return;
-+
-+ if (!obj->parent) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Object does not have parent" TENDSTR)));
-+ YBUG();
-+ return;
-+ }
-+
-+ if (obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Parent is not directory" TENDSTR)));
-+ YBUG();
-+ }
-+
-+ /* Iterate through the objects in each hash entry */
-+
-+ ylist_for_each(lh, &obj->parent->variant.directoryVariant.children) {
-+ if (lh) {
-+ listObj = ylist_entry(lh, yaffs_Object, siblings);
-+ yaffs_VerifyObject(listObj);
-+ if (obj == listObj)
-+ count++;
- }
-+ }
-+
-+ if (count != 1) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Object in directory %d times" TENDSTR), count));
-+ YBUG();
- }
-+}
-
-- yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__);
-+static void yaffs_VerifyDirectory(yaffs_Object *directory)
-+{
-+ struct ylist_head *lh;
-+ yaffs_Object *listObj;
-
-- if(alloc_failed){
-- return YAFFS_FAIL;
-+ if (!directory) {
-+ YBUG();
-+ return;
- }
-
-- T(YAFFS_TRACE_SCAN, (TSTR("yaffs_ScanBackwards ends" TENDSTR)));
-+ if (yaffs_SkipFullVerification(directory->myDev))
-+ return;
-
-- return YAFFS_OK;
-+ if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Directory has wrong type: %d" TENDSTR), directory->variantType));
-+ YBUG();
-+ }
-+
-+ /* Iterate through the objects in each hash entry */
-+
-+ ylist_for_each(lh, &directory->variant.directoryVariant.children) {
-+ if (lh) {
-+ listObj = ylist_entry(lh, yaffs_Object, siblings);
-+ if (listObj->parent != directory) {
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("Object in directory list has wrong parent %p" TENDSTR), listObj->parent));
-+ YBUG();
-+ }
-+ yaffs_VerifyObjectInDirectory(listObj);
-+ }
-+ }
- }
-
--/*------------------------------ Directory Functions ----------------------------- */
-
--static void yaffs_RemoveObjectFromDirectory(yaffs_Object * obj)
-+static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj)
- {
- yaffs_Device *dev = obj->myDev;
-+ yaffs_Object *parent;
-+
-+ yaffs_VerifyObjectInDirectory(obj);
-+ parent = obj->parent;
-+
-+ yaffs_VerifyDirectory(parent);
-
-- if(dev && dev->removeObjectCallback)
-+ if (dev && dev->removeObjectCallback)
- dev->removeObjectCallback(obj);
-
-- list_del_init(&obj->siblings);
-+
-+ ylist_del_init(&obj->siblings);
- obj->parent = NULL;
-+
-+ yaffs_VerifyDirectory(parent);
- }
-
-
--static void yaffs_AddObjectToDirectory(yaffs_Object * directory,
-- yaffs_Object * obj)
-+static void yaffs_AddObjectToDirectory(yaffs_Object *directory,
-+ yaffs_Object *obj)
- {
--
- if (!directory) {
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
- ("tragedy: Trying to add an object to a null pointer directory"
- TENDSTR)));
- YBUG();
-+ return;
- }
- if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
-@@ -6631,37 +6709,42 @@ static void yaffs_AddObjectToDirectory(y
-
- if (obj->siblings.prev == NULL) {
- /* Not initialised */
-- INIT_LIST_HEAD(&obj->siblings);
--
-- } else if (!list_empty(&obj->siblings)) {
-- /* If it is holed up somewhere else, un hook it */
-- yaffs_RemoveObjectFromDirectory(obj);
-+ YBUG();
- }
-+
-+
-+ yaffs_VerifyDirectory(directory);
-+
-+ yaffs_RemoveObjectFromDirectory(obj);
-+
-+
- /* Now add it */
-- list_add(&obj->siblings, &directory->variant.directoryVariant.children);
-+ ylist_add(&obj->siblings, &directory->variant.directoryVariant.children);
- obj->parent = directory;
-
- if (directory == obj->myDev->unlinkedDir
-- || directory == obj->myDev->deletedDir) {
-+ || directory == obj->myDev->deletedDir) {
- obj->unlinked = 1;
- obj->myDev->nUnlinkedFiles++;
- obj->renameAllowed = 0;
- }
-+
-+ yaffs_VerifyDirectory(directory);
-+ yaffs_VerifyObjectInDirectory(obj);
- }
-
--yaffs_Object *yaffs_FindObjectByName(yaffs_Object * directory,
-- const YCHAR * name)
-+yaffs_Object *yaffs_FindObjectByName(yaffs_Object *directory,
-+ const YCHAR *name)
- {
- int sum;
-
-- struct list_head *i;
-+ struct ylist_head *i;
- YCHAR buffer[YAFFS_MAX_NAME_LENGTH + 1];
-
- yaffs_Object *l;
-
-- if (!name) {
-+ if (!name)
- return NULL;
-- }
-
- if (!directory) {
- T(YAFFS_TRACE_ALWAYS,
-@@ -6669,6 +6752,7 @@ yaffs_Object *yaffs_FindObjectByName(yaf
- ("tragedy: yaffs_FindObjectByName: null pointer directory"
- TENDSTR)));
- YBUG();
-+ return NULL;
- }
- if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
-@@ -6679,28 +6763,27 @@ yaffs_Object *yaffs_FindObjectByName(yaf
-
- sum = yaffs_CalcNameSum(name);
-
-- list_for_each(i, &directory->variant.directoryVariant.children) {
-+ ylist_for_each(i, &directory->variant.directoryVariant.children) {
- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-+ l = ylist_entry(i, yaffs_Object, siblings);
-+
-+ if (l->parent != directory)
-+ YBUG();
-
- yaffs_CheckObjectDetailsLoaded(l);
-
- /* Special case for lost-n-found */
- if (l->objectId == YAFFS_OBJECTID_LOSTNFOUND) {
-- if (yaffs_strcmp(name, YAFFS_LOSTNFOUND_NAME) == 0) {
-+ if (yaffs_strcmp(name, YAFFS_LOSTNFOUND_NAME) == 0)
- return l;
-- }
-- } else if (yaffs_SumCompare(l->sum, sum) || l->chunkId <= 0)
-- {
-- /* LostnFound cunk called Objxxx
-+ } else if (yaffs_SumCompare(l->sum, sum) || l->hdrChunk <= 0) {
-+ /* LostnFound chunk called Objxxx
- * Do a real check
- */
- yaffs_GetObjectName(l, buffer,
- YAFFS_MAX_NAME_LENGTH);
-- if (yaffs_strncmp(name, buffer,YAFFS_MAX_NAME_LENGTH) == 0) {
-+ if (yaffs_strncmp(name, buffer, YAFFS_MAX_NAME_LENGTH) == 0)
- return l;
-- }
--
- }
- }
- }
-@@ -6710,10 +6793,10 @@ yaffs_Object *yaffs_FindObjectByName(yaf
-
-
- #if 0
--int yaffs_ApplyToDirectoryChildren(yaffs_Object * theDir,
-- int (*fn) (yaffs_Object *))
-+int yaffs_ApplyToDirectoryChildren(yaffs_Object *theDir,
-+ int (*fn) (yaffs_Object *))
- {
-- struct list_head *i;
-+ struct ylist_head *i;
- yaffs_Object *l;
-
- if (!theDir) {
-@@ -6722,20 +6805,21 @@ int yaffs_ApplyToDirectoryChildren(yaffs
- ("tragedy: yaffs_FindObjectByName: null pointer directory"
- TENDSTR)));
- YBUG();
-+ return YAFFS_FAIL;
- }
- if (theDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) {
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
- ("tragedy: yaffs_FindObjectByName: non-directory" TENDSTR)));
- YBUG();
-+ return YAFFS_FAIL;
- }
-
-- list_for_each(i, &theDir->variant.directoryVariant.children) {
-+ ylist_for_each(i, &theDir->variant.directoryVariant.children) {
- if (i) {
-- l = list_entry(i, yaffs_Object, siblings);
-- if (l && !fn(l)) {
-+ l = ylist_entry(i, yaffs_Object, siblings);
-+ if (l && !fn(l))
- return YAFFS_FAIL;
-- }
- }
- }
-
-@@ -6748,7 +6832,7 @@ int yaffs_ApplyToDirectoryChildren(yaffs
- * actual object.
- */
-
--yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object * obj)
-+yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj)
- {
- if (obj && obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) {
- /* We want the object id of the equivalent object, not this one */
-@@ -6756,10 +6840,9 @@ yaffs_Object *yaffs_GetEquivalentObject(
- yaffs_CheckObjectDetailsLoaded(obj);
- }
- return obj;
--
- }
-
--int yaffs_GetObjectName(yaffs_Object * obj, YCHAR * name, int buffSize)
-+int yaffs_GetObjectName(yaffs_Object *obj, YCHAR *name, int buffSize)
- {
- memset(name, 0, buffSize * sizeof(YCHAR));
-
-@@ -6767,18 +6850,26 @@ int yaffs_GetObjectName(yaffs_Object * o
-
- if (obj->objectId == YAFFS_OBJECTID_LOSTNFOUND) {
- yaffs_strncpy(name, YAFFS_LOSTNFOUND_NAME, buffSize - 1);
-- } else if (obj->chunkId <= 0) {
-+ } else if (obj->hdrChunk <= 0) {
- YCHAR locName[20];
-+ YCHAR numString[20];
-+ YCHAR *x = &numString[19];
-+ unsigned v = obj->objectId;
-+ numString[19] = 0;
-+ while (v > 0) {
-+ x--;
-+ *x = '0' + (v % 10);
-+ v /= 10;
-+ }
- /* make up a name */
-- yaffs_sprintf(locName, _Y("%s%d"), YAFFS_LOSTNFOUND_PREFIX,
-- obj->objectId);
-+ yaffs_strcpy(locName, YAFFS_LOSTNFOUND_PREFIX);
-+ yaffs_strcat(locName, x);
- yaffs_strncpy(name, locName, buffSize - 1);
-
- }
- #ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM
-- else if (obj->shortName[0]) {
-+ else if (obj->shortName[0])
- yaffs_strcpy(name, obj->shortName);
-- }
- #endif
- else {
- int result;
-@@ -6788,9 +6879,9 @@ int yaffs_GetObjectName(yaffs_Object * o
-
- memset(buffer, 0, obj->myDev->nDataBytesPerChunk);
-
-- if (obj->chunkId >= 0) {
-+ if (obj->hdrChunk > 0) {
- result = yaffs_ReadChunkWithTagsFromNAND(obj->myDev,
-- obj->chunkId, buffer,
-+ obj->hdrChunk, buffer,
- NULL);
- }
- yaffs_strncpy(name, oh->name, buffSize - 1);
-@@ -6801,46 +6892,43 @@ int yaffs_GetObjectName(yaffs_Object * o
- return yaffs_strlen(name);
- }
-
--int yaffs_GetObjectFileLength(yaffs_Object * obj)
-+int yaffs_GetObjectFileLength(yaffs_Object *obj)
- {
--
- /* Dereference any hard linking */
- obj = yaffs_GetEquivalentObject(obj);
-
-- if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) {
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE)
- return obj->variant.fileVariant.fileSize;
-- }
-- if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK) {
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
- return yaffs_strlen(obj->variant.symLinkVariant.alias);
-- } else {
-+ else {
- /* Only a directory should drop through to here */
- return obj->myDev->nDataBytesPerChunk;
- }
- }
-
--int yaffs_GetObjectLinkCount(yaffs_Object * obj)
-+int yaffs_GetObjectLinkCount(yaffs_Object *obj)
- {
- int count = 0;
-- struct list_head *i;
-+ struct ylist_head *i;
-
-- if (!obj->unlinked) {
-- count++; /* the object itself */
-- }
-- list_for_each(i, &obj->hardLinks) {
-- count++; /* add the hard links; */
-- }
-- return count;
-+ if (!obj->unlinked)
-+ count++; /* the object itself */
-+
-+ ylist_for_each(i, &obj->hardLinks)
-+ count++; /* add the hard links; */
-
-+ return count;
- }
-
--int yaffs_GetObjectInode(yaffs_Object * obj)
-+int yaffs_GetObjectInode(yaffs_Object *obj)
- {
- obj = yaffs_GetEquivalentObject(obj);
-
- return obj->objectId;
- }
-
--unsigned yaffs_GetObjectType(yaffs_Object * obj)
-+unsigned yaffs_GetObjectType(yaffs_Object *obj)
- {
- obj = yaffs_GetEquivalentObject(obj);
-
-@@ -6872,19 +6960,18 @@ unsigned yaffs_GetObjectType(yaffs_Objec
- }
- }
-
--YCHAR *yaffs_GetSymlinkAlias(yaffs_Object * obj)
-+YCHAR *yaffs_GetSymlinkAlias(yaffs_Object *obj)
- {
- obj = yaffs_GetEquivalentObject(obj);
-- if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK) {
-+ if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
- return yaffs_CloneString(obj->variant.symLinkVariant.alias);
-- } else {
-+ else
- return yaffs_CloneString(_Y(""));
-- }
- }
-
- #ifndef CONFIG_YAFFS_WINCE
-
--int yaffs_SetAttributes(yaffs_Object * obj, struct iattr *attr)
-+int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr)
- {
- unsigned int valid = attr->ia_valid;
-
-@@ -6910,7 +6997,7 @@ int yaffs_SetAttributes(yaffs_Object * o
- return YAFFS_OK;
-
- }
--int yaffs_GetAttributes(yaffs_Object * obj, struct iattr *attr)
-+int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr)
- {
- unsigned int valid = 0;
-
-@@ -6934,13 +7021,12 @@ int yaffs_GetAttributes(yaffs_Object * o
- attr->ia_valid = valid;
-
- return YAFFS_OK;
--
- }
-
- #endif
-
- #if 0
--int yaffs_DumpObject(yaffs_Object * obj)
-+int yaffs_DumpObject(yaffs_Object *obj)
- {
- YCHAR name[257];
-
-@@ -6951,7 +7037,7 @@ int yaffs_DumpObject(yaffs_Object * obj)
- ("Object %d, inode %d \"%s\"\n dirty %d valid %d serial %d sum %d"
- " chunk %d type %d size %d\n"
- TENDSTR), obj->objectId, yaffs_GetObjectInode(obj), name,
-- obj->dirty, obj->valid, obj->serial, obj->sum, obj->chunkId,
-+ obj->dirty, obj->valid, obj->serial, obj->sum, obj->hdrChunk,
- yaffs_GetObjectType(obj), yaffs_GetObjectFileLength(obj)));
-
- return YAFFS_OK;
-@@ -6960,7 +7046,7 @@ int yaffs_DumpObject(yaffs_Object * obj)
-
- /*---------------------------- Initialisation code -------------------------------------- */
-
--static int yaffs_CheckDevFunctions(const yaffs_Device * dev)
-+static int yaffs_CheckDevFunctions(const yaffs_Device *dev)
- {
-
- /* Common functions, gotta have */
-@@ -7011,7 +7097,7 @@ static int yaffs_CreateInitialDirectorie
- yaffs_CreateFakeDirectory(dev, YAFFS_OBJECTID_LOSTNFOUND,
- YAFFS_LOSTNFOUND_MODE | S_IFDIR);
-
-- if(dev->lostNFoundDir && dev->rootDir && dev->unlinkedDir && dev->deletedDir){
-+ if (dev->lostNFoundDir && dev->rootDir && dev->unlinkedDir && dev->deletedDir) {
- yaffs_AddObjectToDirectory(dev->rootDir, dev->lostNFoundDir);
- return YAFFS_OK;
- }
-@@ -7019,7 +7105,7 @@ static int yaffs_CreateInitialDirectorie
- return YAFFS_FAIL;
- }
-
--int yaffs_GutsInitialise(yaffs_Device * dev)
-+int yaffs_GutsInitialise(yaffs_Device *dev)
- {
- int init_failed = 0;
- unsigned x;
-@@ -7040,6 +7126,8 @@ int yaffs_GutsInitialise(yaffs_Device *
- dev->chunkOffset = 0;
- dev->nFreeChunks = 0;
-
-+ dev->gcBlock = -1;
-+
- if (dev->startBlock == 0) {
- dev->internalStartBlock = dev->startBlock + 1;
- dev->internalEndBlock = dev->endBlock + 1;
-@@ -7049,18 +7137,18 @@ int yaffs_GutsInitialise(yaffs_Device *
-
- /* Check geometry parameters. */
-
-- if ((dev->isYaffs2 && dev->nDataBytesPerChunk < 1024) ||
-- (!dev->isYaffs2 && dev->nDataBytesPerChunk != 512) ||
-+ if ((!dev->inbandTags && dev->isYaffs2 && dev->totalBytesPerChunk < 1024) ||
-+ (!dev->isYaffs2 && dev->totalBytesPerChunk < 512) ||
-+ (dev->inbandTags && !dev->isYaffs2) ||
- dev->nChunksPerBlock < 2 ||
- dev->nReservedBlocks < 2 ||
- dev->internalStartBlock <= 0 ||
- dev->internalEndBlock <= 0 ||
-- dev->internalEndBlock <= (dev->internalStartBlock + dev->nReservedBlocks + 2) // otherwise it is too small
-- ) {
-+ dev->internalEndBlock <= (dev->internalStartBlock + dev->nReservedBlocks + 2)) { /* otherwise it is too small */
- T(YAFFS_TRACE_ALWAYS,
- (TSTR
-- ("yaffs: NAND geometry problems: chunk size %d, type is yaffs%s "
-- TENDSTR), dev->nDataBytesPerChunk, dev->isYaffs2 ? "2" : ""));
-+ ("yaffs: NAND geometry problems: chunk size %d, type is yaffs%s, inbandTags %d "
-+ TENDSTR), dev->totalBytesPerChunk, dev->isYaffs2 ? "2" : "", dev->inbandTags));
- return YAFFS_FAIL;
- }
-
-@@ -7070,6 +7158,12 @@ int yaffs_GutsInitialise(yaffs_Device *
- return YAFFS_FAIL;
- }
-
-+ /* Sort out space for inband tags, if required */
-+ if (dev->inbandTags)
-+ dev->nDataBytesPerChunk = dev->totalBytesPerChunk - sizeof(yaffs_PackedTags2TagsPart);
-+ else
-+ dev->nDataBytesPerChunk = dev->totalBytesPerChunk;
-+
- /* Got the right mix of functions? */
- if (!yaffs_CheckDevFunctions(dev)) {
- /* Function missing */
-@@ -7097,31 +7191,18 @@ int yaffs_GutsInitialise(yaffs_Device *
-
- dev->isMounted = 1;
-
--
--
- /* OK now calculate a few things for the device */
-
- /*
- * Calculate all the chunk size manipulation numbers:
- */
-- /* Start off assuming it is a power of 2 */
-- dev->chunkShift = ShiftDiv(dev->nDataBytesPerChunk);
-- dev->chunkMask = (1<<dev->chunkShift) - 1;
--
-- if(dev->nDataBytesPerChunk == (dev->chunkMask + 1)){
-- /* Yes it is a power of 2, disable crumbs */
-- dev->crumbMask = 0;
-- dev->crumbShift = 0;
-- dev->crumbsPerChunk = 0;
-- } else {
-- /* Not a power of 2, use crumbs instead */
-- dev->crumbShift = ShiftDiv(sizeof(yaffs_PackedTags2TagsPart));
-- dev->crumbMask = (1<<dev->crumbShift)-1;
-- dev->crumbsPerChunk = dev->nDataBytesPerChunk/(1 << dev->crumbShift);
-- dev->chunkShift = 0;
-- dev->chunkMask = 0;
-- }
--
-+ x = dev->nDataBytesPerChunk;
-+ /* We always use dev->chunkShift and dev->chunkDiv */
-+ dev->chunkShift = Shifts(x);
-+ x >>= dev->chunkShift;
-+ dev->chunkDiv = x;
-+ /* We only use chunk mask if chunkDiv is 1 */
-+ dev->chunkMask = (1<<dev->chunkShift) - 1;
-
- /*
- * Calculate chunkGroupBits.
-@@ -7133,16 +7214,15 @@ int yaffs_GutsInitialise(yaffs_Device *
- bits = ShiftsGE(x);
-
- /* Set up tnode width if wide tnodes are enabled. */
-- if(!dev->wideTnodesDisabled){
-+ if (!dev->wideTnodesDisabled) {
- /* bits must be even so that we end up with 32-bit words */
-- if(bits & 1)
-+ if (bits & 1)
- bits++;
-- if(bits < 16)
-+ if (bits < 16)
- dev->tnodeWidth = 16;
- else
- dev->tnodeWidth = bits;
-- }
-- else
-+ } else
- dev->tnodeWidth = 16;
-
- dev->tnodeMask = (1<<dev->tnodeWidth)-1;
-@@ -7193,7 +7273,7 @@ int yaffs_GutsInitialise(yaffs_Device *
- dev->hasPendingPrioritisedGCs = 1; /* Assume the worst for now, will get fixed on first GC */
-
- /* Initialise temporary buffers and caches. */
-- if(!yaffs_InitialiseTempBuffers(dev))
-+ if (!yaffs_InitialiseTempBuffers(dev))
- init_failed = 1;
-
- dev->srCache = NULL;
-@@ -7203,25 +7283,26 @@ int yaffs_GutsInitialise(yaffs_Device *
- if (!init_failed &&
- dev->nShortOpCaches > 0) {
- int i;
-- __u8 *buf;
-+ void *buf;
- int srCacheBytes = dev->nShortOpCaches * sizeof(yaffs_ChunkCache);
-
-- if (dev->nShortOpCaches > YAFFS_MAX_SHORT_OP_CACHES) {
-+ if (dev->nShortOpCaches > YAFFS_MAX_SHORT_OP_CACHES)
- dev->nShortOpCaches = YAFFS_MAX_SHORT_OP_CACHES;
-- }
-
-- buf = dev->srCache = YMALLOC(srCacheBytes);
-+ dev->srCache = YMALLOC(srCacheBytes);
-
-- if(dev->srCache)
-- memset(dev->srCache,0,srCacheBytes);
-+ buf = (__u8 *) dev->srCache;
-+
-+ if (dev->srCache)
-+ memset(dev->srCache, 0, srCacheBytes);
-
- for (i = 0; i < dev->nShortOpCaches && buf; i++) {
- dev->srCache[i].object = NULL;
- dev->srCache[i].lastUse = 0;
- dev->srCache[i].dirty = 0;
-- dev->srCache[i].data = buf = YMALLOC_DMA(dev->nDataBytesPerChunk);
-+ dev->srCache[i].data = buf = YMALLOC_DMA(dev->totalBytesPerChunk);
- }
-- if(!buf)
-+ if (!buf)
- init_failed = 1;
-
- dev->srLastUse = 0;
-@@ -7229,29 +7310,30 @@ int yaffs_GutsInitialise(yaffs_Device *
-
- dev->cacheHits = 0;
-
-- if(!init_failed){
-+ if (!init_failed) {
- dev->gcCleanupList = YMALLOC(dev->nChunksPerBlock * sizeof(__u32));
-- if(!dev->gcCleanupList)
-+ if (!dev->gcCleanupList)
- init_failed = 1;
- }
-
-- if (dev->isYaffs2) {
-+ if (dev->isYaffs2)
- dev->useHeaderFileSize = 1;
-- }
-- if(!init_failed && !yaffs_InitialiseBlocks(dev))
-+
-+ if (!init_failed && !yaffs_InitialiseBlocks(dev))
- init_failed = 1;
-
- yaffs_InitialiseTnodes(dev);
- yaffs_InitialiseObjects(dev);
-
-- if(!init_failed && !yaffs_CreateInitialDirectories(dev))
-+ if (!init_failed && !yaffs_CreateInitialDirectories(dev))
- init_failed = 1;
-
-
-- if(!init_failed){
-+ if (!init_failed) {
- /* Now scan the flash. */
- if (dev->isYaffs2) {
-- if(yaffs_CheckpointRestore(dev)) {
-+ if (yaffs_CheckpointRestore(dev)) {
-+ yaffs_CheckObjectDetailsLoaded(dev->rootDir);
- T(YAFFS_TRACE_ALWAYS,
- (TSTR("yaffs: restored from checkpoint" TENDSTR)));
- } else {
-@@ -7273,24 +7355,25 @@ int yaffs_GutsInitialise(yaffs_Device *
- dev->nBackgroundDeletions = 0;
- dev->oldestDirtySequence = 0;
-
-- if(!init_failed && !yaffs_InitialiseBlocks(dev))
-+ if (!init_failed && !yaffs_InitialiseBlocks(dev))
- init_failed = 1;
-
- yaffs_InitialiseTnodes(dev);
- yaffs_InitialiseObjects(dev);
-
-- if(!init_failed && !yaffs_CreateInitialDirectories(dev))
-+ if (!init_failed && !yaffs_CreateInitialDirectories(dev))
- init_failed = 1;
-
-- if(!init_failed && !yaffs_ScanBackwards(dev))
-+ if (!init_failed && !yaffs_ScanBackwards(dev))
- init_failed = 1;
- }
-- }else
-- if(!yaffs_Scan(dev))
-+ } else if (!yaffs_Scan(dev))
- init_failed = 1;
-+
-+ yaffs_StripDeletedObjects(dev);
- }
-
-- if(init_failed){
-+ if (init_failed) {
- /* Clean up the mess */
- T(YAFFS_TRACE_TRACING,
- (TSTR("yaffs: yaffs_GutsInitialise() aborted.\n" TENDSTR)));
-@@ -7318,7 +7401,7 @@ int yaffs_GutsInitialise(yaffs_Device *
-
- }
-
--void yaffs_Deinitialise(yaffs_Device * dev)
-+void yaffs_Deinitialise(yaffs_Device *dev)
- {
- if (dev->isMounted) {
- int i;
-@@ -7330,7 +7413,7 @@ void yaffs_Deinitialise(yaffs_Device * d
- dev->srCache) {
-
- for (i = 0; i < dev->nShortOpCaches; i++) {
-- if(dev->srCache[i].data)
-+ if (dev->srCache[i].data)
- YFREE(dev->srCache[i].data);
- dev->srCache[i].data = NULL;
- }
-@@ -7341,16 +7424,17 @@ void yaffs_Deinitialise(yaffs_Device * d
-
- YFREE(dev->gcCleanupList);
-
-- for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) {
-+ for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++)
- YFREE(dev->tempBuffer[i].buffer);
-- }
-
- dev->isMounted = 0;
-- }
-
-+ if (dev->deinitialiseNAND)
-+ dev->deinitialiseNAND(dev);
-+ }
- }
-
--static int yaffs_CountFreeChunks(yaffs_Device * dev)
-+static int yaffs_CountFreeChunks(yaffs_Device *dev)
- {
- int nFree;
- int b;
-@@ -7358,7 +7442,7 @@ static int yaffs_CountFreeChunks(yaffs_D
- yaffs_BlockInfo *blk;
-
- for (nFree = 0, b = dev->internalStartBlock; b <= dev->internalEndBlock;
-- b++) {
-+ b++) {
- blk = yaffs_GetBlockInfo(dev, b);
-
- switch (blk->blockState) {
-@@ -7373,19 +7457,19 @@ static int yaffs_CountFreeChunks(yaffs_D
- default:
- break;
- }
--
- }
-
- return nFree;
- }
-
--int yaffs_GetNumberOfFreeChunks(yaffs_Device * dev)
-+int yaffs_GetNumberOfFreeChunks(yaffs_Device *dev)
- {
- /* This is what we report to the outside world */
-
- int nFree;
- int nDirtyCacheChunks;
- int blocksForCheckpoint;
-+ int i;
-
- #if 1
- nFree = dev->nFreeChunks;
-@@ -7397,12 +7481,9 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De
-
- /* Now count the number of dirty chunks in the cache and subtract those */
-
-- {
-- int i;
-- for (nDirtyCacheChunks = 0, i = 0; i < dev->nShortOpCaches; i++) {
-- if (dev->srCache[i].dirty)
-- nDirtyCacheChunks++;
-- }
-+ for (nDirtyCacheChunks = 0, i = 0; i < dev->nShortOpCaches; i++) {
-+ if (dev->srCache[i].dirty)
-+ nDirtyCacheChunks++;
- }
-
- nFree -= nDirtyCacheChunks;
-@@ -7410,8 +7491,8 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De
- nFree -= ((dev->nReservedBlocks + 1) * dev->nChunksPerBlock);
-
- /* Now we figure out how much to reserve for the checkpoint and report that... */
-- blocksForCheckpoint = dev->nCheckpointReservedBlocks - dev->blocksInCheckpoint;
-- if(blocksForCheckpoint < 0)
-+ blocksForCheckpoint = yaffs_CalcCheckpointBlocksRequired(dev) - dev->blocksInCheckpoint;
-+ if (blocksForCheckpoint < 0)
- blocksForCheckpoint = 0;
-
- nFree -= (blocksForCheckpoint * dev->nChunksPerBlock);
-@@ -7425,12 +7506,12 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De
-
- static int yaffs_freeVerificationFailures;
-
--static void yaffs_VerifyFreeChunks(yaffs_Device * dev)
-+static void yaffs_VerifyFreeChunks(yaffs_Device *dev)
- {
- int counted;
- int difference;
-
-- if(yaffs_SkipVerification(dev))
-+ if (yaffs_SkipVerification(dev))
- return;
-
- counted = yaffs_CountFreeChunks(dev);
-@@ -7447,23 +7528,25 @@ static void yaffs_VerifyFreeChunks(yaffs
-
- /*---------------------------------------- YAFFS test code ----------------------*/
-
--#define yaffs_CheckStruct(structure,syze, name) \
-- if(sizeof(structure) != syze) \
-- { \
-- T(YAFFS_TRACE_ALWAYS,(TSTR("%s should be %d but is %d\n" TENDSTR),\
-- name,syze,sizeof(structure))); \
-- return YAFFS_FAIL; \
-- }
-+#define yaffs_CheckStruct(structure, syze, name) \
-+ do { \
-+ if (sizeof(structure) != syze) { \
-+ T(YAFFS_TRACE_ALWAYS, (TSTR("%s should be %d but is %d\n" TENDSTR),\
-+ name, syze, sizeof(structure))); \
-+ return YAFFS_FAIL; \
-+ } \
-+ } while (0)
-
- static int yaffs_CheckStructures(void)
- {
--/* yaffs_CheckStruct(yaffs_Tags,8,"yaffs_Tags") */
--/* yaffs_CheckStruct(yaffs_TagsUnion,8,"yaffs_TagsUnion") */
--/* yaffs_CheckStruct(yaffs_Spare,16,"yaffs_Spare") */
-+/* yaffs_CheckStruct(yaffs_Tags,8,"yaffs_Tags"); */
-+/* yaffs_CheckStruct(yaffs_TagsUnion,8,"yaffs_TagsUnion"); */
-+/* yaffs_CheckStruct(yaffs_Spare,16,"yaffs_Spare"); */
- #ifndef CONFIG_YAFFS_TNODE_LIST_DEBUG
-- yaffs_CheckStruct(yaffs_Tnode, 2 * YAFFS_NTNODES_LEVEL0, "yaffs_Tnode")
-+ yaffs_CheckStruct(yaffs_Tnode, 2 * YAFFS_NTNODES_LEVEL0, "yaffs_Tnode");
- #endif
-- yaffs_CheckStruct(yaffs_ObjectHeader, 512, "yaffs_ObjectHeader")
--
-- return YAFFS_OK;
-+#ifndef CONFIG_YAFFS_WINCE
-+ yaffs_CheckStruct(yaffs_ObjectHeader, 512, "yaffs_ObjectHeader");
-+#endif
-+ return YAFFS_OK;
- }
---- a/fs/yaffs2/yaffs_guts.h
-+++ b/fs/yaffs2/yaffs_guts.h
-@@ -90,7 +90,7 @@
-
- #define YAFFS_MAX_SHORT_OP_CACHES 20
-
--#define YAFFS_N_TEMP_BUFFERS 4
-+#define YAFFS_N_TEMP_BUFFERS 6
-
- /* We limit the number attempts at sucessfully saving a chunk of data.
- * Small-page devices have 32 pages per block; large-page devices have 64.
-@@ -108,6 +108,9 @@
- #define YAFFS_LOWEST_SEQUENCE_NUMBER 0x00001000
- #define YAFFS_HIGHEST_SEQUENCE_NUMBER 0xEFFFFF00
-
-+/* Special sequence number for bad block that failed to be marked bad */
-+#define YAFFS_SEQUENCE_BAD_BLOCK 0xFFFF0000
-+
- /* ChunkCache is used for short read/write operations.*/
- typedef struct {
- struct yaffs_ObjectStruct *object;
-@@ -134,11 +137,10 @@ typedef struct {
- typedef struct {
- unsigned chunkId:20;
- unsigned serialNumber:2;
-- unsigned byteCount:10;
-+ unsigned byteCountLSB:10;
- unsigned objectId:18;
- unsigned ecc:12;
-- unsigned unusedStuff:2;
--
-+ unsigned byteCountMSB:2;
- } yaffs_Tags;
-
- typedef union {
-@@ -277,13 +279,13 @@ typedef struct {
-
- int softDeletions:10; /* number of soft deleted pages */
- int pagesInUse:10; /* number of pages in use */
-- yaffs_BlockState blockState:4; /* One of the above block states */
-+ unsigned blockState:4; /* One of the above block states. NB use unsigned because enum is sometimes an int */
- __u32 needsRetiring:1; /* Data has failed on this block, need to get valid data off */
-- /* and retire the block. */
-- __u32 skipErasedCheck: 1; /* If this is set we can skip the erased check on this block */
-- __u32 gcPrioritise: 1; /* An ECC check or blank check has failed on this block.
-+ /* and retire the block. */
-+ __u32 skipErasedCheck:1; /* If this is set we can skip the erased check on this block */
-+ __u32 gcPrioritise:1; /* An ECC check or blank check has failed on this block.
- It should be prioritised for GC */
-- __u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */
-+ __u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */
-
- #ifdef CONFIG_YAFFS_YAFFS2
- __u32 hasShrinkHeader:1; /* This block has at least one shrink object header */
-@@ -300,11 +302,11 @@ typedef struct {
-
- /* Apply to everything */
- int parentObjectId;
-- __u16 sum__NoLongerUsed; /* checksum of name. No longer used */
-+ __u16 sum__NoLongerUsed; /* checksum of name. No longer used */
- YCHAR name[YAFFS_MAX_NAME_LENGTH + 1];
-
-- /* Thes following apply to directories, files, symlinks - not hard links */
-- __u32 yst_mode; /* protection */
-+ /* The following apply to directories, files, symlinks - not hard links */
-+ __u32 yst_mode; /* protection */
-
- #ifdef CONFIG_YAFFS_WINCE
- __u32 notForWinCE[5];
-@@ -331,11 +333,14 @@ typedef struct {
- __u32 win_ctime[2];
- __u32 win_atime[2];
- __u32 win_mtime[2];
-- __u32 roomToGrow[4];
- #else
-- __u32 roomToGrow[10];
-+ __u32 roomToGrow[6];
-+
- #endif
-+ __u32 inbandShadowsObject;
-+ __u32 inbandIsShrink;
-
-+ __u32 reservedSpace[2];
- int shadowsObject; /* This object header shadows the specified object if > 0 */
-
- /* isShrink applies to object headers written when we shrink the file (ie resize) */
-@@ -381,7 +386,7 @@ typedef struct {
- } yaffs_FileStructure;
-
- typedef struct {
-- struct list_head children; /* list of child links */
-+ struct ylist_head children; /* list of child links */
- } yaffs_DirectoryStructure;
-
- typedef struct {
-@@ -418,23 +423,24 @@ struct yaffs_ObjectStruct {
- * still in the inode cache. Free of object is defered.
- * until the inode is released.
- */
-+ __u8 beingCreated:1; /* This object is still being created so skip some checks. */
-
- __u8 serial; /* serial number of chunk in NAND. Cached here */
- __u16 sum; /* sum of the name to speed searching */
-
-- struct yaffs_DeviceStruct *myDev; /* The device I'm on */
-+ struct yaffs_DeviceStruct *myDev; /* The device I'm on */
-
-- struct list_head hashLink; /* list of objects in this hash bucket */
-+ struct ylist_head hashLink; /* list of objects in this hash bucket */
-
-- struct list_head hardLinks; /* all the equivalent hard linked objects */
-+ struct ylist_head hardLinks; /* all the equivalent hard linked objects */
-
- /* directory structure stuff */
- /* also used for linking up the free list */
- struct yaffs_ObjectStruct *parent;
-- struct list_head siblings;
-+ struct ylist_head siblings;
-
- /* Where's my object header in NAND? */
-- int chunkId;
-+ int hdrChunk;
-
- int nDataChunks; /* Number of data chunks attached to the file. */
-
-@@ -485,7 +491,7 @@ struct yaffs_ObjectList_struct {
- typedef struct yaffs_ObjectList_struct yaffs_ObjectList;
-
- typedef struct {
-- struct list_head list;
-+ struct ylist_head list;
- int count;
- } yaffs_ObjectBucket;
-
-@@ -495,11 +501,10 @@ typedef struct {
- */
-
- typedef struct {
-- int structType;
-+ int structType;
- __u32 objectId;
- __u32 parentId;
-- int chunkId;
--
-+ int hdrChunk;
- yaffs_ObjectType variantType:3;
- __u8 deleted:1;
- __u8 softDeleted:1;
-@@ -511,8 +516,7 @@ typedef struct {
-
- int nDataChunks;
- __u32 fileSizeOrEquivalentObjectId;
--
--}yaffs_CheckpointObject;
-+} yaffs_CheckpointObject;
-
- /*--------------------- Temporary buffers ----------------
- *
-@@ -528,13 +532,13 @@ typedef struct {
- /*----------------- Device ---------------------------------*/
-
- struct yaffs_DeviceStruct {
-- struct list_head devList;
-+ struct ylist_head devList;
- const char *name;
-
- /* Entry parameters set up way early. Yaffs sets up the rest.*/
- int nDataBytesPerChunk; /* Should be a power of 2 >= 512 */
- int nChunksPerBlock; /* does not need to be a power of 2 */
-- int nBytesPerSpare; /* spare area size */
-+ int spareBytesPerChunk; /* spare area size */
- int startBlock; /* Start block we're allowed to use */
- int endBlock; /* End block we're allowed to use */
- int nReservedBlocks; /* We want this tuneable so that we can reduce */
-@@ -544,9 +548,7 @@ struct yaffs_DeviceStruct {
- /* Stuff used by the shared space checkpointing mechanism */
- /* If this value is zero, then this mechanism is disabled */
-
-- int nCheckpointReservedBlocks; /* Blocks to reserve for checkpoint data */
--
--
-+/* int nCheckpointReservedBlocks; */ /* Blocks to reserve for checkpoint data */
-
-
- int nShortOpCaches; /* If <= 0, then short op caching is disabled, else
-@@ -560,30 +562,31 @@ struct yaffs_DeviceStruct {
- void *genericDevice; /* Pointer to device context
- * On an mtd this holds the mtd pointer.
- */
-- void *superBlock;
-+ void *superBlock;
-
- /* NAND access functions (Must be set before calling YAFFS)*/
-
-- int (*writeChunkToNAND) (struct yaffs_DeviceStruct * dev,
-- int chunkInNAND, const __u8 * data,
-- const yaffs_Spare * spare);
-- int (*readChunkFromNAND) (struct yaffs_DeviceStruct * dev,
-- int chunkInNAND, __u8 * data,
-- yaffs_Spare * spare);
-- int (*eraseBlockInNAND) (struct yaffs_DeviceStruct * dev,
-- int blockInNAND);
-- int (*initialiseNAND) (struct yaffs_DeviceStruct * dev);
-+ int (*writeChunkToNAND) (struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND, const __u8 *data,
-+ const yaffs_Spare *spare);
-+ int (*readChunkFromNAND) (struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND, __u8 *data,
-+ yaffs_Spare *spare);
-+ int (*eraseBlockInNAND) (struct yaffs_DeviceStruct *dev,
-+ int blockInNAND);
-+ int (*initialiseNAND) (struct yaffs_DeviceStruct *dev);
-+ int (*deinitialiseNAND) (struct yaffs_DeviceStruct *dev);
-
- #ifdef CONFIG_YAFFS_YAFFS2
-- int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct * dev,
-- int chunkInNAND, const __u8 * data,
-- const yaffs_ExtendedTags * tags);
-- int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct * dev,
-- int chunkInNAND, __u8 * data,
-- yaffs_ExtendedTags * tags);
-- int (*markNANDBlockBad) (struct yaffs_DeviceStruct * dev, int blockNo);
-- int (*queryNANDBlock) (struct yaffs_DeviceStruct * dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber);
-+ int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND, const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
-+ int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct *dev,
-+ int chunkInNAND, __u8 *data,
-+ yaffs_ExtendedTags *tags);
-+ int (*markNANDBlockBad) (struct yaffs_DeviceStruct *dev, int blockNo);
-+ int (*queryNANDBlock) (struct yaffs_DeviceStruct *dev, int blockNo,
-+ yaffs_BlockState *state, __u32 *sequenceNumber);
- #endif
-
- int isYaffs2;
-@@ -595,10 +598,12 @@ struct yaffs_DeviceStruct {
- void (*removeObjectCallback)(struct yaffs_ObjectStruct *obj);
-
- /* Callback to mark the superblock dirsty */
-- void (*markSuperBlockDirty)(void * superblock);
-+ void (*markSuperBlockDirty)(void *superblock);
-
- int wideTnodesDisabled; /* Set to disable wide tnodes */
-
-+ YCHAR *pathDividers; /* String of legal path dividers */
-+
-
- /* End of stuff that must be set before initialisation. */
-
-@@ -615,16 +620,14 @@ struct yaffs_DeviceStruct {
- __u32 tnodeWidth;
- __u32 tnodeMask;
-
-- /* Stuff to support various file offses to chunk/offset translations */
-- /* "Crumbs" for nDataBytesPerChunk not being a power of 2 */
-- __u32 crumbMask;
-- __u32 crumbShift;
-- __u32 crumbsPerChunk;
--
-- /* Straight shifting for nDataBytesPerChunk being a power of 2 */
-- __u32 chunkShift;
-- __u32 chunkMask;
--
-+ /* Stuff for figuring out file offset to chunk conversions */
-+ __u32 chunkShift; /* Shift value */
-+ __u32 chunkDiv; /* Divisor after shifting: 1 for power-of-2 sizes */
-+ __u32 chunkMask; /* Mask to use for power-of-2 case */
-+
-+ /* Stuff to handle inband tags */
-+ int inbandTags;
-+ __u32 totalBytesPerChunk;
-
- #ifdef __KERNEL__
-
-@@ -633,7 +636,7 @@ struct yaffs_DeviceStruct {
- __u8 *spareBuffer; /* For mtdif2 use. Don't know the size of the buffer
- * at compile time so we have to allocate it.
- */
-- void (*putSuperFunc) (struct super_block * sb);
-+ void (*putSuperFunc) (struct super_block *sb);
- #endif
-
- int isMounted;
-@@ -663,6 +666,8 @@ struct yaffs_DeviceStruct {
- __u32 checkpointSum;
- __u32 checkpointXor;
-
-+ int nCheckpointBlocksRequired; /* Number of blocks needed to store current checkpoint set */
-+
- /* Block Info */
- yaffs_BlockInfo *blockInfo;
- __u8 *chunkBits; /* bitmap of chunks in use */
-@@ -684,11 +689,15 @@ struct yaffs_DeviceStruct {
- yaffs_TnodeList *allocatedTnodeList;
-
- int isDoingGC;
-+ int gcBlock;
-+ int gcChunk;
-
- int nObjectsCreated;
- yaffs_Object *freeObjects;
- int nFreeObjects;
-
-+ int nHardLinks;
-+
- yaffs_ObjectList *allocatedObjectList;
-
- yaffs_ObjectBucket objectBucket[YAFFS_NOBJECT_BUCKETS];
-@@ -745,8 +754,10 @@ struct yaffs_DeviceStruct {
- int nBackgroundDeletions; /* Count of background deletions. */
-
-
-+ /* Temporary buffer management */
- yaffs_TempBuffer tempBuffer[YAFFS_N_TEMP_BUFFERS];
- int maxTemp;
-+ int tempInUse;
- int unmanagedTempAllocations;
- int unmanagedTempDeallocations;
-
-@@ -758,9 +769,9 @@ struct yaffs_DeviceStruct {
-
- typedef struct yaffs_DeviceStruct yaffs_Device;
-
--/* The static layout of bllock usage etc is stored in the super block header */
-+/* The static layout of block usage etc is stored in the super block header */
- typedef struct {
-- int StructType;
-+ int StructType;
- int version;
- int checkpointStartBlock;
- int checkpointEndBlock;
-@@ -773,7 +784,7 @@ typedef struct {
- * must be preserved over unmount/mount cycles.
- */
- typedef struct {
-- int structType;
-+ int structType;
- int nErasedBlocks;
- int allocationBlock; /* Current block being allocated off */
- __u32 allocationPage;
-@@ -791,57 +802,45 @@ typedef struct {
-
-
- typedef struct {
-- int structType;
-- __u32 magic;
-- __u32 version;
-- __u32 head;
-+ int structType;
-+ __u32 magic;
-+ __u32 version;
-+ __u32 head;
- } yaffs_CheckpointValidity;
-
--/* Function to manipulate block info */
--static Y_INLINE yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blk)
--{
-- if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) {
-- T(YAFFS_TRACE_ERROR,
-- (TSTR
-- ("**>> yaffs: getBlockInfo block %d is not valid" TENDSTR),
-- blk));
-- YBUG();
-- }
-- return &dev->blockInfo[blk - dev->internalStartBlock];
--}
-
- /*----------------------- YAFFS Functions -----------------------*/
-
--int yaffs_GutsInitialise(yaffs_Device * dev);
--void yaffs_Deinitialise(yaffs_Device * dev);
-+int yaffs_GutsInitialise(yaffs_Device *dev);
-+void yaffs_Deinitialise(yaffs_Device *dev);
-
--int yaffs_GetNumberOfFreeChunks(yaffs_Device * dev);
-+int yaffs_GetNumberOfFreeChunks(yaffs_Device *dev);
-
--int yaffs_RenameObject(yaffs_Object * oldDir, const YCHAR * oldName,
-- yaffs_Object * newDir, const YCHAR * newName);
-+int yaffs_RenameObject(yaffs_Object *oldDir, const YCHAR *oldName,
-+ yaffs_Object *newDir, const YCHAR *newName);
-
--int yaffs_Unlink(yaffs_Object * dir, const YCHAR * name);
--int yaffs_DeleteFile(yaffs_Object * obj);
-+int yaffs_Unlink(yaffs_Object *dir, const YCHAR *name);
-+int yaffs_DeleteObject(yaffs_Object *obj);
-
--int yaffs_GetObjectName(yaffs_Object * obj, YCHAR * name, int buffSize);
--int yaffs_GetObjectFileLength(yaffs_Object * obj);
--int yaffs_GetObjectInode(yaffs_Object * obj);
--unsigned yaffs_GetObjectType(yaffs_Object * obj);
--int yaffs_GetObjectLinkCount(yaffs_Object * obj);
-+int yaffs_GetObjectName(yaffs_Object *obj, YCHAR *name, int buffSize);
-+int yaffs_GetObjectFileLength(yaffs_Object *obj);
-+int yaffs_GetObjectInode(yaffs_Object *obj);
-+unsigned yaffs_GetObjectType(yaffs_Object *obj);
-+int yaffs_GetObjectLinkCount(yaffs_Object *obj);
-
--int yaffs_SetAttributes(yaffs_Object * obj, struct iattr *attr);
--int yaffs_GetAttributes(yaffs_Object * obj, struct iattr *attr);
-+int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr);
-+int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr);
-
- /* File operations */
--int yaffs_ReadDataFromFile(yaffs_Object * obj, __u8 * buffer, loff_t offset,
-- int nBytes);
--int yaffs_WriteDataToFile(yaffs_Object * obj, const __u8 * buffer, loff_t offset,
-- int nBytes, int writeThrough);
--int yaffs_ResizeFile(yaffs_Object * obj, loff_t newSize);
--
--yaffs_Object *yaffs_MknodFile(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid);
--int yaffs_FlushFile(yaffs_Object * obj, int updateTime);
-+int yaffs_ReadDataFromFile(yaffs_Object *obj, __u8 *buffer, loff_t offset,
-+ int nBytes);
-+int yaffs_WriteDataToFile(yaffs_Object *obj, const __u8 *buffer, loff_t offset,
-+ int nBytes, int writeThrough);
-+int yaffs_ResizeFile(yaffs_Object *obj, loff_t newSize);
-+
-+yaffs_Object *yaffs_MknodFile(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid);
-+int yaffs_FlushFile(yaffs_Object *obj, int updateTime);
-
- /* Flushing and checkpointing */
- void yaffs_FlushEntireDeviceCache(yaffs_Device *dev);
-@@ -850,33 +849,33 @@ int yaffs_CheckpointSave(yaffs_Device *d
- int yaffs_CheckpointRestore(yaffs_Device *dev);
-
- /* Directory operations */
--yaffs_Object *yaffs_MknodDirectory(yaffs_Object * parent, const YCHAR * name,
-- __u32 mode, __u32 uid, __u32 gid);
--yaffs_Object *yaffs_FindObjectByName(yaffs_Object * theDir, const YCHAR * name);
--int yaffs_ApplyToDirectoryChildren(yaffs_Object * theDir,
-+yaffs_Object *yaffs_MknodDirectory(yaffs_Object *parent, const YCHAR *name,
-+ __u32 mode, __u32 uid, __u32 gid);
-+yaffs_Object *yaffs_FindObjectByName(yaffs_Object *theDir, const YCHAR *name);
-+int yaffs_ApplyToDirectoryChildren(yaffs_Object *theDir,
- int (*fn) (yaffs_Object *));
-
--yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device * dev, __u32 number);
-+yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev, __u32 number);
-
- /* Link operations */
--yaffs_Object *yaffs_Link(yaffs_Object * parent, const YCHAR * name,
-- yaffs_Object * equivalentObject);
-+yaffs_Object *yaffs_Link(yaffs_Object *parent, const YCHAR *name,
-+ yaffs_Object *equivalentObject);
-
--yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object * obj);
-+yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj);
-
- /* Symlink operations */
--yaffs_Object *yaffs_MknodSymLink(yaffs_Object * parent, const YCHAR * name,
-+yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent, const YCHAR *name,
- __u32 mode, __u32 uid, __u32 gid,
-- const YCHAR * alias);
--YCHAR *yaffs_GetSymlinkAlias(yaffs_Object * obj);
-+ const YCHAR *alias);
-+YCHAR *yaffs_GetSymlinkAlias(yaffs_Object *obj);
-
- /* Special inodes (fifos, sockets and devices) */
--yaffs_Object *yaffs_MknodSpecial(yaffs_Object * parent, const YCHAR * name,
-+yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent, const YCHAR *name,
- __u32 mode, __u32 uid, __u32 gid, __u32 rdev);
-
- /* Special directories */
--yaffs_Object *yaffs_Root(yaffs_Device * dev);
--yaffs_Object *yaffs_LostNFound(yaffs_Device * dev);
-+yaffs_Object *yaffs_Root(yaffs_Device *dev);
-+yaffs_Object *yaffs_LostNFound(yaffs_Device *dev);
-
- #ifdef CONFIG_YAFFS_WINCE
- /* CONFIG_YAFFS_WINCE special stuff */
-@@ -885,18 +884,21 @@ void yfsd_WinFileTimeNow(__u32 target[2]
-
- #ifdef __KERNEL__
-
--void yaffs_HandleDeferedFree(yaffs_Object * obj);
-+void yaffs_HandleDeferedFree(yaffs_Object *obj);
- #endif
-
- /* Debug dump */
--int yaffs_DumpObject(yaffs_Object * obj);
-+int yaffs_DumpObject(yaffs_Object *obj);
-
--void yaffs_GutsTest(yaffs_Device * dev);
-+void yaffs_GutsTest(yaffs_Device *dev);
-
- /* A few useful functions */
--void yaffs_InitialiseTags(yaffs_ExtendedTags * tags);
--void yaffs_DeleteChunk(yaffs_Device * dev, int chunkId, int markNAND, int lyn);
--int yaffs_CheckFF(__u8 * buffer, int nBytes);
-+void yaffs_InitialiseTags(yaffs_ExtendedTags *tags);
-+void yaffs_DeleteChunk(yaffs_Device *dev, int chunkId, int markNAND, int lyn);
-+int yaffs_CheckFF(__u8 *buffer, int nBytes);
- void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi);
-
-+__u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo);
-+void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer, int lineNo);
-+
- #endif
---- a/fs/yaffs2/yaffs_mtdif1.c
-+++ b/fs/yaffs2/yaffs_mtdif1.c
-@@ -26,7 +26,7 @@
- #include "yportenv.h"
- #include "yaffs_guts.h"
- #include "yaffs_packedtags1.h"
--#include "yaffs_tagscompat.h" // for yaffs_CalcTagsECC
-+#include "yaffs_tagscompat.h" /* for yaffs_CalcTagsECC */
-
- #include "linux/kernel.h"
- #include "linux/version.h"
-@@ -34,9 +34,9 @@
- #include "linux/mtd/mtd.h"
-
- /* Don't compile this module if we don't have MTD's mtd_oob_ops interface */
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
-
--const char *yaffs_mtdif1_c_version = "$Id: yaffs_mtdif1.c,v 1.3 2007/05/15 20:16:11 ian Exp $";
-+const char *yaffs_mtdif1_c_version = "$Id: yaffs_mtdif1.c,v 1.10 2009-03-09 07:41:10 charles Exp $";
-
- #ifndef CONFIG_YAFFS_9BYTE_TAGS
- # define YTAG1_SIZE 8
-@@ -89,9 +89,9 @@ static struct nand_ecclayout nand_oob_16
- * Returns YAFFS_OK or YAFFS_FAIL.
- */
- int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device *dev,
-- int chunkInNAND, const __u8 * data, const yaffs_ExtendedTags * etags)
-+ int chunkInNAND, const __u8 *data, const yaffs_ExtendedTags *etags)
- {
-- struct mtd_info * mtd = dev->genericDevice;
-+ struct mtd_info *mtd = dev->genericDevice;
- int chunkBytes = dev->nDataBytesPerChunk;
- loff_t addr = ((loff_t)chunkInNAND) * chunkBytes;
- struct mtd_oob_ops ops;
-@@ -146,7 +146,7 @@ int nandmtd1_WriteChunkWithTagsToNAND(ya
-
- /* Return with empty ExtendedTags but add eccResult.
- */
--static int rettags(yaffs_ExtendedTags * etags, int eccResult, int retval)
-+static int rettags(yaffs_ExtendedTags *etags, int eccResult, int retval)
- {
- if (etags) {
- memset(etags, 0, sizeof(*etags));
-@@ -169,9 +169,9 @@ static int rettags(yaffs_ExtendedTags *
- * Returns YAFFS_OK or YAFFS_FAIL.
- */
- int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device *dev,
-- int chunkInNAND, __u8 * data, yaffs_ExtendedTags * etags)
-+ int chunkInNAND, __u8 *data, yaffs_ExtendedTags *etags)
- {
-- struct mtd_info * mtd = dev->genericDevice;
-+ struct mtd_info *mtd = dev->genericDevice;
- int chunkBytes = dev->nDataBytesPerChunk;
- loff_t addr = ((loff_t)chunkInNAND) * chunkBytes;
- int eccres = YAFFS_ECC_RESULT_NO_ERROR;
-@@ -189,7 +189,7 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y
- ops.datbuf = data;
- ops.oobbuf = (__u8 *)&pt1;
-
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
-+#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 20))
- /* In MTD 2.6.18 to 2.6.19 nand_base.c:nand_do_read_oob() has a bug;
- * help it out with ops.len = ops.ooblen when ops.datbuf == NULL.
- */
-@@ -284,11 +284,11 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y
- */
- int nandmtd1_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo)
- {
-- struct mtd_info * mtd = dev->genericDevice;
-+ struct mtd_info *mtd = dev->genericDevice;
- int blocksize = dev->nChunksPerBlock * dev->nDataBytesPerChunk;
- int retval;
-
-- yaffs_trace(YAFFS_TRACE_BAD_BLOCKS, "marking block %d bad", blockNo);
-+ yaffs_trace(YAFFS_TRACE_BAD_BLOCKS, "marking block %d bad\n", blockNo);
-
- retval = mtd->block_markbad(mtd, (loff_t)blocksize * blockNo);
- return (retval) ? YAFFS_FAIL : YAFFS_OK;
-@@ -298,7 +298,7 @@ int nandmtd1_MarkNANDBlockBad(struct yaf
- *
- * Returns YAFFS_OK or YAFFS_FAIL.
- */
--static int nandmtd1_TestPrerequists(struct mtd_info * mtd)
-+static int nandmtd1_TestPrerequists(struct mtd_info *mtd)
- {
- /* 2.6.18 has mtd->ecclayout->oobavail */
- /* 2.6.21 has mtd->ecclayout->oobavail and mtd->oobavail */
-@@ -323,10 +323,11 @@ static int nandmtd1_TestPrerequists(stru
- * Always returns YAFFS_OK.
- */
- int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * pState, int *pSequenceNumber)
-+ yaffs_BlockState *pState, __u32 *pSequenceNumber)
- {
-- struct mtd_info * mtd = dev->genericDevice;
-+ struct mtd_info *mtd = dev->genericDevice;
- int chunkNo = blockNo * dev->nChunksPerBlock;
-+ loff_t addr = (loff_t)chunkNo * dev->nDataBytesPerChunk;
- yaffs_ExtendedTags etags;
- int state = YAFFS_BLOCK_STATE_DEAD;
- int seqnum = 0;
-@@ -335,21 +336,22 @@ int nandmtd1_QueryNANDBlock(struct yaffs
- /* We don't yet have a good place to test for MTD config prerequists.
- * Do it here as we are called during the initial scan.
- */
-- if (nandmtd1_TestPrerequists(mtd) != YAFFS_OK) {
-+ if (nandmtd1_TestPrerequists(mtd) != YAFFS_OK)
- return YAFFS_FAIL;
-- }
-
- retval = nandmtd1_ReadChunkWithTagsFromNAND(dev, chunkNo, NULL, &etags);
-+ etags.blockBad = (mtd->block_isbad)(mtd, addr);
- if (etags.blockBad) {
- yaffs_trace(YAFFS_TRACE_BAD_BLOCKS,
-- "block %d is marked bad", blockNo);
-+ "block %d is marked bad\n", blockNo);
- state = YAFFS_BLOCK_STATE_DEAD;
-- }
-- else if (etags.chunkUsed) {
-+ } else if (etags.eccResult != YAFFS_ECC_RESULT_NO_ERROR) {
-+ /* bad tags, need to look more closely */
-+ state = YAFFS_BLOCK_STATE_NEEDS_SCANNING;
-+ } else if (etags.chunkUsed) {
- state = YAFFS_BLOCK_STATE_NEEDS_SCANNING;
- seqnum = etags.sequenceNumber;
-- }
-- else {
-+ } else {
- state = YAFFS_BLOCK_STATE_EMPTY;
- }
-
-@@ -360,4 +362,4 @@ int nandmtd1_QueryNANDBlock(struct yaffs
- return YAFFS_OK;
- }
-
--#endif /*KERNEL_VERSION*/
-+#endif /*MTD_VERSION*/
---- a/fs/yaffs2/yaffs_mtdif1.h
-+++ b/fs/yaffs2/yaffs_mtdif1.h
-@@ -14,15 +14,15 @@
- #ifndef __YAFFS_MTDIF1_H__
- #define __YAFFS_MTDIF1_H__
-
--int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data, const yaffs_ExtendedTags * tags);
-+int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data, const yaffs_ExtendedTags *tags);
-
--int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * data, yaffs_ExtendedTags * tags);
-+int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *data, yaffs_ExtendedTags *tags);
-
- int nandmtd1_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo);
-
- int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber);
-+ yaffs_BlockState *state, __u32 *sequenceNumber);
-
- #endif
---- a/fs/yaffs2/yaffs_mtdif2.c
-+++ b/fs/yaffs2/yaffs_mtdif2.c
-@@ -14,7 +14,7 @@
- /* mtd interface for YAFFS2 */
-
- const char *yaffs_mtdif2_c_version =
-- "$Id: yaffs_mtdif2.c,v 1.17 2007-02-14 01:09:06 wookey Exp $";
-+ "$Id: yaffs_mtdif2.c,v 1.23 2009-03-06 17:20:53 wookey Exp $";
-
- #include "yportenv.h"
-
-@@ -27,19 +27,23 @@ const char *yaffs_mtdif2_c_version =
-
- #include "yaffs_packedtags2.h"
-
--int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags * tags)
-+/* NB For use with inband tags....
-+ * We assume that the data buffer is of size totalBytersPerChunk so that we can also
-+ * use it to load the tags.
-+ */
-+int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- struct mtd_oob_ops ops;
- #else
- size_t dummy;
- #endif
- int retval = 0;
-
-- loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk;
-+ loff_t addr;
-
- yaffs_PackedTags2 pt;
-
-@@ -48,46 +52,40 @@ int nandmtd2_WriteChunkWithTagsToNAND(ya
- ("nandmtd2_WriteChunkWithTagsToNAND chunk %d data %p tags %p"
- TENDSTR), chunkInNAND, data, tags));
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- if (tags)
-- yaffs_PackTags2(&pt, tags);
-- else
-- BUG(); /* both tags and data should always be present */
-
-- if (data) {
-- ops.mode = MTD_OOB_AUTO;
-- ops.ooblen = sizeof(pt);
-- ops.len = dev->nDataBytesPerChunk;
-- ops.ooboffs = 0;
-- ops.datbuf = (__u8 *)data;
-- ops.oobbuf = (void *)&pt;
-- retval = mtd->write_oob(mtd, addr, &ops);
-+ addr = ((loff_t) chunkInNAND) * dev->totalBytesPerChunk;
-+
-+ /* For yaffs2 writing there must be both data and tags.
-+ * If we're using inband tags, then the tags are stuffed into
-+ * the end of the data buffer.
-+ */
-+ if (!data || !tags)
-+ BUG();
-+ else if (dev->inbandTags) {
-+ yaffs_PackedTags2TagsPart *pt2tp;
-+ pt2tp = (yaffs_PackedTags2TagsPart *)(data + dev->nDataBytesPerChunk);
-+ yaffs_PackTags2TagsPart(pt2tp, tags);
- } else
-- BUG(); /* both tags and data should always be present */
--#else
-- if (tags) {
- yaffs_PackTags2(&pt, tags);
-- }
-
-- if (data && tags) {
-- if (dev->useNANDECC)
-- retval =
-- mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk,
-- &dummy, data, (__u8 *) & pt, NULL);
-- else
-- retval =
-- mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk,
-- &dummy, data, (__u8 *) & pt, NULL);
-- } else {
-- if (data)
-- retval =
-- mtd->write(mtd, addr, dev->nDataBytesPerChunk, &dummy,
-- data);
-- if (tags)
-- retval =
-- mtd->write_oob(mtd, addr, mtd->oobsize, &dummy,
-- (__u8 *) & pt);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
-+ ops.mode = MTD_OOB_AUTO;
-+ ops.ooblen = (dev->inbandTags) ? 0 : sizeof(pt);
-+ ops.len = dev->totalBytesPerChunk;
-+ ops.ooboffs = 0;
-+ ops.datbuf = (__u8 *)data;
-+ ops.oobbuf = (dev->inbandTags) ? NULL : (void *)&pt;
-+ retval = mtd->write_oob(mtd, addr, &ops);
-
-+#else
-+ if (!dev->inbandTags) {
-+ retval =
-+ mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk,
-+ &dummy, data, (__u8 *) &pt, NULL);
-+ } else {
-+ retval =
-+ mtd->write(mtd, addr, dev->totalBytesPerChunk, &dummy,
-+ data);
- }
- #endif
-
-@@ -97,17 +95,18 @@ int nandmtd2_WriteChunkWithTagsToNAND(ya
- return YAFFS_FAIL;
- }
-
--int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * data, yaffs_ExtendedTags * tags)
-+int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *data, yaffs_ExtendedTags *tags)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- struct mtd_oob_ops ops;
- #endif
- size_t dummy;
- int retval = 0;
-+ int localData = 0;
-
-- loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk;
-+ loff_t addr = ((loff_t) chunkInNAND) * dev->totalBytesPerChunk;
-
- yaffs_PackedTags2 pt;
-
-@@ -116,9 +115,20 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y
- ("nandmtd2_ReadChunkWithTagsFromNAND chunk %d data %p tags %p"
- TENDSTR), chunkInNAND, data, tags));
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-- if (data && !tags)
-- retval = mtd->read(mtd, addr, dev->nDataBytesPerChunk,
-+ if (dev->inbandTags) {
-+
-+ if (!data) {
-+ localData = 1;
-+ data = yaffs_GetTempBuffer(dev, __LINE__);
-+ }
-+
-+
-+ }
-+
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
-+ if (dev->inbandTags || (data && !tags))
-+ retval = mtd->read(mtd, addr, dev->totalBytesPerChunk,
- &dummy, data);
- else if (tags) {
- ops.mode = MTD_OOB_AUTO;
-@@ -130,38 +140,42 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y
- retval = mtd->read_oob(mtd, addr, &ops);
- }
- #else
-- if (data && tags) {
-- if (dev->useNANDECC) {
-- retval =
-- mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk,
-- &dummy, data, dev->spareBuffer,
-- NULL);
-- } else {
-- retval =
-- mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk,
-+ if (!dev->inbandTags && data && tags) {
-+
-+ retval = mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk,
- &dummy, data, dev->spareBuffer,
- NULL);
-- }
- } else {
- if (data)
- retval =
- mtd->read(mtd, addr, dev->nDataBytesPerChunk, &dummy,
- data);
-- if (tags)
-+ if (!dev->inbandTags && tags)
- retval =
- mtd->read_oob(mtd, addr, mtd->oobsize, &dummy,
- dev->spareBuffer);
- }
- #endif
-
-- memcpy(&pt, dev->spareBuffer, sizeof(pt));
-
-- if (tags)
-- yaffs_UnpackTags2(tags, &pt);
-+ if (dev->inbandTags) {
-+ if (tags) {
-+ yaffs_PackedTags2TagsPart *pt2tp;
-+ pt2tp = (yaffs_PackedTags2TagsPart *)&data[dev->nDataBytesPerChunk];
-+ yaffs_UnpackTags2TagsPart(tags, pt2tp);
-+ }
-+ } else {
-+ if (tags) {
-+ memcpy(&pt, dev->spareBuffer, sizeof(pt));
-+ yaffs_UnpackTags2(tags, &pt);
-+ }
-+ }
-
-- if(tags && retval == -EBADMSG && tags->eccResult == YAFFS_ECC_RESULT_NO_ERROR)
-- tags->eccResult = YAFFS_ECC_RESULT_UNFIXED;
-+ if (localData)
-+ yaffs_ReleaseTempBuffer(dev, data, __LINE__);
-
-+ if (tags && retval == -EBADMSG && tags->eccResult == YAFFS_ECC_RESULT_NO_ERROR)
-+ tags->eccResult = YAFFS_ECC_RESULT_UNFIXED;
- if (retval == 0)
- return YAFFS_OK;
- else
-@@ -178,7 +192,7 @@ int nandmtd2_MarkNANDBlockBad(struct yaf
- retval =
- mtd->block_markbad(mtd,
- blockNo * dev->nChunksPerBlock *
-- dev->nDataBytesPerChunk);
-+ dev->totalBytesPerChunk);
-
- if (retval == 0)
- return YAFFS_OK;
-@@ -188,7 +202,7 @@ int nandmtd2_MarkNANDBlockBad(struct yaf
- }
-
- int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber)
-+ yaffs_BlockState *state, __u32 *sequenceNumber)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
- int retval;
-@@ -198,7 +212,7 @@ int nandmtd2_QueryNANDBlock(struct yaffs
- retval =
- mtd->block_isbad(mtd,
- blockNo * dev->nChunksPerBlock *
-- dev->nDataBytesPerChunk);
-+ dev->totalBytesPerChunk);
-
- if (retval) {
- T(YAFFS_TRACE_MTD, (TSTR("block is bad" TENDSTR)));
---- a/fs/yaffs2/yaffs_mtdif2.h
-+++ b/fs/yaffs2/yaffs_mtdif2.h
-@@ -17,13 +17,13 @@
- #define __YAFFS_MTDIF2_H__
-
- #include "yaffs_guts.h"
--int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags * tags);
--int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * data, yaffs_ExtendedTags * tags);
-+int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
-+int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *data, yaffs_ExtendedTags *tags);
- int nandmtd2_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo);
- int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber);
-+ yaffs_BlockState *state, __u32 *sequenceNumber);
-
- #endif
---- a/fs/yaffs2/yaffs_mtdif.c
-+++ b/fs/yaffs2/yaffs_mtdif.c
-@@ -12,7 +12,7 @@
- */
-
- const char *yaffs_mtdif_c_version =
-- "$Id: yaffs_mtdif.c,v 1.19 2007-02-14 01:09:06 wookey Exp $";
-+ "$Id: yaffs_mtdif.c,v 1.22 2009-03-06 17:20:51 wookey Exp $";
-
- #include "yportenv.h"
-
-@@ -24,7 +24,7 @@ const char *yaffs_mtdif_c_version =
- #include "linux/time.h"
- #include "linux/mtd/nand.h"
-
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18))
-+#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 18))
- static struct nand_oobinfo yaffs_oobinfo = {
- .useecc = 1,
- .eccbytes = 6,
-@@ -36,7 +36,7 @@ static struct nand_oobinfo yaffs_noeccin
- };
- #endif
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- static inline void translate_spare2oob(const yaffs_Spare *spare, __u8 *oob)
- {
- oob[0] = spare->tagByte0;
-@@ -45,8 +45,8 @@ static inline void translate_spare2oob(c
- oob[3] = spare->tagByte3;
- oob[4] = spare->tagByte4;
- oob[5] = spare->tagByte5 & 0x3f;
-- oob[5] |= spare->blockStatus == 'Y' ? 0: 0x80;
-- oob[5] |= spare->pageStatus == 0 ? 0: 0x40;
-+ oob[5] |= spare->blockStatus == 'Y' ? 0 : 0x80;
-+ oob[5] |= spare->pageStatus == 0 ? 0 : 0x40;
- oob[6] = spare->tagByte6;
- oob[7] = spare->tagByte7;
- }
-@@ -71,18 +71,18 @@ static inline void translate_oob2spare(y
- }
- #endif
-
--int nandmtd_WriteChunkToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data, const yaffs_Spare * spare)
-+int nandmtd_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data, const yaffs_Spare *spare)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- struct mtd_oob_ops ops;
- #endif
- size_t dummy;
- int retval = 0;
-
- loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk;
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- __u8 spareAsBytes[8]; /* OOB */
-
- if (data && !spare)
-@@ -135,18 +135,18 @@ int nandmtd_WriteChunkToNAND(yaffs_Devic
- return YAFFS_FAIL;
- }
-
--int nandmtd_ReadChunkFromNAND(yaffs_Device * dev, int chunkInNAND, __u8 * data,
-- yaffs_Spare * spare)
-+int nandmtd_ReadChunkFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data,
-+ yaffs_Spare *spare)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- struct mtd_oob_ops ops;
- #endif
- size_t dummy;
- int retval = 0;
-
- loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk;
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
-+#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
- __u8 spareAsBytes[8]; /* OOB */
-
- if (data && !spare)
-@@ -205,7 +205,7 @@ int nandmtd_ReadChunkFromNAND(yaffs_Devi
- return YAFFS_FAIL;
- }
-
--int nandmtd_EraseBlockInNAND(yaffs_Device * dev, int blockNumber)
-+int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber)
- {
- struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
- __u32 addr =
-@@ -234,7 +234,7 @@ int nandmtd_EraseBlockInNAND(yaffs_Devic
- return YAFFS_FAIL;
- }
-
--int nandmtd_InitialiseNAND(yaffs_Device * dev)
-+int nandmtd_InitialiseNAND(yaffs_Device *dev)
- {
- return YAFFS_OK;
- }
---- a/fs/yaffs2/yaffs_mtdif.h
-+++ b/fs/yaffs2/yaffs_mtdif.h
-@@ -18,10 +18,15 @@
-
- #include "yaffs_guts.h"
-
--int nandmtd_WriteChunkToNAND(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data, const yaffs_Spare * spare);
--int nandmtd_ReadChunkFromNAND(yaffs_Device * dev, int chunkInNAND, __u8 * data,
-- yaffs_Spare * spare);
--int nandmtd_EraseBlockInNAND(yaffs_Device * dev, int blockNumber);
--int nandmtd_InitialiseNAND(yaffs_Device * dev);
-+#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 18))
-+extern struct nand_oobinfo yaffs_oobinfo;
-+extern struct nand_oobinfo yaffs_noeccinfo;
-+#endif
-+
-+int nandmtd_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data, const yaffs_Spare *spare);
-+int nandmtd_ReadChunkFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data,
-+ yaffs_Spare *spare);
-+int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber);
-+int nandmtd_InitialiseNAND(yaffs_Device *dev);
- #endif
---- a/fs/yaffs2/yaffs_nand.c
-+++ b/fs/yaffs2/yaffs_nand.c
-@@ -12,16 +12,17 @@
- */
-
- const char *yaffs_nand_c_version =
-- "$Id: yaffs_nand.c,v 1.7 2007-02-14 01:09:06 wookey Exp $";
-+ "$Id: yaffs_nand.c,v 1.10 2009-03-06 17:20:54 wookey Exp $";
-
- #include "yaffs_nand.h"
- #include "yaffs_tagscompat.h"
- #include "yaffs_tagsvalidity.h"
-
-+#include "yaffs_getblockinfo.h"
-
--int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * buffer,
-- yaffs_ExtendedTags * tags)
-+int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *buffer,
-+ yaffs_ExtendedTags *tags)
- {
- int result;
- yaffs_ExtendedTags localTags;
-@@ -29,7 +30,7 @@ int yaffs_ReadChunkWithTagsFromNAND(yaff
- int realignedChunkInNAND = chunkInNAND - dev->chunkOffset;
-
- /* If there are no tags provided, use local tags to get prioritised gc working */
-- if(!tags)
-+ if (!tags)
- tags = &localTags;
-
- if (dev->readChunkWithTagsFromNAND)
-@@ -40,20 +41,20 @@ int yaffs_ReadChunkWithTagsFromNAND(yaff
- realignedChunkInNAND,
- buffer,
- tags);
-- if(tags &&
-- tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR){
-+ if (tags &&
-+ tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR) {
-
- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, chunkInNAND/dev->nChunksPerBlock);
-- yaffs_HandleChunkError(dev,bi);
-+ yaffs_HandleChunkError(dev, bi);
- }
-
- return result;
- }
-
--int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev,
-+int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev,
- int chunkInNAND,
-- const __u8 * buffer,
-- yaffs_ExtendedTags * tags)
-+ const __u8 *buffer,
-+ yaffs_ExtendedTags *tags)
- {
- chunkInNAND -= dev->chunkOffset;
-
-@@ -84,7 +85,7 @@ int yaffs_WriteChunkWithTagsToNAND(yaffs
- tags);
- }
-
--int yaffs_MarkBlockBad(yaffs_Device * dev, int blockNo)
-+int yaffs_MarkBlockBad(yaffs_Device *dev, int blockNo)
- {
- blockNo -= dev->blockOffset;
-
-@@ -95,10 +96,10 @@ int yaffs_MarkBlockBad(yaffs_Device * de
- return yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo);
- }
-
--int yaffs_QueryInitialBlockState(yaffs_Device * dev,
-+int yaffs_QueryInitialBlockState(yaffs_Device *dev,
- int blockNo,
-- yaffs_BlockState * state,
-- unsigned *sequenceNumber)
-+ yaffs_BlockState *state,
-+ __u32 *sequenceNumber)
- {
- blockNo -= dev->blockOffset;
-
---- a/fs/yaffs2/yaffs_nandemul2k.h
-+++ b/fs/yaffs2/yaffs_nandemul2k.h
-@@ -21,14 +21,14 @@
- #include "yaffs_guts.h"
-
- int nandemul2k_WriteChunkWithTagsToNAND(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND, const __u8 * data,
-- yaffs_ExtendedTags * tags);
-+ int chunkInNAND, const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
- int nandemul2k_ReadChunkWithTagsFromNAND(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND, __u8 * data,
-- yaffs_ExtendedTags * tags);
-+ int chunkInNAND, __u8 *data,
-+ yaffs_ExtendedTags *tags);
- int nandemul2k_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo);
- int nandemul2k_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
-- yaffs_BlockState * state, int *sequenceNumber);
-+ yaffs_BlockState *state, __u32 *sequenceNumber);
- int nandemul2k_EraseBlockInNAND(struct yaffs_DeviceStruct *dev,
- int blockInNAND);
- int nandemul2k_InitialiseNAND(struct yaffs_DeviceStruct *dev);
---- a/fs/yaffs2/yaffs_nand.h
-+++ b/fs/yaffs2/yaffs_nand.h
-@@ -19,21 +19,21 @@
-
-
-
--int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
-- __u8 * buffer,
-- yaffs_ExtendedTags * tags);
--
--int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev,
-- int chunkInNAND,
-- const __u8 * buffer,
-- yaffs_ExtendedTags * tags);
--
--int yaffs_MarkBlockBad(yaffs_Device * dev, int blockNo);
--
--int yaffs_QueryInitialBlockState(yaffs_Device * dev,
-- int blockNo,
-- yaffs_BlockState * state,
-- unsigned *sequenceNumber);
-+int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
-+ __u8 *buffer,
-+ yaffs_ExtendedTags *tags);
-+
-+int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev,
-+ int chunkInNAND,
-+ const __u8 *buffer,
-+ yaffs_ExtendedTags *tags);
-+
-+int yaffs_MarkBlockBad(yaffs_Device *dev, int blockNo);
-+
-+int yaffs_QueryInitialBlockState(yaffs_Device *dev,
-+ int blockNo,
-+ yaffs_BlockState *state,
-+ unsigned *sequenceNumber);
-
- int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev,
- int blockInNAND);
---- a/fs/yaffs2/yaffs_packedtags1.c
-+++ b/fs/yaffs2/yaffs_packedtags1.c
-@@ -14,7 +14,7 @@
- #include "yaffs_packedtags1.h"
- #include "yportenv.h"
-
--void yaffs_PackTags1(yaffs_PackedTags1 * pt, const yaffs_ExtendedTags * t)
-+void yaffs_PackTags1(yaffs_PackedTags1 *pt, const yaffs_ExtendedTags *t)
- {
- pt->chunkId = t->chunkId;
- pt->serialNumber = t->serialNumber;
-@@ -27,7 +27,7 @@ void yaffs_PackTags1(yaffs_PackedTags1 *
-
- }
-
--void yaffs_UnpackTags1(yaffs_ExtendedTags * t, const yaffs_PackedTags1 * pt)
-+void yaffs_UnpackTags1(yaffs_ExtendedTags *t, const yaffs_PackedTags1 *pt)
- {
- static const __u8 allFF[] =
- { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-@@ -35,9 +35,8 @@ void yaffs_UnpackTags1(yaffs_ExtendedTag
-
- if (memcmp(allFF, pt, sizeof(yaffs_PackedTags1))) {
- t->blockBad = 0;
-- if (pt->shouldBeFF != 0xFFFFFFFF) {
-+ if (pt->shouldBeFF != 0xFFFFFFFF)
- t->blockBad = 1;
-- }
- t->chunkUsed = 1;
- t->objectId = pt->objectId;
- t->chunkId = pt->chunkId;
-@@ -47,6 +46,5 @@ void yaffs_UnpackTags1(yaffs_ExtendedTag
- t->serialNumber = pt->serialNumber;
- } else {
- memset(t, 0, sizeof(yaffs_ExtendedTags));
--
- }
- }
---- a/fs/yaffs2/yaffs_packedtags1.h
-+++ b/fs/yaffs2/yaffs_packedtags1.h
-@@ -32,6 +32,6 @@ typedef struct {
-
- } yaffs_PackedTags1;
-
--void yaffs_PackTags1(yaffs_PackedTags1 * pt, const yaffs_ExtendedTags * t);
--void yaffs_UnpackTags1(yaffs_ExtendedTags * t, const yaffs_PackedTags1 * pt);
-+void yaffs_PackTags1(yaffs_PackedTags1 *pt, const yaffs_ExtendedTags *t);
-+void yaffs_UnpackTags1(yaffs_ExtendedTags *t, const yaffs_PackedTags1 *pt);
- #endif
---- a/fs/yaffs2/yaffs_packedtags2.c
-+++ b/fs/yaffs2/yaffs_packedtags2.c
-@@ -37,60 +37,68 @@
- #define EXTRA_OBJECT_TYPE_SHIFT (28)
- #define EXTRA_OBJECT_TYPE_MASK ((0x0F) << EXTRA_OBJECT_TYPE_SHIFT)
-
--static void yaffs_DumpPackedTags2(const yaffs_PackedTags2 * pt)
-+
-+static void yaffs_DumpPackedTags2TagsPart(const yaffs_PackedTags2TagsPart *ptt)
- {
- T(YAFFS_TRACE_MTD,
- (TSTR("packed tags obj %d chunk %d byte %d seq %d" TENDSTR),
-- pt->t.objectId, pt->t.chunkId, pt->t.byteCount,
-- pt->t.sequenceNumber));
-+ ptt->objectId, ptt->chunkId, ptt->byteCount,
-+ ptt->sequenceNumber));
-+}
-+static void yaffs_DumpPackedTags2(const yaffs_PackedTags2 *pt)
-+{
-+ yaffs_DumpPackedTags2TagsPart(&pt->t);
- }
-
--static void yaffs_DumpTags2(const yaffs_ExtendedTags * t)
-+static void yaffs_DumpTags2(const yaffs_ExtendedTags *t)
- {
- T(YAFFS_TRACE_MTD,
- (TSTR
-- ("ext.tags eccres %d blkbad %d chused %d obj %d chunk%d byte "
-- "%d del %d ser %d seq %d"
-+ ("ext.tags eccres %d blkbad %d chused %d obj %d chunk%d byte %d del %d ser %d seq %d"
- TENDSTR), t->eccResult, t->blockBad, t->chunkUsed, t->objectId,
- t->chunkId, t->byteCount, t->chunkDeleted, t->serialNumber,
- t->sequenceNumber));
-
- }
-
--void yaffs_PackTags2(yaffs_PackedTags2 * pt, const yaffs_ExtendedTags * t)
-+void yaffs_PackTags2TagsPart(yaffs_PackedTags2TagsPart *ptt,
-+ const yaffs_ExtendedTags *t)
- {
-- pt->t.chunkId = t->chunkId;
-- pt->t.sequenceNumber = t->sequenceNumber;
-- pt->t.byteCount = t->byteCount;
-- pt->t.objectId = t->objectId;
-+ ptt->chunkId = t->chunkId;
-+ ptt->sequenceNumber = t->sequenceNumber;
-+ ptt->byteCount = t->byteCount;
-+ ptt->objectId = t->objectId;
-
- if (t->chunkId == 0 && t->extraHeaderInfoAvailable) {
- /* Store the extra header info instead */
- /* We save the parent object in the chunkId */
-- pt->t.chunkId = EXTRA_HEADER_INFO_FLAG
-+ ptt->chunkId = EXTRA_HEADER_INFO_FLAG
- | t->extraParentObjectId;
-- if (t->extraIsShrinkHeader) {
-- pt->t.chunkId |= EXTRA_SHRINK_FLAG;
-- }
-- if (t->extraShadows) {
-- pt->t.chunkId |= EXTRA_SHADOWS_FLAG;
-- }
-+ if (t->extraIsShrinkHeader)
-+ ptt->chunkId |= EXTRA_SHRINK_FLAG;
-+ if (t->extraShadows)
-+ ptt->chunkId |= EXTRA_SHADOWS_FLAG;
-
-- pt->t.objectId &= ~EXTRA_OBJECT_TYPE_MASK;
-- pt->t.objectId |=
-+ ptt->objectId &= ~EXTRA_OBJECT_TYPE_MASK;
-+ ptt->objectId |=
- (t->extraObjectType << EXTRA_OBJECT_TYPE_SHIFT);
-
-- if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK) {
-- pt->t.byteCount = t->extraEquivalentObjectId;
-- } else if (t->extraObjectType == YAFFS_OBJECT_TYPE_FILE) {
-- pt->t.byteCount = t->extraFileLength;
-- } else {
-- pt->t.byteCount = 0;
-- }
-+ if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK)
-+ ptt->byteCount = t->extraEquivalentObjectId;
-+ else if (t->extraObjectType == YAFFS_OBJECT_TYPE_FILE)
-+ ptt->byteCount = t->extraFileLength;
-+ else
-+ ptt->byteCount = 0;
- }
-
-- yaffs_DumpPackedTags2(pt);
-+ yaffs_DumpPackedTags2TagsPart(ptt);
- yaffs_DumpTags2(t);
-+}
-+
-+
-+void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ExtendedTags *t)
-+{
-+ yaffs_PackTags2TagsPart(&pt->t, t);
-
- #ifndef YAFFS_IGNORE_TAGS_ECC
- {
-@@ -101,82 +109,98 @@ void yaffs_PackTags2(yaffs_PackedTags2 *
- #endif
- }
-
--void yaffs_UnpackTags2(yaffs_ExtendedTags * t, yaffs_PackedTags2 * pt)
-+
-+void yaffs_UnpackTags2TagsPart(yaffs_ExtendedTags *t,
-+ yaffs_PackedTags2TagsPart *ptt)
- {
-
- memset(t, 0, sizeof(yaffs_ExtendedTags));
-
- yaffs_InitialiseTags(t);
-
-- if (pt->t.sequenceNumber != 0xFFFFFFFF) {
-- /* Page is in use */
--#ifdef YAFFS_IGNORE_TAGS_ECC
-- {
-- t->eccResult = YAFFS_ECC_RESULT_NO_ERROR;
-- }
--#else
-- {
-- yaffs_ECCOther ecc;
-- int result;
-- yaffs_ECCCalculateOther((unsigned char *)&pt->t,
-- sizeof
-- (yaffs_PackedTags2TagsPart),
-- &ecc);
-- result =
-- yaffs_ECCCorrectOther((unsigned char *)&pt->t,
-- sizeof
-- (yaffs_PackedTags2TagsPart),
-- &pt->ecc, &ecc);
-- switch(result){
-- case 0:
-- t->eccResult = YAFFS_ECC_RESULT_NO_ERROR;
-- break;
-- case 1:
-- t->eccResult = YAFFS_ECC_RESULT_FIXED;
-- break;
-- case -1:
-- t->eccResult = YAFFS_ECC_RESULT_UNFIXED;
-- break;
-- default:
-- t->eccResult = YAFFS_ECC_RESULT_UNKNOWN;
-- }
-- }
--#endif
-+ if (ptt->sequenceNumber != 0xFFFFFFFF) {
- t->blockBad = 0;
- t->chunkUsed = 1;
-- t->objectId = pt->t.objectId;
-- t->chunkId = pt->t.chunkId;
-- t->byteCount = pt->t.byteCount;
-+ t->objectId = ptt->objectId;
-+ t->chunkId = ptt->chunkId;
-+ t->byteCount = ptt->byteCount;
- t->chunkDeleted = 0;
- t->serialNumber = 0;
-- t->sequenceNumber = pt->t.sequenceNumber;
-+ t->sequenceNumber = ptt->sequenceNumber;
-
- /* Do extra header info stuff */
-
-- if (pt->t.chunkId & EXTRA_HEADER_INFO_FLAG) {
-+ if (ptt->chunkId & EXTRA_HEADER_INFO_FLAG) {
- t->chunkId = 0;
- t->byteCount = 0;
-
- t->extraHeaderInfoAvailable = 1;
- t->extraParentObjectId =
-- pt->t.chunkId & (~(ALL_EXTRA_FLAGS));
-+ ptt->chunkId & (~(ALL_EXTRA_FLAGS));
- t->extraIsShrinkHeader =
-- (pt->t.chunkId & EXTRA_SHRINK_FLAG) ? 1 : 0;
-+ (ptt->chunkId & EXTRA_SHRINK_FLAG) ? 1 : 0;
- t->extraShadows =
-- (pt->t.chunkId & EXTRA_SHADOWS_FLAG) ? 1 : 0;
-+ (ptt->chunkId & EXTRA_SHADOWS_FLAG) ? 1 : 0;
- t->extraObjectType =
-- pt->t.objectId >> EXTRA_OBJECT_TYPE_SHIFT;
-+ ptt->objectId >> EXTRA_OBJECT_TYPE_SHIFT;
- t->objectId &= ~EXTRA_OBJECT_TYPE_MASK;
-
-- if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK) {
-- t->extraEquivalentObjectId = pt->t.byteCount;
-- } else {
-- t->extraFileLength = pt->t.byteCount;
-+ if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK)
-+ t->extraEquivalentObjectId = ptt->byteCount;
-+ else
-+ t->extraFileLength = ptt->byteCount;
-+ }
-+ }
-+
-+ yaffs_DumpPackedTags2TagsPart(ptt);
-+ yaffs_DumpTags2(t);
-+
-+}
-+
-+
-+void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt)
-+{
-+
-+ yaffs_ECCResult eccResult = YAFFS_ECC_RESULT_NO_ERROR;
-+
-+ if (pt->t.sequenceNumber != 0xFFFFFFFF) {
-+ /* Page is in use */
-+#ifndef YAFFS_IGNORE_TAGS_ECC
-+ {
-+ yaffs_ECCOther ecc;
-+ int result;
-+ yaffs_ECCCalculateOther((unsigned char *)&pt->t,
-+ sizeof
-+ (yaffs_PackedTags2TagsPart),
-+ &ecc);
-+ result =
-+ yaffs_ECCCorrectOther((unsigned char *)&pt->t,
-+ sizeof
-+ (yaffs_PackedTags2TagsPart),
-+ &pt->ecc, &ecc);
-+ switch (result) {
-+ case 0:
-+ eccResult = YAFFS_ECC_RESULT_NO_ERROR;
-+ break;
-+ case 1:
-+ eccResult = YAFFS_ECC_RESULT_FIXED;
-+ break;
-+ case -1:
-+ eccResult = YAFFS_ECC_RESULT_UNFIXED;
-+ break;
-+ default:
-+ eccResult = YAFFS_ECC_RESULT_UNKNOWN;
- }
- }
-+#endif
- }
-
-+ yaffs_UnpackTags2TagsPart(t, &pt->t);
-+
-+ t->eccResult = eccResult;
-+
- yaffs_DumpPackedTags2(pt);
- yaffs_DumpTags2(t);
-
- }
-+
---- a/fs/yaffs2/yaffs_packedtags2.h
-+++ b/fs/yaffs2/yaffs_packedtags2.h
-@@ -33,6 +33,11 @@ typedef struct {
- yaffs_ECCOther ecc;
- } yaffs_PackedTags2;
-
--void yaffs_PackTags2(yaffs_PackedTags2 * pt, const yaffs_ExtendedTags * t);
--void yaffs_UnpackTags2(yaffs_ExtendedTags * t, yaffs_PackedTags2 * pt);
-+/* Full packed tags with ECC, used for oob tags */
-+void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ExtendedTags *t);
-+void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt);
-+
-+/* Only the tags part (no ECC for use with inband tags */
-+void yaffs_PackTags2TagsPart(yaffs_PackedTags2TagsPart *pt, const yaffs_ExtendedTags *t);
-+void yaffs_UnpackTags2TagsPart(yaffs_ExtendedTags *t, yaffs_PackedTags2TagsPart *pt);
- #endif
---- a/fs/yaffs2/yaffs_qsort.c
-+++ b/fs/yaffs2/yaffs_qsort.c
-@@ -28,12 +28,12 @@
- */
-
- #include "yportenv.h"
--//#include <linux/string.h>
-+/* #include <linux/string.h> */
-
- /*
- * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".
- */
--#define swapcode(TYPE, parmi, parmj, n) { \
-+#define swapcode(TYPE, parmi, parmj, n) do { \
- long i = (n) / sizeof (TYPE); \
- register TYPE *pi = (TYPE *) (parmi); \
- register TYPE *pj = (TYPE *) (parmj); \
-@@ -41,28 +41,29 @@
- register TYPE t = *pi; \
- *pi++ = *pj; \
- *pj++ = t; \
-- } while (--i > 0); \
--}
-+ } while (--i > 0); \
-+} while (0)
-
- #define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \
-- es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;
-+ es % sizeof(long) ? 2 : es == sizeof(long) ? 0 : 1;
-
- static __inline void
- swapfunc(char *a, char *b, int n, int swaptype)
- {
- if (swaptype <= 1)
-- swapcode(long, a, b, n)
-+ swapcode(long, a, b, n);
- else
-- swapcode(char, a, b, n)
-+ swapcode(char, a, b, n);
- }
-
--#define swap(a, b) \
-+#define yswap(a, b) do { \
- if (swaptype == 0) { \
- long t = *(long *)(a); \
- *(long *)(a) = *(long *)(b); \
- *(long *)(b) = t; \
- } else \
-- swapfunc(a, b, es, swaptype)
-+ swapfunc(a, b, es, swaptype); \
-+} while (0)
-
- #define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype)
-
-@@ -70,12 +71,12 @@ static __inline char *
- med3(char *a, char *b, char *c, int (*cmp)(const void *, const void *))
- {
- return cmp(a, b) < 0 ?
-- (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a ))
-- :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c ));
-+ (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a))
-+ : (cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c));
- }
-
- #ifndef min
--#define min(a,b) (((a) < (b)) ? (a) : (b))
-+#define min(a, b) (((a) < (b)) ? (a) : (b))
- #endif
-
- void
-@@ -92,7 +93,7 @@ loop: SWAPINIT(a, es);
- for (pm = (char *)a + es; pm < (char *) a + n * es; pm += es)
- for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
- pl -= es)
-- swap(pl, pl - es);
-+ yswap(pl, pl - es);
- return;
- }
- pm = (char *)a + (n / 2) * es;
-@@ -107,7 +108,7 @@ loop: SWAPINIT(a, es);
- }
- pm = med3(pl, pm, pn, cmp);
- }
-- swap(a, pm);
-+ yswap(a, pm);
- pa = pb = (char *)a + es;
-
- pc = pd = (char *)a + (n - 1) * es;
-@@ -115,7 +116,7 @@ loop: SWAPINIT(a, es);
- while (pb <= pc && (r = cmp(pb, a)) <= 0) {
- if (r == 0) {
- swap_cnt = 1;
-- swap(pa, pb);
-+ yswap(pa, pb);
- pa += es;
- }
- pb += es;
-@@ -123,14 +124,14 @@ loop: SWAPINIT(a, es);
- while (pb <= pc && (r = cmp(pc, a)) >= 0) {
- if (r == 0) {
- swap_cnt = 1;
-- swap(pc, pd);
-+ yswap(pc, pd);
- pd -= es;
- }
- pc -= es;
- }
- if (pb > pc)
- break;
-- swap(pb, pc);
-+ yswap(pb, pc);
- swap_cnt = 1;
- pb += es;
- pc -= es;
-@@ -139,7 +140,7 @@ loop: SWAPINIT(a, es);
- for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)
- for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
- pl -= es)
-- swap(pl, pl - es);
-+ yswap(pl, pl - es);
- return;
- }
-
-@@ -148,9 +149,11 @@ loop: SWAPINIT(a, es);
- vecswap(a, pb - r, r);
- r = min((long)(pd - pc), (long)(pn - pd - es));
- vecswap(pb, pn - r, r);
-- if ((r = pb - pa) > es)
-+ r = pb - pa;
-+ if (r > es)
- yaffs_qsort(a, r / es, es, cmp);
-- if ((r = pd - pc) > es) {
-+ r = pd - pc;
-+ if (r > es) {
- /* Iterate rather than recurse to save stack space */
- a = pn - r;
- n = r / es;
---- a/fs/yaffs2/yaffs_qsort.h
-+++ b/fs/yaffs2/yaffs_qsort.h
-@@ -17,7 +17,7 @@
- #ifndef __YAFFS_QSORT_H__
- #define __YAFFS_QSORT_H__
-
--extern void yaffs_qsort (void *const base, size_t total_elems, size_t size,
-- int (*cmp)(const void *, const void *));
-+extern void yaffs_qsort(void *const base, size_t total_elems, size_t size,
-+ int (*cmp)(const void *, const void *));
-
- #endif
---- a/fs/yaffs2/yaffs_tagscompat.c
-+++ b/fs/yaffs2/yaffs_tagscompat.c
-@@ -14,16 +14,17 @@
- #include "yaffs_guts.h"
- #include "yaffs_tagscompat.h"
- #include "yaffs_ecc.h"
-+#include "yaffs_getblockinfo.h"
-
--static void yaffs_HandleReadDataError(yaffs_Device * dev, int chunkInNAND);
-+static void yaffs_HandleReadDataError(yaffs_Device *dev, int chunkInNAND);
- #ifdef NOTYET
--static void yaffs_CheckWrittenBlock(yaffs_Device * dev, int chunkInNAND);
--static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_Spare * spare);
--static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,
-- const yaffs_Spare * spare);
--static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND);
-+static void yaffs_CheckWrittenBlock(yaffs_Device *dev, int chunkInNAND);
-+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_Spare *spare);
-+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND,
-+ const yaffs_Spare *spare);
-+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND);
- #endif
-
- static const char yaffs_countBitsTable[256] = {
-@@ -54,13 +55,13 @@ int yaffs_CountBits(__u8 x)
-
- /********** Tags ECC calculations *********/
-
--void yaffs_CalcECC(const __u8 * data, yaffs_Spare * spare)
-+void yaffs_CalcECC(const __u8 *data, yaffs_Spare *spare)
- {
- yaffs_ECCCalculate(data, spare->ecc1);
- yaffs_ECCCalculate(&data[256], spare->ecc2);
- }
-
--void yaffs_CalcTagsECC(yaffs_Tags * tags)
-+void yaffs_CalcTagsECC(yaffs_Tags *tags)
- {
- /* Calculate an ecc */
-
-@@ -74,9 +75,8 @@ void yaffs_CalcTagsECC(yaffs_Tags * tags
- for (i = 0; i < 8; i++) {
- for (j = 1; j & 0xff; j <<= 1) {
- bit++;
-- if (b[i] & j) {
-+ if (b[i] & j)
- ecc ^= bit;
-- }
- }
- }
-
-@@ -84,7 +84,7 @@ void yaffs_CalcTagsECC(yaffs_Tags * tags
-
- }
-
--int yaffs_CheckECCOnTags(yaffs_Tags * tags)
-+int yaffs_CheckECCOnTags(yaffs_Tags *tags)
- {
- unsigned ecc = tags->ecc;
-
-@@ -115,8 +115,8 @@ int yaffs_CheckECCOnTags(yaffs_Tags * ta
-
- /********** Tags **********/
-
--static void yaffs_LoadTagsIntoSpare(yaffs_Spare * sparePtr,
-- yaffs_Tags * tagsPtr)
-+static void yaffs_LoadTagsIntoSpare(yaffs_Spare *sparePtr,
-+ yaffs_Tags *tagsPtr)
- {
- yaffs_TagsUnion *tu = (yaffs_TagsUnion *) tagsPtr;
-
-@@ -132,8 +132,8 @@ static void yaffs_LoadTagsIntoSpare(yaff
- sparePtr->tagByte7 = tu->asBytes[7];
- }
-
--static void yaffs_GetTagsFromSpare(yaffs_Device * dev, yaffs_Spare * sparePtr,
-- yaffs_Tags * tagsPtr)
-+static void yaffs_GetTagsFromSpare(yaffs_Device *dev, yaffs_Spare *sparePtr,
-+ yaffs_Tags *tagsPtr)
- {
- yaffs_TagsUnion *tu = (yaffs_TagsUnion *) tagsPtr;
- int result;
-@@ -148,21 +148,20 @@ static void yaffs_GetTagsFromSpare(yaffs
- tu->asBytes[7] = sparePtr->tagByte7;
-
- result = yaffs_CheckECCOnTags(tagsPtr);
-- if (result > 0) {
-+ if (result > 0)
- dev->tagsEccFixed++;
-- } else if (result < 0) {
-+ else if (result < 0)
- dev->tagsEccUnfixed++;
-- }
- }
-
--static void yaffs_SpareInitialise(yaffs_Spare * spare)
-+static void yaffs_SpareInitialise(yaffs_Spare *spare)
- {
- memset(spare, 0xFF, sizeof(yaffs_Spare));
- }
-
- static int yaffs_WriteChunkToNAND(struct yaffs_DeviceStruct *dev,
-- int chunkInNAND, const __u8 * data,
-- yaffs_Spare * spare)
-+ int chunkInNAND, const __u8 *data,
-+ yaffs_Spare *spare)
- {
- if (chunkInNAND < dev->startBlock * dev->nChunksPerBlock) {
- T(YAFFS_TRACE_ERROR,
-@@ -177,9 +176,9 @@ static int yaffs_WriteChunkToNAND(struct
-
- static int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev,
- int chunkInNAND,
-- __u8 * data,
-- yaffs_Spare * spare,
-- yaffs_ECCResult * eccResult,
-+ __u8 *data,
-+ yaffs_Spare *spare,
-+ yaffs_ECCResult *eccResult,
- int doErrorCorrection)
- {
- int retVal;
-@@ -252,9 +251,11 @@ static int yaffs_ReadChunkFromNAND(struc
- /* Must allocate enough memory for spare+2*sizeof(int) */
- /* for ecc results from device. */
- struct yaffs_NANDSpare nspare;
-- retVal =
-- dev->readChunkFromNAND(dev, chunkInNAND, data,
-- (yaffs_Spare *) & nspare);
-+
-+ memset(&nspare, 0, sizeof(nspare));
-+
-+ retVal = dev->readChunkFromNAND(dev, chunkInNAND, data,
-+ (yaffs_Spare *) &nspare);
- memcpy(spare, &nspare, sizeof(yaffs_Spare));
- if (data && doErrorCorrection) {
- if (nspare.eccres1 > 0) {
-@@ -302,8 +303,7 @@ static int yaffs_ReadChunkFromNAND(struc
- static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,
- int chunkInNAND)
- {
--
-- static int init = 0;
-+ static int init;
- static __u8 cmpbuf[YAFFS_BYTES_PER_CHUNK];
- static __u8 data[YAFFS_BYTES_PER_CHUNK];
- /* Might as well always allocate the larger size for */
-@@ -331,12 +331,12 @@ static int yaffs_CheckChunkErased(struct
- * Functions for robustisizing
- */
-
--static void yaffs_HandleReadDataError(yaffs_Device * dev, int chunkInNAND)
-+static void yaffs_HandleReadDataError(yaffs_Device *dev, int chunkInNAND)
- {
- int blockInNAND = chunkInNAND / dev->nChunksPerBlock;
-
- /* Mark the block for retirement */
-- yaffs_GetBlockInfo(dev, blockInNAND)->needsRetiring = 1;
-+ yaffs_GetBlockInfo(dev, blockInNAND + dev->blockOffset)->needsRetiring = 1;
- T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS,
- (TSTR("**>>Block %d marked for retirement" TENDSTR), blockInNAND));
-
-@@ -348,22 +348,22 @@ static void yaffs_HandleReadDataError(ya
- }
-
- #ifdef NOTYET
--static void yaffs_CheckWrittenBlock(yaffs_Device * dev, int chunkInNAND)
-+static void yaffs_CheckWrittenBlock(yaffs_Device *dev, int chunkInNAND)
- {
- }
-
--static void yaffs_HandleWriteChunkOk(yaffs_Device * dev, int chunkInNAND,
-- const __u8 * data,
-- const yaffs_Spare * spare)
-+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_Spare *spare)
- {
- }
-
--static void yaffs_HandleUpdateChunk(yaffs_Device * dev, int chunkInNAND,
-- const yaffs_Spare * spare)
-+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND,
-+ const yaffs_Spare *spare)
- {
- }
-
--static void yaffs_HandleWriteChunkError(yaffs_Device * dev, int chunkInNAND)
-+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND)
- {
- int blockInNAND = chunkInNAND / dev->nChunksPerBlock;
-
-@@ -373,8 +373,8 @@ static void yaffs_HandleWriteChunkError(
- yaffs_DeleteChunk(dev, chunkInNAND, 1, __LINE__);
- }
-
--static int yaffs_VerifyCompare(const __u8 * d0, const __u8 * d1,
-- const yaffs_Spare * s0, const yaffs_Spare * s1)
-+static int yaffs_VerifyCompare(const __u8 *d0, const __u8 *d1,
-+ const yaffs_Spare *s0, const yaffs_Spare *s1)
- {
-
- if (memcmp(d0, d1, YAFFS_BYTES_PER_CHUNK) != 0 ||
-@@ -398,28 +398,35 @@ static int yaffs_VerifyCompare(const __u
- }
- #endif /* NOTYET */
-
--int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device * dev,
-- int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags *
-- eTags)
-+int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device *dev,
-+ int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *eTags)
- {
- yaffs_Spare spare;
- yaffs_Tags tags;
-
- yaffs_SpareInitialise(&spare);
-
-- if (eTags->chunkDeleted) {
-+ if (eTags->chunkDeleted)
- spare.pageStatus = 0;
-- } else {
-+ else {
- tags.objectId = eTags->objectId;
- tags.chunkId = eTags->chunkId;
-- tags.byteCount = eTags->byteCount;
-+
-+ tags.byteCountLSB = eTags->byteCount & 0x3ff;
-+
-+ if (dev->nDataBytesPerChunk >= 1024)
-+ tags.byteCountMSB = (eTags->byteCount >> 10) & 3;
-+ else
-+ tags.byteCountMSB = 3;
-+
-+
- tags.serialNumber = eTags->serialNumber;
-
-- if (!dev->useNANDECC && data) {
-+ if (!dev->useNANDECC && data)
- yaffs_CalcECC(data, &spare);
-- }
-+
- yaffs_LoadTagsIntoSpare(&spare, &tags);
-
- }
-@@ -427,15 +434,15 @@ int yaffs_TagsCompatabilityWriteChunkWit
- return yaffs_WriteChunkToNAND(dev, chunkInNAND, data, &spare);
- }
-
--int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device * dev,
-+int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device *dev,
- int chunkInNAND,
-- __u8 * data,
-- yaffs_ExtendedTags * eTags)
-+ __u8 *data,
-+ yaffs_ExtendedTags *eTags)
- {
-
- yaffs_Spare spare;
- yaffs_Tags tags;
-- yaffs_ECCResult eccResult;
-+ yaffs_ECCResult eccResult = YAFFS_ECC_RESULT_UNKNOWN;
-
- static yaffs_Spare spareFF;
- static int init;
-@@ -466,7 +473,11 @@ int yaffs_TagsCompatabilityReadChunkWith
-
- eTags->objectId = tags.objectId;
- eTags->chunkId = tags.chunkId;
-- eTags->byteCount = tags.byteCount;
-+ eTags->byteCount = tags.byteCountLSB;
-+
-+ if (dev->nDataBytesPerChunk >= 1024)
-+ eTags->byteCount |= (((unsigned) tags.byteCountMSB) << 10);
-+
- eTags->serialNumber = tags.serialNumber;
- }
- }
-@@ -497,9 +508,9 @@ int yaffs_TagsCompatabilityMarkNANDBlock
- }
-
- int yaffs_TagsCompatabilityQueryNANDBlock(struct yaffs_DeviceStruct *dev,
-- int blockNo, yaffs_BlockState *
-- state,
-- int *sequenceNumber)
-+ int blockNo,
-+ yaffs_BlockState *state,
-+ __u32 *sequenceNumber)
- {
-
- yaffs_Spare spare0, spare1;
---- a/fs/yaffs2/yaffs_tagscompat.h
-+++ b/fs/yaffs2/yaffs_tagscompat.h
-@@ -17,24 +17,23 @@
- #define __YAFFS_TAGSCOMPAT_H__
-
- #include "yaffs_guts.h"
--int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device * dev,
-- int chunkInNAND,
-- const __u8 * data,
-- const yaffs_ExtendedTags *
-- tags);
--int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device * dev,
-- int chunkInNAND,
-- __u8 * data,
-- yaffs_ExtendedTags *
-- tags);
-+int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device *dev,
-+ int chunkInNAND,
-+ const __u8 *data,
-+ const yaffs_ExtendedTags *tags);
-+int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device *dev,
-+ int chunkInNAND,
-+ __u8 *data,
-+ yaffs_ExtendedTags *tags);
- int yaffs_TagsCompatabilityMarkNANDBlockBad(struct yaffs_DeviceStruct *dev,
- int blockNo);
- int yaffs_TagsCompatabilityQueryNANDBlock(struct yaffs_DeviceStruct *dev,
-- int blockNo, yaffs_BlockState *
-- state, int *sequenceNumber);
-+ int blockNo,
-+ yaffs_BlockState *state,
-+ __u32 *sequenceNumber);
-
--void yaffs_CalcTagsECC(yaffs_Tags * tags);
--int yaffs_CheckECCOnTags(yaffs_Tags * tags);
-+void yaffs_CalcTagsECC(yaffs_Tags *tags);
-+int yaffs_CheckECCOnTags(yaffs_Tags *tags);
- int yaffs_CountBits(__u8 byte);
-
- #endif
---- a/fs/yaffs2/yaffs_tagsvalidity.c
-+++ b/fs/yaffs2/yaffs_tagsvalidity.c
-@@ -13,14 +13,14 @@
-
- #include "yaffs_tagsvalidity.h"
-
--void yaffs_InitialiseTags(yaffs_ExtendedTags * tags)
-+void yaffs_InitialiseTags(yaffs_ExtendedTags *tags)
- {
- memset(tags, 0, sizeof(yaffs_ExtendedTags));
- tags->validMarker0 = 0xAAAAAAAA;
- tags->validMarker1 = 0x55555555;
- }
-
--int yaffs_ValidateTags(yaffs_ExtendedTags * tags)
-+int yaffs_ValidateTags(yaffs_ExtendedTags *tags)
- {
- return (tags->validMarker0 == 0xAAAAAAAA &&
- tags->validMarker1 == 0x55555555);
---- a/fs/yaffs2/yaffs_tagsvalidity.h
-+++ b/fs/yaffs2/yaffs_tagsvalidity.h
-@@ -19,6 +19,6 @@
-
- #include "yaffs_guts.h"
-
--void yaffs_InitialiseTags(yaffs_ExtendedTags * tags);
--int yaffs_ValidateTags(yaffs_ExtendedTags * tags);
-+void yaffs_InitialiseTags(yaffs_ExtendedTags *tags);
-+int yaffs_ValidateTags(yaffs_ExtendedTags *tags);
- #endif
---- a/fs/yaffs2/yportenv.h
-+++ b/fs/yaffs2/yportenv.h
-@@ -17,17 +17,28 @@
- #ifndef __YPORTENV_H__
- #define __YPORTENV_H__
-
-+/*
-+ * Define the MTD version in terms of Linux Kernel versions
-+ * This allows yaffs to be used independantly of the kernel
-+ * as well as with it.
-+ */
-+
-+#define MTD_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + (c))
-+
- #if defined CONFIG_YAFFS_WINCE
-
- #include "ywinceenv.h"
-
--#elif defined __KERNEL__
-+#elif defined __KERNEL__
-
- #include "moduleconfig.h"
-
- /* Linux kernel */
-+
- #include <linux/version.h>
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
-+#define MTD_VERSION_CODE LINUX_VERSION_CODE
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
- #include <linux/config.h>
- #endif
- #include <linux/kernel.h>
-@@ -40,12 +51,13 @@
- #define YCHAR char
- #define YUCHAR unsigned char
- #define _Y(x) x
--#define yaffs_strcpy(a,b) strcpy(a,b)
--#define yaffs_strncpy(a,b,c) strncpy(a,b,c)
--#define yaffs_strncmp(a,b,c) strncmp(a,b,c)
--#define yaffs_strlen(s) strlen(s)
--#define yaffs_sprintf sprintf
--#define yaffs_toupper(a) toupper(a)
-+#define yaffs_strcat(a, b) strcat(a, b)
-+#define yaffs_strcpy(a, b) strcpy(a, b)
-+#define yaffs_strncpy(a, b, c) strncpy(a, b, c)
-+#define yaffs_strncmp(a, b, c) strncmp(a, b, c)
-+#define yaffs_strlen(s) strlen(s)
-+#define yaffs_sprintf sprintf
-+#define yaffs_toupper(a) toupper(a)
-
- #define Y_INLINE inline
-
-@@ -53,19 +65,19 @@
- #define YAFFS_LOSTNFOUND_PREFIX "obj"
-
- /* #define YPRINTF(x) printk x */
--#define YMALLOC(x) kmalloc(x,GFP_KERNEL)
-+#define YMALLOC(x) kmalloc(x, GFP_NOFS)
- #define YFREE(x) kfree(x)
- #define YMALLOC_ALT(x) vmalloc(x)
- #define YFREE_ALT(x) vfree(x)
- #define YMALLOC_DMA(x) YMALLOC(x)
-
--// KR - added for use in scan so processes aren't blocked indefinitely.
-+/* KR - added for use in scan so processes aren't blocked indefinitely. */
- #define YYIELD() schedule()
-
- #define YAFFS_ROOT_MODE 0666
- #define YAFFS_LOSTNFOUND_MODE 0666
-
--#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
- #define Y_CURRENT_TIME CURRENT_TIME.tv_sec
- #define Y_TIME_CONVERT(x) (x).tv_sec
- #else
-@@ -73,11 +85,12 @@
- #define Y_TIME_CONVERT(x) (x)
- #endif
-
--#define yaffs_SumCompare(x,y) ((x) == (y))
--#define yaffs_strcmp(a,b) strcmp(a,b)
-+#define yaffs_SumCompare(x, y) ((x) == (y))
-+#define yaffs_strcmp(a, b) strcmp(a, b)
-
- #define TENDSTR "\n"
- #define TSTR(x) KERN_WARNING x
-+#define TCONT(x) x
- #define TOUT(p) printk p
-
- #define yaffs_trace(mask, fmt, args...) \
-@@ -90,6 +103,8 @@
-
- #elif defined CONFIG_YAFFS_DIRECT
-
-+#define MTD_VERSION_CODE MTD_VERSION(2, 6, 22)
-+
- /* Direct interface */
- #include "ydirectenv.h"
-
-@@ -111,11 +126,12 @@
- #define YCHAR char
- #define YUCHAR unsigned char
- #define _Y(x) x
--#define yaffs_strcpy(a,b) strcpy(a,b)
--#define yaffs_strncpy(a,b,c) strncpy(a,b,c)
--#define yaffs_strlen(s) strlen(s)
--#define yaffs_sprintf sprintf
--#define yaffs_toupper(a) toupper(a)
-+#define yaffs_strcat(a, b) strcat(a, b)
-+#define yaffs_strcpy(a, b) strcpy(a, b)
-+#define yaffs_strncpy(a, b, c) strncpy(a, b, c)
-+#define yaffs_strlen(s) strlen(s)
-+#define yaffs_sprintf sprintf
-+#define yaffs_toupper(a) toupper(a)
-
- #define Y_INLINE inline
-
-@@ -133,8 +149,8 @@
- #define YAFFS_ROOT_MODE 0666
- #define YAFFS_LOSTNFOUND_MODE 0666
-
--#define yaffs_SumCompare(x,y) ((x) == (y))
--#define yaffs_strcmp(a,b) strcmp(a,b)
-+#define yaffs_SumCompare(x, y) ((x) == (y))
-+#define yaffs_strcmp(a, b) strcmp(a, b)
-
- #else
- /* Should have specified a configuration type */
-@@ -178,10 +194,10 @@ extern unsigned int yaffs_wr_attempts;
- #define YAFFS_TRACE_ALWAYS 0xF0000000
-
-
--#define T(mask,p) do{ if((mask) & (yaffs_traceMask | YAFFS_TRACE_ALWAYS)) TOUT(p);} while(0)
-+#define T(mask, p) do { if ((mask) & (yaffs_traceMask | YAFFS_TRACE_ALWAYS)) TOUT(p); } while (0)
-
--#ifndef CONFIG_YAFFS_WINCE
--#define YBUG() T(YAFFS_TRACE_BUG,(TSTR("==>> yaffs bug: " __FILE__ " %d" TENDSTR),__LINE__))
-+#ifndef YBUG
-+#define YBUG() do {T(YAFFS_TRACE_BUG, (TSTR("==>> yaffs bug: " __FILE__ " %d" TENDSTR), __LINE__)); } while (0)
- #endif
-
- #endif
+++ /dev/null
---- a/drivers/net/phy/phy.c
-+++ b/drivers/net/phy/phy.c
-@@ -299,6 +299,50 @@ int phy_ethtool_gset(struct phy_device *
- }
- EXPORT_SYMBOL(phy_ethtool_gset);
-
-+int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr)
-+{
-+ u32 cmd;
-+ int tmp;
-+ struct ethtool_cmd ecmd = { ETHTOOL_GSET };
-+ struct ethtool_value edata = { ETHTOOL_GLINK };
-+
-+ if (get_user(cmd, (u32 *) useraddr))
-+ return -EFAULT;
-+
-+ switch (cmd) {
-+ case ETHTOOL_GSET:
-+ phy_ethtool_gset(phydev, &ecmd);
-+ if (copy_to_user(useraddr, &ecmd, sizeof(ecmd)))
-+ return -EFAULT;
-+ return 0;
-+
-+ case ETHTOOL_SSET:
-+ if (copy_from_user(&ecmd, useraddr, sizeof(ecmd)))
-+ return -EFAULT;
-+ return phy_ethtool_sset(phydev, &ecmd);
-+
-+ case ETHTOOL_NWAY_RST:
-+ /* if autoneg is off, it's an error */
-+ tmp = phy_read(phydev, MII_BMCR);
-+ if (tmp & BMCR_ANENABLE) {
-+ tmp |= (BMCR_ANRESTART);
-+ phy_write(phydev, MII_BMCR, tmp);
-+ return 0;
-+ }
-+ return -EINVAL;
-+
-+ case ETHTOOL_GLINK:
-+ edata.data = (phy_read(phydev,
-+ MII_BMSR) & BMSR_LSTATUS) ? 1 : 0;
-+ if (copy_to_user(useraddr, &edata, sizeof(edata)))
-+ return -EFAULT;
-+ return 0;
-+ }
-+
-+ return -EOPNOTSUPP;
-+}
-+EXPORT_SYMBOL(phy_ethtool_ioctl);
-+
- /**
- * phy_mii_ioctl - generic PHY MII ioctl interface
- * @phydev: the phy_device struct
-@@ -352,7 +396,7 @@ int phy_mii_ioctl(struct phy_device *phy
- }
-
- phy_write(phydev, mii_data->reg_num, val);
--
-+
- if (mii_data->reg_num == MII_BMCR &&
- val & BMCR_RESET &&
- phydev->drv->config_init) {
-@@ -466,7 +510,7 @@ static void phy_force_reduction(struct p
- int idx;
-
- idx = phy_find_setting(phydev->speed, phydev->duplex);
--
-+
- idx++;
-
- idx = phy_find_valid(idx, phydev->supported);
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -491,6 +491,7 @@ void phy_start_machine(struct phy_device
- void phy_stop_machine(struct phy_device *phydev);
- int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd);
- int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd);
-+int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr);
- int phy_mii_ioctl(struct phy_device *phydev,
- struct mii_ioctl_data *mii_data, int cmd);
- int phy_start_interrupts(struct phy_device *phydev);
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -88,6 +88,11 @@ config LSI_ET1011C_PHY
- ---help---
- Supports the LSI ET1011C PHY.
-
-+config ADM6996_PHY
-+ tristate "Driver for ADM6996 switches"
-+ ---help---
-+ Currently supports the ADM6996F switch
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -13,6 +13,7 @@ obj-$(CONFIG_VITESSE_PHY) += vitesse.o
- obj-$(CONFIG_BROADCOM_PHY) += broadcom.o
- obj-$(CONFIG_BCM63XX_PHY) += bcm63xx.o
- obj-$(CONFIG_ICPLUS_PHY) += icplus.o
-+obj-$(CONFIG_ADM6996_PHY) += adm6996.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
+++ /dev/null
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -146,6 +146,18 @@ int phy_scan_fixups(struct phy_device *p
- }
- EXPORT_SYMBOL(phy_scan_fixups);
-
-+static int generic_receive_skb(struct sk_buff *skb)
-+{
-+ skb->protocol = eth_type_trans(skb, skb->dev);
-+ return netif_receive_skb(skb);
-+}
-+
-+static int generic_rx(struct sk_buff *skb)
-+{
-+ skb->protocol = eth_type_trans(skb, skb->dev);
-+ return netif_rx(skb);
-+}
-+
- struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id)
- {
- struct phy_device *dev;
-@@ -175,6 +187,8 @@ struct phy_device* phy_device_create(str
- dev_set_name(&dev->dev, PHY_ID_FMT, bus->id, addr);
-
- dev->state = PHY_DOWN;
-+ dev->netif_receive_skb = &generic_receive_skb;
-+ dev->netif_rx = &generic_rx;
-
- mutex_init(&dev->lock);
- INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine);
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -325,6 +325,20 @@ struct phy_device {
- void (*adjust_link)(struct net_device *dev);
-
- void (*adjust_state)(struct net_device *dev);
-+
-+ /*
-+ * By default these point to the original functions
-+ * with the same name. adding them to the phy_device
-+ * allows the phy driver to override them for packet
-+ * mangling if the ethernet driver supports it
-+ * This is required to support some really horrible
-+ * switches such as the Marvell 88E6060
-+ */
-+ int (*netif_receive_skb)(struct sk_buff *skb);
-+ int (*netif_rx)(struct sk_buff *skb);
-+
-+ /* alignment offset for packets */
-+ int pkt_align;
- };
- #define to_phy_device(d) container_of(d, struct phy_device, dev)
-
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -844,6 +844,7 @@ struct net_device {
- void *ax25_ptr; /* AX.25 specific data */
- struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data,
- assign before registering */
-+ void *phy_ptr; /* PHY device specific data */
-
- /*
- * Cache line mostly used on receive path (including eth_type_trans())
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -13,6 +13,12 @@ menuconfig PHYLIB
-
- if PHYLIB
-
-+config SWCONFIG
-+ tristate "Switch configuration API"
-+ ---help---
-+ Switch configuration API using netlink. This allows
-+ you to configure the VLAN features of certain switches.
-+
- comment "MII PHY device drivers"
-
- config MARVELL_PHY
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -3,6 +3,7 @@
- libphy-objs := phy.o phy_device.o mdio_bus.o
-
- obj-$(CONFIG_PHYLIB) += libphy.o
-+obj-$(CONFIG_SWCONFIG) += swconfig.o
- obj-$(CONFIG_MARVELL_PHY) += marvell.o
- obj-$(CONFIG_DAVICOM_PHY) += davicom.o
- obj-$(CONFIG_CICADA_PHY) += cicada.o
+++ /dev/null
---- a/drivers/net/phy/swconfig.c
-+++ b/drivers/net/phy/swconfig.c
-@@ -335,7 +335,7 @@ swconfig_send_multipart(struct swconfig_
- if (cb->close(cb, arg) < 0)
- goto error;
- }
-- err = genlmsg_unicast(cb->msg, info->snd_pid);
-+ err = genlmsg_reply(cb->msg, info);
- cb->msg = NULL;
- if (err < 0)
- goto error;
-@@ -419,7 +419,7 @@ swconfig_list_attrs(struct sk_buff *skb,
- if (!cb.msg)
- return 0;
-
-- return genlmsg_unicast(cb.msg, info->snd_pid);
-+ return genlmsg_reply(cb.msg, info);
-
- error:
- if (cb.msg)
-@@ -728,7 +728,7 @@ swconfig_get_attr(struct sk_buff *skb, s
- goto nla_put_failure;
-
- swconfig_put_dev(dev);
-- return genlmsg_unicast(msg, info->snd_pid);
-+ return genlmsg_reply(msg, info);
-
- nla_put_failure:
- if (msg)
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -99,6 +99,9 @@ config ADM6996_PHY
- ---help---
- Currently supports the ADM6996F switch
-
-+config MVSWITCH_PHY
-+ tristate "Driver for Marvell 88E6060 switches"
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -15,6 +15,7 @@ obj-$(CONFIG_BROADCOM_PHY) += broadcom.o
- obj-$(CONFIG_BCM63XX_PHY) += bcm63xx.o
- obj-$(CONFIG_ICPLUS_PHY) += icplus.o
- obj-$(CONFIG_ADM6996_PHY) += adm6996.o
-+obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -102,6 +102,10 @@ config ADM6996_PHY
- config MVSWITCH_PHY
- tristate "Driver for Marvell 88E6060 switches"
-
-+config IP175C_PHY
-+ tristate "Driver for IC+ IP175C/IP178C switches"
-+ select SWCONFIG
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -16,6 +16,7 @@ obj-$(CONFIG_BCM63XX_PHY) += bcm63xx.o
- obj-$(CONFIG_ICPLUS_PHY) += icplus.o
- obj-$(CONFIG_ADM6996_PHY) += adm6996.o
- obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
-+obj-$(CONFIG_IP175C_PHY) += ip175c.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -106,6 +106,10 @@ config IP175C_PHY
- tristate "Driver for IC+ IP175C/IP178C switches"
- select SWCONFIG
-
-+config AR8216_PHY
-+ tristate "Driver for Atheros AR8216 switches"
-+ select SWCONFIG
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -18,6 +18,7 @@ obj-$(CONFIG_ADM6996_PHY) += adm6996.o
- obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
- obj-$(CONFIG_IP175C_PHY) += ip175c.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
-+obj-$(CONFIG_AR8216_PHY) += ar8216.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
- obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -110,6 +110,10 @@ config AR8216_PHY
- tristate "Driver for Atheros AR8216 switches"
- select SWCONFIG
-
-+config RTL8306_PHY
-+ tristate "Driver for Realtek RTL8306S switches"
-+ select SWCONFIG
-+
- config FIXED_PHY
- bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- depends on PHYLIB=y
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -19,6 +19,7 @@ obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
- obj-$(CONFIG_IP175C_PHY) += ip175c.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_AR8216_PHY) += ar8216.o
-+obj-$(CONFIG_RTL8306_PHY) += rtl8306.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
- obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
+++ /dev/null
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -152,4 +152,29 @@ config MDIO_OCTEON
-
- If in doubt, say Y.
-
-+config RTL8366_SMI
-+ tristate "Driver for the RTL8366 SMI interface"
-+ depends on GENERIC_GPIO
-+ ---help---
-+ This module implements the SMI interface protocol which is used
-+ by some RTL8366 ethernet switch devices via the generic GPIO API.
-+
-+if RTL8366_SMI
-+
-+config RTL8366S_PHY
-+ tristate "Driver for the Realtek RTL8366S switch"
-+ select SWCONFIG
-+
-+config RTL8366RB_PHY
-+ tristate "Driver for the Realtek RTL8366RB switch"
-+ select SWCONFIG
-+
-+config RTL8366S_PHY_DEBUG_FS
-+ bool "RTL8366 switch driver DEBUG_FS support"
-+ depends on RTL8366S_PHY || RTL8366RB_PHY
-+ depends on DEBUG_FS
-+ default n
-+
-+endif # RTL8366_SMI
-+
- endif # PHYLIB
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -20,6 +20,9 @@ obj-$(CONFIG_IP175C_PHY) += ip175c.o
- obj-$(CONFIG_REALTEK_PHY) += realtek.o
- obj-$(CONFIG_AR8216_PHY) += ar8216.o
- obj-$(CONFIG_RTL8306_PHY) += rtl8306.o
-+obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi.o
-+obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o
-+obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o
- obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
- obj-$(CONFIG_FIXED_PHY) += fixed.o
- obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
+++ /dev/null
---- a/drivers/rtc/Kconfig
-+++ b/drivers/rtc/Kconfig
-@@ -608,6 +608,15 @@ config RTC_DRV_NUC900
- If you say yes here you get support for the RTC subsystem of the
- NUC910/NUC920 used in embedded systems.
-
-+config RTC_DRV_RTC7301
-+ tristate "Epson RTC-7301 SF/DG"
-+ help
-+ If you say Y here you will get support for the
-+ Epson RTC-7301 SF/DG RTC chips.
-+
-+ This driver can also be built as a module. If so, the module
-+ will be called rtc-7301.
-+
- comment "on-CPU RTC drivers"
-
- config RTC_DRV_OMAP
---- a/drivers/rtc/Makefile
-+++ b/drivers/rtc/Makefile
-@@ -72,6 +72,7 @@ obj-$(CONFIG_RTC_DRV_RP5C01) += rtc-rp5c
- obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o
- obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o
- obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o
-+obj-$(CONFIG_RTC_DRV_RTC7301) += rtc-rtc7301.o
- obj-$(CONFIG_RTC_DRV_RX8025) += rtc-rx8025.o
- obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o
- obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o
---- /dev/null
-+++ b/drivers/rtc/rtc-rtc7301.c
-@@ -0,0 +1,219 @@
-+/*
-+ * Driver for Epson RTC-7301SF/DG
-+ *
-+ * Copyright (C) 2009 Jose Vasconcellos
-+ *
-+ * This program is free software; you can 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/rtc.h>
-+#include <linux/platform_device.h>
-+#include <linux/io.h>
-+#include <linux/delay.h>
-+#include <linux/bcd.h>
-+
-+#define RTC_NAME "rtc7301"
-+#define RTC_VERSION "0.1"
-+
-+/* Epson RTC-7301 register addresses */
-+#define RTC7301_SEC 0x00
-+#define RTC7301_SEC10 0x01
-+#define RTC7301_MIN 0x02
-+#define RTC7301_MIN10 0x03
-+#define RTC7301_HOUR 0x04
-+#define RTC7301_HOUR10 0x05
-+#define RTC7301_WEEKDAY 0x06
-+#define RTC7301_DAY 0x07
-+#define RTC7301_DAY10 0x08
-+#define RTC7301_MON 0x09
-+#define RTC7301_MON10 0x0A
-+#define RTC7301_YEAR 0x0B
-+#define RTC7301_YEAR10 0x0C
-+#define RTC7301_YEAR100 0x0D
-+#define RTC7301_YEAR1000 0x0E
-+#define RTC7301_CTRLREG 0x0F
-+
-+static uint8_t __iomem *rtc7301_base;
-+
-+#define read_reg(offset) (readb(rtc7301_base + offset) & 0xf)
-+#define write_reg(offset, data) writeb(data, rtc7301_base + (offset))
-+
-+#define rtc7301_isbusy() (read_reg(RTC7301_CTRLREG) & 1)
-+
-+static void rtc7301_init_settings(void)
-+{
-+ int i;
-+
-+ write_reg(RTC7301_CTRLREG, 2);
-+ write_reg(RTC7301_YEAR1000, 2);
-+ udelay(122);
-+
-+ /* bank 1 */
-+ write_reg(RTC7301_CTRLREG, 6);
-+ for (i=0; i<15; i++)
-+ write_reg(i, 0);
-+
-+ /* bank 2 */
-+ write_reg(RTC7301_CTRLREG, 14);
-+ for (i=0; i<15; i++)
-+ write_reg(i, 0);
-+ write_reg(RTC7301_CTRLREG, 0);
-+}
-+
-+static int rtc7301_get_datetime(struct device *dev, struct rtc_time *dt)
-+{
-+ int cnt;
-+ uint8_t buf[16];
-+
-+ cnt = 0;
-+ while (rtc7301_isbusy()) {
-+ udelay(244);
-+ if (cnt++ > 100) {
-+ dev_err(dev, "%s: timeout error %x\n", __func__, rtc7301_base[RTC7301_CTRLREG]);
-+ return -EIO;
-+ }
-+ }
-+
-+ for (cnt=0; cnt<16; cnt++)
-+ buf[cnt] = read_reg(cnt);
-+
-+ if (buf[RTC7301_SEC10] & 8) {
-+ dev_err(dev, "%s: RTC not set\n", __func__);
-+ return -EINVAL;
-+ }
-+
-+ memset(dt, 0, sizeof(*dt));
-+
-+ dt->tm_sec = buf[RTC7301_SEC] + buf[RTC7301_SEC10]*10;
-+ dt->tm_min = buf[RTC7301_MIN] + buf[RTC7301_MIN10]*10;
-+ dt->tm_hour = buf[RTC7301_HOUR] + buf[RTC7301_HOUR10]*10;
-+
-+ dt->tm_mday = buf[RTC7301_DAY] + buf[RTC7301_DAY10]*10;
-+ dt->tm_mon = buf[RTC7301_MON] + buf[RTC7301_MON10]*10 - 1;
-+ dt->tm_year = buf[RTC7301_YEAR] + buf[RTC7301_YEAR10]*10 +
-+ buf[RTC7301_YEAR100]*100 +
-+ ((buf[RTC7301_YEAR1000] & 3)*1000) - 1900;
-+
-+ /* the rtc device may contain illegal values on power up
-+ * according to the data sheet. make sure they are valid.
-+ */
-+
-+ return rtc_valid_tm(dt);
-+}
-+
-+static int rtc7301_set_datetime(struct device *dev, struct rtc_time *dt)
-+{
-+ int data;
-+
-+ data = dt->tm_year + 1900;
-+ if (data >= 2100 || data < 1900)
-+ return -EINVAL;
-+
-+ write_reg(RTC7301_CTRLREG, 2);
-+ udelay(122);
-+
-+ data = bin2bcd(dt->tm_sec);
-+ write_reg(RTC7301_SEC, data);
-+ write_reg(RTC7301_SEC10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_min);
-+ write_reg(RTC7301_MIN, data );
-+ write_reg(RTC7301_MIN10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_hour);
-+ write_reg(RTC7301_HOUR, data);
-+ write_reg(RTC7301_HOUR10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_mday);
-+ write_reg(RTC7301_DAY, data);
-+ write_reg(RTC7301_DAY10, (data>> 4));
-+
-+ data = bin2bcd(dt->tm_mon + 1);
-+ write_reg(RTC7301_MON, data);
-+ write_reg(RTC7301_MON10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_year % 100);
-+ write_reg(RTC7301_YEAR, data);
-+ write_reg(RTC7301_YEAR10, (data >> 4));
-+ data = bin2bcd((1900 + dt->tm_year) / 100);
-+ write_reg(RTC7301_YEAR100, data);
-+
-+ data = bin2bcd(dt->tm_wday);
-+ write_reg(RTC7301_WEEKDAY, data);
-+
-+ write_reg(RTC7301_CTRLREG, 0);
-+
-+ return 0;
-+}
-+
-+static const struct rtc_class_ops rtc7301_rtc_ops = {
-+ .read_time = rtc7301_get_datetime,
-+ .set_time = rtc7301_set_datetime,
-+};
-+
-+static int __devinit rtc7301_probe(struct platform_device *pdev)
-+{
-+ struct rtc_device *rtc;
-+ struct resource *res;
-+
-+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ if (!res)
-+ return -ENOENT;
-+
-+ rtc7301_base = ioremap_nocache(res->start, 0x1000 /*res->end - res->start + 1*/);
-+ if (!rtc7301_base)
-+ return -EINVAL;
-+
-+ rtc = rtc_device_register(RTC_NAME, &pdev->dev,
-+ &rtc7301_rtc_ops, THIS_MODULE);
-+ if (IS_ERR(rtc)) {
-+ iounmap(rtc7301_base);
-+ return PTR_ERR(rtc);
-+ }
-+
-+ platform_set_drvdata(pdev, rtc);
-+
-+ rtc7301_init_settings();
-+ return 0;
-+}
-+
-+static int __devexit rtc7301_remove(struct platform_device *pdev)
-+{
-+ struct rtc_device *rtc = platform_get_drvdata(pdev);
-+
-+ if (rtc)
-+ rtc_device_unregister(rtc);
-+ if (rtc7301_base)
-+ iounmap(rtc7301_base);
-+ return 0;
-+}
-+
-+static struct platform_driver rtc7301_driver = {
-+ .driver = {
-+ .name = RTC_NAME,
-+ .owner = THIS_MODULE,
-+ },
-+ .probe = rtc7301_probe,
-+ .remove = __devexit_p(rtc7301_remove),
-+};
-+
-+static __init int rtc7301_init(void)
-+{
-+ return platform_driver_register(&rtc7301_driver);
-+}
-+module_init(rtc7301_init);
-+
-+static __exit void rtc7301_exit(void)
-+{
-+ platform_driver_unregister(&rtc7301_driver);
-+}
-+module_exit(rtc7301_exit);
-+
-+MODULE_DESCRIPTION("Epson 7301 RTC driver");
-+MODULE_AUTHOR("Jose Vasconcellos <jvasco@verizon.net>");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS("platform:" RTC_NAME);
-+MODULE_VERSION(RTC_VERSION);
+++ /dev/null
---- a/include/linux/fb.h
-+++ b/include/linux/fb.h
-@@ -124,6 +124,7 @@ struct dentry;
- #define FB_ACCEL_TRIDENT_BLADE3D 52 /* Trident Blade3D */
- #define FB_ACCEL_TRIDENT_BLADEXP 53 /* Trident BladeXP */
- #define FB_ACCEL_CIRRUS_ALPINE 53 /* Cirrus Logic 543x/544x/5480 */
-+#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 */
---- a/include/linux/Kbuild
-+++ b/include/linux/Kbuild
-@@ -76,6 +76,8 @@ header-y += genetlink.h
- header-y += gen_stats.h
- header-y += gfs2_ondisk.h
- header-y += gigaset_dev.h
-+header-y += glamofb.h
-+header-y += glamo-engine.h
- header-y += hysdn_if.h
- header-y += i2o-dev.h
- header-y += i8k.h
+++ /dev/null
---- a/drivers/usb/serial/usb-serial.c
-+++ b/drivers/usb/serial/usb-serial.c
-@@ -61,6 +61,7 @@ static struct usb_driver usb_serial_driv
- drivers depend on it.
- */
-
-+static ushort maxSize = 0;
- static int debug;
- /* initially all NULL */
- static struct usb_serial *serial_table[SERIAL_TTY_MINORS];
-@@ -914,7 +915,7 @@ int usb_serial_probe(struct usb_interfac
- dev_err(&interface->dev, "No free urbs available\n");
- goto probe_error;
- }
-- buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
-+ buffer_size = (endpoint->wMaxPacketSize > maxSize) ? endpoint->wMaxPacketSize : maxSize;
- port->bulk_in_size = buffer_size;
- port->bulk_in_endpointAddress = endpoint->bEndpointAddress;
- port->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
-@@ -1356,3 +1357,5 @@ MODULE_LICENSE("GPL");
-
- module_param(debug, bool, S_IRUGO | S_IWUSR);
- MODULE_PARM_DESC(debug, "Debug enabled or not");
-+module_param(maxSize, ushort,0);
-+MODULE_PARM_DESC(maxSize,"User specified USB endpoint size");
+++ /dev/null
---- a/init/main.c
-+++ b/init/main.c
-@@ -807,7 +807,7 @@ static noinline int init_post(void)
- numa_default_policy();
-
- if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
-- printk(KERN_WARNING "Warning: unable to open an initial console.\n");
-+ printk(KERN_WARNING "Please be patient, while OpenWrt loads ...\n");
-
- (void) sys_dup(0);
- (void) sys_dup(0);
+++ /dev/null
---- a/scripts/genksyms/parse.c_shipped
-+++ b/scripts/genksyms/parse.c_shipped
-@@ -160,7 +160,9 @@
-
-
- #include <assert.h>
-+#ifndef __APPLE__
- #include <malloc.h>
-+#endif
- #include "genksyms.h"
-
- static int is_typedef;
---- a/scripts/genksyms/parse.y
-+++ b/scripts/genksyms/parse.y
-@@ -24,7 +24,9 @@
- %{
-
- #include <assert.h>
-+#ifndef __APPLE__
- #include <malloc.h>
-+#endif
- #include "genksyms.h"
-
- static int is_typedef;
---- a/scripts/kallsyms.c
-+++ b/scripts/kallsyms.c
-@@ -22,6 +22,35 @@
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
-+#ifdef __APPLE__
-+/* Darwin has no memmem implementation, this one is ripped of the uClibc-0.9.28 source */
-+void *memmem (const void *haystack, size_t haystack_len,
-+ const void *needle, size_t needle_len)
-+{
-+ const char *begin;
-+ const char *const last_possible
-+ = (const char *) haystack + haystack_len - needle_len;
-+
-+ if (needle_len == 0)
-+ /* The first occurrence of the empty string is deemed to occur at
-+ the beginning of the string. */
-+ return (void *) haystack;
-+
-+ /* Sanity check, otherwise the loop might search through the whole
-+ memory. */
-+ if (__builtin_expect (haystack_len < needle_len, 0))
-+ return NULL;
-+
-+ for (begin = (const char *) haystack; begin <= last_possible; ++begin)
-+ if (begin[0] == ((const char *) needle)[0] &&
-+ !memcmp ((const void *) &begin[1],
-+ (const void *) ((const char *) needle + 1),
-+ needle_len - 1))
-+ return (void *) begin;
-+
-+ return NULL;
-+}
-+#endif
-
- #ifndef ARRAY_SIZE
- #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
---- a/scripts/kconfig/Makefile
-+++ b/scripts/kconfig/Makefile
-@@ -130,6 +130,9 @@ check-lxdialog := $(srctree)/$(src)/lxd
- # we really need to do so. (Do not call gcc as part of make mrproper)
- HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
- HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
-+ifeq ($(shell uname -s),Darwin)
-+HOST_LOADLIBES += -lncurses
-+endif
-
- HOST_EXTRACFLAGS += -DLOCALE
-
---- a/scripts/mod/mk_elfconfig.c
-+++ b/scripts/mod/mk_elfconfig.c
-@@ -1,7 +1,11 @@
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-+#ifndef __APPLE__
- #include <elf.h>
-+#else
-+#include "../../../../../tools/sstrip/include/elf.h"
-+#endif
-
- int
- main(int argc, char **argv)
---- a/scripts/mod/modpost.h
-+++ b/scripts/mod/modpost.h
-@@ -7,7 +7,11 @@
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <unistd.h>
-+#if !(defined(__APPLE__) || defined(__CYGWIN__))
- #include <elf.h>
-+#else
-+#include "../../../../../tools/sstrip/include/elf.h"
-+#endif
-
- #include "elfconfig.h"
-
+++ /dev/null
---- a/drivers/net/wireless/hostap/hostap_ap.c
-+++ b/drivers/net/wireless/hostap/hostap_ap.c
-@@ -2335,13 +2335,13 @@ int prism2_ap_get_sta_qual(local_info_t
- addr[count].sa_family = ARPHRD_ETHER;
- memcpy(addr[count].sa_data, sta->addr, ETH_ALEN);
- if (sta->last_rx_silence == 0)
-- qual[count].qual = sta->last_rx_signal < 27 ?
-- 0 : (sta->last_rx_signal - 27) * 92 / 127;
-+ qual[count].qual = (sta->last_rx_signal - 156) == 0 ?
-+ 0 : (sta->last_rx_signal - 156) * 92 / 64;
- else
-- qual[count].qual = sta->last_rx_signal -
-- sta->last_rx_silence - 35;
-- qual[count].level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);
-- qual[count].noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);
-+ qual[count].qual = (sta->last_rx_signal -
-+ sta->last_rx_silence) * 92 / 64;
-+ qual[count].level = sta->last_rx_signal;
-+ qual[count].noise = sta->last_rx_silence;
- qual[count].updated = sta->last_rx_updated;
-
- sta->last_rx_updated = IW_QUAL_DBM;
-@@ -2407,13 +2407,13 @@ int prism2_ap_translate_scan(struct net_
- memset(&iwe, 0, sizeof(iwe));
- iwe.cmd = IWEVQUAL;
- if (sta->last_rx_silence == 0)
-- iwe.u.qual.qual = sta->last_rx_signal < 27 ?
-- 0 : (sta->last_rx_signal - 27) * 92 / 127;
-+ iwe.u.qual.qual = (sta->last_rx_signal -156) == 0 ?
-+ 0 : (sta->last_rx_signal - 156) * 92 / 64;
- else
-- iwe.u.qual.qual = sta->last_rx_signal -
-- sta->last_rx_silence - 35;
-- iwe.u.qual.level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);
-- iwe.u.qual.noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);
-+ iwe.u.qual.qual = (sta->last_rx_signal -
-+ sta->last_rx_silence) * 92 / 64;
-+ iwe.u.qual.level = sta->last_rx_signal;
-+ iwe.u.qual.noise = sta->last_rx_silence;
- iwe.u.qual.updated = sta->last_rx_updated;
- iwe.len = IW_EV_QUAL_LEN;
- current_ev = iwe_stream_add_event(info, current_ev, end_buf,
---- a/drivers/net/wireless/hostap/hostap_config.h
-+++ b/drivers/net/wireless/hostap/hostap_config.h
-@@ -45,4 +45,9 @@
- */
- /* #define PRISM2_NO_STATION_MODES */
-
-+/* Enable TX power Setting functions
-+ * (min att = -128 , max att = 127)
-+ */
-+#define RAW_TXPOWER_SETTING
-+
- #endif /* HOSTAP_CONFIG_H */
---- a/drivers/net/wireless/hostap/hostap.h
-+++ b/drivers/net/wireless/hostap/hostap.h
-@@ -90,6 +90,7 @@ extern const struct iw_handler_def hosta
- extern const struct ethtool_ops prism2_ethtool_ops;
-
- int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
-+int hostap_restore_power(struct net_device *dev);
-
-
- #endif /* HOSTAP_H */
---- a/drivers/net/wireless/hostap/hostap_hw.c
-+++ b/drivers/net/wireless/hostap/hostap_hw.c
-@@ -932,6 +932,7 @@ static int hfa384x_set_rid(struct net_de
- prism2_hw_reset(dev);
- }
-
-+ hostap_restore_power(dev);
- return res;
- }
-
---- a/drivers/net/wireless/hostap/hostap_info.c
-+++ b/drivers/net/wireless/hostap/hostap_info.c
-@@ -432,6 +432,11 @@ static void handle_info_queue_linkstatus
- }
-
- /* Get BSSID if we have a valid AP address */
-+
-+ if ( val == HFA384X_LINKSTATUS_CONNECTED ||
-+ val == HFA384X_LINKSTATUS_DISCONNECTED )
-+ hostap_restore_power(local->dev);
-+
- if (connected) {
- netif_carrier_on(local->dev);
- netif_carrier_on(local->ddev);
---- a/drivers/net/wireless/hostap/hostap_ioctl.c
-+++ b/drivers/net/wireless/hostap/hostap_ioctl.c
-@@ -1476,23 +1476,20 @@ static int prism2_txpower_hfa386x_to_dBm
- val = 255;
-
- tmp = val;
-- tmp >>= 2;
-
-- return -12 - tmp;
-+ return tmp;
- }
-
- static u16 prism2_txpower_dBm_to_hfa386x(int val)
- {
- signed char tmp;
-
-- if (val > 20)
-- return 128;
-- else if (val < -43)
-+ if (val > 127)
- return 127;
-+ else if (val < -128)
-+ return 128;
-
- tmp = val;
-- tmp = -12 - tmp;
-- tmp <<= 2;
-
- return (unsigned char) tmp;
- }
-@@ -4056,3 +4053,35 @@ int hostap_ioctl(struct net_device *dev,
-
- return ret;
- }
-+
-+/* BUG FIX: Restore power setting value when lost due to F/W bug */
-+
-+int hostap_restore_power(struct net_device *dev)
-+{
-+ struct hostap_interface *iface = netdev_priv(dev);
-+ local_info_t *local = iface->local;
-+
-+ u16 val;
-+ int ret = 0;
-+
-+ if (local->txpower_type == PRISM2_TXPOWER_OFF) {
-+ val = 0xff; /* use all standby and sleep modes */
-+ ret = local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
-+ HFA386X_CR_A_D_TEST_MODES2,
-+ &val, NULL);
-+ }
-+
-+#ifdef RAW_TXPOWER_SETTING
-+ if (local->txpower_type == PRISM2_TXPOWER_FIXED) {
-+ val = HFA384X_TEST_CFG_BIT_ALC;
-+ local->func->cmd(dev, HFA384X_CMDCODE_TEST |
-+ (HFA384X_TEST_CFG_BITS << 8), 0, &val, NULL);
-+ val = prism2_txpower_dBm_to_hfa386x(local->txpower);
-+ ret = (local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
-+ HFA386X_CR_MANUAL_TX_POWER, &val, NULL));
-+ }
-+#endif /* RAW_TXPOWER_SETTING */
-+ return (ret ? -EOPNOTSUPP : 0);
-+}
-+
-+EXPORT_SYMBOL(hostap_restore_power);
+++ /dev/null
---- a/include/linux/stddef.h
-+++ b/include/linux/stddef.h
-@@ -16,6 +16,7 @@ enum {
- false = 0,
- true = 1
- };
-+#endif /* __KERNEL__ */
-
- #undef offsetof
- #ifdef __compiler_offsetof
-@@ -23,6 +24,5 @@ enum {
- #else
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
- #endif
--#endif /* __KERNEL__ */
-
- #endif
+++ /dev/null
---- a/arch/x86/boot/tools/build.c
-+++ b/arch/x86/boot/tools/build.c
-@@ -29,7 +29,6 @@
- #include <stdarg.h>
- #include <sys/types.h>
- #include <sys/stat.h>
--#include <sys/sysmacros.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/mman.h>
+++ /dev/null
-Fix spi-gpio for hotplug.
-
---mb
-
-
-
---- a/drivers/spi/spi_gpio.c
-+++ b/drivers/spi/spi_gpio.c
-@@ -218,7 +218,7 @@ static void spi_gpio_cleanup(struct spi_
- spi_bitbang_cleanup(spi);
- }
-
--static int __init spi_gpio_alloc(unsigned pin, const char *label, bool is_in)
-+static int __devinit spi_gpio_alloc(unsigned pin, const char *label, bool is_in)
- {
- int value;
-
-@@ -232,7 +232,7 @@ static int __init spi_gpio_alloc(unsigne
- return value;
- }
-
--static int __init
-+static int __devinit
- spi_gpio_request(struct spi_gpio_platform_data *pdata, const char *label)
- {
- int value;
-@@ -261,7 +261,7 @@ done:
- return value;
- }
-
--static int __init spi_gpio_probe(struct platform_device *pdev)
-+static int __devinit spi_gpio_probe(struct platform_device *pdev)
- {
- int status;
- struct spi_master *master;
-@@ -317,7 +317,7 @@ gpio_free:
- return status;
- }
-
--static int __exit spi_gpio_remove(struct platform_device *pdev)
-+static int __devexit spi_gpio_remove(struct platform_device *pdev)
- {
- struct spi_gpio *spi_gpio;
- struct spi_gpio_platform_data *pdata;
-@@ -344,12 +344,13 @@ MODULE_ALIAS("platform:" DRIVER_NAME);
- static struct platform_driver spi_gpio_driver = {
- .driver.name = DRIVER_NAME,
- .driver.owner = THIS_MODULE,
-- .remove = __exit_p(spi_gpio_remove),
-+ .probe = spi_gpio_probe,
-+ .remove = __devexit_p(spi_gpio_remove),
- };
-
- static int __init spi_gpio_init(void)
- {
-- return platform_driver_probe(&spi_gpio_driver, spi_gpio_probe);
-+ return platform_driver_register(&spi_gpio_driver);
- }
- module_init(spi_gpio_init);
-
+++ /dev/null
-Implement the SPI-GPIO delay function for busses that need speed limitation.
-
---mb
-
-
-
---- a/drivers/spi/spi_gpio.c
-+++ b/drivers/spi/spi_gpio.c
-@@ -21,6 +21,7 @@
- #include <linux/init.h>
- #include <linux/platform_device.h>
- #include <linux/gpio.h>
-+#include <linux/delay.h>
-
- #include <linux/spi/spi.h>
- #include <linux/spi/spi_bitbang.h>
-@@ -69,6 +70,7 @@ struct spi_gpio {
- * #define SPI_MOSI_GPIO 120
- * #define SPI_SCK_GPIO 121
- * #define SPI_N_CHIPSEL 4
-+ * #undef NEED_SPIDELAY
- * #include "spi_gpio.c"
- */
-
-@@ -76,6 +78,7 @@ struct spi_gpio {
- #define DRIVER_NAME "spi_gpio"
-
- #define GENERIC_BITBANG /* vs tight inlines */
-+#define NEED_SPIDELAY 1
-
- /* all functions referencing these symbols must define pdata */
- #define SPI_MISO_GPIO ((pdata)->miso)
-@@ -120,12 +123,20 @@ static inline int getmiso(const struct s
- #undef pdata
-
- /*
-- * NOTE: this clocks "as fast as we can". It "should" be a function of the
-- * requested device clock. Software overhead means we usually have trouble
-- * reaching even one Mbit/sec (except when we can inline bitops), so for now
-- * we'll just assume we never need additional per-bit slowdowns.
-+ * NOTE: to clock "as fast as we can", set spi_device.max_speed_hz
-+ * and spi_transfer.speed_hz to 0.
-+ * Otherwise this is a function of the requested device clock.
-+ * Software overhead means we usually have trouble
-+ * reaching even one Mbit/sec (except when we can inline bitops). So on small
-+ * embedded devices with fast SPI slaves you usually don't need a delay.
- */
--#define spidelay(nsecs) do {} while (0)
-+static inline void spidelay(unsigned nsecs)
-+{
-+#ifdef NEED_SPIDELAY
-+ if (unlikely(nsecs))
-+ ndelay(nsecs);
-+#endif /* NEED_SPIDELAY */
-+}
-
- #define EXPAND_BITBANG_TXRX
- #include <linux/spi/spi_bitbang.h>
+++ /dev/null
-THIS CODE IS DEPRECATED.
-
-Please use the new mainline SPI-GPIO driver, as of 2.6.29.
-
---mb
-
-
-
---- /dev/null
-+++ b/include/linux/spi/spi_gpio_old.h
-@@ -0,0 +1,73 @@
-+/*
-+ * spi_gpio interface to platform code
-+ *
-+ * Copyright (c) 2008 Piotr Skamruk
-+ * Copyright (c) 2008 Michael Buesch
-+ *
-+ * This program is free software; you can 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 _LINUX_SPI_SPI_GPIO
-+#define _LINUX_SPI_SPI_GPIO
-+
-+#include <linux/types.h>
-+#include <linux/spi/spi.h>
-+
-+
-+/**
-+ * struct spi_gpio_platform_data - Data definitions for a SPI-GPIO device.
-+ *
-+ * This structure holds information about a GPIO-based SPI device.
-+ *
-+ * @pin_clk: The GPIO pin number of the CLOCK pin.
-+ *
-+ * @pin_miso: The GPIO pin number of the MISO pin.
-+ *
-+ * @pin_mosi: The GPIO pin number of the MOSI pin.
-+ *
-+ * @pin_cs: The GPIO pin number of the CHIPSELECT pin.
-+ *
-+ * @cs_activelow: If true, the chip is selected when the CS line is low.
-+ *
-+ * @no_spi_delay: If true, no delay is done in the lowlevel bitbanging.
-+ * Note that doing no delay is not standards compliant,
-+ * but it might be needed to speed up transfers on some
-+ * slow embedded machines.
-+ *
-+ * @boardinfo_setup: This callback is called after the
-+ * SPI master device was registered, but before the
-+ * device is registered.
-+ * @boardinfo_setup_data: Data argument passed to boardinfo_setup().
-+ */
-+struct spi_gpio_platform_data {
-+ unsigned int pin_clk;
-+ unsigned int pin_miso;
-+ unsigned int pin_mosi;
-+ unsigned int pin_cs;
-+ bool cs_activelow;
-+ bool no_spi_delay;
-+ int (*boardinfo_setup)(struct spi_board_info *bi,
-+ struct spi_master *master,
-+ void *data);
-+ void *boardinfo_setup_data;
-+};
-+
-+/**
-+ * SPI_GPIO_PLATDEV_NAME - The platform device name string.
-+ *
-+ * The name string that has to be used for platform_device_alloc
-+ * when allocating a spi-gpio device.
-+ */
-+#define SPI_GPIO_PLATDEV_NAME "spi-gpio"
-+
-+/**
-+ * spi_gpio_next_id - Get another platform device ID number.
-+ *
-+ * This returns the next platform device ID number that has to be used
-+ * for platform_device_alloc. The ID is opaque and should not be used for
-+ * anything else.
-+ */
-+int spi_gpio_next_id(void);
-+
-+#endif /* _LINUX_SPI_SPI_GPIO */
---- /dev/null
-+++ b/drivers/spi/spi_gpio_old.c
-@@ -0,0 +1,251 @@
-+/*
-+ * Bitbanging SPI bus driver using GPIO API
-+ *
-+ * Copyright (c) 2008 Piotr Skamruk
-+ * Copyright (c) 2008 Michael Buesch
-+ *
-+ * based on spi_s3c2410_gpio.c
-+ * Copyright (c) 2006 Ben Dooks
-+ * Copyright (c) 2006 Simtec Electronics
-+ * and on i2c-gpio.c
-+ * Copyright (C) 2007 Atmel Corporation
-+ *
-+ * This program is free software; you can 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/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/spi/spi.h>
-+#include <linux/spi/spi_bitbang.h>
-+#include <linux/spi/spi_gpio_old.h>
-+#include <linux/gpio.h>
-+#include <asm/atomic.h>
-+
-+
-+struct spi_gpio {
-+ struct spi_bitbang bitbang;
-+ struct spi_gpio_platform_data *info;
-+ struct platform_device *pdev;
-+ struct spi_board_info bi;
-+};
-+
-+
-+static inline struct spi_gpio *spidev_to_sg(struct spi_device *dev)
-+{
-+ return dev->controller_data;
-+}
-+
-+static inline void setsck(struct spi_device *dev, int val)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+ gpio_set_value(sp->info->pin_clk, val ? 1 : 0);
-+}
-+
-+static inline void setmosi(struct spi_device *dev, int val)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+ gpio_set_value(sp->info->pin_mosi, val ? 1 : 0);
-+}
-+
-+static inline u32 getmiso(struct spi_device *dev)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+ return gpio_get_value(sp->info->pin_miso) ? 1 : 0;
-+}
-+
-+static inline void do_spidelay(struct spi_device *dev, unsigned nsecs)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+
-+ if (!sp->info->no_spi_delay)
-+ ndelay(nsecs);
-+}
-+
-+#define spidelay(nsecs) do { \
-+ /* Steal the spi_device pointer from our caller. \
-+ * The bitbang-API should probably get fixed here... */ \
-+ do_spidelay(spi, nsecs); \
-+ } while (0)
-+
-+#define EXPAND_BITBANG_TXRX
-+#include <linux/spi/spi_bitbang.h>
-+
-+static u32 spi_gpio_txrx_mode0(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
-+}
-+
-+static u32 spi_gpio_txrx_mode1(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits);
-+}
-+
-+static u32 spi_gpio_txrx_mode2(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits);
-+}
-+
-+static u32 spi_gpio_txrx_mode3(struct spi_device *spi,
-+ unsigned nsecs, u32 word, u8 bits)
-+{
-+ return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits);
-+}
-+
-+static void spi_gpio_chipselect(struct spi_device *dev, int on)
-+{
-+ struct spi_gpio *sp = spidev_to_sg(dev);
-+
-+ if (sp->info->cs_activelow)
-+ on = !on;
-+ gpio_set_value(sp->info->pin_cs, on ? 1 : 0);
-+}
-+
-+static int spi_gpio_probe(struct platform_device *pdev)
-+{
-+ struct spi_master *master;
-+ struct spi_gpio_platform_data *pdata;
-+ struct spi_gpio *sp;
-+ struct spi_device *spidev;
-+ int err;
-+
-+ pdata = pdev->dev.platform_data;
-+ if (!pdata)
-+ return -ENXIO;
-+
-+ err = -ENOMEM;
-+ master = spi_alloc_master(&pdev->dev, sizeof(struct spi_gpio));
-+ if (!master)
-+ goto err_alloc_master;
-+
-+ sp = spi_master_get_devdata(master);
-+ platform_set_drvdata(pdev, sp);
-+ sp->info = pdata;
-+
-+ err = gpio_request(pdata->pin_clk, "spi_clock");
-+ if (err)
-+ goto err_request_clk;
-+ err = gpio_request(pdata->pin_mosi, "spi_mosi");
-+ if (err)
-+ goto err_request_mosi;
-+ err = gpio_request(pdata->pin_miso, "spi_miso");
-+ if (err)
-+ goto err_request_miso;
-+ err = gpio_request(pdata->pin_cs, "spi_cs");
-+ if (err)
-+ goto err_request_cs;
-+
-+ sp->bitbang.master = spi_master_get(master);
-+ sp->bitbang.master->bus_num = -1;
-+ sp->bitbang.master->num_chipselect = 1;
-+ sp->bitbang.chipselect = spi_gpio_chipselect;
-+ sp->bitbang.txrx_word[SPI_MODE_0] = spi_gpio_txrx_mode0;
-+ sp->bitbang.txrx_word[SPI_MODE_1] = spi_gpio_txrx_mode1;
-+ sp->bitbang.txrx_word[SPI_MODE_2] = spi_gpio_txrx_mode2;
-+ sp->bitbang.txrx_word[SPI_MODE_3] = spi_gpio_txrx_mode3;
-+
-+ gpio_direction_output(pdata->pin_clk, 0);
-+ gpio_direction_output(pdata->pin_mosi, 0);
-+ gpio_direction_output(pdata->pin_cs,
-+ pdata->cs_activelow ? 1 : 0);
-+ gpio_direction_input(pdata->pin_miso);
-+
-+ err = spi_bitbang_start(&sp->bitbang);
-+ if (err)
-+ goto err_no_bitbang;
-+ err = pdata->boardinfo_setup(&sp->bi, master,
-+ pdata->boardinfo_setup_data);
-+ if (err)
-+ goto err_bi_setup;
-+ sp->bi.controller_data = sp;
-+ spidev = spi_new_device(master, &sp->bi);
-+ if (!spidev)
-+ goto err_new_dev;
-+
-+ return 0;
-+
-+err_new_dev:
-+err_bi_setup:
-+ spi_bitbang_stop(&sp->bitbang);
-+err_no_bitbang:
-+ spi_master_put(sp->bitbang.master);
-+ gpio_free(pdata->pin_cs);
-+err_request_cs:
-+ gpio_free(pdata->pin_miso);
-+err_request_miso:
-+ gpio_free(pdata->pin_mosi);
-+err_request_mosi:
-+ gpio_free(pdata->pin_clk);
-+err_request_clk:
-+ kfree(master);
-+
-+err_alloc_master:
-+ return err;
-+}
-+
-+static int __devexit spi_gpio_remove(struct platform_device *pdev)
-+{
-+ struct spi_gpio *sp;
-+ struct spi_gpio_platform_data *pdata;
-+
-+ pdata = pdev->dev.platform_data;
-+ sp = platform_get_drvdata(pdev);
-+
-+ gpio_free(pdata->pin_clk);
-+ gpio_free(pdata->pin_mosi);
-+ gpio_free(pdata->pin_miso);
-+ gpio_free(pdata->pin_cs);
-+ spi_bitbang_stop(&sp->bitbang);
-+ spi_master_put(sp->bitbang.master);
-+
-+ return 0;
-+}
-+
-+static struct platform_driver spi_gpio_driver = {
-+ .driver = {
-+ .name = SPI_GPIO_PLATDEV_NAME,
-+ .owner = THIS_MODULE,
-+ },
-+ .probe = spi_gpio_probe,
-+ .remove = __devexit_p(spi_gpio_remove),
-+};
-+
-+int spi_gpio_next_id(void)
-+{
-+ static atomic_t counter = ATOMIC_INIT(-1);
-+
-+ return atomic_inc_return(&counter);
-+}
-+EXPORT_SYMBOL(spi_gpio_next_id);
-+
-+static int __init spi_gpio_init(void)
-+{
-+ int err;
-+
-+ err = platform_driver_register(&spi_gpio_driver);
-+ if (err)
-+ printk(KERN_ERR "spi-gpio: register failed: %d\n", err);
-+
-+ return err;
-+}
-+module_init(spi_gpio_init);
-+
-+static void __exit spi_gpio_exit(void)
-+{
-+ platform_driver_unregister(&spi_gpio_driver);
-+}
-+module_exit(spi_gpio_exit);
-+
-+MODULE_AUTHOR("Piot Skamruk <piotr.skamruk at gmail.com>");
-+MODULE_AUTHOR("Michael Buesch");
-+MODULE_DESCRIPTION("Platform independent GPIO bitbanging SPI driver");
-+MODULE_LICENSE("GPL v2");
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -116,6 +116,15 @@ config SPI_GPIO
- GPIO operations, you should be able to leverage that for better
- speed with a custom version of this driver; see the source code.
-
-+config SPI_GPIO_OLD
-+ tristate "Old GPIO API based bitbanging SPI controller (DEPRECATED)"
-+ depends on SPI_MASTER && GENERIC_GPIO
-+ select SPI_BITBANG
-+ help
-+ This code is deprecated. Please use the new mainline SPI-GPIO driver.
-+
-+ If unsure, say N.
-+
- config SPI_IMX
- tristate "Freescale i.MX SPI controllers"
- depends on ARCH_MXC
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -19,6 +19,7 @@ obj-$(CONFIG_SPI_BUTTERFLY) += spi_butt
- obj-$(CONFIG_SPI_DESIGNWARE) += dw_spi.o
- obj-$(CONFIG_SPI_DW_PCI) += dw_spi_pci.o
- obj-$(CONFIG_SPI_GPIO) += spi_gpio.o
-+obj-$(CONFIG_SPI_GPIO_OLD) += spi_gpio_old.o
- obj-$(CONFIG_SPI_IMX) += spi_imx.o
- obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o
- obj-$(CONFIG_SPI_PXA2XX) += pxa2xx_spi.o
+++ /dev/null
---- /dev/null
-+++ b/drivers/mmc/host/gpiommc.c
-@@ -0,0 +1,608 @@
-+/*
-+ * Driver an MMC/SD card on a bitbanging GPIO SPI bus.
-+ * This module hooks up the mmc_spi and spi_gpio modules and also
-+ * provides a configfs interface.
-+ *
-+ * Copyright 2008 Michael Buesch <mb@bu3sch.de>
-+ *
-+ * Licensed under the GNU/GPL. See COPYING for details.
-+ */
-+
-+#include <linux/mmc/gpiommc.h>
-+#include <linux/platform_device.h>
-+#include <linux/list.h>
-+#include <linux/mutex.h>
-+#include <linux/spi/spi_gpio_old.h>
-+#include <linux/configfs.h>
-+#include <linux/gpio.h>
-+#include <asm/atomic.h>
-+
-+
-+#define PFX "gpio-mmc: "
-+
-+
-+struct gpiommc_device {
-+ struct platform_device *pdev;
-+ struct platform_device *spi_pdev;
-+ struct spi_board_info boardinfo;
-+};
-+
-+
-+MODULE_DESCRIPTION("GPIO based MMC driver");
-+MODULE_AUTHOR("Michael Buesch");
-+MODULE_LICENSE("GPL");
-+
-+
-+static int gpiommc_boardinfo_setup(struct spi_board_info *bi,
-+ struct spi_master *master,
-+ void *data)
-+{
-+ struct gpiommc_device *d = data;
-+ struct gpiommc_platform_data *pdata = d->pdev->dev.platform_data;
-+
-+ /* Bind the SPI master to the MMC-SPI host driver. */
-+ strlcpy(bi->modalias, "mmc_spi", sizeof(bi->modalias));
-+
-+ bi->max_speed_hz = pdata->max_bus_speed;
-+ bi->bus_num = master->bus_num;
-+ bi->mode = pdata->mode;
-+
-+ return 0;
-+}
-+
-+static int gpiommc_probe(struct platform_device *pdev)
-+{
-+ struct gpiommc_platform_data *mmc_pdata = pdev->dev.platform_data;
-+ struct spi_gpio_platform_data spi_pdata;
-+ struct gpiommc_device *d;
-+ int err;
-+
-+ err = -ENXIO;
-+ if (!mmc_pdata)
-+ goto error;
-+
-+#ifdef CONFIG_MMC_SPI_MODULE
-+ err = request_module("mmc_spi");
-+ if (err) {
-+ printk(KERN_WARNING PFX
-+ "Failed to request mmc_spi module.\n");
-+ }
-+#endif /* CONFIG_MMC_SPI_MODULE */
-+
-+ /* Allocate the GPIO-MMC device */
-+ err = -ENOMEM;
-+ d = kzalloc(sizeof(*d), GFP_KERNEL);
-+ if (!d)
-+ goto error;
-+ d->pdev = pdev;
-+
-+ /* Create the SPI-GPIO device */
-+ d->spi_pdev = platform_device_alloc(SPI_GPIO_PLATDEV_NAME,
-+ spi_gpio_next_id());
-+ if (!d->spi_pdev)
-+ goto err_free_d;
-+
-+ memset(&spi_pdata, 0, sizeof(spi_pdata));
-+ spi_pdata.pin_clk = mmc_pdata->pins.gpio_clk;
-+ spi_pdata.pin_miso = mmc_pdata->pins.gpio_do;
-+ spi_pdata.pin_mosi = mmc_pdata->pins.gpio_di;
-+ spi_pdata.pin_cs = mmc_pdata->pins.gpio_cs;
-+ spi_pdata.cs_activelow = mmc_pdata->pins.cs_activelow;
-+ spi_pdata.no_spi_delay = mmc_pdata->no_spi_delay;
-+ spi_pdata.boardinfo_setup = gpiommc_boardinfo_setup;
-+ spi_pdata.boardinfo_setup_data = d;
-+
-+ err = platform_device_add_data(d->spi_pdev, &spi_pdata,
-+ sizeof(spi_pdata));
-+ if (err)
-+ goto err_free_pdev;
-+ err = platform_device_add(d->spi_pdev);
-+ if (err)
-+ goto err_free_pdata;
-+ platform_set_drvdata(pdev, d);
-+
-+ printk(KERN_INFO PFX "MMC-Card \"%s\" "
-+ "attached to GPIO pins di=%u, do=%u, clk=%u, cs=%u\n",
-+ mmc_pdata->name, mmc_pdata->pins.gpio_di,
-+ mmc_pdata->pins.gpio_do,
-+ mmc_pdata->pins.gpio_clk,
-+ mmc_pdata->pins.gpio_cs);
-+
-+ return 0;
-+
-+err_free_pdata:
-+ kfree(d->spi_pdev->dev.platform_data);
-+ d->spi_pdev->dev.platform_data = NULL;
-+err_free_pdev:
-+ platform_device_put(d->spi_pdev);
-+err_free_d:
-+ kfree(d);
-+error:
-+ return err;
-+}
-+
-+static int gpiommc_remove(struct platform_device *pdev)
-+{
-+ struct gpiommc_device *d = platform_get_drvdata(pdev);
-+ struct gpiommc_platform_data *pdata = d->pdev->dev.platform_data;
-+
-+ platform_device_unregister(d->spi_pdev);
-+ printk(KERN_INFO PFX "GPIO based MMC-Card \"%s\" removed\n",
-+ pdata->name);
-+ platform_device_put(d->spi_pdev);
-+
-+ return 0;
-+}
-+
-+#ifdef CONFIG_GPIOMMC_CONFIGFS
-+
-+/* A device that was created through configfs */
-+struct gpiommc_configfs_device {
-+ struct config_item item;
-+ /* The platform device, after registration. */
-+ struct platform_device *pdev;
-+ /* The configuration */
-+ struct gpiommc_platform_data pdata;
-+};
-+
-+#define GPIO_INVALID -1
-+
-+static inline bool gpiommc_is_registered(struct gpiommc_configfs_device *dev)
-+{
-+ return (dev->pdev != NULL);
-+}
-+
-+static inline struct gpiommc_configfs_device *ci_to_gpiommc(struct config_item *item)
-+{
-+ return item ? container_of(item, struct gpiommc_configfs_device, item) : NULL;
-+}
-+
-+static struct configfs_attribute gpiommc_attr_DI = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_data_in",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_DO = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_data_out",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_CLK = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_clock",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_CS = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_chipselect",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_CS_activelow = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "gpio_chipselect_activelow",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_spimode = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "spi_mode",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_spidelay = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "spi_delay",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_max_bus_speed = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "max_bus_speed",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute gpiommc_attr_register = {
-+ .ca_owner = THIS_MODULE,
-+ .ca_name = "register",
-+ .ca_mode = S_IRUGO | S_IWUSR,
-+};
-+
-+static struct configfs_attribute *gpiommc_config_attrs[] = {
-+ &gpiommc_attr_DI,
-+ &gpiommc_attr_DO,
-+ &gpiommc_attr_CLK,
-+ &gpiommc_attr_CS,
-+ &gpiommc_attr_CS_activelow,
-+ &gpiommc_attr_spimode,
-+ &gpiommc_attr_spidelay,
-+ &gpiommc_attr_max_bus_speed,
-+ &gpiommc_attr_register,
-+ NULL,
-+};
-+
-+static ssize_t gpiommc_config_attr_show(struct config_item *item,
-+ struct configfs_attribute *attr,
-+ char *page)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+ ssize_t count = 0;
-+ unsigned int gpio;
-+ int err = 0;
-+
-+ if (attr == &gpiommc_attr_DI) {
-+ gpio = dev->pdata.pins.gpio_di;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_DO) {
-+ gpio = dev->pdata.pins.gpio_do;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CLK) {
-+ gpio = dev->pdata.pins.gpio_clk;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS) {
-+ gpio = dev->pdata.pins.gpio_cs;
-+ if (gpio == GPIO_INVALID)
-+ count = snprintf(page, PAGE_SIZE, "not configured\n");
-+ else
-+ count = snprintf(page, PAGE_SIZE, "%u\n", gpio);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS_activelow) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ dev->pdata.pins.cs_activelow);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spimode) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ dev->pdata.mode);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spidelay) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ !dev->pdata.no_spi_delay);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_max_bus_speed) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ dev->pdata.max_bus_speed);
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_register) {
-+ count = snprintf(page, PAGE_SIZE, "%u\n",
-+ gpiommc_is_registered(dev));
-+ goto out;
-+ }
-+ WARN_ON(1);
-+ err = -ENOSYS;
-+out:
-+ return err ? err : count;
-+}
-+
-+static int gpiommc_do_register(struct gpiommc_configfs_device *dev,
-+ const char *name)
-+{
-+ int err;
-+
-+ if (gpiommc_is_registered(dev))
-+ return 0;
-+
-+ if (!gpio_is_valid(dev->pdata.pins.gpio_di) ||
-+ !gpio_is_valid(dev->pdata.pins.gpio_do) ||
-+ !gpio_is_valid(dev->pdata.pins.gpio_clk) ||
-+ !gpio_is_valid(dev->pdata.pins.gpio_cs)) {
-+ printk(KERN_ERR PFX
-+ "configfs: Invalid GPIO pin number(s)\n");
-+ return -EINVAL;
-+ }
-+
-+ strlcpy(dev->pdata.name, name,
-+ sizeof(dev->pdata.name));
-+
-+ dev->pdev = platform_device_alloc(GPIOMMC_PLATDEV_NAME,
-+ gpiommc_next_id());
-+ if (!dev->pdev)
-+ return -ENOMEM;
-+ err = platform_device_add_data(dev->pdev, &dev->pdata,
-+ sizeof(dev->pdata));
-+ if (err) {
-+ platform_device_put(dev->pdev);
-+ return err;
-+ }
-+ err = platform_device_add(dev->pdev);
-+ if (err) {
-+ platform_device_put(dev->pdev);
-+ return err;
-+ }
-+
-+ return 0;
-+}
-+
-+static void gpiommc_do_unregister(struct gpiommc_configfs_device *dev)
-+{
-+ if (!gpiommc_is_registered(dev))
-+ return;
-+
-+ platform_device_unregister(dev->pdev);
-+ dev->pdev = NULL;
-+}
-+
-+static ssize_t gpiommc_config_attr_store(struct config_item *item,
-+ struct configfs_attribute *attr,
-+ const char *page, size_t count)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+ int err = -EINVAL;
-+ unsigned long data;
-+
-+ if (attr == &gpiommc_attr_register) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data == 1)
-+ err = gpiommc_do_register(dev, item->ci_name);
-+ if (data == 0) {
-+ gpiommc_do_unregister(dev);
-+ err = 0;
-+ }
-+ goto out;
-+ }
-+
-+ if (gpiommc_is_registered(dev)) {
-+ /* The rest of the config parameters can only be set
-+ * as long as the device is not registered, yet. */
-+ err = -EBUSY;
-+ goto out;
-+ }
-+
-+ if (attr == &gpiommc_attr_DI) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_di = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_DO) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_do = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CLK) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_clk = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (!gpio_is_valid(data))
-+ goto out;
-+ dev->pdata.pins.gpio_cs = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_CS_activelow) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data != 0 && data != 1)
-+ goto out;
-+ dev->pdata.pins.cs_activelow = data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spimode) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ switch (data) {
-+ case 0:
-+ dev->pdata.mode = SPI_MODE_0;
-+ break;
-+ case 1:
-+ dev->pdata.mode = SPI_MODE_1;
-+ break;
-+ case 2:
-+ dev->pdata.mode = SPI_MODE_2;
-+ break;
-+ case 3:
-+ dev->pdata.mode = SPI_MODE_3;
-+ break;
-+ default:
-+ goto out;
-+ }
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_spidelay) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data != 0 && data != 1)
-+ goto out;
-+ dev->pdata.no_spi_delay = !data;
-+ err = 0;
-+ goto out;
-+ }
-+ if (attr == &gpiommc_attr_max_bus_speed) {
-+ err = strict_strtoul(page, 10, &data);
-+ if (err)
-+ goto out;
-+ err = -EINVAL;
-+ if (data > UINT_MAX)
-+ goto out;
-+ dev->pdata.max_bus_speed = data;
-+ err = 0;
-+ goto out;
-+ }
-+ WARN_ON(1);
-+ err = -ENOSYS;
-+out:
-+ return err ? err : count;
-+}
-+
-+static void gpiommc_config_item_release(struct config_item *item)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+
-+ kfree(dev);
-+}
-+
-+static struct configfs_item_operations gpiommc_config_item_ops = {
-+ .release = gpiommc_config_item_release,
-+ .show_attribute = gpiommc_config_attr_show,
-+ .store_attribute = gpiommc_config_attr_store,
-+};
-+
-+static struct config_item_type gpiommc_dev_ci_type = {
-+ .ct_item_ops = &gpiommc_config_item_ops,
-+ .ct_attrs = gpiommc_config_attrs,
-+ .ct_owner = THIS_MODULE,
-+};
-+
-+static struct config_item *gpiommc_make_item(struct config_group *group,
-+ const char *name)
-+{
-+ struct gpiommc_configfs_device *dev;
-+
-+ if (strlen(name) > GPIOMMC_MAX_NAMELEN) {
-+ printk(KERN_ERR PFX "configfs: device name too long\n");
-+ return NULL;
-+ }
-+
-+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-+ if (!dev)
-+ return NULL;
-+
-+ config_item_init_type_name(&dev->item, name,
-+ &gpiommc_dev_ci_type);
-+
-+ /* Assign default configuration */
-+ dev->pdata.pins.gpio_di = GPIO_INVALID;
-+ dev->pdata.pins.gpio_do = GPIO_INVALID;
-+ dev->pdata.pins.gpio_clk = GPIO_INVALID;
-+ dev->pdata.pins.gpio_cs = GPIO_INVALID;
-+ dev->pdata.pins.cs_activelow = 1;
-+ dev->pdata.mode = SPI_MODE_0;
-+ dev->pdata.no_spi_delay = 0;
-+ dev->pdata.max_bus_speed = 5000000; /* 5 MHz */
-+
-+ return &(dev->item);
-+}
-+
-+static void gpiommc_drop_item(struct config_group *group,
-+ struct config_item *item)
-+{
-+ struct gpiommc_configfs_device *dev = ci_to_gpiommc(item);
-+
-+ gpiommc_do_unregister(dev);
-+ kfree(dev);
-+}
-+
-+static struct configfs_group_operations gpiommc_ct_group_ops = {
-+ .make_item = gpiommc_make_item,
-+ .drop_item = gpiommc_drop_item,
-+};
-+
-+static struct config_item_type gpiommc_ci_type = {
-+ .ct_group_ops = &gpiommc_ct_group_ops,
-+ .ct_owner = THIS_MODULE,
-+};
-+
-+static struct configfs_subsystem gpiommc_subsys = {
-+ .su_group = {
-+ .cg_item = {
-+ .ci_namebuf = GPIOMMC_PLATDEV_NAME,
-+ .ci_type = &gpiommc_ci_type,
-+ },
-+ },
-+ .su_mutex = __MUTEX_INITIALIZER(gpiommc_subsys.su_mutex),
-+};
-+
-+#endif /* CONFIG_GPIOMMC_CONFIGFS */
-+
-+static struct platform_driver gpiommc_plat_driver = {
-+ .probe = gpiommc_probe,
-+ .remove = gpiommc_remove,
-+ .driver = {
-+ .name = GPIOMMC_PLATDEV_NAME,
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+int gpiommc_next_id(void)
-+{
-+ static atomic_t counter = ATOMIC_INIT(-1);
-+
-+ return atomic_inc_return(&counter);
-+}
-+EXPORT_SYMBOL(gpiommc_next_id);
-+
-+static int __init gpiommc_modinit(void)
-+{
-+ int err;
-+
-+ err = platform_driver_register(&gpiommc_plat_driver);
-+ if (err)
-+ return err;
-+
-+#ifdef CONFIG_GPIOMMC_CONFIGFS
-+ config_group_init(&gpiommc_subsys.su_group);
-+ err = configfs_register_subsystem(&gpiommc_subsys);
-+ if (err) {
-+ platform_driver_unregister(&gpiommc_plat_driver);
-+ return err;
-+ }
-+#endif /* CONFIG_GPIOMMC_CONFIGFS */
-+
-+ return 0;
-+}
-+module_init(gpiommc_modinit);
-+
-+static void __exit gpiommc_modexit(void)
-+{
-+#ifdef CONFIG_GPIOMMC_CONFIGFS
-+ configfs_unregister_subsystem(&gpiommc_subsys);
-+#endif
-+ platform_driver_unregister(&gpiommc_plat_driver);
-+}
-+module_exit(gpiommc_modexit);
---- a/drivers/mmc/host/Kconfig
-+++ b/drivers/mmc/host/Kconfig
-@@ -373,6 +373,31 @@ config MMC_TMIO
- This provides support for the SD/MMC cell found in TC6393XB,
- T7L66XB and also HTC ASIC3
-
-+config GPIOMMC
-+ tristate "MMC/SD over GPIO-based SPI"
-+ depends on MMC && MMC_SPI && SPI_GPIO_OLD
-+ help
-+ This driver hooks up the mmc_spi and spi_gpio modules so that
-+ MMC/SD cards can be used on a GPIO based bus by bitbanging
-+ the SPI protocol in software.
-+
-+ This driver provides a configfs interface to dynamically create
-+ and destroy GPIO-based MMC/SD card devices. It also provides
-+ a platform device interface API.
-+ See Documentation/gpiommc.txt for details.
-+
-+ The module will be called gpiommc.
-+
-+ If unsure, say N.
-+
-+config GPIOMMC_CONFIGFS
-+ bool
-+ depends on GPIOMMC && CONFIGFS_FS
-+ default y
-+ help
-+ This option automatically enables configfs support for gpiommc
-+ if configfs is available.
-+
- config MMC_CB710
- tristate "ENE CB710 MMC/SD Interface support"
- depends on PCI
---- a/drivers/mmc/host/Makefile
-+++ b/drivers/mmc/host/Makefile
-@@ -34,6 +34,7 @@ obj-$(CONFIG_MMC_SDRICOH_CS) += sdricoh_
- obj-$(CONFIG_MMC_TMIO) += tmio_mmc.o
- obj-$(CONFIG_MMC_CB710) += cb710-mmc.o
- obj-$(CONFIG_MMC_VIA_SDMMC) += via-sdmmc.o
-+obj-$(CONFIG_GPIOMMC) += gpiommc.o
- obj-$(CONFIG_SDH_BFIN) += bfin_sdh.o
-
- obj-$(CONFIG_MMC_SDHCI_OF) += sdhci-of.o
---- /dev/null
-+++ b/include/linux/mmc/gpiommc.h
-@@ -0,0 +1,71 @@
-+/*
-+ * Device driver for MMC/SD cards driven over a GPIO bus.
-+ *
-+ * Copyright (c) 2008 Michael Buesch
-+ *
-+ * Licensed under the GNU/GPL version 2.
-+ */
-+#ifndef LINUX_GPIOMMC_H_
-+#define LINUX_GPIOMMC_H_
-+
-+#include <linux/types.h>
-+
-+
-+#define GPIOMMC_MAX_NAMELEN 15
-+#define GPIOMMC_MAX_NAMELEN_STR __stringify(GPIOMMC_MAX_NAMELEN)
-+
-+/**
-+ * struct gpiommc_pins - Hardware pin assignments
-+ *
-+ * @gpio_di: The GPIO number of the DATA IN pin
-+ * @gpio_do: The GPIO number of the DATA OUT pin
-+ * @gpio_clk: The GPIO number of the CLOCK pin
-+ * @gpio_cs: The GPIO number of the CHIPSELECT pin
-+ * @cs_activelow: If true, the chip is considered selected if @gpio_cs is low.
-+ */
-+struct gpiommc_pins {
-+ unsigned int gpio_di;
-+ unsigned int gpio_do;
-+ unsigned int gpio_clk;
-+ unsigned int gpio_cs;
-+ bool cs_activelow;
-+};
-+
-+/**
-+ * struct gpiommc_platform_data - Platform data for a MMC-over-SPI-GPIO device.
-+ *
-+ * @name: The unique name string of the device.
-+ * @pins: The hardware pin assignments.
-+ * @mode: The hardware mode. This is either SPI_MODE_0,
-+ * SPI_MODE_1, SPI_MODE_2 or SPI_MODE_3. See the SPI documentation.
-+ * @no_spi_delay: Do not use delays in the lowlevel SPI bitbanging code.
-+ * This is not standards compliant, but may be required for some
-+ * embedded machines to gain reasonable speed.
-+ * @max_bus_speed: The maximum speed of the SPI bus, in Hertz.
-+ */
-+struct gpiommc_platform_data {
-+ char name[GPIOMMC_MAX_NAMELEN + 1];
-+ struct gpiommc_pins pins;
-+ u8 mode;
-+ bool no_spi_delay;
-+ unsigned int max_bus_speed;
-+};
-+
-+/**
-+ * GPIOMMC_PLATDEV_NAME - The platform device name string.
-+ *
-+ * The name string that has to be used for platform_device_alloc
-+ * when allocating a gpiommc device.
-+ */
-+#define GPIOMMC_PLATDEV_NAME "gpiommc"
-+
-+/**
-+ * gpiommc_next_id - Get another platform device ID number.
-+ *
-+ * This returns the next platform device ID number that has to be used
-+ * for platform_device_alloc. The ID is opaque and should not be used for
-+ * anything else.
-+ */
-+int gpiommc_next_id(void);
-+
-+#endif /* LINUX_GPIOMMC_H_ */
---- /dev/null
-+++ b/Documentation/gpiommc.txt
-@@ -0,0 +1,97 @@
-+GPIOMMC - Driver for an MMC/SD card on a bitbanging GPIO SPI bus
-+================================================================
-+
-+The gpiommc module hooks up the mmc_spi and spi_gpio modules for running an
-+MMC or SD card on GPIO pins.
-+
-+Two interfaces for registering a new MMC/SD card device are provided:
-+A static platform-device based mechanism and a dynamic configfs based interface.
-+
-+
-+Registering devices via platform-device
-+=======================================
-+
-+The platform-device interface is used for registering MMC/SD devices that are
-+part of the hardware platform. This is most useful only for embedded machines
-+with MMC/SD devices statically connected to the platform GPIO bus.
-+
-+The data structures are declared in <linux/mmc/gpiommc.h>.
-+
-+To register a new device, define an instance of struct gpiommc_platform_data.
-+This structure holds any information about how the device is hooked up to the
-+GPIO pins and what hardware modes the device supports. See the docbook-style
-+documentation in the header file for more information on the struct fields.
-+
-+Then allocate a new instance of a platform device by doing:
-+
-+ pdev = platform_device_alloc(GPIOMMC_PLATDEV_NAME, gpiommc_next_id());
-+
-+This will allocate the platform device data structures and hook it up to the
-+gpiommc driver.
-+Then add the gpiommc_platform_data to the platform device.
-+
-+ err = platform_device_add_data(pdev, pdata, sizeof(struct gpiommc_platform_data));
-+
-+You may free the local instance of struct gpiommc_platform_data now. (So the
-+struct may be allocated on the stack, too).
-+Now simply register the platform device.
-+
-+ err = platform_device_add(pdev);
-+
-+Done. The gpiommc probe routine will be invoked now and you should see a kernel
-+log message for the added device.
-+
-+
-+Registering devices via configfs
-+================================
-+
-+MMC/SD cards connected via GPIO often are a pretty dynamic thing, as for example
-+selfmade hacks for soldering an MMC/SD card to standard GPIO pins on embedded
-+hardware are a common situation.
-+So we provide a dynamic interface to conveniently handle adding and removing
-+devices from userspace, without the need to recompile the kernel.
-+
-+The "gpiommc" subdirectory at the configfs mountpoint is used for handling
-+the dynamic configuration.
-+
-+To create a new device, it must first be allocated with mkdir.
-+The following command will allocate a device named "my_mmc":
-+ mkdir /config/gpiommc/my_mmc
-+
-+There are several configuration files available in the new
-+/config/gpiommc/my_mmc/ directory:
-+
-+gpio_data_in = The SPI data-IN GPIO pin number.
-+gpio_data_out = The SPI data-OUT GPIO pin number.
-+gpio_clock = The SPI Clock GPIO pin number.
-+gpio_chipselect = The SPI Chipselect GPIO pin number.
-+gpio_chipselect_activelow = Boolean. If 0, Chipselect is active-HIGH.
-+ If 1, Chipselect is active-LOW.
-+spi_mode = The SPI data mode. Can be 0-3.
-+spi_delay = Enable all delays in the lowlevel bitbanging.
-+max_bus_speed = The maximum SPI bus speed. In Hertz.
-+
-+register = Not a configuration parameter.
-+ Used to register the configured card
-+ with the kernel.
-+
-+The device must first get configured and then registered by writing "1" to
-+the "register" file.
-+The configuration parameters "gpio_data_in", "gpio_data_out", "gpio_clock"
-+and "gpio_chipselect" are essential and _must_ be configured before writing
-+"1" to the "register" file. The registration will fail, otherwise.
-+
-+The default values for the other parameters are:
-+gpio_chipselect_activelow = 1 (CS active-LOW)
-+spi_mode = 0 (SPI_MODE_0)
-+spi_delay = 1 (enabled)
-+max_bus_speed = 5000000 (5 Mhz)
-+
-+Configuration values can not be changed after registration. To unregister
-+the device, write a "0" to the "register" file. The configuration can be
-+changed again after unregistering.
-+
-+To completely remove the device, simply rmdir the directory
-+(/config/gpiommc/my_mmc in this example).
-+There's no need to first unregister the device before removing it. That will
-+be done automatically.
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -2443,6 +2443,11 @@ T: git git://git.kernel.org/pub/scm/linu
- S: Maintained
- F: drivers/media/video/gspca/
-
-+GPIOMMC DRIVER
-+P: Michael Buesch
-+M: mb@bu3sch.de
-+S: Maintained
-+
- HARDWARE MONITORING
- L: lm-sensors@lm-sensors.org
- W: http://www.lm-sensors.org/
+++ /dev/null
-The gpiommc configfs context structure needs locking, as configfs
-does not lock access between files.
-
---- a/drivers/mmc/host/gpiommc.c
-+++ b/drivers/mmc/host/gpiommc.c
-@@ -143,6 +143,8 @@ struct gpiommc_configfs_device {
- struct platform_device *pdev;
- /* The configuration */
- struct gpiommc_platform_data pdata;
-+ /* Mutex to protect this structure */
-+ struct mutex mutex;
- };
-
- #define GPIO_INVALID -1
-@@ -233,6 +235,8 @@ static ssize_t gpiommc_config_attr_show(
- unsigned int gpio;
- int err = 0;
-
-+ mutex_lock(&dev->mutex);
-+
- if (attr == &gpiommc_attr_DI) {
- gpio = dev->pdata.pins.gpio_di;
- if (gpio == GPIO_INVALID)
-@@ -293,6 +297,8 @@ static ssize_t gpiommc_config_attr_show(
- WARN_ON(1);
- err = -ENOSYS;
- out:
-+ mutex_unlock(&dev->mutex);
-+
- return err ? err : count;
- }
-
-@@ -352,6 +358,8 @@ static ssize_t gpiommc_config_attr_store
- int err = -EINVAL;
- unsigned long data;
-
-+ mutex_lock(&dev->mutex);
-+
- if (attr == &gpiommc_attr_register) {
- err = strict_strtoul(page, 10, &data);
- if (err)
-@@ -477,6 +485,8 @@ static ssize_t gpiommc_config_attr_store
- WARN_ON(1);
- err = -ENOSYS;
- out:
-+ mutex_unlock(&dev->mutex);
-+
- return err ? err : count;
- }
-
-@@ -513,6 +523,7 @@ static struct config_item *gpiommc_make_
- if (!dev)
- return NULL;
-
-+ mutex_init(&dev->mutex);
- config_item_init_type_name(&dev->item, name,
- &gpiommc_dev_ci_type);
-
+++ /dev/null
---- a/drivers/char/cs5535_gpio.c
-+++ b/drivers/char/cs5535_gpio.c
-@@ -15,6 +15,7 @@
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/cdev.h>
-+#include <linux/device.h>
- #include <linux/ioport.h>
- #include <linux/pci.h>
-
-@@ -48,6 +49,7 @@ static struct pci_device_id divil_pci[]
- MODULE_DEVICE_TABLE(pci, divil_pci);
-
- static struct cdev cs5535_gpio_cdev;
-+static struct class *cs5535_gpio_class;
-
- /* reserve 32 entries even though some aren't usable */
- #define CS5535_GPIO_COUNT 32
-@@ -66,9 +68,14 @@ static struct gpio_regmap rm[] =
- { 0x30, 0x00, '1', '0' }, /* GPIOx_READ_BACK / GPIOx_OUT_VAL */
- { 0x20, 0x20, 'I', 'i' }, /* GPIOx_IN_EN */
- { 0x04, 0x04, 'O', 'o' }, /* GPIOx_OUT_EN */
-+ { 0x10, 0x10, 'A', 'a' }, /* GPIOx_OUT_AUX1_SEL */
-+ { 0x14, 0x14, 'B', 'b' }, /* GPIOx_OUT_AUX2_SEL */
- { 0x08, 0x08, 't', 'T' }, /* GPIOx_OUT_OD_EN */
- { 0x18, 0x18, 'P', 'p' }, /* GPIOx_OUT_PU_EN */
- { 0x1c, 0x1c, 'D', 'd' }, /* GPIOx_OUT_PD_EN */
-+ { 0x24, 0x24, 'N', 'n' }, /* GPIOx_IN_INV_EN */
-+ { 0x0c, 0x0c, 'X', 'x' }, /* GPIOx_OUT_INV_EN */
-+ { 0x00, 0x00, 'H', 'L' }, /* GPIOx_OUT_VAL */
- };
-
-
-@@ -176,7 +183,7 @@ static int __init cs5535_gpio_init(void)
- {
- dev_t dev_id;
- u32 low, hi;
-- int retval;
-+ int retval, i;
-
- if (pci_dev_present(divil_pci) == 0) {
- printk(KERN_WARNING NAME ": DIVIL not found\n");
-@@ -231,23 +238,54 @@ static int __init cs5535_gpio_init(void)
- major = MAJOR(dev_id);
- }
-
-- if (retval) {
-- release_region(gpio_base, CS5535_GPIO_SIZE);
-- return -1;
-- }
-+ if (retval)
-+ goto error;
-
- printk(KERN_DEBUG NAME ": base=%#x mask=%#lx major=%d\n",
- gpio_base, mask, major);
-
- cdev_init(&cs5535_gpio_cdev, &cs5535_gpio_fops);
-- cdev_add(&cs5535_gpio_cdev, dev_id, CS5535_GPIO_COUNT);
-+ retval = cdev_add(&cs5535_gpio_cdev, dev_id, CS5535_GPIO_COUNT);
-+ if (retval) {
-+ kobject_put(&cs5535_gpio_cdev.kobj);
-+ goto error_region;
-+ }
-+
-+ cs5535_gpio_class = class_create(THIS_MODULE, "cs5535_gpio");
-+ if (IS_ERR(cs5535_gpio_class)) {
-+ printk(KERN_ERR "Error creating cs5535_gpio class\n");
-+ cdev_del(&cs5535_gpio_cdev);
-+ retval = PTR_ERR(cs5535_gpio_class);
-+ goto error_region;
-+ }
-+
-+ for (i = 0; i < CS5535_GPIO_COUNT; i++) {
-+ if (mask & (1<<i)) {
-+ device_create(cs5535_gpio_class, NULL, MKDEV(major, i), NULL, "cs5535_gpio%d", i);
-+ }
-+ }
-
- return 0;
-+
-+error_region:
-+ unregister_chrdev_region(dev_id, CS5535_GPIO_COUNT);
-+error:
-+ release_region(gpio_base, CS5535_GPIO_SIZE);
-+ return retval;
- }
-
- static void __exit cs5535_gpio_cleanup(void)
- {
- dev_t dev_id = MKDEV(major, 0);
-+ int i;
-+
-+ for (i = 0; i < CS5535_GPIO_COUNT; i++) {
-+ if (mask & (1<<i)) {
-+ device_destroy(cs5535_gpio_class, MKDEV(major, i));
-+ }
-+ }
-+
-+ class_destroy(cs5535_gpio_class);
-
- cdev_del(&cs5535_gpio_cdev);
- unregister_chrdev_region(dev_id, CS5535_GPIO_COUNT);
+++ /dev/null
---- a/drivers/i2c/busses/i2c-gpio.c
-+++ b/drivers/i2c/busses/i2c-gpio.c
-@@ -210,7 +210,7 @@ static int __init i2c_gpio_init(void)
-
- return ret;
- }
--module_init(i2c_gpio_init);
-+subsys_initcall(i2c_gpio_init);
-
- static void __exit i2c_gpio_exit(void)
- {
+++ /dev/null
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -138,7 +138,7 @@
- */
-
- #if defined(CONFIG_WLAN) || defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
--# if defined(CONFIG_MAC80211_MESH)
-+# if 1 || defined(CONFIG_MAC80211_MESH)
- # define LL_MAX_HEADER 128
- # else
- # define LL_MAX_HEADER 96
+++ /dev/null
---- a/arch/powerpc/boot/crtsavres.S
-+++ /dev/null
-@@ -1,233 +0,0 @@
--/*
-- * Special support for eabi and SVR4
-- *
-- * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
-- * Copyright 2008 Freescale Semiconductor, Inc.
-- * Written By Michael Meissner
-- *
-- * Based on gcc/config/rs6000/crtsavres.asm from gcc
-- *
-- * This 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, or (at your option) any
-- * later version.
-- *
-- * In addition to the permissions in the GNU General Public License, the
-- * Free Software Foundation gives you unlimited permission to link the
-- * compiled version of this file with other programs, and to distribute
-- * those programs without any restriction coming from the use of this
-- * file. (The General Public License restrictions do apply in other
-- * respects; for example, they cover modification of the file, and
-- * distribution when not linked into another program.)
-- *
-- * This file 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; see the file COPYING. If not, write to
-- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-- * Boston, MA 02110-1301, USA.
-- *
-- * As a special exception, if you link this library with files
-- * compiled with GCC to produce an executable, this does not cause
-- * the resulting executable to be covered by the GNU General Public License.
-- * This exception does not however invalidate any other reasons why
-- * the executable file might be covered by the GNU General Public License.
-- */
--
-- .file "crtsavres.S"
-- .section ".text"
--
--/* On PowerPC64 Linux, these functions are provided by the linker. */
--#ifndef __powerpc64__
--
--#define _GLOBAL(name) \
-- .type name,@function; \
-- .globl name; \
--name:
--
--/* Routines for saving integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer save area. */
--
--_GLOBAL(_savegpr_14)
--_GLOBAL(_save32gpr_14)
-- stw 14,-72(11) /* save gp registers */
--_GLOBAL(_savegpr_15)
--_GLOBAL(_save32gpr_15)
-- stw 15,-68(11)
--_GLOBAL(_savegpr_16)
--_GLOBAL(_save32gpr_16)
-- stw 16,-64(11)
--_GLOBAL(_savegpr_17)
--_GLOBAL(_save32gpr_17)
-- stw 17,-60(11)
--_GLOBAL(_savegpr_18)
--_GLOBAL(_save32gpr_18)
-- stw 18,-56(11)
--_GLOBAL(_savegpr_19)
--_GLOBAL(_save32gpr_19)
-- stw 19,-52(11)
--_GLOBAL(_savegpr_20)
--_GLOBAL(_save32gpr_20)
-- stw 20,-48(11)
--_GLOBAL(_savegpr_21)
--_GLOBAL(_save32gpr_21)
-- stw 21,-44(11)
--_GLOBAL(_savegpr_22)
--_GLOBAL(_save32gpr_22)
-- stw 22,-40(11)
--_GLOBAL(_savegpr_23)
--_GLOBAL(_save32gpr_23)
-- stw 23,-36(11)
--_GLOBAL(_savegpr_24)
--_GLOBAL(_save32gpr_24)
-- stw 24,-32(11)
--_GLOBAL(_savegpr_25)
--_GLOBAL(_save32gpr_25)
-- stw 25,-28(11)
--_GLOBAL(_savegpr_26)
--_GLOBAL(_save32gpr_26)
-- stw 26,-24(11)
--_GLOBAL(_savegpr_27)
--_GLOBAL(_save32gpr_27)
-- stw 27,-20(11)
--_GLOBAL(_savegpr_28)
--_GLOBAL(_save32gpr_28)
-- stw 28,-16(11)
--_GLOBAL(_savegpr_29)
--_GLOBAL(_save32gpr_29)
-- stw 29,-12(11)
--_GLOBAL(_savegpr_30)
--_GLOBAL(_save32gpr_30)
-- stw 30,-8(11)
--_GLOBAL(_savegpr_31)
--_GLOBAL(_save32gpr_31)
-- stw 31,-4(11)
-- blr
--
--/* Routines for restoring integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer restore area. */
--
--_GLOBAL(_restgpr_14)
--_GLOBAL(_rest32gpr_14)
-- lwz 14,-72(11) /* restore gp registers */
--_GLOBAL(_restgpr_15)
--_GLOBAL(_rest32gpr_15)
-- lwz 15,-68(11)
--_GLOBAL(_restgpr_16)
--_GLOBAL(_rest32gpr_16)
-- lwz 16,-64(11)
--_GLOBAL(_restgpr_17)
--_GLOBAL(_rest32gpr_17)
-- lwz 17,-60(11)
--_GLOBAL(_restgpr_18)
--_GLOBAL(_rest32gpr_18)
-- lwz 18,-56(11)
--_GLOBAL(_restgpr_19)
--_GLOBAL(_rest32gpr_19)
-- lwz 19,-52(11)
--_GLOBAL(_restgpr_20)
--_GLOBAL(_rest32gpr_20)
-- lwz 20,-48(11)
--_GLOBAL(_restgpr_21)
--_GLOBAL(_rest32gpr_21)
-- lwz 21,-44(11)
--_GLOBAL(_restgpr_22)
--_GLOBAL(_rest32gpr_22)
-- lwz 22,-40(11)
--_GLOBAL(_restgpr_23)
--_GLOBAL(_rest32gpr_23)
-- lwz 23,-36(11)
--_GLOBAL(_restgpr_24)
--_GLOBAL(_rest32gpr_24)
-- lwz 24,-32(11)
--_GLOBAL(_restgpr_25)
--_GLOBAL(_rest32gpr_25)
-- lwz 25,-28(11)
--_GLOBAL(_restgpr_26)
--_GLOBAL(_rest32gpr_26)
-- lwz 26,-24(11)
--_GLOBAL(_restgpr_27)
--_GLOBAL(_rest32gpr_27)
-- lwz 27,-20(11)
--_GLOBAL(_restgpr_28)
--_GLOBAL(_rest32gpr_28)
-- lwz 28,-16(11)
--_GLOBAL(_restgpr_29)
--_GLOBAL(_rest32gpr_29)
-- lwz 29,-12(11)
--_GLOBAL(_restgpr_30)
--_GLOBAL(_rest32gpr_30)
-- lwz 30,-8(11)
--_GLOBAL(_restgpr_31)
--_GLOBAL(_rest32gpr_31)
-- lwz 31,-4(11)
-- blr
--
--/* Routines for restoring integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer restore area. */
--
--_GLOBAL(_restgpr_14_x)
--_GLOBAL(_rest32gpr_14_x)
-- lwz 14,-72(11) /* restore gp registers */
--_GLOBAL(_restgpr_15_x)
--_GLOBAL(_rest32gpr_15_x)
-- lwz 15,-68(11)
--_GLOBAL(_restgpr_16_x)
--_GLOBAL(_rest32gpr_16_x)
-- lwz 16,-64(11)
--_GLOBAL(_restgpr_17_x)
--_GLOBAL(_rest32gpr_17_x)
-- lwz 17,-60(11)
--_GLOBAL(_restgpr_18_x)
--_GLOBAL(_rest32gpr_18_x)
-- lwz 18,-56(11)
--_GLOBAL(_restgpr_19_x)
--_GLOBAL(_rest32gpr_19_x)
-- lwz 19,-52(11)
--_GLOBAL(_restgpr_20_x)
--_GLOBAL(_rest32gpr_20_x)
-- lwz 20,-48(11)
--_GLOBAL(_restgpr_21_x)
--_GLOBAL(_rest32gpr_21_x)
-- lwz 21,-44(11)
--_GLOBAL(_restgpr_22_x)
--_GLOBAL(_rest32gpr_22_x)
-- lwz 22,-40(11)
--_GLOBAL(_restgpr_23_x)
--_GLOBAL(_rest32gpr_23_x)
-- lwz 23,-36(11)
--_GLOBAL(_restgpr_24_x)
--_GLOBAL(_rest32gpr_24_x)
-- lwz 24,-32(11)
--_GLOBAL(_restgpr_25_x)
--_GLOBAL(_rest32gpr_25_x)
-- lwz 25,-28(11)
--_GLOBAL(_restgpr_26_x)
--_GLOBAL(_rest32gpr_26_x)
-- lwz 26,-24(11)
--_GLOBAL(_restgpr_27_x)
--_GLOBAL(_rest32gpr_27_x)
-- lwz 27,-20(11)
--_GLOBAL(_restgpr_28_x)
--_GLOBAL(_rest32gpr_28_x)
-- lwz 28,-16(11)
--_GLOBAL(_restgpr_29_x)
--_GLOBAL(_rest32gpr_29_x)
-- lwz 29,-12(11)
--_GLOBAL(_restgpr_30_x)
--_GLOBAL(_rest32gpr_30_x)
-- lwz 30,-8(11)
--_GLOBAL(_restgpr_31_x)
--_GLOBAL(_rest32gpr_31_x)
-- lwz 0,4(11)
-- lwz 31,-4(11)
-- mtlr 0
-- mr 1,11
-- blr
--#endif
---- a/arch/powerpc/boot/Makefile
-+++ b/arch/powerpc/boot/Makefile
-@@ -60,7 +60,7 @@ libfdtheader := fdt.h libfdt.h libfdt_in
- $(addprefix $(obj)/,$(libfdt) libfdt-wrapper.o simpleboot.o): \
- $(addprefix $(obj)/,$(libfdtheader))
-
--src-wlib := string.S crt0.S crtsavres.S stdio.c main.c \
-+src-wlib := string.S crt0.S stdio.c main.c \
- $(libfdt) libfdt-wrapper.c \
- ns16550.c serial.c simple_alloc.c div64.S util.S \
- gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \
---- a/arch/powerpc/kernel/prom_init_check.sh
-+++ b/arch/powerpc/kernel/prom_init_check.sh
-@@ -48,20 +48,6 @@ do
- fi
- done
-
-- # ignore register save/restore funcitons
-- if [ "${UNDEF:0:9}" = "_restgpr_" ]; then
-- OK=1
-- fi
-- if [ "${UNDEF:0:11}" = "_rest32gpr_" ]; then
-- OK=1
-- fi
-- if [ "${UNDEF:0:9}" = "_savegpr_" ]; then
-- OK=1
-- fi
-- if [ "${UNDEF:0:11}" = "_save32gpr_" ]; then
-- OK=1
-- fi
--
- if [ $OK -eq 0 ]; then
- ERROR=1
- echo "Error: External symbol '$UNDEF' referenced" \
---- a/arch/powerpc/lib/crtsavres.S
-+++ /dev/null
-@@ -1,229 +0,0 @@
--/*
-- * Special support for eabi and SVR4
-- *
-- * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
-- * Copyright 2008 Freescale Semiconductor, Inc.
-- * Written By Michael Meissner
-- *
-- * Based on gcc/config/rs6000/crtsavres.asm from gcc
-- *
-- * This 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, or (at your option) any
-- * later version.
-- *
-- * In addition to the permissions in the GNU General Public License, the
-- * Free Software Foundation gives you unlimited permission to link the
-- * compiled version of this file with other programs, and to distribute
-- * those programs without any restriction coming from the use of this
-- * file. (The General Public License restrictions do apply in other
-- * respects; for example, they cover modification of the file, and
-- * distribution when not linked into another program.)
-- *
-- * This file 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; see the file COPYING. If not, write to
-- * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-- * Boston, MA 02110-1301, USA.
-- *
-- * As a special exception, if you link this library with files
-- * compiled with GCC to produce an executable, this does not cause
-- * the resulting executable to be covered by the GNU General Public License.
-- * This exception does not however invalidate any other reasons why
-- * the executable file might be covered by the GNU General Public License.
-- */
--
--#include <asm/ppc_asm.h>
--
-- .file "crtsavres.S"
-- .section ".text"
--
--#ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
--
--/* Routines for saving integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer save area. */
--
--_GLOBAL(_savegpr_14)
--_GLOBAL(_save32gpr_14)
-- stw 14,-72(11) /* save gp registers */
--_GLOBAL(_savegpr_15)
--_GLOBAL(_save32gpr_15)
-- stw 15,-68(11)
--_GLOBAL(_savegpr_16)
--_GLOBAL(_save32gpr_16)
-- stw 16,-64(11)
--_GLOBAL(_savegpr_17)
--_GLOBAL(_save32gpr_17)
-- stw 17,-60(11)
--_GLOBAL(_savegpr_18)
--_GLOBAL(_save32gpr_18)
-- stw 18,-56(11)
--_GLOBAL(_savegpr_19)
--_GLOBAL(_save32gpr_19)
-- stw 19,-52(11)
--_GLOBAL(_savegpr_20)
--_GLOBAL(_save32gpr_20)
-- stw 20,-48(11)
--_GLOBAL(_savegpr_21)
--_GLOBAL(_save32gpr_21)
-- stw 21,-44(11)
--_GLOBAL(_savegpr_22)
--_GLOBAL(_save32gpr_22)
-- stw 22,-40(11)
--_GLOBAL(_savegpr_23)
--_GLOBAL(_save32gpr_23)
-- stw 23,-36(11)
--_GLOBAL(_savegpr_24)
--_GLOBAL(_save32gpr_24)
-- stw 24,-32(11)
--_GLOBAL(_savegpr_25)
--_GLOBAL(_save32gpr_25)
-- stw 25,-28(11)
--_GLOBAL(_savegpr_26)
--_GLOBAL(_save32gpr_26)
-- stw 26,-24(11)
--_GLOBAL(_savegpr_27)
--_GLOBAL(_save32gpr_27)
-- stw 27,-20(11)
--_GLOBAL(_savegpr_28)
--_GLOBAL(_save32gpr_28)
-- stw 28,-16(11)
--_GLOBAL(_savegpr_29)
--_GLOBAL(_save32gpr_29)
-- stw 29,-12(11)
--_GLOBAL(_savegpr_30)
--_GLOBAL(_save32gpr_30)
-- stw 30,-8(11)
--_GLOBAL(_savegpr_31)
--_GLOBAL(_save32gpr_31)
-- stw 31,-4(11)
-- blr
--
--/* Routines for restoring integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer restore area. */
--
--_GLOBAL(_restgpr_14)
--_GLOBAL(_rest32gpr_14)
-- lwz 14,-72(11) /* restore gp registers */
--_GLOBAL(_restgpr_15)
--_GLOBAL(_rest32gpr_15)
-- lwz 15,-68(11)
--_GLOBAL(_restgpr_16)
--_GLOBAL(_rest32gpr_16)
-- lwz 16,-64(11)
--_GLOBAL(_restgpr_17)
--_GLOBAL(_rest32gpr_17)
-- lwz 17,-60(11)
--_GLOBAL(_restgpr_18)
--_GLOBAL(_rest32gpr_18)
-- lwz 18,-56(11)
--_GLOBAL(_restgpr_19)
--_GLOBAL(_rest32gpr_19)
-- lwz 19,-52(11)
--_GLOBAL(_restgpr_20)
--_GLOBAL(_rest32gpr_20)
-- lwz 20,-48(11)
--_GLOBAL(_restgpr_21)
--_GLOBAL(_rest32gpr_21)
-- lwz 21,-44(11)
--_GLOBAL(_restgpr_22)
--_GLOBAL(_rest32gpr_22)
-- lwz 22,-40(11)
--_GLOBAL(_restgpr_23)
--_GLOBAL(_rest32gpr_23)
-- lwz 23,-36(11)
--_GLOBAL(_restgpr_24)
--_GLOBAL(_rest32gpr_24)
-- lwz 24,-32(11)
--_GLOBAL(_restgpr_25)
--_GLOBAL(_rest32gpr_25)
-- lwz 25,-28(11)
--_GLOBAL(_restgpr_26)
--_GLOBAL(_rest32gpr_26)
-- lwz 26,-24(11)
--_GLOBAL(_restgpr_27)
--_GLOBAL(_rest32gpr_27)
-- lwz 27,-20(11)
--_GLOBAL(_restgpr_28)
--_GLOBAL(_rest32gpr_28)
-- lwz 28,-16(11)
--_GLOBAL(_restgpr_29)
--_GLOBAL(_rest32gpr_29)
-- lwz 29,-12(11)
--_GLOBAL(_restgpr_30)
--_GLOBAL(_rest32gpr_30)
-- lwz 30,-8(11)
--_GLOBAL(_restgpr_31)
--_GLOBAL(_rest32gpr_31)
-- lwz 31,-4(11)
-- blr
--
--/* Routines for restoring integer registers, called by the compiler. */
--/* Called with r11 pointing to the stack header word of the caller of the */
--/* function, just beyond the end of the integer restore area. */
--
--_GLOBAL(_restgpr_14_x)
--_GLOBAL(_rest32gpr_14_x)
-- lwz 14,-72(11) /* restore gp registers */
--_GLOBAL(_restgpr_15_x)
--_GLOBAL(_rest32gpr_15_x)
-- lwz 15,-68(11)
--_GLOBAL(_restgpr_16_x)
--_GLOBAL(_rest32gpr_16_x)
-- lwz 16,-64(11)
--_GLOBAL(_restgpr_17_x)
--_GLOBAL(_rest32gpr_17_x)
-- lwz 17,-60(11)
--_GLOBAL(_restgpr_18_x)
--_GLOBAL(_rest32gpr_18_x)
-- lwz 18,-56(11)
--_GLOBAL(_restgpr_19_x)
--_GLOBAL(_rest32gpr_19_x)
-- lwz 19,-52(11)
--_GLOBAL(_restgpr_20_x)
--_GLOBAL(_rest32gpr_20_x)
-- lwz 20,-48(11)
--_GLOBAL(_restgpr_21_x)
--_GLOBAL(_rest32gpr_21_x)
-- lwz 21,-44(11)
--_GLOBAL(_restgpr_22_x)
--_GLOBAL(_rest32gpr_22_x)
-- lwz 22,-40(11)
--_GLOBAL(_restgpr_23_x)
--_GLOBAL(_rest32gpr_23_x)
-- lwz 23,-36(11)
--_GLOBAL(_restgpr_24_x)
--_GLOBAL(_rest32gpr_24_x)
-- lwz 24,-32(11)
--_GLOBAL(_restgpr_25_x)
--_GLOBAL(_rest32gpr_25_x)
-- lwz 25,-28(11)
--_GLOBAL(_restgpr_26_x)
--_GLOBAL(_rest32gpr_26_x)
-- lwz 26,-24(11)
--_GLOBAL(_restgpr_27_x)
--_GLOBAL(_rest32gpr_27_x)
-- lwz 27,-20(11)
--_GLOBAL(_restgpr_28_x)
--_GLOBAL(_rest32gpr_28_x)
-- lwz 28,-16(11)
--_GLOBAL(_restgpr_29_x)
--_GLOBAL(_rest32gpr_29_x)
-- lwz 29,-12(11)
--_GLOBAL(_restgpr_30_x)
--_GLOBAL(_rest32gpr_30_x)
-- lwz 30,-8(11)
--_GLOBAL(_restgpr_31_x)
--_GLOBAL(_rest32gpr_31_x)
-- lwz 0,4(11)
-- lwz 31,-4(11)
-- mtlr 0
-- mr 1,11
-- blr
--#endif
---- a/arch/powerpc/lib/Makefile
-+++ b/arch/powerpc/lib/Makefile
-@@ -13,7 +13,7 @@ CFLAGS_REMOVE_feature-fixups.o = -pg
-
- obj-y := string.o alloc.o \
- checksum_$(CONFIG_WORD_SIZE).o
--obj-$(CONFIG_PPC32) += div64.o copy_32.o crtsavres.o
-+obj-$(CONFIG_PPC32) += div64.o copy_32.o
- obj-$(CONFIG_HAS_IOMEM) += devres.o
-
- obj-$(CONFIG_PPC64) += copypage_64.o copyuser_64.o \
---- a/arch/powerpc/Makefile
-+++ b/arch/powerpc/Makefile
-@@ -92,8 +92,6 @@ endif
- else
- KBUILD_CFLAGS += $(call cc-option,-mtune=power4)
- endif
--else
--LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
- endif
-
- ifeq ($(CONFIG_TUNE_CELL),y)
+++ /dev/null
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -823,6 +823,8 @@ config CRYPTO_ANSI_CPRNG
- ANSI X9.31 A.2.4. Not this option must be enabled if CRYPTO_FIPS
- is selected
-
-+source "crypto/ocf/Kconfig"
-+
- source "drivers/crypto/Kconfig"
-
- endif # if CRYPTO
---- a/crypto/Makefile
-+++ b/crypto/Makefile
-@@ -86,6 +86,11 @@ obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o
- obj-$(CONFIG_CRYPTO_GHASH) += ghash-generic.o
-
- #
-+# OCF
-+#
-+obj-$(CONFIG_OCF_OCF) += ocf/
-+
-+#
- # generic algorithms and the async_tx api
- #
- obj-$(CONFIG_XOR_BLOCKS) += xor.o
+++ /dev/null
---- a/drivers/char/random.c
-+++ b/drivers/char/random.c
-@@ -129,6 +129,9 @@
- * unsigned int value);
- * void add_interrupt_randomness(int irq);
- *
-+ * void random_input_words(__u32 *buf, size_t wordcount, int ent_count)
-+ * int random_input_wait(void);
-+ *
- * add_input_randomness() uses the input layer interrupt timing, as well as
- * the event type information from the hardware.
- *
-@@ -140,6 +143,13 @@
- * a better measure, since the timing of the disk interrupts are more
- * unpredictable.
- *
-+ * random_input_words() just provides a raw block of entropy to the input
-+ * pool, such as from a hardware entropy generator.
-+ *
-+ * random_input_wait() suspends the caller until such time as the
-+ * entropy pool falls below the write threshold, and returns a count of how
-+ * much entropy (in bits) is needed to sustain the pool.
-+ *
- * All of these routines try to estimate how many bits of randomness a
- * particular randomness source. They do this by keeping track of the
- * first and second order deltas of the event timings.
-@@ -714,6 +724,61 @@ void add_disk_randomness(struct gendisk
- }
- #endif
-
-+/*
-+ * random_input_words - add bulk entropy to pool
-+ *
-+ * @buf: buffer to add
-+ * @wordcount: number of __u32 words to add
-+ * @ent_count: total amount of entropy (in bits) to credit
-+ *
-+ * this provides bulk input of entropy to the input pool
-+ *
-+ */
-+void random_input_words(__u32 *buf, size_t wordcount, int ent_count)
-+{
-+ mix_pool_bytes(&input_pool, buf, wordcount*4);
-+
-+ credit_entropy_bits(&input_pool, ent_count);
-+
-+ DEBUG_ENT("crediting %d bits => %d\n",
-+ ent_count, input_pool.entropy_count);
-+ /*
-+ * Wake up waiting processes if we have enough
-+ * entropy.
-+ */
-+ if (input_pool.entropy_count >= random_read_wakeup_thresh)
-+ wake_up_interruptible(&random_read_wait);
-+}
-+EXPORT_SYMBOL(random_input_words);
-+
-+/*
-+ * random_input_wait - wait until random needs entropy
-+ *
-+ * this function sleeps until the /dev/random subsystem actually
-+ * needs more entropy, and then return the amount of entropy
-+ * that it would be nice to have added to the system.
-+ */
-+int random_input_wait(void)
-+{
-+ int count;
-+
-+ wait_event_interruptible(random_write_wait,
-+ input_pool.entropy_count < random_write_wakeup_thresh);
-+
-+ count = random_write_wakeup_thresh - input_pool.entropy_count;
-+
-+ /* likely we got woken up due to a signal */
-+ if (count <= 0) count = random_read_wakeup_thresh;
-+
-+ DEBUG_ENT("requesting %d bits from input_wait()er %d<%d\n",
-+ count,
-+ input_pool.entropy_count, random_write_wakeup_thresh);
-+
-+ return count;
-+}
-+EXPORT_SYMBOL(random_input_wait);
-+
-+
- #define EXTRACT_SIZE 10
-
- /*********************************************************************
---- a/fs/fcntl.c
-+++ b/fs/fcntl.c
-@@ -141,6 +141,7 @@ SYSCALL_DEFINE1(dup, unsigned int, filde
- }
- return ret;
- }
-+EXPORT_SYMBOL(sys_dup);
-
- #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME)
-
---- a/include/linux/miscdevice.h
-+++ b/include/linux/miscdevice.h
-@@ -12,6 +12,7 @@
- #define APOLLO_MOUSE_MINOR 7
- #define PC110PAD_MINOR 9
- /*#define ADB_MOUSE_MINOR 10 FIXME OBSOLETE */
-+#define CRYPTODEV_MINOR 70 /* /dev/crypto */
- #define WATCHDOG_MINOR 130 /* Watchdog timer */
- #define TEMP_MINOR 131 /* Temperature Sensor */
- #define RTC_MINOR 135
---- a/include/linux/random.h
-+++ b/include/linux/random.h
-@@ -34,6 +34,30 @@
- /* Clear the entropy pool and associated counters. (Superuser only.) */
- #define RNDCLEARPOOL _IO( 'R', 0x06 )
-
-+#ifdef CONFIG_FIPS_RNG
-+
-+/* Size of seed value - equal to AES blocksize */
-+#define AES_BLOCK_SIZE_BYTES 16
-+#define SEED_SIZE_BYTES AES_BLOCK_SIZE_BYTES
-+/* Size of AES key */
-+#define KEY_SIZE_BYTES 16
-+
-+/* ioctl() structure used by FIPS 140-2 Tests */
-+struct rand_fips_test {
-+ unsigned char key[KEY_SIZE_BYTES]; /* Input */
-+ unsigned char datetime[SEED_SIZE_BYTES]; /* Input */
-+ unsigned char seed[SEED_SIZE_BYTES]; /* Input */
-+ unsigned char result[SEED_SIZE_BYTES]; /* Output */
-+};
-+
-+/* FIPS 140-2 RNG Variable Seed Test. (Superuser only.) */
-+#define RNDFIPSVST _IOWR('R', 0x10, struct rand_fips_test)
-+
-+/* FIPS 140-2 RNG Monte Carlo Test. (Superuser only.) */
-+#define RNDFIPSMCT _IOWR('R', 0x11, struct rand_fips_test)
-+
-+#endif /* #ifdef CONFIG_FIPS_RNG */
-+
- struct rand_pool_info {
- int entropy_count;
- int buf_size;
-@@ -50,6 +74,10 @@ extern void add_input_randomness(unsigne
- unsigned int value);
- extern void add_interrupt_randomness(int irq);
-
-+extern void random_input_words(__u32 *buf, size_t wordcount, int ent_count);
-+extern int random_input_wait(void);
-+#define HAS_RANDOM_INPUT_WAIT 1
-+
- extern void get_random_bytes(void *buf, int nbytes);
- void generate_random_uuid(unsigned char uuid_out[16]);
-
+++ /dev/null
---- a/crypto/ocf/cryptosoft.c
-+++ b/crypto/ocf/cryptosoft.c
-@@ -47,7 +47,7 @@
- #include <linux/mm.h>
- #include <linux/skbuff.h>
- #include <linux/random.h>
--#include <asm/scatterlist.h>
-+#include <linux/scatterlist.h>
-
- #include <cryptodev.h>
- #include <uio.h>
+++ /dev/null
---- a/crypto/ocf/random.c
-+++ b/crypto/ocf/random.c
-@@ -49,6 +49,7 @@
- #include <linux/unistd.h>
- #include <linux/poll.h>
- #include <linux/random.h>
-+#include <linux/kthread.h>
- #include <cryptodev.h>
-
- #ifdef CONFIG_OCF_FIPS
-@@ -81,7 +82,7 @@ struct random_op {
-
- static int random_proc(void *arg);
-
--static pid_t randomproc = (pid_t) -1;
-+static struct task_struct *random_task;
- static spinlock_t random_lock;
-
- /*
-@@ -141,13 +142,18 @@ crypto_rregister(
- spin_lock_irqsave(&random_lock, flags);
- list_add_tail(&rops->random_list, &random_ops);
- if (!started) {
-- randomproc = kernel_thread(random_proc, NULL, CLONE_FS|CLONE_FILES);
-- if (randomproc < 0) {
-- ret = randomproc;
-+ struct task_struct *t;
-+
-+ t = kthread_create(random_proc, NULL, "ocf-random");
-+ if (IS_ERR(t)) {
-+ ret = PTR_ERR(t);
- printk("crypto: crypto_rregister cannot start random thread; "
- "error %d", ret);
-- } else
-+ } else {
-+ random_task = t;
-+ wake_up_process(t);
- started = 1;
-+ }
- }
- spin_unlock_irqrestore(&random_lock, flags);
-
-@@ -172,7 +178,7 @@ crypto_runregister_all(u_int32_t driveri
-
- spin_lock_irqsave(&random_lock, flags);
- if (list_empty(&random_ops) && started)
-- kill_proc(randomproc, SIGKILL, 1);
-+ send_sig(SIGKILL, random_task, 1);
- spin_unlock_irqrestore(&random_lock, flags);
- return(0);
- }
-@@ -308,7 +314,7 @@ random_proc(void *arg)
-
- bad_alloc:
- spin_lock_irq(&random_lock);
-- randomproc = (pid_t) -1;
-+ random_task = NULL;
- started = 0;
- spin_unlock_irq(&random_lock);
-
---- a/crypto/ocf/crypto.c
-+++ b/crypto/ocf/crypto.c
-@@ -74,6 +74,7 @@ __FBSDID("$FreeBSD: src/sys/opencrypto/c
- #include <linux/sched.h>
- #include <linux/spinlock.h>
- #include <linux/version.h>
-+#include <linux/kthread.h>
- #include <cryptodev.h>
-
- /*
-@@ -255,10 +256,10 @@ module_param(crypto_devallowsoft, int, 0
- MODULE_PARM_DESC(crypto_devallowsoft,
- "Enable/disable use of software crypto support");
-
--static pid_t cryptoproc = (pid_t) -1;
-+static struct task_struct *crypto_task;
- static struct completion cryptoproc_exited;
- static DECLARE_WAIT_QUEUE_HEAD(cryptoproc_wait);
--static pid_t cryptoretproc = (pid_t) -1;
-+static struct task_struct *cryptoret_task;
- static struct completion cryptoretproc_exited;
- static DECLARE_WAIT_QUEUE_HEAD(cryptoretproc_wait);
-
-@@ -1401,7 +1402,7 @@ crypto_proc(void *arg)
- wait_event_interruptible(cryptoproc_wait,
- !(list_empty(&crp_q) || crypto_all_qblocked) ||
- !(list_empty(&crp_kq) || crypto_all_kqblocked) ||
-- cryptoproc == (pid_t) -1);
-+ crypto_task == NULL);
- crp_sleep = 0;
- if (signal_pending (current)) {
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-@@ -1414,7 +1415,7 @@ crypto_proc(void *arg)
- }
- CRYPTO_Q_LOCK();
- dprintk("%s - awake\n", __FUNCTION__);
-- if (cryptoproc == (pid_t) -1)
-+ if (crypto_task == NULL)
- break;
- cryptostats.cs_intrs++;
- }
-@@ -1470,7 +1471,7 @@ crypto_ret_proc(void *arg)
- dprintk("%s - sleeping\n", __FUNCTION__);
- CRYPTO_RETQ_UNLOCK();
- wait_event_interruptible(cryptoretproc_wait,
-- cryptoretproc == (pid_t) -1 ||
-+ cryptoret_task == NULL ||
- !list_empty(&crp_ret_q) ||
- !list_empty(&crp_ret_kq));
- if (signal_pending (current)) {
-@@ -1484,7 +1485,7 @@ crypto_ret_proc(void *arg)
- }
- CRYPTO_RETQ_LOCK();
- dprintk("%s - awake\n", __FUNCTION__);
-- if (cryptoretproc == (pid_t) -1) {
-+ if (cryptoret_task == NULL) {
- dprintk("%s - EXITING!\n", __FUNCTION__);
- break;
- }
-@@ -1597,6 +1598,7 @@ DB_SHOW_COMMAND(kcrypto, db_show_kcrypto
- static int
- crypto_init(void)
- {
-+ struct task_struct *t;
- int error;
-
- dprintk("%s(0x%x)\n", __FUNCTION__, (int) crypto_init);
-@@ -1643,23 +1645,27 @@ crypto_init(void)
- init_completion(&cryptoproc_exited);
- init_completion(&cryptoretproc_exited);
-
-- cryptoproc = 0; /* to avoid race condition where proc runs first */
-- cryptoproc = kernel_thread(crypto_proc, NULL, CLONE_FS|CLONE_FILES);
-- if (cryptoproc < 0) {
-- error = cryptoproc;
-+ crypto_task = NULL; /* to avoid race condition where proc runs first */
-+ t = kthread_create(crypto_proc, NULL, "ocf-crypto");
-+ if (IS_ERR(t)) {
-+ error = PTR_ERR(t);
- printk("crypto: crypto_init cannot start crypto thread; error %d",
- error);
- goto bad;
- }
-+ wake_up_process(t);
-+ crypto_task = t;
-
-- cryptoretproc = 0; /* to avoid race condition where proc runs first */
-- cryptoretproc = kernel_thread(crypto_ret_proc, NULL, CLONE_FS|CLONE_FILES);
-- if (cryptoretproc < 0) {
-- error = cryptoretproc;
-+ cryptoret_task = NULL; /* to avoid race condition where proc runs first */
-+ t = kthread_create(crypto_ret_proc, NULL, "ocf-cryptoret");
-+ if (IS_ERR(t)) {
-+ error = PTR_ERR(t);
- printk("crypto: crypto_init cannot start cryptoret thread; error %d",
- error);
- goto bad;
- }
-+ wake_up_process(t);
-+ cryptoret_task = t;
-
- return 0;
- bad:
-@@ -1671,7 +1677,7 @@ bad:
- static void
- crypto_exit(void)
- {
-- pid_t p;
-+ struct task_struct *t;
- unsigned long d_flags;
-
- dprintk("%s()\n", __FUNCTION__);
-@@ -1681,18 +1687,18 @@ crypto_exit(void)
- */
-
- CRYPTO_DRIVER_LOCK();
-- p = cryptoproc;
-- cryptoproc = (pid_t) -1;
-- kill_proc(p, SIGTERM, 1);
-+ t = crypto_task;
-+ crypto_task = NULL;
-+ send_sig(SIGTERM, t, 1);
- wake_up_interruptible(&cryptoproc_wait);
- CRYPTO_DRIVER_UNLOCK();
-
- wait_for_completion(&cryptoproc_exited);
-
- CRYPTO_DRIVER_LOCK();
-- p = cryptoretproc;
-- cryptoretproc = (pid_t) -1;
-- kill_proc(p, SIGTERM, 1);
-+ t = cryptoret_task;
-+ cryptoret_task = NULL;
-+ send_sig(SIGTERM, t, 1);
- wake_up_interruptible(&cryptoretproc_wait);
- CRYPTO_DRIVER_UNLOCK();
-
+++ /dev/null
---- a/drivers/ssb/Kconfig
-+++ b/drivers/ssb/Kconfig
-@@ -49,7 +49,7 @@ config SSB_PCIHOST
- config SSB_B43_PCI_BRIDGE
- bool
- depends on SSB_PCIHOST
-- default n
-+ default y
-
- config SSB_PCMCIAHOST_POSSIBLE
- bool
+++ /dev/null
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -152,16 +152,16 @@ config REED_SOLOMON_DEC16
- # Textsearch support is select'ed if needed
- #
- config TEXTSEARCH
-- boolean
-+ boolean "Textsearch support"
-
- config TEXTSEARCH_KMP
-- tristate
-+ tristate "Textsearch KMP"
-
- config TEXTSEARCH_BM
-- tristate
-+ tristate "Textsearch BM"
-
- config TEXTSEARCH_FSM
-- tristate
-+ tristate "Textsearch FSM"
-
- config HAS_IOMEM
- boolean
+++ /dev/null
---- a/net/wireless/Kconfig
-+++ b/net/wireless/Kconfig
-@@ -141,13 +141,13 @@ config LIB80211
- you want this built into your kernel.
-
- config LIB80211_CRYPT_WEP
-- tristate
-+ tristate "LIB80211_CRYPT_WEP"
-
- config LIB80211_CRYPT_CCMP
-- tristate
-+ tristate "LIB80211_CRYPT_CCMP"
-
- config LIB80211_CRYPT_TKIP
-- tristate
-+ tristate "LIB80211_CRYPT_TKIP"
-
- config LIB80211_DEBUG
- bool "lib80211 debugging messages"
+++ /dev/null
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -32,7 +32,7 @@ config CRYPTO_FIPS
- option is selected
-
- config CRYPTO_ALGAPI
-- tristate
-+ tristate "ALGAPI"
- select CRYPTO_ALGAPI2
- help
- This option provides the API for cryptographic algorithms.
-@@ -41,7 +41,7 @@ config CRYPTO_ALGAPI2
- tristate
-
- config CRYPTO_AEAD
-- tristate
-+ tristate "AEAD"
- select CRYPTO_AEAD2
- select CRYPTO_ALGAPI
-
-@@ -50,7 +50,7 @@ config CRYPTO_AEAD2
- select CRYPTO_ALGAPI2
-
- config CRYPTO_BLKCIPHER
-- tristate
-+ tristate "BLKCIPHER"
- select CRYPTO_BLKCIPHER2
- select CRYPTO_ALGAPI
-
-@@ -61,7 +61,7 @@ config CRYPTO_BLKCIPHER2
- select CRYPTO_WORKQUEUE
-
- config CRYPTO_HASH
-- tristate
-+ tristate "HASH"
- select CRYPTO_HASH2
- select CRYPTO_ALGAPI
-
-@@ -70,7 +70,7 @@ config CRYPTO_HASH2
- select CRYPTO_ALGAPI2
-
- config CRYPTO_RNG
-- tristate
-+ tristate "RNG"
- select CRYPTO_RNG2
- select CRYPTO_ALGAPI
-
+++ /dev/null
---- a/mm/shmem.c
-+++ b/mm/shmem.c
-@@ -29,6 +29,7 @@
- #include <linux/mm.h>
- #include <linux/module.h>
- #include <linux/swap.h>
-+#include <linux/ima.h>
-
- static struct vfsmount *shm_mnt;
-
-@@ -2620,6 +2621,16 @@ int shmem_lock(struct file *file, int lo
-
- /* common code */
-
-+void shmem_set_file(struct vm_area_struct *vma, struct file *file)
-+{
-+ ima_counts_get(file);
-+ if (vma->vm_file)
-+ fput(vma->vm_file);
-+ vma->vm_file = file;
-+ vma->vm_ops = &shmem_vm_ops;
-+}
-+EXPORT_SYMBOL_GPL(shmem_set_file);
-+
- /**
- * shmem_file_setup - get an unlinked file living in tmpfs
- * @name: name for dentry (to be seen in /proc/<pid>/maps
-@@ -2697,9 +2708,6 @@ int shmem_zero_setup(struct vm_area_stru
- if (IS_ERR(file))
- return PTR_ERR(file);
-
-- if (vma->vm_file)
-- fput(vma->vm_file);
-- vma->vm_file = file;
-- vma->vm_ops = &shmem_vm_ops;
-+ shmem_set_file(vma, file);
- return 0;
- }
---- a/fs/file.c
-+++ b/fs/file.c
-@@ -271,6 +271,7 @@ int expand_files(struct files_struct *fi
- /* All good, so we try */
- return expand_fdtable(files, nr);
- }
-+EXPORT_SYMBOL_GPL(expand_files);
-
- static int count_open_files(struct fdtable *fdt)
- {
---- a/kernel/exit.c
-+++ b/kernel/exit.c
-@@ -508,6 +508,7 @@ struct files_struct *get_files_struct(st
-
- return files;
- }
-+EXPORT_SYMBOL_GPL(get_files_struct);
-
- void put_files_struct(struct files_struct *files)
- {
-@@ -527,6 +528,7 @@ void put_files_struct(struct files_struc
- free_fdtable(fdt);
- }
- }
-+EXPORT_SYMBOL_GPL(put_files_struct);
-
- void reset_files_struct(struct files_struct *files)
- {
---- a/kernel/fork.c
-+++ b/kernel/fork.c
-@@ -169,6 +169,7 @@ void __put_task_struct(struct task_struc
- if (!profile_handoff_task(tsk))
- free_task(tsk);
- }
-+EXPORT_SYMBOL_GPL(__put_task_struct);
-
- /*
- * macro override instead of weak attribute alias, to workaround
---- a/kernel/sched.c
-+++ b/kernel/sched.c
-@@ -6149,6 +6149,7 @@ int can_nice(const struct task_struct *p
- return (nice_rlim <= p->signal->rlim[RLIMIT_NICE].rlim_cur ||
- capable(CAP_SYS_NICE));
- }
-+EXPORT_SYMBOL_GPL(can_nice);
-
- #ifdef __ARCH_WANT_SYS_NICE
-
---- a/mm/memory.c
-+++ b/mm/memory.c
-@@ -1115,6 +1115,7 @@ unsigned long zap_page_range(struct vm_a
- tlb_finish_mmu(tlb, address, end);
- return end;
- }
-+EXPORT_SYMBOL_GPL(zap_page_range);
-
- /**
- * zap_vma_ptes - remove ptes mapping the vma
-@@ -2501,6 +2502,7 @@ int vmtruncate_range(struct inode *inode
-
- return 0;
- }
-+EXPORT_SYMBOL_GPL(vmtruncate_range);
-
- /*
- * We enter with non-exclusive mmap_sem (to exclude vma changes,
---- a/mm/vmalloc.c
-+++ b/mm/vmalloc.c
-@@ -1173,6 +1173,7 @@ void unmap_kernel_range(unsigned long ad
- vunmap_page_range(addr, end);
- flush_tlb_kernel_range(addr, end);
- }
-+EXPORT_SYMBOL_GPL(unmap_kernel_range);
-
- int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages)
- {
-@@ -1288,6 +1289,7 @@ struct vm_struct *get_vm_area(unsigned l
- return __get_vm_area_node(size, 1, flags, VMALLOC_START, VMALLOC_END,
- -1, GFP_KERNEL, __builtin_return_address(0));
- }
-+EXPORT_SYMBOL_GPL(get_vm_area);
-
- struct vm_struct *get_vm_area_caller(unsigned long size, unsigned long flags,
- void *caller)
---- a/include/linux/mm.h
-+++ b/include/linux/mm.h
-@@ -725,6 +725,7 @@ extern void show_free_areas(void);
-
- int shmem_lock(struct file *file, int lock, struct user_struct *user);
- struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags);
-+void shmem_set_file(struct vm_area_struct *vma, struct file *file);
- int shmem_zero_setup(struct vm_area_struct *);
-
- #ifndef CONFIG_MMU
---- a/kernel/signal.c
-+++ b/kernel/signal.c
-@@ -1104,6 +1104,7 @@ struct sighand_struct *lock_task_sighand
-
- return sighand;
- }
-+EXPORT_SYMBOL(lock_task_sighand);
-
- /*
- * send signal info to all the members of a group
+++ /dev/null
---- a/net/wireless/Kconfig
-+++ b/net/wireless/Kconfig
-@@ -1,5 +1,5 @@
- config WIRELESS_EXT
-- bool
-+ bool "Wireless extensions"
-
- config WEXT_CORE
- def_bool y
-@@ -11,10 +11,10 @@ config WEXT_PROC
- depends on WEXT_CORE
-
- config WEXT_SPY
-- bool
-+ bool "WEXT_SPY"
-
- config WEXT_PRIV
-- bool
-+ bool "WEXT_PRIV"
-
- config CFG80211
- tristate "cfg80211 - wireless configuration API"
+++ /dev/null
---- a/arch/cris/include/arch-v10/arch/Kbuild
-+++ b/arch/cris/include/arch-v10/arch/Kbuild
-@@ -1,3 +1,5 @@
-+header-y += elf.h
-+header-y += ptrace.h
- header-y += user.h
- header-y += svinto.h
- header-y += sv_addr_ag.h
---- a/arch/cris/include/asm/Kbuild
-+++ b/arch/cris/include/asm/Kbuild
-@@ -1,11 +1,14 @@
- include include/asm-generic/Kbuild.asm
-
--header-y += arch-v10/
--header-y += arch-v32/
-+header-y += ../arch-v10/arch/
-+header-y += ../arch-v32/arch/
-
-+header-y += elf.h
- header-y += ethernet.h
-+header-y += page.h
- header-y += rtc.h
- header-y += sync_serial.h
-+header-y += user.h
-
- unifdef-y += etraxgpio.h
- unifdef-y += rs485.h
+++ /dev/null
-Upstream doesn't optimize the kernel and bootwrappers for ppc44x because
-they still want to support gcc 3.3 -- well, we don't.
-
---- a/arch/powerpc/Makefile
-+++ b/arch/powerpc/Makefile
-@@ -123,7 +123,8 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
- KBUILD_CFLAGS += -mno-sched-epilog
- endif
-
--cpu-as-$(CONFIG_4xx) += -Wa,-m405
-+cpu-as-$(CONFIG_40x) += -Wa,-m405
-+cpu-as-$(CONFIG_44x) += -Wa,-m440
- cpu-as-$(CONFIG_6xx) += -Wa,-maltivec
- cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec
- cpu-as-$(CONFIG_E500) += -Wa,-me500
---- a/arch/powerpc/boot/Makefile
-+++ b/arch/powerpc/boot/Makefile
-@@ -38,10 +38,10 @@ BOOTCFLAGS += -I$(obj) -I$(srctree)/$(ob
- DTS_FLAGS ?= -p 1024
-
- $(obj)/4xx.o: BOOTCFLAGS += -mcpu=405
--$(obj)/ebony.o: BOOTCFLAGS += -mcpu=405
-+$(obj)/ebony.o: BOOTCFLAGS += -mcpu=440
- $(obj)/cuboot-hotfoot.o: BOOTCFLAGS += -mcpu=405
--$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=405
--$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=405
-+$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=440
-+$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=440
- $(obj)/cuboot-acadia.o: BOOTCFLAGS += -mcpu=405
- $(obj)/treeboot-walnut.o: BOOTCFLAGS += -mcpu=405
- $(obj)/virtex405-head.o: BOOTAFLAGS += -mcpu=405
+++ /dev/null
---- a/usr/Kconfig
-+++ b/usr/Kconfig
-@@ -75,7 +75,7 @@ config RD_LZMA
- config RD_LZO
- bool "Support initial ramdisks compressed using LZO" if EMBEDDED
- default !EMBEDDED
-- depends on BLK_DEV_INITRD
-+ depends on BLK_DEV_INITRD && HAVE_KERNEL_LZO
- select DECOMPRESS_LZO
- help
- Support loading of a LZO encoded initial ramdisk or cpio buffer
+++ /dev/null
---- a/scripts/Makefile.lib
-+++ b/scripts/Makefile.lib
-@@ -238,7 +238,7 @@ cmd_bzip2 = (cat $(filter-out FORCE,$^)
-
- quiet_cmd_lzma = LZMA $@
- cmd_lzma = (cat $(filter-out FORCE,$^) | \
-- lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
-+ lzma e -d20 -lc1 -lp2 -pb2 -eos -si -so && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
- (rm -f $@ ; false)
-
- quiet_cmd_lzo = LZO $@
---- a/scripts/gen_initramfs_list.sh
-+++ b/scripts/gen_initramfs_list.sh
-@@ -225,7 +225,7 @@ cpio_list=
- output="/dev/stdout"
- output_file=""
- is_cpio_compressed=
--compr="gzip -9 -f"
-+compr="gzip -9 -f -"
-
- arg="$1"
- case "$arg" in
-@@ -239,9 +239,9 @@ case "$arg" in
- output_file="$1"
- cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)"
- output=${cpio_list}
-- echo "$output_file" | grep -q "\.gz$" && compr="gzip -9 -f"
-- echo "$output_file" | grep -q "\.bz2$" && compr="bzip2 -9 -f"
-- echo "$output_file" | grep -q "\.lzma$" && compr="lzma -9 -f"
-+ echo "$output_file" | grep -q "\.gz$" && compr="gzip -9 -f -"
-+ echo "$output_file" | grep -q "\.bz2$" && compr="bzip2 -9 -f -"
-+ echo "$output_file" | grep -q "\.lzma$" && compr="lzma e -d20 -lc1 -lp2 -pb2 -eos -si -so"
- echo "$output_file" | grep -q "\.cpio$" && compr="cat"
- shift
- ;;
-@@ -292,7 +292,7 @@ if [ ! -z ${output_file} ]; then
- if [ "${is_cpio_compressed}" = "compressed" ]; then
- cat ${cpio_tfile} > ${output_file}
- else
-- (cat ${cpio_tfile} | ${compr} - > ${output_file}) \
-+ (cat ${cpio_tfile} | ${compr} > ${output_file}) \
- || (rm -f ${output_file} ; false)
- fi
- [ -z ${cpio_file} ] && rm ${cpio_tfile}
---- a/lib/decompress.c
-+++ b/lib/decompress.c
-@@ -36,6 +36,7 @@ static const struct compress_format {
- { {037, 0236}, "gzip", gunzip },
- { {0x42, 0x5a}, "bzip2", bunzip2 },
- { {0x5d, 0x00}, "lzma", unlzma },
-+ { {0x6d, 0x00}, "lzma-openwrt", unlzma },
- { {0x89, 0x4c}, "lzo", unlzo },
- { {0, 0}, NULL, NULL }
- };
+++ /dev/null
---- a/init/main.c
-+++ b/init/main.c
-@@ -831,10 +831,7 @@ static noinline int init_post(void)
- printk(KERN_WARNING "Failed to execute %s. Attempting "
- "defaults...\n", execute_command);
- }
-- run_init_process("/sbin/init");
-- run_init_process("/etc/init");
-- run_init_process("/bin/init");
-- run_init_process("/bin/sh");
-+ run_init_process("/etc/preinit");
-
- panic("No init found. Try passing init= option to kernel.");
- }
+++ /dev/null
-CONFIG_32BIT=y
-# CONFIG_64BIT is not set
-# CONFIG_ALCHEMY_GPIO_INDIRECT is not set
-# CONFIG_AR7 is not set
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-CONFIG_ARCH_POPULATES_NODE_MAP=y
-CONFIG_ARCH_REQUIRE_GPIOLIB=y
-# CONFIG_ARCH_SUPPORTS_MSI is not set
-CONFIG_ARCH_SUPPORTS_OPROFILE=y
-CONFIG_ARCH_SUSPEND_POSSIBLE=y
-CONFIG_ATA=y
-# CONFIG_BCM47XX is not set
-# CONFIG_BCM63XX is not set
-CONFIG_BITREVERSE=y
-CONFIG_BLK_DEV_SD=y
-CONFIG_BOOT_RAW=y
-CONFIG_BRIDGE=m
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
-# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_CEVT_R4K=y
-CONFIG_CEVT_R4K_LIB=y
-CONFIG_CMDLINE_BOOL=y
-# CONFIG_CMDLINE_OVERRIDE is not set
-# CONFIG_CPU_BIG_ENDIAN is not set
-# CONFIG_CPU_CAVIUM_OCTEON is not set
-CONFIG_CPU_HAS_PREFETCH=y
-CONFIG_CPU_HAS_SYNC=y
-CONFIG_CPU_LITTLE_ENDIAN=y
-# CONFIG_CPU_LOONGSON2E is not set
-# CONFIG_CPU_LOONGSON2F is not set
-CONFIG_CPU_MIPS32=y
-CONFIG_CPU_MIPS32_R1=y
-# CONFIG_CPU_MIPS32_R2 is not set
-# CONFIG_CPU_MIPS64_R1 is not set
-# CONFIG_CPU_MIPS64_R2 is not set
-CONFIG_CPU_MIPSR1=y
-# CONFIG_CPU_NEVADA is not set
-# CONFIG_CPU_R10000 is not set
-# CONFIG_CPU_R3000 is not set
-# CONFIG_CPU_R4300 is not set
-# CONFIG_CPU_R4X00 is not set
-# CONFIG_CPU_R5000 is not set
-# CONFIG_CPU_R5432 is not set
-# CONFIG_CPU_R5500 is not set
-# CONFIG_CPU_R6000 is not set
-# CONFIG_CPU_R8000 is not set
-# CONFIG_CPU_RM7000 is not set
-# CONFIG_CPU_RM9000 is not set
-# CONFIG_CPU_SB1 is not set
-CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
-CONFIG_CPU_SUPPORTS_HIGHMEM=y
-# CONFIG_CPU_TX39XX is not set
-# CONFIG_CPU_TX49XX is not set
-# CONFIG_CPU_VR41XX is not set
-CONFIG_CSRC_R4K=y
-CONFIG_CSRC_R4K_LIB=y
-# CONFIG_DEBUG_FS is not set
-CONFIG_DECOMPRESS_LZMA=y
-# CONFIG_DEFAULT_SECURITY_SELINUX is not set
-# CONFIG_DEFAULT_SECURITY_SMACK is not set
-# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
-CONFIG_DEVPORT=y
-# CONFIG_DM9000 is not set
-CONFIG_DMA_NEED_PCI_MAP_STATE=y
-CONFIG_DMA_NONCOHERENT=y
-# CONFIG_ENABLE_WARN_DEPRECATED is not set
-CONFIG_EXT2_FS=y
-# CONFIG_FSNOTIFY is not set
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-CONFIG_GENERIC_CMOS_UPDATE=y
-CONFIG_GENERIC_FIND_LAST_BIT=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_GPIO=y
-CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-CONFIG_GPIOLIB=y
-CONFIG_GPIO_SYSFS=y
-# CONFIG_HAMRADIO is not set
-CONFIG_HARDWARE_WATCHPOINTS=y
-CONFIG_HAS_DMA=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAVE_ARCH_KGDB=y
-CONFIG_HAVE_DYNAMIC_FTRACE=y
-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
-CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
-CONFIG_HAVE_GENERIC_DMA_COHERENT=y
-CONFIG_HAVE_IDE=y
-CONFIG_HAVE_OPROFILE=y
-# CONFIG_HIGH_RES_TIMERS is not set
-CONFIG_HW_HAS_PCI=y
-CONFIG_HW_RANDOM=y
-CONFIG_HZ=250
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_IMAGE_CMDLINE_HACK=y
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_INLINE_READ_LOCK is not set
-# CONFIG_INLINE_READ_LOCK_BH is not set
-# CONFIG_INLINE_READ_LOCK_IRQ is not set
-# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_READ_TRYLOCK is not set
-CONFIG_INLINE_READ_UNLOCK=y
-# CONFIG_INLINE_READ_UNLOCK_BH is not set
-CONFIG_INLINE_READ_UNLOCK_IRQ=y
-# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_SPIN_LOCK is not set
-# CONFIG_INLINE_SPIN_LOCK_BH is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_SPIN_TRYLOCK is not set
-# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK=y
-# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
-# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_WRITE_LOCK is not set
-# CONFIG_INLINE_WRITE_LOCK_BH is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_WRITE_TRYLOCK is not set
-CONFIG_INLINE_WRITE_UNLOCK=y
-# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
-CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
-# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
-CONFIG_IRQ_CPU=y
-CONFIG_KEXEC=y
-CONFIG_KORINA=y
-# CONFIG_LEDS_GPIO is not set
-CONFIG_LEDS_MIKROTIK_RB532=y
-CONFIG_LLC=m
-CONFIG_LOONGSON_UART_BASE=y
-# CONFIG_MACH_ALCHEMY is not set
-# CONFIG_MACH_DECSTATION is not set
-# CONFIG_MACH_JAZZ is not set
-# CONFIG_MACH_LOONGSON is not set
-# CONFIG_MACH_TX39XX is not set
-# CONFIG_MACH_TX49XX is not set
-# CONFIG_MACH_VR41XX is not set
-CONFIG_MIKROTIK_RB532=y
-CONFIG_MIPS=y
-# CONFIG_MIPS_COBALT is not set
-CONFIG_MIPS_L1_CACHE_SHIFT=4
-# CONFIG_MIPS_MACHINE is not set
-# CONFIG_MIPS_MALTA is not set
-CONFIG_MIPS_MT_DISABLED=y
-# CONFIG_MIPS_MT_SMP is not set
-# CONFIG_MIPS_MT_SMTC is not set
-# CONFIG_MIPS_SIM is not set
-CONFIG_MTD_BLOCK2MTD=y
-CONFIG_MTD_CFI_ADV_OPTIONS=y
-# CONFIG_MTD_CFI_AMDSTD is not set
-CONFIG_MTD_CFI_GEOMETRY=y
-# CONFIG_MTD_CFI_INTELEXT is not set
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_PLATFORM=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-CONFIG_MTD_PHYSMAP=y
-# CONFIG_MTD_ROOTFS_ROOT_DEV is not set
-# CONFIG_MTD_ROOTFS_SPLIT is not set
-# CONFIG_MUTEX_SPIN_ON_OWNER is not set
-CONFIG_NF_CONNTRACK=y
-CONFIG_NF_CT_ACCT=y
-# CONFIG_NO_IOPORT is not set
-# CONFIG_NXP_STB220 is not set
-# CONFIG_NXP_STB225 is not set
-CONFIG_PAGEFLAGS_EXTENDED=y
-CONFIG_PATA_RB532=y
-CONFIG_PCI=y
-CONFIG_PCI_DISABLE_COMMON_QUIRKS=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PCSPKR_PLATFORM=y
-# CONFIG_PMC_MSP is not set
-# CONFIG_PMC_YOSEMITE is not set
-# CONFIG_PNX8550_JBS is not set
-# CONFIG_PNX8550_STB810 is not set
-# CONFIG_POWERTV is not set
-CONFIG_RC32434_WDT=y
-CONFIG_SCHED_OMIT_FRAME_POINTER=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_SERIAL_8250_EXTENDED is not set
-# CONFIG_SGI_IP22 is not set
-# CONFIG_SGI_IP27 is not set
-# CONFIG_SGI_IP28 is not set
-# CONFIG_SGI_IP32 is not set
-# CONFIG_SIBYTE_BIGSUR is not set
-# CONFIG_SIBYTE_CARMEL is not set
-# CONFIG_SIBYTE_CRHINE is not set
-# CONFIG_SIBYTE_CRHONE is not set
-# CONFIG_SIBYTE_LITTLESUR is not set
-# CONFIG_SIBYTE_RHONE is not set
-# CONFIG_SIBYTE_SENTOSA is not set
-# CONFIG_SIBYTE_SWARM is not set
-# CONFIG_SLAB is not set
-CONFIG_SLUB=y
-CONFIG_STP=m
-# CONFIG_SWAP is not set
-CONFIG_SWAP_IO_SPACE=y
-CONFIG_SYS_HAS_CPU_MIPS32_R1=y
-CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
-CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
-CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
-# CONFIG_TC35815 is not set
-CONFIG_TRAD_SIGNALS=y
-# CONFIG_TREE_PREEMPT_RCU is not set
-CONFIG_VIA_RHINE=y
-CONFIG_VIA_RHINE_MMIO=y
-CONFIG_VLAN_8021Q=m
-CONFIG_YAFFS_9BYTE_TAGS=y
-# CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set
-CONFIG_YAFFS_AUTO_YAFFS2=y
-# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set
-# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set
-CONFIG_YAFFS_FS=y
-CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
-CONFIG_YAFFS_YAFFS1=y
-CONFIG_YAFFS_YAFFS2=y
-CONFIG_ZONE_DMA_FLAG=0
+++ /dev/null
-CONFIG_32BIT=y
-# CONFIG_64BIT is not set
-# CONFIG_ALCHEMY_GPIO_INDIRECT is not set
-# CONFIG_AR7 is not set
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
-CONFIG_ARCH_POPULATES_NODE_MAP=y
-CONFIG_ARCH_REQUIRE_GPIOLIB=y
-# CONFIG_ARCH_SUPPORTS_MSI is not set
-CONFIG_ARCH_SUPPORTS_OPROFILE=y
-CONFIG_ARCH_SUSPEND_POSSIBLE=y
-CONFIG_ATA=y
-# CONFIG_BCM47XX is not set
-# CONFIG_BCM63XX is not set
-CONFIG_BITREVERSE=y
-CONFIG_BLK_DEV_SD=y
-CONFIG_BOOT_RAW=y
-CONFIG_BRIDGE=m
-CONFIG_BRIDGE_IGMP_SNOOPING=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
-# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_CEVT_R4K=y
-CONFIG_CEVT_R4K_LIB=y
-CONFIG_CMDLINE_BOOL=y
-# CONFIG_CMDLINE_OVERRIDE is not set
-# CONFIG_CPU_BIG_ENDIAN is not set
-# CONFIG_CPU_CAVIUM_OCTEON is not set
-CONFIG_CPU_HAS_PREFETCH=y
-CONFIG_CPU_HAS_SYNC=y
-CONFIG_CPU_LITTLE_ENDIAN=y
-# CONFIG_CPU_LOONGSON2E is not set
-# CONFIG_CPU_LOONGSON2F is not set
-CONFIG_CPU_MIPS32=y
-CONFIG_CPU_MIPS32_R1=y
-# CONFIG_CPU_MIPS32_R2 is not set
-# CONFIG_CPU_MIPS64_R1 is not set
-# CONFIG_CPU_MIPS64_R2 is not set
-CONFIG_CPU_MIPSR1=y
-# CONFIG_CPU_NEVADA is not set
-# CONFIG_CPU_R10000 is not set
-# CONFIG_CPU_R3000 is not set
-# CONFIG_CPU_R4300 is not set
-# CONFIG_CPU_R4X00 is not set
-# CONFIG_CPU_R5000 is not set
-# CONFIG_CPU_R5432 is not set
-# CONFIG_CPU_R5500 is not set
-# CONFIG_CPU_R6000 is not set
-# CONFIG_CPU_R8000 is not set
-# CONFIG_CPU_RM7000 is not set
-# CONFIG_CPU_RM9000 is not set
-# CONFIG_CPU_SB1 is not set
-CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
-CONFIG_CPU_SUPPORTS_HIGHMEM=y
-# CONFIG_CPU_TX39XX is not set
-# CONFIG_CPU_TX49XX is not set
-# CONFIG_CPU_VR41XX is not set
-# CONFIG_CRYSTALHD is not set
-CONFIG_CSRC_R4K=y
-CONFIG_CSRC_R4K_LIB=y
-# CONFIG_DEBUG_FS is not set
-CONFIG_DECOMPRESS_LZMA=y
-# CONFIG_DEFAULT_SECURITY_SELINUX is not set
-# CONFIG_DEFAULT_SECURITY_SMACK is not set
-# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
-CONFIG_DEVPORT=y
-# CONFIG_DM9000 is not set
-CONFIG_DMA_NEED_PCI_MAP_STATE=y
-CONFIG_DMA_NONCOHERENT=y
-# CONFIG_DT3155 is not set
-# CONFIG_ENABLE_WARN_DEPRECATED is not set
-CONFIG_EXT2_FS=y
-# CONFIG_FSNOTIFY is not set
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-CONFIG_GENERIC_CMOS_UPDATE=y
-CONFIG_GENERIC_FIND_LAST_BIT=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_GPIO=y
-CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-CONFIG_GPIOLIB=y
-# CONFIG_GPIO_IT8761E is not set
-# CONFIG_GPIO_SCH is not set
-CONFIG_GPIO_SYSFS=y
-# CONFIG_HAMRADIO is not set
-CONFIG_HARDWARE_WATCHPOINTS=y
-CONFIG_HAS_DMA=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAVE_ARCH_KGDB=y
-CONFIG_HAVE_DYNAMIC_FTRACE=y
-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
-CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACER=y
-CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
-CONFIG_HAVE_GENERIC_DMA_COHERENT=y
-CONFIG_HAVE_IDE=y
-CONFIG_HAVE_OPROFILE=y
-# CONFIG_HIGH_RES_TIMERS is not set
-CONFIG_HW_HAS_PCI=y
-CONFIG_HW_RANDOM=y
-CONFIG_HZ=250
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_IMAGE_CMDLINE_HACK=y
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_INLINE_READ_LOCK is not set
-# CONFIG_INLINE_READ_LOCK_BH is not set
-# CONFIG_INLINE_READ_LOCK_IRQ is not set
-# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_READ_TRYLOCK is not set
-CONFIG_INLINE_READ_UNLOCK=y
-# CONFIG_INLINE_READ_UNLOCK_BH is not set
-CONFIG_INLINE_READ_UNLOCK_IRQ=y
-# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_SPIN_LOCK is not set
-# CONFIG_INLINE_SPIN_LOCK_BH is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_SPIN_TRYLOCK is not set
-# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK=y
-# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
-# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_WRITE_LOCK is not set
-# CONFIG_INLINE_WRITE_LOCK_BH is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_WRITE_TRYLOCK is not set
-CONFIG_INLINE_WRITE_UNLOCK=y
-# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
-CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
-# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
-CONFIG_IRQ_CPU=y
-CONFIG_KEXEC=y
-CONFIG_KORINA=y
-# CONFIG_KSZ884X_PCI is not set
-# CONFIG_LEDS_GPIO is not set
-CONFIG_LEDS_MIKROTIK_RB532=y
-CONFIG_LLC=m
-# CONFIG_LOGFS is not set
-CONFIG_LOONGSON_UART_BASE=y
-# CONFIG_LPC_SCH is not set
-# CONFIG_MACH_ALCHEMY is not set
-# CONFIG_MACH_DECSTATION is not set
-# CONFIG_MACH_JAZZ is not set
-# CONFIG_MACH_LOONGSON is not set
-# CONFIG_MACH_TX39XX is not set
-# CONFIG_MACH_TX49XX is not set
-# CONFIG_MACH_VR41XX is not set
-# CONFIG_MAX63XX_WATCHDOG is not set
-# CONFIG_MFD_TIMBERDALE is not set
-CONFIG_MIKROTIK_RB532=y
-CONFIG_MIPS=y
-# CONFIG_MIPS_COBALT is not set
-CONFIG_MIPS_L1_CACHE_SHIFT=4
-# CONFIG_MIPS_MACHINE is not set
-# CONFIG_MIPS_MALTA is not set
-CONFIG_MIPS_MT_DISABLED=y
-# CONFIG_MIPS_MT_SMP is not set
-# CONFIG_MIPS_MT_SMTC is not set
-# CONFIG_MIPS_SIM is not set
-CONFIG_MTD_BLOCK2MTD=y
-CONFIG_MTD_CFI_ADV_OPTIONS=y
-# CONFIG_MTD_CFI_AMDSTD is not set
-CONFIG_MTD_CFI_GEOMETRY=y
-# CONFIG_MTD_CFI_INTELEXT is not set
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_PLATFORM=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-CONFIG_MTD_PHYSMAP=y
-# CONFIG_MTD_ROOTFS_ROOT_DEV is not set
-# CONFIG_MTD_ROOTFS_SPLIT is not set
-# CONFIG_MUTEX_SPIN_ON_OWNER is not set
-CONFIG_NF_CONNTRACK=y
-CONFIG_NF_CT_ACCT=y
-# CONFIG_NO_IOPORT is not set
-# CONFIG_NXP_STB220 is not set
-# CONFIG_NXP_STB225 is not set
-CONFIG_PAGEFLAGS_EXTENDED=y
-CONFIG_PATA_RB532=y
-CONFIG_PCI_DISABLE_COMMON_QUIRKS=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PCSPKR_PLATFORM=y
-# CONFIG_PMC_MSP is not set
-# CONFIG_PMC_YOSEMITE is not set
-# CONFIG_PNX8550_JBS is not set
-# CONFIG_PNX8550_STB810 is not set
-# CONFIG_POWERTV is not set
-CONFIG_RC32434_WDT=y
-CONFIG_SCHED_OMIT_FRAME_POINTER=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_SERIAL_8250_EXTENDED is not set
-# CONFIG_SERIAL_TIMBERDALE is not set
-# CONFIG_SGI_IP22 is not set
-# CONFIG_SGI_IP27 is not set
-# CONFIG_SGI_IP28 is not set
-# CONFIG_SGI_IP32 is not set
-# CONFIG_SIBYTE_BIGSUR is not set
-# CONFIG_SIBYTE_CARMEL is not set
-# CONFIG_SIBYTE_CRHINE is not set
-# CONFIG_SIBYTE_CRHONE is not set
-# CONFIG_SIBYTE_LITTLESUR is not set
-# CONFIG_SIBYTE_RHONE is not set
-# CONFIG_SIBYTE_SENTOSA is not set
-# CONFIG_SIBYTE_SWARM is not set
-# CONFIG_SLAB is not set
-CONFIG_SLUB=y
-CONFIG_STP=m
-# CONFIG_SWAP is not set
-CONFIG_SWAP_IO_SPACE=y
-CONFIG_SYS_HAS_CPU_MIPS32_R1=y
-CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
-CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
-CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
-# CONFIG_TC35815 is not set
-CONFIG_TRAD_SIGNALS=y
-# CONFIG_TREE_PREEMPT_RCU is not set
-CONFIG_VIA_RHINE=y
-CONFIG_VIA_RHINE_MMIO=y
-CONFIG_VLAN_8021Q=m
-CONFIG_YAFFS_9BYTE_TAGS=y
-# CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set
-CONFIG_YAFFS_AUTO_YAFFS2=y
-# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set
-# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set
-CONFIG_YAFFS_FS=y
-CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
-CONFIG_YAFFS_YAFFS1=y
-CONFIG_YAFFS_YAFFS2=y
-CONFIG_ZONE_DMA_FLAG=0
+++ /dev/null
---- a/arch/mips/rb532/prom.c
-+++ b/arch/mips/rb532/prom.c
-@@ -67,6 +67,7 @@ static inline unsigned long tag2ul(char
- return simple_strtoul(num, 0, 10);
- }
-
-+extern char __image_cmdline[];
- void __init prom_setup_cmdline(void)
- {
- static char cmd_line[CL_SIZE] __initdata;
-@@ -109,6 +110,9 @@ void __init prom_setup_cmdline(void)
- }
- *(cp++) = ' ';
-
-+ strcpy(cp,(__image_cmdline));
-+ cp += strlen(__image_cmdline);
-+
- i = strlen(arcs_cmdline);
- if (i > 0) {
- *(cp++) = ' ';
+++ /dev/null
---- a/arch/mips/rb532/devices.c
-+++ b/arch/mips/rb532/devices.c
-@@ -139,6 +139,19 @@ static struct platform_device cf_slot0 =
- };
-
- /* Resources and device for NAND */
-+
-+/*
-+ * We need to use the OLD Yaffs-1 OOB layout, otherwise the RB bootloader
-+ * will not be able to find the kernel that we load. So set the oobinfo
-+ * when creating the partitions
-+ */
-+static struct nand_ecclayout rb532_nand_ecclayout = {
-+ .eccbytes = 6,
-+ .eccpos = { 8, 9, 10, 13, 14, 15 },
-+ .oobavail = 9,
-+ .oobfree = { { 0, 4 }, { 6, 2 }, { 11, 2 }, { 4, 1 } }
-+};
-+
- static int rb532_dev_ready(struct mtd_info *mtd)
- {
- return gpio_get_value(GPIO_RDY);
-@@ -280,6 +293,16 @@ static void __init parse_mac_addr(char *
- /* NAND definitions */
- #define NAND_CHIP_DELAY 25
-
-+static int rb532_nand_fixup(struct mtd_info *mtd)
-+{
-+ struct nand_chip *chip = mtd->priv;
-+
-+ if (mtd->writesize == 512)
-+ chip->ecc.layout = &rb532_nand_ecclayout;
-+
-+ return 0;
-+}
-+
- static void __init rb532_nand_setup(void)
- {
- switch (mips_machtype) {
-@@ -299,6 +322,8 @@ static void __init rb532_nand_setup(void
- rb532_nand_data.chip.partitions = rb532_partition_info;
- rb532_nand_data.chip.chip_delay = NAND_CHIP_DELAY;
- rb532_nand_data.chip.options = NAND_NO_AUTOINCR;
-+
-+ rb532_nand_data.chip.chip_fixup = &rb532_nand_fixup;
- }
-
-
+++ /dev/null
---- a/arch/mips/rb532/prom.c
-+++ b/arch/mips/rb532/prom.c
-@@ -67,6 +67,7 @@ static inline unsigned long tag2ul(char
- return simple_strtoul(num, 0, 10);
- }
-
-+extern char __image_cmdline[];
- void __init prom_setup_cmdline(void)
- {
- static char cmd_line[CL_SIZE] __initdata;
-@@ -109,6 +110,9 @@ void __init prom_setup_cmdline(void)
- }
- *(cp++) = ' ';
-
-+ strcpy(cp,(__image_cmdline));
-+ cp += strlen(__image_cmdline);
-+
- i = strlen(arcs_cmdline);
- if (i > 0) {
- *(cp++) = ' ';
+++ /dev/null
---- a/arch/mips/rb532/devices.c
-+++ b/arch/mips/rb532/devices.c
-@@ -139,6 +139,19 @@ static struct platform_device cf_slot0 =
- };
-
- /* Resources and device for NAND */
-+
-+/*
-+ * We need to use the OLD Yaffs-1 OOB layout, otherwise the RB bootloader
-+ * will not be able to find the kernel that we load. So set the oobinfo
-+ * when creating the partitions
-+ */
-+static struct nand_ecclayout rb532_nand_ecclayout = {
-+ .eccbytes = 6,
-+ .eccpos = { 8, 9, 10, 13, 14, 15 },
-+ .oobavail = 9,
-+ .oobfree = { { 0, 4 }, { 6, 2 }, { 11, 2 }, { 4, 1 } }
-+};
-+
- static int rb532_dev_ready(struct mtd_info *mtd)
- {
- return gpio_get_value(GPIO_RDY);
-@@ -280,6 +293,16 @@ static void __init parse_mac_addr(char *
- /* NAND definitions */
- #define NAND_CHIP_DELAY 25
-
-+static int rb532_nand_fixup(struct mtd_info *mtd)
-+{
-+ struct nand_chip *chip = mtd->priv;
-+
-+ if (mtd->writesize == 512)
-+ chip->ecc.layout = &rb532_nand_ecclayout;
-+
-+ return 0;
-+}
-+
- static void __init rb532_nand_setup(void)
- {
- switch (mips_machtype) {
-@@ -299,6 +322,8 @@ static void __init rb532_nand_setup(void
- rb532_nand_data.chip.partitions = rb532_partition_info;
- rb532_nand_data.chip.chip_delay = NAND_CHIP_DELAY;
- rb532_nand_data.chip.options = NAND_NO_AUTOINCR;
-+
-+ rb532_nand_data.chip.chip_fixup = &rb532_nand_fixup;
- }
-
-
+++ /dev/null
---- a/arch/um/Makefile-i386
-+++ b/arch/um/Makefile-i386
-@@ -35,7 +35,7 @@ cflags-y += -ffreestanding
- # Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use
- # a lot more stack due to the lack of sharing of stacklots. Also, gcc
- # 4.3.0 needs -funit-at-a-time for extern inline functions.
--KBUILD_CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then \
-+KBUILD_CFLAGS += $(shell if [ $(call cc-version) -lt 0403 ] ; then \
- echo $(call cc-option,-fno-unit-at-a-time); \
- else echo $(call cc-option,-funit-at-a-time); fi ;)
-
+++ /dev/null
---- a/arch/um/Makefile-i386
-+++ b/arch/um/Makefile-i386
-@@ -39,4 +39,8 @@ KBUILD_CFLAGS += $(shell if [ $(call cc-
- echo $(call cc-option,-fno-unit-at-a-time); \
- else echo $(call cc-option,-funit-at-a-time); fi ;)
-
-+# disable compile-time buffer checks, enabled by default on Ubuntu 8.10
-+# and later
-+KBUILD_CFLAGS += $(call cc-option,-U_FORTIFY_SOURCE)
-+
- KBUILD_CFLAGS += $(cflags-y)
---- a/arch/um/Makefile-x86_64
-+++ b/arch/um/Makefile-x86_64
-@@ -24,3 +24,7 @@ LINK-y += -m64
-
- # Do unit-at-a-time unconditionally on x86_64, following the host
- KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time)
-+
-+# disable compile-time buffer checks, enabled by default on Ubuntu 8.10
-+# and later
-+KBUILD_CFLAGS += $(call cc-option,-U_FORTIFY_SOURCE)
+++ /dev/null
-um: remove PAGE_SIZE alignment in linker script causing kernel segfault.
-
-The linker script cleanup that I did in commit
-5d150a97f9391f5bcd7ba0d59d7a11c3de3cea80 accidentally introduced an
-ALIGN(PAGE_SIZE) when converting to use INIT_TEXT_SECTION; Richard
-Weinberger reported that this causes the kernel to segfault with
-CONFIG_STATIC_LINK=y.
-
-I'm not certain why this extra alignment is a problem, but it seems likely
-it is because previously
-
-__init_begin = _stext = _text = _sinittext
-
-and with the extra ALIGN(PAGE_SIZE), _sinittext becomes different from the
-rest. So there is likely a bug here where something is assuming that
-_sinittext is the same as one of those other symbols. But reverting the
-accidental change fixes the regression, so it seems worth committing that
-now.
-
-Signed-off-by: Tim Abbott <tabbott@ksplice.com>
-Reported-by: richard -rw- weinberger <richard.weinberger@gmail.com>
-Cc: Jeff Dike <jdike@addtoit.com>
-Cc: user-mode-linux-devel@lists.sourceforge.net
----
- arch/um/kernel/uml.lds.S | 2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S
-index e7a6cca..664f942 100644
---- a/arch/um/kernel/uml.lds.S
-+++ b/arch/um/kernel/uml.lds.S
-@@ -22,7 +22,7 @@ SECTIONS
- _text = .;
- _stext = .;
- __init_begin = .;
-- INIT_TEXT_SECTION(PAGE_SIZE)
-+ INIT_TEXT_SECTION(0)
- . = ALIGN(PAGE_SIZE);
-
- .text :
+++ /dev/null
-make ZLIB_DEFLATE visible, so that we can choose whether we want it built-in
-or as a module
-
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -92,7 +92,7 @@ config ZLIB_INFLATE
- tristate
-
- config ZLIB_DEFLATE
-- tristate
-+ tristate "Zlib compression"
-
- config LZO_COMPRESS
- tristate
+++ /dev/null
---- a/arch/um/Makefile-i386
-+++ b/arch/um/Makefile-i386
-@@ -35,7 +35,7 @@ cflags-y += -ffreestanding
- # Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use
- # a lot more stack due to the lack of sharing of stacklots. Also, gcc
- # 4.3.0 needs -funit-at-a-time for extern inline functions.
--KBUILD_CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then \
-+KBUILD_CFLAGS += $(shell if [ $(call cc-version) -lt 0403 ] ; then \
- echo $(call cc-option,-fno-unit-at-a-time); \
- else echo $(call cc-option,-funit-at-a-time); fi ;)
-
+++ /dev/null
---- a/arch/um/Makefile-i386
-+++ b/arch/um/Makefile-i386
-@@ -39,4 +39,8 @@ KBUILD_CFLAGS += $(shell if [ $(call cc-
- echo $(call cc-option,-fno-unit-at-a-time); \
- else echo $(call cc-option,-funit-at-a-time); fi ;)
-
-+# disable compile-time buffer checks, enabled by default on Ubuntu 8.10
-+# and later
-+KBUILD_CFLAGS += $(call cc-option,-U_FORTIFY_SOURCE)
-+
- KBUILD_CFLAGS += $(cflags-y)
---- a/arch/um/Makefile-x86_64
-+++ b/arch/um/Makefile-x86_64
-@@ -24,3 +24,7 @@ LINK-y += -m64
-
- # Do unit-at-a-time unconditionally on x86_64, following the host
- KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time)
-+
-+# disable compile-time buffer checks, enabled by default on Ubuntu 8.10
-+# and later
-+KBUILD_CFLAGS += $(call cc-option,-U_FORTIFY_SOURCE)
+++ /dev/null
-um: remove PAGE_SIZE alignment in linker script causing kernel segfault.
-
-The linker script cleanup that I did in commit
-5d150a97f9391f5bcd7ba0d59d7a11c3de3cea80 accidentally introduced an
-ALIGN(PAGE_SIZE) when converting to use INIT_TEXT_SECTION; Richard
-Weinberger reported that this causes the kernel to segfault with
-CONFIG_STATIC_LINK=y.
-
-I'm not certain why this extra alignment is a problem, but it seems likely
-it is because previously
-
-__init_begin = _stext = _text = _sinittext
-
-and with the extra ALIGN(PAGE_SIZE), _sinittext becomes different from the
-rest. So there is likely a bug here where something is assuming that
-_sinittext is the same as one of those other symbols. But reverting the
-accidental change fixes the regression, so it seems worth committing that
-now.
-
-Signed-off-by: Tim Abbott <tabbott@ksplice.com>
-Reported-by: richard -rw- weinberger <richard.weinberger@gmail.com>
-Cc: Jeff Dike <jdike@addtoit.com>
-Cc: user-mode-linux-devel@lists.sourceforge.net
----
- arch/um/kernel/uml.lds.S | 2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S
-index e7a6cca..664f942 100644
---- a/arch/um/kernel/uml.lds.S
-+++ b/arch/um/kernel/uml.lds.S
-@@ -22,7 +22,7 @@ SECTIONS
- _text = .;
- _stext = .;
- __init_begin = .;
-- INIT_TEXT_SECTION(PAGE_SIZE)
-+ INIT_TEXT_SECTION(0)
- . = ALIGN(PAGE_SIZE);
-
- .text :
+++ /dev/null
-make ZLIB_DEFLATE visible, so that we can choose whether we want it built-in
-or as a module
-
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -92,7 +92,7 @@ config ZLIB_INFLATE
- tristate
-
- config ZLIB_DEFLATE
-- tristate
-+ tristate "Zlib compression"
-
- config LZO_COMPRESS
- tristate