[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, ®16);
+ dbg("Slot Status : 0x%04x\n", reg16);
+ pciehp_readw(ctrl, SLOTSTATUS, ®16);
+@@ -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