[kernel] r11498 - in dists/trunk/linux-2.6/debian/patches: bugfix/all series

Maximilian Attems maks at alioth.debian.org
Fri May 30 09:21:21 UTC 2008


Author: maks
Date: Fri May 30 09:21:20 2008
New Revision: 11498

Log:
update to 2.6.26-rc4-git3

no new conflicts


Added:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.26-rc4-git3
Modified:
   dists/trunk/linux-2.6/debian/patches/series/1~experimental.1

Added: dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.26-rc4-git3
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.26-rc4-git3	Fri May 30 09:21:20 2008
@@ -0,0 +1,6158 @@
+diff --git a/arch/avr32/configs/atngw100_defconfig b/arch/avr32/configs/atngw100_defconfig
+index 0604607..119edb8 100644
+--- a/arch/avr32/configs/atngw100_defconfig
++++ b/arch/avr32/configs/atngw100_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc7
+-# Wed Jan  9 23:20:41 2008
++# Linux kernel version: 2.6.26-rc3
++# Mon May 26 13:30:59 2008
+ #
+ CONFIG_AVR32=y
+ CONFIG_GENERIC_GPIO=y
+@@ -13,10 +13,10 @@ CONFIG_HARDIRQS_SW_RESEND=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
+ CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
+ # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+ # CONFIG_ARCH_HAS_ILOG2_U32 is not set
+ # CONFIG_ARCH_HAS_ILOG2_U64 is not set
+-CONFIG_ARCH_SUPPORTS_OPROFILE=y
+ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_CALIBRATE_DELAY=y
+ CONFIG_GENERIC_BUG=y
+@@ -37,17 +37,15 @@ CONFIG_POSIX_MQUEUE=y
+ CONFIG_BSD_PROCESS_ACCT=y
+ CONFIG_BSD_PROCESS_ACCT_V3=y
+ # 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_GROUP_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=y
+@@ -61,11 +59,13 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ # CONFIG_BASE_FULL is not set
+ 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
+@@ -73,11 +73,21 @@ CONFIG_SLUB_DEBUG=y
+ # CONFIG_SLAB is not set
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
++CONFIG_PROFILING=y
++# CONFIG_MARKERS is not set
++CONFIG_OPROFILE=m
++CONFIG_HAVE_OPROFILE=y
++CONFIG_KPROBES=y
++CONFIG_HAVE_KPROBES=y
++# CONFIG_HAVE_KRETPROBES is not set
++# CONFIG_HAVE_DMA_ATTRS is not set
++CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=1
+ CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ CONFIG_MODULE_FORCE_UNLOAD=y
+ # CONFIG_MODVERSIONS is not set
+@@ -101,10 +111,15 @@ CONFIG_IOSCHED_CFQ=y
+ CONFIG_DEFAULT_CFQ=y
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="cfq"
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # System Type and features
+ #
++CONFIG_TICK_ONESHOT=y
++CONFIG_NO_HZ=y
++CONFIG_HIGH_RES_TIMERS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+ CONFIG_SUBARCH_AVR32B=y
+ CONFIG_MMU=y
+ CONFIG_PERFORMANCE_COUNTERS=y
+@@ -141,16 +156,19 @@ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+ # CONFIG_SPARSEMEM_STATIC is not set
+ # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+ # CONFIG_OWNERSHIP_TRACE is not set
++CONFIG_NMI_DEBUGGING=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_CMDLINE=""
+ 
+ #
+@@ -164,9 +182,10 @@ CONFIG_CPU_FREQ=y
+ CONFIG_CPU_FREQ_TABLE=y
+ # CONFIG_CPU_FREQ_DEBUG is not set
+ # CONFIG_CPU_FREQ_STAT is not set
+-CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+-# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
++CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+ CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+ # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+@@ -202,6 +221,7 @@ 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=y
+ # CONFIG_NET_KEY_MIGRATE is not set
+ CONFIG_INET=y
+@@ -255,87 +275,40 @@ 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_NDISC_NODETYPE=y
+ # CONFIG_IPV6_TUNNEL is not set
+ # CONFIG_IPV6_MULTIPLE_TABLES is not set
++# CONFIG_IPV6_MROUTE is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
+-CONFIG_BRIDGE_NETFILTER=y
++# CONFIG_NETFILTER_ADVANCED is not set
+ 
+ #
+ # Core Netfilter Configuration
+ #
+-# CONFIG_NETFILTER_NETLINK is not set
+-CONFIG_NF_CONNTRACK_ENABLED=m
++CONFIG_NETFILTER_NETLINK=m
++CONFIG_NETFILTER_NETLINK_LOG=m
+ CONFIG_NF_CONNTRACK=m
+-CONFIG_NF_CT_ACCT=y
+-CONFIG_NF_CONNTRACK_MARK=y
+-# CONFIG_NF_CONNTRACK_EVENTS is not set
+-CONFIG_NF_CT_PROTO_GRE=m
+-# CONFIG_NF_CT_PROTO_SCTP is not set
+-# CONFIG_NF_CT_PROTO_UDPLITE is not set
+-CONFIG_NF_CONNTRACK_AMANDA=m
+ CONFIG_NF_CONNTRACK_FTP=m
+-CONFIG_NF_CONNTRACK_H323=m
+ CONFIG_NF_CONNTRACK_IRC=m
+-CONFIG_NF_CONNTRACK_NETBIOS_NS=m
+-CONFIG_NF_CONNTRACK_PPTP=m
+-CONFIG_NF_CONNTRACK_SANE=m
+ CONFIG_NF_CONNTRACK_SIP=m
+-CONFIG_NF_CONNTRACK_TFTP=m
++CONFIG_NF_CT_NETLINK=m
+ CONFIG_NETFILTER_XTABLES=y
+-CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+-# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
+-# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+ CONFIG_NETFILTER_XT_TARGET_MARK=m
+-CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+ CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+-# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
+-# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
+ CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+-CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+-CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+-# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
+-CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
+ CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+-# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+-# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+-CONFIG_NETFILTER_XT_MATCH_ESP=m
+-CONFIG_NETFILTER_XT_MATCH_HELPER=m
+-CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+-CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+-CONFIG_NETFILTER_XT_MATCH_MAC=m
+ CONFIG_NETFILTER_XT_MATCH_MARK=m
+ CONFIG_NETFILTER_XT_MATCH_POLICY=m
+-CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+-# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
+-CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+-CONFIG_NETFILTER_XT_MATCH_QUOTA=m
+-CONFIG_NETFILTER_XT_MATCH_REALM=m
+-# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+ CONFIG_NETFILTER_XT_MATCH_STATE=m
+-CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
+-CONFIG_NETFILTER_XT_MATCH_STRING=m
+-CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
+-# CONFIG_NETFILTER_XT_MATCH_TIME is not set
+-# CONFIG_NETFILTER_XT_MATCH_U32 is not set
+-CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
+ 
+ #
+ # IP: Netfilter Configuration
+ #
+ CONFIG_NF_CONNTRACK_IPV4=m
+ CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+-# CONFIG_IP_NF_QUEUE is not set
+ CONFIG_IP_NF_IPTABLES=m
+-CONFIG_IP_NF_MATCH_IPRANGE=m
+-CONFIG_IP_NF_MATCH_TOS=m
+-CONFIG_IP_NF_MATCH_RECENT=m
+-CONFIG_IP_NF_MATCH_ECN=m
+-CONFIG_IP_NF_MATCH_AH=m
+-CONFIG_IP_NF_MATCH_TTL=m
+-CONFIG_IP_NF_MATCH_OWNER=m
+-CONFIG_IP_NF_MATCH_ADDRTYPE=m
+ CONFIG_IP_NF_FILTER=m
+ CONFIG_IP_NF_TARGET_REJECT=m
+ CONFIG_IP_NF_TARGET_LOG=m
+@@ -343,54 +316,25 @@ CONFIG_IP_NF_TARGET_LOG=m
+ CONFIG_NF_NAT=m
+ CONFIG_NF_NAT_NEEDED=y
+ CONFIG_IP_NF_TARGET_MASQUERADE=m
+-CONFIG_IP_NF_TARGET_REDIRECT=m
+-CONFIG_IP_NF_TARGET_NETMAP=m
+-CONFIG_IP_NF_TARGET_SAME=m
+-CONFIG_NF_NAT_SNMP_BASIC=m
+-CONFIG_NF_NAT_PROTO_GRE=m
+ CONFIG_NF_NAT_FTP=m
+ CONFIG_NF_NAT_IRC=m
+-CONFIG_NF_NAT_TFTP=m
+-CONFIG_NF_NAT_AMANDA=m
+-CONFIG_NF_NAT_PPTP=m
+-CONFIG_NF_NAT_H323=m
++# CONFIG_NF_NAT_TFTP is not set
++# CONFIG_NF_NAT_AMANDA is not set
++# CONFIG_NF_NAT_PPTP is not set
++# CONFIG_NF_NAT_H323 is not set
+ CONFIG_NF_NAT_SIP=m
+ CONFIG_IP_NF_MANGLE=m
+-CONFIG_IP_NF_TARGET_TOS=m
+-CONFIG_IP_NF_TARGET_ECN=m
+-CONFIG_IP_NF_TARGET_TTL=m
+-CONFIG_IP_NF_TARGET_CLUSTERIP=m
+-CONFIG_IP_NF_RAW=m
+-CONFIG_IP_NF_ARPTABLES=m
+-CONFIG_IP_NF_ARPFILTER=m
+-CONFIG_IP_NF_ARP_MANGLE=m
+ 
+ #
+-# IPv6: Netfilter Configuration (EXPERIMENTAL)
++# IPv6: Netfilter Configuration
+ #
+ CONFIG_NF_CONNTRACK_IPV6=m
+-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_OWNER=m
+ CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+-CONFIG_IP6_NF_MATCH_AH=m
+-CONFIG_IP6_NF_MATCH_MH=m
+-CONFIG_IP6_NF_MATCH_EUI64=m
+ CONFIG_IP6_NF_FILTER=m
+ CONFIG_IP6_NF_TARGET_LOG=m
+ CONFIG_IP6_NF_TARGET_REJECT=m
+ CONFIG_IP6_NF_MANGLE=m
+-CONFIG_IP6_NF_TARGET_HL=m
+-CONFIG_IP6_NF_RAW=m
+-
+-#
+-# Bridge: Netfilter Configuration
+-#
+-# CONFIG_BRIDGE_NF_EBTABLES is not set
+ # CONFIG_IP_DCCP is not set
+ # CONFIG_IP_SCTP is not set
+ # CONFIG_TIPC is not set
+@@ -407,7 +351,6 @@ CONFIG_LLC=m
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
+ # CONFIG_NET_SCHED is not set
+-CONFIG_NET_CLS_ROUTE=y
+ 
+ #
+ # Network testing
+@@ -415,6 +358,7 @@ CONFIG_NET_CLS_ROUTE=y
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_NET_TCPPROBE 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
+@@ -450,6 +394,7 @@ CONFIG_MTD=y
+ CONFIG_MTD_PARTITIONS=y
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ CONFIG_MTD_CMDLINE_PARTS=y
++# CONFIG_MTD_AR7_PARTS is not set
+ 
+ #
+ # User Modules And Translation Layers
+@@ -531,11 +476,18 @@ CONFIG_BLK_DEV_NBD=m
+ CONFIG_BLK_DEV_RAM=m
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_BLK_DEV_XIP is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+-# CONFIG_MISC_DEVICES is not set
+-# CONFIG_IDE is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_ATMEL_PWM is not set
++CONFIG_ATMEL_TCLIB=y
++CONFIG_ATMEL_TCB_CLKSRC=y
++CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_ATMEL_SSC is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_HAVE_IDE is not set
+ 
+ #
+ # SCSI device support
+@@ -568,11 +520,13 @@ CONFIG_PHYLIB=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 is not set
+ CONFIG_MACB=y
++# CONFIG_ENC28J60 is not set
+ # CONFIG_IBM_NEW_EMAC_ZMII is not set
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+@@ -586,6 +540,7 @@ CONFIG_MACB=y
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
++# CONFIG_IWLWIFI_LEDS is not set
+ # CONFIG_WAN is not set
+ CONFIG_PPP=m
+ # CONFIG_PPP_MULTILINK is not set
+@@ -599,7 +554,6 @@ CONFIG_PPPOE=m
+ # CONFIG_PPPOL2TP is not set
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=m
+-# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -621,6 +575,7 @@ CONFIG_SLHC=m
+ # Character devices
+ #
+ # CONFIG_VT is not set
++# CONFIG_DEVKMEM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+ 
+ #
+@@ -633,6 +588,7 @@ CONFIG_SLHC=m
+ #
+ CONFIG_SERIAL_ATMEL=y
+ CONFIG_SERIAL_ATMEL_CONSOLE=y
++CONFIG_SERIAL_ATMEL_PDC=y
+ # CONFIG_SERIAL_ATMEL_TTYAT is not set
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
+@@ -640,21 +596,13 @@ CONFIG_UNIX98_PTYS=y
+ # CONFIG_LEGACY_PTYS is not set
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
+-# CONFIG_RTC 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=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
+@@ -665,27 +613,23 @@ CONFIG_I2C_GPIO=m
+ # CONFIG_I2C_SIMTEC is not set
+ # CONFIG_I2C_TAOS_EVM is not set
+ # CONFIG_I2C_STUB is not set
++# CONFIG_I2C_PCA_PLATFORM is not set
+ 
+ #
+ # Miscellaneous I2C Chip support
+ #
+-# CONFIG_SENSORS_DS1337 is not set
+-# CONFIG_SENSORS_DS1374 is not set
+ # CONFIG_DS1682 is not set
+ # CONFIG_SENSORS_EEPROM is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_SENSORS_PCA9539 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
+@@ -702,9 +646,27 @@ CONFIG_SPI_ATMEL=y
+ # CONFIG_SPI_AT25 is not set
+ CONFIG_SPI_SPIDEV=m
+ # CONFIG_SPI_TLE62X0 is not set
++CONFIG_HAVE_GPIO_LIB=y
++
++#
++# GPIO Support
++#
++# CONFIG_DEBUG_GPIO is not set
++
++#
++# I2C GPIO expanders:
++#
++# CONFIG_GPIO_PCA953X is not set
++# CONFIG_GPIO_PCF857X is not set
++
++#
++# SPI GPIO expanders:
++#
++# CONFIG_GPIO_MCP23S08 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
+ 
+@@ -724,12 +686,22 @@ CONFIG_SSB_POSSIBLE=y
+ # Multifunction device drivers
+ #
+ # CONFIG_MFD_SM501 is not set
++# CONFIG_HTC_PASIC3 is not set
+ 
+ #
+ # Multimedia devices
+ #
++
++#
++# Multimedia core support
++#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
+ # CONFIG_DAB is not set
+ 
+ #
+@@ -753,14 +725,12 @@ 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
++# CONFIG_USB_OTG_WHITELIST is not set
++# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+ 
+ #
+ # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+-
+-#
+-# USB Gadget Support
+-#
+ CONFIG_USB_GADGET=y
+ # CONFIG_USB_GADGET_DEBUG is not set
+ # CONFIG_USB_GADGET_DEBUG_FILES is not set
+@@ -772,6 +742,7 @@ CONFIG_USB_ATMEL_USBA=y
+ # CONFIG_USB_GADGET_NET2280 is not set
+ # CONFIG_USB_GADGET_PXA2XX is not set
+ # CONFIG_USB_GADGET_M66592 is not set
++# CONFIG_USB_GADGET_PXA27X is not set
+ # CONFIG_USB_GADGET_GOKU is not set
+ # CONFIG_USB_GADGET_LH7A40X is not set
+ # CONFIG_USB_GADGET_OMAP is not set
+@@ -787,6 +758,7 @@ CONFIG_USB_FILE_STORAGE=m
+ # CONFIG_USB_FILE_STORAGE_TEST is not set
+ CONFIG_USB_G_SERIAL=m
+ # CONFIG_USB_MIDI_GADGET is not set
++# CONFIG_USB_G_PRINTER is not set
+ CONFIG_MMC=m
+ # CONFIG_MMC_DEBUG is not set
+ # CONFIG_MMC_UNSAFE_RESUME is not set
+@@ -797,11 +769,13 @@ CONFIG_MMC=m
+ CONFIG_MMC_BLOCK=m
+ CONFIG_MMC_BLOCK_BOUNCE=y
+ # CONFIG_SDIO_UART is not set
++# CONFIG_MMC_TEST is not set
+ 
+ #
+ # MMC/SD Host Controller Drivers
+ #
+ CONFIG_MMC_SPI=m
++# CONFIG_MEMSTICK is not set
+ CONFIG_NEW_LEDS=y
+ CONFIG_LEDS_CLASS=y
+ 
+@@ -816,6 +790,8 @@ CONFIG_LEDS_GPIO=y
+ CONFIG_LEDS_TRIGGERS=y
+ CONFIG_LEDS_TRIGGER_TIMER=y
+ CONFIG_LEDS_TRIGGER_HEARTBEAT=y
++CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
++# CONFIG_ACCESSIBILITY is not set
+ CONFIG_RTC_LIB=y
+ CONFIG_RTC_CLASS=y
+ CONFIG_RTC_HCTOSYS=y
+@@ -844,19 +820,22 @@ CONFIG_RTC_INTF_DEV=y
+ # 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_RS5C348 is not set
+ # 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_DS1511 is not set
+ # CONFIG_RTC_DRV_DS1553 is not set
+-# CONFIG_RTC_DRV_STK17TA8 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
+@@ -865,10 +844,6 @@ CONFIG_RTC_INTF_DEV=y
+ # on-CPU RTC drivers
+ #
+ CONFIG_RTC_DRV_AT32AP700X=y
+-
+-#
+-# Userspace I/O
+-#
+ # CONFIG_UIO is not set
+ 
+ #
+@@ -885,14 +860,11 @@ CONFIG_JBD=m
+ # 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_DNOTIFY is not set
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
+-# CONFIG_DNOTIFY is not set
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
+ CONFIG_FUSE_FS=m
+@@ -948,8 +920,10 @@ 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
+@@ -957,12 +931,10 @@ 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=m
+ CONFIG_NFSD_V3=y
+ # CONFIG_NFSD_V3_ACL is not set
+ # CONFIG_NFSD_V4 is not set
+-CONFIG_NFSD_TCP=y
+ CONFIG_ROOT_NFS=y
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+@@ -1030,11 +1002,6 @@ CONFIG_NLS_ISO8859_1=m
+ # CONFIG_NLS_KOI8_U is not set
+ CONFIG_NLS_UTF8=m
+ # CONFIG_DLM is not set
+-CONFIG_INSTRUMENTATION=y
+-CONFIG_PROFILING=y
+-CONFIG_OPROFILE=m
+-CONFIG_KPROBES=y
+-# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+@@ -1042,6 +1009,7 @@ CONFIG_KPROBES=y
+ # CONFIG_PRINTK_TIME is not set
+ CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=1024
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+ # CONFIG_DEBUG_FS is not set
+@@ -1052,7 +1020,9 @@ CONFIG_DETECT_SOFTLOCKUP=y
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
++# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_SLUB_DEBUG_ON is not set
++# CONFIG_SLUB_STATS is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+ # CONFIG_DEBUG_SPINLOCK is not set
+@@ -1066,12 +1036,14 @@ CONFIG_SCHED_DEBUG=y
+ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_WRITECOUNT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ CONFIG_FRAME_POINTER=y
+-# CONFIG_FORCED_INLINING is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_KPROBES_SANITY_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_LKDTM is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+@@ -1083,52 +1055,90 @@ CONFIG_FRAME_POINTER=y
+ # CONFIG_SECURITY is not set
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
+ CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_AEAD=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_MANAGER=y
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_AUTHENC=y
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Authenticated Encryption with Associated Data
++#
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_SEQIV is not set
++
++#
++# Block modes
++#
++CONFIG_CRYPTO_CBC=y
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_CTS is not set
++CONFIG_CRYPTO_ECB=m
++# CONFIG_CRYPTO_LRW is not set
++CONFIG_CRYPTO_PCBC=m
++# CONFIG_CRYPTO_XTS is not set
++
++#
++# Hash modes
++#
+ CONFIG_CRYPTO_HMAC=y
+ # CONFIG_CRYPTO_XCBC is not set
+-# CONFIG_CRYPTO_NULL is not set
++
++#
++# Digest
++#
++# CONFIG_CRYPTO_CRC32C is not set
+ # CONFIG_CRYPTO_MD4 is not set
+ CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
+ CONFIG_CRYPTO_SHA1=y
+ # 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_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_WP512 is not set
++
++#
++# Ciphers
++#
+ # CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++CONFIG_CRYPTO_ARC4=m
++# 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_TEA is not set
+-CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
+ # CONFIG_CRYPTO_KHAZAD is not set
+-# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SALSA20 is not set
+ # CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++
++#
++# Compression
++#
+ CONFIG_CRYPTO_DEFLATE=y
+-# 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
+ 
+ #
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
++# CONFIG_GENERIC_FIND_NEXT_BIT is not set
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+ CONFIG_CRC_ITU_T=m
+@@ -1137,10 +1147,6 @@ CONFIG_CRC7=m
+ # CONFIG_LIBCRC32C is not set
+ CONFIG_ZLIB_INFLATE=y
+ CONFIG_ZLIB_DEFLATE=y
+-CONFIG_TEXTSEARCH=y
+-CONFIG_TEXTSEARCH_KMP=m
+-CONFIG_TEXTSEARCH_BM=m
+-CONFIG_TEXTSEARCH_FSM=m
+ CONFIG_PLIST=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+diff --git a/arch/avr32/configs/atstk1002_defconfig b/arch/avr32/configs/atstk1002_defconfig
+index 2fb2ede..c6d02ea 100644
+--- a/arch/avr32/configs/atstk1002_defconfig
++++ b/arch/avr32/configs/atstk1002_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc7
+-# Wed Jan  9 23:07:43 2008
++# Linux kernel version: 2.6.26-rc3
++# Mon May 26 13:30:20 2008
+ #
+ CONFIG_AVR32=y
+ CONFIG_GENERIC_GPIO=y
+@@ -13,10 +13,10 @@ CONFIG_HARDIRQS_SW_RESEND=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
+ CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
+ # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+ # CONFIG_ARCH_HAS_ILOG2_U32 is not set
+ # CONFIG_ARCH_HAS_ILOG2_U64 is not set
+-CONFIG_ARCH_SUPPORTS_OPROFILE=y
+ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_CALIBRATE_DELAY=y
+ CONFIG_GENERIC_BUG=y
+@@ -36,15 +36,15 @@ 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 is not set
++# CONFIG_GROUP_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=y
+@@ -58,11 +58,13 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ # CONFIG_BASE_FULL is not set
+ 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
+@@ -70,11 +72,21 @@ CONFIG_SLUB_DEBUG=y
+ # CONFIG_SLAB is not set
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
++CONFIG_PROFILING=y
++# CONFIG_MARKERS is not set
++CONFIG_OPROFILE=m
++CONFIG_HAVE_OPROFILE=y
++CONFIG_KPROBES=y
++CONFIG_HAVE_KPROBES=y
++# CONFIG_HAVE_KRETPROBES is not set
++# CONFIG_HAVE_DMA_ATTRS is not set
++CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=1
+ CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ # CONFIG_MODVERSIONS is not set
+@@ -98,10 +110,15 @@ CONFIG_IOSCHED_CFQ=y
+ CONFIG_DEFAULT_CFQ=y
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="cfq"
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # System Type and features
+ #
++CONFIG_TICK_ONESHOT=y
++CONFIG_NO_HZ=y
++CONFIG_HIGH_RES_TIMERS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+ CONFIG_SUBARCH_AVR32B=y
+ CONFIG_MMU=y
+ CONFIG_PERFORMANCE_COUNTERS=y
+@@ -147,16 +164,19 @@ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+ # CONFIG_SPARSEMEM_STATIC is not set
+ # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+ # CONFIG_OWNERSHIP_TRACE is not set
++CONFIG_NMI_DEBUGGING=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_CMDLINE=""
+ 
+ #
+@@ -170,9 +190,10 @@ CONFIG_CPU_FREQ=y
+ CONFIG_CPU_FREQ_TABLE=y
+ # CONFIG_CPU_FREQ_DEBUG is not set
+ # CONFIG_CPU_FREQ_STAT is not set
+-CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+-# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
++CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+ CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+ # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+@@ -208,6 +229,7 @@ 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
+@@ -252,8 +274,10 @@ 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_NDISC_NODETYPE=y
+ CONFIG_IPV6_TUNNEL=m
+ # CONFIG_IPV6_MULTIPLE_TABLES is not set
++# CONFIG_IPV6_MROUTE is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ # CONFIG_NETFILTER is not set
+ # CONFIG_IP_DCCP is not set
+@@ -279,6 +303,7 @@ CONFIG_LLC=m
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_NET_TCPPROBE 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
+@@ -314,6 +339,7 @@ CONFIG_MTD=y
+ CONFIG_MTD_PARTITIONS=y
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ CONFIG_MTD_CMDLINE_PARTS=y
++# CONFIG_MTD_AR7_PARTS is not set
+ 
+ #
+ # User Modules And Translation Layers
+@@ -368,6 +394,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+ #
+ CONFIG_MTD_DATAFLASH=m
+ CONFIG_MTD_M25P80=m
++CONFIG_M25PXX_USE_FAST_READ=y
+ # CONFIG_MTD_SLRAM is not set
+ # CONFIG_MTD_PHRAM is not set
+ # CONFIG_MTD_MTDRAM is not set
+@@ -395,13 +422,18 @@ CONFIG_BLK_DEV_NBD=m
+ CONFIG_BLK_DEV_RAM=m
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# 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_ATMEL_PWM=m
++CONFIG_ATMEL_TCLIB=y
++CONFIG_ATMEL_TCB_CLKSRC=y
++CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
+ # CONFIG_EEPROM_93CX6 is not set
+ CONFIG_ATMEL_SSC=m
+-# CONFIG_IDE is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_HAVE_IDE is not set
+ 
+ #
+ # SCSI device support
+@@ -444,6 +476,9 @@ CONFIG_SCSI_WAIT_SCAN=m
+ # CONFIG_SCSI_LOWLEVEL is not set
+ CONFIG_ATA=m
+ # CONFIG_ATA_NONSTANDARD is not set
++# CONFIG_SATA_PMP is not set
++CONFIG_ATA_SFF=y
++# CONFIG_SATA_MV is not set
+ CONFIG_PATA_AT32=m
+ # CONFIG_PATA_PLATFORM is not set
+ # CONFIG_MD is not set
+@@ -469,11 +504,13 @@ CONFIG_PHYLIB=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 is not set
+ CONFIG_MACB=y
++# CONFIG_ENC28J60 is not set
+ # CONFIG_IBM_NEW_EMAC_ZMII is not set
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+@@ -487,6 +524,7 @@ CONFIG_MACB=y
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
++# CONFIG_IWLWIFI_LEDS is not set
+ # CONFIG_WAN is not set
+ CONFIG_PPP=m
+ # CONFIG_PPP_MULTILINK is not set
+@@ -500,7 +538,6 @@ CONFIG_PPP_BSDCOMP=m
+ # CONFIG_PPPOL2TP is not set
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=m
+-# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -556,6 +593,7 @@ CONFIG_MOUSE_GPIO=m
+ # Character devices
+ #
+ # CONFIG_VT is not set
++# CONFIG_DEVKMEM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+ 
+ #
+@@ -568,6 +606,7 @@ CONFIG_MOUSE_GPIO=m
+ #
+ CONFIG_SERIAL_ATMEL=y
+ CONFIG_SERIAL_ATMEL_CONSOLE=y
++CONFIG_SERIAL_ATMEL_PDC=y
+ # CONFIG_SERIAL_ATMEL_TTYAT is not set
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
+@@ -575,21 +614,13 @@ CONFIG_UNIX98_PTYS=y
+ # CONFIG_LEGACY_PTYS is not set
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
+-# CONFIG_RTC 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=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
+@@ -600,27 +631,23 @@ CONFIG_I2C_GPIO=m
+ # CONFIG_I2C_SIMTEC is not set
+ # CONFIG_I2C_TAOS_EVM is not set
+ # CONFIG_I2C_STUB is not set
++# CONFIG_I2C_PCA_PLATFORM is not set
+ 
+ #
+ # Miscellaneous I2C Chip support
+ #
+-# CONFIG_SENSORS_DS1337 is not set
+-# CONFIG_SENSORS_DS1374 is not set
+ # CONFIG_DS1682 is not set
+ # CONFIG_SENSORS_EEPROM is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_SENSORS_PCA9539 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
+@@ -637,9 +664,27 @@ CONFIG_SPI_ATMEL=y
+ # CONFIG_SPI_AT25 is not set
+ CONFIG_SPI_SPIDEV=m
+ # CONFIG_SPI_TLE62X0 is not set
++CONFIG_HAVE_GPIO_LIB=y
++
++#
++# GPIO Support
++#
++# CONFIG_DEBUG_GPIO is not set
++
++#
++# I2C GPIO expanders:
++#
++# CONFIG_GPIO_PCA953X is not set
++# CONFIG_GPIO_PCF857X is not set
++
++#
++# SPI GPIO expanders:
++#
++# CONFIG_GPIO_MCP23S08 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
+ 
+@@ -659,12 +704,22 @@ CONFIG_SSB_POSSIBLE=y
+ # Multifunction device drivers
+ #
+ # CONFIG_MFD_SM501 is not set
++# CONFIG_HTC_PASIC3 is not set
+ 
+ #
+ # Multimedia devices
+ #
++
++#
++# Multimedia core support
++#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
+ # CONFIG_DAB is not set
+ 
+ #
+@@ -682,8 +737,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y
+ # CONFIG_FB_SYS_FILLRECT is not set
+ # CONFIG_FB_SYS_COPYAREA is not set
+ # CONFIG_FB_SYS_IMAGEBLIT is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
+ # CONFIG_FB_SYS_FOPS is not set
+-CONFIG_FB_DEFERRED_IO=y
+ # CONFIG_FB_SVGALIB is not set
+ # CONFIG_FB_MACMODES is not set
+ # CONFIG_FB_BACKLIGHT is not set
+@@ -749,7 +804,11 @@ CONFIG_SND_AT73C213_TARGET_BITRATE=48000
+ # CONFIG_SND_SOC is not set
+ 
+ #
+-# SoC Audio support for SuperH
++# ALSA SoC audio for Freescale SOCs
++#
++
++#
++# SoC Audio for the Texas Instruments OMAP
+ #
+ 
+ #
+@@ -761,14 +820,12 @@ 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
++# CONFIG_USB_OTG_WHITELIST is not set
++# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+ 
+ #
+ # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+-
+-#
+-# USB Gadget Support
+-#
+ CONFIG_USB_GADGET=y
+ # CONFIG_USB_GADGET_DEBUG is not set
+ # CONFIG_USB_GADGET_DEBUG_FILES is not set
+@@ -781,6 +838,7 @@ CONFIG_USB_ATMEL_USBA=y
+ # CONFIG_USB_GADGET_NET2280 is not set
+ # CONFIG_USB_GADGET_PXA2XX is not set
+ # CONFIG_USB_GADGET_M66592 is not set
++# CONFIG_USB_GADGET_PXA27X is not set
+ # CONFIG_USB_GADGET_GOKU is not set
+ # CONFIG_USB_GADGET_LH7A40X is not set
+ # CONFIG_USB_GADGET_OMAP is not set
+@@ -796,6 +854,7 @@ CONFIG_USB_FILE_STORAGE=m
+ # CONFIG_USB_FILE_STORAGE_TEST is not set
+ CONFIG_USB_G_SERIAL=m
+ # CONFIG_USB_MIDI_GADGET is not set
++# CONFIG_USB_G_PRINTER is not set
+ CONFIG_MMC=m
+ # CONFIG_MMC_DEBUG is not set
+ # CONFIG_MMC_UNSAFE_RESUME is not set
+@@ -806,17 +865,20 @@ CONFIG_MMC=m
+ CONFIG_MMC_BLOCK=m
+ CONFIG_MMC_BLOCK_BOUNCE=y
+ # CONFIG_SDIO_UART is not set
++CONFIG_MMC_TEST=m
+ 
+ #
+ # MMC/SD Host Controller Drivers
+ #
+ CONFIG_MMC_SPI=m
++# CONFIG_MEMSTICK is not set
+ CONFIG_NEW_LEDS=y
+ CONFIG_LEDS_CLASS=m
+ 
+ #
+ # LED drivers
+ #
++CONFIG_LEDS_ATMEL_PWM=m
+ CONFIG_LEDS_GPIO=m
+ 
+ #
+@@ -825,6 +887,8 @@ CONFIG_LEDS_GPIO=m
+ CONFIG_LEDS_TRIGGERS=y
+ CONFIG_LEDS_TRIGGER_TIMER=m
+ CONFIG_LEDS_TRIGGER_HEARTBEAT=m
++CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
++# CONFIG_ACCESSIBILITY is not set
+ CONFIG_RTC_LIB=y
+ CONFIG_RTC_CLASS=y
+ CONFIG_RTC_HCTOSYS=y
+@@ -853,19 +917,22 @@ CONFIG_RTC_INTF_DEV=y
+ # 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_RS5C348 is not set
+ # 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_DS1511 is not set
+ # CONFIG_RTC_DRV_DS1553 is not set
+-# CONFIG_RTC_DRV_STK17TA8 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
+@@ -874,10 +941,6 @@ CONFIG_RTC_INTF_DEV=y
+ # on-CPU RTC drivers
+ #
+ CONFIG_RTC_DRV_AT32AP700X=y
+-
+-#
+-# Userspace I/O
+-#
+ # CONFIG_UIO is not set
+ 
+ #
+@@ -895,14 +958,11 @@ CONFIG_JBD=m
+ # 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=m
+-# CONFIG_ROMFS_FS is not set
++# CONFIG_DNOTIFY is not set
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
+-# CONFIG_DNOTIFY is not set
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
+ CONFIG_FUSE_FS=m
+@@ -957,8 +1017,10 @@ CONFIG_JFFS2_RTIME=y
+ # CONFIG_JFFS2_RUBIN 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 is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+@@ -966,7 +1028,6 @@ 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
+@@ -1028,11 +1089,6 @@ CONFIG_NLS_ISO8859_1=m
+ # CONFIG_NLS_KOI8_U is not set
+ CONFIG_NLS_UTF8=m
+ # CONFIG_DLM is not set
+-CONFIG_INSTRUMENTATION=y
+-CONFIG_PROFILING=y
+-CONFIG_OPROFILE=m
+-CONFIG_KPROBES=y
+-# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+@@ -1040,6 +1096,7 @@ CONFIG_KPROBES=y
+ # CONFIG_PRINTK_TIME is not set
+ CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=1024
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+ CONFIG_DEBUG_FS=y
+@@ -1050,7 +1107,9 @@ CONFIG_DETECT_SOFTLOCKUP=y
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
++# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_SLUB_DEBUG_ON is not set
++# CONFIG_SLUB_STATS is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+ # CONFIG_DEBUG_SPINLOCK is not set
+@@ -1064,12 +1123,14 @@ CONFIG_SCHED_DEBUG=y
+ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_WRITECOUNT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ CONFIG_FRAME_POINTER=y
+-CONFIG_FORCED_INLINING=y
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_KPROBES_SANITY_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_LKDTM is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+@@ -1081,52 +1142,90 @@ CONFIG_FORCED_INLINING=y
+ # CONFIG_SECURITY is not set
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
++
++#
++# Crypto core or helper
++#
+ CONFIG_CRYPTO_ALGAPI=m
++CONFIG_CRYPTO_AEAD=m
+ CONFIG_CRYPTO_BLKCIPHER=m
+ CONFIG_CRYPTO_HASH=m
+ CONFIG_CRYPTO_MANAGER=m
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_AUTHENC=m
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Authenticated Encryption with Associated Data
++#
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_SEQIV is not set
++
++#
++# Block modes
++#
++CONFIG_CRYPTO_CBC=m
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_CTS is not set
++# CONFIG_CRYPTO_ECB is not set
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_XTS is not set
++
++#
++# Hash modes
++#
+ CONFIG_CRYPTO_HMAC=m
+ # CONFIG_CRYPTO_XCBC is not set
+-# CONFIG_CRYPTO_NULL is not set
++
++#
++# Digest
++#
++# CONFIG_CRYPTO_CRC32C is not set
+ # CONFIG_CRYPTO_MD4 is not set
+ CONFIG_CRYPTO_MD5=m
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
+ 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=m
+-# CONFIG_CRYPTO_PCBC is not set
+-# CONFIG_CRYPTO_LRW is not set
+-# CONFIG_CRYPTO_XTS is not set
+-# CONFIG_CRYPTO_CRYPTD is not set
+-CONFIG_CRYPTO_DES=m
+-# CONFIG_CRYPTO_FCRYPT is not set
+-# CONFIG_CRYPTO_BLOWFISH is not set
+-# CONFIG_CRYPTO_TWOFISH is not set
+-# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_WP512 is not set
++
++#
++# Ciphers
++#
+ # CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
+ # CONFIG_CRYPTO_CAST5 is not set
+ # CONFIG_CRYPTO_CAST6 is not set
+-# CONFIG_CRYPTO_TEA is not set
+-# CONFIG_CRYPTO_ARC4 is not set
++CONFIG_CRYPTO_DES=m
++# CONFIG_CRYPTO_FCRYPT is not set
+ # CONFIG_CRYPTO_KHAZAD is not set
+-# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SALSA20 is not set
+ # CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++
++#
++# Compression
++#
+ CONFIG_CRYPTO_DEFLATE=m
+-# 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
+ 
+ #
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
++# CONFIG_GENERIC_FIND_NEXT_BIT is not set
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+ CONFIG_CRC_ITU_T=m
+diff --git a/arch/avr32/configs/atstk1003_defconfig b/arch/avr32/configs/atstk1003_defconfig
+index 45e23e0..5a4ae6b 100644
+--- a/arch/avr32/configs/atstk1003_defconfig
++++ b/arch/avr32/configs/atstk1003_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc7
+-# Wed Jan  9 22:54:34 2008
++# Linux kernel version: 2.6.26-rc3
++# Mon May 26 13:33:05 2008
+ #
+ CONFIG_AVR32=y
+ CONFIG_GENERIC_GPIO=y
+@@ -13,10 +13,10 @@ CONFIG_HARDIRQS_SW_RESEND=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
+ CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
+ # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+ # CONFIG_ARCH_HAS_ILOG2_U32 is not set
+ # CONFIG_ARCH_HAS_ILOG2_U64 is not set
+-CONFIG_ARCH_SUPPORTS_OPROFILE=y
+ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_CALIBRATE_DELAY=y
+ CONFIG_GENERIC_BUG=y
+@@ -39,17 +39,15 @@ CONFIG_BSD_PROCESS_ACCT_V3=y
+ CONFIG_TASKSTATS=y
+ CONFIG_TASK_DELAY_ACCT=y
+ # CONFIG_TASK_XACCT is not set
+-# CONFIG_USER_NS is not set
+-# CONFIG_PID_NS is not set
+ CONFIG_AUDIT=y
+ # 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_GROUP_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=y
+@@ -63,11 +61,13 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ # CONFIG_BASE_FULL is not set
+ 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
+@@ -75,11 +75,20 @@ CONFIG_VM_EVENT_COUNTERS=y
+ # CONFIG_SLAB is not set
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
+-CONFIG_SLABINFO=y
++CONFIG_PROFILING=y
++# CONFIG_MARKERS is not set
++CONFIG_OPROFILE=m
++CONFIG_HAVE_OPROFILE=y
++CONFIG_KPROBES=y
++CONFIG_HAVE_KPROBES=y
++# CONFIG_HAVE_KRETPROBES is not set
++# CONFIG_HAVE_DMA_ATTRS is not set
++CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=1
+ CONFIG_MODULES=y
++# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ # CONFIG_MODVERSIONS is not set
+@@ -103,10 +112,15 @@ CONFIG_IOSCHED_CFQ=y
+ CONFIG_DEFAULT_CFQ=y
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="cfq"
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # System Type and features
+ #
++CONFIG_TICK_ONESHOT=y
++CONFIG_NO_HZ=y
++CONFIG_HIGH_RES_TIMERS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+ CONFIG_SUBARCH_AVR32B=y
+ CONFIG_MMU=y
+ CONFIG_PERFORMANCE_COUNTERS=y
+@@ -152,16 +166,19 @@ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+ # CONFIG_SPARSEMEM_STATIC is not set
+ # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+ # CONFIG_OWNERSHIP_TRACE is not set
++CONFIG_NMI_DEBUGGING=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_CMDLINE=""
+ 
+ #
+@@ -175,9 +192,10 @@ CONFIG_CPU_FREQ=y
+ CONFIG_CPU_FREQ_TABLE=y
+ # CONFIG_CPU_FREQ_DEBUG is not set
+ # CONFIG_CPU_FREQ_STAT is not set
+-CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+-# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
++CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+ # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+ CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+ # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+@@ -234,8 +252,6 @@ 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
+@@ -260,6 +276,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_NET_TCPPROBE 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
+@@ -295,6 +312,7 @@ CONFIG_MTD=y
+ CONFIG_MTD_PARTITIONS=y
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ CONFIG_MTD_CMDLINE_PARTS=y
++# CONFIG_MTD_AR7_PARTS is not set
+ 
+ #
+ # User Modules And Translation Layers
+@@ -349,6 +367,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+ #
+ CONFIG_MTD_DATAFLASH=m
+ CONFIG_MTD_M25P80=m
++CONFIG_M25PXX_USE_FAST_READ=y
+ # CONFIG_MTD_SLRAM is not set
+ # CONFIG_MTD_PHRAM is not set
+ # CONFIG_MTD_MTDRAM is not set
+@@ -376,13 +395,18 @@ CONFIG_BLK_DEV_NBD=m
+ CONFIG_BLK_DEV_RAM=m
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# 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_ATMEL_PWM=m
++CONFIG_ATMEL_TCLIB=y
++CONFIG_ATMEL_TCB_CLKSRC=y
++CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
+ # CONFIG_EEPROM_93CX6 is not set
+ CONFIG_ATMEL_SSC=m
+-# CONFIG_IDE is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_HAVE_IDE is not set
+ 
+ #
+ # SCSI device support
+@@ -427,6 +451,9 @@ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_SCSI_DEBUG is not set
+ CONFIG_ATA=m
+ # CONFIG_ATA_NONSTANDARD is not set
++# CONFIG_SATA_PMP is not set
++CONFIG_ATA_SFF=y
++# CONFIG_SATA_MV is not set
+ CONFIG_PATA_AT32=m
+ # CONFIG_PATA_PLATFORM is not set
+ # CONFIG_MD is not set
+@@ -447,6 +474,7 @@ CONFIG_NETDEVICES=y
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
++# CONFIG_IWLWIFI_LEDS is not set
+ # CONFIG_WAN is not set
+ CONFIG_PPP=m
+ # CONFIG_PPP_MULTILINK is not set
+@@ -460,7 +488,6 @@ CONFIG_PPP_BSDCOMP=m
+ # CONFIG_PPPOL2TP is not set
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=m
+-# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -516,6 +543,7 @@ CONFIG_MOUSE_GPIO=m
+ # Character devices
+ #
+ # CONFIG_VT is not set
++# CONFIG_DEVKMEM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+ 
+ #
+@@ -528,6 +556,7 @@ CONFIG_MOUSE_GPIO=m
+ #
+ CONFIG_SERIAL_ATMEL=y
+ CONFIG_SERIAL_ATMEL_CONSOLE=y
++CONFIG_SERIAL_ATMEL_PDC=y
+ # CONFIG_SERIAL_ATMEL_TTYAT is not set
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
+@@ -535,21 +564,13 @@ CONFIG_UNIX98_PTYS=y
+ # CONFIG_LEGACY_PTYS is not set
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
+-# CONFIG_RTC 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=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
+@@ -560,27 +581,23 @@ CONFIG_I2C_GPIO=m
+ # CONFIG_I2C_SIMTEC is not set
+ # CONFIG_I2C_TAOS_EVM is not set
+ # CONFIG_I2C_STUB is not set
++# CONFIG_I2C_PCA_PLATFORM is not set
+ 
+ #
+ # Miscellaneous I2C Chip support
+ #
+-# CONFIG_SENSORS_DS1337 is not set
+-# CONFIG_SENSORS_DS1374 is not set
+ # CONFIG_DS1682 is not set
+ # CONFIG_SENSORS_EEPROM is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_SENSORS_PCA9539 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
+@@ -597,9 +614,27 @@ CONFIG_SPI_ATMEL=y
+ # CONFIG_SPI_AT25 is not set
+ CONFIG_SPI_SPIDEV=m
+ # CONFIG_SPI_TLE62X0 is not set
++CONFIG_HAVE_GPIO_LIB=y
++
++#
++# GPIO Support
++#
++# CONFIG_DEBUG_GPIO is not set
++
++#
++# I2C GPIO expanders:
++#
++# CONFIG_GPIO_PCA953X is not set
++# CONFIG_GPIO_PCF857X is not set
++
++#
++# SPI GPIO expanders:
++#
++# CONFIG_GPIO_MCP23S08 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
+ 
+@@ -619,12 +654,22 @@ CONFIG_SSB_POSSIBLE=y
+ # Multifunction device drivers
+ #
+ # CONFIG_MFD_SM501 is not set
++# CONFIG_HTC_PASIC3 is not set
+ 
+ #
+ # Multimedia devices
+ #
++
++#
++# Multimedia core support
++#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
+ # CONFIG_DAB is not set
+ 
+ #
+@@ -682,7 +727,11 @@ CONFIG_SND_AT73C213_TARGET_BITRATE=48000
+ # CONFIG_SND_SOC is not set
+ 
+ #
+-# SoC Audio support for SuperH
++# ALSA SoC audio for Freescale SOCs
++#
++
++#
++# SoC Audio for the Texas Instruments OMAP
+ #
+ 
+ #
+@@ -694,14 +743,12 @@ 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
++# CONFIG_USB_OTG_WHITELIST is not set
++# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+ 
+ #
+ # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+-
+-#
+-# USB Gadget Support
+-#
+ CONFIG_USB_GADGET=y
+ # CONFIG_USB_GADGET_DEBUG is not set
+ # CONFIG_USB_GADGET_DEBUG_FILES is not set
+@@ -714,6 +761,7 @@ CONFIG_USB_ATMEL_USBA=y
+ # CONFIG_USB_GADGET_NET2280 is not set
+ # CONFIG_USB_GADGET_PXA2XX is not set
+ # CONFIG_USB_GADGET_M66592 is not set
++# CONFIG_USB_GADGET_PXA27X is not set
+ # CONFIG_USB_GADGET_GOKU is not set
+ # CONFIG_USB_GADGET_LH7A40X is not set
+ # CONFIG_USB_GADGET_OMAP is not set
+@@ -729,6 +777,7 @@ CONFIG_USB_FILE_STORAGE=m
+ # CONFIG_USB_FILE_STORAGE_TEST is not set
+ CONFIG_USB_G_SERIAL=m
+ # CONFIG_USB_MIDI_GADGET is not set
++# CONFIG_USB_G_PRINTER is not set
+ CONFIG_MMC=m
+ # CONFIG_MMC_DEBUG is not set
+ # CONFIG_MMC_UNSAFE_RESUME is not set
+@@ -739,17 +788,20 @@ CONFIG_MMC=m
+ CONFIG_MMC_BLOCK=m
+ # CONFIG_MMC_BLOCK_BOUNCE is not set
+ # CONFIG_SDIO_UART is not set
++# CONFIG_MMC_TEST is not set
+ 
+ #
+ # MMC/SD Host Controller Drivers
+ #
+ CONFIG_MMC_SPI=m
++# CONFIG_MEMSTICK is not set
+ CONFIG_NEW_LEDS=y
+ CONFIG_LEDS_CLASS=y
+ 
+ #
+ # LED drivers
+ #
++CONFIG_LEDS_ATMEL_PWM=m
+ CONFIG_LEDS_GPIO=y
+ 
+ #
+@@ -758,6 +810,8 @@ CONFIG_LEDS_GPIO=y
+ CONFIG_LEDS_TRIGGERS=y
+ CONFIG_LEDS_TRIGGER_TIMER=y
+ CONFIG_LEDS_TRIGGER_HEARTBEAT=y
++CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
++# CONFIG_ACCESSIBILITY is not set
+ CONFIG_RTC_LIB=y
+ CONFIG_RTC_CLASS=y
+ CONFIG_RTC_HCTOSYS=y
+@@ -786,19 +840,22 @@ CONFIG_RTC_INTF_DEV=y
+ # 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_RS5C348 is not set
+ # 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_DS1511 is not set
+ # CONFIG_RTC_DRV_DS1553 is not set
+-# CONFIG_RTC_DRV_STK17TA8 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
+@@ -807,11 +864,8 @@ CONFIG_RTC_INTF_DEV=y
+ # on-CPU RTC drivers
+ #
+ CONFIG_RTC_DRV_AT32AP700X=y
+-
+-#
+-# Userspace I/O
+-#
+ CONFIG_UIO=m
++# CONFIG_UIO_SMX is not set
+ 
+ #
+ # File systems
+@@ -828,14 +882,11 @@ CONFIG_JBD=m
+ # 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_DNOTIFY is not set
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
+-# CONFIG_DNOTIFY is not set
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
+ CONFIG_FUSE_FS=m
+@@ -891,8 +942,10 @@ 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 is not set
+@@ -943,11 +996,6 @@ CONFIG_NLS_ISO8859_1=m
+ # CONFIG_NLS_KOI8_U is not set
+ CONFIG_NLS_UTF8=m
+ # CONFIG_DLM is not set
+-CONFIG_INSTRUMENTATION=y
+-CONFIG_PROFILING=y
+-CONFIG_OPROFILE=m
+-CONFIG_KPROBES=y
+-# CONFIG_MARKERS is not set
+ 
+ #
+ # Kernel hacking
+@@ -955,6 +1003,7 @@ CONFIG_KPROBES=y
+ # CONFIG_PRINTK_TIME is not set
+ CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=1024
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+ CONFIG_DEBUG_FS=y
+@@ -965,6 +1014,7 @@ CONFIG_DETECT_SOFTLOCKUP=y
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
++# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+ # CONFIG_DEBUG_SPINLOCK is not set
+@@ -978,12 +1028,14 @@ CONFIG_SCHED_DEBUG=y
+ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_WRITECOUNT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ CONFIG_FRAME_POINTER=y
+-CONFIG_FORCED_INLINING=y
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_KPROBES_SANITY_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_LKDTM is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+@@ -1000,6 +1052,8 @@ CONFIG_FORCED_INLINING=y
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
++# CONFIG_GENERIC_FIND_NEXT_BIT is not set
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+ CONFIG_CRC_ITU_T=m
+diff --git a/arch/avr32/configs/atstk1004_defconfig b/arch/avr32/configs/atstk1004_defconfig
+index 634c527..a0912fb 100644
+--- a/arch/avr32/configs/atstk1004_defconfig
++++ b/arch/avr32/configs/atstk1004_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24-rc7
+-# Wed Jan  9 23:04:20 2008
++# Linux kernel version: 2.6.26-rc3
++# Mon May 26 13:34:57 2008
+ #
+ CONFIG_AVR32=y
+ CONFIG_GENERIC_GPIO=y
+@@ -13,10 +13,10 @@ CONFIG_HARDIRQS_SW_RESEND=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
+ CONFIG_GENERIC_TIME=y
++CONFIG_GENERIC_CLOCKEVENTS=y
+ # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+ # CONFIG_ARCH_HAS_ILOG2_U32 is not set
+ # CONFIG_ARCH_HAS_ILOG2_U64 is not set
+-CONFIG_ARCH_SUPPORTS_OPROFILE=y
+ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_CALIBRATE_DELAY=y
+ CONFIG_GENERIC_BUG=y
+@@ -34,15 +34,15 @@ CONFIG_LOCALVERSION=""
+ # 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 is not set
++# CONFIG_GROUP_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 is not set
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+@@ -54,24 +54,38 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ # CONFIG_BASE_FULL is not set
+ # CONFIG_FUTEX is not set
+ # CONFIG_EPOLL is not set
+ # CONFIG_SIGNALFD is not set
++# CONFIG_TIMERFD is not set
+ # CONFIG_EVENTFD is not set
+ CONFIG_SHMEM=y
+ CONFIG_VM_EVENT_COUNTERS=y
+ # CONFIG_SLAB is not set
+ # CONFIG_SLUB is not set
+ CONFIG_SLOB=y
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++CONFIG_HAVE_OPROFILE=y
++CONFIG_HAVE_KPROBES=y
++# CONFIG_HAVE_KRETPROBES is not set
++# CONFIG_HAVE_DMA_ATTRS is not set
++# CONFIG_PROC_PAGE_MONITOR is not set
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=1
+ # CONFIG_MODULES is not set
+ # CONFIG_BLOCK is not set
++CONFIG_CLASSIC_RCU=y
+ 
+ #
+ # System Type and features
+ #
++# 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_SUBARCH_AVR32B=y
+ CONFIG_MMU=y
+ CONFIG_PERFORMANCE_COUNTERS=y
+@@ -115,16 +129,19 @@ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+ # CONFIG_SPARSEMEM_STATIC is not set
+ # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+ # CONFIG_OWNERSHIP_TRACE is not set
++# CONFIG_NMI_DEBUGGING is not set
+ # 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_CMDLINE=""
+ 
+ #
+@@ -134,20 +151,7 @@ CONFIG_CMDLINE=""
+ #
+ # CPU Frequency scaling
+ #
+-CONFIG_CPU_FREQ=y
+-CONFIG_CPU_FREQ_TABLE=y
+-# CONFIG_CPU_FREQ_DEBUG is not set
+-# CONFIG_CPU_FREQ_STAT is not set
+-CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+-# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+-# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
+-# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+-CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+-# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+-CONFIG_CPU_FREQ_GOV_USERSPACE=y
+-CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+-# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+-CONFIG_CPU_FREQ_AT32AP=y
++# CONFIG_CPU_FREQ is not set
+ 
+ #
+ # Bus options
+@@ -197,8 +201,6 @@ 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
+@@ -222,6 +224,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ #
+ # 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
+@@ -255,6 +258,7 @@ CONFIG_MTD=y
+ CONFIG_MTD_PARTITIONS=y
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ CONFIG_MTD_CMDLINE_PARTS=y
++# CONFIG_MTD_AR7_PARTS is not set
+ 
+ #
+ # User Modules And Translation Layers
+@@ -321,6 +325,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+ # CONFIG_MTD_UBI is not set
+ # CONFIG_PARPORT is not set
+ # CONFIG_MISC_DEVICES is not set
++# CONFIG_HAVE_IDE is not set
+ 
+ #
+ # SCSI device support
+@@ -346,6 +351,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+ # Character devices
+ #
+ # CONFIG_VT is not set
++# CONFIG_DEVKMEM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+ 
+ #
+@@ -358,6 +364,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+ #
+ CONFIG_SERIAL_ATMEL=y
+ CONFIG_SERIAL_ATMEL_CONSOLE=y
++# CONFIG_SERIAL_ATMEL_PDC is not set
+ # CONFIG_SERIAL_ATMEL_TTYAT is not set
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
+@@ -365,15 +372,9 @@ CONFIG_UNIX98_PTYS=y
+ # CONFIG_LEGACY_PTYS is not set
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
+-# CONFIG_RTC is not set
+-# CONFIG_GEN_RTC is not set
+ # CONFIG_R3964 is not set
+ # CONFIG_TCG_TPM is not set
+ # CONFIG_I2C is not set
+-
+-#
+-# SPI support
+-#
+ CONFIG_SPI=y
+ CONFIG_SPI_MASTER=y
+ 
+@@ -389,9 +390,24 @@ CONFIG_SPI_ATMEL=y
+ # CONFIG_SPI_AT25 is not set
+ # CONFIG_SPI_SPIDEV is not set
+ # CONFIG_SPI_TLE62X0 is not set
++CONFIG_HAVE_GPIO_LIB=y
++
++#
++# GPIO Support
++#
++
++#
++# I2C GPIO expanders:
++#
++
++#
++# SPI GPIO expanders:
++#
++# CONFIG_GPIO_MCP23S08 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
+ 
+@@ -411,12 +427,22 @@ CONFIG_SSB_POSSIBLE=y
+ # Multifunction device drivers
+ #
+ # CONFIG_MFD_SM501 is not set
++# CONFIG_HTC_PASIC3 is not set
+ 
+ #
+ # Multimedia devices
+ #
++
++#
++# Multimedia core support
++#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
++# CONFIG_VIDEO_MEDIA is not set
++
++#
++# Multimedia drivers
++#
+ # CONFIG_DAB is not set
+ 
+ #
+@@ -434,8 +460,8 @@ CONFIG_FB_CFB_IMAGEBLIT=y
+ # CONFIG_FB_SYS_FILLRECT is not set
+ # CONFIG_FB_SYS_COPYAREA is not set
+ # CONFIG_FB_SYS_IMAGEBLIT is not set
++# CONFIG_FB_FOREIGN_ENDIAN is not set
+ # CONFIG_FB_SYS_FOPS is not set
+-CONFIG_FB_DEFERRED_IO=y
+ # CONFIG_FB_SVGALIB is not set
+ # CONFIG_FB_MACMODES is not set
+ # CONFIG_FB_BACKLIGHT is not set
+@@ -467,14 +493,12 @@ 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
++# CONFIG_USB_OTG_WHITELIST is not set
++# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+ 
+ #
+ # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+-
+-#
+-# USB Gadget Support
+-#
+ CONFIG_USB_GADGET=y
+ # CONFIG_USB_GADGET_DEBUG_FILES is not set
+ CONFIG_USB_GADGET_SELECTED=y
+@@ -485,6 +509,7 @@ CONFIG_USB_ATMEL_USBA=y
+ # CONFIG_USB_GADGET_NET2280 is not set
+ # CONFIG_USB_GADGET_PXA2XX is not set
+ # CONFIG_USB_GADGET_M66592 is not set
++# CONFIG_USB_GADGET_PXA27X is not set
+ # CONFIG_USB_GADGET_GOKU is not set
+ # CONFIG_USB_GADGET_LH7A40X is not set
+ # CONFIG_USB_GADGET_OMAP is not set
+@@ -499,8 +524,11 @@ CONFIG_USB_ETH=y
+ # 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_ACCESSIBILITY is not set
+ CONFIG_RTC_LIB=y
+ CONFIG_RTC_CLASS=y
+ CONFIG_RTC_HCTOSYS=y
+@@ -519,15 +547,17 @@ CONFIG_RTC_INTF_DEV=y
+ #
+ # SPI RTC drivers
+ #
+-# CONFIG_RTC_DRV_RS5C348 is not set
+ # 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_DS1511 is not set
+ # CONFIG_RTC_DRV_DS1553 is not set
+-# CONFIG_RTC_DRV_STK17TA8 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
+@@ -536,18 +566,14 @@ CONFIG_RTC_INTF_DEV=y
+ # on-CPU RTC drivers
+ #
+ CONFIG_RTC_DRV_AT32AP700X=y
+-
+-#
+-# Userspace I/O
+-#
+ # CONFIG_UIO is not set
+ 
+ #
+ # File systems
+ #
++# CONFIG_DNOTIFY is not set
+ # CONFIG_INOTIFY is not set
+ # CONFIG_QUOTA is not set
+-# CONFIG_DNOTIFY is not set
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
+ # CONFIG_FUSE_FS is not set
+@@ -580,7 +606,6 @@ CONFIG_JFFS2_RTIME=y
+ # CONFIG_NETWORK_FILESYSTEMS is not set
+ # CONFIG_NLS is not set
+ # CONFIG_DLM is not set
+-# CONFIG_INSTRUMENTATION is not set
+ 
+ #
+ # Kernel hacking
+@@ -588,6 +613,7 @@ CONFIG_JFFS2_RTIME=y
+ # CONFIG_PRINTK_TIME is not set
+ CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FRAME_WARN=1024
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+ # CONFIG_DEBUG_FS is not set
+@@ -608,6 +634,8 @@ CONFIG_MAGIC_SYSRQ=y
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
++# CONFIG_GENERIC_FIND_NEXT_BIT is not set
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
+ # CONFIG_CRC_ITU_T is not set
+diff --git a/arch/avr32/kernel/avr32_ksyms.c b/arch/avr32/kernel/avr32_ksyms.c
+index 80f55f8..84a7d44 100644
+--- a/arch/avr32/kernel/avr32_ksyms.c
++++ b/arch/avr32/kernel/avr32_ksyms.c
+@@ -29,7 +29,9 @@ EXPORT_SYMBOL(__avr32_asr64);
+  */
+ EXPORT_SYMBOL(memset);
+ EXPORT_SYMBOL(memcpy);
++
+ EXPORT_SYMBOL(clear_page);
++EXPORT_SYMBOL(copy_page);
+ 
+ /*
+  * Userspace access stuff.
+@@ -41,6 +43,8 @@ EXPORT_SYMBOL(strncpy_from_user);
+ EXPORT_SYMBOL(__strncpy_from_user);
+ EXPORT_SYMBOL(clear_user);
+ EXPORT_SYMBOL(__clear_user);
++EXPORT_SYMBOL(strnlen_user);
++
+ EXPORT_SYMBOL(csum_partial);
+ EXPORT_SYMBOL(csum_partial_copy_generic);
+ 
+diff --git a/arch/avr32/mach-at32ap/cpufreq.c b/arch/avr32/mach-at32ap/cpufreq.c
+index 235524b..5dd8d25 100644
+--- a/arch/avr32/mach-at32ap/cpufreq.c
++++ b/arch/avr32/mach-at32ap/cpufreq.c
+@@ -108,5 +108,4 @@ static int __init at32_cpufreq_init(void)
+ {
+ 	return cpufreq_register_driver(&at32_driver);
+ }
+-
+-arch_initcall(at32_cpufreq_init);
++late_initcall(at32_cpufreq_init);
+diff --git a/arch/ia64/kernel/ivt.S b/arch/ia64/kernel/ivt.S
+index 6678c49..80b44ea 100644
+--- a/arch/ia64/kernel/ivt.S
++++ b/arch/ia64/kernel/ivt.S
+@@ -1076,48 +1076,6 @@ END(ia64_syscall_setup)
+ 	DBG_FAULT(15)
+ 	FAULT(15)
+ 
+-	/*
+-	 * Squatting in this space ...
+-	 *
+-	 * This special case dispatcher for illegal operation faults allows preserved
+-	 * registers to be modified through a callback function (asm only) that is handed
+-	 * back from the fault handler in r8. Up to three arguments can be passed to the
+-	 * callback function by returning an aggregate with the callback as its first
+-	 * element, followed by the arguments.
+-	 */
+-ENTRY(dispatch_illegal_op_fault)
+-	.prologue
+-	.body
+-	SAVE_MIN_WITH_COVER
+-	ssm psr.ic | PSR_DEFAULT_BITS
+-	;;
+-	srlz.i		// guarantee that interruption collection is on
+-	;;
+-(p15)	ssm psr.i	// restore psr.i
+-	adds r3=8,r2	// set up second base pointer for SAVE_REST
+-	;;
+-	alloc r14=ar.pfs,0,0,1,0	// must be first in insn group
+-	mov out0=ar.ec
+-	;;
+-	SAVE_REST
+-	PT_REGS_UNWIND_INFO(0)
+-	;;
+-	br.call.sptk.many rp=ia64_illegal_op_fault
+-.ret0:	;;
+-	alloc r14=ar.pfs,0,0,3,0	// must be first in insn group
+-	mov out0=r9
+-	mov out1=r10
+-	mov out2=r11
+-	movl r15=ia64_leave_kernel
+-	;;
+-	mov rp=r15
+-	mov b6=r8
+-	;;
+-	cmp.ne p6,p0=0,r8
+-(p6)	br.call.dpnt.many b6=b6		// call returns to ia64_leave_kernel
+-	br.sptk.many ia64_leave_kernel
+-END(dispatch_illegal_op_fault)
+-
+ 	.org ia64_ivt+0x4000
+ /////////////////////////////////////////////////////////////////////////////////////////
+ // 0x4000 Entry 16 (size 64 bundles) Reserved
+@@ -1715,6 +1673,48 @@ END(ia32_interrupt)
+ 	DBG_FAULT(67)
+ 	FAULT(67)
+ 
++	/*
++	 * Squatting in this space ...
++	 *
++	 * This special case dispatcher for illegal operation faults allows preserved
++	 * registers to be modified through a callback function (asm only) that is handed
++	 * back from the fault handler in r8. Up to three arguments can be passed to the
++	 * callback function by returning an aggregate with the callback as its first
++	 * element, followed by the arguments.
++	 */
++ENTRY(dispatch_illegal_op_fault)
++	.prologue
++	.body
++	SAVE_MIN_WITH_COVER
++	ssm psr.ic | PSR_DEFAULT_BITS
++	;;
++	srlz.i		// guarantee that interruption collection is on
++	;;
++(p15)	ssm psr.i	// restore psr.i
++	adds r3=8,r2	// set up second base pointer for SAVE_REST
++	;;
++	alloc r14=ar.pfs,0,0,1,0	// must be first in insn group
++	mov out0=ar.ec
++	;;
++	SAVE_REST
++	PT_REGS_UNWIND_INFO(0)
++	;;
++	br.call.sptk.many rp=ia64_illegal_op_fault
++.ret0:	;;
++	alloc r14=ar.pfs,0,0,3,0	// must be first in insn group
++	mov out0=r9
++	mov out1=r10
++	mov out2=r11
++	movl r15=ia64_leave_kernel
++	;;
++	mov rp=r15
++	mov b6=r8
++	;;
++	cmp.ne p6,p0=0,r8
++(p6)	br.call.dpnt.many b6=b6		// call returns to ia64_leave_kernel
++	br.sptk.many ia64_leave_kernel
++END(dispatch_illegal_op_fault)
++
+ #ifdef CONFIG_IA32_SUPPORT
+ 
+ 	/*
+diff --git a/arch/ia64/kernel/minstate.h b/arch/ia64/kernel/minstate.h
+index 7c548ac..74b6d67 100644
+--- a/arch/ia64/kernel/minstate.h
++++ b/arch/ia64/kernel/minstate.h
+@@ -15,6 +15,9 @@
+ #define ACCOUNT_SYS_ENTER
+ #endif
+ 
++.section ".data.patch.rse", "a"
++.previous
++
+ /*
+  * DO_SAVE_MIN switches to the kernel stacks (if necessary) and saves
+  * the minimum state necessary that allows us to turn psr.ic back
+@@ -40,7 +43,7 @@
+  * Note that psr.ic is NOT turned on by this macro.  This is so that
+  * we can pass interruption state as arguments to a handler.
+  */
+-#define DO_SAVE_MIN(COVER,SAVE_IFS,EXTRA)							\
++#define DO_SAVE_MIN(COVER,SAVE_IFS,EXTRA,WORKAROUND)						\
+ 	mov r16=IA64_KR(CURRENT);	/* M */							\
+ 	mov r27=ar.rsc;			/* M */							\
+ 	mov r20=r1;			/* A */							\
+@@ -87,6 +90,7 @@
+ 	tbit.nz p15,p0=r29,IA64_PSR_I_BIT;							\
+ 	mov r29=b0										\
+ 	;;											\
++	WORKAROUND;										\
+ 	adds r16=PT(R8),r1;	/* initialize first base pointer */				\
+ 	adds r17=PT(R9),r1;	/* initialize second base pointer */				\
+ (pKStk)	mov r18=r0;		/* make sure r18 isn't NaT */					\
+@@ -206,6 +210,40 @@
+ 	st8 [r25]=r10;      	/* ar.ssd */	\
+ 	;;
+ 
+-#define SAVE_MIN_WITH_COVER	DO_SAVE_MIN(cover, mov r30=cr.ifs,)
+-#define SAVE_MIN_WITH_COVER_R19	DO_SAVE_MIN(cover, mov r30=cr.ifs, mov r15=r19)
+-#define SAVE_MIN		DO_SAVE_MIN(     , mov r30=r0, )
++#define RSE_WORKAROUND				\
++(pUStk) extr.u r17=r18,3,6;			\
++(pUStk)	sub r16=r18,r22;			\
++[1:](pKStk)	br.cond.sptk.many 1f;		\
++	.xdata4 ".data.patch.rse",1b-.		\
++	;;					\
++	cmp.ge p6,p7 = 33,r17;			\
++	;;					\
++(p6)	mov r17=0x310;				\
++(p7)	mov r17=0x308;				\
++	;;					\
++	cmp.leu p1,p0=r16,r17;			\
++(p1)	br.cond.sptk.many 1f;			\
++	dep.z r17=r26,0,62;			\
++	movl r16=2f;				\
++	;;					\
++	mov ar.pfs=r17;				\
++	dep r27=r0,r27,16,14;			\
++	mov b0=r16;				\
++	;;					\
++	br.ret.sptk b0;				\
++	;;					\
++2:						\
++	mov ar.rsc=r0				\
++	;;					\
++	flushrs;				\
++	;;					\
++	mov ar.bspstore=r22			\
++	;;					\
++	mov r18=ar.bsp;				\
++	;;					\
++1:						\
++	.pred.rel "mutex", pKStk, pUStk
++
++#define SAVE_MIN_WITH_COVER	DO_SAVE_MIN(cover, mov r30=cr.ifs, , RSE_WORKAROUND)
++#define SAVE_MIN_WITH_COVER_R19	DO_SAVE_MIN(cover, mov r30=cr.ifs, mov r15=r19, RSE_WORKAROUND)
++#define SAVE_MIN			DO_SAVE_MIN(     , mov r30=r0, , )
+diff --git a/arch/ia64/kernel/patch.c b/arch/ia64/kernel/patch.c
+index e0dca87..b83b2c5 100644
+--- a/arch/ia64/kernel/patch.c
++++ b/arch/ia64/kernel/patch.c
+@@ -115,6 +115,29 @@ ia64_patch_vtop (unsigned long start, unsigned long end)
+ 	ia64_srlz_i();
+ }
+ 
++/*
++ * Disable the RSE workaround by turning the conditional branch
++ * that we tagged in each place the workaround was used into an
++ * unconditional branch.
++ */
++void __init
++ia64_patch_rse (unsigned long start, unsigned long end)
++{
++	s32 *offp = (s32 *) start;
++	u64 ip, *b;
++
++	while (offp < (s32 *) end) {
++		ip = (u64) offp + *offp;
++
++		b = (u64 *)(ip & -16);
++		b[1] &= ~0xf800000L;
++		ia64_fc((void *) ip);
++		++offp;
++	}
++	ia64_sync_i();
++	ia64_srlz_i();
++}
++
+ void __init
+ ia64_patch_mckinley_e9 (unsigned long start, unsigned long end)
+ {
+diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
+index e9596cd..f48a809 100644
+--- a/arch/ia64/kernel/setup.c
++++ b/arch/ia64/kernel/setup.c
+@@ -560,6 +560,17 @@ setup_arch (char **cmdline_p)
+ 	/* process SAL system table: */
+ 	ia64_sal_init(__va(efi.sal_systab));
+ 
++#ifdef CONFIG_ITANIUM
++	ia64_patch_rse((u64) __start___rse_patchlist, (u64) __end___rse_patchlist);
++#else
++	{
++		u64 num_phys_stacked;
++
++		if (ia64_pal_rse_info(&num_phys_stacked, 0) == 0 && num_phys_stacked > 96)
++			ia64_patch_rse((u64) __start___rse_patchlist, (u64) __end___rse_patchlist);
++	}
++#endif
++
+ #ifdef CONFIG_SMP
+ 	cpu_physical_id(0) = hard_smp_processor_id();
+ #endif
+diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S
+index 80622ac..5929ab1 100644
+--- a/arch/ia64/kernel/vmlinux.lds.S
++++ b/arch/ia64/kernel/vmlinux.lds.S
+@@ -156,6 +156,13 @@ SECTIONS
+ 	  __end___vtop_patchlist = .;
+ 	}
+ 
++  .data.patch.rse : AT(ADDR(.data.patch.rse) - LOAD_OFFSET)
++	{
++	  __start___rse_patchlist = .;
++	  *(.data.patch.rse)
++	  __end___rse_patchlist = .;
++	}
++
+   .data.patch.mckinley_e9 : AT(ADDR(.data.patch.mckinley_e9) - LOAD_OFFSET)
+ 	{
+ 	  __start___mckinley_e9_bundles = .;
+diff --git a/block/blk-core.c b/block/blk-core.c
+index 6a9cc0d..1905aab 100644
+--- a/block/blk-core.c
++++ b/block/blk-core.c
+@@ -806,35 +806,32 @@ static struct request *get_request_wait(struct request_queue *q, int rw_flags,
+ 	rq = get_request(q, rw_flags, bio, GFP_NOIO);
+ 	while (!rq) {
+ 		DEFINE_WAIT(wait);
++		struct io_context *ioc;
+ 		struct request_list *rl = &q->rq;
+ 
+ 		prepare_to_wait_exclusive(&rl->wait[rw], &wait,
+ 				TASK_UNINTERRUPTIBLE);
+ 
+-		rq = get_request(q, rw_flags, bio, GFP_NOIO);
+-
+-		if (!rq) {
+-			struct io_context *ioc;
++		blk_add_trace_generic(q, bio, rw, BLK_TA_SLEEPRQ);
+ 
+-			blk_add_trace_generic(q, bio, rw, BLK_TA_SLEEPRQ);
+-
+-			__generic_unplug_device(q);
+-			spin_unlock_irq(q->queue_lock);
+-			io_schedule();
++		__generic_unplug_device(q);
++		spin_unlock_irq(q->queue_lock);
++		io_schedule();
+ 
+-			/*
+-			 * After sleeping, we become a "batching" process and
+-			 * will be able to allocate at least one request, and
+-			 * up to a big batch of them for a small period time.
+-			 * See ioc_batching, ioc_set_batching
+-			 */
+-			ioc = current_io_context(GFP_NOIO, q->node);
+-			ioc_set_batching(q, ioc);
++		/*
++		 * After sleeping, we become a "batching" process and
++		 * will be able to allocate at least one request, and
++		 * up to a big batch of them for a small period time.
++		 * See ioc_batching, ioc_set_batching
++		 */
++		ioc = current_io_context(GFP_NOIO, q->node);
++		ioc_set_batching(q, ioc);
+ 
+-			spin_lock_irq(q->queue_lock);
+-		}
++		spin_lock_irq(q->queue_lock);
+ 		finish_wait(&rl->wait[rw], &wait);
+-	}
++
++		rq = get_request(q, rw_flags, bio, GFP_NOIO);
++	};
+ 
+ 	return rq;
+ }
+diff --git a/block/blktrace.c b/block/blktrace.c
+index b2cbb4e..7ae87cc 100644
+--- a/block/blktrace.c
++++ b/block/blktrace.c
+@@ -75,6 +75,23 @@ static void trace_note_time(struct blk_trace *bt)
+ 	local_irq_restore(flags);
+ }
+ 
++void __trace_note_message(struct blk_trace *bt, const char *fmt, ...)
++{
++	int n;
++	va_list args;
++	char *buf;
++
++	preempt_disable();
++	buf = per_cpu_ptr(bt->msg_data, smp_processor_id());
++	va_start(args, fmt);
++	n = vscnprintf(buf, BLK_TN_MAX_MSG, fmt, args);
++	va_end(args);
++
++	trace_note(bt, 0, BLK_TN_MESSAGE, buf, n);
++	preempt_enable();
++}
++EXPORT_SYMBOL_GPL(__trace_note_message);
++
+ static int act_log_check(struct blk_trace *bt, u32 what, sector_t sector,
+ 			 pid_t pid)
+ {
+@@ -232,6 +249,7 @@ static void blk_trace_cleanup(struct blk_trace *bt)
+ 	debugfs_remove(bt->dropped_file);
+ 	blk_remove_tree(bt->dir);
+ 	free_percpu(bt->sequence);
++	free_percpu(bt->msg_data);
+ 	kfree(bt);
+ }
+ 
+@@ -346,6 +364,10 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
+ 	if (!bt->sequence)
+ 		goto err;
+ 
++	bt->msg_data = __alloc_percpu(BLK_TN_MAX_MSG);
++	if (!bt->msg_data)
++		goto err;
++
+ 	ret = -ENOENT;
+ 	dir = blk_create_tree(buts->name);
+ 	if (!dir)
+@@ -392,6 +414,7 @@ err:
+ 		if (bt->dropped_file)
+ 			debugfs_remove(bt->dropped_file);
+ 		free_percpu(bt->sequence);
++		free_percpu(bt->msg_data);
+ 		if (bt->rchan)
+ 			relay_close(bt->rchan);
+ 		kfree(bt);
+diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
+index b399c62..d01b411 100644
+--- a/block/cfq-iosched.c
++++ b/block/cfq-iosched.c
+@@ -124,6 +124,8 @@ struct cfq_data {
+ struct cfq_queue {
+ 	/* reference count */
+ 	atomic_t ref;
++	/* various state flags, see below */
++	unsigned int flags;
+ 	/* parent cfq_data */
+ 	struct cfq_data *cfqd;
+ 	/* service_tree member */
+@@ -138,14 +140,14 @@ struct cfq_queue {
+ 	int queued[2];
+ 	/* currently allocated requests */
+ 	int allocated[2];
+-	/* pending metadata requests */
+-	int meta_pending;
+ 	/* fifo list of requests in sort_list */
+ 	struct list_head fifo;
+ 
+ 	unsigned long slice_end;
+ 	long slice_resid;
+ 
++	/* pending metadata requests */
++	int meta_pending;
+ 	/* number of requests that are on the dispatch list or inside driver */
+ 	int dispatched;
+ 
+@@ -153,8 +155,6 @@ struct cfq_queue {
+ 	unsigned short ioprio, org_ioprio;
+ 	unsigned short ioprio_class, org_ioprio_class;
+ 
+-	/* various state flags, see below */
+-	unsigned int flags;
+ };
+ 
+ enum cfqq_state_flags {
+@@ -1142,6 +1142,9 @@ static void cfq_put_queue(struct cfq_queue *cfqq)
+ 	kmem_cache_free(cfq_pool, cfqq);
+ }
+ 
++/*
++ * Must always be called with the rcu_read_lock() held
++ */
+ static void
+ __call_for_each_cic(struct io_context *ioc,
+ 		    void (*func)(struct io_context *, struct cfq_io_context *))
+@@ -1197,6 +1200,11 @@ static void cic_free_func(struct io_context *ioc, struct cfq_io_context *cic)
+ 	cfq_cic_free(cic);
+ }
+ 
++/*
++ * Must be called with rcu_read_lock() held or preemption otherwise disabled.
++ * Only two callers of this - ->dtor() which is called with the rcu_read_lock(),
++ * and ->trim() which is called with the task lock held
++ */
+ static void cfq_free_io_context(struct io_context *ioc)
+ {
+ 	/*
+@@ -1502,20 +1510,24 @@ static struct cfq_io_context *
+ cfq_cic_lookup(struct cfq_data *cfqd, struct io_context *ioc)
+ {
+ 	struct cfq_io_context *cic;
++	unsigned long flags;
+ 	void *k;
+ 
+ 	if (unlikely(!ioc))
+ 		return NULL;
+ 
++	rcu_read_lock();
++
+ 	/*
+ 	 * we maintain a last-hit cache, to avoid browsing over the tree
+ 	 */
+ 	cic = rcu_dereference(ioc->ioc_data);
+-	if (cic && cic->key == cfqd)
++	if (cic && cic->key == cfqd) {
++		rcu_read_unlock();
+ 		return cic;
++	}
+ 
+ 	do {
+-		rcu_read_lock();
+ 		cic = radix_tree_lookup(&ioc->radix_root, (unsigned long) cfqd);
+ 		rcu_read_unlock();
+ 		if (!cic)
+@@ -1524,10 +1536,13 @@ cfq_cic_lookup(struct cfq_data *cfqd, struct io_context *ioc)
+ 		k = cic->key;
+ 		if (unlikely(!k)) {
+ 			cfq_drop_dead_cic(cfqd, ioc, cic);
++			rcu_read_lock();
+ 			continue;
+ 		}
+ 
++		spin_lock_irqsave(&ioc->lock, flags);
+ 		rcu_assign_pointer(ioc->ioc_data, cic);
++		spin_unlock_irqrestore(&ioc->lock, flags);
+ 		break;
+ 	} while (1);
+ 
+@@ -2134,6 +2149,10 @@ static void *cfq_init_queue(struct request_queue *q)
+ 
+ static void cfq_slab_kill(void)
+ {
++	/*
++	 * Caller already ensured that pending RCU callbacks are completed,
++	 * so we should have no busy allocations at this point.
++	 */
+ 	if (cfq_pool)
+ 		kmem_cache_destroy(cfq_pool);
+ 	if (cfq_ioc_pool)
+@@ -2292,6 +2311,11 @@ static void __exit cfq_exit(void)
+ 	ioc_gone = &all_gone;
+ 	/* ioc_gone's update must be visible before reading ioc_count */
+ 	smp_wmb();
++
++	/*
++	 * this also protects us from entering cfq_slab_kill() with
++	 * pending RCU callbacks
++	 */
+ 	if (elv_ioc_count_read(ioc_count))
+ 		wait_for_completion(ioc_gone);
+ 	cfq_slab_kill();
+diff --git a/block/elevator.c b/block/elevator.c
+index 980f8ae..902dd13 100644
+--- a/block/elevator.c
++++ b/block/elevator.c
+@@ -1110,6 +1110,8 @@ static int elevator_switch(struct request_queue *q, struct elevator_type *new_e)
+ 	queue_flag_clear(QUEUE_FLAG_ELVSWITCH, q);
+ 	spin_unlock_irq(q->queue_lock);
+ 
++	blk_add_trace_msg(q, "elv switch: %s", e->elevator_type->elevator_name);
++
+ 	return 1;
+ 
+ fail_register:
+diff --git a/drivers/base/core.c b/drivers/base/core.c
+index 72eccae..422cfca 100644
+--- a/drivers/base/core.c
++++ b/drivers/base/core.c
+@@ -760,6 +760,21 @@ static void device_remove_class_symlinks(struct device *dev)
+ }
+ 
+ /**
++ * dev_set_name - set a device name
++ * @dev: device
++ */
++int dev_set_name(struct device *dev, const char *fmt, ...)
++{
++	va_list vargs;
++
++	va_start(vargs, fmt);
++	vsnprintf(dev->bus_id, sizeof(dev->bus_id), fmt, vargs);
++	va_end(vargs);
++	return 0;
++}
++EXPORT_SYMBOL_GPL(dev_set_name);
++
++/**
+  * device_add - add device to device hierarchy.
+  * @dev: device.
+  *
+diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
+index 7fce038..86f0a24 100644
+--- a/drivers/cpufreq/cpufreq.c
++++ b/drivers/cpufreq/cpufreq.c
+@@ -928,13 +928,13 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
+ 	policy->user_policy.policy = policy->policy;
+ 	policy->user_policy.governor = policy->governor;
+ 
+-	unlock_policy_rwsem_write(cpu);
+-
+ 	if (ret) {
+ 		dprintk("setting policy failed\n");
+ 		goto err_out_unregister;
+ 	}
+ 
++	unlock_policy_rwsem_write(cpu);
++
+ 	kobject_uevent(&policy->kobj, KOBJ_ADD);
+ 	module_put(cpufreq_driver->owner);
+ 	dprintk("initialization complete\n");
+diff --git a/drivers/mtd/maps/ck804xrom.c b/drivers/mtd/maps/ck804xrom.c
+index 59d8fb4..effaf7c 100644
+--- a/drivers/mtd/maps/ck804xrom.c
++++ b/drivers/mtd/maps/ck804xrom.c
+@@ -331,15 +331,15 @@ static void __devexit ck804xrom_remove_one (struct pci_dev *pdev)
+ }
+ 
+ static struct pci_device_id ck804xrom_pci_tbl[] = {
+-	{ PCI_VENDOR_ID_NVIDIA, 0x0051, PCI_ANY_ID, PCI_ANY_ID, DEV_CK804 },
+-	{ PCI_VENDOR_ID_NVIDIA, 0x0360, PCI_ANY_ID, PCI_ANY_ID, DEV_MCP55 },
+-	{ PCI_VENDOR_ID_NVIDIA, 0x0361, PCI_ANY_ID, PCI_ANY_ID, DEV_MCP55 },
+-	{ PCI_VENDOR_ID_NVIDIA, 0x0362, PCI_ANY_ID, PCI_ANY_ID, DEV_MCP55 },
+-	{ PCI_VENDOR_ID_NVIDIA, 0x0363, PCI_ANY_ID, PCI_ANY_ID, DEV_MCP55 },
+-	{ PCI_VENDOR_ID_NVIDIA, 0x0364, PCI_ANY_ID, PCI_ANY_ID, DEV_MCP55 },
+-	{ PCI_VENDOR_ID_NVIDIA, 0x0365, PCI_ANY_ID, PCI_ANY_ID, DEV_MCP55 },
+-	{ PCI_VENDOR_ID_NVIDIA, 0x0366, PCI_ANY_ID, PCI_ANY_ID, DEV_MCP55 },
+-	{ PCI_VENDOR_ID_NVIDIA, 0x0367, PCI_ANY_ID, PCI_ANY_ID, DEV_MCP55 },
++	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0051), .driver_data = DEV_CK804 },
++	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0360), .driver_data = DEV_MCP55 },
++	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0361), .driver_data = DEV_MCP55 },
++	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0362), .driver_data = DEV_MCP55 },
++	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0363), .driver_data = DEV_MCP55 },
++	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0364), .driver_data = DEV_MCP55 },
++	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0365), .driver_data = DEV_MCP55 },
++	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0366), .driver_data = DEV_MCP55 },
++	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 0x0367), .driver_data = DEV_MCP55 },
+ 	{ 0, }
+ };
+ 
+diff --git a/drivers/pci/hotplug/pci_hotplug_core.c b/drivers/pci/hotplug/pci_hotplug_core.c
+index 925ba16..a11021e 100644
+--- a/drivers/pci/hotplug/pci_hotplug_core.c
++++ b/drivers/pci/hotplug/pci_hotplug_core.c
+@@ -619,6 +619,7 @@ static struct hotplug_slot *get_slot_from_name (const char *name)
+ int pci_hp_register (struct hotplug_slot *slot)
+ {
+ 	int result;
++	struct hotplug_slot *tmp;
+ 
+ 	if (slot == NULL)
+ 		return -ENODEV;
+@@ -630,7 +631,11 @@ int pci_hp_register (struct hotplug_slot *slot)
+ 		return -EINVAL;
+ 	}
+ 
+-	/* this can fail if we have already registered a slot with the same name */
++	/* Check if we have already registered a slot with the same name. */
++	tmp = get_slot_from_name(slot->name);
++	if (tmp)
++		return -EEXIST;
++
+ 	slot->kobj.kset = pci_hotplug_slots_kset;
+ 	result = kobject_init_and_add(&slot->kobj, &hotplug_slot_ktype, NULL,
+ 				      "%s", slot->name);
+diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h
+index 8264a76..79c9dda 100644
+--- a/drivers/pci/hotplug/pciehp.h
++++ b/drivers/pci/hotplug/pciehp.h
+@@ -97,6 +97,7 @@ struct controller {
+ 	u8 cap_base;
+ 	struct timer_list poll_timer;
+ 	volatile int cmd_busy;
++	unsigned int no_cmd_complete:1;
+ };
+ 
+ #define INT_BUTTON_IGNORE		0
+@@ -135,6 +136,7 @@ struct controller {
+ #define PWR_LED_PRSN	0x00000010
+ #define HP_SUPR_RM_SUP	0x00000020
+ #define EMI_PRSN	0x00020000
++#define NO_CMD_CMPL_SUP	0x00040000
+ 
+ #define ATTN_BUTTN(ctrl)	((ctrl)->slot_cap & ATTN_BUTTN_PRSN)
+ #define POWER_CTRL(ctrl)	((ctrl)->slot_cap & PWR_CTRL_PRSN)
+@@ -143,13 +145,14 @@ struct controller {
+ #define PWR_LED(ctrl)		((ctrl)->slot_cap & PWR_LED_PRSN)
+ #define HP_SUPR_RM(ctrl)	((ctrl)->slot_cap & HP_SUPR_RM_SUP)
+ #define EMI(ctrl)		((ctrl)->slot_cap & EMI_PRSN)
++#define NO_CMD_CMPL(ctrl)	((ctrl)->slot_cap & NO_CMD_CMPL_SUP)
+ 
+ extern int pciehp_sysfs_enable_slot(struct slot *slot);
+ extern int pciehp_sysfs_disable_slot(struct slot *slot);
+-extern u8 pciehp_handle_attention_button(u8 hp_slot, struct controller *ctrl);
+-extern u8 pciehp_handle_switch_change(u8 hp_slot, struct controller *ctrl);
+-extern u8 pciehp_handle_presence_change(u8 hp_slot, struct controller *ctrl);
+-extern u8 pciehp_handle_power_fault(u8 hp_slot, struct controller *ctrl);
++extern u8 pciehp_handle_attention_button(struct slot *p_slot);
++  extern u8 pciehp_handle_switch_change(struct slot *p_slot);
++extern u8 pciehp_handle_presence_change(struct slot *p_slot);
++extern u8 pciehp_handle_power_fault(struct slot *p_slot);
+ extern int pciehp_configure_device(struct slot *p_slot);
+ extern int pciehp_unconfigure_device(struct slot *p_slot);
+ extern void pciehp_queue_pushbutton_work(struct work_struct *work);
+diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c
+index 43d8ddb..48a2ed3 100644
+--- a/drivers/pci/hotplug/pciehp_core.c
++++ b/drivers/pci/hotplug/pciehp_core.c
+@@ -254,7 +254,11 @@ static int init_slots(struct controller *ctrl)
+ 		    slot->hp_slot, slot->number, ctrl->slot_device_offset);
+ 		retval = pci_hp_register(hotplug_slot);
+ 		if (retval) {
+-			err ("pci_hp_register failed with error %d\n", retval);
++			err("pci_hp_register failed with error %d\n", retval);
++			if (retval == -EEXIST)
++				err("Failed to register slot because of name "
++				    "collision. Try \'pciehp_slot_with_bus\' "
++				    "module option.\n");
+ 			goto error_info;
+ 		}
+ 		/* create additional sysfs entries */
+diff --git a/drivers/pci/hotplug/pciehp_ctrl.c b/drivers/pci/hotplug/pciehp_ctrl.c
+index 0a7aa62..96a5d55 100644
+--- a/drivers/pci/hotplug/pciehp_ctrl.c
++++ b/drivers/pci/hotplug/pciehp_ctrl.c
+@@ -55,16 +55,13 @@ static int queue_interrupt_event(struct slot *p_slot, u32 event_type)
+ 	return 0;
+ }
+ 
+-u8 pciehp_handle_attention_button(u8 hp_slot, struct controller *ctrl)
++u8 pciehp_handle_attention_button(struct slot *p_slot)
+ {
+-	struct slot *p_slot;
+ 	u32 event_type;
+ 
+ 	/* Attention Button Change */
+ 	dbg("pciehp:  Attention button interrupt received.\n");
+ 
+-	p_slot = pciehp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
+-
+ 	/*
+ 	 *  Button pressed - See if need to TAKE ACTION!!!
+ 	 */
+@@ -76,18 +73,15 @@ u8 pciehp_handle_attention_button(u8 hp_slot, struct controller *ctrl)
+ 	return 0;
+ }
+ 
+-u8 pciehp_handle_switch_change(u8 hp_slot, struct controller *ctrl)
++u8 pciehp_handle_switch_change(struct slot *p_slot)
+ {
+-	struct slot *p_slot;
+ 	u8 getstatus;
+ 	u32 event_type;
+ 
+ 	/* Switch Change */
+ 	dbg("pciehp:  Switch interrupt received.\n");
+ 
+-	p_slot = pciehp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
+ 	p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
+-
+ 	if (getstatus) {
+ 		/*
+ 		 * Switch opened
+@@ -107,17 +101,14 @@ u8 pciehp_handle_switch_change(u8 hp_slot, struct controller *ctrl)
+ 	return 1;
+ }
+ 
+-u8 pciehp_handle_presence_change(u8 hp_slot, struct controller *ctrl)
++u8 pciehp_handle_presence_change(struct slot *p_slot)
+ {
+-	struct slot *p_slot;
+ 	u32 event_type;
+ 	u8 presence_save;
+ 
+ 	/* Presence Change */
+ 	dbg("pciehp:  Presence/Notify input change.\n");
+ 
+-	p_slot = pciehp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
+-
+ 	/* Switch is open, assume a presence change
+ 	 * Save the presence state
+ 	 */
+@@ -141,16 +132,13 @@ u8 pciehp_handle_presence_change(u8 hp_slot, struct controller *ctrl)
+ 	return 1;
+ }
+ 
+-u8 pciehp_handle_power_fault(u8 hp_slot, struct controller *ctrl)
++u8 pciehp_handle_power_fault(struct slot *p_slot)
+ {
+-	struct slot *p_slot;
+ 	u32 event_type;
+ 
+ 	/* power fault */
+ 	dbg("pciehp:  Power fault interrupt received.\n");
+ 
+-	p_slot = pciehp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
+-
+ 	if ( !(p_slot->hpc_ops->query_power_fault(p_slot))) {
+ 		/*
+ 		 * power fault Cleared
+@@ -163,7 +151,7 @@ u8 pciehp_handle_power_fault(u8 hp_slot, struct controller *ctrl)
+ 		 */
+ 		info("Power fault on Slot(%s)\n", p_slot->name);
+ 		event_type = INT_POWER_FAULT;
+-		info("power fault bit %x set\n", hp_slot);
++		info("power fault bit %x set\n", 0);
+ 	}
+ 
+ 	queue_interrupt_event(p_slot, event_type);
+@@ -186,6 +174,13 @@ static void set_slot_off(struct controller *ctrl, struct slot * pslot)
+ 		}
+ 	}
+ 
++	/*
++	 * After turning power off, we must wait for at least 1 second
++	 * before taking any action that relies on power having been
++	 * removed from the slot/adapter.
++	 */
++	msleep(1000);
++
+ 	if (PWR_LED(ctrl))
+ 		pslot->hpc_ops->green_led_off(pslot);
+ 
+@@ -289,6 +284,13 @@ static int remove_board(struct slot *p_slot)
+ 		}
+ 	}
+ 
++	/*
++	 * After turning power off, we must wait for at least 1 second
++	 * before taking any action that relies on power having been
++	 * removed from the slot/adapter.
++	 */
++	msleep(1000);
++
+ 	if (PWR_LED(ctrl))
+ 		/* turn off Green LED */
+ 		p_slot->hpc_ops->green_led_off(p_slot);
+diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c
+index 891f81a..79f1049 100644
+--- a/drivers/pci/hotplug/pciehp_hpc.c
++++ b/drivers/pci/hotplug/pciehp_hpc.c
+@@ -247,14 +247,38 @@ static inline void pciehp_free_irq(struct controller *ctrl)
+ 		free_irq(ctrl->pci_dev->irq, ctrl);
+ }
+ 
+-static inline int pcie_wait_cmd(struct controller *ctrl)
++static inline int pcie_poll_cmd(struct controller *ctrl)
++{
++	u16 slot_status;
++	int timeout = 1000;
++
++	if (!pciehp_readw(ctrl, SLOTSTATUS, &slot_status))
++		if (slot_status & CMD_COMPLETED)
++			goto completed;
++	for (timeout = 1000; timeout > 0; timeout -= 100) {
++		msleep(100);
++		if (!pciehp_readw(ctrl, SLOTSTATUS, &slot_status))
++			if (slot_status & CMD_COMPLETED)
++				goto completed;
++	}
++	return 0;	/* timeout */
++
++completed:
++	pciehp_writew(ctrl, SLOTSTATUS, CMD_COMPLETED);
++	return timeout;
++}
++
++static inline int pcie_wait_cmd(struct controller *ctrl, int poll)
+ {
+ 	int retval = 0;
+ 	unsigned int msecs = pciehp_poll_mode ? 2500 : 1000;
+ 	unsigned long timeout = msecs_to_jiffies(msecs);
+ 	int rc;
+ 
+-	rc = wait_event_interruptible_timeout(ctrl->queue,
++	if (poll)
++		rc = pcie_poll_cmd(ctrl);
++	else
++		rc = wait_event_interruptible_timeout(ctrl->queue,
+ 					      !ctrl->cmd_busy, timeout);
+ 	if (!rc)
+ 		dbg("Command not completed in 1000 msec\n");
+@@ -286,12 +310,28 @@ static int pcie_write_cmd(struct controller *ctrl, u16 cmd, u16 mask)
+ 		goto out;
+ 	}
+ 
+-	if ((slot_status & CMD_COMPLETED) == CMD_COMPLETED ) {
+-		/* After 1 sec and CMD_COMPLETED still not set, just
+-		   proceed forward to issue the next command according
+-		   to spec.  Just print out the error message */
+-		dbg("%s: CMD_COMPLETED not clear after 1 sec.\n",
+-		    __func__);
++	if (slot_status & CMD_COMPLETED) {
++		if (!ctrl->no_cmd_complete) {
++			/*
++			 * After 1 sec and CMD_COMPLETED still not set, just
++			 * proceed forward to issue the next command according
++			 * to spec. Just print out the error message.
++			 */
++			dbg("%s: CMD_COMPLETED not clear after 1 sec.\n",
++			    __func__);
++		} else if (!NO_CMD_CMPL(ctrl)) {
++			/*
++			 * This controller semms to notify of command completed
++			 * event even though it supports none of power
++			 * controller, attention led, power led and EMI.
++			 */
++			dbg("%s: Unexpected CMD_COMPLETED. Need to wait for "
++			    "command completed event.\n", __func__);
++			ctrl->no_cmd_complete = 0;
++		} else {
++			dbg("%s: Unexpected CMD_COMPLETED. Maybe the "
++			    "controller is broken.\n", __func__);
++		}
+ 	}
+ 
+ 	retval = pciehp_readw(ctrl, SLOTCTRL, &slot_ctrl);
+@@ -315,8 +355,18 @@ static int pcie_write_cmd(struct controller *ctrl, u16 cmd, u16 mask)
+ 	/*
+ 	 * Wait for command completion.
+ 	 */
+-	if (!retval)
+-		retval = pcie_wait_cmd(ctrl);
++	if (!retval && !ctrl->no_cmd_complete) {
++		int poll = 0;
++		/*
++		 * if hotplug interrupt is not enabled or command
++		 * completed interrupt is not enabled, we need to poll
++		 * command completed event.
++		 */
++		if (!(slot_ctrl & HP_INTR_ENABLE) ||
++		    !(slot_ctrl & CMD_CMPL_INTR_ENABLE))
++			poll = 1;
++                retval = pcie_wait_cmd(ctrl, poll);
++	}
+  out:
+ 	mutex_unlock(&ctrl->ctrl_lock);
+ 	return retval;
+@@ -704,13 +754,6 @@ static int hpc_power_off_slot(struct slot * slot)
+ 	}
+ 	dbg("%s: SLOTCTRL %x write cmd %x\n",
+ 	    __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
+-
+-	/*
+-	 * After turning power off, we must wait for at least 1 second
+-	 * before taking any action that relies on power having been
+-	 * removed from the slot/adapter.
+-	 */
+-	msleep(1000);
+  out:
+ 	if (changed)
+ 		pcie_unmask_bad_dllp(ctrl);
+@@ -722,6 +765,7 @@ static irqreturn_t pcie_isr(int irq, void *dev_id)
+ {
+ 	struct controller *ctrl = (struct controller *)dev_id;
+ 	u16 detected, intr_loc;
++	struct slot *p_slot;
+ 
+ 	/*
+ 	 * In order to guarantee that all interrupt events are
+@@ -756,21 +800,38 @@ static irqreturn_t pcie_isr(int irq, void *dev_id)
+ 		wake_up_interruptible(&ctrl->queue);
+ 	}
+ 
++	if (!(intr_loc & ~CMD_COMPLETED))
++		return IRQ_HANDLED;
++
++	/*
++	 * Return without handling events if this handler routine is
++	 * called before controller initialization is done. This may
++	 * happen if hotplug event or another interrupt that shares
++	 * the IRQ with pciehp arrives before slot initialization is
++	 * done after interrupt handler is registered.
++	 *
++	 * FIXME - Need more structural fixes. We need to be ready to
++	 * handle the event before installing interrupt handler.
++	 */
++	p_slot = pciehp_find_slot(ctrl, ctrl->slot_device_offset);
++	if (!p_slot || !p_slot->hpc_ops)
++		return IRQ_HANDLED;
++
+ 	/* Check MRL Sensor Changed */
+ 	if (intr_loc & MRL_SENS_CHANGED)
+-		pciehp_handle_switch_change(0, ctrl);
++		pciehp_handle_switch_change(p_slot);
+ 
+ 	/* Check Attention Button Pressed */
+ 	if (intr_loc & ATTN_BUTTN_PRESSED)
+-		pciehp_handle_attention_button(0, ctrl);
++		pciehp_handle_attention_button(p_slot);
+ 
+ 	/* Check Presence Detect Changed */
+ 	if (intr_loc & PRSN_DETECT_CHANGED)
+-		pciehp_handle_presence_change(0, ctrl);
++		pciehp_handle_presence_change(p_slot);
+ 
+ 	/* Check Power Fault Detected */
+ 	if (intr_loc & PWR_FAULT_DETECTED)
+-		pciehp_handle_power_fault(0, ctrl);
++		pciehp_handle_power_fault(p_slot);
+ 
+ 	return IRQ_HANDLED;
+ }
+@@ -1028,6 +1089,12 @@ static int pciehp_acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev)
+ static int pcie_init_hardware_part1(struct controller *ctrl,
+ 				    struct pcie_device *dev)
+ {
++	/* Clear all remaining event bits in Slot Status register */
++	if (pciehp_writew(ctrl, SLOTSTATUS, 0x1f)) {
++		err("%s: Cannot write to SLOTSTATUS register\n", __func__);
++		return -1;
++	}
++
+ 	/* Mask Hot-plug Interrupt Enable */
+ 	if (pcie_write_cmd(ctrl, 0, HP_INTR_ENABLE | CMD_CMPL_INTR_ENABLE)) {
+ 		err("%s: Cannot mask hotplug interrupt enable\n", __func__);
+@@ -1040,16 +1107,6 @@ int pcie_init_hardware_part2(struct controller *ctrl, struct pcie_device *dev)
+ {
+ 	u16 cmd, mask;
+ 
+-	/*
+-	 * We need to clear all events before enabling hotplug interrupt
+-	 * notification mechanism in order for hotplug controler to
+-	 * generate interrupts.
+-	 */
+-	if (pciehp_writew(ctrl, SLOTSTATUS, 0x1f)) {
+-		err("%s: Cannot write to SLOTSTATUS register\n", __FUNCTION__);
+-		return -1;
+-	}
+-
+ 	cmd = PRSN_DETECT_ENABLE;
+ 	if (ATTN_BUTTN(ctrl))
+ 		cmd |= ATTN_BUTTN_ENABLE;
+@@ -1116,6 +1173,7 @@ static inline void dbg_ctrl(struct controller *ctrl)
+ 	dbg("  Power Indicator      : %3s\n", PWR_LED(ctrl)    ? "yes" : "no");
+ 	dbg("  Hot-Plug Surprise    : %3s\n", HP_SUPR_RM(ctrl) ? "yes" : "no");
+ 	dbg("  EMI Present          : %3s\n", EMI(ctrl)        ? "yes" : "no");
++	dbg("  Comamnd Completed    : %3s\n", NO_CMD_CMPL(ctrl)? "no" : "yes");
+ 	pciehp_readw(ctrl, SLOTSTATUS, &reg16);
+ 	dbg("Slot Status            : 0x%04x\n", reg16);
+ 	pciehp_readw(ctrl, SLOTSTATUS, &reg16);
+@@ -1147,6 +1205,15 @@ int pcie_init(struct controller *ctrl, struct pcie_device *dev)
+ 	mutex_init(&ctrl->ctrl_lock);
+ 	init_waitqueue_head(&ctrl->queue);
+ 	dbg_ctrl(ctrl);
++	/*
++	 * Controller doesn't notify of command completion if the "No
++	 * Command Completed Support" bit is set in Slot Capability
++	 * register or the controller supports none of power
++	 * controller, attention led, power led and EMI.
++	 */
++	if (NO_CMD_CMPL(ctrl) ||
++	    !(POWER_CTRL(ctrl) | ATTN_LED(ctrl) | PWR_LED(ctrl) | EMI(ctrl)))
++	    ctrl->no_cmd_complete = 1;
+ 
+ 	info("HPC vendor_id %x device_id %x ss_vid %x ss_did %x\n",
+ 	     pdev->vendor, pdev->device,
+diff --git a/drivers/pci/hotplug/shpchp_core.c b/drivers/pci/hotplug/shpchp_core.c
+index 1648076..9784865 100644
+--- a/drivers/pci/hotplug/shpchp_core.c
++++ b/drivers/pci/hotplug/shpchp_core.c
+@@ -162,6 +162,10 @@ static int init_slots(struct controller *ctrl)
+ 		retval = pci_hp_register(slot->hotplug_slot);
+ 		if (retval) {
+ 			err("pci_hp_register failed with error %d\n", retval);
++			if (retval == -EEXIST)
++				err("Failed to register slot because of name "
++                                    "collision. Try \'shpchp_slot_with_bus\' "
++				    "module option.\n");
+ 			goto error_info;
+ 		}
+ 
+diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
+index 61fedb2..f824955 100644
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -506,6 +506,23 @@ static void free_link_state(struct pci_dev *pdev)
+ 	pdev->link_state = NULL;
+ }
+ 
++static int pcie_aspm_sanity_check(struct pci_dev *pdev)
++{
++	struct pci_dev *child_dev;
++	int child_pos;
++
++	/*
++	 * Some functions in a slot might not all be PCIE functions, very
++	 * strange. Disable ASPM for the whole slot
++	 */
++	list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
++		child_pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
++		if (!child_pos)
++			return -EINVAL;
++	}
++	return 0;
++}
++
+ /*
+  * pcie_aspm_init_link_state: Initiate PCI express link state.
+  * It is called after the pcie and its children devices are scaned.
+@@ -526,6 +543,9 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev)
+ 	if (list_empty(&pdev->subordinate->devices))
+ 		goto out;
+ 
++	if (pcie_aspm_sanity_check(pdev))
++		goto out;
++
+ 	mutex_lock(&aspm_lock);
+ 
+ 	link_state = kzalloc(sizeof(*link_state), GFP_KERNEL);
+diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c
+index c1cb94e..7e912f2 100644
+--- a/drivers/usb/core/generic.c
++++ b/drivers/usb/core/generic.c
+@@ -155,9 +155,6 @@ static int generic_probe(struct usb_device *udev)
+ {
+ 	int err, c;
+ 
+-	/* put device-specific files into sysfs */
+-	usb_create_sysfs_dev_files(udev);
+-
+ 	/* Choose and set the configuration.  This registers the interfaces
+ 	 * with the driver core and lets interface drivers bind to them.
+ 	 */
+@@ -189,8 +186,6 @@ static void generic_disconnect(struct usb_device *udev)
+ 	 * unconfigure the device */
+ 	if (udev->actconfig)
+ 		usb_set_configuration(udev, -1);
+-
+-	usb_remove_sysfs_dev_files(udev);
+ }
+ 
+ #ifdef	CONFIG_PM
+diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h
+index 1e4b81e..a0bf5df 100644
+--- a/drivers/usb/core/hcd.h
++++ b/drivers/usb/core/hcd.h
+@@ -213,6 +213,8 @@ struct hc_driver {
+ 
+ 		/* force handover of high-speed port to full-speed companion */
+ 	void	(*relinquish_port)(struct usb_hcd *, int);
++		/* has a port been handed over to a companion? */
++	int	(*port_handed_over)(struct usb_hcd *, int);
+ };
+ 
+ extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb);
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index eb57fcc..8eb4da3 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -1326,6 +1326,12 @@ void usb_disconnect(struct usb_device **pdev)
+ 
+ 	usb_unlock_device(udev);
+ 
++	/* Remove the device-specific files from sysfs.  This must be
++	 * done with udev unlocked, because some of the attribute
++	 * routines try to acquire the device lock.
++	 */
++	usb_remove_sysfs_dev_files(udev);
++
+ 	/* Unregister the device.  The device driver is responsible
+ 	 * for removing the device files from usbfs and sysfs and for
+ 	 * de-configuring the device.
+@@ -1541,6 +1547,9 @@ int usb_new_device(struct usb_device *udev)
+ 		goto fail;
+ 	}
+ 
++	/* put device-specific files into sysfs */
++	usb_create_sysfs_dev_files(udev);
++
+ 	/* Tell the world! */
+ 	announce_device(udev);
+ 	return err;
+@@ -2744,7 +2753,11 @@ loop:
+ 		if ((status == -ENOTCONN) || (status == -ENOTSUPP))
+ 			break;
+ 	}
+-	dev_err(hub_dev, "unable to enumerate USB device on port %d\n", port1);
++	if (hub->hdev->parent ||
++			!hcd->driver->port_handed_over ||
++			!(hcd->driver->port_handed_over)(hcd, port1))
++		dev_err(hub_dev, "unable to enumerate USB device on port %d\n",
++				port1);
+  
+ done:
+ 	hub_port_disable(hub, port1, 1);
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 2e20193..3da1ab4 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -47,6 +47,10 @@ static const struct usb_device_id usb_quirk_list[] = {
+ 	/* Edirol SD-20 */
+ 	{ USB_DEVICE(0x0582, 0x0027), .driver_info = USB_QUIRK_RESET_RESUME },
+ 
++	/* Avision AV600U */
++	{ USB_DEVICE(0x0638, 0x0a13), .driver_info =
++	  USB_QUIRK_STRING_FETCH_255 },
++
+ 	/* M-Systems Flash Disk Pioneers */
+ 	{ USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },
+ 
+diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c
+index c783cb1..5e1f5d5 100644
+--- a/drivers/usb/core/sysfs.c
++++ b/drivers/usb/core/sysfs.c
+@@ -588,35 +588,33 @@ read_descriptors(struct kobject *kobj, struct bin_attribute *attr,
+ 			container_of(kobj, struct device, kobj));
+ 	size_t nleft = count;
+ 	size_t srclen, n;
++	int cfgno;
++	void *src;
+ 
+-	usb_lock_device(udev);
+-
+-	/* The binary attribute begins with the device descriptor */
+-	srclen = sizeof(struct usb_device_descriptor);
+-	if (off < srclen) {
+-		n = min_t(size_t, nleft, srclen - off);
+-		memcpy(buf, off + (char *) &udev->descriptor, n);
+-		nleft -= n;
+-		buf += n;
+-		off = 0;
+-	} else {
+-		off -= srclen;
+-	}
+-
+-	/* Then follows the raw descriptor entry for the current
+-	 * configuration (config plus subsidiary descriptors).
++	/* The binary attribute begins with the device descriptor.
++	 * Following that are the raw descriptor entries for all the
++	 * configurations (config plus subsidiary descriptors).
+ 	 */
+-	if (udev->actconfig) {
+-		int cfgno = udev->actconfig - udev->config;
+-
+-		srclen = __le16_to_cpu(udev->actconfig->desc.wTotalLength);
++	for (cfgno = -1; cfgno < udev->descriptor.bNumConfigurations &&
++			nleft > 0; ++cfgno) {
++		if (cfgno < 0) {
++			src = &udev->descriptor;
++			srclen = sizeof(struct usb_device_descriptor);
++		} else {
++			src = udev->rawdescriptors[cfgno];
++			srclen = __le16_to_cpu(udev->config[cfgno].desc.
++					wTotalLength);
++		}
+ 		if (off < srclen) {
+-			n = min_t(size_t, nleft, srclen - off);
+-			memcpy(buf, off + udev->rawdescriptors[cfgno], n);
++			n = min(nleft, srclen - (size_t) off);
++			memcpy(buf, src + off, n);
+ 			nleft -= n;
++			buf += n;
++			off = 0;
++		} else {
++			off -= srclen;
+ 		}
+ 	}
+-	usb_unlock_device(udev);
+ 	return count - nleft;
+ }
+ 
+diff --git a/drivers/usb/gadget/fsl_usb2_udc.c b/drivers/usb/gadget/fsl_usb2_udc.c
+index 651b827..1868754 100644
+--- a/drivers/usb/gadget/fsl_usb2_udc.c
++++ b/drivers/usb/gadget/fsl_usb2_udc.c
+@@ -1627,7 +1627,9 @@ static int reset_queues(struct fsl_udc *udc)
+ 		udc_reset_ep_queue(udc, pipe);
+ 
+ 	/* report disconnect; the driver is already quiesced */
++	spin_unlock(&udc->lock);
+ 	udc->driver->disconnect(&udc->gadget);
++	spin_lock(&udc->lock);
+ 
+ 	return 0;
+ }
+diff --git a/drivers/usb/host/ehci-au1xxx.c b/drivers/usb/host/ehci-au1xxx.c
+index 8b5f991..08a4335 100644
+--- a/drivers/usb/host/ehci-au1xxx.c
++++ b/drivers/usb/host/ehci-au1xxx.c
+@@ -223,6 +223,7 @@ static const struct hc_driver ehci_au1xxx_hc_driver = {
+ 	.bus_suspend = ehci_bus_suspend,
+ 	.bus_resume = ehci_bus_resume,
+ 	.relinquish_port = ehci_relinquish_port,
++	.port_handed_over = ehci_port_handed_over,
+ };
+ 
+ /*-------------------------------------------------------------------------*/
+diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
+index 6d9bed6..7370d61 100644
+--- a/drivers/usb/host/ehci-fsl.c
++++ b/drivers/usb/host/ehci-fsl.c
+@@ -269,7 +269,7 @@ static int ehci_fsl_setup(struct usb_hcd *hcd)
+ 	if (retval)
+ 		return retval;
+ 
+-	ehci->is_tdi_rh_tt = 1;
++	hcd->has_tt = 1;
+ 
+ 	ehci->sbrn = 0x20;
+ 
+@@ -295,10 +295,6 @@ static const struct hc_driver ehci_fsl_hc_driver = {
+ 	 */
+ 	.reset = ehci_fsl_setup,
+ 	.start = ehci_run,
+-#ifdef	CONFIG_PM
+-	.suspend = ehci_bus_suspend,
+-	.resume = ehci_bus_resume,
+-#endif
+ 	.stop = ehci_stop,
+ 	.shutdown = ehci_shutdown,
+ 
+@@ -322,6 +318,7 @@ static const struct hc_driver ehci_fsl_hc_driver = {
+ 	.bus_suspend = ehci_bus_suspend,
+ 	.bus_resume = ehci_bus_resume,
+ 	.relinquish_port = ehci_relinquish_port,
++	.port_handed_over = ehci_port_handed_over,
+ };
+ 
+ static int ehci_fsl_drv_probe(struct platform_device *pdev)
+diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
+index 382587c..740835b 100644
+--- a/drivers/usb/host/ehci-hub.c
++++ b/drivers/usb/host/ehci-hub.c
+@@ -609,7 +609,7 @@ static int ehci_hub_control (
+ 			}
+ 			break;
+ 		case USB_PORT_FEAT_C_SUSPEND:
+-			/* we auto-clear this feature */
++			clear_bit(wIndex, &ehci->port_c_suspend);
+ 			break;
+ 		case USB_PORT_FEAT_POWER:
+ 			if (HCS_PPC (ehci->hcs_params))
+@@ -688,7 +688,7 @@ static int ehci_hub_control (
+ 			/* resume completed? */
+ 			else if (time_after_eq(jiffies,
+ 					ehci->reset_done[wIndex])) {
+-				status |= 1 << USB_PORT_FEAT_C_SUSPEND;
++				set_bit(wIndex, &ehci->port_c_suspend);
+ 				ehci->reset_done[wIndex] = 0;
+ 
+ 				/* stop resume signaling */
+@@ -765,6 +765,8 @@ static int ehci_hub_control (
+ 			status |= 1 << USB_PORT_FEAT_RESET;
+ 		if (temp & PORT_POWER)
+ 			status |= 1 << USB_PORT_FEAT_POWER;
++		if (test_bit(wIndex, &ehci->port_c_suspend))
++			status |= 1 << USB_PORT_FEAT_C_SUSPEND;
+ 
+ #ifndef	VERBOSE_DEBUG
+ 	if (status & ~0xffff)	/* only if wPortChange is interesting */
+@@ -875,3 +877,13 @@ static void ehci_relinquish_port(struct usb_hcd *hcd, int portnum)
+ 	set_owner(ehci, --portnum, PORT_OWNER);
+ }
+ 
++static int ehci_port_handed_over(struct usb_hcd *hcd, int portnum)
++{
++	struct ehci_hcd		*ehci = hcd_to_ehci(hcd);
++	u32 __iomem		*reg;
++
++	if (ehci_is_TDI(ehci))
++		return 0;
++	reg = &ehci->regs->port_status[portnum - 1];
++	return ehci_readl(ehci, reg) & PORT_OWNER;
++}
+diff --git a/drivers/usb/host/ehci-ixp4xx.c b/drivers/usb/host/ehci-ixp4xx.c
+index 601c879..9d042f2 100644
+--- a/drivers/usb/host/ehci-ixp4xx.c
++++ b/drivers/usb/host/ehci-ixp4xx.c
+@@ -26,7 +26,7 @@ static int ixp4xx_ehci_init(struct usb_hcd *hcd)
+ 		+ HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase));
+ 	ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params);
+ 
+-	ehci->is_tdi_rh_tt = 1;
++	hcd->has_tt = 1;
+ 	ehci_reset(ehci);
+ 
+ 	retval = ehci_init(hcd);
+@@ -58,6 +58,8 @@ static const struct hc_driver ixp4xx_ehci_hc_driver = {
+ 	.bus_suspend		= ehci_bus_suspend,
+ 	.bus_resume		= ehci_bus_resume,
+ #endif
++	.relinquish_port	= ehci_relinquish_port,
++	.port_handed_over	= ehci_port_handed_over,
+ };
+ 
+ static int ixp4xx_ehci_probe(struct platform_device *pdev)
+diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c
+index 3adfda8..ab625f0 100644
+--- a/drivers/usb/host/ehci-orion.c
++++ b/drivers/usb/host/ehci-orion.c
+@@ -139,10 +139,6 @@ static const struct hc_driver ehci_orion_hc_driver = {
+ 	 */
+ 	.reset = ehci_orion_setup,
+ 	.start = ehci_run,
+-#ifdef CONFIG_PM
+-	.suspend = ehci_bus_suspend,
+-	.resume = ehci_bus_resume,
+-#endif
+ 	.stop = ehci_stop,
+ 	.shutdown = ehci_shutdown,
+ 
+@@ -165,6 +161,8 @@ static const struct hc_driver ehci_orion_hc_driver = {
+ 	.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 void __init
+@@ -250,7 +248,7 @@ static int __init ehci_orion_drv_probe(struct platform_device *pdev)
+ 	ehci->regs = hcd->regs + 0x100 +
+ 		HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase));
+ 	ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params);
+-	ehci->is_tdi_rh_tt = 1;
++	hcd->has_tt = 1;
+ 	ehci->sbrn = 0x20;
+ 
+ 	/*
+diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
+index 5bb7f6b..c46a58f 100644
+--- a/drivers/usb/host/ehci-pci.c
++++ b/drivers/usb/host/ehci-pci.c
+@@ -129,7 +129,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
+ 	switch (pdev->vendor) {
+ 	case PCI_VENDOR_ID_TDI:
+ 		if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
+-			ehci->is_tdi_rh_tt = 1;
+ 			hcd->has_tt = 1;
+ 			tdi_reset(ehci);
+ 		}
+@@ -379,7 +378,8 @@ static const struct hc_driver ehci_pci_hc_driver = {
+ 	.hub_control =		ehci_hub_control,
+ 	.bus_suspend =		ehci_bus_suspend,
+ 	.bus_resume =		ehci_bus_resume,
+-	.relinquish_port = 	ehci_relinquish_port,
++	.relinquish_port =	ehci_relinquish_port,
++	.port_handed_over =	ehci_port_handed_over,
+ };
+ 
+ /*-------------------------------------------------------------------------*/
+diff --git a/drivers/usb/host/ehci-ppc-of.c b/drivers/usb/host/ehci-ppc-of.c
+index ee305b1..b018dee 100644
+--- a/drivers/usb/host/ehci-ppc-of.c
++++ b/drivers/usb/host/ehci-ppc-of.c
+@@ -76,6 +76,8 @@ static const struct hc_driver ehci_ppc_of_hc_driver = {
+ 	.bus_suspend		= ehci_bus_suspend,
+ 	.bus_resume		= ehci_bus_resume,
+ #endif
++	.relinquish_port	= ehci_relinquish_port,
++	.port_handed_over	= ehci_port_handed_over,
+ };
+ 
+ 
+diff --git a/drivers/usb/host/ehci-ppc-soc.c b/drivers/usb/host/ehci-ppc-soc.c
+index 6c76036..529590e 100644
+--- a/drivers/usb/host/ehci-ppc-soc.c
++++ b/drivers/usb/host/ehci-ppc-soc.c
+@@ -163,6 +163,7 @@ static const struct hc_driver ehci_ppc_soc_hc_driver = {
+ 	.bus_suspend = ehci_bus_suspend,
+ 	.bus_resume = ehci_bus_resume,
+ 	.relinquish_port = ehci_relinquish_port,
++	.port_handed_over = ehci_port_handed_over,
+ };
+ 
+ static int ehci_hcd_ppc_soc_drv_probe(struct platform_device *pdev)
+diff --git a/drivers/usb/host/ehci-ps3.c b/drivers/usb/host/ehci-ps3.c
+index 6978222..37e6abe 100644
+--- a/drivers/usb/host/ehci-ps3.c
++++ b/drivers/usb/host/ehci-ps3.c
+@@ -73,6 +73,7 @@ static const struct hc_driver ps3_ehci_hc_driver = {
+ 	.bus_resume		= ehci_bus_resume,
+ #endif
+ 	.relinquish_port	= ehci_relinquish_port,
++	.port_handed_over	= ehci_port_handed_over,
+ };
+ 
+ static int ps3_ehci_probe(struct ps3_system_bus_device *dev)
+diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
+index be575e4..b7853c8 100644
+--- a/drivers/usb/host/ehci-sched.c
++++ b/drivers/usb/host/ehci-sched.c
+@@ -1349,18 +1349,27 @@ iso_stream_schedule (
+ 	/* when's the last uframe this urb could start? */
+ 	max = now + mod;
+ 
+-	/* typical case: reuse current schedule. stream is still active,
+-	 * and no gaps from host falling behind (irq delays etc)
++	/* Typical case: reuse current schedule, stream is still active.
++	 * Hopefully there are no gaps from the host falling behind
++	 * (irq delays etc), but if there are we'll take the next
++	 * slot in the schedule, implicitly assuming URB_ISO_ASAP.
+ 	 */
+ 	if (likely (!list_empty (&stream->td_list))) {
+ 		start = stream->next_uframe;
+ 		if (start < now)
+ 			start += mod;
+-		if (likely ((start + sched->span) < max))
+-			goto ready;
+-		/* else fell behind; someday, try to reschedule */
+-		status = -EL2NSYNC;
+-		goto fail;
++
++		/* Fell behind (by up to twice the slop amount)? */
++		if (start >= max - 2 * 8 * SCHEDULE_SLOP)
++			start += stream->interval * DIV_ROUND_UP(
++					max - start, stream->interval) - mod;
++
++		/* Tried to schedule too far into the future? */
++		if (unlikely((start + sched->span) >= max)) {
++			status = -EFBIG;
++			goto fail;
++		}
++		goto ready;
+ 	}
+ 
+ 	/* need to schedule; when's the next (u)frame we could start?
+@@ -1613,6 +1622,9 @@ itd_complete (
+ 		} else if (likely ((t & EHCI_ISOC_ACTIVE) == 0)) {
+ 			desc->status = 0;
+ 			desc->actual_length = EHCI_ITD_LENGTH (t);
++		} else {
++			/* URB was too late */
++			desc->status = -EXDEV;
+ 		}
+ 	}
+ 
+@@ -2095,7 +2107,7 @@ done:
+ static void
+ scan_periodic (struct ehci_hcd *ehci)
+ {
+-	unsigned	frame, clock, now_uframe, mod;
++	unsigned	now_uframe, frame, clock, clock_frame, mod;
+ 	unsigned	modified;
+ 
+ 	mod = ehci->periodic_size << 3;
+@@ -2111,6 +2123,7 @@ scan_periodic (struct ehci_hcd *ehci)
+ 	else
+ 		clock = now_uframe + mod - 1;
+ 	clock %= mod;
++	clock_frame = clock >> 3;
+ 
+ 	for (;;) {
+ 		union ehci_shadow	q, *q_p;
+@@ -2157,22 +2170,26 @@ restart:
+ 			case Q_TYPE_ITD:
+ 				/* If this ITD is still active, leave it for
+ 				 * later processing ... check the next entry.
++				 * No need to check for activity unless the
++				 * frame is current.
+ 				 */
+-				rmb ();
+-				for (uf = 0; uf < 8 && live; uf++) {
+-					if (0 == (q.itd->hw_transaction [uf]
+-							& ITD_ACTIVE(ehci)))
+-						continue;
+-					incomplete = true;
+-					q_p = &q.itd->itd_next;
+-					hw_p = &q.itd->hw_next;
+-					type = Q_NEXT_TYPE(ehci,
++				if (frame == clock_frame && live) {
++					rmb();
++					for (uf = 0; uf < 8; uf++) {
++						if (q.itd->hw_transaction[uf] &
++							    ITD_ACTIVE(ehci))
++							break;
++					}
++					if (uf < 8) {
++						incomplete = true;
++						q_p = &q.itd->itd_next;
++						hw_p = &q.itd->hw_next;
++						type = Q_NEXT_TYPE(ehci,
+ 							q.itd->hw_next);
+-					q = *q_p;
+-					break;
++						q = *q_p;
++						break;
++					}
+ 				}
+-				if (uf < 8 && live)
+-					break;
+ 
+ 				/* Take finished ITDs out of the schedule
+ 				 * and process them:  recycle, maybe report
+@@ -2189,9 +2206,12 @@ restart:
+ 			case Q_TYPE_SITD:
+ 				/* If this SITD is still active, leave it for
+ 				 * later processing ... check the next entry.
++				 * No need to check for activity unless the
++				 * frame is current.
+ 				 */
+-				if ((q.sitd->hw_results & SITD_ACTIVE(ehci))
+-						&& live) {
++				if (frame == clock_frame && live &&
++						(q.sitd->hw_results &
++							SITD_ACTIVE(ehci))) {
+ 					incomplete = true;
+ 					q_p = &q.sitd->sitd_next;
+ 					hw_p = &q.sitd->hw_next;
+@@ -2260,6 +2280,7 @@ restart:
+ 
+ 			/* rescan the rest of this frame, then ... */
+ 			clock = now;
++			clock_frame = clock >> 3;
+ 		} else {
+ 			now_uframe++;
+ 			now_uframe %= mod;
+diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
+index bf92d20..35a0309 100644
+--- a/drivers/usb/host/ehci.h
++++ b/drivers/usb/host/ehci.h
+@@ -97,6 +97,8 @@ struct ehci_hcd {			/* one per controller */
+ 			dedicated to the companion controller */
+ 	unsigned long		owned_ports;		/* which ports are
+ 			owned by the companion during a bus suspend */
++	unsigned long		port_c_suspend;		/* which ports have
++			the change-suspend feature turned on */
+ 
+ 	/* per-HC memory pools (could be per-bus, but ...) */
+ 	struct dma_pool		*qh_pool;	/* qh per active urb */
+@@ -112,7 +114,6 @@ struct ehci_hcd {			/* one per controller */
+ 	u32			command;
+ 
+ 	/* SILICON QUIRKS */
+-	unsigned		is_tdi_rh_tt:1;	/* TDI roothub with TT */
+ 	unsigned		no_selective_suspend:1;
+ 	unsigned		has_fsl_port_bug:1; /* FreeScale */
+ 	unsigned		big_endian_mmio:1;
+@@ -678,7 +679,7 @@ struct ehci_fstn {
+  * needed (mostly in root hub code).
+  */
+ 
+-#define	ehci_is_TDI(e)			((e)->is_tdi_rh_tt)
++#define	ehci_is_TDI(e)			(ehci_to_hcd(e)->has_tt)
+ 
+ /* Returns the speed of a device attached to a port on the root hub. */
+ static inline unsigned int
+diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig
+index a53db1d..eb6c069 100644
+--- a/drivers/usb/misc/Kconfig
++++ b/drivers/usb/misc/Kconfig
+@@ -269,3 +269,14 @@ config USB_TEST
+ 	  See <http://www.linux-usb.org/usbtest/> for more information,
+ 	  including sample test device firmware and "how to use it".
+ 
++config USB_ISIGHTFW
++	tristate "iSight firmware loading support"
++	depends on USB
++	help
++	  This driver loads firmware for USB Apple iSight cameras, allowing
++	  them to be driven by the USB video class driver available at
++	  http://linux-uvc.berlios.de
++
++	  The firmware for this driver must be extracted from the MacOS
++	  driver beforehand. Tools for doing so are available at
++	  http://bersace03.free.fr
+diff --git a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile
+index b68e6b7..aba091c 100644
+--- a/drivers/usb/misc/Makefile
++++ b/drivers/usb/misc/Makefile
+@@ -14,6 +14,7 @@ obj-$(CONFIG_USB_EMI62)		+= emi62.o
+ obj-$(CONFIG_USB_FTDI_ELAN)	+= ftdi-elan.o
+ obj-$(CONFIG_USB_IDMOUSE)	+= idmouse.o
+ obj-$(CONFIG_USB_IOWARRIOR)	+= iowarrior.o
++obj-$(CONFIG_USB_ISIGHTFW)	+= isight_firmware.o
+ obj-$(CONFIG_USB_LCD)		+= usblcd.o
+ obj-$(CONFIG_USB_LD)		+= ldusb.o
+ obj-$(CONFIG_USB_LED)		+= usbled.o
+diff --git a/drivers/usb/misc/isight_firmware.c b/drivers/usb/misc/isight_firmware.c
+new file mode 100644
+index 0000000..390e048
+--- /dev/null
++++ b/drivers/usb/misc/isight_firmware.c
+@@ -0,0 +1,131 @@
++/*
++ * Driver for loading USB isight firmware
++ *
++ * Copyright (C) 2008 Matthew Garrett <mjg at redhat.com>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the Free
++ * Software Foundation, version 2.
++ *
++ * The USB isight cameras in recent Apples are roughly compatible with the USB
++ * video class specification, and can be driven by uvcvideo. However, they
++ * need firmware to be loaded beforehand. After firmware loading, the device
++ * detaches from the USB bus and reattaches with a new device ID. It can then
++ * be claimed by the uvc driver.
++ *
++ * The firmware is non-free and must be extracted by the user. Tools to do this
++ * are available at http://bersace03.free.fr/ift/
++ *
++ * The isight firmware loading was reverse engineered by Johannes Berg
++ * <johannes at sipsolutions.de>, and this driver is based on code by Ronald
++ * Bultje <rbultje at ronald.bitfreak.net>
++ */
++
++#include <linux/usb.h>
++#include <linux/firmware.h>
++#include <linux/errno.h>
++#include <linux/module.h>
++
++static struct usb_device_id id_table[] = {
++	{USB_DEVICE(0x05ac, 0x8300)},
++	{},
++};
++
++MODULE_DEVICE_TABLE(usb, id_table);
++
++static int isight_firmware_load(struct usb_interface *intf,
++				const struct usb_device_id *id)
++{
++	struct usb_device *dev = interface_to_usbdev(intf);
++	int llen, len, req, ret = 0;
++	const struct firmware *firmware;
++	unsigned char *buf;
++	unsigned char data[4];
++	char *ptr;
++
++	if (request_firmware(&firmware, "isight.fw", &dev->dev) != 0) {
++		printk(KERN_ERR "Unable to load isight firmware\n");
++		return -ENODEV;
++	}
++
++	ptr = firmware->data;
++
++	if (usb_control_msg
++	    (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, 0xe600, 0, "\1", 1,
++	     300) != 1) {
++		printk(KERN_ERR
++		       "Failed to initialise isight firmware loader\n");
++		ret = -ENODEV;
++		goto out;
++	}
++
++	while (1) {
++		memcpy(data, ptr, 4);
++		len = (data[0] << 8 | data[1]);
++		req = (data[2] << 8 | data[3]);
++		ptr += 4;
++
++		if (len == 0x8001)
++			break;	/* success */
++		else if (len == 0)
++			continue;
++
++		for (; len > 0; req += 50) {
++			llen = len > 50 ? 50 : len;
++			len -= llen;
++
++			buf = kmalloc(llen, GFP_KERNEL);
++			memcpy(buf, ptr, llen);
++
++			ptr += llen;
++
++			if (usb_control_msg
++			    (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, req, 0,
++			     buf, llen, 300) != llen) {
++				printk(KERN_ERR
++				       "Failed to load isight firmware\n");
++				kfree(buf);
++				ret = -ENODEV;
++				goto out;
++			}
++
++			kfree(buf);
++		}
++	}
++	if (usb_control_msg
++	    (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, 0xe600, 0, "\0", 1,
++	     300) != 1) {
++		printk(KERN_ERR "isight firmware loading completion failed\n");
++		ret = -ENODEV;
++	}
++out:
++	release_firmware(firmware);
++	return ret;
++}
++
++static void isight_firmware_disconnect(struct usb_interface *intf)
++{
++}
++
++static struct usb_driver isight_firmware_driver = {
++	.name = "isight_firmware",
++	.probe = isight_firmware_load,
++	.disconnect = isight_firmware_disconnect,
++	.id_table = id_table,
++};
++
++static int __init isight_firmware_init(void)
++{
++	return usb_register(&isight_firmware_driver);
++}
++
++static void __exit isight_firmware_exit(void)
++{
++	usb_deregister(&isight_firmware_driver);
++}
++
++module_init(isight_firmware_init);
++module_exit(isight_firmware_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Matthew Garrett <mjg at redhat.com>");
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index 3cee6fe..5234e7a 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -174,8 +174,270 @@ static struct usb_device_id id_table_combined [] = {
+ 	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
+-	{ USB_DEVICE(MTXORB_VK_VID, MTXORB_VK_PID),
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0100_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0101_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0102_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0103_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0104_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0105_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0106_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0107_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0108_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0109_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_010A_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_010B_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_010C_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_010D_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_010E_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_010F_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0110_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0111_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0112_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0113_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0114_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0115_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0116_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0117_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0118_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0119_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_011A_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_011B_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_011C_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_011D_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_011E_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_011F_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0120_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0121_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0122_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0123_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0124_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0125_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0126_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0127_PID),
+ 		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0128_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0129_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_012A_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_012B_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_012C_PID),
++		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_012D_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_012E_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_012F_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0130_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0131_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0132_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0133_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0134_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0135_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0136_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0137_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0138_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0139_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_013A_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_013B_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_013C_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_013D_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_013E_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_013F_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0140_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0141_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0142_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0143_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0144_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0145_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0146_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0147_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0148_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0149_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_014A_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_014B_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_014C_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_014D_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_014E_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_014F_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0150_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0151_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0152_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0153_PID),
++		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0154_PID),
++		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0155_PID),
++		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0156_PID),
++		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0157_PID),
++		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0158_PID),
++		.driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0159_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_015A_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_015B_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_015C_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_015D_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_015E_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_015F_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0160_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0161_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0162_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0163_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0164_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0165_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0166_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0167_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0168_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0169_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_016A_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_016B_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_016C_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_016D_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_016E_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_016F_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0170_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0171_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0172_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0173_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0174_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0175_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0176_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0177_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0178_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0179_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_017A_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_017B_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_017C_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_017D_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_017E_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_017F_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0180_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0181_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0182_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0183_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0184_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0185_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0186_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0187_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0188_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0189_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_018A_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_018B_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_018C_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_018D_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_018E_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_018F_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0190_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0191_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0192_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0193_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0194_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0195_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0196_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0197_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0198_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_0199_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_019A_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_019B_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_019C_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_019D_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_019E_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_019F_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A0_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A1_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A2_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A3_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A4_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A5_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A6_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A7_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A8_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01A9_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01AA_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01AB_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01AC_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01AD_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01AE_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01AF_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B0_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B1_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B2_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B3_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B4_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B5_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B6_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B7_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B8_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01B9_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01BA_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01BB_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01BC_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01BD_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01BE_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01BF_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C0_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C1_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C2_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C3_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C4_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C5_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C6_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C7_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C8_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01C9_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01CA_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01CB_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01CC_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01CD_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01CE_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01CF_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D0_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D1_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D2_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D3_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D4_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D5_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D6_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D7_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D8_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01D9_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01DA_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01DB_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01DC_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01DD_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01DE_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01DF_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E0_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E1_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E2_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E3_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E4_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E5_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E6_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E7_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E8_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01E9_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01EA_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01EB_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01EC_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01ED_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01EE_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01EF_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F0_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F1_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F2_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F3_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F4_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F5_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F6_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F7_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F8_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01F9_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01FA_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01FB_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01FC_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01FD_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01FE_PID) },
++	{ USB_DEVICE(MTXORB_VID,MTXORB_FTDI_RANGE_01FF_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
+diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
+index a72f2c8..06e0eca 100644
+--- a/drivers/usb/serial/ftdi_sio.h
++++ b/drivers/usb/serial/ftdi_sio.h
+@@ -114,11 +114,268 @@
+ #define FTDI_OOCDLINK_PID	0xbaf8	/* Amontec JTAGkey */
+ 
+ /*
+- * The following are the values for the Matrix Orbital VK204-25-USB
+- * display, which use the FT232RL.
+- */
+-#define MTXORB_VK_VID		0x1b3d
+-#define MTXORB_VK_PID		0x0158
++ * The following are the values for the Matrix Orbital FTDI Range
++ * Anything in this range will use an FT232RL.
++ */
++#define MTXORB_VID			0x1B3D
++#define MTXORB_FTDI_RANGE_0100_PID	0x0100
++#define MTXORB_FTDI_RANGE_0101_PID	0x0101
++#define MTXORB_FTDI_RANGE_0102_PID	0x0102
++#define MTXORB_FTDI_RANGE_0103_PID	0x0103
++#define MTXORB_FTDI_RANGE_0104_PID	0x0104
++#define MTXORB_FTDI_RANGE_0105_PID	0x0105
++#define MTXORB_FTDI_RANGE_0106_PID	0x0106
++#define MTXORB_FTDI_RANGE_0107_PID	0x0107
++#define MTXORB_FTDI_RANGE_0108_PID	0x0108
++#define MTXORB_FTDI_RANGE_0109_PID	0x0109
++#define MTXORB_FTDI_RANGE_010A_PID	0x010A
++#define MTXORB_FTDI_RANGE_010B_PID	0x010B
++#define MTXORB_FTDI_RANGE_010C_PID	0x010C
++#define MTXORB_FTDI_RANGE_010D_PID	0x010D
++#define MTXORB_FTDI_RANGE_010E_PID	0x010E
++#define MTXORB_FTDI_RANGE_010F_PID	0x010F
++#define MTXORB_FTDI_RANGE_0110_PID	0x0110
++#define MTXORB_FTDI_RANGE_0111_PID	0x0111
++#define MTXORB_FTDI_RANGE_0112_PID	0x0112
++#define MTXORB_FTDI_RANGE_0113_PID	0x0113
++#define MTXORB_FTDI_RANGE_0114_PID	0x0114
++#define MTXORB_FTDI_RANGE_0115_PID	0x0115
++#define MTXORB_FTDI_RANGE_0116_PID	0x0116
++#define MTXORB_FTDI_RANGE_0117_PID	0x0117
++#define MTXORB_FTDI_RANGE_0118_PID	0x0118
++#define MTXORB_FTDI_RANGE_0119_PID	0x0119
++#define MTXORB_FTDI_RANGE_011A_PID	0x011A
++#define MTXORB_FTDI_RANGE_011B_PID	0x011B
++#define MTXORB_FTDI_RANGE_011C_PID	0x011C
++#define MTXORB_FTDI_RANGE_011D_PID	0x011D
++#define MTXORB_FTDI_RANGE_011E_PID	0x011E
++#define MTXORB_FTDI_RANGE_011F_PID	0x011F
++#define MTXORB_FTDI_RANGE_0120_PID	0x0120
++#define MTXORB_FTDI_RANGE_0121_PID	0x0121
++#define MTXORB_FTDI_RANGE_0122_PID	0x0122
++#define MTXORB_FTDI_RANGE_0123_PID	0x0123
++#define MTXORB_FTDI_RANGE_0124_PID	0x0124
++#define MTXORB_FTDI_RANGE_0125_PID	0x0125
++#define MTXORB_FTDI_RANGE_0126_PID	0x0126
++#define MTXORB_FTDI_RANGE_0127_PID	0x0127
++#define MTXORB_FTDI_RANGE_0128_PID	0x0128
++#define MTXORB_FTDI_RANGE_0129_PID	0x0129
++#define MTXORB_FTDI_RANGE_012A_PID	0x012A
++#define MTXORB_FTDI_RANGE_012B_PID	0x012B
++#define MTXORB_FTDI_RANGE_012C_PID	0x012C
++#define MTXORB_FTDI_RANGE_012D_PID	0x012D
++#define MTXORB_FTDI_RANGE_012E_PID	0x012E
++#define MTXORB_FTDI_RANGE_012F_PID	0x012F
++#define MTXORB_FTDI_RANGE_0130_PID	0x0130
++#define MTXORB_FTDI_RANGE_0131_PID	0x0131
++#define MTXORB_FTDI_RANGE_0132_PID	0x0132
++#define MTXORB_FTDI_RANGE_0133_PID	0x0133
++#define MTXORB_FTDI_RANGE_0134_PID	0x0134
++#define MTXORB_FTDI_RANGE_0135_PID	0x0135
++#define MTXORB_FTDI_RANGE_0136_PID	0x0136
++#define MTXORB_FTDI_RANGE_0137_PID	0x0137
++#define MTXORB_FTDI_RANGE_0138_PID	0x0138
++#define MTXORB_FTDI_RANGE_0139_PID	0x0139
++#define MTXORB_FTDI_RANGE_013A_PID	0x013A
++#define MTXORB_FTDI_RANGE_013B_PID	0x013B
++#define MTXORB_FTDI_RANGE_013C_PID	0x013C
++#define MTXORB_FTDI_RANGE_013D_PID	0x013D
++#define MTXORB_FTDI_RANGE_013E_PID	0x013E
++#define MTXORB_FTDI_RANGE_013F_PID	0x013F
++#define MTXORB_FTDI_RANGE_0140_PID	0x0140
++#define MTXORB_FTDI_RANGE_0141_PID	0x0141
++#define MTXORB_FTDI_RANGE_0142_PID	0x0142
++#define MTXORB_FTDI_RANGE_0143_PID	0x0143
++#define MTXORB_FTDI_RANGE_0144_PID	0x0144
++#define MTXORB_FTDI_RANGE_0145_PID	0x0145
++#define MTXORB_FTDI_RANGE_0146_PID	0x0146
++#define MTXORB_FTDI_RANGE_0147_PID	0x0147
++#define MTXORB_FTDI_RANGE_0148_PID	0x0148
++#define MTXORB_FTDI_RANGE_0149_PID	0x0149
++#define MTXORB_FTDI_RANGE_014A_PID	0x014A
++#define MTXORB_FTDI_RANGE_014B_PID	0x014B
++#define MTXORB_FTDI_RANGE_014C_PID	0x014C
++#define MTXORB_FTDI_RANGE_014D_PID	0x014D
++#define MTXORB_FTDI_RANGE_014E_PID	0x014E
++#define MTXORB_FTDI_RANGE_014F_PID	0x014F
++#define MTXORB_FTDI_RANGE_0150_PID	0x0150
++#define MTXORB_FTDI_RANGE_0151_PID	0x0151
++#define MTXORB_FTDI_RANGE_0152_PID	0x0152
++#define MTXORB_FTDI_RANGE_0153_PID	0x0153
++#define MTXORB_FTDI_RANGE_0154_PID	0x0154
++#define MTXORB_FTDI_RANGE_0155_PID	0x0155
++#define MTXORB_FTDI_RANGE_0156_PID	0x0156
++#define MTXORB_FTDI_RANGE_0157_PID	0x0157
++#define MTXORB_FTDI_RANGE_0158_PID	0x0158
++#define MTXORB_FTDI_RANGE_0159_PID	0x0159
++#define MTXORB_FTDI_RANGE_015A_PID	0x015A
++#define MTXORB_FTDI_RANGE_015B_PID	0x015B
++#define MTXORB_FTDI_RANGE_015C_PID	0x015C
++#define MTXORB_FTDI_RANGE_015D_PID	0x015D
++#define MTXORB_FTDI_RANGE_015E_PID	0x015E
++#define MTXORB_FTDI_RANGE_015F_PID	0x015F
++#define MTXORB_FTDI_RANGE_0160_PID	0x0160
++#define MTXORB_FTDI_RANGE_0161_PID	0x0161
++#define MTXORB_FTDI_RANGE_0162_PID	0x0162
++#define MTXORB_FTDI_RANGE_0163_PID	0x0163
++#define MTXORB_FTDI_RANGE_0164_PID	0x0164
++#define MTXORB_FTDI_RANGE_0165_PID	0x0165
++#define MTXORB_FTDI_RANGE_0166_PID	0x0166
++#define MTXORB_FTDI_RANGE_0167_PID	0x0167
++#define MTXORB_FTDI_RANGE_0168_PID	0x0168
++#define MTXORB_FTDI_RANGE_0169_PID	0x0169
++#define MTXORB_FTDI_RANGE_016A_PID	0x016A
++#define MTXORB_FTDI_RANGE_016B_PID	0x016B
++#define MTXORB_FTDI_RANGE_016C_PID	0x016C
++#define MTXORB_FTDI_RANGE_016D_PID	0x016D
++#define MTXORB_FTDI_RANGE_016E_PID	0x016E
++#define MTXORB_FTDI_RANGE_016F_PID	0x016F
++#define MTXORB_FTDI_RANGE_0170_PID	0x0170
++#define MTXORB_FTDI_RANGE_0171_PID	0x0171
++#define MTXORB_FTDI_RANGE_0172_PID	0x0172
++#define MTXORB_FTDI_RANGE_0173_PID	0x0173
++#define MTXORB_FTDI_RANGE_0174_PID	0x0174
++#define MTXORB_FTDI_RANGE_0175_PID	0x0175
++#define MTXORB_FTDI_RANGE_0176_PID	0x0176
++#define MTXORB_FTDI_RANGE_0177_PID	0x0177
++#define MTXORB_FTDI_RANGE_0178_PID	0x0178
++#define MTXORB_FTDI_RANGE_0179_PID	0x0179
++#define MTXORB_FTDI_RANGE_017A_PID	0x017A
++#define MTXORB_FTDI_RANGE_017B_PID	0x017B
++#define MTXORB_FTDI_RANGE_017C_PID	0x017C
++#define MTXORB_FTDI_RANGE_017D_PID	0x017D
++#define MTXORB_FTDI_RANGE_017E_PID	0x017E
++#define MTXORB_FTDI_RANGE_017F_PID	0x017F
++#define MTXORB_FTDI_RANGE_0180_PID	0x0180
++#define MTXORB_FTDI_RANGE_0181_PID	0x0181
++#define MTXORB_FTDI_RANGE_0182_PID	0x0182
++#define MTXORB_FTDI_RANGE_0183_PID	0x0183
++#define MTXORB_FTDI_RANGE_0184_PID	0x0184
++#define MTXORB_FTDI_RANGE_0185_PID	0x0185
++#define MTXORB_FTDI_RANGE_0186_PID	0x0186
++#define MTXORB_FTDI_RANGE_0187_PID	0x0187
++#define MTXORB_FTDI_RANGE_0188_PID	0x0188
++#define MTXORB_FTDI_RANGE_0189_PID	0x0189
++#define MTXORB_FTDI_RANGE_018A_PID	0x018A
++#define MTXORB_FTDI_RANGE_018B_PID	0x018B
++#define MTXORB_FTDI_RANGE_018C_PID	0x018C
++#define MTXORB_FTDI_RANGE_018D_PID	0x018D
++#define MTXORB_FTDI_RANGE_018E_PID	0x018E
++#define MTXORB_FTDI_RANGE_018F_PID	0x018F
++#define MTXORB_FTDI_RANGE_0190_PID	0x0190
++#define MTXORB_FTDI_RANGE_0191_PID	0x0191
++#define MTXORB_FTDI_RANGE_0192_PID	0x0192
++#define MTXORB_FTDI_RANGE_0193_PID	0x0193
++#define MTXORB_FTDI_RANGE_0194_PID	0x0194
++#define MTXORB_FTDI_RANGE_0195_PID	0x0195
++#define MTXORB_FTDI_RANGE_0196_PID	0x0196
++#define MTXORB_FTDI_RANGE_0197_PID	0x0197
++#define MTXORB_FTDI_RANGE_0198_PID	0x0198
++#define MTXORB_FTDI_RANGE_0199_PID	0x0199
++#define MTXORB_FTDI_RANGE_019A_PID	0x019A
++#define MTXORB_FTDI_RANGE_019B_PID	0x019B
++#define MTXORB_FTDI_RANGE_019C_PID	0x019C
++#define MTXORB_FTDI_RANGE_019D_PID	0x019D
++#define MTXORB_FTDI_RANGE_019E_PID	0x019E
++#define MTXORB_FTDI_RANGE_019F_PID	0x019F
++#define MTXORB_FTDI_RANGE_01A0_PID	0x01A0
++#define MTXORB_FTDI_RANGE_01A1_PID	0x01A1
++#define MTXORB_FTDI_RANGE_01A2_PID	0x01A2
++#define MTXORB_FTDI_RANGE_01A3_PID	0x01A3
++#define MTXORB_FTDI_RANGE_01A4_PID	0x01A4
++#define MTXORB_FTDI_RANGE_01A5_PID	0x01A5
++#define MTXORB_FTDI_RANGE_01A6_PID	0x01A6
++#define MTXORB_FTDI_RANGE_01A7_PID	0x01A7
++#define MTXORB_FTDI_RANGE_01A8_PID	0x01A8
++#define MTXORB_FTDI_RANGE_01A9_PID	0x01A9
++#define MTXORB_FTDI_RANGE_01AA_PID	0x01AA
++#define MTXORB_FTDI_RANGE_01AB_PID	0x01AB
++#define MTXORB_FTDI_RANGE_01AC_PID	0x01AC
++#define MTXORB_FTDI_RANGE_01AD_PID	0x01AD
++#define MTXORB_FTDI_RANGE_01AE_PID	0x01AE
++#define MTXORB_FTDI_RANGE_01AF_PID	0x01AF
++#define MTXORB_FTDI_RANGE_01B0_PID	0x01B0
++#define MTXORB_FTDI_RANGE_01B1_PID	0x01B1
++#define MTXORB_FTDI_RANGE_01B2_PID	0x01B2
++#define MTXORB_FTDI_RANGE_01B3_PID	0x01B3
++#define MTXORB_FTDI_RANGE_01B4_PID	0x01B4
++#define MTXORB_FTDI_RANGE_01B5_PID	0x01B5
++#define MTXORB_FTDI_RANGE_01B6_PID	0x01B6
++#define MTXORB_FTDI_RANGE_01B7_PID	0x01B7
++#define MTXORB_FTDI_RANGE_01B8_PID	0x01B8
++#define MTXORB_FTDI_RANGE_01B9_PID	0x01B9
++#define MTXORB_FTDI_RANGE_01BA_PID	0x01BA
++#define MTXORB_FTDI_RANGE_01BB_PID	0x01BB
++#define MTXORB_FTDI_RANGE_01BC_PID	0x01BC
++#define MTXORB_FTDI_RANGE_01BD_PID	0x01BD
++#define MTXORB_FTDI_RANGE_01BE_PID	0x01BE
++#define MTXORB_FTDI_RANGE_01BF_PID	0x01BF
++#define MTXORB_FTDI_RANGE_01C0_PID	0x01C0
++#define MTXORB_FTDI_RANGE_01C1_PID	0x01C1
++#define MTXORB_FTDI_RANGE_01C2_PID	0x01C2
++#define MTXORB_FTDI_RANGE_01C3_PID	0x01C3
++#define MTXORB_FTDI_RANGE_01C4_PID	0x01C4
++#define MTXORB_FTDI_RANGE_01C5_PID	0x01C5
++#define MTXORB_FTDI_RANGE_01C6_PID	0x01C6
++#define MTXORB_FTDI_RANGE_01C7_PID	0x01C7
++#define MTXORB_FTDI_RANGE_01C8_PID	0x01C8
++#define MTXORB_FTDI_RANGE_01C9_PID	0x01C9
++#define MTXORB_FTDI_RANGE_01CA_PID	0x01CA
++#define MTXORB_FTDI_RANGE_01CB_PID	0x01CB
++#define MTXORB_FTDI_RANGE_01CC_PID	0x01CC
++#define MTXORB_FTDI_RANGE_01CD_PID	0x01CD
++#define MTXORB_FTDI_RANGE_01CE_PID	0x01CE
++#define MTXORB_FTDI_RANGE_01CF_PID	0x01CF
++#define MTXORB_FTDI_RANGE_01D0_PID	0x01D0
++#define MTXORB_FTDI_RANGE_01D1_PID	0x01D1
++#define MTXORB_FTDI_RANGE_01D2_PID	0x01D2
++#define MTXORB_FTDI_RANGE_01D3_PID	0x01D3
++#define MTXORB_FTDI_RANGE_01D4_PID	0x01D4
++#define MTXORB_FTDI_RANGE_01D5_PID	0x01D5
++#define MTXORB_FTDI_RANGE_01D6_PID	0x01D6
++#define MTXORB_FTDI_RANGE_01D7_PID	0x01D7
++#define MTXORB_FTDI_RANGE_01D8_PID	0x01D8
++#define MTXORB_FTDI_RANGE_01D9_PID	0x01D9
++#define MTXORB_FTDI_RANGE_01DA_PID	0x01DA
++#define MTXORB_FTDI_RANGE_01DB_PID	0x01DB
++#define MTXORB_FTDI_RANGE_01DC_PID	0x01DC
++#define MTXORB_FTDI_RANGE_01DD_PID	0x01DD
++#define MTXORB_FTDI_RANGE_01DE_PID	0x01DE
++#define MTXORB_FTDI_RANGE_01DF_PID	0x01DF
++#define MTXORB_FTDI_RANGE_01E0_PID	0x01E0
++#define MTXORB_FTDI_RANGE_01E1_PID	0x01E1
++#define MTXORB_FTDI_RANGE_01E2_PID	0x01E2
++#define MTXORB_FTDI_RANGE_01E3_PID	0x01E3
++#define MTXORB_FTDI_RANGE_01E4_PID	0x01E4
++#define MTXORB_FTDI_RANGE_01E5_PID	0x01E5
++#define MTXORB_FTDI_RANGE_01E6_PID	0x01E6
++#define MTXORB_FTDI_RANGE_01E7_PID	0x01E7
++#define MTXORB_FTDI_RANGE_01E8_PID	0x01E8
++#define MTXORB_FTDI_RANGE_01E9_PID	0x01E9
++#define MTXORB_FTDI_RANGE_01EA_PID	0x01EA
++#define MTXORB_FTDI_RANGE_01EB_PID	0x01EB
++#define MTXORB_FTDI_RANGE_01EC_PID	0x01EC
++#define MTXORB_FTDI_RANGE_01ED_PID	0x01ED
++#define MTXORB_FTDI_RANGE_01EE_PID	0x01EE
++#define MTXORB_FTDI_RANGE_01EF_PID	0x01EF
++#define MTXORB_FTDI_RANGE_01F0_PID	0x01F0
++#define MTXORB_FTDI_RANGE_01F1_PID	0x01F1
++#define MTXORB_FTDI_RANGE_01F2_PID	0x01F2
++#define MTXORB_FTDI_RANGE_01F3_PID	0x01F3
++#define MTXORB_FTDI_RANGE_01F4_PID	0x01F4
++#define MTXORB_FTDI_RANGE_01F5_PID	0x01F5
++#define MTXORB_FTDI_RANGE_01F6_PID	0x01F6
++#define MTXORB_FTDI_RANGE_01F7_PID	0x01F7
++#define MTXORB_FTDI_RANGE_01F8_PID	0x01F8
++#define MTXORB_FTDI_RANGE_01F9_PID	0x01F9
++#define MTXORB_FTDI_RANGE_01FA_PID	0x01FA
++#define MTXORB_FTDI_RANGE_01FB_PID	0x01FB
++#define MTXORB_FTDI_RANGE_01FC_PID	0x01FC
++#define MTXORB_FTDI_RANGE_01FD_PID	0x01FD
++#define MTXORB_FTDI_RANGE_01FE_PID	0x01FE
++#define MTXORB_FTDI_RANGE_01FF_PID	0x01FF
++
++
+ 
+ /* Interbiometrics USB I/O Board */
+ /* Developed for Interbiometrics by Rudolf Gugler */
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 6cecd2c..43cfde8 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -236,25 +236,25 @@ static struct usb_device_id option_ids[] = {
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_EX) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
+ 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_NETWORK) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1401) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1403) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1405) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1406) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1408) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1409) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1410) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1411) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1412) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1413) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1414) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1415) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1416) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1417) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1418) },
+-	{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1419) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1401, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1403, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1405, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1406, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1408, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1409, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1410, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1411, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1412, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1413, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1414, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1415, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1416, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1417, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1418, 0xff, 0xff, 0xff) },
++	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1419, 0xff, 0xff, 0xff) },
+ 	{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) },
+ 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */
+ 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */
+diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
+index 234c5ee..103195a 100644
+--- a/drivers/usb/serial/pl2303.c
++++ b/drivers/usb/serial/pl2303.c
+@@ -56,6 +56,7 @@ static struct usb_device_id id_table [] = {
+ 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
+ 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
+ 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
++	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
+ 	{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
+ 	{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
+ 	{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
+diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h
+index 3bdefe0..cff160a 100644
+--- a/drivers/usb/serial/pl2303.h
++++ b/drivers/usb/serial/pl2303.h
+@@ -14,6 +14,7 @@
+ #define PL2303_PRODUCT_ID_PHAROS	0xaaa0
+ #define PL2303_PRODUCT_ID_RSAQ3		0xaaa2
+ #define PL2303_PRODUCT_ID_ALDIGA	0x0611
++#define PL2303_PRODUCT_ID_MMX		0x0612
+ 
+ #define ATEN_VENDOR_ID		0x0557
+ #define ATEN_VENDOR_ID2		0x0547
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index 1b09578..45fe366 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -405,7 +405,7 @@ UNUSUAL_DEV(  0x04a5, 0x3010, 0x0100, 0x0100,
+ UNUSUAL_DEV(  0x04b4, 0x6830, 0x0000, 0x9999,
+ 		"Cypress",
+ 		"Cypress AT2LP",
+-		US_SC_CYP_ATACB, US_PR_BULK, NULL,
++		US_SC_CYP_ATACB, US_PR_DEVICE, NULL,
+ 		0),
+ #endif
+ 
+@@ -1522,7 +1522,7 @@ UNUSUAL_DEV(  0x0fce, 0xe031, 0x0000, 0x0000,
+ 		"Sony Ericsson",
+ 		"M600i",
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL,
+-		US_FL_FIX_CAPACITY ),
++		US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ),
+ 
+ /* Reported by Kevin Cernekee <kpc-usbdev at gelato.uiuc.edu>
+  * Tested on hardware version 1.10.
+@@ -1716,10 +1716,12 @@ UNUSUAL_DEV(  0x22b8, 0x3010, 0x0001, 0x0001,
+ /*
+  * Patch by Pete Zaitcev <zaitcev at redhat.com>
+  * Report by Mark Patton. Red Hat bz#208928.
++ * Added support for rev 0x0002 (Motorola ROKR W5)
++ * by Javier Smaldone <javier at smaldone.com.ar>
+  */
+-UNUSUAL_DEV(  0x22b8, 0x4810, 0x0001, 0x0001,
++UNUSUAL_DEV(  0x22b8, 0x4810, 0x0001, 0x0002,
+ 		"Motorola",
+-		"RAZR V3i",
++		"RAZR V3i/ROKR W5",
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 		US_FL_FIX_CAPACITY),
+ 
+diff --git a/fs/splice.c b/fs/splice.c
+index 7815003..aa5f6f6 100644
+--- a/fs/splice.c
++++ b/fs/splice.c
+@@ -58,8 +58,8 @@ static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe,
+ 		 */
+ 		wait_on_page_writeback(page);
+ 
+-		if (PagePrivate(page))
+-			try_to_release_page(page, GFP_KERNEL);
++		if (PagePrivate(page) && !try_to_release_page(page, GFP_KERNEL))
++			goto out_unlock;
+ 
+ 		/*
+ 		 * If we succeeded in removing the mapping, set LRU flag
+@@ -75,6 +75,7 @@ static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe,
+ 	 * Raced with truncate or failed to remove page from current
+ 	 * address space, unlock and return failure.
+ 	 */
++out_unlock:
+ 	unlock_page(page);
+ 	return 1;
+ }
+@@ -983,7 +984,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,
+ 
+ 	while (len) {
+ 		size_t read_len;
+-		loff_t pos = sd->pos;
++		loff_t pos = sd->pos, prev_pos = pos;
+ 
+ 		ret = do_splice_to(in, &pos, pipe, len, flags);
+ 		if (unlikely(ret <= 0))
+@@ -998,15 +999,19 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,
+ 		 * could get stuck data in the internal pipe:
+ 		 */
+ 		ret = actor(pipe, sd);
+-		if (unlikely(ret <= 0))
++		if (unlikely(ret <= 0)) {
++			sd->pos = prev_pos;
+ 			goto out_release;
++		}
+ 
+ 		bytes += ret;
+ 		len -= ret;
+ 		sd->pos = pos;
+ 
+-		if (ret < read_len)
++		if (ret < read_len) {
++			sd->pos = prev_pos + ret;
+ 			goto out_release;
++		}
+ 	}
+ 
+ done:
+@@ -1072,7 +1077,7 @@ long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
+ 
+ 	ret = splice_direct_to_actor(in, &sd, direct_splice_actor);
+ 	if (ret > 0)
+-		*ppos += ret;
++		*ppos = sd.pos;
+ 
+ 	return ret;
+ }
+diff --git a/include/asm-frv/mem-layout.h b/include/asm-frv/mem-layout.h
+index 734a1d0..2947764 100644
+--- a/include/asm-frv/mem-layout.h
++++ b/include/asm-frv/mem-layout.h
+@@ -31,6 +31,13 @@
+ 
+ #define PAGE_MASK			(~(PAGE_SIZE-1))
+ 
++/*
++ * the slab must be aligned such that load- and store-double instructions don't
++ * fault if used
++ */
++#define	ARCH_KMALLOC_MINALIGN		8
++#define	ARCH_SLAB_MINALIGN		8
++
+ /*****************************************************************************/
+ /*
+  * virtual memory layout from kernel's point of view
+diff --git a/include/asm-ia64/patch.h b/include/asm-ia64/patch.h
+index a715430..295fe6a 100644
+--- a/include/asm-ia64/patch.h
++++ b/include/asm-ia64/patch.h
+@@ -21,6 +21,7 @@ extern void ia64_patch_imm60 (u64 insn_addr, u64 val);		/* patch "brl" w/ip-rel
+ extern void ia64_patch_mckinley_e9 (unsigned long start, unsigned long end);
+ extern void ia64_patch_vtop (unsigned long start, unsigned long end);
+ extern void ia64_patch_phys_stack_reg(unsigned long val);
++extern void ia64_patch_rse (unsigned long start, unsigned long end);
+ extern void ia64_patch_gate (void);
+ 
+ #endif /* _ASM_IA64_PATCH_H */
+diff --git a/include/asm-ia64/ptrace.h b/include/asm-ia64/ptrace.h
+index 4b2a8d4..15f8dcf 100644
+--- a/include/asm-ia64/ptrace.h
++++ b/include/asm-ia64/ptrace.h
+@@ -76,7 +76,7 @@
+ # define KERNEL_STACK_SIZE_ORDER		0
+ #endif
+ 
+-#define IA64_RBS_OFFSET			((IA64_TASK_SIZE + IA64_THREAD_INFO_SIZE + 15) & ~15)
++#define IA64_RBS_OFFSET			((IA64_TASK_SIZE + IA64_THREAD_INFO_SIZE + 31) & ~31)
+ #define IA64_STK_OFFSET			((1 << KERNEL_STACK_SIZE_ORDER)*PAGE_SIZE)
+ 
+ #define KERNEL_STACK_SIZE		IA64_STK_OFFSET
+diff --git a/include/asm-ia64/sections.h b/include/asm-ia64/sections.h
+index dc42a35..7286e4a 100644
+--- a/include/asm-ia64/sections.h
++++ b/include/asm-ia64/sections.h
+@@ -10,6 +10,7 @@
+ 
+ extern char __per_cpu_start[], __per_cpu_end[], __phys_per_cpu_start[];
+ extern char __start___vtop_patchlist[], __end___vtop_patchlist[];
++extern char __start___rse_patchlist[], __end___rse_patchlist[];
+ extern char __start___mckinley_e9_bundles[], __end___mckinley_e9_bundles[];
+ extern char __start___phys_stack_reg_patchlist[], __end___phys_stack_reg_patchlist[];
+ extern char __start_gate_section[];
+diff --git a/include/asm-mn10300/ipcbuf.h b/include/asm-mn10300/ipcbuf.h
+index efbbef8..f6f63d4 100644
+--- a/include/asm-mn10300/ipcbuf.h
++++ b/include/asm-mn10300/ipcbuf.h
+@@ -1,4 +1,4 @@
+-#ifndef _ASM_IPCBUF_H_
++#ifndef _ASM_IPCBUF_H
+ #define _ASM_IPCBUF_H
+ 
+ /*
+diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h
+index cfc3147..e3ef903 100644
+--- a/include/linux/blktrace_api.h
++++ b/include/linux/blktrace_api.h
+@@ -55,6 +55,7 @@ enum blktrace_act {
+ enum blktrace_notify {
+ 	__BLK_TN_PROCESS = 0,		/* establish pid/name mapping */
+ 	__BLK_TN_TIMESTAMP,		/* include system clock */
++	__BLK_TN_MESSAGE,		/* Character string message */
+ };
+ 
+ 
+@@ -79,6 +80,7 @@ enum blktrace_notify {
+ 
+ #define BLK_TN_PROCESS		(__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY))
+ #define BLK_TN_TIMESTAMP	(__BLK_TN_TIMESTAMP | BLK_TC_ACT(BLK_TC_NOTIFY))
++#define BLK_TN_MESSAGE		(__BLK_TN_MESSAGE | BLK_TC_ACT(BLK_TC_NOTIFY))
+ 
+ #define BLK_IO_TRACE_MAGIC	0x65617400
+ #define BLK_IO_TRACE_VERSION	0x07
+@@ -119,6 +121,7 @@ struct blk_trace {
+ 	int trace_state;
+ 	struct rchan *rchan;
+ 	unsigned long *sequence;
++	unsigned char *msg_data;
+ 	u16 act_mask;
+ 	u64 start_lba;
+ 	u64 end_lba;
+@@ -149,7 +152,28 @@ extern void blk_trace_shutdown(struct request_queue *);
+ extern void __blk_add_trace(struct blk_trace *, sector_t, int, int, u32, int, int, void *);
+ extern int do_blk_trace_setup(struct request_queue *q,
+ 	char *name, dev_t dev, struct blk_user_trace_setup *buts);
++extern void __trace_note_message(struct blk_trace *, const char *fmt, ...);
+ 
++/**
++ * blk_add_trace_msg - Add a (simple) message to the blktrace stream
++ * @q:		queue the io is for
++ * @fmt:	format to print message in
++ * args...	Variable argument list for format
++ *
++ * Description:
++ *     Records a (simple) message onto the blktrace stream.
++ *
++ *     NOTE: BLK_TN_MAX_MSG characters are output at most.
++ *     NOTE: Can not use 'static inline' due to presence of var args...
++ *
++ **/
++#define blk_add_trace_msg(q, fmt, ...)					\
++	do {								\
++		struct blk_trace *bt = (q)->blk_trace;			\
++		if (unlikely(bt))					\
++			__trace_note_message(bt, fmt, ##__VA_ARGS__);	\
++	} while (0)
++#define BLK_TN_MAX_MSG		128
+ 
+ /**
+  * blk_add_trace_rq - Add a trace for a request oriented action
+@@ -299,6 +323,8 @@ extern int blk_trace_remove(struct request_queue *q);
+ #define blk_trace_setup(q, name, dev, arg)	(-ENOTTY)
+ #define blk_trace_startstop(q, start)		(-ENOTTY)
+ #define blk_trace_remove(q)			(-ENOTTY)
++#define blk_add_trace_msg(q, fmt, ...)		do { } while (0)
++
+ #endif /* CONFIG_BLK_DEV_IO_TRACE */
+ #endif /* __KERNEL__ */
+ #endif
+diff --git a/include/linux/device.h b/include/linux/device.h
+index 14616e8..6a2d04c 100644
+--- a/include/linux/device.h
++++ b/include/linux/device.h
+@@ -385,6 +385,9 @@ static inline const char *dev_name(struct device *dev)
+ 	return dev->bus_id;
+ }
+ 
++extern int dev_set_name(struct device *dev, const char *name, ...)
++			__attribute__((format(printf, 2, 3)));
++
+ #ifdef CONFIG_NUMA
+ static inline int dev_to_node(struct device *dev)
+ {
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index 3e05e54..ae0be3c 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -766,7 +766,6 @@ struct sched_domain {
+ 	struct sched_domain *child;	/* bottom domain must be null terminated */
+ 	struct sched_group *groups;	/* the balancing groups of the domain */
+ 	cpumask_t span;			/* span of all CPUs in this domain */
+-	int first_cpu;			/* cache of the first cpu in this domain */
+ 	unsigned long min_interval;	/* Minimum balance interval ms */
+ 	unsigned long max_interval;	/* Maximum balance interval ms */
+ 	unsigned int busy_factor;	/* less balancing by factor if busy */
+diff --git a/include/linux/topology.h b/include/linux/topology.h
+index 4bb7074..24f3d22 100644
+--- a/include/linux/topology.h
++++ b/include/linux/topology.h
+@@ -166,7 +166,9 @@ void arch_update_cpu_topology(void);
+ 	.busy_idx		= 3,			\
+ 	.idle_idx		= 3,			\
+ 	.flags			= SD_LOAD_BALANCE	\
+-				| SD_SERIALIZE,	\
++				| SD_BALANCE_NEWIDLE	\
++				| SD_WAKE_AFFINE	\
++				| SD_SERIALIZE,		\
+ 	.last_balance		= jiffies,		\
+ 	.balance_interval	= 64,			\
+ }
+diff --git a/kernel/relay.c b/kernel/relay.c
+index bc24dcd..7de644c 100644
+--- a/kernel/relay.c
++++ b/kernel/relay.c
+@@ -1191,7 +1191,7 @@ static ssize_t relay_file_splice_read(struct file *in,
+ 	ret = 0;
+ 	spliced = 0;
+ 
+-	while (len) {
++	while (len && !spliced) {
+ 		ret = subbuf_splice_actor(in, ppos, pipe, len, flags, &nonpad_ret);
+ 		if (ret < 0)
+ 			break;
+diff --git a/kernel/sched.c b/kernel/sched.c
+index cfa222a..bfb8ad8 100644
+--- a/kernel/sched.c
++++ b/kernel/sched.c
+@@ -136,7 +136,7 @@ static inline void sg_inc_cpu_power(struct sched_group *sg, u32 val)
+ 
+ static inline int rt_policy(int policy)
+ {
+-	if (unlikely(policy == SCHED_FIFO) || unlikely(policy == SCHED_RR))
++	if (unlikely(policy == SCHED_FIFO || policy == SCHED_RR))
+ 		return 1;
+ 	return 0;
+ }
+@@ -398,43 +398,6 @@ struct cfs_rq {
+ 	 */
+ 	struct list_head leaf_cfs_rq_list;
+ 	struct task_group *tg;	/* group that "owns" this runqueue */
+-
+-#ifdef CONFIG_SMP
+-	unsigned long task_weight;
+-	unsigned long shares;
+-	/*
+-	 * We need space to build a sched_domain wide view of the full task
+-	 * group tree, in order to avoid depending on dynamic memory allocation
+-	 * during the load balancing we place this in the per cpu task group
+-	 * hierarchy. This limits the load balancing to one instance per cpu,
+-	 * but more should not be needed anyway.
+-	 */
+-	struct aggregate_struct {
+-		/*
+-		 *   load = weight(cpus) * f(tg)
+-		 *
+-		 * Where f(tg) is the recursive weight fraction assigned to
+-		 * this group.
+-		 */
+-		unsigned long load;
+-
+-		/*
+-		 * part of the group weight distributed to this span.
+-		 */
+-		unsigned long shares;
+-
+-		/*
+-		 * The sum of all runqueue weights within this span.
+-		 */
+-		unsigned long rq_weight;
+-
+-		/*
+-		 * Weight contributed by tasks; this is the part we can
+-		 * influence by moving tasks around.
+-		 */
+-		unsigned long task_weight;
+-	} aggregate;
+-#endif
+ #endif
+ };
+ 
+@@ -1368,9 +1331,6 @@ static void __resched_task(struct task_struct *p, int tif_bit)
+  */
+ #define SRR(x, y) (((x) + (1UL << ((y) - 1))) >> (y))
+ 
+-/*
+- * delta *= weight / lw
+- */
+ static unsigned long
+ calc_delta_mine(unsigned long delta_exec, unsigned long weight,
+ 		struct load_weight *lw)
+@@ -1393,6 +1353,12 @@ calc_delta_mine(unsigned long delta_exec, unsigned long weight,
+ 	return (unsigned long)min(tmp, (u64)(unsigned long)LONG_MAX);
+ }
+ 
++static inline unsigned long
++calc_delta_fair(unsigned long delta_exec, struct load_weight *lw)
++{
++	return calc_delta_mine(delta_exec, NICE_0_LOAD, lw);
++}
++
+ static inline void update_load_add(struct load_weight *lw, unsigned long inc)
+ {
+ 	lw->weight += inc;
+@@ -1505,326 +1471,6 @@ static unsigned long source_load(int cpu, int type);
+ static unsigned long target_load(int cpu, int type);
+ static unsigned long cpu_avg_load_per_task(int cpu);
+ static int task_hot(struct task_struct *p, u64 now, struct sched_domain *sd);
+-
+-#ifdef CONFIG_FAIR_GROUP_SCHED
+-
+-/*
+- * Group load balancing.
+- *
+- * We calculate a few balance domain wide aggregate numbers; load and weight.
+- * Given the pictures below, and assuming each item has equal weight:
+- *
+- *         root          1 - thread
+- *         / | \         A - group
+- *        A  1  B
+- *       /|\   / \
+- *      C 2 D 3   4
+- *      |   |
+- *      5   6
+- *
+- * load:
+- *    A and B get 1/3-rd of the total load. C and D get 1/3-rd of A's 1/3-rd,
+- *    which equals 1/9-th of the total load.
+- *
+- * shares:
+- *    The weight of this group on the selected cpus.
+- *
+- * rq_weight:
+- *    Direct sum of all the cpu's their rq weight, e.g. A would get 3 while
+- *    B would get 2.
+- *
+- * task_weight:
+- *    Part of the rq_weight contributed by tasks; all groups except B would
+- *    get 1, B gets 2.
+- */
+-
+-static inline struct aggregate_struct *
+-aggregate(struct task_group *tg, struct sched_domain *sd)
+-{
+-	return &tg->cfs_rq[sd->first_cpu]->aggregate;
+-}
+-
+-typedef void (*aggregate_func)(struct task_group *, struct sched_domain *);
+-
+-/*
+- * Iterate the full tree, calling @down when first entering a node and @up when
+- * leaving it for the final time.
+- */
+-static
+-void aggregate_walk_tree(aggregate_func down, aggregate_func up,
+-			 struct sched_domain *sd)
+-{
+-	struct task_group *parent, *child;
+-
+-	rcu_read_lock();
+-	parent = &root_task_group;
+-down:
+-	(*down)(parent, sd);
+-	list_for_each_entry_rcu(child, &parent->children, siblings) {
+-		parent = child;
+-		goto down;
+-
+-up:
+-		continue;
+-	}
+-	(*up)(parent, sd);
+-
+-	child = parent;
+-	parent = parent->parent;
+-	if (parent)
+-		goto up;
+-	rcu_read_unlock();
+-}
+-
+-/*
+- * Calculate the aggregate runqueue weight.
+- */
+-static
+-void aggregate_group_weight(struct task_group *tg, struct sched_domain *sd)
+-{
+-	unsigned long rq_weight = 0;
+-	unsigned long task_weight = 0;
+-	int i;
+-
+-	for_each_cpu_mask(i, sd->span) {
+-		rq_weight += tg->cfs_rq[i]->load.weight;
+-		task_weight += tg->cfs_rq[i]->task_weight;
+-	}
+-
+-	aggregate(tg, sd)->rq_weight = rq_weight;
+-	aggregate(tg, sd)->task_weight = task_weight;
+-}
+-
+-/*
+- * Compute the weight of this group on the given cpus.
+- */
+-static
+-void aggregate_group_shares(struct task_group *tg, struct sched_domain *sd)
+-{
+-	unsigned long shares = 0;
+-	int i;
+-
+-	for_each_cpu_mask(i, sd->span)
+-		shares += tg->cfs_rq[i]->shares;
+-
+-	if ((!shares && aggregate(tg, sd)->rq_weight) || shares > tg->shares)
+-		shares = tg->shares;
+-
+-	aggregate(tg, sd)->shares = shares;
+-}
+-
+-/*
+- * Compute the load fraction assigned to this group, relies on the aggregate
+- * weight and this group's parent's load, i.e. top-down.
+- */
+-static
+-void aggregate_group_load(struct task_group *tg, struct sched_domain *sd)
+-{
+-	unsigned long load;
+-
+-	if (!tg->parent) {
+-		int i;
+-
+-		load = 0;
+-		for_each_cpu_mask(i, sd->span)
+-			load += cpu_rq(i)->load.weight;
+-
+-	} else {
+-		load = aggregate(tg->parent, sd)->load;
+-
+-		/*
+-		 * shares is our weight in the parent's rq so
+-		 * shares/parent->rq_weight gives our fraction of the load
+-		 */
+-		load *= aggregate(tg, sd)->shares;
+-		load /= aggregate(tg->parent, sd)->rq_weight + 1;
+-	}
+-
+-	aggregate(tg, sd)->load = load;
+-}
+-
+-static void __set_se_shares(struct sched_entity *se, unsigned long shares);
+-
+-/*
+- * Calculate and set the cpu's group shares.
+- */
+-static void
+-__update_group_shares_cpu(struct task_group *tg, struct sched_domain *sd,
+-			  int tcpu)
+-{
+-	int boost = 0;
+-	unsigned long shares;
+-	unsigned long rq_weight;
+-
+-	if (!tg->se[tcpu])
+-		return;
+-
+-	rq_weight = tg->cfs_rq[tcpu]->load.weight;
+-
+-	/*
+-	 * If there are currently no tasks on the cpu pretend there is one of
+-	 * average load so that when a new task gets to run here it will not
+-	 * get delayed by group starvation.
+-	 */
+-	if (!rq_weight) {
+-		boost = 1;
+-		rq_weight = NICE_0_LOAD;
+-	}
+-
+-	/*
+-	 *           \Sum shares * rq_weight
+-	 * shares =  -----------------------
+-	 *               \Sum rq_weight
+-	 *
+-	 */
+-	shares = aggregate(tg, sd)->shares * rq_weight;
+-	shares /= aggregate(tg, sd)->rq_weight + 1;
+-
+-	/*
+-	 * record the actual number of shares, not the boosted amount.
+-	 */
+-	tg->cfs_rq[tcpu]->shares = boost ? 0 : shares;
+-
+-	if (shares < MIN_SHARES)
+-		shares = MIN_SHARES;
+-	else if (shares > MAX_SHARES)
+-		shares = MAX_SHARES;
+-
+-	__set_se_shares(tg->se[tcpu], shares);
+-}
+-
+-/*
+- * Re-adjust the weights on the cpu the task came from and on the cpu the
+- * task went to.
+- */
+-static void
+-__move_group_shares(struct task_group *tg, struct sched_domain *sd,
+-		    int scpu, int dcpu)
+-{
+-	unsigned long shares;
+-
+-	shares = tg->cfs_rq[scpu]->shares + tg->cfs_rq[dcpu]->shares;
+-
+-	__update_group_shares_cpu(tg, sd, scpu);
+-	__update_group_shares_cpu(tg, sd, dcpu);
+-
+-	/*
+-	 * ensure we never loose shares due to rounding errors in the
+-	 * above redistribution.
+-	 */
+-	shares -= tg->cfs_rq[scpu]->shares + tg->cfs_rq[dcpu]->shares;
+-	if (shares)
+-		tg->cfs_rq[dcpu]->shares += shares;
+-}
+-
+-/*
+- * Because changing a group's shares changes the weight of the super-group
+- * we need to walk up the tree and change all shares until we hit the root.
+- */
+-static void
+-move_group_shares(struct task_group *tg, struct sched_domain *sd,
+-		  int scpu, int dcpu)
+-{
+-	while (tg) {
+-		__move_group_shares(tg, sd, scpu, dcpu);
+-		tg = tg->parent;
+-	}
+-}
+-
+-static
+-void aggregate_group_set_shares(struct task_group *tg, struct sched_domain *sd)
+-{
+-	unsigned long shares = aggregate(tg, sd)->shares;
+-	int i;
+-
+-	for_each_cpu_mask(i, sd->span) {
+-		struct rq *rq = cpu_rq(i);
+-		unsigned long flags;
+-
+-		spin_lock_irqsave(&rq->lock, flags);
+-		__update_group_shares_cpu(tg, sd, i);
+-		spin_unlock_irqrestore(&rq->lock, flags);
+-	}
+-
+-	aggregate_group_shares(tg, sd);
+-
+-	/*
+-	 * ensure we never loose shares due to rounding errors in the
+-	 * above redistribution.
+-	 */
+-	shares -= aggregate(tg, sd)->shares;
+-	if (shares) {
+-		tg->cfs_rq[sd->first_cpu]->shares += shares;
+-		aggregate(tg, sd)->shares += shares;
+-	}
+-}
+-
+-/*
+- * Calculate the accumulative weight and recursive load of each task group
+- * while walking down the tree.
+- */
+-static
+-void aggregate_get_down(struct task_group *tg, struct sched_domain *sd)
+-{
+-	aggregate_group_weight(tg, sd);
+-	aggregate_group_shares(tg, sd);
+-	aggregate_group_load(tg, sd);
+-}
+-
+-/*
+- * Rebalance the cpu shares while walking back up the tree.
+- */
+-static
+-void aggregate_get_up(struct task_group *tg, struct sched_domain *sd)
+-{
+-	aggregate_group_set_shares(tg, sd);
+-}
+-
+-static DEFINE_PER_CPU(spinlock_t, aggregate_lock);
+-
+-static void __init init_aggregate(void)
+-{
+-	int i;
+-
+-	for_each_possible_cpu(i)
+-		spin_lock_init(&per_cpu(aggregate_lock, i));
+-}
+-
+-static int get_aggregate(struct sched_domain *sd)
+-{
+-	if (!spin_trylock(&per_cpu(aggregate_lock, sd->first_cpu)))
+-		return 0;
+-
+-	aggregate_walk_tree(aggregate_get_down, aggregate_get_up, sd);
+-	return 1;
+-}
+-
+-static void put_aggregate(struct sched_domain *sd)
+-{
+-	spin_unlock(&per_cpu(aggregate_lock, sd->first_cpu));
+-}
+-
+-static void cfs_rq_set_shares(struct cfs_rq *cfs_rq, unsigned long shares)
+-{
+-	cfs_rq->shares = shares;
+-}
+-
+-#else
+-
+-static inline void init_aggregate(void)
+-{
+-}
+-
+-static inline int get_aggregate(struct sched_domain *sd)
+-{
+-	return 0;
+-}
+-
+-static inline void put_aggregate(struct sched_domain *sd)
+-{
+-}
+-#endif
+-
+ #else /* CONFIG_SMP */
+ 
+ #ifdef CONFIG_FAIR_GROUP_SCHED
+@@ -1845,14 +1491,26 @@ static void cfs_rq_set_shares(struct cfs_rq *cfs_rq, unsigned long shares)
+ 
+ #define sched_class_highest (&rt_sched_class)
+ 
+-static void inc_nr_running(struct rq *rq)
++static inline void inc_load(struct rq *rq, const struct task_struct *p)
++{
++	update_load_add(&rq->load, p->se.load.weight);
++}
++
++static inline void dec_load(struct rq *rq, const struct task_struct *p)
++{
++	update_load_sub(&rq->load, p->se.load.weight);
++}
++
++static void inc_nr_running(struct task_struct *p, struct rq *rq)
+ {
+ 	rq->nr_running++;
++	inc_load(rq, p);
+ }
+ 
+-static void dec_nr_running(struct rq *rq)
++static void dec_nr_running(struct task_struct *p, struct rq *rq)
+ {
+ 	rq->nr_running--;
++	dec_load(rq, p);
+ }
+ 
+ static void set_load_weight(struct task_struct *p)
+@@ -1944,7 +1602,7 @@ static void activate_task(struct rq *rq, struct task_struct *p, int wakeup)
+ 		rq->nr_uninterruptible--;
+ 
+ 	enqueue_task(rq, p, wakeup);
+-	inc_nr_running(rq);
++	inc_nr_running(p, rq);
+ }
+ 
+ /*
+@@ -1956,7 +1614,7 @@ static void deactivate_task(struct rq *rq, struct task_struct *p, int sleep)
+ 		rq->nr_uninterruptible++;
+ 
+ 	dequeue_task(rq, p, sleep);
+-	dec_nr_running(rq);
++	dec_nr_running(p, rq);
+ }
+ 
+ /**
+@@ -2609,7 +2267,7 @@ void wake_up_new_task(struct task_struct *p, unsigned long clone_flags)
+ 		 * management (if any):
+ 		 */
+ 		p->sched_class->task_new(rq, p);
+-		inc_nr_running(rq);
++		inc_nr_running(p, rq);
+ 	}
+ 	check_preempt_curr(rq, p);
+ #ifdef CONFIG_SMP
+@@ -3600,12 +3258,9 @@ static int load_balance(int this_cpu, struct rq *this_rq,
+ 	unsigned long imbalance;
+ 	struct rq *busiest;
+ 	unsigned long flags;
+-	int unlock_aggregate;
+ 
+ 	cpus_setall(*cpus);
+ 
+-	unlock_aggregate = get_aggregate(sd);
+-
+ 	/*
+ 	 * When power savings policy is enabled for the parent domain, idle
+ 	 * sibling can pick up load irrespective of busy siblings. In this case,
+@@ -3721,9 +3376,8 @@ redo:
+ 
+ 	if (!ld_moved && !sd_idle && sd->flags & SD_SHARE_CPUPOWER &&
+ 	    !test_sd_parent(sd, SD_POWERSAVINGS_BALANCE))
+-		ld_moved = -1;
+-
+-	goto out;
++		return -1;
++	return ld_moved;
+ 
+ out_balanced:
+ 	schedstat_inc(sd, lb_balanced[idle]);
+@@ -3738,13 +3392,8 @@ out_one_pinned:
+ 
+ 	if (!sd_idle && sd->flags & SD_SHARE_CPUPOWER &&
+ 	    !test_sd_parent(sd, SD_POWERSAVINGS_BALANCE))
+-		ld_moved = -1;
+-	else
+-		ld_moved = 0;
+-out:
+-	if (unlock_aggregate)
+-		put_aggregate(sd);
+-	return ld_moved;
++		return -1;
++	return 0;
+ }
+ 
+ /*
+@@ -4430,7 +4079,7 @@ static inline void schedule_debug(struct task_struct *prev)
+ 	 * 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()) && unlikely(!prev->exit_state))
++	if (unlikely(in_atomic_preempt_off() && !prev->exit_state))
+ 		__schedule_bug(prev);
+ 
+ 	profile_hit(SCHED_PROFILING, __builtin_return_address(0));
+@@ -4931,8 +4580,10 @@ void set_user_nice(struct task_struct *p, long nice)
+ 		goto out_unlock;
+ 	}
+ 	on_rq = p->se.on_rq;
+-	if (on_rq)
++	if (on_rq) {
+ 		dequeue_task(rq, p, 0);
++		dec_load(rq, p);
++	}
+ 
+ 	p->static_prio = NICE_TO_PRIO(nice);
+ 	set_load_weight(p);
+@@ -4942,6 +4593,7 @@ void set_user_nice(struct task_struct *p, long nice)
+ 
+ 	if (on_rq) {
+ 		enqueue_task(rq, p, 0);
++		inc_load(rq, p);
+ 		/*
+ 		 * If the task increased its priority or is running and
+ 		 * lowered its priority, then reschedule its CPU:
+@@ -7316,7 +6968,6 @@ static int __build_sched_domains(const cpumask_t *cpu_map,
+ 			SD_INIT(sd, ALLNODES);
+ 			set_domain_attribute(sd, attr);
+ 			sd->span = *cpu_map;
+-			sd->first_cpu = first_cpu(sd->span);
+ 			cpu_to_allnodes_group(i, cpu_map, &sd->groups, tmpmask);
+ 			p = sd;
+ 			sd_allnodes = 1;
+@@ -7327,7 +6978,6 @@ static int __build_sched_domains(const cpumask_t *cpu_map,
+ 		SD_INIT(sd, NODE);
+ 		set_domain_attribute(sd, attr);
+ 		sched_domain_node_span(cpu_to_node(i), &sd->span);
+-		sd->first_cpu = first_cpu(sd->span);
+ 		sd->parent = p;
+ 		if (p)
+ 			p->child = sd;
+@@ -7339,7 +6989,6 @@ static int __build_sched_domains(const cpumask_t *cpu_map,
+ 		SD_INIT(sd, CPU);
+ 		set_domain_attribute(sd, attr);
+ 		sd->span = *nodemask;
+-		sd->first_cpu = first_cpu(sd->span);
+ 		sd->parent = p;
+ 		if (p)
+ 			p->child = sd;
+@@ -7351,7 +7000,6 @@ static int __build_sched_domains(const cpumask_t *cpu_map,
+ 		SD_INIT(sd, MC);
+ 		set_domain_attribute(sd, attr);
+ 		sd->span = cpu_coregroup_map(i);
+-		sd->first_cpu = first_cpu(sd->span);
+ 		cpus_and(sd->span, sd->span, *cpu_map);
+ 		sd->parent = p;
+ 		p->child = sd;
+@@ -7364,7 +7012,6 @@ static int __build_sched_domains(const cpumask_t *cpu_map,
+ 		SD_INIT(sd, SIBLING);
+ 		set_domain_attribute(sd, attr);
+ 		sd->span = per_cpu(cpu_sibling_map, i);
+-		sd->first_cpu = first_cpu(sd->span);
+ 		cpus_and(sd->span, sd->span, *cpu_map);
+ 		sd->parent = p;
+ 		p->child = sd;
+@@ -7568,8 +7215,8 @@ static int build_sched_domains(const cpumask_t *cpu_map)
+ 
+ static cpumask_t *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' */
++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
+@@ -8034,7 +7681,6 @@ void __init sched_init(void)
+ 	}
+ 
+ #ifdef CONFIG_SMP
+-	init_aggregate();
+ 	init_defrootdomain();
+ #endif
+ 
+@@ -8599,11 +8245,14 @@ void sched_move_task(struct task_struct *tsk)
+ #endif
+ 
+ #ifdef CONFIG_FAIR_GROUP_SCHED
+-static void __set_se_shares(struct sched_entity *se, unsigned long shares)
++static void set_se_shares(struct sched_entity *se, unsigned long shares)
+ {
+ 	struct cfs_rq *cfs_rq = se->cfs_rq;
++	struct rq *rq = cfs_rq->rq;
+ 	int on_rq;
+ 
++	spin_lock_irq(&rq->lock);
++
+ 	on_rq = se->on_rq;
+ 	if (on_rq)
+ 		dequeue_entity(cfs_rq, se, 0);
+@@ -8613,17 +8262,8 @@ static void __set_se_shares(struct sched_entity *se, unsigned long shares)
+ 
+ 	if (on_rq)
+ 		enqueue_entity(cfs_rq, se, 0);
+-}
+ 
+-static void set_se_shares(struct sched_entity *se, unsigned long shares)
+-{
+-	struct cfs_rq *cfs_rq = se->cfs_rq;
+-	struct rq *rq = cfs_rq->rq;
+-	unsigned long flags;
+-
+-	spin_lock_irqsave(&rq->lock, flags);
+-	__set_se_shares(se, shares);
+-	spin_unlock_irqrestore(&rq->lock, flags);
++	spin_unlock_irq(&rq->lock);
+ }
+ 
+ static DEFINE_MUTEX(shares_mutex);
+@@ -8662,13 +8302,8 @@ int sched_group_set_shares(struct task_group *tg, unsigned long shares)
+ 	 * w/o tripping rebalance_share or load_balance_fair.
+ 	 */
+ 	tg->shares = shares;
+-	for_each_possible_cpu(i) {
+-		/*
+-		 * force a rebalance
+-		 */
+-		cfs_rq_set_shares(tg->cfs_rq[i], 0);
++	for_each_possible_cpu(i)
+ 		set_se_shares(tg->se[i], shares);
+-	}
+ 
+ 	/*
+ 	 * Enable load balance activity on this group, by inserting it back on
+diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c
+index 9c597e3..ce05271 100644
+--- a/kernel/sched_clock.c
++++ b/kernel/sched_clock.c
+@@ -59,22 +59,26 @@ static inline struct sched_clock_data *cpu_sdc(int cpu)
+ 	return &per_cpu(sched_clock_data, cpu);
+ }
+ 
++static __read_mostly int sched_clock_running;
++
+ void sched_clock_init(void)
+ {
+ 	u64 ktime_now = ktime_to_ns(ktime_get());
+-	u64 now = 0;
++	unsigned long now_jiffies = jiffies;
+ 	int cpu;
+ 
+ 	for_each_possible_cpu(cpu) {
+ 		struct sched_clock_data *scd = cpu_sdc(cpu);
+ 
+ 		scd->lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
+-		scd->prev_jiffies = jiffies;
+-		scd->prev_raw = now;
+-		scd->tick_raw = now;
++		scd->prev_jiffies = now_jiffies;
++		scd->prev_raw = 0;
++		scd->tick_raw = 0;
+ 		scd->tick_gtod = ktime_now;
+ 		scd->clock = ktime_now;
+ 	}
++
++	sched_clock_running = 1;
+ }
+ 
+ /*
+@@ -136,6 +140,9 @@ u64 sched_clock_cpu(int cpu)
+ 	struct sched_clock_data *scd = cpu_sdc(cpu);
+ 	u64 now, clock;
+ 
++	if (unlikely(!sched_clock_running))
++		return 0ull;
++
+ 	WARN_ON_ONCE(!irqs_disabled());
+ 	now = sched_clock();
+ 
+@@ -174,6 +181,9 @@ void sched_clock_tick(void)
+ 	struct sched_clock_data *scd = this_scd();
+ 	u64 now, now_gtod;
+ 
++	if (unlikely(!sched_clock_running))
++		return;
++
+ 	WARN_ON_ONCE(!irqs_disabled());
+ 
+ 	now = sched_clock();
+diff --git a/kernel/sched_debug.c b/kernel/sched_debug.c
+index 5f06118..8bb7130 100644
+--- a/kernel/sched_debug.c
++++ b/kernel/sched_debug.c
+@@ -167,11 +167,6 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
+ #endif
+ 	SEQ_printf(m, "  .%-30s: %ld\n", "nr_spread_over",
+ 			cfs_rq->nr_spread_over);
+-#ifdef CONFIG_FAIR_GROUP_SCHED
+-#ifdef CONFIG_SMP
+-	SEQ_printf(m, "  .%-30s: %lu\n", "shares", cfs_rq->shares);
+-#endif
+-#endif
+ }
+ 
+ static void print_cpu(struct seq_file *m, int cpu)
+diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
+index e24ecd3..08ae848 100644
+--- a/kernel/sched_fair.c
++++ b/kernel/sched_fair.c
+@@ -334,34 +334,6 @@ int sched_nr_latency_handler(struct ctl_table *table, int write,
+ #endif
+ 
+ /*
+- * delta *= w / rw
+- */
+-static inline unsigned long
+-calc_delta_weight(unsigned long delta, struct sched_entity *se)
+-{
+-	for_each_sched_entity(se) {
+-		delta = calc_delta_mine(delta,
+-				se->load.weight, &cfs_rq_of(se)->load);
+-	}
+-
+-	return delta;
+-}
+-
+-/*
+- * delta *= rw / w
+- */
+-static inline unsigned long
+-calc_delta_fair(unsigned long delta, struct sched_entity *se)
+-{
+-	for_each_sched_entity(se) {
+-		delta = calc_delta_mine(delta,
+-				cfs_rq_of(se)->load.weight, &se->load);
+-	}
+-
+-	return delta;
+-}
+-
+-/*
+  * The idea is to set a period in which each task runs once.
+  *
+  * When there are too many tasks (sysctl_sched_nr_latency) we have to stretch
+@@ -390,54 +362,47 @@ static u64 __sched_period(unsigned long nr_running)
+  */
+ static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se)
+ {
+-	return calc_delta_weight(__sched_period(cfs_rq->nr_running), se);
++	u64 slice = __sched_period(cfs_rq->nr_running);
++
++	for_each_sched_entity(se) {
++		cfs_rq = cfs_rq_of(se);
++
++		slice *= se->load.weight;
++		do_div(slice, cfs_rq->load.weight);
++	}
++
++
++	return slice;
+ }
+ 
+ /*
+  * We calculate the vruntime slice of a to be inserted task
+  *
+- * vs = s*rw/w = p
++ * vs = s/w = p/rw
+  */
+ static u64 sched_vslice_add(struct cfs_rq *cfs_rq, struct sched_entity *se)
+ {
+ 	unsigned long nr_running = cfs_rq->nr_running;
++	unsigned long weight;
++	u64 vslice;
+ 
+ 	if (!se->on_rq)
+ 		nr_running++;
+ 
+-	return __sched_period(nr_running);
+-}
+-
+-/*
+- * The goal of calc_delta_asym() is to be asymmetrically around NICE_0_LOAD, in
+- * that it favours >=0 over <0.
+- *
+- *   -20         |
+- *               |
+- *     0 --------+-------
+- *             .'
+- *    19     .'
+- *
+- */
+-static unsigned long
+-calc_delta_asym(unsigned long delta, struct sched_entity *se)
+-{
+-	struct load_weight lw = {
+-		.weight = NICE_0_LOAD,
+-		.inv_weight = 1UL << (WMULT_SHIFT-NICE_0_SHIFT)
+-	};
++	vslice = __sched_period(nr_running);
+ 
+ 	for_each_sched_entity(se) {
+-		struct load_weight *se_lw = &se->load;
++		cfs_rq = cfs_rq_of(se);
+ 
+-		if (se->load.weight < NICE_0_LOAD)
+-			se_lw = &lw;
++		weight = cfs_rq->load.weight;
++		if (!se->on_rq)
++			weight += se->load.weight;
+ 
+-		delta = calc_delta_mine(delta,
+-				cfs_rq_of(se)->load.weight, se_lw);
++		vslice *= NICE_0_LOAD;
++		do_div(vslice, weight);
+ 	}
+ 
+-	return delta;
++	return vslice;
+ }
+ 
+ /*
+@@ -454,7 +419,11 @@ __update_curr(struct cfs_rq *cfs_rq, struct sched_entity *curr,
+ 
+ 	curr->sum_exec_runtime += delta_exec;
+ 	schedstat_add(cfs_rq, exec_clock, delta_exec);
+-	delta_exec_weighted = calc_delta_fair(delta_exec, curr);
++	delta_exec_weighted = delta_exec;
++	if (unlikely(curr->load.weight != NICE_0_LOAD)) {
++		delta_exec_weighted = calc_delta_fair(delta_exec_weighted,
++							&curr->load);
++	}
+ 	curr->vruntime += delta_exec_weighted;
+ }
+ 
+@@ -541,27 +510,10 @@ update_stats_curr_start(struct cfs_rq *cfs_rq, struct sched_entity *se)
+  * Scheduling class queueing methods:
+  */
+ 
+-#if defined CONFIG_SMP && defined CONFIG_FAIR_GROUP_SCHED
+-static void
+-add_cfs_task_weight(struct cfs_rq *cfs_rq, unsigned long weight)
+-{
+-	cfs_rq->task_weight += weight;
+-}
+-#else
+-static inline void
+-add_cfs_task_weight(struct cfs_rq *cfs_rq, unsigned long weight)
+-{
+-}
+-#endif
+-
+ static void
+ account_entity_enqueue(struct cfs_rq *cfs_rq, struct sched_entity *se)
+ {
+ 	update_load_add(&cfs_rq->load, se->load.weight);
+-	if (!parent_entity(se))
+-		inc_cpu_load(rq_of(cfs_rq), se->load.weight);
+-	if (entity_is_task(se))
+-		add_cfs_task_weight(cfs_rq, se->load.weight);
+ 	cfs_rq->nr_running++;
+ 	se->on_rq = 1;
+ 	list_add(&se->group_node, &cfs_rq->tasks);
+@@ -571,10 +523,6 @@ static void
+ account_entity_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se)
+ {
+ 	update_load_sub(&cfs_rq->load, se->load.weight);
+-	if (!parent_entity(se))
+-		dec_cpu_load(rq_of(cfs_rq), se->load.weight);
+-	if (entity_is_task(se))
+-		add_cfs_task_weight(cfs_rq, -se->load.weight);
+ 	cfs_rq->nr_running--;
+ 	se->on_rq = 0;
+ 	list_del_init(&se->group_node);
+@@ -661,17 +609,8 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
+ 
+ 	if (!initial) {
+ 		/* sleeps upto a single latency don't count. */
+-		if (sched_feat(NEW_FAIR_SLEEPERS)) {
+-			unsigned long thresh = sysctl_sched_latency;
+-
+-			/*
+-			 * convert the sleeper threshold into virtual time
+-			 */
+-			if (sched_feat(NORMALIZED_SLEEPER))
+-				thresh = calc_delta_fair(thresh, se);
+-
+-			vruntime -= thresh;
+-		}
++		if (sched_feat(NEW_FAIR_SLEEPERS))
++			vruntime -= sysctl_sched_latency;
+ 
+ 		/* ensure we never gain time by being placed backwards. */
+ 		vruntime = max_vruntime(se->vruntime, vruntime);
+@@ -1057,16 +996,27 @@ wake_affine(struct rq *rq, struct sched_domain *this_sd, struct rq *this_rq,
+ 	struct task_struct *curr = this_rq->curr;
+ 	unsigned long tl = this_load;
+ 	unsigned long tl_per_task;
++	int balanced;
+ 
+-	if (!(this_sd->flags & SD_WAKE_AFFINE))
++	if (!(this_sd->flags & SD_WAKE_AFFINE) || !sched_feat(AFFINE_WAKEUPS))
+ 		return 0;
+ 
+ 	/*
++	 * If sync wakeup then subtract the (maximum possible)
++	 * effect of the currently running task from the load
++	 * of the current CPU:
++	 */
++	if (sync)
++		tl -= current->se.load.weight;
++
++	balanced = 100*(tl + p->se.load.weight) <= imbalance*load;
++
++	/*
+ 	 * If the currently running task will sleep within
+ 	 * a reasonable amount of time then attract this newly
+ 	 * woken task:
+ 	 */
+-	if (sync && curr->sched_class == &fair_sched_class) {
++	if (sync && balanced && curr->sched_class == &fair_sched_class) {
+ 		if (curr->se.avg_overlap < sysctl_sched_migration_cost &&
+ 				p->se.avg_overlap < sysctl_sched_migration_cost)
+ 			return 1;
+@@ -1075,16 +1025,8 @@ wake_affine(struct rq *rq, struct sched_domain *this_sd, struct rq *this_rq,
+ 	schedstat_inc(p, se.nr_wakeups_affine_attempts);
+ 	tl_per_task = cpu_avg_load_per_task(this_cpu);
+ 
+-	/*
+-	 * If sync wakeup then subtract the (maximum possible)
+-	 * effect of the currently running task from the load
+-	 * of the current CPU:
+-	 */
+-	if (sync)
+-		tl -= current->se.load.weight;
+-
+ 	if ((tl <= load && tl + target_load(prev_cpu, idx) <= tl_per_task) ||
+-			100*(tl + p->se.load.weight) <= imbalance*load) {
++			balanced) {
+ 		/*
+ 		 * This domain has SD_WAKE_AFFINE and
+ 		 * p is cache cold in this domain, and
+@@ -1169,10 +1111,11 @@ static unsigned long wakeup_gran(struct sched_entity *se)
+ 	unsigned long gran = sysctl_sched_wakeup_granularity;
+ 
+ 	/*
+-	 * More easily preempt - nice tasks, while not making it harder for
+-	 * + nice tasks.
++	 * More easily preempt - nice tasks, while not making
++	 * it harder for + nice tasks.
+ 	 */
+-	gran = calc_delta_asym(sysctl_sched_wakeup_granularity, se);
++	if (unlikely(se->load.weight > NICE_0_LOAD))
++		gran = calc_delta_fair(gran, &se->load);
+ 
+ 	return gran;
+ }
+@@ -1366,90 +1309,75 @@ static struct task_struct *load_balance_next_fair(void *arg)
+ 	return __load_balance_iterator(cfs_rq, cfs_rq->balance_iterator);
+ }
+ 
+-static unsigned long
+-__load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest,
+-		unsigned long max_load_move, struct sched_domain *sd,
+-		enum cpu_idle_type idle, int *all_pinned, int *this_best_prio,
+-		struct cfs_rq *cfs_rq)
++#ifdef CONFIG_FAIR_GROUP_SCHED
++static int cfs_rq_best_prio(struct cfs_rq *cfs_rq)
+ {
+-	struct rq_iterator cfs_rq_iterator;
++	struct sched_entity *curr;
++	struct task_struct *p;
+ 
+-	cfs_rq_iterator.start = load_balance_start_fair;
+-	cfs_rq_iterator.next = load_balance_next_fair;
+-	cfs_rq_iterator.arg = cfs_rq;
++	if (!cfs_rq->nr_running || !first_fair(cfs_rq))
++		return MAX_PRIO;
++
++	curr = cfs_rq->curr;
++	if (!curr)
++		curr = __pick_next_entity(cfs_rq);
++
++	p = task_of(curr);
+ 
+-	return balance_tasks(this_rq, this_cpu, busiest,
+-			max_load_move, sd, idle, all_pinned,
+-			this_best_prio, &cfs_rq_iterator);
++	return p->prio;
+ }
++#endif
+ 
+-#ifdef CONFIG_FAIR_GROUP_SCHED
+ static unsigned long
+ load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest,
+ 		  unsigned long max_load_move,
+ 		  struct sched_domain *sd, enum cpu_idle_type idle,
+ 		  int *all_pinned, int *this_best_prio)
+ {
++	struct cfs_rq *busy_cfs_rq;
+ 	long rem_load_move = max_load_move;
+-	int busiest_cpu = cpu_of(busiest);
+-	struct task_group *tg;
+-
+-	rcu_read_lock();
+-	list_for_each_entry(tg, &task_groups, list) {
+-		long imbalance;
+-		unsigned long this_weight, busiest_weight;
+-		long rem_load, max_load, moved_load;
+-
+-		/*
+-		 * empty group
+-		 */
+-		if (!aggregate(tg, sd)->task_weight)
+-			continue;
+-
+-		rem_load = rem_load_move * aggregate(tg, sd)->rq_weight;
+-		rem_load /= aggregate(tg, sd)->load + 1;
+-
+-		this_weight = tg->cfs_rq[this_cpu]->task_weight;
+-		busiest_weight = tg->cfs_rq[busiest_cpu]->task_weight;
++	struct rq_iterator cfs_rq_iterator;
+ 
+-		imbalance = (busiest_weight - this_weight) / 2;
++	cfs_rq_iterator.start = load_balance_start_fair;
++	cfs_rq_iterator.next = load_balance_next_fair;
+ 
+-		if (imbalance < 0)
+-			imbalance = busiest_weight;
++	for_each_leaf_cfs_rq(busiest, busy_cfs_rq) {
++#ifdef CONFIG_FAIR_GROUP_SCHED
++		struct cfs_rq *this_cfs_rq;
++		long imbalance;
++		unsigned long maxload;
+ 
+-		max_load = max(rem_load, imbalance);
+-		moved_load = __load_balance_fair(this_rq, this_cpu, busiest,
+-				max_load, sd, idle, all_pinned, this_best_prio,
+-				tg->cfs_rq[busiest_cpu]);
++		this_cfs_rq = cpu_cfs_rq(busy_cfs_rq, this_cpu);
+ 
+-		if (!moved_load)
++		imbalance = busy_cfs_rq->load.weight - this_cfs_rq->load.weight;
++		/* Don't pull if this_cfs_rq has more load than busy_cfs_rq */
++		if (imbalance <= 0)
+ 			continue;
+ 
+-		move_group_shares(tg, sd, busiest_cpu, this_cpu);
++		/* Don't pull more than imbalance/2 */
++		imbalance /= 2;
++		maxload = min(rem_load_move, imbalance);
+ 
+-		moved_load *= aggregate(tg, sd)->load;
+-		moved_load /= aggregate(tg, sd)->rq_weight + 1;
++		*this_best_prio = cfs_rq_best_prio(this_cfs_rq);
++#else
++# define maxload rem_load_move
++#endif
++		/*
++		 * pass busy_cfs_rq argument into
++		 * load_balance_[start|next]_fair iterators
++		 */
++		cfs_rq_iterator.arg = busy_cfs_rq;
++		rem_load_move -= balance_tasks(this_rq, this_cpu, busiest,
++					       maxload, sd, idle, all_pinned,
++					       this_best_prio,
++					       &cfs_rq_iterator);
+ 
+-		rem_load_move -= moved_load;
+-		if (rem_load_move < 0)
++		if (rem_load_move <= 0)
+ 			break;
+ 	}
+-	rcu_read_unlock();
+ 
+ 	return max_load_move - rem_load_move;
+ }
+-#else
+-static unsigned long
+-load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest,
+-		  unsigned long max_load_move,
+-		  struct sched_domain *sd, enum cpu_idle_type idle,
+-		  int *all_pinned, int *this_best_prio)
+-{
+-	return __load_balance_fair(this_rq, this_cpu, busiest,
+-			max_load_move, sd, idle, all_pinned,
+-			this_best_prio, &busiest->cfs);
+-}
+-#endif
+ 
+ static int
+ move_one_task_fair(struct rq *this_rq, int this_cpu, struct rq *busiest,
+diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
+index 060e87b..3432d57 100644
+--- a/kernel/sched_rt.c
++++ b/kernel/sched_rt.c
+@@ -513,8 +513,6 @@ static void enqueue_task_rt(struct rq *rq, struct task_struct *p, int wakeup)
+ 	 */
+ 	for_each_sched_rt_entity(rt_se)
+ 		enqueue_rt_entity(rt_se);
+-
+-	inc_cpu_load(rq, p->se.load.weight);
+ }
+ 
+ static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int sleep)
+@@ -534,8 +532,6 @@ static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int sleep)
+ 		if (rt_rq && rt_rq->rt_nr_running)
+ 			enqueue_rt_entity(rt_se);
+ 	}
+-
+-	dec_cpu_load(rq, p->se.load.weight);
+ }
+ 
+ /*
+diff --git a/kernel/sched_stats.h b/kernel/sched_stats.h
+index 5bae2e0..a38878e 100644
+--- a/kernel/sched_stats.h
++++ b/kernel/sched_stats.h
+@@ -67,6 +67,7 @@ static int show_schedstat(struct seq_file *seq, void *v)
+ 		preempt_enable();
+ #endif
+ 	}
++	kfree(mask_str);
+ 	return 0;
+ }
+ 

Modified: dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	Fri May 30 09:21:20 2008
@@ -1,4 +1,4 @@
-#+ bugfix/all/patch-2.6.26-rc3-git7
++ bugfix/all/patch-2.6.26-rc4-git3
 + debian/version.patch
 + debian/kernelvariables.patch
 + debian/doc-build-parallel.patch



More information about the Kernel-svn-changes mailing list